@agile-vibe-coding/avc 0.2.3 → 0.3.2

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