@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.
Files changed (261) hide show
  1. package/cli/agents/agent-selector.md +23 -0
  2. package/cli/agents/code-implementer.md +117 -0
  3. package/cli/agents/code-validator.md +80 -0
  4. package/cli/agents/context-reviewer-epic.md +101 -0
  5. package/cli/agents/context-reviewer-story.md +92 -0
  6. package/cli/agents/context-writer-epic.md +145 -0
  7. package/cli/agents/context-writer-story.md +111 -0
  8. package/cli/agents/doc-writer-epic.md +42 -0
  9. package/cli/agents/doc-writer-story.md +43 -0
  10. package/cli/agents/duplicate-detector.md +110 -0
  11. package/cli/agents/epic-story-decomposer.md +318 -39
  12. package/cli/agents/mission-scope-generator.md +68 -4
  13. package/cli/agents/mission-scope-validator.md +40 -6
  14. package/cli/agents/project-context-extractor.md +21 -6
  15. package/cli/agents/scaffolding-generator.md +99 -0
  16. package/cli/agents/seed-validator.md +71 -0
  17. package/cli/agents/story-scope-reviewer.md +147 -0
  18. package/cli/agents/story-splitter.md +83 -0
  19. package/cli/agents/validator-documentation.json +31 -0
  20. package/cli/agents/validator-documentation.md +3 -1
  21. package/cli/api-reference-tool.js +368 -0
  22. package/cli/checks/catalog.json +76 -0
  23. package/cli/checks/code/quality.json +26 -0
  24. package/cli/checks/code/testing.json +14 -0
  25. package/cli/checks/code/traceability.json +26 -0
  26. package/cli/checks/cross-refs/epic.json +171 -0
  27. package/cli/checks/cross-refs/story.json +149 -0
  28. package/cli/checks/epic/api.json +114 -0
  29. package/cli/checks/epic/backend.json +126 -0
  30. package/cli/checks/epic/cloud.json +126 -0
  31. package/cli/checks/epic/data.json +102 -0
  32. package/cli/checks/epic/database.json +114 -0
  33. package/cli/checks/epic/developer.json +182 -0
  34. package/cli/checks/epic/devops.json +174 -0
  35. package/cli/checks/epic/frontend.json +162 -0
  36. package/cli/checks/epic/mobile.json +102 -0
  37. package/cli/checks/epic/qa.json +90 -0
  38. package/cli/checks/epic/security.json +184 -0
  39. package/cli/checks/epic/solution-architect.json +192 -0
  40. package/cli/checks/epic/test-architect.json +90 -0
  41. package/cli/checks/epic/ui.json +102 -0
  42. package/cli/checks/epic/ux.json +90 -0
  43. package/cli/checks/fixes/epic-fix-template.md +10 -0
  44. package/cli/checks/fixes/story-fix-template.md +10 -0
  45. package/cli/checks/story/api.json +186 -0
  46. package/cli/checks/story/backend.json +102 -0
  47. package/cli/checks/story/cloud.json +102 -0
  48. package/cli/checks/story/data.json +210 -0
  49. package/cli/checks/story/database.json +102 -0
  50. package/cli/checks/story/developer.json +168 -0
  51. package/cli/checks/story/devops.json +102 -0
  52. package/cli/checks/story/frontend.json +174 -0
  53. package/cli/checks/story/mobile.json +102 -0
  54. package/cli/checks/story/qa.json +210 -0
  55. package/cli/checks/story/security.json +198 -0
  56. package/cli/checks/story/solution-architect.json +230 -0
  57. package/cli/checks/story/test-architect.json +210 -0
  58. package/cli/checks/story/ui.json +102 -0
  59. package/cli/checks/story/ux.json +102 -0
  60. package/cli/coding-order.js +401 -0
  61. package/cli/dependency-checker.js +72 -0
  62. package/cli/epic-story-validator.js +284 -799
  63. package/cli/index.js +0 -0
  64. package/cli/init-model-config.js +17 -10
  65. package/cli/init.js +514 -92
  66. package/cli/kanban-server-manager.js +1 -2
  67. package/cli/llm-claude.js +98 -31
  68. package/cli/llm-gemini.js +29 -5
  69. package/cli/llm-local.js +493 -0
  70. package/cli/llm-openai.js +262 -41
  71. package/cli/llm-provider.js +147 -8
  72. package/cli/llm-token-limits.js +113 -4
  73. package/cli/llm-verifier.js +209 -1
  74. package/cli/llm-xiaomi.js +143 -0
  75. package/cli/message-constants.js +3 -12
  76. package/cli/messaging-api.js +6 -12
  77. package/cli/micro-check-fixer.js +335 -0
  78. package/cli/micro-check-runner.js +449 -0
  79. package/cli/micro-check-scorer.js +148 -0
  80. package/cli/micro-check-validator.js +538 -0
  81. package/cli/model-pricing.js +23 -0
  82. package/cli/model-selector.js +3 -2
  83. package/cli/prompt-logger.js +57 -0
  84. package/cli/repl-ink.js +106 -346
  85. package/cli/repl-old.js +1 -2
  86. package/cli/seed-processor.js +194 -24
  87. package/cli/sprint-planning-processor.js +2638 -289
  88. package/cli/template-processor.js +50 -3
  89. package/cli/token-tracker.js +50 -23
  90. package/cli/tools/generate-story-validators.js +1 -1
  91. package/cli/validation-router.js +70 -8
  92. package/cli/worktree-runner.js +654 -0
  93. package/kanban/client/dist/assets/index-D_KC5EQT.css +1 -0
  94. package/kanban/client/dist/assets/index-DjY5zqW7.js +351 -0
  95. package/kanban/client/dist/index.html +2 -2
  96. package/kanban/client/src/App.jsx +43 -14
  97. package/kanban/client/src/components/ceremony/AskArchPopup.jsx +7 -3
  98. package/kanban/client/src/components/ceremony/AskModelPopup.jsx +23 -10
  99. package/kanban/client/src/components/ceremony/CeremonyWorkflowModal.jsx +320 -133
  100. package/kanban/client/src/components/ceremony/ProviderSwitcherButton.jsx +290 -0
  101. package/kanban/client/src/components/ceremony/SponsorCallModal.jsx +80 -13
  102. package/kanban/client/src/components/ceremony/SprintPlanningModal.jsx +156 -22
  103. package/kanban/client/src/components/ceremony/steps/ArchitectureStep.jsx +11 -11
  104. package/kanban/client/src/components/ceremony/steps/CompleteStep.jsx +3 -21
  105. package/kanban/client/src/components/ceremony/steps/ReviewAnswersStep.jsx +214 -10
  106. package/kanban/client/src/components/ceremony/steps/RunningStep.jsx +23 -2
  107. package/kanban/client/src/components/kanban/CardDetailModal.jsx +97 -10
  108. package/kanban/client/src/components/kanban/GroupingSelector.jsx +7 -1
  109. package/kanban/client/src/components/kanban/KanbanCard.jsx +23 -14
  110. package/kanban/client/src/components/kanban/RefineWorkItemPopup.jsx +9 -14
  111. package/kanban/client/src/components/kanban/RunButton.jsx +162 -0
  112. package/kanban/client/src/components/kanban/SeedButton.jsx +176 -0
  113. package/kanban/client/src/components/settings/AgentsTab.jsx +103 -75
  114. package/kanban/client/src/components/settings/ApiKeysTab.jsx +31 -2
  115. package/kanban/client/src/components/settings/CeremonyModelsTab.jsx +9 -2
  116. package/kanban/client/src/components/settings/CheckEditorPopup.jsx +507 -0
  117. package/kanban/client/src/components/settings/CostThresholdsTab.jsx +3 -2
  118. package/kanban/client/src/components/settings/ModelPricingTab.jsx +72 -7
  119. package/kanban/client/src/components/settings/OpenAIAuthSection.jsx +412 -0
  120. package/kanban/client/src/components/settings/SettingsModal.jsx +4 -4
  121. package/kanban/client/src/components/stats/CostModal.jsx +34 -3
  122. package/kanban/client/src/hooks/useGrouping.js +59 -0
  123. package/kanban/client/src/lib/api.js +118 -4
  124. package/kanban/client/src/lib/status-grouping.js +10 -0
  125. package/kanban/client/src/store/kanbanStore.js +8 -0
  126. package/kanban/server/index.js +23 -2
  127. package/kanban/server/routes/ceremony.js +153 -4
  128. package/kanban/server/routes/costs.js +9 -3
  129. package/kanban/server/routes/openai-oauth.js +366 -0
  130. package/kanban/server/routes/settings.js +447 -14
  131. package/kanban/server/routes/websocket.js +7 -2
  132. package/kanban/server/routes/work-items.js +141 -1
  133. package/kanban/server/services/CeremonyService.js +275 -24
  134. package/kanban/server/services/TaskRunnerService.js +261 -0
  135. package/kanban/server/workers/run-task-worker.js +121 -0
  136. package/kanban/server/workers/seed-worker.js +94 -0
  137. package/kanban/server/workers/sponsor-call-worker.js +14 -6
  138. package/kanban/server/workers/sprint-planning-worker.js +94 -12
  139. package/package.json +2 -3
  140. package/cli/agents/solver-epic-api.json +0 -15
  141. package/cli/agents/solver-epic-api.md +0 -39
  142. package/cli/agents/solver-epic-backend.json +0 -15
  143. package/cli/agents/solver-epic-backend.md +0 -39
  144. package/cli/agents/solver-epic-cloud.json +0 -15
  145. package/cli/agents/solver-epic-cloud.md +0 -39
  146. package/cli/agents/solver-epic-data.json +0 -15
  147. package/cli/agents/solver-epic-data.md +0 -39
  148. package/cli/agents/solver-epic-database.json +0 -15
  149. package/cli/agents/solver-epic-database.md +0 -39
  150. package/cli/agents/solver-epic-developer.json +0 -15
  151. package/cli/agents/solver-epic-developer.md +0 -39
  152. package/cli/agents/solver-epic-devops.json +0 -15
  153. package/cli/agents/solver-epic-devops.md +0 -39
  154. package/cli/agents/solver-epic-frontend.json +0 -15
  155. package/cli/agents/solver-epic-frontend.md +0 -39
  156. package/cli/agents/solver-epic-mobile.json +0 -15
  157. package/cli/agents/solver-epic-mobile.md +0 -39
  158. package/cli/agents/solver-epic-qa.json +0 -15
  159. package/cli/agents/solver-epic-qa.md +0 -39
  160. package/cli/agents/solver-epic-security.json +0 -15
  161. package/cli/agents/solver-epic-security.md +0 -39
  162. package/cli/agents/solver-epic-solution-architect.json +0 -15
  163. package/cli/agents/solver-epic-solution-architect.md +0 -39
  164. package/cli/agents/solver-epic-test-architect.json +0 -15
  165. package/cli/agents/solver-epic-test-architect.md +0 -39
  166. package/cli/agents/solver-epic-ui.json +0 -15
  167. package/cli/agents/solver-epic-ui.md +0 -39
  168. package/cli/agents/solver-epic-ux.json +0 -15
  169. package/cli/agents/solver-epic-ux.md +0 -39
  170. package/cli/agents/solver-story-api.json +0 -15
  171. package/cli/agents/solver-story-api.md +0 -39
  172. package/cli/agents/solver-story-backend.json +0 -15
  173. package/cli/agents/solver-story-backend.md +0 -39
  174. package/cli/agents/solver-story-cloud.json +0 -15
  175. package/cli/agents/solver-story-cloud.md +0 -39
  176. package/cli/agents/solver-story-data.json +0 -15
  177. package/cli/agents/solver-story-data.md +0 -39
  178. package/cli/agents/solver-story-database.json +0 -15
  179. package/cli/agents/solver-story-database.md +0 -39
  180. package/cli/agents/solver-story-developer.json +0 -15
  181. package/cli/agents/solver-story-developer.md +0 -39
  182. package/cli/agents/solver-story-devops.json +0 -15
  183. package/cli/agents/solver-story-devops.md +0 -39
  184. package/cli/agents/solver-story-frontend.json +0 -15
  185. package/cli/agents/solver-story-frontend.md +0 -39
  186. package/cli/agents/solver-story-mobile.json +0 -15
  187. package/cli/agents/solver-story-mobile.md +0 -39
  188. package/cli/agents/solver-story-qa.json +0 -15
  189. package/cli/agents/solver-story-qa.md +0 -39
  190. package/cli/agents/solver-story-security.json +0 -15
  191. package/cli/agents/solver-story-security.md +0 -39
  192. package/cli/agents/solver-story-solution-architect.json +0 -15
  193. package/cli/agents/solver-story-solution-architect.md +0 -39
  194. package/cli/agents/solver-story-test-architect.json +0 -15
  195. package/cli/agents/solver-story-test-architect.md +0 -39
  196. package/cli/agents/solver-story-ui.json +0 -15
  197. package/cli/agents/solver-story-ui.md +0 -39
  198. package/cli/agents/solver-story-ux.json +0 -15
  199. package/cli/agents/solver-story-ux.md +0 -39
  200. package/cli/agents/validator-epic-api.json +0 -93
  201. package/cli/agents/validator-epic-api.md +0 -137
  202. package/cli/agents/validator-epic-backend.json +0 -93
  203. package/cli/agents/validator-epic-backend.md +0 -130
  204. package/cli/agents/validator-epic-cloud.json +0 -93
  205. package/cli/agents/validator-epic-cloud.md +0 -137
  206. package/cli/agents/validator-epic-data.json +0 -93
  207. package/cli/agents/validator-epic-data.md +0 -130
  208. package/cli/agents/validator-epic-database.json +0 -93
  209. package/cli/agents/validator-epic-database.md +0 -137
  210. package/cli/agents/validator-epic-developer.json +0 -74
  211. package/cli/agents/validator-epic-developer.md +0 -153
  212. package/cli/agents/validator-epic-devops.json +0 -74
  213. package/cli/agents/validator-epic-devops.md +0 -153
  214. package/cli/agents/validator-epic-frontend.json +0 -74
  215. package/cli/agents/validator-epic-frontend.md +0 -153
  216. package/cli/agents/validator-epic-mobile.json +0 -93
  217. package/cli/agents/validator-epic-mobile.md +0 -130
  218. package/cli/agents/validator-epic-qa.json +0 -93
  219. package/cli/agents/validator-epic-qa.md +0 -130
  220. package/cli/agents/validator-epic-security.json +0 -74
  221. package/cli/agents/validator-epic-security.md +0 -154
  222. package/cli/agents/validator-epic-solution-architect.json +0 -74
  223. package/cli/agents/validator-epic-solution-architect.md +0 -156
  224. package/cli/agents/validator-epic-test-architect.json +0 -93
  225. package/cli/agents/validator-epic-test-architect.md +0 -130
  226. package/cli/agents/validator-epic-ui.json +0 -93
  227. package/cli/agents/validator-epic-ui.md +0 -130
  228. package/cli/agents/validator-epic-ux.json +0 -93
  229. package/cli/agents/validator-epic-ux.md +0 -130
  230. package/cli/agents/validator-story-api.json +0 -104
  231. package/cli/agents/validator-story-api.md +0 -152
  232. package/cli/agents/validator-story-backend.json +0 -104
  233. package/cli/agents/validator-story-backend.md +0 -152
  234. package/cli/agents/validator-story-cloud.json +0 -104
  235. package/cli/agents/validator-story-cloud.md +0 -152
  236. package/cli/agents/validator-story-data.json +0 -104
  237. package/cli/agents/validator-story-data.md +0 -152
  238. package/cli/agents/validator-story-database.json +0 -104
  239. package/cli/agents/validator-story-database.md +0 -152
  240. package/cli/agents/validator-story-developer.json +0 -104
  241. package/cli/agents/validator-story-developer.md +0 -152
  242. package/cli/agents/validator-story-devops.json +0 -104
  243. package/cli/agents/validator-story-devops.md +0 -152
  244. package/cli/agents/validator-story-frontend.json +0 -104
  245. package/cli/agents/validator-story-frontend.md +0 -152
  246. package/cli/agents/validator-story-mobile.json +0 -104
  247. package/cli/agents/validator-story-mobile.md +0 -152
  248. package/cli/agents/validator-story-qa.json +0 -104
  249. package/cli/agents/validator-story-qa.md +0 -152
  250. package/cli/agents/validator-story-security.json +0 -104
  251. package/cli/agents/validator-story-security.md +0 -152
  252. package/cli/agents/validator-story-solution-architect.json +0 -104
  253. package/cli/agents/validator-story-solution-architect.md +0 -152
  254. package/cli/agents/validator-story-test-architect.json +0 -104
  255. package/cli/agents/validator-story-test-architect.md +0 -152
  256. package/cli/agents/validator-story-ui.json +0 -104
  257. package/cli/agents/validator-story-ui.md +0 -152
  258. package/cli/agents/validator-story-ux.json +0 -104
  259. package/cli/agents/validator-story-ux.md +0 -152
  260. package/kanban/client/dist/assets/index-CiD8PS2e.js +0 -306
  261. 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-distributor', label: 'Doc Distributor', note: 'Moves content from parent doc into child docs (project→epic, epic→story)' },
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: 'Validation — Epic', agents: [
51
- { slug: 'validator-selector', label: 'Validator Selector', note: 'Selects appropriate domain validators' },
52
- { slug: 'validator-epic-solution-architect', label: 'Solution Architect' },
53
- { slug: 'validator-epic-developer', label: 'Developer' },
54
- { slug: 'validator-epic-security', label: 'Security' },
55
- { slug: 'validator-epic-devops', label: 'DevOps' },
56
- { slug: 'validator-epic-cloud', label: 'Cloud' },
57
- { slug: 'validator-epic-backend', label: 'Backend' },
58
- { slug: 'validator-epic-database', label: 'Database' },
59
- { slug: 'validator-epic-api', label: 'API' },
60
- { slug: 'validator-epic-frontend', label: 'Frontend' },
61
- { slug: 'validator-epic-ui', label: 'UI' },
62
- { slug: 'validator-epic-ux', label: 'UX' },
63
- { slug: 'validator-epic-mobile', label: 'Mobile' },
64
- { slug: 'validator-epic-data', label: 'Data' },
65
- { slug: 'validator-epic-qa', label: 'QA' },
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: 'Validation — Story', agents: [
86
- { slug: 'validator-story-solution-architect', label: 'Solution Architect' },
87
- { slug: 'validator-story-developer', label: 'Developer' },
88
- { slug: 'validator-story-security', label: 'Security' },
89
- { slug: 'validator-story-devops', label: 'DevOps' },
90
- { slug: 'validator-story-cloud', label: 'Cloud' },
91
- { slug: 'validator-story-backend', label: 'Backend' },
92
- { slug: 'validator-story-database', label: 'Database' },
93
- { slug: 'validator-story-api', label: 'API' },
94
- { slug: 'validator-story-frontend', label: 'Frontend' },
95
- { slug: 'validator-story-ui', label: 'UI' },
96
- { slug: 'validator-story-ux', label: 'UX' },
97
- { slug: 'validator-story-mobile', label: 'Mobile' },
98
- { slug: 'validator-story-data', label: 'Data' },
99
- { slug: 'validator-story-qa', label: 'QA' },
100
- { slug: 'validator-story-test-architect', label: 'Test Architect' },
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: 'Solving — Story', agents: [
103
- { slug: 'solver-story-solution-architect', label: 'Solution Architect' },
104
- { slug: 'solver-story-developer', label: 'Developer' },
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 isCustomized = agentStatus[agent.slug] ?? false;
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={() => setOpenAgent(agent.slug)}
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
- {agent.note && (
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: 'openai', label: 'OpenAI', envKey: 'OPENAI_API_KEY', placeholder: 'sk-…' },
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': 'Plans and assigns work items for the upcoming sprint based on team capacity and priorities.',
15
- 'seed': 'Seeds the initial project work item structure from the project documentation.',
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>