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.
- package/.github/agents/copilot-instructions.md +39 -0
- package/.github/agents/speckit.analyze.agent.md +184 -0
- package/.github/agents/speckit.checklist.agent.md +294 -0
- package/.github/agents/speckit.clarify.agent.md +181 -0
- package/.github/agents/speckit.constitution.agent.md +84 -0
- package/.github/agents/speckit.implement.agent.md +135 -0
- package/.github/agents/speckit.plan.agent.md +90 -0
- package/.github/agents/speckit.specify.agent.md +258 -0
- package/.github/agents/speckit.tasks.agent.md +137 -0
- package/.github/agents/speckit.taskstoissues.agent.md +30 -0
- package/.github/copilot-instructions.md +257 -0
- package/.github/prompts/speckit.analyze.prompt.md +3 -0
- package/.github/prompts/speckit.checklist.prompt.md +3 -0
- package/.github/prompts/speckit.clarify.prompt.md +3 -0
- package/.github/prompts/speckit.constitution.prompt.md +3 -0
- package/.github/prompts/speckit.implement.prompt.md +3 -0
- package/.github/prompts/speckit.plan.prompt.md +3 -0
- package/.github/prompts/speckit.specify.prompt.md +3 -0
- package/.github/prompts/speckit.tasks.prompt.md +3 -0
- package/.github/prompts/speckit.taskstoissues.prompt.md +3 -0
- package/.github/workflows/ci.yml +38 -0
- package/.prettierrc +6 -0
- package/.specify/memory/constitution.md +181 -0
- package/.specify/scripts/bash/check-prerequisites.sh +166 -0
- package/.specify/scripts/bash/common.sh +156 -0
- package/.specify/scripts/bash/create-new-feature.sh +297 -0
- package/.specify/scripts/bash/setup-plan.sh +61 -0
- package/.specify/scripts/bash/update-agent-context.sh +810 -0
- package/.specify/templates/agent-file-template.md +28 -0
- package/.specify/templates/checklist-template.md +40 -0
- package/.specify/templates/constitution-template.md +50 -0
- package/.specify/templates/plan-template.md +113 -0
- package/.specify/templates/spec-template.md +115 -0
- package/.specify/templates/tasks-template.md +251 -0
- package/.vscode/mcp.json +42 -0
- package/.vscode/settings.json +19 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/LICENSE +21 -0
- package/README.md +213 -0
- package/dist/src/cli/developCommand.js +240 -0
- package/dist/src/cli/directCommands.js +143 -0
- package/dist/src/cli/envLoader.js +16 -0
- package/dist/src/cli/exportCommand.js +53 -0
- package/dist/src/cli/index.js +203 -0
- package/dist/src/cli/ioContext.js +109 -0
- package/dist/src/cli/preflight.js +57 -0
- package/dist/src/cli/statusCommand.js +110 -0
- package/dist/src/cli/workshopCommand.js +400 -0
- package/dist/src/develop/checkpointState.js +86 -0
- package/dist/src/develop/codeGenerator.js +319 -0
- package/dist/src/develop/dynamicScaffolder.js +226 -0
- package/dist/src/develop/githubMcpAdapter.js +122 -0
- package/dist/src/develop/index.js +15 -0
- package/dist/src/develop/mcpContextEnricher.js +195 -0
- package/dist/src/develop/pocScaffolder.js +542 -0
- package/dist/src/develop/ralphLoop.js +659 -0
- package/dist/src/develop/templateRegistry.js +364 -0
- package/dist/src/develop/testRunner.js +202 -0
- package/dist/src/logging/logger.js +58 -0
- package/dist/src/loop/conversationLoop.js +227 -0
- package/dist/src/loop/phaseSummarizer.js +87 -0
- package/dist/src/mcp/mcpManager.js +267 -0
- package/dist/src/mcp/mcpTransport.js +391 -0
- package/dist/src/mcp/retryPolicy.js +47 -0
- package/dist/src/mcp/webSearch.js +254 -0
- package/dist/src/phases/contextSummarizer.js +101 -0
- package/dist/src/phases/discoveryEnricher.js +156 -0
- package/dist/src/phases/phaseExtractors.js +222 -0
- package/dist/src/phases/phaseHandlers.js +328 -0
- package/dist/src/prompts/design.md +51 -0
- package/dist/src/prompts/develop-boundary.md +51 -0
- package/dist/src/prompts/develop.md +111 -0
- package/dist/src/prompts/discover.md +58 -0
- package/dist/src/prompts/ideate.md +56 -0
- package/dist/src/prompts/plan.md +51 -0
- package/dist/src/prompts/promptLoader.js +167 -0
- package/dist/src/prompts/promptLoader.ts +198 -0
- package/dist/src/prompts/select.md +47 -0
- package/dist/src/prompts/summarize/README.md +8 -0
- package/dist/src/prompts/summarize/design-summary.md +37 -0
- package/dist/src/prompts/summarize/develop-summary.md +25 -0
- package/dist/src/prompts/summarize/ideate-summary.md +27 -0
- package/dist/src/prompts/summarize/plan-summary.md +27 -0
- package/dist/src/prompts/summarize/select-summary.md +21 -0
- package/dist/src/prompts/system.md +28 -0
- package/dist/src/sessions/exportPaths.js +22 -0
- package/dist/src/sessions/exportWriter.js +406 -0
- package/dist/src/sessions/sessionManager.js +81 -0
- package/dist/src/sessions/sessionStore.js +65 -0
- package/dist/src/shared/activitySpinner.js +91 -0
- package/dist/src/shared/copilotClient.js +129 -0
- package/dist/src/shared/data/cards.json +1249 -0
- package/dist/src/shared/data/cardsLoader.js +51 -0
- package/dist/src/shared/errorClassifier.js +120 -0
- package/dist/src/shared/events.js +28 -0
- package/dist/src/shared/markdownRenderer.js +34 -0
- package/dist/src/shared/schemas/session.js +265 -0
- package/dist/src/shared/tableRenderer.js +20 -0
- package/dist/src/vendor/chalk.js +2 -0
- package/dist/src/vendor/cli-table3.js +3 -0
- package/dist/src/vendor/commander.js +2 -0
- package/dist/src/vendor/marked-terminal.js +3 -0
- package/dist/src/vendor/marked.js +2 -0
- package/dist/src/vendor/ora.js +2 -0
- package/dist/src/vendor/pino.js +2 -0
- package/dist/src/vendor/zod.js +2 -0
- package/dist/tests/e2e/developE2e.spec.js +126 -0
- package/dist/tests/e2e/developFailureE2e.spec.js +247 -0
- package/dist/tests/e2e/developPty.spec.js +75 -0
- package/dist/tests/e2e/discoveryWebSearchRelevance.spec.js +84 -0
- package/dist/tests/e2e/harness.spec.js +83 -0
- package/dist/tests/e2e/mcpLive.spec.js +120 -0
- package/dist/tests/e2e/newSession.e2e.spec.js +177 -0
- package/dist/tests/e2e/ralphLoopEnrichmentComparison.spec.js +62 -0
- package/dist/tests/e2e/workiqEnrichment.spec.js +56 -0
- package/dist/tests/e2e/zavaSimulation.spec.js +452 -0
- package/dist/tests/fixtures/test-fixture-project/src/add.js +3 -0
- package/dist/tests/fixtures/test-fixture-project/tests/failing.test.js +6 -0
- package/dist/tests/fixtures/test-fixture-project/tests/hanging.test.js +8 -0
- package/dist/tests/fixtures/test-fixture-project/tests/passing.test.js +10 -0
- package/dist/tests/fixtures/test-fixture-project/vitest.config.js +6 -0
- package/dist/tests/integration/autoStartConversation.spec.js +138 -0
- package/dist/tests/integration/defaultCommand.spec.js +147 -0
- package/dist/tests/integration/directCommandNonTty.spec.js +224 -0
- package/dist/tests/integration/directCommandTty.spec.js +151 -0
- package/dist/tests/integration/discoveryEnrichmentFlow.spec.js +175 -0
- package/dist/tests/integration/exportArtifacts.spec.js +202 -0
- package/dist/tests/integration/exportFallbackFlow.spec.js +99 -0
- package/dist/tests/integration/mcpDegradationFlow.spec.js +190 -0
- package/dist/tests/integration/mcpTransportFlow.spec.js +139 -0
- package/dist/tests/integration/newSessionFlow.spec.js +343 -0
- package/dist/tests/integration/pocGithubMcp.spec.js +186 -0
- package/dist/tests/integration/pocLocalFallback.spec.js +171 -0
- package/dist/tests/integration/pocScaffold.spec.js +163 -0
- package/dist/tests/integration/ralphLoopFlow.spec.js +359 -0
- package/dist/tests/integration/ralphLoopPartial.spec.js +368 -0
- package/dist/tests/integration/resumeAndBacktrack.spec.js +247 -0
- package/dist/tests/integration/spinnerLifecycle.spec.js +220 -0
- package/dist/tests/integration/summarizationFlow.spec.js +115 -0
- package/dist/tests/integration/testRunnerReal.spec.js +52 -0
- package/dist/tests/integration/webSearchAgent.spec.js +128 -0
- package/dist/tests/live/copilotSdkLive.spec.js +107 -0
- package/dist/tests/live/zavaFullWorkshop.spec.js +392 -0
- package/dist/tests/setup/loadEnv.js +3 -0
- package/dist/tests/unit/cli/developCommand.spec.js +567 -0
- package/dist/tests/unit/cli/directCommands.spec.js +279 -0
- package/dist/tests/unit/cli/envLoader.spec.js +58 -0
- package/dist/tests/unit/cli/ioContext.spec.js +119 -0
- package/dist/tests/unit/cli/preflight.spec.js +108 -0
- package/dist/tests/unit/cli/statusCommand.spec.js +111 -0
- package/dist/tests/unit/cli/workshopClientFallback.spec.js +80 -0
- package/dist/tests/unit/cli/workshopCommand.spec.js +329 -0
- package/dist/tests/unit/config/vitestEnvSetup.spec.js +13 -0
- package/dist/tests/unit/develop/checkpointState.spec.js +315 -0
- package/dist/tests/unit/develop/codeGenerator.spec.js +355 -0
- package/dist/tests/unit/develop/githubMcpAdapter.spec.js +231 -0
- package/dist/tests/unit/develop/mcpContextEnricher.spec.js +433 -0
- package/dist/tests/unit/develop/outputValidator.spec.js +119 -0
- package/dist/tests/unit/develop/pocScaffolder.spec.js +353 -0
- package/dist/tests/unit/develop/ralphLoop.spec.js +1248 -0
- package/dist/tests/unit/develop/templateRegistry.spec.js +85 -0
- package/dist/tests/unit/develop/testRunner.spec.js +249 -0
- package/dist/tests/unit/infraBicep.spec.js +92 -0
- package/dist/tests/unit/infraDeploy.spec.js +82 -0
- package/dist/tests/unit/infraTeardown.spec.js +63 -0
- package/dist/tests/unit/logging/logger.spec.js +43 -0
- package/dist/tests/unit/loop/conversationLoop.spec.js +592 -0
- package/dist/tests/unit/loop/phaseSummarizer.spec.js +141 -0
- package/dist/tests/unit/loop/streamingMarkdown.spec.js +147 -0
- package/dist/tests/unit/mcp/mcpManager.spec.js +279 -0
- package/dist/tests/unit/mcp/mcpTransport.spec.js +529 -0
- package/dist/tests/unit/mcp/retryPolicy.spec.js +218 -0
- package/dist/tests/unit/mcp/timeoutValidation.spec.js +46 -0
- package/dist/tests/unit/mcp/webSearch.spec.js +567 -0
- package/dist/tests/unit/phases/contextSummarizer.spec.js +140 -0
- package/dist/tests/unit/phases/discoveryEnricher.repeatCalls.spec.js +93 -0
- package/dist/tests/unit/phases/discoveryEnricher.spec.js +411 -0
- package/dist/tests/unit/phases/phaseExtractors.spec.js +352 -0
- package/dist/tests/unit/phases/phaseHandlers.spec.js +425 -0
- package/dist/tests/unit/prompts/promptLoader.spec.js +118 -0
- package/dist/tests/unit/schemas/pocSchemas.spec.js +412 -0
- package/dist/tests/unit/schemas/session.spec.js +257 -0
- package/dist/tests/unit/sessions/exportPaths.spec.js +31 -0
- package/dist/tests/unit/sessions/exportWriter.spec.js +655 -0
- package/dist/tests/unit/sessions/sessionManager.spec.js +151 -0
- package/dist/tests/unit/sessions/sessionStore.spec.js +116 -0
- package/dist/tests/unit/shared/activitySpinner.spec.js +175 -0
- package/dist/tests/unit/shared/cardsLoader.spec.js +76 -0
- package/dist/tests/unit/shared/copilotClient.spec.js +155 -0
- package/dist/tests/unit/shared/errorClassifier.spec.js +131 -0
- package/dist/tests/unit/shared/events.spec.js +55 -0
- package/dist/tests/unit/shared/markdownRenderer.spec.js +35 -0
- package/dist/tests/unit/shared/markdownRendererChunks.spec.js +70 -0
- package/dist/tests/unit/shared/tableRenderer.spec.js +34 -0
- package/dist/vitest.config.js +14 -0
- package/dist/vitest.live.config.js +18 -0
- package/docs/README.md +35 -0
- package/docs/architecture.md +169 -0
- package/docs/cli-usage.md +207 -0
- package/docs/environment.md +66 -0
- package/docs/export-format.md +146 -0
- package/docs/session-model.md +113 -0
- package/eslint.config.js +35 -0
- package/infra/deploy.sh +193 -0
- package/infra/gather-env.sh +211 -0
- package/infra/main.bicep +90 -0
- package/infra/main.bicepparam +18 -0
- package/infra/resources.bicep +134 -0
- package/infra/teardown.sh +114 -0
- package/package.json +63 -0
- package/specs/001-cli-workshop-rebuild/checklists/requirements.md +35 -0
- package/specs/001-cli-workshop-rebuild/contracts/cli.md +59 -0
- package/specs/001-cli-workshop-rebuild/contracts/export-summary-json.md +23 -0
- package/specs/001-cli-workshop-rebuild/contracts/session-json.md +30 -0
- package/specs/001-cli-workshop-rebuild/data-model.md +210 -0
- package/specs/001-cli-workshop-rebuild/plan.md +361 -0
- package/specs/001-cli-workshop-rebuild/quickstart.md +83 -0
- package/specs/001-cli-workshop-rebuild/research.md +116 -0
- package/specs/001-cli-workshop-rebuild/spec.md +240 -0
- package/specs/001-cli-workshop-rebuild/tasks.md +476 -0
- package/specs/002-poc-generation/contracts/poc-output.md +172 -0
- package/specs/002-poc-generation/contracts/ralph-loop.md +113 -0
- package/specs/002-poc-generation/data-model.md +172 -0
- package/specs/002-poc-generation/plan.md +109 -0
- package/specs/002-poc-generation/quickstart.md +97 -0
- package/specs/002-poc-generation/research.md +786 -0
- package/specs/002-poc-generation/spec.md +81 -0
- package/specs/002-poc-generation/tasks-fix.md +198 -0
- package/specs/002-poc-generation/tasks.md +252 -0
- package/specs/003-mcp-transport-integration/checklists/requirements.md +37 -0
- package/specs/003-mcp-transport-integration/contracts/context-enricher.md +220 -0
- package/specs/003-mcp-transport-integration/contracts/discovery-enricher.md +267 -0
- package/specs/003-mcp-transport-integration/contracts/github-adapter.md +149 -0
- package/specs/003-mcp-transport-integration/contracts/mcp-transport.md +288 -0
- package/specs/003-mcp-transport-integration/data-model.md +326 -0
- package/specs/003-mcp-transport-integration/plan.md +114 -0
- package/specs/003-mcp-transport-integration/quickstart.md +311 -0
- package/specs/003-mcp-transport-integration/research.md +395 -0
- package/specs/003-mcp-transport-integration/spec.md +234 -0
- package/specs/003-mcp-transport-integration/tasks.md +324 -0
- package/specs/003-next-spec-gaps.md +150 -0
- package/specs/004-dev-resume-hardening/checklists/requirements.md +37 -0
- package/specs/004-dev-resume-hardening/contracts/cli.md +160 -0
- package/specs/004-dev-resume-hardening/data-model.md +321 -0
- package/specs/004-dev-resume-hardening/plan.md +107 -0
- package/specs/004-dev-resume-hardening/quickstart.md +115 -0
- package/specs/004-dev-resume-hardening/research.md +142 -0
- package/specs/004-dev-resume-hardening/spec.md +221 -0
- package/specs/004-dev-resume-hardening/tasks.md +333 -0
- package/specs/005-ai-search-deploy/checklists/requirements.md +39 -0
- package/specs/005-ai-search-deploy/contracts/web-search-tool.md +241 -0
- package/specs/005-ai-search-deploy/data-model.md +130 -0
- package/specs/005-ai-search-deploy/plan.md +93 -0
- package/specs/005-ai-search-deploy/quickstart.md +96 -0
- package/specs/005-ai-search-deploy/research.md +187 -0
- package/specs/005-ai-search-deploy/spec.md +143 -0
- package/specs/005-ai-search-deploy/tasks.md +284 -0
- package/specs/006-workshop-extraction-fixes/checklists/requirements.md +61 -0
- package/specs/006-workshop-extraction-fixes/contracts/summarization-and-export.md +131 -0
- package/specs/006-workshop-extraction-fixes/data-model.md +149 -0
- package/specs/006-workshop-extraction-fixes/plan.md +123 -0
- package/specs/006-workshop-extraction-fixes/quickstart.md +101 -0
- package/specs/006-workshop-extraction-fixes/research.md +143 -0
- package/specs/006-workshop-extraction-fixes/spec.md +210 -0
- package/specs/006-workshop-extraction-fixes/tasks.md +316 -0
- package/src/cli/developCommand.ts +308 -0
- package/src/cli/directCommands.ts +195 -0
- package/src/cli/envLoader.ts +17 -0
- package/src/cli/exportCommand.ts +65 -0
- package/src/cli/index.ts +249 -0
- package/src/cli/ioContext.ts +139 -0
- package/src/cli/preflight.ts +86 -0
- package/src/cli/statusCommand.ts +118 -0
- package/src/cli/workshopCommand.ts +496 -0
- package/src/develop/checkpointState.ts +121 -0
- package/src/develop/codeGenerator.ts +402 -0
- package/src/develop/dynamicScaffolder.ts +284 -0
- package/src/develop/githubMcpAdapter.ts +199 -0
- package/src/develop/index.ts +34 -0
- package/src/develop/mcpContextEnricher.ts +279 -0
- package/src/develop/pocScaffolder.ts +646 -0
- package/src/develop/ralphLoop.ts +1044 -0
- package/src/develop/templateRegistry.ts +427 -0
- package/src/develop/testRunner.ts +276 -0
- package/src/logging/logger.ts +73 -0
- package/src/loop/conversationLoop.ts +355 -0
- package/src/loop/phaseSummarizer.ts +114 -0
- package/src/mcp/mcpManager.ts +365 -0
- package/src/mcp/mcpTransport.ts +562 -0
- package/src/mcp/retryPolicy.ts +87 -0
- package/src/mcp/webSearch.ts +388 -0
- package/src/originalPrompts/design_thinking.md +178 -0
- package/src/originalPrompts/design_thinking_persona.md +76 -0
- package/src/originalPrompts/document_generator_example.md +77 -0
- package/src/originalPrompts/document_generator_persona.md +47 -0
- package/src/originalPrompts/facilitator_persona.md +125 -0
- package/src/originalPrompts/guardrails.md +47 -0
- package/src/phases/contextSummarizer.ts +154 -0
- package/src/phases/discoveryEnricher.ts +223 -0
- package/src/phases/phaseExtractors.ts +247 -0
- package/src/phases/phaseHandlers.ts +450 -0
- package/src/prompts/design.md +51 -0
- package/src/prompts/develop-boundary.md +51 -0
- package/src/prompts/develop.md +111 -0
- package/src/prompts/discover.md +58 -0
- package/src/prompts/ideate.md +56 -0
- package/src/prompts/plan.md +51 -0
- package/src/prompts/promptLoader.ts +198 -0
- package/src/prompts/select.md +47 -0
- package/src/prompts/summarize/README.md +8 -0
- package/src/prompts/summarize/design-summary.md +37 -0
- package/src/prompts/summarize/develop-summary.md +25 -0
- package/src/prompts/summarize/ideate-summary.md +27 -0
- package/src/prompts/summarize/plan-summary.md +27 -0
- package/src/prompts/summarize/select-summary.md +21 -0
- package/src/prompts/system.md +28 -0
- package/src/sessions/exportPaths.ts +28 -0
- package/src/sessions/exportWriter.ts +490 -0
- package/src/sessions/sessionManager.ts +119 -0
- package/src/sessions/sessionStore.ts +69 -0
- package/src/shared/activitySpinner.ts +108 -0
- package/src/shared/copilotClient.ts +291 -0
- package/src/shared/data/cards.json +1249 -0
- package/src/shared/data/cardsLoader.ts +70 -0
- package/src/shared/errorClassifier.ts +160 -0
- package/src/shared/events.ts +103 -0
- package/src/shared/markdownRenderer.ts +44 -0
- package/src/shared/schemas/session.ts +346 -0
- package/src/shared/tableRenderer.ts +28 -0
- package/src/types/marked-terminal.d.ts +5 -0
- package/src/vendor/chalk.ts +2 -0
- package/src/vendor/cli-table3.ts +3 -0
- package/src/vendor/commander.ts +2 -0
- package/src/vendor/marked-terminal.ts +3 -0
- package/src/vendor/marked.ts +2 -0
- package/src/vendor/ora.ts +2 -0
- package/src/vendor/pino.ts +3 -0
- package/src/vendor/zod.ts +3 -0
- package/tests/e2e/developE2e.spec.ts +152 -0
- package/tests/e2e/developFailureE2e.spec.ts +289 -0
- package/tests/e2e/developPty.spec.ts +86 -0
- package/tests/e2e/discoveryWebSearchRelevance.spec.ts +103 -0
- package/tests/e2e/harness.spec.ts +104 -0
- package/tests/e2e/mcpLive.spec.ts +149 -0
- package/tests/e2e/newSession.e2e.spec.ts +245 -0
- package/tests/e2e/ralphLoopEnrichmentComparison.spec.ts +70 -0
- package/tests/e2e/workiqEnrichment.spec.ts +72 -0
- package/tests/e2e/zava-assessment/agent-interaction-script.md +258 -0
- package/tests/e2e/zava-assessment/company-profile.md +98 -0
- package/tests/e2e/zava-assessment/expected-results-checklist.md +454 -0
- package/tests/e2e/zavaSimulation.spec.ts +511 -0
- package/tests/fixtures/completedSession.json +141 -0
- package/tests/fixtures/test-fixture-project/package-lock.json +1585 -0
- package/tests/fixtures/test-fixture-project/package.json +12 -0
- package/tests/fixtures/test-fixture-project/src/add.ts +3 -0
- package/tests/fixtures/test-fixture-project/tests/failing.test.ts +7 -0
- package/tests/fixtures/test-fixture-project/tests/hanging.test.ts +9 -0
- package/tests/fixtures/test-fixture-project/tests/passing.test.ts +13 -0
- package/tests/fixtures/test-fixture-project/vitest.config.ts +7 -0
- package/tests/integration/autoStartConversation.spec.ts +168 -0
- package/tests/integration/defaultCommand.spec.ts +179 -0
- package/tests/integration/directCommandNonTty.spec.ts +260 -0
- package/tests/integration/directCommandTty.spec.ts +185 -0
- package/tests/integration/discoveryEnrichmentFlow.spec.ts +209 -0
- package/tests/integration/exportArtifacts.spec.ts +232 -0
- package/tests/integration/exportFallbackFlow.spec.ts +115 -0
- package/tests/integration/mcpDegradationFlow.spec.ts +231 -0
- package/tests/integration/mcpTransportFlow.spec.ts +178 -0
- package/tests/integration/newSessionFlow.spec.ts +406 -0
- package/tests/integration/pocGithubMcp.spec.ts +224 -0
- package/tests/integration/pocLocalFallback.spec.ts +205 -0
- package/tests/integration/pocScaffold.spec.ts +220 -0
- package/tests/integration/ralphLoopFlow.spec.ts +430 -0
- package/tests/integration/ralphLoopPartial.spec.ts +416 -0
- package/tests/integration/resumeAndBacktrack.spec.ts +278 -0
- package/tests/integration/spinnerLifecycle.spec.ts +270 -0
- package/tests/integration/summarizationFlow.spec.ts +135 -0
- package/tests/integration/testRunnerReal.spec.ts +63 -0
- package/tests/integration/webSearchAgent.spec.ts +155 -0
- package/tests/live/copilotSdkLive.spec.ts +149 -0
- package/tests/live/zavaFullWorkshop.spec.ts +515 -0
- package/tests/setup/loadEnv.ts +5 -0
- package/tests/unit/cli/developCommand.spec.ts +679 -0
- package/tests/unit/cli/directCommands.spec.ts +325 -0
- package/tests/unit/cli/envLoader.spec.ts +73 -0
- package/tests/unit/cli/ioContext.spec.ts +148 -0
- package/tests/unit/cli/preflight.spec.ts +125 -0
- package/tests/unit/cli/statusCommand.spec.ts +134 -0
- package/tests/unit/cli/workshopClientFallback.spec.ts +100 -0
- package/tests/unit/cli/workshopCommand.spec.ts +378 -0
- package/tests/unit/config/vitestEnvSetup.spec.ts +24 -0
- package/tests/unit/develop/checkpointState.spec.ts +378 -0
- package/tests/unit/develop/codeGenerator.spec.ts +447 -0
- package/tests/unit/develop/githubMcpAdapter.spec.ts +283 -0
- package/tests/unit/develop/mcpContextEnricher.spec.ts +564 -0
- package/tests/unit/develop/outputValidator.spec.ts +134 -0
- package/tests/unit/develop/pocScaffolder.spec.ts +451 -0
- package/tests/unit/develop/ralphLoop.spec.ts +1439 -0
- package/tests/unit/develop/templateRegistry.spec.ts +106 -0
- package/tests/unit/develop/testRunner.spec.ts +294 -0
- package/tests/unit/infraBicep.spec.ts +116 -0
- package/tests/unit/infraDeploy.spec.ts +102 -0
- package/tests/unit/infraTeardown.spec.ts +77 -0
- package/tests/unit/logging/logger.spec.ts +50 -0
- package/tests/unit/loop/conversationLoop.spec.ts +719 -0
- package/tests/unit/loop/phaseSummarizer.spec.ts +169 -0
- package/tests/unit/loop/streamingMarkdown.spec.ts +180 -0
- package/tests/unit/mcp/mcpManager.spec.ts +336 -0
- package/tests/unit/mcp/mcpTransport.spec.ts +689 -0
- package/tests/unit/mcp/retryPolicy.spec.ts +278 -0
- package/tests/unit/mcp/timeoutValidation.spec.ts +55 -0
- package/tests/unit/mcp/webSearch.spec.ts +718 -0
- package/tests/unit/phases/contextSummarizer.spec.ts +158 -0
- package/tests/unit/phases/discoveryEnricher.repeatCalls.spec.ts +125 -0
- package/tests/unit/phases/discoveryEnricher.spec.ts +512 -0
- package/tests/unit/phases/phaseExtractors.spec.ts +406 -0
- package/tests/unit/phases/phaseHandlers.spec.ts +483 -0
- package/tests/unit/prompts/promptLoader.spec.ts +144 -0
- package/tests/unit/schemas/pocSchemas.spec.ts +457 -0
- package/tests/unit/schemas/session.spec.ts +328 -0
- package/tests/unit/sessions/exportPaths.spec.ts +38 -0
- package/tests/unit/sessions/exportWriter.spec.ts +737 -0
- package/tests/unit/sessions/sessionManager.spec.ts +174 -0
- package/tests/unit/sessions/sessionStore.spec.ts +136 -0
- package/tests/unit/shared/activitySpinner.spec.ts +211 -0
- package/tests/unit/shared/cardsLoader.spec.ts +89 -0
- package/tests/unit/shared/copilotClient.spec.ts +185 -0
- package/tests/unit/shared/errorClassifier.spec.ts +152 -0
- package/tests/unit/shared/events.spec.ts +71 -0
- package/tests/unit/shared/markdownRenderer.spec.ts +42 -0
- package/tests/unit/shared/markdownRendererChunks.spec.ts +83 -0
- package/tests/unit/shared/tableRenderer.spec.ts +38 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +15 -0
- 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
|