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