Hybrid Codex カテゴリ追加、description のYAMLパースエラー修正、サブカテゴリナビゲーション修正

This commit is contained in:
nrslib 2026-02-06 10:32:03 +09:00
parent 8fab3f0064
commit 6140c6ba02
17 changed files with 111 additions and 14 deletions

View File

@ -22,6 +22,20 @@ piece_categories:
- expert
- expert-cqrs
"🔀 Hybrid (Codex Coding)":
"🚀 Quick Start":
pieces:
- default-hybrid-codex
- passthrough-hybrid-codex
- minimal-hybrid-codex
"🔍 Review & Fix":
pieces:
- review-fix-minimal-hybrid-codex
"🔧 Expert":
pieces:
- expert-hybrid-codex
- expert-cqrs-hybrid-codex
"Others":
pieces:
- research

View File

@ -20,7 +20,7 @@
# - Decisions: 02-coder-decisions.md
name: default-hybrid-codex
description: Standard development piece with planning and specialized reviews (hybrid: coder=codex)
description: Standard development piece with planning and specialized reviews
max_iterations: 30

View File

@ -19,7 +19,7 @@
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
name: expert-cqrs-hybrid-codex
description: CQRS+ES, Frontend, Security, QA Expert Review (hybrid: coder=codex)
description: CQRS+ES, Frontend, Security, QA Expert Review
max_iterations: 30

View File

@ -31,7 +31,7 @@
# - Decisions: 02-coder-decisions.md
name: expert-hybrid-codex
description: Architecture, Frontend, Security, QA Expert Review (hybrid: coder=codex)
description: Architecture, Frontend, Security, QA Expert Review
max_iterations: 30

View File

@ -12,7 +12,7 @@
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
name: minimal-hybrid-codex
description: Minimal development piece (implement -> parallel review -> fix if needed -> complete) (hybrid: coder=codex)
description: Minimal development piece (implement -> parallel review -> fix if needed -> complete)
max_iterations: 20

View File

@ -7,7 +7,7 @@
# COMPLETE
name: passthrough-hybrid-codex
description: Single-agent thin wrapper. Pass task directly to coder as-is. (hybrid: coder=codex)
description: Single-agent thin wrapper. Pass task directly to coder as-is.
max_iterations: 10

View File

@ -12,7 +12,7 @@
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
name: review-fix-minimal-hybrid-codex
description: Review and fix piece for existing code (starts with review, no implementation) (hybrid: coder=codex)
description: Review and fix piece for existing code (starts with review, no implementation)
max_iterations: 20

View File

@ -21,6 +21,21 @@ piece_categories:
- expert
- expert-cqrs
"🔀 ハイブリッド (Codex Coding)":
"🚀 クイックスタート":
pieces:
- default-hybrid-codex
- passthrough-hybrid-codex
- coding-hybrid-codex
- minimal-hybrid-codex
"🔍 レビュー&修正":
pieces:
- review-fix-minimal-hybrid-codex
"🔧 フルスタック":
pieces:
- expert-hybrid-codex
- expert-cqrs-hybrid-codex
"その他":
pieces:
- research

View File

@ -27,7 +27,7 @@
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
name: coding-hybrid-codex
description: Architecture-focused development piece with parallel reviews (architect -> implement -> parallel review -> complete) (hybrid: coder=codex)
description: Architecture-focused development piece with parallel reviews (architect -> implement -> parallel review -> complete)
max_iterations: 20

View File

@ -11,7 +11,7 @@
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
name: default-hybrid-codex
description: Standard development piece with planning and specialized reviews (hybrid: coder=codex)
description: Standard development piece with planning and specialized reviews
max_iterations: 30

View File

@ -28,7 +28,7 @@
# - Decisions: 02-coder-decisions.md
name: expert-cqrs-hybrid-codex
description: CQRS+ES・フロントエンド・セキュリティ・QA専門家レビュー (hybrid: coder=codex)
description: CQRS+ES・フロントエンド・セキュリティ・QA専門家レビュー
max_iterations: 30

View File

@ -19,7 +19,7 @@
# {report_dir} - レポートディレクトリ名(例: "20250126-143052-task-summary"
name: expert-hybrid-codex
description: アーキテクチャ・フロントエンド・セキュリティ・QA専門家レビュー (hybrid: coder=codex)
description: アーキテクチャ・フロントエンド・セキュリティ・QA専門家レビュー
max_iterations: 30

View File

@ -12,7 +12,7 @@
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
name: minimal-hybrid-codex
description: Minimal development piece (implement -> parallel review -> fix if needed -> complete) (hybrid: coder=codex)
description: Minimal development piece (implement -> parallel review -> fix if needed -> complete)
max_iterations: 20

View File

@ -7,7 +7,7 @@
# COMPLETE
name: passthrough-hybrid-codex
description: Single-agent thin wrapper. Pass task directly to coder as-is. (hybrid: coder=codex)
description: Single-agent thin wrapper. Pass task directly to coder as-is.
max_iterations: 10

View File

@ -12,7 +12,7 @@
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
name: review-fix-minimal-hybrid-codex
description: 既存コードのレビューと修正ピース(レビュー開始、実装なし) (hybrid: coder=codex)
description: 既存コードのレビューと修正ピース(レビュー開始、実装なし)
max_iterations: 20

View File

@ -162,4 +162,72 @@ describe('selectPieceFromCategorizedPieces', () => {
const selected = await selectPieceFromCategorizedPieces(categorized, '');
expect(selected).toBe('my-piece');
});
it('should navigate into subcategories recursively', async () => {
const categorized: CategorizedPieces = {
categories: [
{
name: 'Hybrid',
pieces: [],
children: [
{ name: 'Quick Start', pieces: ['hybrid-default'], children: [] },
{ name: 'Full Stack', pieces: ['hybrid-expert'], children: [] },
],
},
],
allPieces: createPieceMap([
{ name: 'hybrid-default', source: 'builtin' },
{ name: 'hybrid-expert', source: 'builtin' },
]),
missingPieces: [],
};
// Select Hybrid category → Quick Start subcategory → piece
selectOptionMock
.mockResolvedValueOnce('__custom_category__:Hybrid')
.mockResolvedValueOnce('__category__:Quick Start')
.mockResolvedValueOnce('hybrid-default');
const selected = await selectPieceFromCategorizedPieces(categorized, '');
expect(selected).toBe('hybrid-default');
expect(selectOptionMock).toHaveBeenCalledTimes(3);
});
it('should show subcategories and pieces at the same level within a category', async () => {
const categorized: CategorizedPieces = {
categories: [
{
name: 'Dev',
pieces: ['base-piece'],
children: [
{ name: 'Advanced', pieces: ['adv-piece'], children: [] },
],
},
],
allPieces: createPieceMap([
{ name: 'base-piece', source: 'user' },
{ name: 'adv-piece', source: 'user' },
]),
missingPieces: [],
};
// Select Dev category, then directly select the root-level piece
selectOptionMock
.mockResolvedValueOnce('__custom_category__:Dev')
.mockResolvedValueOnce('base-piece');
const selected = await selectPieceFromCategorizedPieces(categorized, '');
expect(selected).toBe('base-piece');
// Second call should show Advanced subcategory AND base-piece at same level
const secondCallOptions = selectOptionMock.mock.calls[1]![1] as { label: string; value: string }[];
const labels = secondCallOptions.map((o) => o.label);
// Should contain the subcategory folder
expect(labels.some((l) => l.includes('Advanced'))).toBe(true);
// Should contain the piece
expect(labels.some((l) => l.includes('base-piece'))).toBe(true);
// Should NOT contain the parent category again
expect(labels.some((l) => l.includes('Dev'))).toBe(false);
});
});

View File

@ -377,7 +377,7 @@ export async function selectPieceFromCategorizedPieces(
if (selection.type === 'category') {
const piece = await selectPieceFromCategoryTree(
[selection.node],
selection.node.children,
currentPiece,
true,
selection.node.pieces,