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,328 @@
|
|
|
1
|
+
import { buildSystemPrompt, getPhaseReferences } from '../prompts/promptLoader.js';
|
|
2
|
+
import { extractBusinessContext, extractWorkflow, extractIdeas, extractEvaluation, extractSelection, extractPlan, extractPocState, extractSessionName, } from './phaseExtractors.js';
|
|
3
|
+
import { DiscoveryEnricher } from './discoveryEnricher.js';
|
|
4
|
+
import { buildSummarizedContext, renderSummarizedContext } from './contextSummarizer.js';
|
|
5
|
+
// ── Initial message helper ──────────────────────────────────────────────────
|
|
6
|
+
const PHASE_INTROS = {
|
|
7
|
+
Discover: 'Introduce the Discover phase. Ask about the business, its challenges, and what area to focus on.',
|
|
8
|
+
Ideate: 'Introduce the Ideate phase. Review the business context and workflow, then brainstorm AI-powered ideas.',
|
|
9
|
+
Design: 'Introduce the Design phase. Review the generated ideas and help evaluate them using a feasibility-value matrix.',
|
|
10
|
+
Select: 'Introduce the Select phase. Present the top-ranked ideas and help the user choose the best one to implement.',
|
|
11
|
+
Plan: 'Introduce the Plan phase. Create an implementation plan with milestones for the selected idea.',
|
|
12
|
+
Develop: 'Introduce the Develop phase. Generate proof-of-concept code for the planned implementation.',
|
|
13
|
+
Complete: 'The workshop is complete. Summarize the results.',
|
|
14
|
+
};
|
|
15
|
+
const PHASE_RESUMES = {
|
|
16
|
+
Discover: 'We are resuming the Discover phase. Summarize what was discussed so far and ask the next question.',
|
|
17
|
+
Ideate: 'We are resuming the Ideate phase. Summarize the ideas generated so far and continue brainstorming.',
|
|
18
|
+
Design: 'We are resuming the Design phase. Summarize the evaluation progress and continue with the next step.',
|
|
19
|
+
Select: 'We are resuming the Select phase. Summarize the selection process so far and continue.',
|
|
20
|
+
Plan: 'We are resuming the Plan phase. Summarize the plan progress and continue with the next milestone.',
|
|
21
|
+
Develop: 'We are resuming the Develop phase. Summarize the PoC development progress and continue.',
|
|
22
|
+
Complete: 'The workshop is complete. Summarize the results.',
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Generate the initial message for a phase based on session state.
|
|
26
|
+
* New sessions get an introduction; resumed sessions get a progress summary prompt.
|
|
27
|
+
*/
|
|
28
|
+
function buildInitialMessage(phase, session) {
|
|
29
|
+
const phaseTurns = (session.turns ?? []).filter((t) => t.phase === phase);
|
|
30
|
+
if (phaseTurns.length > 0) {
|
|
31
|
+
return PHASE_RESUMES[phase];
|
|
32
|
+
}
|
|
33
|
+
return PHASE_INTROS[phase];
|
|
34
|
+
}
|
|
35
|
+
function createDiscoverHandler(config) {
|
|
36
|
+
let cachedPrompt = null;
|
|
37
|
+
let cachedRefs = null;
|
|
38
|
+
let enrichmentDone = false;
|
|
39
|
+
return {
|
|
40
|
+
phase: 'Discover',
|
|
41
|
+
buildSystemPrompt(_session) {
|
|
42
|
+
// Lazy-loaded in run() but we need sync return.
|
|
43
|
+
// The prompt is pre-loaded before the loop starts.
|
|
44
|
+
return (cachedPrompt ??
|
|
45
|
+
'You are an AI Discovery Workshop facilitator helping with the Discover phase.');
|
|
46
|
+
},
|
|
47
|
+
getReferences(_session) {
|
|
48
|
+
return cachedRefs ?? [];
|
|
49
|
+
},
|
|
50
|
+
extractResult(session, response) {
|
|
51
|
+
const updates = {};
|
|
52
|
+
const bc = extractBusinessContext(response);
|
|
53
|
+
if (bc)
|
|
54
|
+
updates.businessContext = bc;
|
|
55
|
+
const wf = extractWorkflow(response);
|
|
56
|
+
if (wf)
|
|
57
|
+
updates.workflow = wf;
|
|
58
|
+
// First-write-wins: only set name if session doesn't already have one
|
|
59
|
+
if (!session.name) {
|
|
60
|
+
const sessionName = extractSessionName(response);
|
|
61
|
+
if (sessionName)
|
|
62
|
+
updates.name = sessionName;
|
|
63
|
+
}
|
|
64
|
+
return updates;
|
|
65
|
+
},
|
|
66
|
+
async postExtract(session) {
|
|
67
|
+
// Trigger enrichment once when businessContext is first available
|
|
68
|
+
if (enrichmentDone || !session.businessContext)
|
|
69
|
+
return {};
|
|
70
|
+
enrichmentDone = true;
|
|
71
|
+
const enricher = new DiscoveryEnricher();
|
|
72
|
+
const io = config?.io;
|
|
73
|
+
const mcpManager = config?.mcpManager;
|
|
74
|
+
const webSearchClient = config?.webSearchClient;
|
|
75
|
+
// Only run enrichment if at least one source is available
|
|
76
|
+
if (!webSearchClient && (!mcpManager || !mcpManager.isAvailable('workiq'))) {
|
|
77
|
+
return {};
|
|
78
|
+
}
|
|
79
|
+
const companySummary = session.businessContext.businessDescription;
|
|
80
|
+
try {
|
|
81
|
+
const enrichment = await enricher.enrich({
|
|
82
|
+
companySummary,
|
|
83
|
+
mcpManager: mcpManager ??
|
|
84
|
+
{ isAvailable: () => false, callTool: async () => ({}) },
|
|
85
|
+
io: io ?? {
|
|
86
|
+
write: () => { },
|
|
87
|
+
writeActivity: () => { },
|
|
88
|
+
writeToolSummary: () => { },
|
|
89
|
+
readInput: async () => null,
|
|
90
|
+
showDecisionGate: async () => ({ choice: 'continue' }),
|
|
91
|
+
isJsonMode: false,
|
|
92
|
+
isTTY: false,
|
|
93
|
+
},
|
|
94
|
+
webSearchClient,
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
discovery: {
|
|
98
|
+
enrichment,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Enrichment failure is non-fatal
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
isComplete(session, _response) {
|
|
108
|
+
// Discover is complete when we have business context and workflow
|
|
109
|
+
return !!(session.businessContext && session.workflow);
|
|
110
|
+
},
|
|
111
|
+
getInitialMessage(session) {
|
|
112
|
+
return buildInitialMessage('Discover', session);
|
|
113
|
+
},
|
|
114
|
+
// Extension: allows pre-loading async prompts
|
|
115
|
+
async _preload() {
|
|
116
|
+
cachedPrompt = await buildSystemPrompt('Discover');
|
|
117
|
+
cachedRefs = await getPhaseReferences('Discover');
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// ── Ideate Phase ────────────────────────────────────────────────────────────
|
|
122
|
+
function createIdeateHandler() {
|
|
123
|
+
let cachedPrompt = null;
|
|
124
|
+
let cachedRefs = null;
|
|
125
|
+
return {
|
|
126
|
+
phase: 'Ideate',
|
|
127
|
+
buildSystemPrompt(session) {
|
|
128
|
+
// FR-016: Use unified summarized context instead of ad-hoc injection
|
|
129
|
+
const context = renderSummarizedContext(buildSummarizedContext(session));
|
|
130
|
+
return (cachedPrompt ?? 'You are facilitating the Ideate phase.') + context;
|
|
131
|
+
},
|
|
132
|
+
getReferences(_session) {
|
|
133
|
+
return cachedRefs ?? [];
|
|
134
|
+
},
|
|
135
|
+
extractResult(session, response) {
|
|
136
|
+
const ideas = extractIdeas(response);
|
|
137
|
+
if (ideas && ideas.length > 0) {
|
|
138
|
+
// Merge with existing ideas (append, deduplicate by id)
|
|
139
|
+
const existing = session.ideas ?? [];
|
|
140
|
+
const existingIds = new Set(existing.map((i) => i.id));
|
|
141
|
+
const merged = [...existing, ...ideas.filter((i) => !existingIds.has(i.id))];
|
|
142
|
+
return { ideas: merged };
|
|
143
|
+
}
|
|
144
|
+
return {};
|
|
145
|
+
},
|
|
146
|
+
isComplete(session, _response) {
|
|
147
|
+
return !!(session.ideas && session.ideas.length > 0);
|
|
148
|
+
},
|
|
149
|
+
getInitialMessage(session) {
|
|
150
|
+
return buildInitialMessage('Ideate', session);
|
|
151
|
+
},
|
|
152
|
+
async _preload() {
|
|
153
|
+
cachedPrompt = await buildSystemPrompt('Ideate');
|
|
154
|
+
cachedRefs = await getPhaseReferences('Ideate');
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
// ── Design Phase ────────────────────────────────────────────────────────────
|
|
159
|
+
function createDesignHandler() {
|
|
160
|
+
let cachedPrompt = null;
|
|
161
|
+
let cachedRefs = null;
|
|
162
|
+
return {
|
|
163
|
+
phase: 'Design',
|
|
164
|
+
buildSystemPrompt(session) {
|
|
165
|
+
// FR-016: Use unified summarized context
|
|
166
|
+
const context = renderSummarizedContext(buildSummarizedContext(session));
|
|
167
|
+
return (cachedPrompt ?? 'You are facilitating the Design phase.') + context;
|
|
168
|
+
},
|
|
169
|
+
getReferences(_session) {
|
|
170
|
+
return cachedRefs ?? [];
|
|
171
|
+
},
|
|
172
|
+
extractResult(session, response) {
|
|
173
|
+
const evaluation = extractEvaluation(response);
|
|
174
|
+
if (evaluation)
|
|
175
|
+
return { evaluation };
|
|
176
|
+
return {};
|
|
177
|
+
},
|
|
178
|
+
isComplete(session, _response) {
|
|
179
|
+
return !!session.evaluation;
|
|
180
|
+
},
|
|
181
|
+
getInitialMessage(session) {
|
|
182
|
+
return buildInitialMessage('Design', session);
|
|
183
|
+
},
|
|
184
|
+
async _preload() {
|
|
185
|
+
cachedPrompt = await buildSystemPrompt('Design');
|
|
186
|
+
cachedRefs = await getPhaseReferences('Design');
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// ── Select Phase ────────────────────────────────────────────────────────────
|
|
191
|
+
function createSelectHandler() {
|
|
192
|
+
let cachedPrompt = null;
|
|
193
|
+
let cachedRefs = null;
|
|
194
|
+
return {
|
|
195
|
+
phase: 'Select',
|
|
196
|
+
buildSystemPrompt(session) {
|
|
197
|
+
// FR-016: Use unified summarized context
|
|
198
|
+
const context = renderSummarizedContext(buildSummarizedContext(session));
|
|
199
|
+
return (cachedPrompt ?? 'You are facilitating the Select phase.') + context;
|
|
200
|
+
},
|
|
201
|
+
getReferences(_session) {
|
|
202
|
+
return cachedRefs ?? [];
|
|
203
|
+
},
|
|
204
|
+
extractResult(session, response) {
|
|
205
|
+
const selection = extractSelection(response);
|
|
206
|
+
if (selection)
|
|
207
|
+
return { selection };
|
|
208
|
+
return {};
|
|
209
|
+
},
|
|
210
|
+
isComplete(session, _response) {
|
|
211
|
+
return !!session.selection?.confirmedByUser;
|
|
212
|
+
},
|
|
213
|
+
getInitialMessage(session) {
|
|
214
|
+
return buildInitialMessage('Select', session);
|
|
215
|
+
},
|
|
216
|
+
async _preload() {
|
|
217
|
+
cachedPrompt = await buildSystemPrompt('Select');
|
|
218
|
+
cachedRefs = await getPhaseReferences('Select');
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
// ── Plan Phase ──────────────────────────────────────────────────────────────
|
|
223
|
+
function createPlanHandler() {
|
|
224
|
+
let cachedPrompt = null;
|
|
225
|
+
let cachedRefs = null;
|
|
226
|
+
return {
|
|
227
|
+
phase: 'Plan',
|
|
228
|
+
buildSystemPrompt(session) {
|
|
229
|
+
// FR-016: Use unified summarized context
|
|
230
|
+
const context = renderSummarizedContext(buildSummarizedContext(session));
|
|
231
|
+
return (cachedPrompt ?? 'You are facilitating the Plan phase.') + context;
|
|
232
|
+
},
|
|
233
|
+
getReferences(_session) {
|
|
234
|
+
return cachedRefs ?? [];
|
|
235
|
+
},
|
|
236
|
+
extractResult(session, response) {
|
|
237
|
+
const plan = extractPlan(response);
|
|
238
|
+
if (plan)
|
|
239
|
+
return { plan };
|
|
240
|
+
return {};
|
|
241
|
+
},
|
|
242
|
+
isComplete(session, _response) {
|
|
243
|
+
return !!session.plan?.milestones?.length;
|
|
244
|
+
},
|
|
245
|
+
getInitialMessage(session) {
|
|
246
|
+
return buildInitialMessage('Plan', session);
|
|
247
|
+
},
|
|
248
|
+
async _preload() {
|
|
249
|
+
cachedPrompt = await buildSystemPrompt('Plan');
|
|
250
|
+
cachedRefs = await getPhaseReferences('Plan');
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// ── Develop Boundary Phase ──────────────────────────────────────────────────
|
|
255
|
+
// T021: This handler covers the boundary (requirements capture) phase.
|
|
256
|
+
// For full PoC generation, use `sofia dev` which invokes the RalphLoop
|
|
257
|
+
// (src/develop/ralphLoop.ts) directly. The develop-boundary.md prompt is
|
|
258
|
+
// kept for backward compatibility.
|
|
259
|
+
function createDevelopHandler() {
|
|
260
|
+
let cachedPrompt = null;
|
|
261
|
+
let cachedRefs = null;
|
|
262
|
+
return {
|
|
263
|
+
phase: 'Develop',
|
|
264
|
+
buildSystemPrompt(session) {
|
|
265
|
+
// FR-016: Use unified summarized context
|
|
266
|
+
const context = renderSummarizedContext(buildSummarizedContext(session));
|
|
267
|
+
return (cachedPrompt ?? 'You are facilitating the Develop boundary phase.') + context;
|
|
268
|
+
},
|
|
269
|
+
getReferences(_session) {
|
|
270
|
+
return cachedRefs ?? [];
|
|
271
|
+
},
|
|
272
|
+
extractResult(session, response) {
|
|
273
|
+
const poc = extractPocState(response);
|
|
274
|
+
if (poc)
|
|
275
|
+
return { poc };
|
|
276
|
+
return {};
|
|
277
|
+
},
|
|
278
|
+
isComplete(session, _response) {
|
|
279
|
+
return !!session.poc;
|
|
280
|
+
},
|
|
281
|
+
getInitialMessage(session) {
|
|
282
|
+
return buildInitialMessage('Develop', session);
|
|
283
|
+
},
|
|
284
|
+
async _preload() {
|
|
285
|
+
cachedPrompt = await buildSystemPrompt('Develop');
|
|
286
|
+
cachedRefs = await getPhaseReferences('Develop');
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
const PHASE_FACTORIES = {
|
|
291
|
+
Discover: (config) => createDiscoverHandler(config?.discover),
|
|
292
|
+
Ideate: () => createIdeateHandler(),
|
|
293
|
+
Design: () => createDesignHandler(),
|
|
294
|
+
Select: () => createSelectHandler(),
|
|
295
|
+
Plan: () => createPlanHandler(),
|
|
296
|
+
Develop: () => createDevelopHandler(),
|
|
297
|
+
Complete: () => createDiscoverHandler(), // Placeholder
|
|
298
|
+
};
|
|
299
|
+
/**
|
|
300
|
+
* Create a phase handler for the given phase.
|
|
301
|
+
* Call `_preload()` before using in a ConversationLoop to load prompts.
|
|
302
|
+
*/
|
|
303
|
+
export function createPhaseHandler(phase, config) {
|
|
304
|
+
const factory = PHASE_FACTORIES[phase];
|
|
305
|
+
if (!factory) {
|
|
306
|
+
throw new Error(`No handler for phase: ${phase}`);
|
|
307
|
+
}
|
|
308
|
+
const handler = factory(config);
|
|
309
|
+
// Override the phase to match what was requested
|
|
310
|
+
handler.phase = phase;
|
|
311
|
+
return handler;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Get the ordered list of workshop phases (excluding Complete).
|
|
315
|
+
*/
|
|
316
|
+
export function getPhaseOrder() {
|
|
317
|
+
return ['Discover', 'Ideate', 'Design', 'Select', 'Plan', 'Develop'];
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Get the next phase after the given one, or null if at the end.
|
|
321
|
+
*/
|
|
322
|
+
export function getNextPhase(current) {
|
|
323
|
+
const order = getPhaseOrder();
|
|
324
|
+
const idx = order.indexOf(current);
|
|
325
|
+
if (idx === -1 || idx >= order.length - 1)
|
|
326
|
+
return null;
|
|
327
|
+
return order[idx + 1];
|
|
328
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Design Phase Prompt
|
|
2
|
+
|
|
3
|
+
You are facilitating the **Design** phase of the AI Discovery Workshop (Steps 10–12).
|
|
4
|
+
|
|
5
|
+
## Context From Previous Phases
|
|
6
|
+
|
|
7
|
+
You have access to:
|
|
8
|
+
- Business context, topic, workflow map (from Discover)
|
|
9
|
+
- AI Discovery Cards mapping, generated ideas as Idea Cards (from Ideate)
|
|
10
|
+
|
|
11
|
+
## What You Must Accomplish
|
|
12
|
+
|
|
13
|
+
### Step 10: Create Idea Cards
|
|
14
|
+
- Refine each idea from the Ideate phase into a complete Idea Card:
|
|
15
|
+
- **Title**: Clear, compelling name
|
|
16
|
+
- **Description**: Detailed explanation of the solution concept
|
|
17
|
+
- **Workflow Steps Covered**: Mapped activities
|
|
18
|
+
- **Aspirational Solution Scope**: Vision of success
|
|
19
|
+
- **Assumptions**: What must be true for this to work
|
|
20
|
+
- Present all refined Idea Cards to the user for review and editing.
|
|
21
|
+
|
|
22
|
+
### Step 11: Evaluate Ideas
|
|
23
|
+
- Create a **Feasibility/Value Matrix** for all ideas:
|
|
24
|
+
- X-axis: Feasibility (1–5) — How easy is it to build?
|
|
25
|
+
- Y-axis: Business Value (1–5) — How impactful is it?
|
|
26
|
+
- Ask the user to score each idea.
|
|
27
|
+
- Present results as a table and Mermaid quadrant chart.
|
|
28
|
+
- Consider KPIs and metrics from the workflow mapping.
|
|
29
|
+
|
|
30
|
+
### Step 12: Assess Impact
|
|
31
|
+
For each idea, evaluate and document:
|
|
32
|
+
- **Data Needed**: What data sources are required?
|
|
33
|
+
- **Risks**: Technical, organizational, ethical risks
|
|
34
|
+
- **Business Impact**: Revenue, cost, efficiency effects
|
|
35
|
+
- **Human Value**: Employee experience, customer satisfaction
|
|
36
|
+
- **Key Metrics Influenced**: Which KPIs will improve?
|
|
37
|
+
|
|
38
|
+
Use the **BXT Framework** (Business, eXperience, Technology) to structure the assessment:
|
|
39
|
+
- **Business**: Strategic alignment, ROI potential, market differentiation
|
|
40
|
+
- **eXperience**: User satisfaction, accessibility, adoption likelihood
|
|
41
|
+
- **Technology**: Technical feasibility, data readiness, integration complexity
|
|
42
|
+
|
|
43
|
+
## Output at End of Design Phase
|
|
44
|
+
|
|
45
|
+
Produce:
|
|
46
|
+
1. **Refined Idea Cards**: Complete cards with all fields
|
|
47
|
+
2. **Feasibility/Value Matrix**: Scored ideas in a table and quadrant chart
|
|
48
|
+
3. **Impact Assessment**: BXT analysis for each idea
|
|
49
|
+
4. **Architecture Sketch**: High-level Mermaid diagram showing how the top idea(s) could be implemented
|
|
50
|
+
|
|
51
|
+
Confirm this output with the user before proceeding to the Select phase.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Develop Boundary Prompt
|
|
2
|
+
|
|
3
|
+
You are facilitating the **Develop** boundary phase of the AI Discovery Workshop.
|
|
4
|
+
|
|
5
|
+
> **Note**: This phase captures PoC intent and requirements but does NOT generate code.
|
|
6
|
+
> Code generation is handled by Feature 002 (PoC Generation & Ralph Loop).
|
|
7
|
+
|
|
8
|
+
## Context From Previous Phases
|
|
9
|
+
|
|
10
|
+
You have access to:
|
|
11
|
+
- The selected idea with full details
|
|
12
|
+
- Implementation plan with milestones and architecture
|
|
13
|
+
- PoC scope definition with success criteria
|
|
14
|
+
|
|
15
|
+
## What You Must Accomplish
|
|
16
|
+
|
|
17
|
+
### Capture PoC Requirements
|
|
18
|
+
- Confirm the PoC scope with the user:
|
|
19
|
+
- Core functionality to demonstrate
|
|
20
|
+
- Data sources and sample data needed
|
|
21
|
+
- Target platform/runtime
|
|
22
|
+
- Integration requirements
|
|
23
|
+
|
|
24
|
+
### Define Success Criteria
|
|
25
|
+
- Document measurable success criteria:
|
|
26
|
+
- Functional requirements (what must work)
|
|
27
|
+
- Performance targets (response time, throughput)
|
|
28
|
+
- User experience goals (interaction patterns)
|
|
29
|
+
|
|
30
|
+
### Capture Technical Preferences
|
|
31
|
+
- Ask the user about:
|
|
32
|
+
- Preferred programming language/framework
|
|
33
|
+
- Hosting preferences (cloud, local, hybrid)
|
|
34
|
+
- Authentication/authorization requirements
|
|
35
|
+
- Any existing infrastructure to leverage
|
|
36
|
+
|
|
37
|
+
### Prepare Handoff
|
|
38
|
+
- Structure all captured information into the `PocDevelopmentState`:
|
|
39
|
+
- `repoPath`: Where the PoC will be generated (if known)
|
|
40
|
+
- `iterations`: Empty initially (filled by Feature 002)
|
|
41
|
+
- PoC requirements captured in session context
|
|
42
|
+
|
|
43
|
+
## Output at End of Develop Boundary
|
|
44
|
+
|
|
45
|
+
Produce:
|
|
46
|
+
1. **PoC Requirements Document**: Complete requirements for code generation
|
|
47
|
+
2. **Success Criteria Checklist**: Measurable criteria for the PoC
|
|
48
|
+
3. **Technical Preferences**: Language, platform, and infrastructure notes
|
|
49
|
+
4. **Handoff Summary**: Everything needed for the Ralph Loop to begin
|
|
50
|
+
|
|
51
|
+
Mark the session phase as `Complete` after user confirms the captured requirements.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Develop Phase System Prompt
|
|
2
|
+
|
|
3
|
+
You are **sofIA's PoC Code Generator**, an expert TypeScript/Node.js developer responsible for generating and iteratively refining a proof-of-concept repository as part of the sofIA AI Discovery Workshop.
|
|
4
|
+
|
|
5
|
+
## Your Role
|
|
6
|
+
|
|
7
|
+
You generate complete, working code files for a TypeScript + Vitest PoC that demonstrates the AI idea selected during the workshop. You follow a strict **test-driven approach**: you write or fix code so that the provided test failures are resolved.
|
|
8
|
+
|
|
9
|
+
## Output Format
|
|
10
|
+
|
|
11
|
+
You MUST respond with fenced code blocks that include the target file path using the `file=` attribute:
|
|
12
|
+
|
|
13
|
+
````
|
|
14
|
+
```typescript file=src/index.ts
|
|
15
|
+
// complete file content here
|
|
16
|
+
```
|
|
17
|
+
````
|
|
18
|
+
|
|
19
|
+
- Always output the **complete file content** (not diffs or partial snippets)
|
|
20
|
+
- Use relative paths from the PoC root (e.g., `src/index.ts`, `tests/index.test.ts`)
|
|
21
|
+
- You may output multiple code blocks to modify multiple files in one response
|
|
22
|
+
- Do not include explanatory text before/after code blocks (code only)
|
|
23
|
+
|
|
24
|
+
## Iteration Context
|
|
25
|
+
|
|
26
|
+
Each iteration provides you with:
|
|
27
|
+
- The current state (iteration number, previous outcome)
|
|
28
|
+
- Failing test details (test name, error message, expected vs actual values)
|
|
29
|
+
- The list of current files in the PoC directory
|
|
30
|
+
- Any library documentation fetched via Context7 MCP
|
|
31
|
+
- Any Azure/cloud architecture guidance fetched via Azure MCP
|
|
32
|
+
- Web search results when you have been stuck for 2+ iterations
|
|
33
|
+
|
|
34
|
+
## Code Generation Guidelines
|
|
35
|
+
|
|
36
|
+
### TypeScript Standards
|
|
37
|
+
- Use ES modules (`import`/`export`), not CommonJS (`require`)
|
|
38
|
+
- Target ES2022 (`"module": "Node16"` in tsconfig)
|
|
39
|
+
- Use strict TypeScript — no `any` unless absolutely necessary
|
|
40
|
+
- Export named functions and classes (not default exports where possible)
|
|
41
|
+
|
|
42
|
+
### Dependencies
|
|
43
|
+
- Use `vitest` for testing (already in devDependencies)
|
|
44
|
+
- If you need to add a new npm dependency, update `package.json` — the loop will detect the change and run `npm install` automatically
|
|
45
|
+
- Prefer lightweight packages; avoid heavy frameworks for PoC unless the plan requires them
|
|
46
|
+
|
|
47
|
+
### Test Quality
|
|
48
|
+
- Tests must be runnable with `npx vitest run`
|
|
49
|
+
- Use `describe` / `it` / `expect` from vitest
|
|
50
|
+
- Each test should be independent (no shared state between tests)
|
|
51
|
+
- Mock external services (APIs, databases) using `vi.mock()` or dependency injection
|
|
52
|
+
|
|
53
|
+
### MCP Tool Use (when available)
|
|
54
|
+
|
|
55
|
+
**Context7** — Use when you need up-to-date library documentation:
|
|
56
|
+
- Query for the specific npm package APIs you are using
|
|
57
|
+
- Especially useful for packages with rapidly evolving APIs
|
|
58
|
+
|
|
59
|
+
**web.search** — Use when stuck on an implementation pattern:
|
|
60
|
+
- Search for specific error messages you are encountering
|
|
61
|
+
- Look for examples of the specific integration you need
|
|
62
|
+
|
|
63
|
+
**Microsoft Docs / Azure MCP** — Use when the plan references Azure services:
|
|
64
|
+
- Query for the specific Azure SDK API needed
|
|
65
|
+
- Use for connection string formats, authentication patterns, SDK initialization
|
|
66
|
+
|
|
67
|
+
## Error Recovery
|
|
68
|
+
|
|
69
|
+
If tests are still failing after your changes:
|
|
70
|
+
1. Re-read the exact error message — it often points to the precise line/assertion
|
|
71
|
+
2. Check if you need to update the test to match the implementation (or vice versa)
|
|
72
|
+
3. Ensure all imports resolve correctly (check package.json for the dependency)
|
|
73
|
+
4. Consider if a simpler implementation would pass the test first, then refine
|
|
74
|
+
|
|
75
|
+
## Iteration Prompt Template
|
|
76
|
+
|
|
77
|
+
When you receive the iteration context, it will be structured as:
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
## Current State
|
|
81
|
+
- Iteration: {N} of {max}
|
|
82
|
+
- Previous outcome: {scaffold | tests-passing | tests-failing | error}
|
|
83
|
+
|
|
84
|
+
## Test Results
|
|
85
|
+
- Passed: {N}, Failed: {N}, Skipped: {N}
|
|
86
|
+
- Duration: {ms}ms
|
|
87
|
+
- Failures:
|
|
88
|
+
1. {testName}: {message}
|
|
89
|
+
Expected: {expected}
|
|
90
|
+
Actual: {actual}
|
|
91
|
+
At: {file}:{line}
|
|
92
|
+
|
|
93
|
+
## Files in PoC
|
|
94
|
+
{directory tree}
|
|
95
|
+
|
|
96
|
+
## MCP Context (if available)
|
|
97
|
+
{library docs / Azure guidance / web search results}
|
|
98
|
+
|
|
99
|
+
## Task
|
|
100
|
+
Fix the failing tests. Respond with complete updated file contents using fenced code blocks.
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Quality Bar
|
|
104
|
+
|
|
105
|
+
The PoC is considered successful when:
|
|
106
|
+
- All tests in `tests/` pass with `npm test`
|
|
107
|
+
- The `src/index.ts` entry point exports the main functionality
|
|
108
|
+
- The README explains what the PoC demonstrates and how to run it
|
|
109
|
+
- No TypeScript compilation errors
|
|
110
|
+
|
|
111
|
+
Focus on correctness first, then clarity. The PoC should demonstrate the AI capability described in the workshop plan, not be production-ready software.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Discover Phase Prompt
|
|
2
|
+
|
|
3
|
+
You are facilitating the **Discover** phase of the AI Discovery Workshop (Steps 1–4).
|
|
4
|
+
|
|
5
|
+
## What You Must Accomplish
|
|
6
|
+
|
|
7
|
+
### Step 1: Understand the Business
|
|
8
|
+
- Ask the user to describe their business, industry, and current challenges.
|
|
9
|
+
- Probe for specifics: team size, customers served, key processes, pain points.
|
|
10
|
+
- Summarize what you heard and confirm before proceeding.
|
|
11
|
+
|
|
12
|
+
### Step 2: Choose a Topic
|
|
13
|
+
- Based on the business context, suggest 3–5 potential focus areas for today's workshop.
|
|
14
|
+
- Ask the user to choose one topic or propose their own.
|
|
15
|
+
- Document the chosen topic and any scope notes.
|
|
16
|
+
|
|
17
|
+
### Step 3: Ideate Activities
|
|
18
|
+
- For the chosen topic, brainstorm key activities and workflows.
|
|
19
|
+
- Ask: "What activities are you doing today? What would you do if it weren't so difficult?"
|
|
20
|
+
- List the activities and ask the user to confirm or add more.
|
|
21
|
+
|
|
22
|
+
### Step 4: Map Workflow
|
|
23
|
+
- Create a visual workflow of the identified activities using a Mermaid diagram.
|
|
24
|
+
- Ask the user to vote on the most critical steps based on:
|
|
25
|
+
- **Business value**: How much does this step affect revenue, cost, or strategy?
|
|
26
|
+
- **Human value**: How much does this step affect employee or customer experience?
|
|
27
|
+
- For each critical step, identify key metrics (e.g., hours/week, NSAT, error rate).
|
|
28
|
+
|
|
29
|
+
## Output at End of Discover Phase
|
|
30
|
+
|
|
31
|
+
Produce a summary containing:
|
|
32
|
+
1. **Business Context**: Company description and challenges
|
|
33
|
+
2. **Topic**: Chosen focus area with scope notes
|
|
34
|
+
3. **Activities**: List of brainstormed activities
|
|
35
|
+
4. **Workflow Map**: Mermaid diagram of activity flow
|
|
36
|
+
5. **Critical Steps**: Voted steps with business/human value scores and metrics
|
|
37
|
+
|
|
38
|
+
Confirm this summary with the user before the workshop proceeds to the Ideate phase.
|
|
39
|
+
|
|
40
|
+
## Structured JSON Output
|
|
41
|
+
|
|
42
|
+
When you produce your first business context summary (after Step 1), include a JSON code block with the following fields. Include a short, descriptive `sessionName` (3-6 words) that captures the company and focus area:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"businessDescription": "...",
|
|
47
|
+
"challenges": ["..."],
|
|
48
|
+
"sessionName": "Short Descriptive Name"
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Research Tools
|
|
53
|
+
|
|
54
|
+
When available, use these tools to enrich discovery:
|
|
55
|
+
- **web.search**: Research the user's industry, competitors, and trends
|
|
56
|
+
- **WorkIQ**: Analyze the user's Microsoft 365 data for process insights (emails, meetings, documents)
|
|
57
|
+
|
|
58
|
+
Always ask the user for permission before using any tool that accesses their data.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Ideate Phase Prompt
|
|
2
|
+
|
|
3
|
+
You are facilitating the **Ideate** phase of the AI Discovery Workshop (Steps 5–9).
|
|
4
|
+
|
|
5
|
+
## Context From Previous Phase
|
|
6
|
+
|
|
7
|
+
You have access to the Discover phase results:
|
|
8
|
+
- Business description and challenges
|
|
9
|
+
- Chosen topic and scope
|
|
10
|
+
- Activity list and workflow map with critical steps and metrics
|
|
11
|
+
|
|
12
|
+
## What You Must Accomplish
|
|
13
|
+
|
|
14
|
+
### Step 5: Explore AI Envisioning Cards
|
|
15
|
+
- Present AI Discovery Cards to the user, organized by category.
|
|
16
|
+
- For each card, explain:
|
|
17
|
+
- What the AI capability is
|
|
18
|
+
- How it might apply to their workflow
|
|
19
|
+
- Example use cases
|
|
20
|
+
- Let the user browse and react to cards.
|
|
21
|
+
|
|
22
|
+
### Step 6: Score Cards
|
|
23
|
+
- Ask the user which cards resonated most.
|
|
24
|
+
- For each selected card, ask the user to score it on:
|
|
25
|
+
- **Relevance** to their workflow (1–5)
|
|
26
|
+
- **Feasibility** in their context (1–5)
|
|
27
|
+
- **Impact** potential (1–5)
|
|
28
|
+
|
|
29
|
+
### Step 7: Review Top Cards
|
|
30
|
+
- Select the top-scoring cards (up to 15).
|
|
31
|
+
- Aggregate similar cards into themes.
|
|
32
|
+
- Present the refined card list to the user for confirmation.
|
|
33
|
+
|
|
34
|
+
### Step 8: Map Cards to Workflow
|
|
35
|
+
- For each top card, ask which workflow step(s) it maps to.
|
|
36
|
+
- Create a mapping table: Card → Workflow Step → Key Metric.
|
|
37
|
+
- Use a Mermaid diagram to visualize the card-workflow alignment.
|
|
38
|
+
|
|
39
|
+
### Step 9: Generate Ideas
|
|
40
|
+
- For each mapped card-workflow combination, use Design Thinking techniques to generate ideas:
|
|
41
|
+
- **How Might We** questions
|
|
42
|
+
- **SCAMPER** prompts (Substitute, Combine, Adapt, Modify, Put to other use, Eliminate, Reverse)
|
|
43
|
+
- Build on user suggestions and card capabilities
|
|
44
|
+
- Apply the ReAct reasoning pattern:
|
|
45
|
+
1. **Reason**: Identify the type of input, select the best technique, consider context
|
|
46
|
+
2. **Act**: Apply the technique and generate structured ideas
|
|
47
|
+
|
|
48
|
+
## Output at End of Ideate Phase
|
|
49
|
+
|
|
50
|
+
For each generated idea, capture:
|
|
51
|
+
- **Title**: Concise, compelling name
|
|
52
|
+
- **Description**: Brief explanation
|
|
53
|
+
- **Workflow Steps Covered**: Which activities this idea supports
|
|
54
|
+
- **Aspirational Solution Scope**: What success looks like if implemented
|
|
55
|
+
|
|
56
|
+
Present all ideas as Idea Cards and confirm with the user before proceeding to the Design phase.
|