@agile-vibe-coding/avc 0.2.3 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/agents/agent-selector.md +23 -0
- package/cli/agents/code-implementer.md +117 -0
- package/cli/agents/code-validator.md +80 -0
- package/cli/agents/context-reviewer-epic.md +101 -0
- package/cli/agents/context-reviewer-story.md +92 -0
- package/cli/agents/context-writer-epic.md +145 -0
- package/cli/agents/context-writer-story.md +111 -0
- package/cli/agents/doc-writer-epic.md +42 -0
- package/cli/agents/doc-writer-story.md +43 -0
- package/cli/agents/duplicate-detector.md +110 -0
- package/cli/agents/epic-story-decomposer.md +318 -39
- package/cli/agents/mission-scope-generator.md +68 -4
- package/cli/agents/mission-scope-validator.md +40 -6
- package/cli/agents/project-context-extractor.md +21 -6
- package/cli/agents/scaffolding-generator.md +99 -0
- package/cli/agents/seed-validator.md +71 -0
- package/cli/agents/story-scope-reviewer.md +147 -0
- package/cli/agents/story-splitter.md +83 -0
- package/cli/agents/validator-documentation.json +31 -0
- package/cli/agents/validator-documentation.md +3 -1
- package/cli/api-reference-tool.js +368 -0
- package/cli/checks/catalog.json +76 -0
- package/cli/checks/code/quality.json +26 -0
- package/cli/checks/code/testing.json +14 -0
- package/cli/checks/code/traceability.json +26 -0
- package/cli/checks/cross-refs/epic.json +171 -0
- package/cli/checks/cross-refs/story.json +149 -0
- package/cli/checks/epic/api.json +114 -0
- package/cli/checks/epic/backend.json +126 -0
- package/cli/checks/epic/cloud.json +126 -0
- package/cli/checks/epic/data.json +102 -0
- package/cli/checks/epic/database.json +114 -0
- package/cli/checks/epic/developer.json +182 -0
- package/cli/checks/epic/devops.json +174 -0
- package/cli/checks/epic/frontend.json +162 -0
- package/cli/checks/epic/mobile.json +102 -0
- package/cli/checks/epic/qa.json +90 -0
- package/cli/checks/epic/security.json +184 -0
- package/cli/checks/epic/solution-architect.json +192 -0
- package/cli/checks/epic/test-architect.json +90 -0
- package/cli/checks/epic/ui.json +102 -0
- package/cli/checks/epic/ux.json +90 -0
- package/cli/checks/fixes/epic-fix-template.md +10 -0
- package/cli/checks/fixes/story-fix-template.md +10 -0
- package/cli/checks/story/api.json +186 -0
- package/cli/checks/story/backend.json +102 -0
- package/cli/checks/story/cloud.json +102 -0
- package/cli/checks/story/data.json +210 -0
- package/cli/checks/story/database.json +102 -0
- package/cli/checks/story/developer.json +168 -0
- package/cli/checks/story/devops.json +102 -0
- package/cli/checks/story/frontend.json +174 -0
- package/cli/checks/story/mobile.json +102 -0
- package/cli/checks/story/qa.json +210 -0
- package/cli/checks/story/security.json +198 -0
- package/cli/checks/story/solution-architect.json +230 -0
- package/cli/checks/story/test-architect.json +210 -0
- package/cli/checks/story/ui.json +102 -0
- package/cli/checks/story/ux.json +102 -0
- package/cli/coding-order.js +401 -0
- package/cli/dependency-checker.js +72 -0
- package/cli/epic-story-validator.js +284 -799
- package/cli/index.js +0 -0
- package/cli/init-model-config.js +17 -10
- package/cli/init.js +514 -92
- package/cli/kanban-server-manager.js +1 -2
- package/cli/llm-claude.js +98 -31
- package/cli/llm-gemini.js +29 -5
- package/cli/llm-local.js +493 -0
- package/cli/llm-openai.js +262 -41
- package/cli/llm-provider.js +147 -8
- package/cli/llm-token-limits.js +113 -4
- package/cli/llm-verifier.js +209 -1
- package/cli/llm-xiaomi.js +143 -0
- package/cli/message-constants.js +3 -12
- package/cli/messaging-api.js +6 -12
- package/cli/micro-check-fixer.js +335 -0
- package/cli/micro-check-runner.js +449 -0
- package/cli/micro-check-scorer.js +148 -0
- package/cli/micro-check-validator.js +538 -0
- package/cli/model-pricing.js +23 -0
- package/cli/model-selector.js +3 -2
- package/cli/prompt-logger.js +57 -0
- package/cli/repl-ink.js +106 -346
- package/cli/repl-old.js +1 -2
- package/cli/seed-processor.js +194 -24
- package/cli/sprint-planning-processor.js +2638 -289
- package/cli/template-processor.js +50 -3
- package/cli/token-tracker.js +50 -23
- package/cli/tools/generate-story-validators.js +1 -1
- package/cli/validation-router.js +70 -8
- package/cli/worktree-runner.js +654 -0
- package/kanban/client/dist/assets/index-D_KC5EQT.css +1 -0
- package/kanban/client/dist/assets/index-DjY5zqW7.js +351 -0
- package/kanban/client/dist/index.html +2 -2
- package/kanban/client/src/App.jsx +43 -14
- package/kanban/client/src/components/ceremony/AskArchPopup.jsx +7 -3
- package/kanban/client/src/components/ceremony/AskModelPopup.jsx +23 -10
- package/kanban/client/src/components/ceremony/CeremonyWorkflowModal.jsx +320 -133
- package/kanban/client/src/components/ceremony/ProviderSwitcherButton.jsx +290 -0
- package/kanban/client/src/components/ceremony/SponsorCallModal.jsx +80 -13
- package/kanban/client/src/components/ceremony/SprintPlanningModal.jsx +156 -22
- package/kanban/client/src/components/ceremony/steps/ArchitectureStep.jsx +11 -11
- package/kanban/client/src/components/ceremony/steps/CompleteStep.jsx +3 -21
- package/kanban/client/src/components/ceremony/steps/ReviewAnswersStep.jsx +214 -10
- package/kanban/client/src/components/ceremony/steps/RunningStep.jsx +23 -2
- package/kanban/client/src/components/kanban/CardDetailModal.jsx +97 -10
- package/kanban/client/src/components/kanban/GroupingSelector.jsx +7 -1
- package/kanban/client/src/components/kanban/KanbanCard.jsx +23 -14
- package/kanban/client/src/components/kanban/RefineWorkItemPopup.jsx +9 -14
- package/kanban/client/src/components/kanban/RunButton.jsx +162 -0
- package/kanban/client/src/components/kanban/SeedButton.jsx +176 -0
- package/kanban/client/src/components/settings/AgentsTab.jsx +103 -75
- package/kanban/client/src/components/settings/ApiKeysTab.jsx +31 -2
- package/kanban/client/src/components/settings/CeremonyModelsTab.jsx +9 -2
- package/kanban/client/src/components/settings/CheckEditorPopup.jsx +507 -0
- package/kanban/client/src/components/settings/CostThresholdsTab.jsx +3 -2
- package/kanban/client/src/components/settings/ModelPricingTab.jsx +72 -7
- package/kanban/client/src/components/settings/OpenAIAuthSection.jsx +412 -0
- package/kanban/client/src/components/settings/SettingsModal.jsx +4 -4
- package/kanban/client/src/components/stats/CostModal.jsx +34 -3
- package/kanban/client/src/hooks/useGrouping.js +59 -0
- package/kanban/client/src/lib/api.js +118 -4
- package/kanban/client/src/lib/status-grouping.js +10 -0
- package/kanban/client/src/store/kanbanStore.js +8 -0
- package/kanban/server/index.js +23 -2
- package/kanban/server/routes/ceremony.js +153 -4
- package/kanban/server/routes/costs.js +9 -3
- package/kanban/server/routes/openai-oauth.js +366 -0
- package/kanban/server/routes/settings.js +447 -14
- package/kanban/server/routes/websocket.js +7 -2
- package/kanban/server/routes/work-items.js +141 -1
- package/kanban/server/services/CeremonyService.js +275 -24
- package/kanban/server/services/TaskRunnerService.js +261 -0
- package/kanban/server/workers/run-task-worker.js +121 -0
- package/kanban/server/workers/seed-worker.js +94 -0
- package/kanban/server/workers/sponsor-call-worker.js +14 -6
- package/kanban/server/workers/sprint-planning-worker.js +94 -12
- package/package.json +2 -3
- package/cli/agents/solver-epic-api.json +0 -15
- package/cli/agents/solver-epic-api.md +0 -39
- package/cli/agents/solver-epic-backend.json +0 -15
- package/cli/agents/solver-epic-backend.md +0 -39
- package/cli/agents/solver-epic-cloud.json +0 -15
- package/cli/agents/solver-epic-cloud.md +0 -39
- package/cli/agents/solver-epic-data.json +0 -15
- package/cli/agents/solver-epic-data.md +0 -39
- package/cli/agents/solver-epic-database.json +0 -15
- package/cli/agents/solver-epic-database.md +0 -39
- package/cli/agents/solver-epic-developer.json +0 -15
- package/cli/agents/solver-epic-developer.md +0 -39
- package/cli/agents/solver-epic-devops.json +0 -15
- package/cli/agents/solver-epic-devops.md +0 -39
- package/cli/agents/solver-epic-frontend.json +0 -15
- package/cli/agents/solver-epic-frontend.md +0 -39
- package/cli/agents/solver-epic-mobile.json +0 -15
- package/cli/agents/solver-epic-mobile.md +0 -39
- package/cli/agents/solver-epic-qa.json +0 -15
- package/cli/agents/solver-epic-qa.md +0 -39
- package/cli/agents/solver-epic-security.json +0 -15
- package/cli/agents/solver-epic-security.md +0 -39
- package/cli/agents/solver-epic-solution-architect.json +0 -15
- package/cli/agents/solver-epic-solution-architect.md +0 -39
- package/cli/agents/solver-epic-test-architect.json +0 -15
- package/cli/agents/solver-epic-test-architect.md +0 -39
- package/cli/agents/solver-epic-ui.json +0 -15
- package/cli/agents/solver-epic-ui.md +0 -39
- package/cli/agents/solver-epic-ux.json +0 -15
- package/cli/agents/solver-epic-ux.md +0 -39
- package/cli/agents/solver-story-api.json +0 -15
- package/cli/agents/solver-story-api.md +0 -39
- package/cli/agents/solver-story-backend.json +0 -15
- package/cli/agents/solver-story-backend.md +0 -39
- package/cli/agents/solver-story-cloud.json +0 -15
- package/cli/agents/solver-story-cloud.md +0 -39
- package/cli/agents/solver-story-data.json +0 -15
- package/cli/agents/solver-story-data.md +0 -39
- package/cli/agents/solver-story-database.json +0 -15
- package/cli/agents/solver-story-database.md +0 -39
- package/cli/agents/solver-story-developer.json +0 -15
- package/cli/agents/solver-story-developer.md +0 -39
- package/cli/agents/solver-story-devops.json +0 -15
- package/cli/agents/solver-story-devops.md +0 -39
- package/cli/agents/solver-story-frontend.json +0 -15
- package/cli/agents/solver-story-frontend.md +0 -39
- package/cli/agents/solver-story-mobile.json +0 -15
- package/cli/agents/solver-story-mobile.md +0 -39
- package/cli/agents/solver-story-qa.json +0 -15
- package/cli/agents/solver-story-qa.md +0 -39
- package/cli/agents/solver-story-security.json +0 -15
- package/cli/agents/solver-story-security.md +0 -39
- package/cli/agents/solver-story-solution-architect.json +0 -15
- package/cli/agents/solver-story-solution-architect.md +0 -39
- package/cli/agents/solver-story-test-architect.json +0 -15
- package/cli/agents/solver-story-test-architect.md +0 -39
- package/cli/agents/solver-story-ui.json +0 -15
- package/cli/agents/solver-story-ui.md +0 -39
- package/cli/agents/solver-story-ux.json +0 -15
- package/cli/agents/solver-story-ux.md +0 -39
- package/cli/agents/validator-epic-api.json +0 -93
- package/cli/agents/validator-epic-api.md +0 -137
- package/cli/agents/validator-epic-backend.json +0 -93
- package/cli/agents/validator-epic-backend.md +0 -130
- package/cli/agents/validator-epic-cloud.json +0 -93
- package/cli/agents/validator-epic-cloud.md +0 -137
- package/cli/agents/validator-epic-data.json +0 -93
- package/cli/agents/validator-epic-data.md +0 -130
- package/cli/agents/validator-epic-database.json +0 -93
- package/cli/agents/validator-epic-database.md +0 -137
- package/cli/agents/validator-epic-developer.json +0 -74
- package/cli/agents/validator-epic-developer.md +0 -153
- package/cli/agents/validator-epic-devops.json +0 -74
- package/cli/agents/validator-epic-devops.md +0 -153
- package/cli/agents/validator-epic-frontend.json +0 -74
- package/cli/agents/validator-epic-frontend.md +0 -153
- package/cli/agents/validator-epic-mobile.json +0 -93
- package/cli/agents/validator-epic-mobile.md +0 -130
- package/cli/agents/validator-epic-qa.json +0 -93
- package/cli/agents/validator-epic-qa.md +0 -130
- package/cli/agents/validator-epic-security.json +0 -74
- package/cli/agents/validator-epic-security.md +0 -154
- package/cli/agents/validator-epic-solution-architect.json +0 -74
- package/cli/agents/validator-epic-solution-architect.md +0 -156
- package/cli/agents/validator-epic-test-architect.json +0 -93
- package/cli/agents/validator-epic-test-architect.md +0 -130
- package/cli/agents/validator-epic-ui.json +0 -93
- package/cli/agents/validator-epic-ui.md +0 -130
- package/cli/agents/validator-epic-ux.json +0 -93
- package/cli/agents/validator-epic-ux.md +0 -130
- package/cli/agents/validator-story-api.json +0 -104
- package/cli/agents/validator-story-api.md +0 -152
- package/cli/agents/validator-story-backend.json +0 -104
- package/cli/agents/validator-story-backend.md +0 -152
- package/cli/agents/validator-story-cloud.json +0 -104
- package/cli/agents/validator-story-cloud.md +0 -152
- package/cli/agents/validator-story-data.json +0 -104
- package/cli/agents/validator-story-data.md +0 -152
- package/cli/agents/validator-story-database.json +0 -104
- package/cli/agents/validator-story-database.md +0 -152
- package/cli/agents/validator-story-developer.json +0 -104
- package/cli/agents/validator-story-developer.md +0 -152
- package/cli/agents/validator-story-devops.json +0 -104
- package/cli/agents/validator-story-devops.md +0 -152
- package/cli/agents/validator-story-frontend.json +0 -104
- package/cli/agents/validator-story-frontend.md +0 -152
- package/cli/agents/validator-story-mobile.json +0 -104
- package/cli/agents/validator-story-mobile.md +0 -152
- package/cli/agents/validator-story-qa.json +0 -104
- package/cli/agents/validator-story-qa.md +0 -152
- package/cli/agents/validator-story-security.json +0 -104
- package/cli/agents/validator-story-security.md +0 -152
- package/cli/agents/validator-story-solution-architect.json +0 -104
- package/cli/agents/validator-story-solution-architect.md +0 -152
- package/cli/agents/validator-story-test-architect.json +0 -104
- package/cli/agents/validator-story-test-architect.md +0 -152
- package/cli/agents/validator-story-ui.json +0 -104
- package/cli/agents/validator-story-ui.md +0 -152
- package/cli/agents/validator-story-ux.json +0 -104
- package/cli/agents/validator-story-ux.md +0 -152
- package/kanban/client/dist/assets/index-CiD8PS2e.js +0 -306
- package/kanban/client/dist/assets/index-nLh0m82Q.css +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { useState, useEffect } from 'react';
|
|
2
|
-
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
3
|
-
import { getAgentList } from '../../lib/api';
|
|
2
|
+
import { ChevronDown, ChevronRight, Pencil } from 'lucide-react';
|
|
3
|
+
import { getAgentList, getCheckList } from '../../lib/api';
|
|
4
4
|
import { AgentEditorPopup } from './AgentEditorPopup';
|
|
5
|
+
import { CheckEditorPopup } from './CheckEditorPopup';
|
|
5
6
|
|
|
6
7
|
const CEREMONY_STRUCTURE = [
|
|
7
8
|
{
|
|
@@ -41,80 +42,58 @@ const CEREMONY_STRUCTURE = [
|
|
|
41
42
|
]},
|
|
42
43
|
{ phase: 'Contextual Selection', agents: [
|
|
43
44
|
{ slug: 'project-context-extractor', label: 'Project Context Extractor', note: 'Extracts project traits (once per run) to inform validator selection' },
|
|
45
|
+
{ slug: 'validator-selector', label: 'Validator Selector', note: 'Selects appropriate domain validators' },
|
|
44
46
|
{ slug: 'agent-selector', label: 'Agent Selector', note: 'Selects relevant validators per Epic/Story based on project context' },
|
|
45
47
|
]},
|
|
48
|
+
{ phase: 'Context Generation', agents: [
|
|
49
|
+
{ slug: 'context-writer-epic', label: 'Context Writer (Epic)', note: 'Writes complete canonical context.md — Purpose, Scope, NFRs, Success Criteria' },
|
|
50
|
+
{ slug: 'context-reviewer-epic', label: 'Context Reviewer (Epic)', note: 'Independent accuracy audit: checks all features present, no hallucinations, sections complete' },
|
|
51
|
+
{ slug: 'context-writer-story', label: 'Context Writer (Story)', note: 'Writes complete canonical context.md — User Story framing, Technical Notes, Scope boundaries' },
|
|
52
|
+
{ slug: 'context-reviewer-story', label: 'Context Reviewer (Story)', note: 'Independent accuracy audit: checks all ACs present, no hallucinations, sections complete' },
|
|
53
|
+
]},
|
|
46
54
|
{ phase: 'Documentation & Enrichment', agents: [
|
|
47
|
-
{ slug: 'doc-
|
|
55
|
+
{ slug: 'doc-writer-epic', label: 'Doc Writer (Epic)', note: 'Generates narrative epic doc.md from canonical context.md' },
|
|
56
|
+
{ slug: 'doc-writer-story', label: 'Doc Writer (Story)', note: 'Generates narrative story doc.md from canonical context.md' },
|
|
48
57
|
{ slug: 'story-doc-enricher', label: 'Story Doc Enricher', note: 'Enriches story docs with API contracts, error tables, DB fields, business rules' },
|
|
49
58
|
]},
|
|
50
|
-
{ phase: '
|
|
51
|
-
{ slug: '
|
|
52
|
-
{ slug: '
|
|
53
|
-
{ slug: '
|
|
54
|
-
{ slug: '
|
|
55
|
-
{ slug: '
|
|
56
|
-
{ slug: '
|
|
57
|
-
{ slug: '
|
|
58
|
-
{ slug: '
|
|
59
|
-
{ slug: '
|
|
60
|
-
{ slug: '
|
|
61
|
-
{ slug: '
|
|
62
|
-
{ slug: '
|
|
63
|
-
{ slug: '
|
|
64
|
-
{ slug: '
|
|
65
|
-
{ slug: '
|
|
66
|
-
{ slug: 'validator-epic-test-architect', label: 'Test Architect' },
|
|
67
|
-
]},
|
|
68
|
-
{ phase: 'Solving — Epic', agents: [
|
|
69
|
-
{ slug: 'solver-epic-solution-architect', label: 'Solution Architect' },
|
|
70
|
-
{ slug: 'solver-epic-developer', label: 'Developer' },
|
|
71
|
-
{ slug: 'solver-epic-security', label: 'Security' },
|
|
72
|
-
{ slug: 'solver-epic-devops', label: 'DevOps' },
|
|
73
|
-
{ slug: 'solver-epic-cloud', label: 'Cloud' },
|
|
74
|
-
{ slug: 'solver-epic-backend', label: 'Backend' },
|
|
75
|
-
{ slug: 'solver-epic-database', label: 'Database' },
|
|
76
|
-
{ slug: 'solver-epic-api', label: 'API' },
|
|
77
|
-
{ slug: 'solver-epic-frontend', label: 'Frontend' },
|
|
78
|
-
{ slug: 'solver-epic-ui', label: 'UI' },
|
|
79
|
-
{ slug: 'solver-epic-ux', label: 'UX' },
|
|
80
|
-
{ slug: 'solver-epic-mobile', label: 'Mobile' },
|
|
81
|
-
{ slug: 'solver-epic-data', label: 'Data' },
|
|
82
|
-
{ slug: 'solver-epic-qa', label: 'QA' },
|
|
83
|
-
{ slug: 'solver-epic-test-architect', label: 'Test Architect' },
|
|
59
|
+
{ phase: 'Micro-Check Definitions — Epic', agents: [
|
|
60
|
+
{ slug: 'checks/epic/solution-architect', label: 'Solution Architect', note: 'JSON', isCheck: true },
|
|
61
|
+
{ slug: 'checks/epic/developer', label: 'Developer', note: 'JSON', isCheck: true },
|
|
62
|
+
{ slug: 'checks/epic/security', label: 'Security', note: 'JSON', isCheck: true },
|
|
63
|
+
{ slug: 'checks/epic/devops', label: 'DevOps', note: 'JSON', isCheck: true },
|
|
64
|
+
{ slug: 'checks/epic/cloud', label: 'Cloud', note: 'JSON', isCheck: true },
|
|
65
|
+
{ slug: 'checks/epic/backend', label: 'Backend', note: 'JSON', isCheck: true },
|
|
66
|
+
{ slug: 'checks/epic/database', label: 'Database', note: 'JSON', isCheck: true },
|
|
67
|
+
{ slug: 'checks/epic/api', label: 'API', note: 'JSON', isCheck: true },
|
|
68
|
+
{ slug: 'checks/epic/frontend', label: 'Frontend', note: 'JSON', isCheck: true },
|
|
69
|
+
{ slug: 'checks/epic/ui', label: 'UI', note: 'JSON', isCheck: true },
|
|
70
|
+
{ slug: 'checks/epic/ux', label: 'UX', note: 'JSON', isCheck: true },
|
|
71
|
+
{ slug: 'checks/epic/mobile', label: 'Mobile', note: 'JSON', isCheck: true },
|
|
72
|
+
{ slug: 'checks/epic/data', label: 'Data', note: 'JSON', isCheck: true },
|
|
73
|
+
{ slug: 'checks/epic/qa', label: 'QA', note: 'JSON', isCheck: true },
|
|
74
|
+
{ slug: 'checks/epic/test-architect', label: 'Test Architect', note: 'JSON', isCheck: true },
|
|
84
75
|
]},
|
|
85
|
-
{ phase: '
|
|
86
|
-
{ slug: '
|
|
87
|
-
{ slug: '
|
|
88
|
-
{ slug: '
|
|
89
|
-
{ slug: '
|
|
90
|
-
{ slug: '
|
|
91
|
-
{ slug: '
|
|
92
|
-
{ slug: '
|
|
93
|
-
{ slug: '
|
|
94
|
-
{ slug: '
|
|
95
|
-
{ slug: '
|
|
96
|
-
{ slug: '
|
|
97
|
-
{ slug: '
|
|
98
|
-
{ slug: '
|
|
99
|
-
{ slug: '
|
|
100
|
-
{ slug: '
|
|
76
|
+
{ phase: 'Micro-Check Definitions — Story', agents: [
|
|
77
|
+
{ slug: 'checks/story/solution-architect', label: 'Solution Architect', note: 'JSON', isCheck: true },
|
|
78
|
+
{ slug: 'checks/story/developer', label: 'Developer', note: 'JSON', isCheck: true },
|
|
79
|
+
{ slug: 'checks/story/security', label: 'Security', note: 'JSON', isCheck: true },
|
|
80
|
+
{ slug: 'checks/story/devops', label: 'DevOps', note: 'JSON', isCheck: true },
|
|
81
|
+
{ slug: 'checks/story/cloud', label: 'Cloud', note: 'JSON', isCheck: true },
|
|
82
|
+
{ slug: 'checks/story/backend', label: 'Backend', note: 'JSON', isCheck: true },
|
|
83
|
+
{ slug: 'checks/story/database', label: 'Database', note: 'JSON', isCheck: true },
|
|
84
|
+
{ slug: 'checks/story/api', label: 'API', note: 'JSON', isCheck: true },
|
|
85
|
+
{ slug: 'checks/story/frontend', label: 'Frontend', note: 'JSON', isCheck: true },
|
|
86
|
+
{ slug: 'checks/story/ui', label: 'UI', note: 'JSON', isCheck: true },
|
|
87
|
+
{ slug: 'checks/story/ux', label: 'UX', note: 'JSON', isCheck: true },
|
|
88
|
+
{ slug: 'checks/story/mobile', label: 'Mobile', note: 'JSON', isCheck: true },
|
|
89
|
+
{ slug: 'checks/story/data', label: 'Data', note: 'JSON', isCheck: true },
|
|
90
|
+
{ slug: 'checks/story/qa', label: 'QA', note: 'JSON', isCheck: true },
|
|
91
|
+
{ slug: 'checks/story/test-architect', label: 'Test Architect', note: 'JSON', isCheck: true },
|
|
92
|
+
{ slug: 'story-splitter', label: 'Story Splitter', note: 'Splits oversized stories (15+ ACs) into 2-3 focused stories' },
|
|
101
93
|
]},
|
|
102
|
-
{ phase: '
|
|
103
|
-
{ slug: '
|
|
104
|
-
{ slug: '
|
|
105
|
-
{ slug: 'solver-story-security', label: 'Security' },
|
|
106
|
-
{ slug: 'solver-story-devops', label: 'DevOps' },
|
|
107
|
-
{ slug: 'solver-story-cloud', label: 'Cloud' },
|
|
108
|
-
{ slug: 'solver-story-backend', label: 'Backend' },
|
|
109
|
-
{ slug: 'solver-story-database', label: 'Database' },
|
|
110
|
-
{ slug: 'solver-story-api', label: 'API' },
|
|
111
|
-
{ slug: 'solver-story-frontend', label: 'Frontend' },
|
|
112
|
-
{ slug: 'solver-story-ui', label: 'UI' },
|
|
113
|
-
{ slug: 'solver-story-ux', label: 'UX' },
|
|
114
|
-
{ slug: 'solver-story-mobile', label: 'Mobile' },
|
|
115
|
-
{ slug: 'solver-story-data', label: 'Data' },
|
|
116
|
-
{ slug: 'solver-story-qa', label: 'QA' },
|
|
117
|
-
{ slug: 'solver-story-test-architect', label: 'Test Architect' },
|
|
94
|
+
{ phase: 'Cross-Reference Checks', agents: [
|
|
95
|
+
{ slug: 'checks/cross-refs/epic', label: 'Epic Cross-Refs', note: 'JSON', isCheck: true },
|
|
96
|
+
{ slug: 'checks/cross-refs/story', label: 'Story Cross-Refs', note: 'JSON', isCheck: true },
|
|
118
97
|
]},
|
|
119
98
|
],
|
|
120
99
|
},
|
|
@@ -148,7 +127,9 @@ const KNOWN_SLUGS = new Set(
|
|
|
148
127
|
|
|
149
128
|
export function AgentsTab() {
|
|
150
129
|
const [agentStatus, setAgentStatus] = useState({}); // { slug: isCustomized }
|
|
130
|
+
const [checkStatus, setCheckStatus] = useState({}); // { 'scope/perspective': { isCustomized, checkCount } }
|
|
151
131
|
const [openAgent, setOpenAgent] = useState(null); // slug | null
|
|
132
|
+
const [openCheck, setOpenCheck] = useState(null); // { scope, perspective } | null
|
|
152
133
|
const [search, setSearch] = useState('');
|
|
153
134
|
const [error, setError] = useState(null);
|
|
154
135
|
// collapsed state: absence = collapsed (default), true = open
|
|
@@ -165,6 +146,17 @@ export function AgentsTab() {
|
|
|
165
146
|
setAgentStatus(status);
|
|
166
147
|
})
|
|
167
148
|
.catch(err => setError(err.message));
|
|
149
|
+
|
|
150
|
+
getCheckList()
|
|
151
|
+
.then(r => {
|
|
152
|
+
const status = {};
|
|
153
|
+
r.checks.forEach(c => {
|
|
154
|
+
const key = `checks/${c.scope}/${c.perspective}`;
|
|
155
|
+
status[key] = { isCustomized: c.isCustomized, checkCount: c.checkCount };
|
|
156
|
+
});
|
|
157
|
+
setCheckStatus(status);
|
|
158
|
+
})
|
|
159
|
+
.catch(() => {}); // silently ignore if check API not available
|
|
168
160
|
}, []);
|
|
169
161
|
|
|
170
162
|
const toggle = (key) => setCollapsed(prev => ({ ...prev, [key]: !prev[key] }));
|
|
@@ -203,14 +195,14 @@ export function AgentsTab() {
|
|
|
203
195
|
.filter(c => c.phases.length > 0)
|
|
204
196
|
: allCeremonies;
|
|
205
197
|
|
|
206
|
-
const hasAgentsLoaded = Object.keys(agentStatus).length > 0;
|
|
198
|
+
const hasAgentsLoaded = Object.keys(agentStatus).length > 0 || Object.keys(checkStatus).length > 0;
|
|
207
199
|
const forceOpen = q.length > 0;
|
|
208
200
|
|
|
209
201
|
// Count customized agents per ceremony for the badge
|
|
210
202
|
const countCustomized = (ceremony) =>
|
|
211
203
|
ceremony.phases
|
|
212
204
|
.flatMap(p => p.agents)
|
|
213
|
-
.filter(a => agentStatus[a.slug])
|
|
205
|
+
.filter(a => a.isCheck ? checkStatus[a.slug]?.isCustomized : agentStatus[a.slug])
|
|
214
206
|
.length;
|
|
215
207
|
|
|
216
208
|
return (
|
|
@@ -273,7 +265,7 @@ export function AgentsTab() {
|
|
|
273
265
|
const phaseKey = `${ceremony.ceremony}::${phase.phase}`;
|
|
274
266
|
const phaseOpen = forceOpen || isOpen(phaseKey);
|
|
275
267
|
const visibleAgents = phase.agents.filter(
|
|
276
|
-
a => !hasAgentsLoaded || a.slug in agentStatus
|
|
268
|
+
a => !hasAgentsLoaded || a.isCheck || a.slug in agentStatus
|
|
277
269
|
);
|
|
278
270
|
if (visibleAgents.length === 0) return null;
|
|
279
271
|
|
|
@@ -301,19 +293,37 @@ export function AgentsTab() {
|
|
|
301
293
|
{phaseOpen && (
|
|
302
294
|
<div className="pb-1">
|
|
303
295
|
{visibleAgents.map(agent => {
|
|
304
|
-
const
|
|
296
|
+
const isCheck = agent.isCheck;
|
|
297
|
+
const isCustomized = isCheck
|
|
298
|
+
? (checkStatus[agent.slug]?.isCustomized ?? false)
|
|
299
|
+
: (agentStatus[agent.slug] ?? false);
|
|
300
|
+
const checkCount = isCheck ? (checkStatus[agent.slug]?.checkCount ?? 0) : 0;
|
|
301
|
+
const handleClick = () => {
|
|
302
|
+
if (isCheck) {
|
|
303
|
+
// Parse slug: "checks/scope/perspective"
|
|
304
|
+
const parts = agent.slug.split('/');
|
|
305
|
+
setOpenCheck({ scope: parts[1], perspective: parts[2] });
|
|
306
|
+
} else {
|
|
307
|
+
setOpenAgent(agent.slug);
|
|
308
|
+
}
|
|
309
|
+
};
|
|
305
310
|
return (
|
|
306
311
|
<button
|
|
307
312
|
key={`${ceremony.ceremony}-${agent.slug}`}
|
|
308
313
|
type="button"
|
|
309
|
-
onClick={
|
|
314
|
+
onClick={handleClick}
|
|
310
315
|
className="w-full text-left pl-10 pr-4 py-1.5 hover:bg-slate-50 transition-colors flex items-center gap-3 group"
|
|
311
316
|
>
|
|
312
317
|
<div className="flex-1 min-w-0">
|
|
313
318
|
<span className="text-sm text-slate-700 group-hover:text-slate-900">
|
|
314
319
|
{agent.label}
|
|
315
320
|
</span>
|
|
316
|
-
{
|
|
321
|
+
{isCheck && checkCount > 0 && (
|
|
322
|
+
<span className="text-xs text-blue-500 ml-2">
|
|
323
|
+
{checkCount} checks
|
|
324
|
+
</span>
|
|
325
|
+
)}
|
|
326
|
+
{agent.note && !isCheck && (
|
|
317
327
|
<span className="text-xs text-slate-400 italic ml-2">
|
|
318
328
|
{agent.note}
|
|
319
329
|
</span>
|
|
@@ -324,6 +334,7 @@ export function AgentsTab() {
|
|
|
324
334
|
Custom
|
|
325
335
|
</span>
|
|
326
336
|
)}
|
|
337
|
+
<Pencil className="w-3.5 h-3.5 text-slate-300 group-hover:text-slate-500 flex-shrink-0 transition-colors" />
|
|
327
338
|
</button>
|
|
328
339
|
);
|
|
329
340
|
})}
|
|
@@ -348,6 +359,23 @@ export function AgentsTab() {
|
|
|
348
359
|
onReset={() => setAgentStatus(prev => ({ ...prev, [openAgent]: false }))}
|
|
349
360
|
/>
|
|
350
361
|
)}
|
|
362
|
+
|
|
363
|
+
{/* Check editor popup */}
|
|
364
|
+
{openCheck && (
|
|
365
|
+
<CheckEditorPopup
|
|
366
|
+
scope={openCheck.scope}
|
|
367
|
+
perspective={openCheck.perspective}
|
|
368
|
+
onClose={() => setOpenCheck(null)}
|
|
369
|
+
onSaved={() => {
|
|
370
|
+
const key = `checks/${openCheck.scope}/${openCheck.perspective}`;
|
|
371
|
+
setCheckStatus(prev => ({ ...prev, [key]: { ...prev[key], isCustomized: true } }));
|
|
372
|
+
}}
|
|
373
|
+
onReset={() => {
|
|
374
|
+
const key = `checks/${openCheck.scope}/${openCheck.perspective}`;
|
|
375
|
+
setCheckStatus(prev => ({ ...prev, [key]: { ...prev[key], isCustomized: false } }));
|
|
376
|
+
}}
|
|
377
|
+
/>
|
|
378
|
+
)}
|
|
351
379
|
</div>
|
|
352
380
|
);
|
|
353
381
|
}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
2
|
import { Eye, EyeOff } from 'lucide-react';
|
|
3
3
|
import { saveApiKeys } from '../../lib/api';
|
|
4
|
+
import { OpenAIAuthSection } from './OpenAIAuthSection';
|
|
4
5
|
|
|
5
6
|
const PROVIDERS = [
|
|
6
7
|
{ key: 'anthropic', label: 'Anthropic', envKey: 'ANTHROPIC_API_KEY', placeholder: 'sk-ant-…' },
|
|
7
8
|
{ key: 'gemini', label: 'Google (Gemini)', envKey: 'GEMINI_API_KEY', placeholder: 'AIza…' },
|
|
8
|
-
{ key: '
|
|
9
|
+
{ key: 'xiaomi', label: 'Xiaomi (MiMo)', envKey: 'XIAOMI_API_KEY', placeholder: 'sk-…' },
|
|
9
10
|
];
|
|
10
11
|
|
|
11
12
|
function ApiKeyRow({ provider, apiKeyInfo, onSaved }) {
|
|
12
13
|
const [value, setValue] = useState('');
|
|
13
14
|
const [showKey, setShowKey] = useState(false);
|
|
14
|
-
const [status, setStatus] = useState(null); // null | 'saving' | 'saved' | 'error'
|
|
15
|
+
const [status, setStatus] = useState(null); // null | 'saving' | 'saved' | 'error' | 'clearing'
|
|
15
16
|
|
|
16
17
|
const handleSave = async () => {
|
|
17
18
|
setStatus('saving');
|
|
@@ -27,6 +28,19 @@ function ApiKeyRow({ provider, apiKeyInfo, onSaved }) {
|
|
|
27
28
|
}
|
|
28
29
|
};
|
|
29
30
|
|
|
31
|
+
const handleClear = async () => {
|
|
32
|
+
setStatus('clearing');
|
|
33
|
+
try {
|
|
34
|
+
await saveApiKeys({ [provider.key]: '' });
|
|
35
|
+
setStatus('saved');
|
|
36
|
+
onSaved();
|
|
37
|
+
setTimeout(() => setStatus(null), 2000);
|
|
38
|
+
} catch {
|
|
39
|
+
setStatus('error');
|
|
40
|
+
setTimeout(() => setStatus(null), 2000);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
30
44
|
return (
|
|
31
45
|
<div className="flex items-center gap-3 py-3 border-b border-slate-100 last:border-0">
|
|
32
46
|
{/* Provider name */}
|
|
@@ -73,6 +87,17 @@ function ApiKeyRow({ provider, apiKeyInfo, onSaved }) {
|
|
|
73
87
|
</button>
|
|
74
88
|
</div>
|
|
75
89
|
|
|
90
|
+
{apiKeyInfo.isSet && !value && (
|
|
91
|
+
<button
|
|
92
|
+
type="button"
|
|
93
|
+
onClick={handleClear}
|
|
94
|
+
disabled={status === 'clearing'}
|
|
95
|
+
className="px-3 py-1.5 text-xs font-medium border border-red-200 text-red-600 rounded-md hover:bg-red-50 transition-colors disabled:opacity-40 flex-shrink-0"
|
|
96
|
+
>
|
|
97
|
+
{status === 'clearing' ? '…' : 'Reset'}
|
|
98
|
+
</button>
|
|
99
|
+
)}
|
|
100
|
+
|
|
76
101
|
<button
|
|
77
102
|
type="button"
|
|
78
103
|
onClick={handleSave}
|
|
@@ -107,6 +132,10 @@ export function ApiKeysTab({ settings, onSaved }) {
|
|
|
107
132
|
onSaved={onSaved}
|
|
108
133
|
/>
|
|
109
134
|
))}
|
|
135
|
+
<OpenAIAuthSection
|
|
136
|
+
apiKeyInfo={settings.apiKeys.openai}
|
|
137
|
+
onSaved={onSaved}
|
|
138
|
+
/>
|
|
110
139
|
</div>
|
|
111
140
|
</div>
|
|
112
141
|
);
|
|
@@ -11,8 +11,9 @@ function humanize(str) {
|
|
|
11
11
|
|
|
12
12
|
const CEREMONY_DESCRIPTIONS = {
|
|
13
13
|
'sponsor-call': 'Generates mission statement and project documentation through a structured AI-guided interview.',
|
|
14
|
-
'sprint-planning': '
|
|
15
|
-
'seed': '
|
|
14
|
+
'sprint-planning': 'Decomposes project scope into epics and stories with multi-agent validation and context generation.',
|
|
15
|
+
'seed': 'Decomposes a story into implementable tasks and subtasks with documentation and context files.',
|
|
16
|
+
'run': 'Implements task code in a git worktree using AI agents with traceability rules validation.',
|
|
16
17
|
};
|
|
17
18
|
|
|
18
19
|
export function CeremonyModelsTab({ settings, models, onSaved }) {
|
|
@@ -87,10 +88,16 @@ export function CeremonyModelsTab({ settings, models, onSaved }) {
|
|
|
87
88
|
{activeWorkflow && activeWorkflowCeremony && (
|
|
88
89
|
<CeremonyWorkflowModal
|
|
89
90
|
ceremony={activeWorkflowCeremony}
|
|
91
|
+
allCeremonies={ceremonies}
|
|
92
|
+
apiKeys={settings.apiKeys}
|
|
90
93
|
models={models}
|
|
91
94
|
missionGenValidation={activeWorkflow === 'sponsor-call' ? missionGenValidation : null}
|
|
92
95
|
onClose={() => setActiveWorkflow(null)}
|
|
93
96
|
onSave={handleCeremonySave}
|
|
97
|
+
onCeremoniesUpdated={(updated) => {
|
|
98
|
+
setCeremonies(updated);
|
|
99
|
+
onSaved();
|
|
100
|
+
}}
|
|
94
101
|
/>
|
|
95
102
|
)}
|
|
96
103
|
</div>
|