Hybrid Codex カテゴリ追加、description のYAMLパースエラー修正、サブカテゴリナビゲーション修正
This commit is contained in:
parent
8fab3f0064
commit
6140c6ba02
@ -22,6 +22,20 @@ piece_categories:
|
|||||||
- expert
|
- expert
|
||||||
- expert-cqrs
|
- 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":
|
"Others":
|
||||||
pieces:
|
pieces:
|
||||||
- research
|
- research
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
# - Decisions: 02-coder-decisions.md
|
# - Decisions: 02-coder-decisions.md
|
||||||
|
|
||||||
name: default-hybrid-codex
|
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
|
max_iterations: 30
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
||||||
|
|
||||||
name: expert-cqrs-hybrid-codex
|
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
|
max_iterations: 30
|
||||||
|
|
||||||
|
|||||||
@ -31,7 +31,7 @@
|
|||||||
# - Decisions: 02-coder-decisions.md
|
# - Decisions: 02-coder-decisions.md
|
||||||
|
|
||||||
name: expert-hybrid-codex
|
name: expert-hybrid-codex
|
||||||
description: Architecture, Frontend, Security, QA Expert Review (hybrid: coder=codex)
|
description: Architecture, Frontend, Security, QA Expert Review
|
||||||
|
|
||||||
max_iterations: 30
|
max_iterations: 30
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
||||||
|
|
||||||
name: minimal-hybrid-codex
|
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
|
max_iterations: 20
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
# COMPLETE
|
# COMPLETE
|
||||||
|
|
||||||
name: passthrough-hybrid-codex
|
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
|
max_iterations: 10
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
||||||
|
|
||||||
name: review-fix-minimal-hybrid-codex
|
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
|
max_iterations: 20
|
||||||
|
|
||||||
|
|||||||
@ -21,6 +21,21 @@ piece_categories:
|
|||||||
- expert
|
- expert
|
||||||
- expert-cqrs
|
- 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:
|
pieces:
|
||||||
- research
|
- research
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
||||||
|
|
||||||
name: coding-hybrid-codex
|
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
|
max_iterations: 20
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
||||||
|
|
||||||
name: default-hybrid-codex
|
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
|
max_iterations: 30
|
||||||
|
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
# - Decisions: 02-coder-decisions.md
|
# - Decisions: 02-coder-decisions.md
|
||||||
|
|
||||||
name: expert-cqrs-hybrid-codex
|
name: expert-cqrs-hybrid-codex
|
||||||
description: CQRS+ES・フロントエンド・セキュリティ・QA専門家レビュー (hybrid: coder=codex)
|
description: CQRS+ES・フロントエンド・セキュリティ・QA専門家レビュー
|
||||||
|
|
||||||
max_iterations: 30
|
max_iterations: 30
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@
|
|||||||
# {report_dir} - レポートディレクトリ名(例: "20250126-143052-task-summary")
|
# {report_dir} - レポートディレクトリ名(例: "20250126-143052-task-summary")
|
||||||
|
|
||||||
name: expert-hybrid-codex
|
name: expert-hybrid-codex
|
||||||
description: アーキテクチャ・フロントエンド・セキュリティ・QA専門家レビュー (hybrid: coder=codex)
|
description: アーキテクチャ・フロントエンド・セキュリティ・QA専門家レビュー
|
||||||
|
|
||||||
max_iterations: 30
|
max_iterations: 30
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
||||||
|
|
||||||
name: minimal-hybrid-codex
|
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
|
max_iterations: 20
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
# COMPLETE
|
# COMPLETE
|
||||||
|
|
||||||
name: passthrough-hybrid-codex
|
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
|
max_iterations: 10
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@
|
|||||||
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
# {report_dir} - Report directory name (e.g., "20250126-143052-task-summary")
|
||||||
|
|
||||||
name: review-fix-minimal-hybrid-codex
|
name: review-fix-minimal-hybrid-codex
|
||||||
description: 既存コードのレビューと修正ピース(レビュー開始、実装なし) (hybrid: coder=codex)
|
description: 既存コードのレビューと修正ピース(レビュー開始、実装なし)
|
||||||
|
|
||||||
max_iterations: 20
|
max_iterations: 20
|
||||||
|
|
||||||
|
|||||||
@ -162,4 +162,72 @@ describe('selectPieceFromCategorizedPieces', () => {
|
|||||||
const selected = await selectPieceFromCategorizedPieces(categorized, '');
|
const selected = await selectPieceFromCategorizedPieces(categorized, '');
|
||||||
expect(selected).toBe('my-piece');
|
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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -377,7 +377,7 @@ export async function selectPieceFromCategorizedPieces(
|
|||||||
|
|
||||||
if (selection.type === 'category') {
|
if (selection.type === 'category') {
|
||||||
const piece = await selectPieceFromCategoryTree(
|
const piece = await selectPieceFromCategoryTree(
|
||||||
[selection.node],
|
selection.node.children,
|
||||||
currentPiece,
|
currentPiece,
|
||||||
true,
|
true,
|
||||||
selection.node.pieces,
|
selection.node.pieces,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user