sofia-cli 0.1.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 (435) hide show
  1. package/.github/agents/copilot-instructions.md +39 -0
  2. package/.github/agents/speckit.analyze.agent.md +184 -0
  3. package/.github/agents/speckit.checklist.agent.md +294 -0
  4. package/.github/agents/speckit.clarify.agent.md +181 -0
  5. package/.github/agents/speckit.constitution.agent.md +84 -0
  6. package/.github/agents/speckit.implement.agent.md +135 -0
  7. package/.github/agents/speckit.plan.agent.md +90 -0
  8. package/.github/agents/speckit.specify.agent.md +258 -0
  9. package/.github/agents/speckit.tasks.agent.md +137 -0
  10. package/.github/agents/speckit.taskstoissues.agent.md +30 -0
  11. package/.github/copilot-instructions.md +257 -0
  12. package/.github/prompts/speckit.analyze.prompt.md +3 -0
  13. package/.github/prompts/speckit.checklist.prompt.md +3 -0
  14. package/.github/prompts/speckit.clarify.prompt.md +3 -0
  15. package/.github/prompts/speckit.constitution.prompt.md +3 -0
  16. package/.github/prompts/speckit.implement.prompt.md +3 -0
  17. package/.github/prompts/speckit.plan.prompt.md +3 -0
  18. package/.github/prompts/speckit.specify.prompt.md +3 -0
  19. package/.github/prompts/speckit.tasks.prompt.md +3 -0
  20. package/.github/prompts/speckit.taskstoissues.prompt.md +3 -0
  21. package/.github/workflows/ci.yml +38 -0
  22. package/.prettierrc +6 -0
  23. package/.specify/memory/constitution.md +181 -0
  24. package/.specify/scripts/bash/check-prerequisites.sh +166 -0
  25. package/.specify/scripts/bash/common.sh +156 -0
  26. package/.specify/scripts/bash/create-new-feature.sh +297 -0
  27. package/.specify/scripts/bash/setup-plan.sh +61 -0
  28. package/.specify/scripts/bash/update-agent-context.sh +810 -0
  29. package/.specify/templates/agent-file-template.md +28 -0
  30. package/.specify/templates/checklist-template.md +40 -0
  31. package/.specify/templates/constitution-template.md +50 -0
  32. package/.specify/templates/plan-template.md +113 -0
  33. package/.specify/templates/spec-template.md +115 -0
  34. package/.specify/templates/tasks-template.md +251 -0
  35. package/.vscode/mcp.json +42 -0
  36. package/.vscode/settings.json +19 -0
  37. package/CODE_OF_CONDUCT.md +128 -0
  38. package/LICENSE +21 -0
  39. package/README.md +213 -0
  40. package/dist/src/cli/developCommand.js +240 -0
  41. package/dist/src/cli/directCommands.js +143 -0
  42. package/dist/src/cli/envLoader.js +16 -0
  43. package/dist/src/cli/exportCommand.js +53 -0
  44. package/dist/src/cli/index.js +203 -0
  45. package/dist/src/cli/ioContext.js +109 -0
  46. package/dist/src/cli/preflight.js +57 -0
  47. package/dist/src/cli/statusCommand.js +110 -0
  48. package/dist/src/cli/workshopCommand.js +400 -0
  49. package/dist/src/develop/checkpointState.js +86 -0
  50. package/dist/src/develop/codeGenerator.js +319 -0
  51. package/dist/src/develop/dynamicScaffolder.js +226 -0
  52. package/dist/src/develop/githubMcpAdapter.js +122 -0
  53. package/dist/src/develop/index.js +15 -0
  54. package/dist/src/develop/mcpContextEnricher.js +195 -0
  55. package/dist/src/develop/pocScaffolder.js +542 -0
  56. package/dist/src/develop/ralphLoop.js +659 -0
  57. package/dist/src/develop/templateRegistry.js +364 -0
  58. package/dist/src/develop/testRunner.js +202 -0
  59. package/dist/src/logging/logger.js +58 -0
  60. package/dist/src/loop/conversationLoop.js +227 -0
  61. package/dist/src/loop/phaseSummarizer.js +87 -0
  62. package/dist/src/mcp/mcpManager.js +267 -0
  63. package/dist/src/mcp/mcpTransport.js +391 -0
  64. package/dist/src/mcp/retryPolicy.js +47 -0
  65. package/dist/src/mcp/webSearch.js +254 -0
  66. package/dist/src/phases/contextSummarizer.js +101 -0
  67. package/dist/src/phases/discoveryEnricher.js +156 -0
  68. package/dist/src/phases/phaseExtractors.js +222 -0
  69. package/dist/src/phases/phaseHandlers.js +328 -0
  70. package/dist/src/prompts/design.md +51 -0
  71. package/dist/src/prompts/develop-boundary.md +51 -0
  72. package/dist/src/prompts/develop.md +111 -0
  73. package/dist/src/prompts/discover.md +58 -0
  74. package/dist/src/prompts/ideate.md +56 -0
  75. package/dist/src/prompts/plan.md +51 -0
  76. package/dist/src/prompts/promptLoader.js +167 -0
  77. package/dist/src/prompts/promptLoader.ts +198 -0
  78. package/dist/src/prompts/select.md +47 -0
  79. package/dist/src/prompts/summarize/README.md +8 -0
  80. package/dist/src/prompts/summarize/design-summary.md +37 -0
  81. package/dist/src/prompts/summarize/develop-summary.md +25 -0
  82. package/dist/src/prompts/summarize/ideate-summary.md +27 -0
  83. package/dist/src/prompts/summarize/plan-summary.md +27 -0
  84. package/dist/src/prompts/summarize/select-summary.md +21 -0
  85. package/dist/src/prompts/system.md +28 -0
  86. package/dist/src/sessions/exportPaths.js +22 -0
  87. package/dist/src/sessions/exportWriter.js +406 -0
  88. package/dist/src/sessions/sessionManager.js +81 -0
  89. package/dist/src/sessions/sessionStore.js +65 -0
  90. package/dist/src/shared/activitySpinner.js +91 -0
  91. package/dist/src/shared/copilotClient.js +129 -0
  92. package/dist/src/shared/data/cards.json +1249 -0
  93. package/dist/src/shared/data/cardsLoader.js +51 -0
  94. package/dist/src/shared/errorClassifier.js +120 -0
  95. package/dist/src/shared/events.js +28 -0
  96. package/dist/src/shared/markdownRenderer.js +34 -0
  97. package/dist/src/shared/schemas/session.js +265 -0
  98. package/dist/src/shared/tableRenderer.js +20 -0
  99. package/dist/src/vendor/chalk.js +2 -0
  100. package/dist/src/vendor/cli-table3.js +3 -0
  101. package/dist/src/vendor/commander.js +2 -0
  102. package/dist/src/vendor/marked-terminal.js +3 -0
  103. package/dist/src/vendor/marked.js +2 -0
  104. package/dist/src/vendor/ora.js +2 -0
  105. package/dist/src/vendor/pino.js +2 -0
  106. package/dist/src/vendor/zod.js +2 -0
  107. package/dist/tests/e2e/developE2e.spec.js +126 -0
  108. package/dist/tests/e2e/developFailureE2e.spec.js +247 -0
  109. package/dist/tests/e2e/developPty.spec.js +75 -0
  110. package/dist/tests/e2e/discoveryWebSearchRelevance.spec.js +84 -0
  111. package/dist/tests/e2e/harness.spec.js +83 -0
  112. package/dist/tests/e2e/mcpLive.spec.js +120 -0
  113. package/dist/tests/e2e/newSession.e2e.spec.js +177 -0
  114. package/dist/tests/e2e/ralphLoopEnrichmentComparison.spec.js +62 -0
  115. package/dist/tests/e2e/workiqEnrichment.spec.js +56 -0
  116. package/dist/tests/e2e/zavaSimulation.spec.js +452 -0
  117. package/dist/tests/fixtures/test-fixture-project/src/add.js +3 -0
  118. package/dist/tests/fixtures/test-fixture-project/tests/failing.test.js +6 -0
  119. package/dist/tests/fixtures/test-fixture-project/tests/hanging.test.js +8 -0
  120. package/dist/tests/fixtures/test-fixture-project/tests/passing.test.js +10 -0
  121. package/dist/tests/fixtures/test-fixture-project/vitest.config.js +6 -0
  122. package/dist/tests/integration/autoStartConversation.spec.js +138 -0
  123. package/dist/tests/integration/defaultCommand.spec.js +147 -0
  124. package/dist/tests/integration/directCommandNonTty.spec.js +224 -0
  125. package/dist/tests/integration/directCommandTty.spec.js +151 -0
  126. package/dist/tests/integration/discoveryEnrichmentFlow.spec.js +175 -0
  127. package/dist/tests/integration/exportArtifacts.spec.js +202 -0
  128. package/dist/tests/integration/exportFallbackFlow.spec.js +99 -0
  129. package/dist/tests/integration/mcpDegradationFlow.spec.js +190 -0
  130. package/dist/tests/integration/mcpTransportFlow.spec.js +139 -0
  131. package/dist/tests/integration/newSessionFlow.spec.js +343 -0
  132. package/dist/tests/integration/pocGithubMcp.spec.js +186 -0
  133. package/dist/tests/integration/pocLocalFallback.spec.js +171 -0
  134. package/dist/tests/integration/pocScaffold.spec.js +163 -0
  135. package/dist/tests/integration/ralphLoopFlow.spec.js +359 -0
  136. package/dist/tests/integration/ralphLoopPartial.spec.js +368 -0
  137. package/dist/tests/integration/resumeAndBacktrack.spec.js +247 -0
  138. package/dist/tests/integration/spinnerLifecycle.spec.js +220 -0
  139. package/dist/tests/integration/summarizationFlow.spec.js +115 -0
  140. package/dist/tests/integration/testRunnerReal.spec.js +52 -0
  141. package/dist/tests/integration/webSearchAgent.spec.js +128 -0
  142. package/dist/tests/live/copilotSdkLive.spec.js +107 -0
  143. package/dist/tests/live/zavaFullWorkshop.spec.js +392 -0
  144. package/dist/tests/setup/loadEnv.js +3 -0
  145. package/dist/tests/unit/cli/developCommand.spec.js +567 -0
  146. package/dist/tests/unit/cli/directCommands.spec.js +279 -0
  147. package/dist/tests/unit/cli/envLoader.spec.js +58 -0
  148. package/dist/tests/unit/cli/ioContext.spec.js +119 -0
  149. package/dist/tests/unit/cli/preflight.spec.js +108 -0
  150. package/dist/tests/unit/cli/statusCommand.spec.js +111 -0
  151. package/dist/tests/unit/cli/workshopClientFallback.spec.js +80 -0
  152. package/dist/tests/unit/cli/workshopCommand.spec.js +329 -0
  153. package/dist/tests/unit/config/vitestEnvSetup.spec.js +13 -0
  154. package/dist/tests/unit/develop/checkpointState.spec.js +315 -0
  155. package/dist/tests/unit/develop/codeGenerator.spec.js +355 -0
  156. package/dist/tests/unit/develop/githubMcpAdapter.spec.js +231 -0
  157. package/dist/tests/unit/develop/mcpContextEnricher.spec.js +433 -0
  158. package/dist/tests/unit/develop/outputValidator.spec.js +119 -0
  159. package/dist/tests/unit/develop/pocScaffolder.spec.js +353 -0
  160. package/dist/tests/unit/develop/ralphLoop.spec.js +1248 -0
  161. package/dist/tests/unit/develop/templateRegistry.spec.js +85 -0
  162. package/dist/tests/unit/develop/testRunner.spec.js +249 -0
  163. package/dist/tests/unit/infraBicep.spec.js +92 -0
  164. package/dist/tests/unit/infraDeploy.spec.js +82 -0
  165. package/dist/tests/unit/infraTeardown.spec.js +63 -0
  166. package/dist/tests/unit/logging/logger.spec.js +43 -0
  167. package/dist/tests/unit/loop/conversationLoop.spec.js +592 -0
  168. package/dist/tests/unit/loop/phaseSummarizer.spec.js +141 -0
  169. package/dist/tests/unit/loop/streamingMarkdown.spec.js +147 -0
  170. package/dist/tests/unit/mcp/mcpManager.spec.js +279 -0
  171. package/dist/tests/unit/mcp/mcpTransport.spec.js +529 -0
  172. package/dist/tests/unit/mcp/retryPolicy.spec.js +218 -0
  173. package/dist/tests/unit/mcp/timeoutValidation.spec.js +46 -0
  174. package/dist/tests/unit/mcp/webSearch.spec.js +567 -0
  175. package/dist/tests/unit/phases/contextSummarizer.spec.js +140 -0
  176. package/dist/tests/unit/phases/discoveryEnricher.repeatCalls.spec.js +93 -0
  177. package/dist/tests/unit/phases/discoveryEnricher.spec.js +411 -0
  178. package/dist/tests/unit/phases/phaseExtractors.spec.js +352 -0
  179. package/dist/tests/unit/phases/phaseHandlers.spec.js +425 -0
  180. package/dist/tests/unit/prompts/promptLoader.spec.js +118 -0
  181. package/dist/tests/unit/schemas/pocSchemas.spec.js +412 -0
  182. package/dist/tests/unit/schemas/session.spec.js +257 -0
  183. package/dist/tests/unit/sessions/exportPaths.spec.js +31 -0
  184. package/dist/tests/unit/sessions/exportWriter.spec.js +655 -0
  185. package/dist/tests/unit/sessions/sessionManager.spec.js +151 -0
  186. package/dist/tests/unit/sessions/sessionStore.spec.js +116 -0
  187. package/dist/tests/unit/shared/activitySpinner.spec.js +175 -0
  188. package/dist/tests/unit/shared/cardsLoader.spec.js +76 -0
  189. package/dist/tests/unit/shared/copilotClient.spec.js +155 -0
  190. package/dist/tests/unit/shared/errorClassifier.spec.js +131 -0
  191. package/dist/tests/unit/shared/events.spec.js +55 -0
  192. package/dist/tests/unit/shared/markdownRenderer.spec.js +35 -0
  193. package/dist/tests/unit/shared/markdownRendererChunks.spec.js +70 -0
  194. package/dist/tests/unit/shared/tableRenderer.spec.js +34 -0
  195. package/dist/vitest.config.js +14 -0
  196. package/dist/vitest.live.config.js +18 -0
  197. package/docs/README.md +35 -0
  198. package/docs/architecture.md +169 -0
  199. package/docs/cli-usage.md +207 -0
  200. package/docs/environment.md +66 -0
  201. package/docs/export-format.md +146 -0
  202. package/docs/session-model.md +113 -0
  203. package/eslint.config.js +35 -0
  204. package/infra/deploy.sh +193 -0
  205. package/infra/gather-env.sh +211 -0
  206. package/infra/main.bicep +90 -0
  207. package/infra/main.bicepparam +18 -0
  208. package/infra/resources.bicep +134 -0
  209. package/infra/teardown.sh +114 -0
  210. package/package.json +63 -0
  211. package/specs/001-cli-workshop-rebuild/checklists/requirements.md +35 -0
  212. package/specs/001-cli-workshop-rebuild/contracts/cli.md +59 -0
  213. package/specs/001-cli-workshop-rebuild/contracts/export-summary-json.md +23 -0
  214. package/specs/001-cli-workshop-rebuild/contracts/session-json.md +30 -0
  215. package/specs/001-cli-workshop-rebuild/data-model.md +210 -0
  216. package/specs/001-cli-workshop-rebuild/plan.md +361 -0
  217. package/specs/001-cli-workshop-rebuild/quickstart.md +83 -0
  218. package/specs/001-cli-workshop-rebuild/research.md +116 -0
  219. package/specs/001-cli-workshop-rebuild/spec.md +240 -0
  220. package/specs/001-cli-workshop-rebuild/tasks.md +476 -0
  221. package/specs/002-poc-generation/contracts/poc-output.md +172 -0
  222. package/specs/002-poc-generation/contracts/ralph-loop.md +113 -0
  223. package/specs/002-poc-generation/data-model.md +172 -0
  224. package/specs/002-poc-generation/plan.md +109 -0
  225. package/specs/002-poc-generation/quickstart.md +97 -0
  226. package/specs/002-poc-generation/research.md +786 -0
  227. package/specs/002-poc-generation/spec.md +81 -0
  228. package/specs/002-poc-generation/tasks-fix.md +198 -0
  229. package/specs/002-poc-generation/tasks.md +252 -0
  230. package/specs/003-mcp-transport-integration/checklists/requirements.md +37 -0
  231. package/specs/003-mcp-transport-integration/contracts/context-enricher.md +220 -0
  232. package/specs/003-mcp-transport-integration/contracts/discovery-enricher.md +267 -0
  233. package/specs/003-mcp-transport-integration/contracts/github-adapter.md +149 -0
  234. package/specs/003-mcp-transport-integration/contracts/mcp-transport.md +288 -0
  235. package/specs/003-mcp-transport-integration/data-model.md +326 -0
  236. package/specs/003-mcp-transport-integration/plan.md +114 -0
  237. package/specs/003-mcp-transport-integration/quickstart.md +311 -0
  238. package/specs/003-mcp-transport-integration/research.md +395 -0
  239. package/specs/003-mcp-transport-integration/spec.md +234 -0
  240. package/specs/003-mcp-transport-integration/tasks.md +324 -0
  241. package/specs/003-next-spec-gaps.md +150 -0
  242. package/specs/004-dev-resume-hardening/checklists/requirements.md +37 -0
  243. package/specs/004-dev-resume-hardening/contracts/cli.md +160 -0
  244. package/specs/004-dev-resume-hardening/data-model.md +321 -0
  245. package/specs/004-dev-resume-hardening/plan.md +107 -0
  246. package/specs/004-dev-resume-hardening/quickstart.md +115 -0
  247. package/specs/004-dev-resume-hardening/research.md +142 -0
  248. package/specs/004-dev-resume-hardening/spec.md +221 -0
  249. package/specs/004-dev-resume-hardening/tasks.md +333 -0
  250. package/specs/005-ai-search-deploy/checklists/requirements.md +39 -0
  251. package/specs/005-ai-search-deploy/contracts/web-search-tool.md +241 -0
  252. package/specs/005-ai-search-deploy/data-model.md +130 -0
  253. package/specs/005-ai-search-deploy/plan.md +93 -0
  254. package/specs/005-ai-search-deploy/quickstart.md +96 -0
  255. package/specs/005-ai-search-deploy/research.md +187 -0
  256. package/specs/005-ai-search-deploy/spec.md +143 -0
  257. package/specs/005-ai-search-deploy/tasks.md +284 -0
  258. package/specs/006-workshop-extraction-fixes/checklists/requirements.md +61 -0
  259. package/specs/006-workshop-extraction-fixes/contracts/summarization-and-export.md +131 -0
  260. package/specs/006-workshop-extraction-fixes/data-model.md +149 -0
  261. package/specs/006-workshop-extraction-fixes/plan.md +123 -0
  262. package/specs/006-workshop-extraction-fixes/quickstart.md +101 -0
  263. package/specs/006-workshop-extraction-fixes/research.md +143 -0
  264. package/specs/006-workshop-extraction-fixes/spec.md +210 -0
  265. package/specs/006-workshop-extraction-fixes/tasks.md +316 -0
  266. package/src/cli/developCommand.ts +308 -0
  267. package/src/cli/directCommands.ts +195 -0
  268. package/src/cli/envLoader.ts +17 -0
  269. package/src/cli/exportCommand.ts +65 -0
  270. package/src/cli/index.ts +249 -0
  271. package/src/cli/ioContext.ts +139 -0
  272. package/src/cli/preflight.ts +86 -0
  273. package/src/cli/statusCommand.ts +118 -0
  274. package/src/cli/workshopCommand.ts +496 -0
  275. package/src/develop/checkpointState.ts +121 -0
  276. package/src/develop/codeGenerator.ts +402 -0
  277. package/src/develop/dynamicScaffolder.ts +284 -0
  278. package/src/develop/githubMcpAdapter.ts +199 -0
  279. package/src/develop/index.ts +34 -0
  280. package/src/develop/mcpContextEnricher.ts +279 -0
  281. package/src/develop/pocScaffolder.ts +646 -0
  282. package/src/develop/ralphLoop.ts +1044 -0
  283. package/src/develop/templateRegistry.ts +427 -0
  284. package/src/develop/testRunner.ts +276 -0
  285. package/src/logging/logger.ts +73 -0
  286. package/src/loop/conversationLoop.ts +355 -0
  287. package/src/loop/phaseSummarizer.ts +114 -0
  288. package/src/mcp/mcpManager.ts +365 -0
  289. package/src/mcp/mcpTransport.ts +562 -0
  290. package/src/mcp/retryPolicy.ts +87 -0
  291. package/src/mcp/webSearch.ts +388 -0
  292. package/src/originalPrompts/design_thinking.md +178 -0
  293. package/src/originalPrompts/design_thinking_persona.md +76 -0
  294. package/src/originalPrompts/document_generator_example.md +77 -0
  295. package/src/originalPrompts/document_generator_persona.md +47 -0
  296. package/src/originalPrompts/facilitator_persona.md +125 -0
  297. package/src/originalPrompts/guardrails.md +47 -0
  298. package/src/phases/contextSummarizer.ts +154 -0
  299. package/src/phases/discoveryEnricher.ts +223 -0
  300. package/src/phases/phaseExtractors.ts +247 -0
  301. package/src/phases/phaseHandlers.ts +450 -0
  302. package/src/prompts/design.md +51 -0
  303. package/src/prompts/develop-boundary.md +51 -0
  304. package/src/prompts/develop.md +111 -0
  305. package/src/prompts/discover.md +58 -0
  306. package/src/prompts/ideate.md +56 -0
  307. package/src/prompts/plan.md +51 -0
  308. package/src/prompts/promptLoader.ts +198 -0
  309. package/src/prompts/select.md +47 -0
  310. package/src/prompts/summarize/README.md +8 -0
  311. package/src/prompts/summarize/design-summary.md +37 -0
  312. package/src/prompts/summarize/develop-summary.md +25 -0
  313. package/src/prompts/summarize/ideate-summary.md +27 -0
  314. package/src/prompts/summarize/plan-summary.md +27 -0
  315. package/src/prompts/summarize/select-summary.md +21 -0
  316. package/src/prompts/system.md +28 -0
  317. package/src/sessions/exportPaths.ts +28 -0
  318. package/src/sessions/exportWriter.ts +490 -0
  319. package/src/sessions/sessionManager.ts +119 -0
  320. package/src/sessions/sessionStore.ts +69 -0
  321. package/src/shared/activitySpinner.ts +108 -0
  322. package/src/shared/copilotClient.ts +291 -0
  323. package/src/shared/data/cards.json +1249 -0
  324. package/src/shared/data/cardsLoader.ts +70 -0
  325. package/src/shared/errorClassifier.ts +160 -0
  326. package/src/shared/events.ts +103 -0
  327. package/src/shared/markdownRenderer.ts +44 -0
  328. package/src/shared/schemas/session.ts +346 -0
  329. package/src/shared/tableRenderer.ts +28 -0
  330. package/src/types/marked-terminal.d.ts +5 -0
  331. package/src/vendor/chalk.ts +2 -0
  332. package/src/vendor/cli-table3.ts +3 -0
  333. package/src/vendor/commander.ts +2 -0
  334. package/src/vendor/marked-terminal.ts +3 -0
  335. package/src/vendor/marked.ts +2 -0
  336. package/src/vendor/ora.ts +2 -0
  337. package/src/vendor/pino.ts +3 -0
  338. package/src/vendor/zod.ts +3 -0
  339. package/tests/e2e/developE2e.spec.ts +152 -0
  340. package/tests/e2e/developFailureE2e.spec.ts +289 -0
  341. package/tests/e2e/developPty.spec.ts +86 -0
  342. package/tests/e2e/discoveryWebSearchRelevance.spec.ts +103 -0
  343. package/tests/e2e/harness.spec.ts +104 -0
  344. package/tests/e2e/mcpLive.spec.ts +149 -0
  345. package/tests/e2e/newSession.e2e.spec.ts +245 -0
  346. package/tests/e2e/ralphLoopEnrichmentComparison.spec.ts +70 -0
  347. package/tests/e2e/workiqEnrichment.spec.ts +72 -0
  348. package/tests/e2e/zava-assessment/agent-interaction-script.md +258 -0
  349. package/tests/e2e/zava-assessment/company-profile.md +98 -0
  350. package/tests/e2e/zava-assessment/expected-results-checklist.md +454 -0
  351. package/tests/e2e/zavaSimulation.spec.ts +511 -0
  352. package/tests/fixtures/completedSession.json +141 -0
  353. package/tests/fixtures/test-fixture-project/package-lock.json +1585 -0
  354. package/tests/fixtures/test-fixture-project/package.json +12 -0
  355. package/tests/fixtures/test-fixture-project/src/add.ts +3 -0
  356. package/tests/fixtures/test-fixture-project/tests/failing.test.ts +7 -0
  357. package/tests/fixtures/test-fixture-project/tests/hanging.test.ts +9 -0
  358. package/tests/fixtures/test-fixture-project/tests/passing.test.ts +13 -0
  359. package/tests/fixtures/test-fixture-project/vitest.config.ts +7 -0
  360. package/tests/integration/autoStartConversation.spec.ts +168 -0
  361. package/tests/integration/defaultCommand.spec.ts +179 -0
  362. package/tests/integration/directCommandNonTty.spec.ts +260 -0
  363. package/tests/integration/directCommandTty.spec.ts +185 -0
  364. package/tests/integration/discoveryEnrichmentFlow.spec.ts +209 -0
  365. package/tests/integration/exportArtifacts.spec.ts +232 -0
  366. package/tests/integration/exportFallbackFlow.spec.ts +115 -0
  367. package/tests/integration/mcpDegradationFlow.spec.ts +231 -0
  368. package/tests/integration/mcpTransportFlow.spec.ts +178 -0
  369. package/tests/integration/newSessionFlow.spec.ts +406 -0
  370. package/tests/integration/pocGithubMcp.spec.ts +224 -0
  371. package/tests/integration/pocLocalFallback.spec.ts +205 -0
  372. package/tests/integration/pocScaffold.spec.ts +220 -0
  373. package/tests/integration/ralphLoopFlow.spec.ts +430 -0
  374. package/tests/integration/ralphLoopPartial.spec.ts +416 -0
  375. package/tests/integration/resumeAndBacktrack.spec.ts +278 -0
  376. package/tests/integration/spinnerLifecycle.spec.ts +270 -0
  377. package/tests/integration/summarizationFlow.spec.ts +135 -0
  378. package/tests/integration/testRunnerReal.spec.ts +63 -0
  379. package/tests/integration/webSearchAgent.spec.ts +155 -0
  380. package/tests/live/copilotSdkLive.spec.ts +149 -0
  381. package/tests/live/zavaFullWorkshop.spec.ts +515 -0
  382. package/tests/setup/loadEnv.ts +5 -0
  383. package/tests/unit/cli/developCommand.spec.ts +679 -0
  384. package/tests/unit/cli/directCommands.spec.ts +325 -0
  385. package/tests/unit/cli/envLoader.spec.ts +73 -0
  386. package/tests/unit/cli/ioContext.spec.ts +148 -0
  387. package/tests/unit/cli/preflight.spec.ts +125 -0
  388. package/tests/unit/cli/statusCommand.spec.ts +134 -0
  389. package/tests/unit/cli/workshopClientFallback.spec.ts +100 -0
  390. package/tests/unit/cli/workshopCommand.spec.ts +378 -0
  391. package/tests/unit/config/vitestEnvSetup.spec.ts +24 -0
  392. package/tests/unit/develop/checkpointState.spec.ts +378 -0
  393. package/tests/unit/develop/codeGenerator.spec.ts +447 -0
  394. package/tests/unit/develop/githubMcpAdapter.spec.ts +283 -0
  395. package/tests/unit/develop/mcpContextEnricher.spec.ts +564 -0
  396. package/tests/unit/develop/outputValidator.spec.ts +134 -0
  397. package/tests/unit/develop/pocScaffolder.spec.ts +451 -0
  398. package/tests/unit/develop/ralphLoop.spec.ts +1439 -0
  399. package/tests/unit/develop/templateRegistry.spec.ts +106 -0
  400. package/tests/unit/develop/testRunner.spec.ts +294 -0
  401. package/tests/unit/infraBicep.spec.ts +116 -0
  402. package/tests/unit/infraDeploy.spec.ts +102 -0
  403. package/tests/unit/infraTeardown.spec.ts +77 -0
  404. package/tests/unit/logging/logger.spec.ts +50 -0
  405. package/tests/unit/loop/conversationLoop.spec.ts +719 -0
  406. package/tests/unit/loop/phaseSummarizer.spec.ts +169 -0
  407. package/tests/unit/loop/streamingMarkdown.spec.ts +180 -0
  408. package/tests/unit/mcp/mcpManager.spec.ts +336 -0
  409. package/tests/unit/mcp/mcpTransport.spec.ts +689 -0
  410. package/tests/unit/mcp/retryPolicy.spec.ts +278 -0
  411. package/tests/unit/mcp/timeoutValidation.spec.ts +55 -0
  412. package/tests/unit/mcp/webSearch.spec.ts +718 -0
  413. package/tests/unit/phases/contextSummarizer.spec.ts +158 -0
  414. package/tests/unit/phases/discoveryEnricher.repeatCalls.spec.ts +125 -0
  415. package/tests/unit/phases/discoveryEnricher.spec.ts +512 -0
  416. package/tests/unit/phases/phaseExtractors.spec.ts +406 -0
  417. package/tests/unit/phases/phaseHandlers.spec.ts +483 -0
  418. package/tests/unit/prompts/promptLoader.spec.ts +144 -0
  419. package/tests/unit/schemas/pocSchemas.spec.ts +457 -0
  420. package/tests/unit/schemas/session.spec.ts +328 -0
  421. package/tests/unit/sessions/exportPaths.spec.ts +38 -0
  422. package/tests/unit/sessions/exportWriter.spec.ts +737 -0
  423. package/tests/unit/sessions/sessionManager.spec.ts +174 -0
  424. package/tests/unit/sessions/sessionStore.spec.ts +136 -0
  425. package/tests/unit/shared/activitySpinner.spec.ts +211 -0
  426. package/tests/unit/shared/cardsLoader.spec.ts +89 -0
  427. package/tests/unit/shared/copilotClient.spec.ts +185 -0
  428. package/tests/unit/shared/errorClassifier.spec.ts +152 -0
  429. package/tests/unit/shared/events.spec.ts +71 -0
  430. package/tests/unit/shared/markdownRenderer.spec.ts +42 -0
  431. package/tests/unit/shared/markdownRendererChunks.spec.ts +83 -0
  432. package/tests/unit/shared/tableRenderer.spec.ts +38 -0
  433. package/tsconfig.json +20 -0
  434. package/vitest.config.ts +15 -0
  435. package/vitest.live.config.ts +19 -0
@@ -0,0 +1,240 @@
1
+ # Feature Specification: sofIA Unified Build-From-Scratch CLI
2
+
3
+ **Feature Branch**: `001-cli-workshop-rebuild`
4
+ **Created**: 2026-02-26
5
+ **Status**: Draft
6
+ **Input**: Unified build-from-scratch specification (workshop orchestration + PoC intent capture; PoC generation in feature `002-poc-generation`)
7
+
8
+ ## Clarifications
9
+
10
+ ### Session 2026-02-26
11
+
12
+ - Q: Where should sessions be persisted by default? → A: Inside the repo/workspace (repo-local state).
13
+ - Q: What persistence format should the repo-local session store use by default? → A: Single JSON file per session.
14
+ - Q: If GitHub MCP is unavailable during Develop, what should happen in interactive mode? → A: The PoC generation feature (002-poc-generation) MUST fall back to local scaffolding that creates a PoC repository structure in the workspace and clearly marks the output as locally generated; this feature (001) is responsible for capturing PoC intent and surfacing status.
15
+ - Q: What is the default Export output format/location? → A: Write a folder to `./exports/<sessionId>/` containing Markdown artifacts + a `summary.json`.
16
+ - Q: When should the session be persisted? → A: After every user input (each turn).
17
+
18
+ ### Session 2026-02-27
19
+
20
+ - Q: How should the session name be populated? → A: LLM auto-generates a short name after the first Discover exchange based on the business context, without requiring user confirmation.
21
+ - Q: How should the CLI behave when invoked with no subcommand? → A: Running `sofia` with no args starts the workshop flow (main menu: New/Resume/Status/Export). Workshop options (`--new-session`, `--phase`, `--retry`) promoted to top level. `sofia workshop` kept as alias. `status` and `export` remain explicit subcommands. `--help` shows all options at the top level.
22
+ - Q: What should the auto-start greeting include when starting a new session? → A: LLM briefly introduces the current phase purpose and immediately asks the first question (concise, action-oriented). On resume, provides a summary of progress so far and asks the next question.
23
+ - Q: What is the acceptable timeout for the initial auto-start LLM greeting? → A: 10 seconds. If no first token arrives within 10s, treat as a transient failure and apply retry logic.
24
+ - Q: How should the session name be extracted from the LLM response? → A: LLM includes `sessionName` in the structured JSON block (same extraction path as businessContext). Deterministic, testable, consistent with existing extractors.
25
+ - Q: How should streaming LLM markdown be rendered? → A: Render markdown incrementally during streaming using marked + marked-terminal, accepting minor rendering artifacts on partial chunks (headings, tables).
26
+ - Q: What visual feedback should users see during internal operations (LLM wait, tool calls)? → A: Spinner with contextual status text that updates in-place per operation (e.g., "⠋ Calling WorkIQ...", "⠋ Searching docs...") and clears when the operation completes.
27
+ - Q: What should users see about tool call results? → A: By default, a one-line summary after each tool completes (tool name + brief result, e.g., "✓ WorkIQ: Found 12 relevant processes"). With `--debug`, also show full tool arguments and result details inline.
28
+ - Q: Should the user see a "thinking" indicator during silent gaps? → A: Yes. Show a "Thinking..." spinner during all silent gaps: after user input before first token, and after tool results before next text output.
29
+ - Q: Should `--verbose` be a new flag or reuse `--debug`? → A: Reuse `--debug`. When `--debug` is set, also show verbose tool output inline (tool arguments and full result details). No new `--verbose` flag.
30
+
31
+ ## User Scenarios & Testing *(mandatory)*
32
+
33
+ ### User Story 1 - Run a new governed workshop session (Priority: P1)
34
+
35
+ As a facilitator, I want to start a new session and complete the full workshop flow end-to-end with explicit decision gates, so that I can produce customer-ready artifacts and a PoC repository without losing progress.
36
+
37
+ **Why this priority**: This is the primary product outcome (end-to-end workshop completion).
38
+
39
+ **Independent Test**: Can be tested by running the CLI in a deterministic harness that simulates a full interactive session and verifies that each phase produces artifacts and requires an explicit decision before continuing.
40
+
41
+ **Acceptance Scenarios**:
42
+
43
+ 1. **Given** a clean environment with required integrations available, **When** the user selects New Session and completes each phase, **Then** the CLI produces phase artifacts and requires an explicit post-phase decision each time.
44
+ 2. **Given** the user completes a phase, **When** the user chooses Exit at the decision gate, **Then** the session is persisted and can be resumed later without data loss.
45
+
46
+ ---
47
+
48
+ ### User Story 2 - Resume, backtrack, and export a session (Priority: P2)
49
+
50
+ As a facilitator, I want to resume a prior session, step back to earlier phases, and export artifacts, so that I can recover from interruptions and iterate safely.
51
+
52
+ **Why this priority**: Resilience and recoverability are non-negotiable for real workshops.
53
+
54
+ **Independent Test**: Can be tested by creating a session, persisting it mid-way, resuming, backtracking to an earlier phase, and verifying deterministic invalidation/regeneration of downstream artifacts.
55
+
56
+ **Acceptance Scenarios**:
57
+
58
+ 1. **Given** a persisted session, **When** the user selects Resume Session from the main menu, **Then** the CLI continues from the last committed state.
59
+ 2. **Given** completed downstream phases exist, **When** the user backtracks to an earlier phase and confirms regeneration, **Then** downstream artifacts are invalidated and re-derived without corrupting the session.
60
+ 3. **Given** a session with artifacts, **When** the user selects Export, **Then** the CLI produces a customer-ready artifact bundle for the workshop outputs.
61
+
62
+ ---
63
+
64
+ ### User Story 3 - Continue a session via direct command mode (Priority: P3)
65
+
66
+ As an operator or automation pipeline, I want to continue a session non-interactively where possible, so that the system can be scripted while remaining safe in non-TTY environments.
67
+
68
+ **Why this priority**: Supports automation and operational use; also forces clean separation of interactive vs machine-readable output.
69
+
70
+ **Independent Test**: Can be tested by running the CLI with a session id in a non-TTY harness and verifying non-zero exits and machine-readable JSON output behavior.
71
+
72
+ **Acceptance Scenarios**:
73
+
74
+ 1. **Given** a valid session id, **When** the CLI is invoked with that session id in a TTY, **Then** it prompts for missing inputs interactively.
75
+ 2. **Given** required inputs are missing, **When** invoked in non-TTY mode, **Then** it fails fast with an actionable error and non-zero exit code.
76
+ 3. **Given** JSON/machine-readable mode is enabled, **When** running in any environment, **Then** stdout remains JSON-only and human telemetry is not mixed into stdout.
77
+
78
+ ---
79
+
80
+ ### Edge Cases
81
+
82
+ - WorkIQ is unavailable or not configured.
83
+ - Web research is blocked/unavailable.
84
+ - One or more MCP tools are unavailable, rate-limited, or return timeouts.
85
+ - Ctrl+C occurs during: streaming output, tool execution, user input prompt, or at the decision gate.
86
+ - Session persistence store is read-only, missing, or corrupted.
87
+ - Phase completes but user input indicates “done”, empty input, or Ctrl+D.
88
+ - Recoverable errors should route to a recovery decision flow instead of abrupt termination.
89
+ - Interactive output must never show raw SDK JSON events.
90
+
91
+ ## Requirements *(mandatory)*
92
+
93
+ ### Functional Requirements
94
+
95
+ **Scope & Outcomes**
96
+
97
+ - **FR-001**: System MUST support a full end-to-end workshop flow for Discover → Ideate → Design → Select → Plan, and MUST capture PoC requirements for a subsequent Develop feature.
98
+ - **FR-002**: System MUST produce customer-ready workshop artifacts as primary outputs, and MUST record sufficient PoC intent/requirements for an external PoC generator.
99
+ - **FR-003**: System MUST be resilient and recoverable: failures must not require restarting the app or losing session state.
100
+
101
+ **User Modes & CLI UX**
102
+
103
+ - **FR-004**: System MUST provide interactive mode with a main menu containing: New Session, Resume Session, Status, Export. Running `sofia` with no subcommand MUST start the workshop flow (default command). Workshop-specific options (`--new-session`, `--phase`, `--retry`) MUST be available at the top level. `sofia workshop` MUST be kept as an alias. `--help` MUST show all workshop options at the top level.
104
+ - **FR-005**: System MUST provide direct command mode that continues a session by id.
105
+ - **FR-006**: In direct command mode with TTY available, system MUST prompt for missing required inputs.
106
+ - **FR-007**: In direct command mode without TTY, system MUST fail fast with a non-zero exit and an actionable error when required inputs are missing.
107
+ - **FR-008**: System MUST support explicit completion inputs: `done`, empty input, and Ctrl+D.
108
+
109
+ **Conversation Model (Authoritative)**
110
+
111
+ - **FR-009**: System MUST stream responses incrementally (no full-buffer blocking output).
112
+ - **FR-009a**: In TTY mode, streamed LLM text MUST be rendered as formatted markdown incrementally (using `marked` + `marked-terminal`) rather than written as raw text. Minor rendering artifacts from partial markdown chunks are acceptable for responsiveness. In non-TTY/JSON mode, raw markdown is preserved without ANSI rendering.
113
+ - **FR-010**: System MUST preserve turn history for each phase and persist turns in session state.
114
+ - **FR-011**: System MUST support multi-turn conversations per phase.
115
+ - **FR-012**: System MUST support agent-driven prompts to the user (ask-user style prompts) via the SDK handler.
116
+ - **FR-013**: System MUST extract and render human-readable content from SDK events; raw event JSON MUST NOT be rendered to users.
117
+ - **FR-014**: System MUST gracefully handle Ctrl+C in all execution states.
118
+ - **FR-015**: System MUST implement a single conversation orchestration abstraction (ConversationLoop or equivalent) and MUST NOT introduce duplicate inline multi-turn loops.
119
+ - **FR-015a**: When a conversation phase starts (new or resumed), the ConversationLoop MUST send an initial auto-start message to the LLM before waiting for user input. For new sessions, the LLM MUST briefly introduce the current phase purpose and ask the first question. For resumed sessions, the LLM MUST summarize progress so far and ask the next question. The user MUST NOT be required to speak first. If no first token arrives within 10 seconds, the system MUST treat this as a transient failure and apply retry logic.
120
+
121
+ **Governed Progression & Decision Gates**
122
+
123
+ - **FR-016**: After each successful phase in interactive mode, system MUST show a phase summary and require an explicit decision.
124
+ - **FR-017**: Interactive post-phase decisions MUST include: continue to next phase, refine current phase, choose another phase, return to main menu, exit.
125
+ - **FR-018**: System MUST NOT auto-advance phases in interactive mode.
126
+
127
+ **Discover Phase**
128
+
129
+ - **FR-019**: Discover MUST collect business context conversationally.
130
+ - **FR-020**: Discover MUST use WorkIQ when available to enrich and validate business context.
131
+ - **FR-021**: Discover MUST use web research to better understand the company and context when possible.
132
+ - **FR-022**: Discover MUST degrade gracefully to conversational + web research when WorkIQ is unavailable.
133
+ - **FR-023**: Discover MUST enter interview mode when `businessContext` is empty.
134
+ - **FR-023a**: After the first Discover exchange that yields a `businessContext`, the system MUST auto-generate a short session `name` from the LLM response and persist it without requiring user confirmation. The LLM system prompt MUST instruct the model to include a `sessionName` field in the structured JSON output alongside `businessContext`. The extractor MUST parse it from the same JSON block.
135
+
136
+ **Ideate Phase**
137
+
138
+ - **FR-024**: Ideate MUST use the AI Discovery Cards dataset to support ideation.
139
+ - **FR-025**: Ideate MUST map cards to the customer journey/workflow.
140
+ - **FR-026**: Ideate MUST produce a ranked list of candidate ideas.
141
+ - **FR-027**: Ideate MUST ask clarifying questions when context quality is insufficient.
142
+ - **FR-028**: Cards selection MUST be presented to the user.
143
+
144
+ **Design Phase**
145
+
146
+ - **FR-029**: Design MUST generate Idea Cards for top ideas including: problem/solution framing, data requirements, architecture sketch, and Azure/Microsoft mapping.
147
+ - **FR-030**: Architecture sketch output MUST be represented as a Mermaid diagram.
148
+ - **FR-031**: Design MUST ground feasibility and recommendations via documentation retrieval tools (Context7 + Microsoft Learn) when available.
149
+
150
+ **Select Phase**
151
+
152
+ - **FR-032**: Select MUST evaluate ideas using the BXT Framework (Business, eXperience, Technical).
153
+ - **FR-033**: Select MUST assign scores, rationale, and a classification to each evaluated idea.
154
+ - **FR-034**: Select MUST recommend one primary idea with audit-ready justification.
155
+
156
+ **Plan Phase**
157
+
158
+ - **FR-035**: Plan MUST produce an implementation roadmap including milestones, dependencies, risks, success metrics, and a high-level timeline.
159
+
160
+ **Develop Phase (boundary in this feature)**
161
+
162
+ - **FR-036**: This feature MUST capture PoC-related requirements and intent (e.g., target stack, key scenarios, constraints) into session state, suitable for consumption by a separate PoC generation feature.
163
+ - **FR-036a**: Detailed behavior for generating a PoC repository (GitHub MCP vs local scaffolding), repo layout, and Ralph loop refinement is out of scope for this feature and is defined in feature 002-poc-generation.
164
+ - **FR-037**: This feature MUST expose enough structured data in the poc-related fields of the session model for downstream tools (including feature 002) to generate a PoC repository and report status back.
165
+ - **FR-038**: This feature MUST record user-visible summaries of any PoC discussions/decisions so that Develop-phase implementation details in feature 002 can be audited against the captured intent.
166
+
167
+ **Session, Persistence, Backtracking**
168
+
169
+ - **FR-039**: System MUST persist complete workshop state (phase artifacts + turn history) as a single JSON file per session in a repo-local state directory (default: `./.sofia/sessions/<sessionId>.json`).
170
+ - **FR-039a**: System MUST persist the session after every user input/turn (including empty input / explicit completion signals), without advancing phases on a failed persistence write.
171
+ - **FR-040**: System MUST resume from the last committed state safely.
172
+ - **FR-041**: System MUST support stepping back to an earlier phase and MUST invalidate downstream artifacts deterministically.
173
+ - **FR-042**: Failed phases MUST NOT corrupt or advance session state.
174
+
175
+ **Telemetry, Logs, and Output Separation**
176
+
177
+ - **FR-043**: System MUST show operational telemetry (tool/progress) in a dedicated activity stream during interactive execution.
178
+ - **FR-043a**: In TTY interactive mode, system MUST display a spinner (using `ora` or equivalent) with contextual status text during waiting periods: waiting for LLM first token, executing MCP tool calls, and processing internal operations. The spinner text MUST update in-place to reflect the current operation (e.g., "⠋ Calling WorkIQ...", "⠋ Searching documentation..."). The spinner MUST clear when the operation completes and output resumes. Spinners MUST NOT appear in non-TTY or JSON mode.
179
+ - **FR-043b**: After each tool call completes, system MUST display a one-line summary showing the tool name and a brief result description (e.g., "✓ WorkIQ: Found 12 relevant processes", "✓ Web search: 3 results for 'Contoso logistics'"). These summaries MUST remain visible in the output stream. When `--debug` is specified, system MUST additionally show the tool arguments and full result details (multi-line) inline. In non-TTY/JSON mode, tool summaries MUST be omitted from stdout (written to stderr or debug log only).
180
+ - **FR-043c**: In TTY interactive mode, system MUST display a "Thinking..." spinner during all silent gaps where the LLM is processing but no text or tool events are being emitted. This includes: (1) after user input is submitted and before the first text token arrives, (2) after tool results are returned and before the next text output begins, and (3) during any internal reasoning delay. The "Thinking..." spinner MUST be replaced by the tool-specific spinner (FR-043a) when a tool call begins, and MUST clear when text streaming starts. In non-TTY/JSON mode, no thinking indicator is shown.
181
+ - **FR-044**: In JSON/non-interactive scenarios, system MUST keep stdout machine-readable and MUST NOT interleave telemetry into stdout.
182
+ - **FR-045**: System MUST persist a detailed debug log to a separate file by default, and MUST allow disabling logs via parameter.
183
+
184
+ **Export**
185
+
186
+ - **FR-045a**: System MUST support exporting workshop artifacts from a session.
187
+ - **FR-045b**: Default export output MUST be a repo-local folder at `./exports/<sessionId>/`.
188
+ - **FR-045c**: Export output MUST include customer-readable Markdown artifacts for each phase and a machine-readable `summary.json` that references the exported files.
189
+
190
+ **Error Handling & Recovery**
191
+
192
+ - **FR-046**: System MUST preserve original underlying error messages end-to-end.
193
+ - **FR-047**: System MUST classify errors centrally (auth, connection, MCP, timeout, unknown) and include actionable suggestions.
194
+ - **FR-048**: Interactive failures MUST return the user to a recovery decision flow.
195
+ - **FR-049**: Non-interactive failures MUST exit non-zero with a clear message.
196
+ - **FR-050**: System MUST support a retry flag for direct commands (e.g., `--retry <N>`), applied to transient failures.
197
+ - **FR-051**: System MUST perform pre-flight checks for Copilot connectivity and phase-critical MCP readiness.
198
+
199
+ **MCP & External Dependencies**
200
+
201
+ - **FR-052**: System MUST use Copilot SDK as the primary orchestration runtime.
202
+ - **FR-053**: System MUST integrate with: WorkIQ (Discover), Context7 (Design), Microsoft Learn (Design/Plan), GitHub MCP (Develop).
203
+ - **FR-054**: System MUST prefer MCP-first calls when a tool exists and MUST justify each tool call by phase purpose.
204
+ - **FR-055**: System MUST respect least-privilege and tenant boundaries.
205
+ - **FR-056**: System MUST degrade gracefully when tools are unavailable.
206
+
207
+ **Warnings & Anti-Patterns (Prohibited Behaviors)**
208
+
209
+ - **FR-057**: System MUST NOT implement behavior before writing failing tests for that behavior.
210
+ - **FR-058**: System MUST NOT render raw SDK response JSON to end users.
211
+ - **FR-059**: System MUST NOT silently swallow actionable errors with generic messages.
212
+ - **FR-060**: System MUST NOT perform implicit phase transitions in interactive mode.
213
+ - **FR-061**: System MUST NOT run multiple competing follow-up loops in the same execution path.
214
+ - **FR-062**: System MUST NOT mix activity telemetry into JSON stdout payloads.
215
+
216
+ ### Key Entities *(include if feature involves data)*
217
+
218
+ - **WorkshopSession**: id, name (auto-generated after first Discover exchange), currentPhase, completedPhases, businessContext, journeyMap, ideas, bxtEvaluations, selectedIdeaId, plan, poc (PocDevelopmentState), turns, timestamps.
219
+ - **ConversationTurn**: phase, sequence, role, content, timestamp, metadata.
220
+ - **IdeaCard**: title, summary, mappedJourneySteps, dataRequirements, architecture, services, risks.
221
+ - **BxtEvaluation**: businessScore, experienceScore, technicalScore, rationale, classification.
222
+ - **PocDevelopmentState**: repoPath, iterations, finalStatus (detailed behavior defined in feature `002-poc-generation`).
223
+
224
+ ## Success Criteria *(mandatory)*
225
+
226
+ ### Measurable Outcomes
227
+
228
+ - **SC-001**: Users can complete a guided workshop from Discover through Plan with explicit decision control after each phase, and PoC intent is captured for a subsequent Develop feature.
229
+ - **SC-002**: Interactive failures recover to a user decision flow without requiring restarting the application.
230
+ - **SC-003**: No raw SDK JSON appears in normal user output across interactive and JSON modes.
231
+ - **SC-004**: The system persists session state such that a session can be resumed after exit without losing phase artifacts or turn history.
232
+ - **SC-005**: First visible token for streamed phase output appears within 3 seconds in a properly configured environment.
233
+ - **SC-006**: PoC-related requirements (intent, target stack, key scenarios, constraints) are successfully captured in a high percentage of properly configured runs (target threshold defined in planning); concrete PoC repository generation success is measured in feature `002-poc-generation`.
234
+ - **SC-007**: The interactive harness validates at least one happy-path run and one failure/recovery run and catches regressions prior to release.
235
+
236
+ ## Open Validation Items
237
+
238
+ - Confirm specific Copilot SDK streaming and multi-turn APIs used in runtime implementation.
239
+ - Confirm the ask-user path (SDK-native handler vs custom wrapper) in final architecture docs.
240
+ - Confirm MCP availability matrix per environment and defined fallback behavior.