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,70 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
|
|
5
|
+
import { z } from '../../vendor/zod';
|
|
6
|
+
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
|
|
9
|
+
// ── Schemas ──────────────────────────────────────────────────────────────────
|
|
10
|
+
|
|
11
|
+
const discoveryCardSchema = z.object({
|
|
12
|
+
cardId: z.string(),
|
|
13
|
+
category: z.string(),
|
|
14
|
+
title: z.string(),
|
|
15
|
+
description: z.string(),
|
|
16
|
+
typicalScenarios: z.array(z.string()),
|
|
17
|
+
azureServices: z.array(z.string()),
|
|
18
|
+
optionalCategory: z.string().optional(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const cardsDatasetSchema = z.object({
|
|
22
|
+
categories: z.array(z.string()),
|
|
23
|
+
cards: z.array(discoveryCardSchema),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// ── Types ────────────────────────────────────────────────────────────────────
|
|
27
|
+
|
|
28
|
+
export type CardCategory = string;
|
|
29
|
+
export type DiscoveryCardData = ReturnType<typeof discoveryCardSchema.parse>;
|
|
30
|
+
export type CardsDataset = ReturnType<typeof cardsDatasetSchema.parse>;
|
|
31
|
+
|
|
32
|
+
// ── Loader ───────────────────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
let cachedDataset: CardsDataset | null = null;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Load and validate the AI Discovery Cards dataset.
|
|
38
|
+
* The result is cached after the first load.
|
|
39
|
+
*/
|
|
40
|
+
export async function loadCardsDataset(): Promise<CardsDataset> {
|
|
41
|
+
if (cachedDataset) return cachedDataset;
|
|
42
|
+
|
|
43
|
+
const filePath = join(__dirname, "cards.json");
|
|
44
|
+
const raw = await readFile(filePath, "utf-8");
|
|
45
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
46
|
+
cachedDataset = cardsDatasetSchema.parse(parsed);
|
|
47
|
+
return cachedDataset;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get all cards in a specific category.
|
|
52
|
+
*/
|
|
53
|
+
export async function getCardsByCategory(category: string): Promise<DiscoveryCardData[]> {
|
|
54
|
+
const dataset = await loadCardsDataset();
|
|
55
|
+
return dataset.cards.filter((c: DiscoveryCardData) => c.category === category);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Search cards by keyword in title, description, or typicalScenarios.
|
|
60
|
+
*/
|
|
61
|
+
export async function searchCards(query: string): Promise<DiscoveryCardData[]> {
|
|
62
|
+
const dataset = await loadCardsDataset();
|
|
63
|
+
const lowerQuery = query.toLowerCase();
|
|
64
|
+
return dataset.cards.filter(
|
|
65
|
+
(c: DiscoveryCardData) =>
|
|
66
|
+
c.title.toLowerCase().includes(lowerQuery) ||
|
|
67
|
+
c.description.toLowerCase().includes(lowerQuery) ||
|
|
68
|
+
c.typicalScenarios.some((s: string) => s.toLowerCase().includes(lowerQuery)),
|
|
69
|
+
);
|
|
70
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized error classifier for sofIA CLI.
|
|
3
|
+
*
|
|
4
|
+
* Maps raw errors to well-defined categories with:
|
|
5
|
+
* - Recovery guidance (is it retryable?)
|
|
6
|
+
* - User-facing messages (no stack traces)
|
|
7
|
+
* - Category-based handling (MCP, auth, network, validation, etc.)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Types
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
export type ErrorCategory =
|
|
15
|
+
| 'connection'
|
|
16
|
+
| 'dns'
|
|
17
|
+
| 'timeout'
|
|
18
|
+
| 'auth'
|
|
19
|
+
| 'rate-limit'
|
|
20
|
+
| 'not-found'
|
|
21
|
+
| 'validation'
|
|
22
|
+
| 'mcp'
|
|
23
|
+
| 'internal';
|
|
24
|
+
|
|
25
|
+
export interface ErrorClassification {
|
|
26
|
+
category: ErrorCategory;
|
|
27
|
+
recoverable: boolean;
|
|
28
|
+
message: string;
|
|
29
|
+
originalError: unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Classification
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Classify any thrown value into a well-defined `ErrorClassification`.
|
|
38
|
+
*/
|
|
39
|
+
export function classifyError(err: unknown): ErrorClassification {
|
|
40
|
+
// Normalise to an Error-like shape
|
|
41
|
+
const error =
|
|
42
|
+
err instanceof Error
|
|
43
|
+
? err
|
|
44
|
+
: typeof err === 'string'
|
|
45
|
+
? new Error(err)
|
|
46
|
+
: new Error(String(err));
|
|
47
|
+
|
|
48
|
+
const code = (err as { code?: string }).code;
|
|
49
|
+
const statusCode = (err as { statusCode?: number }).statusCode;
|
|
50
|
+
|
|
51
|
+
// --- Network / system codes ---
|
|
52
|
+
if (code === 'ECONNREFUSED') {
|
|
53
|
+
return {
|
|
54
|
+
category: 'connection',
|
|
55
|
+
recoverable: true,
|
|
56
|
+
message: error.message,
|
|
57
|
+
originalError: err,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (code === 'ENOTFOUND') {
|
|
61
|
+
return {
|
|
62
|
+
category: 'dns',
|
|
63
|
+
recoverable: true,
|
|
64
|
+
message: error.message,
|
|
65
|
+
originalError: err,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (code === 'ETIMEDOUT' || code === 'ESOCKETTIMEDOUT') {
|
|
69
|
+
return {
|
|
70
|
+
category: 'timeout',
|
|
71
|
+
recoverable: true,
|
|
72
|
+
message: error.message,
|
|
73
|
+
originalError: err,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (code === 'ENOENT') {
|
|
77
|
+
return {
|
|
78
|
+
category: 'not-found',
|
|
79
|
+
recoverable: false,
|
|
80
|
+
message: error.message,
|
|
81
|
+
originalError: err,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// --- HTTP status codes ---
|
|
86
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
87
|
+
return {
|
|
88
|
+
category: 'auth',
|
|
89
|
+
recoverable: false,
|
|
90
|
+
message: error.message,
|
|
91
|
+
originalError: err,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (statusCode === 429) {
|
|
95
|
+
return {
|
|
96
|
+
category: 'rate-limit',
|
|
97
|
+
recoverable: true,
|
|
98
|
+
message: error.message,
|
|
99
|
+
originalError: err,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// --- Zod / validation errors ---
|
|
104
|
+
if (error.name === 'ZodError' || error.name === 'ZodValidationError') {
|
|
105
|
+
return {
|
|
106
|
+
category: 'validation',
|
|
107
|
+
recoverable: false,
|
|
108
|
+
message: error.message,
|
|
109
|
+
originalError: err,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// --- MCP server errors (heuristic: message mentions "MCP") ---
|
|
114
|
+
if (/\bmcp\b/i.test(error.message)) {
|
|
115
|
+
return {
|
|
116
|
+
category: 'mcp',
|
|
117
|
+
recoverable: true,
|
|
118
|
+
message: error.message,
|
|
119
|
+
originalError: err,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// --- Fallback ---
|
|
124
|
+
return {
|
|
125
|
+
category: 'internal',
|
|
126
|
+
recoverable: false,
|
|
127
|
+
message: error.message,
|
|
128
|
+
originalError: err,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
// User-facing messages
|
|
134
|
+
// ---------------------------------------------------------------------------
|
|
135
|
+
|
|
136
|
+
const USER_MESSAGES: Record<ErrorCategory, string> = {
|
|
137
|
+
connection:
|
|
138
|
+
'Unable to establish a connection. Please check that the service is running and try again.',
|
|
139
|
+
dns: 'DNS lookup failed — verify your network connection and that the hostname is correct.',
|
|
140
|
+
timeout:
|
|
141
|
+
'The request timed out. The service may be under heavy load; please try again shortly.',
|
|
142
|
+
auth: 'Authentication failed — please check your credentials or auth token and try again.',
|
|
143
|
+
'rate-limit':
|
|
144
|
+
'Rate limit exceeded. Please wait a moment before retrying.',
|
|
145
|
+
'not-found':
|
|
146
|
+
'The requested resource was not found. Verify the path or identifier and try again.',
|
|
147
|
+
validation:
|
|
148
|
+
'Data validation failed. The input or stored data does not match the expected schema.',
|
|
149
|
+
mcp: 'An MCP service encountered an error. It may be temporarily unavailable — retrying might help.',
|
|
150
|
+
internal:
|
|
151
|
+
'An unexpected error occurred. If the problem persists, please report it.',
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Convert a classification into a safe, user-facing message
|
|
156
|
+
* (never includes stack traces or internal details).
|
|
157
|
+
*/
|
|
158
|
+
export function toUserMessage(classification: ErrorClassification): string {
|
|
159
|
+
return USER_MESSAGES[classification.category];
|
|
160
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal event model for sofia CLI.
|
|
3
|
+
*
|
|
4
|
+
* Adapts Copilot SDK events into a stable internal model for the
|
|
5
|
+
* ConversationLoop, streaming renderer, and telemetry.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export type SofiaEventType =
|
|
9
|
+
| 'TextDelta'
|
|
10
|
+
| 'Activity'
|
|
11
|
+
| 'ToolCall'
|
|
12
|
+
| 'ToolResult'
|
|
13
|
+
| 'PhaseChanged'
|
|
14
|
+
| 'Error';
|
|
15
|
+
|
|
16
|
+
export interface BaseSofiaEvent {
|
|
17
|
+
type: SofiaEventType;
|
|
18
|
+
timestamp: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface TextDeltaEvent extends BaseSofiaEvent {
|
|
22
|
+
type: 'TextDelta';
|
|
23
|
+
text: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface ActivityEvent extends BaseSofiaEvent {
|
|
27
|
+
type: 'Activity';
|
|
28
|
+
message: string;
|
|
29
|
+
data?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ToolCallEvent extends BaseSofiaEvent {
|
|
33
|
+
type: 'ToolCall';
|
|
34
|
+
toolName: string;
|
|
35
|
+
args: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ToolResultEvent extends BaseSofiaEvent {
|
|
39
|
+
type: 'ToolResult';
|
|
40
|
+
toolName: string;
|
|
41
|
+
result: unknown;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface PhaseChangedEvent extends BaseSofiaEvent {
|
|
45
|
+
type: 'PhaseChanged';
|
|
46
|
+
fromPhase: string;
|
|
47
|
+
toPhase: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ErrorEvent extends BaseSofiaEvent {
|
|
51
|
+
type: 'Error';
|
|
52
|
+
code: string;
|
|
53
|
+
message: string;
|
|
54
|
+
details?: Record<string, unknown>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export type SofiaEvent =
|
|
58
|
+
| TextDeltaEvent
|
|
59
|
+
| ActivityEvent
|
|
60
|
+
| ToolCallEvent
|
|
61
|
+
| ToolResultEvent
|
|
62
|
+
| PhaseChangedEvent
|
|
63
|
+
| ErrorEvent;
|
|
64
|
+
|
|
65
|
+
// ── Factory functions ────────────────────────────────────────────────────────
|
|
66
|
+
|
|
67
|
+
function now(): string {
|
|
68
|
+
return new Date().toISOString();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function createTextDeltaEvent(text: string): TextDeltaEvent {
|
|
72
|
+
return { type: 'TextDelta', timestamp: now(), text };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function createActivityEvent(
|
|
76
|
+
message: string,
|
|
77
|
+
data?: Record<string, unknown>,
|
|
78
|
+
): ActivityEvent {
|
|
79
|
+
return { type: 'Activity', timestamp: now(), message, data };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function createToolCallEvent(
|
|
83
|
+
toolName: string,
|
|
84
|
+
args: Record<string, unknown>,
|
|
85
|
+
): ToolCallEvent {
|
|
86
|
+
return { type: 'ToolCall', timestamp: now(), toolName, args };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export function createToolResultEvent(toolName: string, result: unknown): ToolResultEvent {
|
|
90
|
+
return { type: 'ToolResult', timestamp: now(), toolName, result };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function createPhaseChangedEvent(fromPhase: string, toPhase: string): PhaseChangedEvent {
|
|
94
|
+
return { type: 'PhaseChanged', timestamp: now(), fromPhase, toPhase };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function createErrorEvent(
|
|
98
|
+
code: string,
|
|
99
|
+
message: string,
|
|
100
|
+
details?: Record<string, unknown>,
|
|
101
|
+
): ErrorEvent {
|
|
102
|
+
return { type: 'Error', timestamp: now(), code, message, details };
|
|
103
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown rendering helper.
|
|
3
|
+
*
|
|
4
|
+
* Uses marked + marked-terminal for rich TTY output.
|
|
5
|
+
* Falls back to plain text for non-TTY / JSON mode.
|
|
6
|
+
*/
|
|
7
|
+
import { Marked } from 'marked';
|
|
8
|
+
import { markedTerminal } from 'marked-terminal';
|
|
9
|
+
|
|
10
|
+
export interface RenderOptions {
|
|
11
|
+
isTTY?: boolean;
|
|
12
|
+
jsonMode?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Pre-configured marked instance for TTY rendering.
|
|
16
|
+
// Using a dedicated instance avoids stacking renderers
|
|
17
|
+
// on the global `marked` when renderMarkdown is called repeatedly.
|
|
18
|
+
const ttyMarked = new Marked(markedTerminal());
|
|
19
|
+
const plainMarked = new Marked();
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Render markdown to terminal-friendly output.
|
|
23
|
+
*
|
|
24
|
+
* - TTY mode: renders to ANSI-colored output
|
|
25
|
+
* - Non-TTY mode: strips ANSI, returns readable text
|
|
26
|
+
* - JSON mode: returns raw markdown unchanged
|
|
27
|
+
*/
|
|
28
|
+
export function renderMarkdown(markdown: string, options: RenderOptions = {}): string {
|
|
29
|
+
if (!markdown) return '';
|
|
30
|
+
|
|
31
|
+
const { isTTY = process.stdout.isTTY ?? false, jsonMode = false } = options;
|
|
32
|
+
|
|
33
|
+
// In JSON mode, return raw markdown for machine consumption
|
|
34
|
+
if (jsonMode) {
|
|
35
|
+
return markdown;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (isTTY) {
|
|
39
|
+
return ttyMarked.parse(markdown, { async: false }) as string;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Non-TTY: return plain text (strip markdown syntax minimally)
|
|
43
|
+
return plainMarked.parse(markdown, { async: false }) as string;
|
|
44
|
+
}
|