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,114 @@
1
+ # Implementation Plan: MCP Transport Integration
2
+
3
+ **Branch**: `003-mcp-transport-integration` | **Date**: 2026-03-01 | **Spec**: [specs/003-mcp-transport-integration/spec.md](spec.md)
4
+ **Input**: Feature specification from `/specs/003-mcp-transport-integration/spec.md`
5
+
6
+ **Note**: This plan was generated by the `/speckit.plan` command.
7
+
8
+ ## Summary
9
+
10
+ Implement the real MCP transport layer that connects `McpManager.callTool()` to actual MCP server processes and HTTP endpoints, replacing all stubs and placeholder implementations introduced in Feature 002.
11
+
12
+ The four currently-stubbed MCP integrations — GitHub adapter (repo creation + file push), Context7 enricher (library docs), Azure MCP enricher (cloud guidance), and web search enricher (stuck-iteration research) — will be wired to real transport. Research (FR-019) confirmed that `@github/copilot-sdk` v0.1.28 provides **native MCP server management** via `SessionConfig.mcpServers` for LLM-initiated tool calls during conversation turns, but the SDK's `executeToolCall()` is private — so a custom `mcpTransport.ts` (stdio + HTTP) is built for programmatic adapter calls (GitHub, Context7, Azure) that bypass the LLM.
13
+
14
+ Additionally: the discovery phase gains optional web search and WorkIQ enrichment; `pushFiles` is fixed to include an initial post-scaffold push; and agent definitions are confirmed aligned with SDK patterns (no refactoring required).
15
+
16
+ ## Technical Context
17
+
18
+ **Language/Version**: Node.js (>=20 LTS) with TypeScript 5.3 (ES2022 target, ESM)
19
+ **Primary Dependencies**: `@github/copilot-sdk` ^0.1.28 (primary MCP + LLM surface), `zod` ^4 (response validation), `pino` ^8 (structured logging), `@upstash/context7-mcp` (stdio MCP subprocess), `@azure/mcp` (stdio MCP subprocess), `@microsoft/workiq` (stdio MCP subprocess)
20
+ **Storage**: Filesystem — session JSON at `.sofia/sessions/<id>.json`, PoC output at `./poc/<sessionId>/`; MCP config from `.vscode/mcp.json`
21
+ **Testing**: Vitest ^4 with `@vitest/coverage-v8`; unit, integration, e2e directories; live MCP tests gated behind `SOFIA_LIVE_MCP_TESTS=true`
22
+ **Target Platform**: Linux/macOS CLI (Windows via WSL); MCP subprocesses spawned via `npx`
23
+ **Project Type**: CLI application — extending existing `sofiacli` binary; MCP transport is an internal service module, not a public API
24
+ **Performance Goals**: Tool calls complete within configured timeout (30s queries, 60s repo operations); one automatic retry with exponential backoff for transient errors; MCP subprocess startup <5s
25
+ **Constraints**: No secrets/tokens in logs; SDK-native transport used where available; custom transport only for SDK gaps; live tests gated by env var; auth model per transport determined by FR-019 research
26
+ **Scale/Scope**: Single-user CLI; up to 4 concurrent MCP server connections; typical session makes <50 tool calls
27
+
28
+ ## Constitution Check
29
+
30
+ _GATE: Must pass before Phase 0 research. Re-check after Phase 1 design._
31
+
32
+ - **Outcome-first discovery**: ✅ Working MCP transport is the critical path to end-to-end PoC generation — the measurable outcome is a real GitHub repo with real code, created and enriched by live MCP tool calls.
33
+ - **Secure-by-default**: ✅ No tokens or secrets logged; WorkIQ requires explicit user consent before accessing M365 data; MCP subprocess env vars inherit from shell (not hardcoded); least privilege per server config.
34
+ - **Node.js + TypeScript**: ✅ All new code extends the existing TypeScript ESM codebase; Copilot SDK used as primary integration surface.
35
+ - **MCP-first**: ✅ This entire feature IS the MCP integration — every external call routes through MCP protocol rather than ad-hoc HTTP. WorkIQ uses its MCP interface. Web search uses the `web.search` MCP tool or Azure AI Foundry bridge already in `src/mcp/webSearch.ts`.
36
+ - **Test-first (NON-NEGOTIABLE)**: ✅ Transport layer, retry logic, error classification, all adapter methods, and discovery enrichment flows require Red → Green → Review. Live integration tests gated behind `SOFIA_LIVE_MCP_TESTS=true`. Mock MCP servers used in unit/integration tests.
37
+ - **CLI transparency**: ✅ SDK `onPreToolUse`/`onPostToolUse` hooks emit tool-call activity to the CLI spinner; `assistant.usage` events tracked for token transparency; retry attempts logged at warn level; graceful degradation messages include what was skipped and why.
38
+
39
+ ## Project Structure
40
+
41
+ ### Documentation (this feature)
42
+
43
+ ```text
44
+ specs/003-mcp-transport-integration/
45
+ ├── plan.md # This file
46
+ ├── research.md # Phase 0 output — Copilot SDK MCP patterns, transport options, auth model
47
+ ├── data-model.md # Phase 1 output — McpTransport, ToolCallRequest, DiscoveryEnrichment entities
48
+ ├── quickstart.md # Phase 1 output — developer setup and first tool call walkthrough
49
+ ├── contracts/ # Phase 1 output
50
+ │ ├── mcp-transport.md # McpManager.callTool() contract and transport abstraction
51
+ │ ├── github-adapter.md # GitHubMcpAdapter real integration contract
52
+ │ ├── context-enricher.md # McpContextEnricher real integration contract
53
+ │ └── discovery-enricher.md # DiscoveryEnrichment session storage contract
54
+ └── tasks.md # Phase 2 output (created by /speckit.tasks — NOT by /speckit.plan)
55
+ ```
56
+
57
+ ### Source Code (repository root)
58
+
59
+ ```text
60
+ src/
61
+ ├── mcp/
62
+ │ ├── mcpManager.ts # MODIFIED: implement callTool() with real transport dispatch
63
+ │ ├── mcpTransport.ts # NEW: stdio and HTTP transport implementations
64
+ │ ├── retryPolicy.ts # NEW: exponential backoff retry logic (transient errors only)
65
+ │ └── webSearch.ts # EXISTING: Azure AI Foundry web search tool (no change)
66
+ ├── develop/
67
+ │ ├── githubMcpAdapter.ts # MODIFIED: createRepository() and pushFiles() use real callTool()
68
+ │ ├── mcpContextEnricher.ts # MODIFIED: queryContext7(), queryAzureMcp(), queryWebSearch() real
69
+ │ ├── ralphLoop.ts # MODIFIED: fix pushFiles to read actual file content from disk
70
+ │ ├── codeGenerator.ts # EXISTING: no changes needed
71
+ │ ├── pocScaffolder.ts # EXISTING: no changes needed
72
+ │ └── testRunner.ts # EXISTING: no changes needed
73
+ ├── phases/
74
+ │ ├── phaseHandlers.ts # MODIFIED: wire discovery enrichment after Step 1 collection
75
+ │ └── discoveryEnricher.ts # NEW: web search + WorkIQ enrichment for discovery phase
76
+ ├── shared/
77
+ │ └── schemas/
78
+ │ └── session.ts # MODIFIED: add DiscoveryEnrichment to DiscoveryState schema
79
+
80
+ tests/
81
+ ├── unit/
82
+ │ ├── mcp/
83
+ │ │ ├── mcpManager.spec.ts # MODIFIED: add callTool() unit tests
84
+ │ │ ├── mcpTransport.spec.ts # NEW: stdio + HTTP transport unit tests (mock subprocess)
85
+ │ │ └── retryPolicy.spec.ts # NEW: retry logic unit tests
86
+ │ └── develop/
87
+ │ ├── githubMcpAdapter.spec.ts # MODIFIED: add real integration tests with mock transport
88
+ │ ├── mcpContextEnricher.spec.ts # MODIFIED: add real integration tests with mock transport
89
+ │ └── ralphLoop.spec.ts # MODIFIED: fix pushFiles content test
90
+ │ └── phases/
91
+ │ └── discoveryEnricher.spec.ts # NEW: discovery enrichment unit tests
92
+ ├── integration/
93
+ │ ├── mcpTransportFlow.spec.ts # NEW: end-to-end transport with mock MCP server
94
+ │ └── discoveryEnrichmentFlow.spec.ts # NEW: discovery + enrichment integration
95
+ └── e2e/
96
+ └── mcpLive.spec.ts # NEW: live MCP smoke tests (SOFIA_LIVE_MCP_TESTS=true gate)
97
+ ```
98
+
99
+ **Structure Decision**: Single project, extending the existing `src/` layout. New transport code lives in `src/mcp/` alongside the existing `mcpManager.ts` and `webSearch.ts`. Discovery enrichment is a new module in `src/phases/`. All other changes are modifications to Feature 002 files.
100
+
101
+ ## Post-Design Constitution Re-Check
102
+
103
+ _All 6 gates re-evaluated after Phase 1 design. No violations._
104
+
105
+ - **Outcome-first discovery**: ✅ Contracts tie every transport call to a concrete user-visible outcome (real repo URL, real docs, real search results).
106
+ - **Secure-by-default**: ✅ WorkIQ permission gate enforced in `discoveryEnricher.ts`; no env-var secrets hardcoded; subprocess stdio does not log raw credentials.
107
+ - **Node.js + TypeScript**: ✅ All new modules follow existing ESM + strict TS patterns; Zod schemas for all response validation.
108
+ - **MCP-first**: ✅ `mcpTransport.ts` IS the MCP protocol implementation; no ad-hoc HTTP side channels.
109
+ - **Test-first (NON-NEGOTIABLE)**: ✅ Every new module has a spec file defined in the structure above. Mock MCP servers used in unit/integration; live tests gated.
110
+ - **CLI transparency**: ✅ SDK `onPreToolUse`/`onPostToolUse` hooks emit tool-call activity visible via spinner; `assistant.usage` events logged for token transparency; retry attempts log warn-level messages with backoff delay; degradation messages specify which MCP server was skipped.
111
+
112
+ ## Complexity Tracking
113
+
114
+ No constitution violations — all gates pass (both pre-research and post-design checks).
@@ -0,0 +1,311 @@
1
+ # Developer Quickstart: MCP Transport Integration
2
+
3
+ **Feature**: 003-mcp-transport-integration
4
+ **Date**: 2026-03-01
5
+ **Audience**: Engineers implementing or reviewing this feature
6
+
7
+ ---
8
+
9
+ ## Prerequisites
10
+
11
+ - Node.js >= 20 LTS
12
+ - `npm install` run at repo root
13
+ - Feature 002 (`002-poc-generation`) merged to `main`
14
+ - Working branch: `003-mcp-transport-integration`
15
+ - (Optional) `GITHUB_TOKEN` env var set to a PAT with `repo` scope for live GitHub MCP tests
16
+ - (Optional) Azure subscription credentials for live Azure MCP tests
17
+
18
+ ---
19
+
20
+ ## 1. Clone and Set Up
21
+
22
+ ```bash
23
+ git clone <repo>
24
+ cd sofIA-cli
25
+ git checkout 003-mcp-transport-integration
26
+ npm install
27
+ ```
28
+
29
+ Verify the test suite passes before making any changes (Feature 002 baseline):
30
+
31
+ ```bash
32
+ npm run test
33
+ ```
34
+
35
+ Expected: all unit and integration tests pass. e2e tests may require live services.
36
+
37
+ ---
38
+
39
+ ## 2. Understand the Transport Layer
40
+
41
+ The MCP transport lives in `src/mcp/`:
42
+
43
+ ```
44
+ src/mcp/
45
+ ├── mcpManager.ts # Config loader + McpManager class (callTool to be implemented)
46
+ ├── mcpTransport.ts # NEW: StdioMcpTransport, HttpMcpTransport, createTransport()
47
+ ├── retryPolicy.ts # NEW: withRetry() helper for transient error handling
48
+ └── webSearch.ts # Azure AI Foundry bridge (existing, no changes)
49
+ ```
50
+
51
+ ### How a tool call flows
52
+
53
+ ```
54
+ adapter.createRepository()
55
+ └── mcpManager.callTool('github', 'create_repository', args)
56
+ └── withRetry(...)
57
+ └── HttpMcpTransport.callTool('create_repository', args, 60_000)
58
+ └── fetch('https://api.githubcopilot.com/mcp/', { method: 'POST', ... })
59
+ └── returns ToolCallResponse
60
+ ```
61
+
62
+ For stdio servers (Context7, Azure, WorkIQ):
63
+
64
+ ```
65
+ enricher.queryContext7(['express', 'zod'])
66
+ └── mcpManager.callTool('context7', 'resolve-library-id', { libraryName: 'express' })
67
+ └── withRetry(...)
68
+ └── StdioMcpTransport.callTool('resolve-library-id', args, 30_000)
69
+ └── writes JSON-RPC to subprocess stdin
70
+ └── reads JSON-RPC from subprocess stdout
71
+ ```
72
+
73
+ ---
74
+
75
+ ## 3. First Tool Call (Development Walkthrough)
76
+
77
+ ### Step A: Write the failing test (RED)
78
+
79
+ Before writing any implementation, add a failing test:
80
+
81
+ ```typescript
82
+ // tests/unit/mcp/mcpTransport.spec.ts
83
+
84
+ import { describe, it, expect } from 'vitest';
85
+ import { HttpMcpTransport } from '../../../src/mcp/mcpTransport.js';
86
+
87
+ describe('HttpMcpTransport', () => {
88
+ it('calls the server URL with JSON-RPC method tools/call', async () => {
89
+ const calls: RequestInit[] = [];
90
+ const mockFetch = async (url: string, init: RequestInit) => {
91
+ calls.push(init);
92
+ return new Response(JSON.stringify({
93
+ jsonrpc: '2.0',
94
+ id: 1,
95
+ result: { content: [{ type: 'text', text: '{"html_url":"https://github.com/org/repo"}' }] }
96
+ }), { status: 200 });
97
+ };
98
+
99
+ const transport = new HttpMcpTransport(
100
+ { name: 'github', type: 'http', url: 'https://api.githubcopilot.com/mcp/' },
101
+ mockFetch as typeof fetch,
102
+ );
103
+
104
+ const result = await transport.callTool('create_repository', { name: 'test' }, 30_000);
105
+
106
+ expect(calls).toHaveLength(1);
107
+ const body = JSON.parse(calls[0].body as string);
108
+ expect(body.method).toBe('tools/call');
109
+ expect(body.params.name).toBe('create_repository');
110
+ expect(result.content).toContain('html_url');
111
+ });
112
+ });
113
+ ```
114
+
115
+ Run: `npm run test:unit` → **should fail** (module doesn't exist yet).
116
+
117
+ ### Step B: Implement (GREEN)
118
+
119
+ Create `src/mcp/mcpTransport.ts` with `HttpMcpTransport` satisfying the test.
120
+
121
+ Run: `npm run test:unit` → **should pass**.
122
+
123
+ ### Step C: Review
124
+
125
+ Checklist:
126
+ - [ ] Are error paths tested (401, timeout, malformed JSON)?
127
+ - [ ] Is the retry policy exercised (separate `retryPolicy.spec.ts`)?
128
+ - [ ] Does `McpManager.callTool()` integration test pass?
129
+
130
+ ---
131
+
132
+ ## 4. MCP Configuration
133
+
134
+ The transport reads server configurations from `.vscode/mcp.json` (already present in the repo):
135
+
136
+ ```json
137
+ {
138
+ "servers": {
139
+ "github": { "type": "http", "url": "https://api.githubcopilot.com/mcp/" },
140
+ "context7": { "command": "npx", "args": ["-y", "@upstash/context7-mcp"] },
141
+ "azure": { "command": "npx", "args": ["-y", "@azure/mcp", "server", "start"] },
142
+ "workiq": { "command": "npx", "args": ["-y", "@microsoft/workiq", "mcp"] }
143
+ }
144
+ }
145
+ ```
146
+
147
+ `McpManager` loads this file via `loadMcpConfig()`. In tests, pass a custom `McpConfig` directly:
148
+
149
+ ```typescript
150
+ const config: McpConfig = {
151
+ servers: {
152
+ github: { name: 'github', type: 'http', url: 'https://api.githubcopilot.com/mcp/' },
153
+ },
154
+ };
155
+ const manager = new McpManager(config);
156
+ manager.markConnected('github');
157
+ ```
158
+
159
+ ---
160
+
161
+ ## 5. Running Tests
162
+
163
+ ### Unit tests only (fast, no live services)
164
+
165
+ ```bash
166
+ npm run test:unit
167
+ ```
168
+
169
+ ### Integration tests (mock MCP servers, no live services)
170
+
171
+ ```bash
172
+ npm run test:integration
173
+ ```
174
+
175
+ ### Live MCP smoke tests (requires credentials)
176
+
177
+ ```bash
178
+ SOFIA_LIVE_MCP_TESTS=true npm run test:live
179
+ ```
180
+
181
+ > **Note**: Live tests will spawn real MCP subprocesses (`npx @upstash/context7-mcp`, etc.) and make real HTTP calls. Ensure `GITHUB_TOKEN` is set for GitHub MCP tests.
182
+
183
+ ### Full test suite
184
+
185
+ ```bash
186
+ npm test
187
+ ```
188
+
189
+ ---
190
+
191
+ ## 6. Environment Variables
192
+
193
+ | Variable | Required | Description |
194
+ |----------|----------|-------------|
195
+ | `GITHUB_TOKEN` | For live GitHub MCP | Personal access token with `repo` scope |
196
+ | `AZURE_SUBSCRIPTION_ID` | For live Azure MCP | Azure subscription ID |
197
+ | `AZURE_TENANT_ID` | For live Azure MCP | Azure tenant ID |
198
+ | `AZURE_AI_FOUNDRY_ENDPOINT` | For web search | Azure AI Foundry endpoint URL |
199
+ | `AZURE_AI_FOUNDRY_API_KEY` | For web search | Azure AI Foundry API key |
200
+ | `SOFIA_LIVE_MCP_TESTS` | To enable live tests | Set to `true` to run live smoke tests |
201
+
202
+ ---
203
+
204
+ ## 7. Key Files to Modify
205
+
206
+ ### New files
207
+
208
+ | File | Purpose |
209
+ |------|---------|
210
+ | `src/mcp/mcpTransport.ts` | `McpTransport` interface + `StdioMcpTransport` + `HttpMcpTransport` + `createTransport()` |
211
+ | `src/mcp/retryPolicy.ts` | `withRetry()` helper |
212
+ | `src/phases/discoveryEnricher.ts` | `DiscoveryEnricher` class |
213
+ | `tests/unit/mcp/mcpTransport.spec.ts` | Transport unit tests |
214
+ | `tests/unit/mcp/retryPolicy.spec.ts` | Retry policy unit tests |
215
+ | `tests/unit/phases/discoveryEnricher.spec.ts` | Discovery enricher unit tests |
216
+ | `tests/integration/mcpTransportFlow.spec.ts` | End-to-end transport integration test |
217
+ | `tests/e2e/mcpLive.spec.ts` | Live smoke tests (gated by `SOFIA_LIVE_MCP_TESTS`) |
218
+
219
+ ### Modified files
220
+
221
+ | File | Change |
222
+ |------|--------|
223
+ | `src/mcp/mcpManager.ts` | Add `callTool()` implementation + transport registry |
224
+ | `src/develop/githubMcpAdapter.ts` | Remove stub; use real `callTool()` |
225
+ | `src/develop/mcpContextEnricher.ts` | Remove stub; use real `callTool()` |
226
+ | `src/develop/ralphLoop.ts` | Add post-scaffold push; fix file content flow |
227
+ | `src/phases/phaseHandlers.ts` | Wire discovery enrichment after Step 1 |
228
+ | `src/shared/schemas/session.ts` | Add `DiscoveryEnrichment` + extend `DiscoveryState` |
229
+
230
+ ---
231
+
232
+ ## 8. Common Patterns
233
+
234
+ ### Making a tool call in an adapter
235
+
236
+ ```typescript
237
+ // In any adapter or enricher:
238
+ try {
239
+ const response = await this.mcpManager.callTool('context7', 'resolve-library-id', {
240
+ libraryName: 'express',
241
+ });
242
+ const libraryId = response.libraryId as string;
243
+ // ... use libraryId
244
+ } catch (err) {
245
+ const errorClass = classifyMcpError(err);
246
+ logger.warn({ errorClass, err }, 'Context7 resolve-library-id failed');
247
+ // return fallback value
248
+ }
249
+ ```
250
+
251
+ ### Writing a test with a fake transport
252
+
253
+ ```typescript
254
+ import { McpManager, loadMcpConfig } from '../../../src/mcp/mcpManager.js';
255
+
256
+ const manager = new McpManager({ servers: {
257
+ context7: { name: 'context7', type: 'stdio', command: 'npx', args: [] }
258
+ }});
259
+
260
+ // Inject fake transport (via a test seam or vi.mock)
261
+ manager.markConnected('context7');
262
+ vi.spyOn(manager, 'callTool').mockResolvedValueOnce({ libraryId: '/expressjs/express' });
263
+ ```
264
+
265
+ ### Gating a live test
266
+
267
+ ```typescript
268
+ import { describe, it } from 'vitest';
269
+
270
+ const LIVE = process.env.SOFIA_LIVE_MCP_TESTS === 'true';
271
+
272
+ describe.skipIf(!LIVE)('Live: GitHub MCP smoke test', () => {
273
+ it('creates and deletes a test repository', async () => {
274
+ // ... real MCP call
275
+ });
276
+ });
277
+ ```
278
+
279
+ ---
280
+
281
+ ## 9. Troubleshooting
282
+
283
+ ### "MCP server 'github' is not available"
284
+
285
+ The server is in `mcp.json` config but not yet connected. Call `manager.markConnected('github')` in your test setup, or verify the real transport initialized successfully.
286
+
287
+ ### Stdio subprocess hangs on startup
288
+
289
+ The `initialize` handshake times out after 5 seconds. Check that the subprocess command is correct in `mcp.json` and that `npx` can download the package (requires internet access in live test environment).
290
+
291
+ ### Live test fails with 401 on GitHub MCP
292
+
293
+ Set `GITHUB_TOKEN` to a valid PAT. Tokens must have `repo` scope. Check token expiry.
294
+
295
+ ### Context7 returns empty docs
296
+
297
+ The `resolve-library-id` tool may return a libraryId, but `query-docs` returns empty content for some packages. This is expected behavior — the enricher falls back to the npm link.
298
+
299
+ ---
300
+
301
+ ## 10. Reference
302
+
303
+ - [MCP Transport Contract](./contracts/mcp-transport.md)
304
+ - [GitHub Adapter Contract](./contracts/github-adapter.md)
305
+ - [Context Enricher Contract](./contracts/context-enricher.md)
306
+ - [Discovery Enricher Contract](./contracts/discovery-enricher.md)
307
+ - [Data Model](./data-model.md)
308
+ - [Research Notes](./research.md)
309
+ - [Feature 002 Plan](../002-poc-generation/plan.md) — upstream feature context
310
+ - [MCP Protocol Specification](https://modelcontextprotocol.io/specification) — JSON-RPC 2.0 framing
311
+ - [`.vscode/mcp.json`](../../.vscode/mcp.json) — server configurations