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,51 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { z } from '../../vendor/zod';
5
+ const __dirname = dirname(fileURLToPath(import.meta.url));
6
+ // ── Schemas ──────────────────────────────────────────────────────────────────
7
+ const discoveryCardSchema = z.object({
8
+ cardId: z.string(),
9
+ category: z.string(),
10
+ title: z.string(),
11
+ description: z.string(),
12
+ typicalScenarios: z.array(z.string()),
13
+ azureServices: z.array(z.string()),
14
+ optionalCategory: z.string().optional(),
15
+ });
16
+ const cardsDatasetSchema = z.object({
17
+ categories: z.array(z.string()),
18
+ cards: z.array(discoveryCardSchema),
19
+ });
20
+ // ── Loader ───────────────────────────────────────────────────────────────────
21
+ let cachedDataset = null;
22
+ /**
23
+ * Load and validate the AI Discovery Cards dataset.
24
+ * The result is cached after the first load.
25
+ */
26
+ export async function loadCardsDataset() {
27
+ if (cachedDataset)
28
+ return cachedDataset;
29
+ const filePath = join(__dirname, "cards.json");
30
+ const raw = await readFile(filePath, "utf-8");
31
+ const parsed = JSON.parse(raw);
32
+ cachedDataset = cardsDatasetSchema.parse(parsed);
33
+ return cachedDataset;
34
+ }
35
+ /**
36
+ * Get all cards in a specific category.
37
+ */
38
+ export async function getCardsByCategory(category) {
39
+ const dataset = await loadCardsDataset();
40
+ return dataset.cards.filter((c) => c.category === category);
41
+ }
42
+ /**
43
+ * Search cards by keyword in title, description, or typicalScenarios.
44
+ */
45
+ export async function searchCards(query) {
46
+ const dataset = await loadCardsDataset();
47
+ const lowerQuery = query.toLowerCase();
48
+ return dataset.cards.filter((c) => c.title.toLowerCase().includes(lowerQuery) ||
49
+ c.description.toLowerCase().includes(lowerQuery) ||
50
+ c.typicalScenarios.some((s) => s.toLowerCase().includes(lowerQuery)));
51
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Centralized error classifier for sofIA CLI.
3
+ *
4
+ * Maps raw errors to well-defined categories with:
5
+ * - Recovery guidance (is it retryable?)
6
+ * - User-facing messages (no stack traces)
7
+ * - Category-based handling (MCP, auth, network, validation, etc.)
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // Classification
11
+ // ---------------------------------------------------------------------------
12
+ /**
13
+ * Classify any thrown value into a well-defined `ErrorClassification`.
14
+ */
15
+ export function classifyError(err) {
16
+ // Normalise to an Error-like shape
17
+ const error = err instanceof Error
18
+ ? err
19
+ : typeof err === 'string'
20
+ ? new Error(err)
21
+ : new Error(String(err));
22
+ const code = err.code;
23
+ const statusCode = err.statusCode;
24
+ // --- Network / system codes ---
25
+ if (code === 'ECONNREFUSED') {
26
+ return {
27
+ category: 'connection',
28
+ recoverable: true,
29
+ message: error.message,
30
+ originalError: err,
31
+ };
32
+ }
33
+ if (code === 'ENOTFOUND') {
34
+ return {
35
+ category: 'dns',
36
+ recoverable: true,
37
+ message: error.message,
38
+ originalError: err,
39
+ };
40
+ }
41
+ if (code === 'ETIMEDOUT' || code === 'ESOCKETTIMEDOUT') {
42
+ return {
43
+ category: 'timeout',
44
+ recoverable: true,
45
+ message: error.message,
46
+ originalError: err,
47
+ };
48
+ }
49
+ if (code === 'ENOENT') {
50
+ return {
51
+ category: 'not-found',
52
+ recoverable: false,
53
+ message: error.message,
54
+ originalError: err,
55
+ };
56
+ }
57
+ // --- HTTP status codes ---
58
+ if (statusCode === 401 || statusCode === 403) {
59
+ return {
60
+ category: 'auth',
61
+ recoverable: false,
62
+ message: error.message,
63
+ originalError: err,
64
+ };
65
+ }
66
+ if (statusCode === 429) {
67
+ return {
68
+ category: 'rate-limit',
69
+ recoverable: true,
70
+ message: error.message,
71
+ originalError: err,
72
+ };
73
+ }
74
+ // --- Zod / validation errors ---
75
+ if (error.name === 'ZodError' || error.name === 'ZodValidationError') {
76
+ return {
77
+ category: 'validation',
78
+ recoverable: false,
79
+ message: error.message,
80
+ originalError: err,
81
+ };
82
+ }
83
+ // --- MCP server errors (heuristic: message mentions "MCP") ---
84
+ if (/\bmcp\b/i.test(error.message)) {
85
+ return {
86
+ category: 'mcp',
87
+ recoverable: true,
88
+ message: error.message,
89
+ originalError: err,
90
+ };
91
+ }
92
+ // --- Fallback ---
93
+ return {
94
+ category: 'internal',
95
+ recoverable: false,
96
+ message: error.message,
97
+ originalError: err,
98
+ };
99
+ }
100
+ // ---------------------------------------------------------------------------
101
+ // User-facing messages
102
+ // ---------------------------------------------------------------------------
103
+ const USER_MESSAGES = {
104
+ connection: 'Unable to establish a connection. Please check that the service is running and try again.',
105
+ dns: 'DNS lookup failed — verify your network connection and that the hostname is correct.',
106
+ timeout: 'The request timed out. The service may be under heavy load; please try again shortly.',
107
+ auth: 'Authentication failed — please check your credentials or auth token and try again.',
108
+ 'rate-limit': 'Rate limit exceeded. Please wait a moment before retrying.',
109
+ 'not-found': 'The requested resource was not found. Verify the path or identifier and try again.',
110
+ validation: 'Data validation failed. The input or stored data does not match the expected schema.',
111
+ mcp: 'An MCP service encountered an error. It may be temporarily unavailable — retrying might help.',
112
+ internal: 'An unexpected error occurred. If the problem persists, please report it.',
113
+ };
114
+ /**
115
+ * Convert a classification into a safe, user-facing message
116
+ * (never includes stack traces or internal details).
117
+ */
118
+ export function toUserMessage(classification) {
119
+ return USER_MESSAGES[classification.category];
120
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Internal event model for sofia CLI.
3
+ *
4
+ * Adapts Copilot SDK events into a stable internal model for the
5
+ * ConversationLoop, streaming renderer, and telemetry.
6
+ */
7
+ // ── Factory functions ────────────────────────────────────────────────────────
8
+ function now() {
9
+ return new Date().toISOString();
10
+ }
11
+ export function createTextDeltaEvent(text) {
12
+ return { type: 'TextDelta', timestamp: now(), text };
13
+ }
14
+ export function createActivityEvent(message, data) {
15
+ return { type: 'Activity', timestamp: now(), message, data };
16
+ }
17
+ export function createToolCallEvent(toolName, args) {
18
+ return { type: 'ToolCall', timestamp: now(), toolName, args };
19
+ }
20
+ export function createToolResultEvent(toolName, result) {
21
+ return { type: 'ToolResult', timestamp: now(), toolName, result };
22
+ }
23
+ export function createPhaseChangedEvent(fromPhase, toPhase) {
24
+ return { type: 'PhaseChanged', timestamp: now(), fromPhase, toPhase };
25
+ }
26
+ export function createErrorEvent(code, message, details) {
27
+ return { type: 'Error', timestamp: now(), code, message, details };
28
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Markdown rendering helper.
3
+ *
4
+ * Uses marked + marked-terminal for rich TTY output.
5
+ * Falls back to plain text for non-TTY / JSON mode.
6
+ */
7
+ import { Marked } from 'marked';
8
+ import { markedTerminal } from 'marked-terminal';
9
+ // Pre-configured marked instance for TTY rendering.
10
+ // Using a dedicated instance avoids stacking renderers
11
+ // on the global `marked` when renderMarkdown is called repeatedly.
12
+ const ttyMarked = new Marked(markedTerminal());
13
+ const plainMarked = new Marked();
14
+ /**
15
+ * Render markdown to terminal-friendly output.
16
+ *
17
+ * - TTY mode: renders to ANSI-colored output
18
+ * - Non-TTY mode: strips ANSI, returns readable text
19
+ * - JSON mode: returns raw markdown unchanged
20
+ */
21
+ export function renderMarkdown(markdown, options = {}) {
22
+ if (!markdown)
23
+ return '';
24
+ const { isTTY = process.stdout.isTTY ?? false, jsonMode = false } = options;
25
+ // In JSON mode, return raw markdown for machine consumption
26
+ if (jsonMode) {
27
+ return markdown;
28
+ }
29
+ if (isTTY) {
30
+ return ttyMarked.parse(markdown, { async: false });
31
+ }
32
+ // Non-TTY: return plain text (strip markdown syntax minimally)
33
+ return plainMarked.parse(markdown, { async: false });
34
+ }
@@ -0,0 +1,265 @@
1
+ /**
2
+ * Shared Zod schemas for WorkshopSession and related entities.
3
+ *
4
+ * Source of truth: specs/001-cli-workshop-rebuild/data-model.md
5
+ * Contract: specs/001-cli-workshop-rebuild/contracts/session-json.md
6
+ */
7
+ import { z } from '../../vendor/zod.js';
8
+ // ── Enums ────────────────────────────────────────────────────────────────────
9
+ export const Phase = [
10
+ 'Discover',
11
+ 'Ideate',
12
+ 'Design',
13
+ 'Select',
14
+ 'Plan',
15
+ 'Develop',
16
+ 'Complete',
17
+ ];
18
+ export const phaseSchema = z.enum(Phase);
19
+ export const SessionStatus = ['Active', 'Paused', 'Completed', 'Errored'];
20
+ export const sessionStatusSchema = z.enum(SessionStatus);
21
+ // ── Leaf entities ────────────────────────────────────────────────────────────
22
+ export const metricSchema = z.object({
23
+ name: z.string(),
24
+ value: z.string().optional(),
25
+ unit: z.string().optional(),
26
+ });
27
+ export const participantSchema = z.object({
28
+ id: z.string(),
29
+ displayName: z.string(),
30
+ role: z.enum(['Facilitator', 'Attendee', 'Observer']),
31
+ });
32
+ export const businessContextSchema = z.object({
33
+ businessDescription: z.string(),
34
+ challenges: z.array(z.string()),
35
+ constraints: z.array(z.string()).optional(),
36
+ successMetrics: z.array(metricSchema).optional(),
37
+ });
38
+ export const topicSelectionSchema = z.object({
39
+ topicArea: z.string(),
40
+ scopeNotes: z.string().optional(),
41
+ });
42
+ // ── Workflow ─────────────────────────────────────────────────────────────────
43
+ export const workflowStepSchema = z.object({
44
+ id: z.string(),
45
+ name: z.string(),
46
+ description: z.string().optional(),
47
+ metrics: z.array(metricSchema).optional(),
48
+ });
49
+ export const workflowEdgeSchema = z.object({
50
+ fromStepId: z.string(),
51
+ toStepId: z.string(),
52
+ });
53
+ export const workflowMapSchema = z.object({
54
+ activities: z.array(workflowStepSchema),
55
+ edges: z.array(workflowEdgeSchema),
56
+ });
57
+ // ── Cards ────────────────────────────────────────────────────────────────────
58
+ export const envisioningCardSchema = z.object({
59
+ id: z.string(),
60
+ title: z.string(),
61
+ category: z.string().optional(),
62
+ notes: z.string().optional(),
63
+ });
64
+ export const cardScoreSchema = z.object({
65
+ cardId: z.string(),
66
+ dimensions: z.record(z.string(), z.number()),
67
+ });
68
+ export const cardSelectionSchema = z.object({
69
+ selectedCards: z.array(envisioningCardSchema),
70
+ scores: z.array(cardScoreSchema).optional(),
71
+ });
72
+ // ── Ideas ────────────────────────────────────────────────────────────────────
73
+ export const ideaCardSchema = z.object({
74
+ id: z.string(),
75
+ title: z.string(),
76
+ description: z.string(),
77
+ workflowStepIds: z.array(z.string()),
78
+ aspirationalScope: z.string().optional(),
79
+ assumptions: z.array(z.string()).optional(),
80
+ });
81
+ // ── Evaluation ───────────────────────────────────────────────────────────────
82
+ export const ideaEvaluationItemSchema = z.object({
83
+ ideaId: z.string(),
84
+ feasibility: z.number(),
85
+ value: z.number(),
86
+ risks: z.array(z.string()).optional(),
87
+ dataNeeded: z.array(z.string()).optional(),
88
+ humanValue: z.array(z.string()).optional(),
89
+ kpisInfluenced: z.array(z.string()).optional(),
90
+ });
91
+ export const ideaEvaluationSchema = z.object({
92
+ ideas: z.array(ideaEvaluationItemSchema),
93
+ method: z.enum(['feasibility-value-matrix', 'custom']),
94
+ });
95
+ // ── Selection ────────────────────────────────────────────────────────────────
96
+ export const selectedIdeaSchema = z.object({
97
+ ideaId: z.string(),
98
+ selectionRationale: z.string(),
99
+ confirmedByUser: z.boolean(),
100
+ confirmedAt: z.string().optional(),
101
+ });
102
+ // ── Plan ─────────────────────────────────────────────────────────────────────
103
+ export const milestoneSchema = z.object({
104
+ id: z.string(),
105
+ title: z.string(),
106
+ items: z.array(z.string()),
107
+ });
108
+ export const implementationPlanSchema = z.object({
109
+ milestones: z.array(milestoneSchema),
110
+ architectureNotes: z.string().optional(),
111
+ dependencies: z.array(z.string()).optional(),
112
+ });
113
+ // ── PoC ──────────────────────────────────────────────────────────────────────
114
+ // T007: New schemas for TechStack, TestFailure, TestResults
115
+ export const techStackSchema = z.object({
116
+ language: z.string(),
117
+ framework: z.string().optional(),
118
+ testRunner: z.string(),
119
+ buildCommand: z.string().optional(),
120
+ runtime: z.string(),
121
+ });
122
+ export const testFailureSchema = z.object({
123
+ testName: z.string(),
124
+ message: z.string(),
125
+ expected: z.string().optional(),
126
+ actual: z.string().optional(),
127
+ file: z.string().optional(),
128
+ line: z.number().optional(),
129
+ });
130
+ export const testResultsSchema = z
131
+ .object({
132
+ passed: z.number(),
133
+ failed: z.number(),
134
+ skipped: z.number(),
135
+ total: z.number(),
136
+ durationMs: z.number(),
137
+ failures: z.array(testFailureSchema),
138
+ rawOutput: z.string().optional(),
139
+ })
140
+ .refine((d) => d.total === d.passed + d.failed + d.skipped, {
141
+ message: 'total must equal passed + failed + skipped',
142
+ });
143
+ // T005: Extended pocIterationSchema
144
+ export const pocIterationSchema = z.object({
145
+ iteration: z.number(),
146
+ startedAt: z.string(),
147
+ endedAt: z.string().optional(),
148
+ changesSummary: z.string().optional(),
149
+ /** @deprecated kept for backward compatibility with pre-002 session files */
150
+ testsRun: z.array(z.string()).optional(),
151
+ // New fields for Feature 002
152
+ outcome: z
153
+ .enum(['tests-passing', 'tests-failing', 'error', 'scaffold'])
154
+ .optional()
155
+ .default('scaffold'),
156
+ filesChanged: z.array(z.string()).default([]),
157
+ testResults: testResultsSchema.optional(),
158
+ errorMessage: z.string().optional(),
159
+ llmPromptContext: z.string().optional(),
160
+ });
161
+ // T006: Extended pocDevelopmentStateSchema
162
+ export const pocDevelopmentStateSchema = z.object({
163
+ repoPath: z.string().optional(),
164
+ repoUrl: z.string().optional(),
165
+ repoSource: z.enum(['local']), // Always local - users push manually to GitHub when ready
166
+ techStack: techStackSchema.optional(),
167
+ iterations: z.array(pocIterationSchema),
168
+ finalStatus: z.enum(['success', 'failed', 'partial']).optional(),
169
+ terminationReason: z
170
+ .enum(['tests-passing', 'max-iterations', 'user-stopped', 'error'])
171
+ .optional(),
172
+ totalDurationMs: z.number().optional(),
173
+ finalTestResults: testResultsSchema.optional(),
174
+ });
175
+ // ── Artifacts ────────────────────────────────────────────────────────────────
176
+ // ── Discovery Enrichment (Feature 003) ───────────────────────────────────────
177
+ export const DiscoveryEnrichmentSchema = z.object({
178
+ /** Raw web search summary text (combined from all queries) */
179
+ webSearchResults: z.string().optional(),
180
+ /** Recent news headlines/snippets about the company */
181
+ companyNews: z.array(z.string()).max(10).optional(),
182
+ /** Competitor activity summaries */
183
+ competitorInfo: z.array(z.string()).max(10).optional(),
184
+ /** Industry trend descriptions */
185
+ industryTrends: z.array(z.string()).max(10).optional(),
186
+ /** WorkIQ-derived team insights (only present if user consented) */
187
+ workiqInsights: z
188
+ .object({
189
+ /** Identified team skill areas */
190
+ teamExpertise: z.array(z.string()).max(10).optional(),
191
+ /** Meeting/communication patterns identified */
192
+ collaborationPatterns: z.array(z.string()).max(10).optional(),
193
+ /** Areas lacking internal documentation */
194
+ documentationGaps: z.array(z.string()).max(10).optional(),
195
+ })
196
+ .optional(),
197
+ /** ISO 8601 timestamp when enrichment was collected */
198
+ enrichedAt: z.string().datetime().optional(),
199
+ /** Which sources were queried ('websearch', 'workiq') */
200
+ sourcesUsed: z.array(z.string()).optional(),
201
+ });
202
+ export const DiscoveryStateSchema = z.object({
203
+ enrichment: DiscoveryEnrichmentSchema.optional(),
204
+ });
205
+ // ── Artifacts ────────────────────────────────────────────────────────────────
206
+ export const generatedFileSchema = z.object({
207
+ relativePath: z.string(),
208
+ type: z.enum(['markdown', 'json', 'text']),
209
+ createdAt: z.string(),
210
+ });
211
+ export const artifactIndexSchema = z.object({
212
+ exportDir: z.string().optional(),
213
+ generatedFiles: z.array(generatedFileSchema),
214
+ });
215
+ // ── Conversation Turn ────────────────────────────────────────────────────────
216
+ export const conversationTurnSchema = z.object({
217
+ phase: phaseSchema,
218
+ sequence: z.number(),
219
+ role: z.enum(['user', 'assistant', 'system']),
220
+ content: z.string(),
221
+ timestamp: z.string(),
222
+ metadata: z.record(z.string(), z.unknown()).optional(),
223
+ });
224
+ // ── Error Record ─────────────────────────────────────────────────────────────
225
+ export const errorRecordSchema = z.object({
226
+ timestamp: z.string(),
227
+ code: z.string(),
228
+ message: z.string(),
229
+ details: z.record(z.string(), z.unknown()).optional(),
230
+ });
231
+ // ── Activity (telemetry event) ───────────────────────────────────────────────
232
+ export const activitySchema = z.object({
233
+ id: z.string(),
234
+ timestamp: z.string(),
235
+ kind: z.enum(['phase', 'tool', 'io', 'warning', 'error', 'progress']),
236
+ message: z.string(),
237
+ data: z.record(z.string(), z.unknown()).optional(),
238
+ });
239
+ // ── Workshop Session (root) ──────────────────────────────────────────────────
240
+ export const workshopSessionSchema = z
241
+ .object({
242
+ sessionId: z.string(),
243
+ schemaVersion: z.string(),
244
+ createdAt: z.string(),
245
+ updatedAt: z.string(),
246
+ name: z.string().optional(),
247
+ phase: phaseSchema,
248
+ status: sessionStatusSchema,
249
+ participants: z.array(participantSchema),
250
+ businessContext: businessContextSchema.optional(),
251
+ topic: topicSelectionSchema.optional(),
252
+ activities: z.array(activitySchema).optional(),
253
+ workflow: workflowMapSchema.optional(),
254
+ cards: cardSelectionSchema.optional(),
255
+ ideas: z.array(ideaCardSchema).optional(),
256
+ evaluation: ideaEvaluationSchema.optional(),
257
+ selection: selectedIdeaSchema.optional(),
258
+ plan: implementationPlanSchema.optional(),
259
+ poc: pocDevelopmentStateSchema.optional(),
260
+ discovery: DiscoveryStateSchema.optional(),
261
+ artifacts: artifactIndexSchema,
262
+ turns: z.array(conversationTurnSchema).optional(),
263
+ errors: z.array(errorRecordSchema).optional(),
264
+ })
265
+ .passthrough(); // Forward compatibility: preserve unknown fields
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Table rendering helper using cli-table3.
3
+ */
4
+ import Table from 'cli-table3';
5
+ /**
6
+ * Render a table as a string.
7
+ */
8
+ export function renderTable(options) {
9
+ const { head, rows, colWidths } = options;
10
+ const tableOpts = {};
11
+ if (head)
12
+ tableOpts.head = head;
13
+ if (colWidths)
14
+ tableOpts.colWidths = colWidths;
15
+ const table = new Table(tableOpts);
16
+ for (const row of rows) {
17
+ table.push(row);
18
+ }
19
+ return table.toString();
20
+ }
@@ -0,0 +1,2 @@
1
+ // Re-export chalk for consistent imports across the project
2
+ export { default } from 'chalk';
@@ -0,0 +1,3 @@
1
+ // Re-export cli-table3 for consistent imports across the project
2
+ import Table from 'cli-table3';
3
+ export default Table;
@@ -0,0 +1,2 @@
1
+ // Re-export commander for consistent imports across the project
2
+ export { Command, Option, Argument } from 'commander';
@@ -0,0 +1,3 @@
1
+ // Re-export marked-terminal for consistent imports across the project
2
+ import markedTerminal from 'marked-terminal';
3
+ export default markedTerminal;
@@ -0,0 +1,2 @@
1
+ // Re-export marked for consistent imports across the project
2
+ export { marked } from 'marked';
@@ -0,0 +1,2 @@
1
+ // Re-export ora for consistent imports across the project
2
+ export { default } from 'ora';
@@ -0,0 +1,2 @@
1
+ // Re-export pino for consistent imports across the project
2
+ export { default } from 'pino';
@@ -0,0 +1,2 @@
1
+ // Re-export zod for consistent imports across the project
2
+ export { z } from 'zod/v4';