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,113 @@
1
+ # Contract: Ralph Loop Iteration
2
+
3
+ Defines the interface contract for the Ralph loop — the autonomous code-generation-test-refine cycle that powers the Develop phase.
4
+
5
+ ## RalphLoop interface
6
+
7
+ ```typescript
8
+ interface RalphLoopOptions {
9
+ /** CopilotClient for LLM interactions. */
10
+ client: CopilotClient;
11
+ /** IO for user-visible output (spinner, activity, streaming text). */
12
+ io: LoopIO;
13
+ /** The workshop session with selection and plan populated. */
14
+ session: WorkshopSession;
15
+ /** Activity spinner for visual feedback. */
16
+ spinner?: ActivitySpinner;
17
+ /** Maximum iterations before forced termination (default: 10). */
18
+ maxIterations?: number;
19
+ /** Working directory for the PoC (default: ./poc/<sessionId>/). */
20
+ outputDir?: string;
21
+ /** Callback for session persistence after each iteration. */
22
+ onSessionUpdate?: (session: WorkshopSession) => Promise<void>;
23
+ /** Event listener for telemetry. */
24
+ onEvent?: (event: SofiaEvent) => void;
25
+ }
26
+
27
+ interface RalphLoopResult {
28
+ /** Updated session with poc state filled in. */
29
+ session: WorkshopSession;
30
+ /** Final status of the loop. */
31
+ finalStatus: 'success' | 'failed' | 'partial';
32
+ /** Why the loop stopped. */
33
+ terminationReason: 'tests-passing' | 'max-iterations' | 'user-stopped' | 'error';
34
+ /** Total iterations executed. */
35
+ iterationsCompleted: number;
36
+ }
37
+ ```
38
+
39
+ ## Loop lifecycle
40
+
41
+ ```
42
+ 1. Validate session (selection + plan present)
43
+ 2. Scaffold PoC (iteration 1 / outcome: "scaffold")
44
+ └─ Create project structure, README, package.json, initial tests
45
+ 3. Install dependencies (npm install in outputDir)
46
+ 4. For iteration = 2..maxIterations:
47
+ a. Run tests
48
+ b. If all pass → terminate (tests-passing)
49
+ c. Parse test failures
50
+ d. Build LLM prompt with: plan context + current code + test failures
51
+ e. Send to LLM via ConversationLoop (auto-completing, single turn)
52
+ f. Apply generated code changes to filesystem
53
+ g. If new dependencies added to package.json → re-run npm install
54
+ h. Persist iteration to session
55
+ i. Check user abort (Ctrl+C) → terminate (user-stopped)
56
+ 5. If maxIterations reached → terminate (max-iterations)
57
+ ```
58
+
59
+ > **Note**: Scaffold is always iteration 1 (`outcome: "scaffold"`). LLM-driven refinement
60
+ > iterations start at 2. This aligns with the data model where `PocIteration.iteration`
61
+ > is 1-indexed and the first entry always has `outcome: "scaffold"`.
62
+
63
+ ## Iteration prompt contract
64
+
65
+ Each iteration sends the LLM a message containing:
66
+
67
+ ```
68
+ ## Current State
69
+ - Iteration: {N} of {max}
70
+ - Previous outcome: {tests-passing | tests-failing | scaffold}
71
+
72
+ ## Test Results
73
+ - Passed: {N}, Failed: {N}, Skipped: {N}
74
+ - Failures:
75
+ 1. {testName}: {message} (at {file}:{line})
76
+ ...
77
+
78
+ ## Files in PoC
79
+ {tree listing of current files}
80
+
81
+ ## Task
82
+ Fix the failing tests. Respond with the complete updated file contents
83
+ for each file you need to modify, using fenced code blocks with file paths.
84
+ ```
85
+
86
+ ## Code change format
87
+
88
+ The LLM must respond with fenced code blocks that include the file path:
89
+
90
+ ````
91
+ ```typescript file=src/index.ts
92
+ // complete file content
93
+ ```
94
+ ````
95
+
96
+ The code generator parses these blocks and writes them to disk.
97
+
98
+ ## Termination conditions
99
+
100
+ | Condition | `finalStatus` | `terminationReason` |
101
+ |-----------|--------------|---------------------|
102
+ | All tests pass | `success` | `tests-passing` |
103
+ | Max iterations reached, some tests pass | `partial` | `max-iterations` |
104
+ | Max iterations reached, no tests pass | `failed` | `max-iterations` |
105
+ | User presses Ctrl+C | session preserved as-is | `user-stopped` |
106
+ | Unrecoverable error (LLM timeout, disk error) | `failed` | `error` |
107
+
108
+ ## Error handling
109
+
110
+ - **LLM timeout**: Log the error, record iteration as `outcome: "error"`, continue to next iteration if retries remain.
111
+ - **Test runner timeout (60s)**: Record as `outcome: "error"` with `errorMessage`, feed timeout info to next iteration.
112
+ - **Filesystem error**: Fail fast with clear error, preserve session state.
113
+ - **Missing session data**: Fail fast before scaffolding with guidance to run Plan phase first.
@@ -0,0 +1,172 @@
1
+ # Data Model: PoC Generation & Ralph Loop
2
+
3
+ **Feature**: [spec.md](spec.md)
4
+ **Research**: [research.md](research.md)
5
+ **Date**: 2026-02-27
6
+
7
+ This document defines the entities introduced or extended by Feature 002. It builds on the Feature 001 data model and extends `PocDevelopmentState` and `PocIteration` with the fields needed for the Ralph loop.
8
+
9
+ ## Entities Modified
10
+
11
+ ### PocDevelopmentState (extended from 001)
12
+
13
+ Extends the entity defined in Feature 001's [data-model.md](../001-cli-workshop-rebuild/data-model.md) §13.
14
+
15
+ **Fields**
16
+
17
+ - `repoPath?: string` — local path to generated PoC directory (e.g., `./poc/<sessionId>/`)
18
+ - `repoUrl?: string` — GitHub URL if created via MCP
19
+ - `repoSource: "local" | "github-mcp"` — how the repo was created
20
+ - `techStack?: TechStack` — technology choices for the PoC
21
+ - `iterations: PocIteration[]` — iteration history (extended, see below)
22
+ - `finalStatus?: "success" | "failed" | "partial"` — extended with "partial" for max-iteration with some passing tests
23
+ - `terminationReason?: "tests-passing" | "max-iterations" | "user-stopped" | "error"` — why the loop ended
24
+ - `totalDurationMs?: number` — total wall-clock time for all iterations
25
+ - `finalTestResults?: TestResults` — test state at loop termination
26
+
27
+ **Validation rules**
28
+
29
+ - `repoPath` OR `repoUrl` must be set after first successful scaffold.
30
+ - `repoSource` is required once scaffolding completes.
31
+ - `finalStatus` is set only when the Ralph loop terminates.
32
+ - `terminationReason` is set alongside `finalStatus`.
33
+ - `iterations` must be ordered by `iteration` (1-indexed, monotonically increasing).
34
+
35
+ ### PocIteration (extended from 001)
36
+
37
+ Extends the entity defined in Feature 001's [data-model.md](../001-cli-workshop-rebuild/data-model.md) §13.
38
+
39
+ **Fields**
40
+
41
+ - `iteration: number` — 1-indexed iteration counter
42
+ - `startedAt: string` — ISO-8601 timestamp
43
+ - `endedAt?: string` — ISO-8601 timestamp
44
+ - `outcome: "tests-passing" | "tests-failing" | "error" | "scaffold"` — what happened this iteration
45
+ - `changesSummary?: string` — human-readable description of what changed
46
+ - `filesChanged: string[]` — list of file paths created/modified in this iteration
47
+ - `testResults?: TestResults` — structured test execution results
48
+ - `errorMessage?: string` — error message if iteration failed with an error
49
+ - `llmPromptContext?: string` — summary of context sent to LLM (for auditability, not full prompt)
50
+
51
+ **Validation rules**
52
+
53
+ - `iteration` starts at 1, increments by 1.
54
+ - First iteration always has `outcome: "scaffold"`.
55
+ - `filesChanged` must be relative paths within the PoC directory.
56
+ - `testResults` is present when `outcome` is `"tests-passing"` or `"tests-failing"`.
57
+
58
+ ## Entities Introduced
59
+
60
+ ### TechStack
61
+
62
+ Captures the technology choices for the generated PoC. Determined during scaffolding from the session's `plan.architectureNotes` and `plan.dependencies`.
63
+
64
+ **Fields**
65
+
66
+ - `language: string` — primary language (e.g., "TypeScript", "Python")
67
+ - `framework?: string` — web framework or runtime (e.g., "Express", "FastAPI")
68
+ - `testRunner: string` — test runner command (e.g., "npm test", "pytest")
69
+ - `buildCommand?: string` — build command if applicable (e.g., "npm run build")
70
+ - `runtime: string` — runtime environment (e.g., "Node.js 20", "Python 3.11")
71
+
72
+ **Validation rules**
73
+
74
+ - `language` and `runtime` are required.
75
+ - `testRunner` is required — the Ralph loop cannot proceed without it.
76
+
77
+ ### TestResults
78
+
79
+ Structured output from running the PoC's test suite.
80
+
81
+ **Fields**
82
+
83
+ - `passed: number` — count of passing tests
84
+ - `failed: number` — count of failing tests
85
+ - `skipped: number` — count of skipped tests
86
+ - `total: number` — total test count
87
+ - `durationMs: number` — test execution time
88
+ - `failures: TestFailure[]` — details of each failure (max 10 to avoid prompt bloat)
89
+ - `rawOutput?: string` — truncated raw test runner output (max 2000 chars)
90
+
91
+ **Validation rules**
92
+
93
+ - `total === passed + failed + skipped`.
94
+ - `failures.length <= failed` (may be truncated).
95
+ - `rawOutput` is truncated to 2000 characters from the end (tail).
96
+
97
+ ### TestFailure
98
+
99
+ Individual test failure detail, fed back to the LLM as context for the next iteration.
100
+
101
+ **Fields**
102
+
103
+ - `testName: string` — name/path of the failing test
104
+ - `message: string` — assertion error or exception message
105
+ - `expected?: string` — expected value (if assertion failure)
106
+ - `actual?: string` — actual value (if assertion failure)
107
+ - `file?: string` — test file path
108
+ - `line?: number` — line number of failure
109
+
110
+ ### ScaffoldTemplate
111
+
112
+ Describes a PoC scaffold template. Templates are defined programmatically (no external template files).
113
+
114
+ **Fields**
115
+
116
+ - `id: string` — template identifier (e.g., "node-typescript-express", "python-fastapi")
117
+ - `name: string` — human-readable name
118
+ - `language: string` — primary language
119
+ - `files: TemplateFile[]` — list of files to generate
120
+
121
+ ### TemplateFile
122
+
123
+ A single file in a scaffold template.
124
+
125
+ **Fields**
126
+
127
+ - `path: string` — path relative to PoC root
128
+ - `content: string` — file content (may contain `{{placeholder}}` tokens)
129
+ - `skipIfExists: boolean` — whether to skip writing if file already exists (default: true)
130
+
131
+ ## State Machine Extensions
132
+
133
+ The Develop phase now has internal sub-states managed by the Ralph loop:
134
+
135
+ ```
136
+ Develop (entered) → Scaffolding → Iteration 1 → ... → Iteration N → Complete/Failed
137
+ ```
138
+
139
+ Transitions within Develop:
140
+
141
+ - `Scaffolding`: Generate initial PoC project structure → outcome: "scaffold"
142
+ - `Iteration N` (N >= 2): Run tests → feed failures to LLM → generate fixes → outcome: "tests-passing" | "tests-failing" | "error"
143
+ - `Complete`: `finalStatus = "success"` when `terminationReason = "tests-passing"`
144
+ - `Failed`: `finalStatus = "failed"` when `terminationReason = "max-iterations" | "error"`
145
+ - `Partial`: `finalStatus = "partial"` when some tests pass but loop hit max iterations
146
+
147
+ ## Relationships
148
+
149
+ ```
150
+ WorkshopSession
151
+ ├── selection: SelectedIdea ← Input (from Feature 001)
152
+ ├── plan: ImplementationPlan ← Input (from Feature 001)
153
+ └── poc: PocDevelopmentState ← Output (Feature 002)
154
+ ├── techStack: TechStack
155
+ ├── iterations[]: PocIteration
156
+ │ ├── testResults?: TestResults
157
+ │ │ └── failures[]: TestFailure
158
+ │ └── filesChanged[]
159
+ ├── finalTestResults?: TestResults
160
+ └── terminationReason
161
+ ```
162
+
163
+ ## Export Extensions
164
+
165
+ The Develop section of `exports/<sessionId>/develop.md` should include:
166
+
167
+ - PoC repository location (path or URL)
168
+ - Technology stack summary
169
+ - Iteration timeline with outcomes
170
+ - Final test results
171
+ - Files generated/modified per iteration
172
+ - Termination reason
@@ -0,0 +1,109 @@
1
+ # Implementation Plan: PoC Generation & Ralph Loop
2
+
3
+ **Branch**: `002-poc-generation` | **Date**: 2026-02-27 | **Spec**: [specs/002-poc-generation/spec.md](spec.md)
4
+ **Input**: Feature specification from `/specs/002-poc-generation/spec.md`
5
+
6
+ **Note**: This plan was generated by the `/speckit.plan` command.
7
+
8
+ ## Summary
9
+
10
+ Implement the **Develop** phase for sofIA: transform a completed workshop session (with `selection` and `plan` data from Feature 001) into a working proof-of-concept repository. The implementation uses a **Ralph loop** — an autonomous, iterative code-generation cycle where the LLM generates code, tests are executed, failures are fed back as context, and the LLM refines until tests pass or a max-iteration limit is reached. Supports both GitHub MCP–based repo creation and local-filesystem fallback.
11
+
12
+ ## Technical Context
13
+
14
+ **Language/Version**: Node.js (>=20 LTS) with TypeScript (ES2022 target, ESM)
15
+ **Primary Dependencies**: `@github/copilot-sdk` (LLM orchestration), `commander` (CLI), `ora` (spinner feedback), `marked`/`marked-terminal` (markdown rendering), `pino` (logging), `zod` (schema validation)
16
+ **Storage**: Filesystem — sessions in `.sofia/sessions/<id>.json`, PoC output in `./poc/<sessionId>/` (local) or GitHub repo (MCP)
17
+ **Testing**: Vitest with `@vitest/coverage-v8`; unit, integration, e2e, and live test directories
18
+ **Target Platform**: Linux/macOS CLI (Windows supported via WSL)
19
+ **Project Type**: CLI application (extends existing `sofiacli` binary)
20
+ **Performance Goals**: Complete a single Ralph loop iteration in <120s (LLM timeout); full PoC generation in <10 iterations
21
+ **Constraints**: LLM call timeout at 120s per turn; GitHub MCP may be unavailable; no direct filesystem access on remote repos
22
+ **Scale/Scope**: Single-user CLI, one PoC per session, typical PoC is 5–20 source files
23
+
24
+ ## Constitution Check
25
+
26
+ *GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.*
27
+
28
+ - **Outcome-first discovery**: ✅ PoC generation is the culminating deliverable of the workshop — directly tied to the user's selected AI idea and business goals.
29
+ - **Secure-by-default**: ✅ No secrets in logs/prompts; PoC scaffolds use secure defaults; GitHub MCP requests respect organization policies.
30
+ - **Node.js + TypeScript**: ✅ Extends the existing sofIA CLI codebase with the same stack.
31
+ - **MCP-first**: ✅ GitHub MCP for repo creation when available; Context7 for library documentation; Microsoft Docs/Azure MCP for cloud guidance; web.search for implementation research; local fallback is explicit and auditable.
32
+ - **Test-first (NON-NEGOTIABLE)**: ✅ Ralph loop is inherently test-driven — each iteration starts from a failing test. Implementation follows Red → Green → Review.
33
+ - **CLI transparency**: ✅ Spinner shows iteration progress; streaming output during code generation; clear failure messages with recovery options.
34
+
35
+ ## Project Structure
36
+
37
+ ### Documentation (this feature)
38
+
39
+ ```text
40
+ specs/002-poc-generation/
41
+ ├── plan.md # This file
42
+ ├── research.md # Phase 0 output
43
+ ├── data-model.md # Phase 1 output
44
+ ├── quickstart.md # Phase 1 output
45
+ ├── contracts/ # Phase 1 output
46
+ │ ├── ralph-loop.md # Ralph loop iteration contract
47
+ │ └── poc-output.md # PoC repository output contract
48
+ └── tasks.md # Phase 2 output (created by /speckit.tasks)
49
+ ```
50
+
51
+ ### Source Code (repository root)
52
+
53
+ ```text
54
+ src/
55
+ ├── cli/
56
+ │ ├── developCommand.ts # NEW: `sofia dev` command handler
57
+ │ └── index.ts # MODIFIED: register dev command
58
+ ├── develop/ # NEW: Develop phase module
59
+ │ ├── ralphLoop.ts # Autonomous Ralph loop orchestrator
60
+ │ ├── pocScaffolder.ts # PoC repo scaffold generation
61
+ │ ├── testRunner.ts # Test execution and result parsing
62
+ │ ├── codeGenerator.ts # LLM-driven code generation per iteration
63
+ │ ├── mcpContextEnricher.ts # MCP-driven context enrichment (Context7, Azure MCP, web.search)
64
+ │ └── githubMcpAdapter.ts # GitHub MCP repo creation adapter
65
+ ├── phases/
66
+ │ └── phaseHandlers.ts # MODIFIED: replace boundary handler with real Develop handler
67
+ ├── prompts/
68
+ │ ├── develop.md # NEW: Develop phase system prompt (code generation)
69
+ │ └── develop-boundary.md # EXISTING: requirements capture (kept for backward compat)
70
+ ├── sessions/
71
+ │ └── exportWriter.ts # MODIFIED: enrich Develop export with iteration details
72
+ └── shared/
73
+ └── schemas/
74
+ └── session.ts # MODIFIED: extend PocDevelopmentState with richer fields
75
+
76
+ tests/
77
+ ├── unit/
78
+ │ ├── develop/
79
+ │ │ ├── ralphLoop.spec.ts
80
+ │ │ ├── pocScaffolder.spec.ts
81
+ │ │ ├── testRunner.spec.ts
82
+ │ │ ├── codeGenerator.spec.ts
83
+ │ │ ├── mcpContextEnricher.spec.ts
84
+ │ │ └── githubMcpAdapter.spec.ts
85
+ │ └── cli/
86
+ │ └── developCommand.spec.ts
87
+ ├── integration/
88
+ │ ├── ralphLoopFlow.spec.ts
89
+ │ └── pocGeneration.spec.ts
90
+ └── e2e/
91
+ └── developE2e.spec.ts
92
+ ```
93
+
94
+ **Structure Decision**: Single project, extending the existing `src/` layout. New code lives in `src/develop/` as a cohesive module. The `develop/` directory groups Ralph loop components (orchestrator, scaffolder, test runner, code generator, MCP adapter) as peer modules with clean interfaces.
95
+
96
+ ## Post-Design Constitution Re-Check
97
+
98
+ *All 6 gates re-evaluated after Phase 1 design. No violations.*
99
+
100
+ - **Outcome-first discovery**: ✅ Contracts explicitly link PoC output back to the workshop session and selected idea via `.sofia-metadata.json`.
101
+ - **Secure-by-default**: ✅ Local-first output; GitHub MCP is opt-in; no PII in metadata; scaffold templates use secure TS defaults.
102
+ - **Node.js + TypeScript**: ✅ All contracts specify TypeScript, ESM, Vitest; scaffold generates strict `tsconfig.json`.
103
+ - **MCP-first**: ✅ GitHub MCP for repo creation when available; graceful local fallback with no error; Context7 for PoC dependency docs; Azure MCP for cloud architecture guidance; web.search for stuck-iteration research; no ad-hoc HTTP calls.
104
+ - **Test-first (NON-NEGOTIABLE)**: ✅ Ralph loop contract is inherently test-driven — every iteration starts from test failures. Generated PoCs always include test files.
105
+ - **CLI transparency**: ✅ Spinner/progress during iterations; clear termination reasons; structured error messages with recovery guidance.
106
+
107
+ ## Complexity Tracking
108
+
109
+ No constitution violations — all gates pass (both pre-research and post-design checks).
@@ -0,0 +1,97 @@
1
+ # Quickstart: sofIA PoC Generation (Develop Phase)
2
+
3
+ ## Prerequisites
4
+
5
+ - Node.js 20 LTS
6
+ - npm
7
+ - A completed sofIA workshop session (with Selection and Plan phases done)
8
+
9
+ ## Setup
10
+
11
+ ```bash
12
+ npm install
13
+ ```
14
+
15
+ ## Run PoC generation
16
+
17
+ ```bash
18
+ # Start PoC generation for the most recent session
19
+ npm run start -- dev
20
+
21
+ # Start PoC generation for a specific session
22
+ npm run start -- dev --session <id>
23
+
24
+ # Set max iterations (default: 10)
25
+ npm run start -- dev --session <id> --max-iterations 5
26
+
27
+ # Specify output directory (default: ./poc/<sessionId>/)
28
+ npm run start -- dev --session <id> --output ./my-poc
29
+ ```
30
+
31
+ ## What happens
32
+
33
+ 1. **Validation** — Checks the session has completed the Selection and Plan phases
34
+ 2. **Scaffolding** — Creates a project skeleton in the output directory (package.json, tsconfig.json, README.md, initial src/ and tests/)
35
+ 3. **Ralph Loop** — Iterates autonomously:
36
+ - Runs tests (`vitest run --reporter=json`)
37
+ - If tests pass → done
38
+ - If tests fail → sends failures + current code to LLM → applies fixes → re-runs tests
39
+ 4. **Completion** — Writes `.sofia-metadata.json`, updates session state, reports results
40
+
41
+ ## Output
42
+
43
+ ```
44
+ ./poc/<sessionId>/
45
+ ├── README.md # What the PoC does, how to run it
46
+ ├── package.json # Dependencies, scripts
47
+ ├── tsconfig.json # TypeScript config
48
+ ├── src/ # Generated implementation
49
+ ├── tests/ # Generated tests
50
+ └── .sofia-metadata.json # Session linkage & metadata
51
+ ```
52
+
53
+ ## Run the generated PoC
54
+
55
+ ```bash
56
+ cd ./poc/<sessionId>
57
+ npm install
58
+ npm test # Run the tests
59
+ npm start # Run the PoC
60
+ ```
61
+
62
+ ## Storage
63
+
64
+ - PoC output: `./poc/<sessionId>/` (or custom `--output` path)
65
+ - Session state (updated): `.sofia/sessions/<sessionId>.json`
66
+ - Exports (updated): `./exports/<sessionId>/`
67
+
68
+ ## Testing the Develop module
69
+
70
+ ```bash
71
+ # Unit tests for develop module
72
+ npm test -- tests/unit/develop/
73
+
74
+ # Integration tests (Ralph loop with fakes)
75
+ npm test -- tests/integration/ralphLoop.integration.test.ts
76
+
77
+ # E2E (full PoC generation with real LLM — slow)
78
+ npm test -- tests/e2e/pocGeneration.e2e.test.ts
79
+ ```
80
+
81
+ ## Debug logs
82
+
83
+ ```bash
84
+ npm run start -- dev --session <id> --debug --log-file .sofia/logs/dev.log
85
+ ```
86
+
87
+ ## GitHub MCP integration (optional)
88
+
89
+ When the GitHub MCP server is available, sofIA can create a GitHub repository for the PoC:
90
+
91
+ ```bash
92
+ # PoC generation will auto-detect GitHub MCP availability
93
+ # and prompt before creating a repo
94
+ npm run start -- dev --session <id>
95
+ ```
96
+
97
+ If GitHub MCP is not available, all output stays local — no error, just a different `repoSource` in session state.