task-o-matic-core 0.1.0
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/README.md +646 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/lib/ai-service/ai-operations.d.ts +45 -0
- package/dist/lib/ai-service/ai-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/ai-operations.js +60 -0
- package/dist/lib/ai-service/base-operations.d.ts +43 -0
- package/dist/lib/ai-service/base-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/base-operations.js +119 -0
- package/dist/lib/ai-service/documentation-operations.d.ts +18 -0
- package/dist/lib/ai-service/documentation-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/documentation-operations.js +308 -0
- package/dist/lib/ai-service/filesystem-tools.d.ts +69 -0
- package/dist/lib/ai-service/filesystem-tools.d.ts.map +1 -0
- package/dist/lib/ai-service/filesystem-tools.js +70 -0
- package/dist/lib/ai-service/json-parser.d.ts +34 -0
- package/dist/lib/ai-service/json-parser.d.ts.map +1 -0
- package/dist/lib/ai-service/json-parser.js +177 -0
- package/dist/lib/ai-service/mcp-client.d.ts +9 -0
- package/dist/lib/ai-service/mcp-client.d.ts.map +1 -0
- package/dist/lib/ai-service/mcp-client.js +48 -0
- package/dist/lib/ai-service/model-provider.d.ts +12 -0
- package/dist/lib/ai-service/model-provider.d.ts.map +1 -0
- package/dist/lib/ai-service/model-provider.js +146 -0
- package/dist/lib/ai-service/prd-operations.d.ts +25 -0
- package/dist/lib/ai-service/prd-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/prd-operations.js +592 -0
- package/dist/lib/ai-service/research-tools.d.ts +4 -0
- package/dist/lib/ai-service/research-tools.d.ts.map +1 -0
- package/dist/lib/ai-service/research-tools.js +8 -0
- package/dist/lib/ai-service/retry-handler.d.ts +8 -0
- package/dist/lib/ai-service/retry-handler.d.ts.map +1 -0
- package/dist/lib/ai-service/retry-handler.js +63 -0
- package/dist/lib/ai-service/task-operations.d.ts +13 -0
- package/dist/lib/ai-service/task-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/task-operations.js +220 -0
- package/dist/lib/benchmark/registry.d.ts +11 -0
- package/dist/lib/benchmark/registry.d.ts.map +1 -0
- package/dist/lib/benchmark/registry.js +212 -0
- package/dist/lib/benchmark/runner.d.ts +6 -0
- package/dist/lib/benchmark/runner.d.ts.map +1 -0
- package/dist/lib/benchmark/runner.js +150 -0
- package/dist/lib/benchmark/storage.d.ts +13 -0
- package/dist/lib/benchmark/storage.d.ts.map +1 -0
- package/dist/lib/benchmark/storage.js +100 -0
- package/dist/lib/benchmark/types.d.ts +104 -0
- package/dist/lib/benchmark/types.d.ts.map +1 -0
- package/dist/lib/benchmark/types.js +2 -0
- package/dist/lib/better-t-stack-cli.d.ts +50 -0
- package/dist/lib/better-t-stack-cli.d.ts.map +1 -0
- package/dist/lib/better-t-stack-cli.js +428 -0
- package/dist/lib/bootstrap/cli-bootstrap.d.ts +14 -0
- package/dist/lib/bootstrap/cli-bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap/cli-bootstrap.js +322 -0
- package/dist/lib/bootstrap/index.d.ts +3 -0
- package/dist/lib/bootstrap/index.d.ts.map +1 -0
- package/dist/lib/bootstrap/index.js +18 -0
- package/dist/lib/bootstrap/medusa-bootstrap.d.ts +14 -0
- package/dist/lib/bootstrap/medusa-bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap/medusa-bootstrap.js +215 -0
- package/dist/lib/config-validation.d.ts +215 -0
- package/dist/lib/config-validation.d.ts.map +1 -0
- package/dist/lib/config-validation.js +254 -0
- package/dist/lib/config.d.ts +55 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +351 -0
- package/dist/lib/context-builder.d.ts +66 -0
- package/dist/lib/context-builder.d.ts.map +1 -0
- package/dist/lib/context-builder.js +322 -0
- package/dist/lib/executors/claude-code-executor.d.ts +9 -0
- package/dist/lib/executors/claude-code-executor.d.ts.map +1 -0
- package/dist/lib/executors/claude-code-executor.js +69 -0
- package/dist/lib/executors/codex-executor.d.ts +9 -0
- package/dist/lib/executors/codex-executor.d.ts.map +1 -0
- package/dist/lib/executors/codex-executor.js +73 -0
- package/dist/lib/executors/executor-factory.d.ts +5 -0
- package/dist/lib/executors/executor-factory.d.ts.map +1 -0
- package/dist/lib/executors/executor-factory.js +27 -0
- package/dist/lib/executors/gemini-executor.d.ts +9 -0
- package/dist/lib/executors/gemini-executor.d.ts.map +1 -0
- package/dist/lib/executors/gemini-executor.js +67 -0
- package/dist/lib/executors/kilo-executor.d.ts +9 -0
- package/dist/lib/executors/kilo-executor.d.ts.map +1 -0
- package/dist/lib/executors/kilo-executor.js +69 -0
- package/dist/lib/executors/opencode-executor.d.ts +9 -0
- package/dist/lib/executors/opencode-executor.d.ts.map +1 -0
- package/dist/lib/executors/opencode-executor.js +67 -0
- package/dist/lib/git-utils.d.ts +88 -0
- package/dist/lib/git-utils.d.ts.map +1 -0
- package/dist/lib/git-utils.js +242 -0
- package/dist/lib/hooks.d.ts +73 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +62 -0
- package/dist/lib/index.d.ts +100 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +143 -0
- package/dist/lib/logger.d.ts +20 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +32 -0
- package/dist/lib/notifications.d.ts +7 -0
- package/dist/lib/notifications.d.ts.map +1 -0
- package/dist/lib/notifications.js +81 -0
- package/dist/lib/prompt-builder.d.ts +70 -0
- package/dist/lib/prompt-builder.d.ts.map +1 -0
- package/dist/lib/prompt-builder.js +344 -0
- package/dist/lib/prompt-registry.d.ts +22 -0
- package/dist/lib/prompt-registry.d.ts.map +1 -0
- package/dist/lib/prompt-registry.js +409 -0
- package/dist/lib/provider-defaults.json +32 -0
- package/dist/lib/storage/file-system.d.ts +57 -0
- package/dist/lib/storage/file-system.d.ts.map +1 -0
- package/dist/lib/storage/file-system.js +638 -0
- package/dist/lib/storage/storage-callbacks.d.ts +17 -0
- package/dist/lib/storage/storage-callbacks.d.ts.map +1 -0
- package/dist/lib/storage/storage-callbacks.js +94 -0
- package/dist/lib/storage/types.d.ts +43 -0
- package/dist/lib/storage/types.d.ts.map +1 -0
- package/dist/lib/storage/types.js +2 -0
- package/dist/lib/task-execution-core.d.ts +7 -0
- package/dist/lib/task-execution-core.d.ts.map +1 -0
- package/dist/lib/task-execution-core.js +381 -0
- package/dist/lib/task-execution.d.ts +7 -0
- package/dist/lib/task-execution.d.ts.map +1 -0
- package/dist/lib/task-execution.js +40 -0
- package/dist/lib/task-loop-execution.d.ts +7 -0
- package/dist/lib/task-loop-execution.d.ts.map +1 -0
- package/dist/lib/task-loop-execution.js +156 -0
- package/dist/lib/task-planning.d.ts +29 -0
- package/dist/lib/task-planning.d.ts.map +1 -0
- package/dist/lib/task-planning.js +103 -0
- package/dist/lib/task-review.d.ts +27 -0
- package/dist/lib/task-review.d.ts.map +1 -0
- package/dist/lib/task-review.js +103 -0
- package/dist/lib/validation.d.ts +26 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +98 -0
- package/dist/prompts/documentation-detection.d.ts +2 -0
- package/dist/prompts/documentation-detection.d.ts.map +1 -0
- package/dist/prompts/documentation-detection.js +24 -0
- package/dist/prompts/documentation-recap.d.ts +3 -0
- package/dist/prompts/documentation-recap.d.ts.map +1 -0
- package/dist/prompts/documentation-recap.js +13 -0
- package/dist/prompts/index.d.ts +15 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +30 -0
- package/dist/prompts/prd-combination.d.ts +2 -0
- package/dist/prompts/prd-combination.d.ts.map +1 -0
- package/dist/prompts/prd-combination.js +35 -0
- package/dist/prompts/prd-generation.d.ts +2 -0
- package/dist/prompts/prd-generation.d.ts.map +1 -0
- package/dist/prompts/prd-generation.js +49 -0
- package/dist/prompts/prd-parsing.d.ts +3 -0
- package/dist/prompts/prd-parsing.d.ts.map +1 -0
- package/dist/prompts/prd-parsing.js +172 -0
- package/dist/prompts/prd-question-answer.d.ts +3 -0
- package/dist/prompts/prd-question-answer.d.ts.map +1 -0
- package/dist/prompts/prd-question-answer.js +27 -0
- package/dist/prompts/prd-question.d.ts +3 -0
- package/dist/prompts/prd-question.d.ts.map +1 -0
- package/dist/prompts/prd-question.js +40 -0
- package/dist/prompts/prd-rework.d.ts +3 -0
- package/dist/prompts/prd-rework.d.ts.map +1 -0
- package/dist/prompts/prd-rework.js +81 -0
- package/dist/prompts/prd-suggest-stack.d.ts +3 -0
- package/dist/prompts/prd-suggest-stack.d.ts.map +1 -0
- package/dist/prompts/prd-suggest-stack.js +99 -0
- package/dist/prompts/task-breakdown.d.ts +3 -0
- package/dist/prompts/task-breakdown.d.ts.map +1 -0
- package/dist/prompts/task-breakdown.js +151 -0
- package/dist/prompts/task-enhancement.d.ts +3 -0
- package/dist/prompts/task-enhancement.d.ts.map +1 -0
- package/dist/prompts/task-enhancement.js +140 -0
- package/dist/prompts/task-execution.d.ts +3 -0
- package/dist/prompts/task-execution.d.ts.map +1 -0
- package/dist/prompts/task-execution.js +24 -0
- package/dist/prompts/task-planning.d.ts +3 -0
- package/dist/prompts/task-planning.d.ts.map +1 -0
- package/dist/prompts/task-planning.js +66 -0
- package/dist/prompts/workflow-assistance.d.ts +32 -0
- package/dist/prompts/workflow-assistance.d.ts.map +1 -0
- package/dist/prompts/workflow-assistance.js +130 -0
- package/dist/prompts/workflow-prompts.d.ts +9 -0
- package/dist/prompts/workflow-prompts.d.ts.map +1 -0
- package/dist/prompts/workflow-prompts.js +93 -0
- package/dist/services/benchmark.d.ts +26 -0
- package/dist/services/benchmark.d.ts.map +1 -0
- package/dist/services/benchmark.js +343 -0
- package/dist/services/prd.d.ts +136 -0
- package/dist/services/prd.d.ts.map +1 -0
- package/dist/services/prd.js +550 -0
- package/dist/services/tasks.d.ts +388 -0
- package/dist/services/tasks.d.ts.map +1 -0
- package/dist/services/tasks.js +1150 -0
- package/dist/services/workflow-ai-assistant.d.ts +74 -0
- package/dist/services/workflow-ai-assistant.d.ts.map +1 -0
- package/dist/services/workflow-ai-assistant.js +175 -0
- package/dist/services/workflow-benchmark.d.ts +34 -0
- package/dist/services/workflow-benchmark.d.ts.map +1 -0
- package/dist/services/workflow-benchmark.js +318 -0
- package/dist/services/workflow.d.ts +107 -0
- package/dist/services/workflow.d.ts.map +1 -0
- package/dist/services/workflow.js +580 -0
- package/dist/test/hooks.test.d.ts +2 -0
- package/dist/test/hooks.test.d.ts.map +1 -0
- package/dist/test/hooks.test.js +67 -0
- package/dist/test/integration/callbacks.test.d.ts +2 -0
- package/dist/test/integration/callbacks.test.d.ts.map +1 -0
- package/dist/test/integration/callbacks.test.js +64 -0
- package/dist/test/lib/ai-service/task-operations.test.d.ts +2 -0
- package/dist/test/lib/ai-service/task-operations.test.d.ts.map +1 -0
- package/dist/test/lib/ai-service/task-operations.test.js +362 -0
- package/dist/test/lib/config.test.d.ts +2 -0
- package/dist/test/lib/config.test.d.ts.map +1 -0
- package/dist/test/lib/config.test.js +128 -0
- package/dist/test/lib/git-utils.test.d.ts +2 -0
- package/dist/test/lib/git-utils.test.d.ts.map +1 -0
- package/dist/test/lib/git-utils.test.js +168 -0
- package/dist/test/mocks/mock-ai-operations.d.ts +15 -0
- package/dist/test/mocks/mock-ai-operations.d.ts.map +1 -0
- package/dist/test/mocks/mock-ai-operations.js +107 -0
- package/dist/test/mocks/mock-context-builder.d.ts +10 -0
- package/dist/test/mocks/mock-context-builder.d.ts.map +1 -0
- package/dist/test/mocks/mock-context-builder.js +81 -0
- package/dist/test/mocks/mock-model-provider.d.ts +7 -0
- package/dist/test/mocks/mock-model-provider.d.ts.map +1 -0
- package/dist/test/mocks/mock-model-provider.js +21 -0
- package/dist/test/mocks/mock-service-factory.d.ts +11 -0
- package/dist/test/mocks/mock-service-factory.d.ts.map +1 -0
- package/dist/test/mocks/mock-service-factory.js +61 -0
- package/dist/test/mocks/mock-storage.d.ts +50 -0
- package/dist/test/mocks/mock-storage.d.ts.map +1 -0
- package/dist/test/mocks/mock-storage.js +145 -0
- package/dist/test/model-parsing.test.d.ts +2 -0
- package/dist/test/model-parsing.test.d.ts.map +1 -0
- package/dist/test/model-parsing.test.js +73 -0
- package/dist/test/services/task-service.test.d.ts +2 -0
- package/dist/test/services/task-service.test.d.ts.map +1 -0
- package/dist/test/services/task-service.test.js +459 -0
- package/dist/test/storage.test.d.ts +2 -0
- package/dist/test/storage.test.d.ts.map +1 -0
- package/dist/test/storage.test.js +207 -0
- package/dist/test/task-loop-git.test.d.ts +2 -0
- package/dist/test/task-loop-git.test.d.ts.map +1 -0
- package/dist/test/task-loop-git.test.js +95 -0
- package/dist/test/test-mock-setup.d.ts +26 -0
- package/dist/test/test-mock-setup.d.ts.map +1 -0
- package/dist/test/test-mock-setup.js +41 -0
- package/dist/test/test-setup.d.ts +9 -0
- package/dist/test/test-setup.d.ts.map +1 -0
- package/dist/test/test-setup.js +44 -0
- package/dist/test/test-utils.d.ts +22 -0
- package/dist/test/test-utils.d.ts.map +1 -0
- package/dist/test/test-utils.js +37 -0
- package/dist/test/utils/ai-operation-utility.test.d.ts +2 -0
- package/dist/test/utils/ai-operation-utility.test.d.ts.map +1 -0
- package/dist/test/utils/ai-operation-utility.test.js +290 -0
- package/dist/test/utils/error-handling.test.d.ts +2 -0
- package/dist/test/utils/error-handling.test.d.ts.map +1 -0
- package/dist/test/utils/error-handling.test.js +231 -0
- package/dist/test/utils/file-utils.test.d.ts +2 -0
- package/dist/test/utils/file-utils.test.d.ts.map +1 -0
- package/dist/test/utils/file-utils.test.js +76 -0
- package/dist/test/utils/id-generator.test.d.ts +2 -0
- package/dist/test/utils/id-generator.test.d.ts.map +1 -0
- package/dist/test/utils/id-generator.test.js +41 -0
- package/dist/test/utils/model-parser.test.d.ts +2 -0
- package/dist/test/utils/model-parser.test.d.ts.map +1 -0
- package/dist/test/utils/model-parser.test.js +65 -0
- package/dist/test/validation.test.d.ts +2 -0
- package/dist/test/validation.test.d.ts.map +1 -0
- package/dist/test/validation.test.js +22 -0
- package/dist/types/callbacks.d.ts +30 -0
- package/dist/types/callbacks.d.ts.map +1 -0
- package/dist/types/callbacks.js +2 -0
- package/dist/types/index.d.ts +435 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +30 -0
- package/dist/types/mcp.d.ts +3 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +3 -0
- package/dist/types/options.d.ts +112 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +2 -0
- package/dist/types/results.d.ts +200 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +2 -0
- package/dist/types/workflow-options.d.ts +82 -0
- package/dist/types/workflow-options.d.ts.map +1 -0
- package/dist/types/workflow-options.js +2 -0
- package/dist/types/workflow-results.d.ts +82 -0
- package/dist/types/workflow-results.d.ts.map +1 -0
- package/dist/types/workflow-results.js +2 -0
- package/dist/utils/ai-config-builder.d.ts +14 -0
- package/dist/utils/ai-config-builder.d.ts.map +1 -0
- package/dist/utils/ai-config-builder.js +22 -0
- package/dist/utils/ai-operation-utility.d.ts +142 -0
- package/dist/utils/ai-operation-utility.d.ts.map +1 -0
- package/dist/utils/ai-operation-utility.js +303 -0
- package/dist/utils/ai-service-factory.d.ts +34 -0
- package/dist/utils/ai-service-factory.d.ts.map +1 -0
- package/dist/utils/ai-service-factory.js +99 -0
- package/dist/utils/error-utils.d.ts +70 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +104 -0
- package/dist/utils/file-utils.d.ts +107 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +171 -0
- package/dist/utils/id-generator.d.ts +92 -0
- package/dist/utils/id-generator.d.ts.map +1 -0
- package/dist/utils/id-generator.js +146 -0
- package/dist/utils/metadata-utils.d.ts +40 -0
- package/dist/utils/metadata-utils.d.ts.map +1 -0
- package/dist/utils/metadata-utils.js +43 -0
- package/dist/utils/model-executor-parser.d.ts +38 -0
- package/dist/utils/model-executor-parser.d.ts.map +1 -0
- package/dist/utils/model-executor-parser.js +69 -0
- package/dist/utils/model-parser.d.ts +6 -0
- package/dist/utils/model-parser.d.ts.map +1 -0
- package/dist/utils/model-parser.js +49 -0
- package/dist/utils/stack-formatter.d.ts +12 -0
- package/dist/utils/stack-formatter.d.ts.map +1 -0
- package/dist/utils/stack-formatter.js +36 -0
- package/dist/utils/storage-utils.d.ts +49 -0
- package/dist/utils/storage-utils.d.ts.map +1 -0
- package/dist/utils/storage-utils.js +80 -0
- package/dist/utils/streaming-utils.d.ts +38 -0
- package/dist/utils/streaming-utils.d.ts.map +1 -0
- package/dist/utils/streaming-utils.js +64 -0
- package/dist/utils/task-o-matic-error.d.ts +206 -0
- package/dist/utils/task-o-matic-error.d.ts.map +1 -0
- package/dist/utils/task-o-matic-error.js +304 -0
- package/package.json +40 -0
- package/src/index.ts +36 -0
- package/src/lib/ai-service/ai-operations.ts +310 -0
- package/src/lib/ai-service/base-operations.ts +139 -0
- package/src/lib/ai-service/documentation-operations.ts +438 -0
- package/src/lib/ai-service/filesystem-tools.ts +73 -0
- package/src/lib/ai-service/gemini-proxy.ts.bak +52 -0
- package/src/lib/ai-service/json-parser.ts +203 -0
- package/src/lib/ai-service/mcp-client.ts +54 -0
- package/src/lib/ai-service/model-provider.ts +192 -0
- package/src/lib/ai-service/prd-operations.ts +854 -0
- package/src/lib/ai-service/research-tools.ts +207 -0
- package/src/lib/ai-service/retry-handler.ts +89 -0
- package/src/lib/ai-service/task-operations.ts +342 -0
- package/src/lib/benchmark/registry.ts +307 -0
- package/src/lib/benchmark/runner.ts +190 -0
- package/src/lib/benchmark/storage.ts +140 -0
- package/src/lib/benchmark/types.ts +121 -0
- package/src/lib/better-t-stack-cli.ts +524 -0
- package/src/lib/bootstrap/cli-bootstrap.ts +397 -0
- package/src/lib/bootstrap/index.ts +2 -0
- package/src/lib/bootstrap/medusa-bootstrap.ts +261 -0
- package/src/lib/config-validation.ts +278 -0
- package/src/lib/config.ts +435 -0
- package/src/lib/context-builder.ts +383 -0
- package/src/lib/executors/claude-code-executor.ts +83 -0
- package/src/lib/executors/codex-executor.ts +85 -0
- package/src/lib/executors/executor-factory.ts +28 -0
- package/src/lib/executors/gemini-executor.ts +80 -0
- package/src/lib/executors/kilo-executor.ts +83 -0
- package/src/lib/executors/opencode-executor.ts +81 -0
- package/src/lib/git-utils.ts +334 -0
- package/src/lib/hooks.ts +121 -0
- package/src/lib/index.ts +166 -0
- package/src/lib/logger.ts +43 -0
- package/src/lib/notifications.ts +103 -0
- package/src/lib/prompt-builder.ts +471 -0
- package/src/lib/prompt-registry.ts +491 -0
- package/src/lib/provider-defaults.json +32 -0
- package/src/lib/storage/file-system.ts +864 -0
- package/src/lib/storage/storage-callbacks.ts +120 -0
- package/src/lib/storage/types.ts +58 -0
- package/src/lib/task-execution-core.ts +591 -0
- package/src/lib/task-execution.ts +59 -0
- package/src/lib/task-loop-execution.ts +214 -0
- package/src/lib/task-planning.ts +157 -0
- package/src/lib/task-review.ts +138 -0
- package/src/lib/validation.ts +140 -0
- package/src/prompts/documentation-detection.ts +21 -0
- package/src/prompts/documentation-recap.ts +11 -0
- package/src/prompts/index.ts +14 -0
- package/src/prompts/prd-combination.ts +32 -0
- package/src/prompts/prd-generation.ts +46 -0
- package/src/prompts/prd-parsing.ts +170 -0
- package/src/prompts/prd-question-answer.ts +25 -0
- package/src/prompts/prd-question.ts +38 -0
- package/src/prompts/prd-rework.ts +79 -0
- package/src/prompts/prd-suggest-stack.ts +97 -0
- package/src/prompts/task-breakdown.ts +149 -0
- package/src/prompts/task-enhancement.ts +138 -0
- package/src/prompts/task-execution.ts +22 -0
- package/src/prompts/task-planning.ts +64 -0
- package/src/prompts/workflow-assistance.ts +151 -0
- package/src/prompts/workflow-prompts.ts +97 -0
- package/src/services/benchmark.ts +433 -0
- package/src/services/prd.ts +845 -0
- package/src/services/tasks.ts +1515 -0
- package/src/services/workflow-ai-assistant.ts +298 -0
- package/src/services/workflow-benchmark.ts +339 -0
- package/src/services/workflow.ts +779 -0
- package/src/test/hooks.test.ts +77 -0
- package/src/test/integration/callbacks.test.ts +39 -0
- package/src/test/lib/ai-service/task-operations.test.ts +430 -0
- package/src/test/lib/config.test.ts +150 -0
- package/src/test/lib/git-utils.test.ts +198 -0
- package/src/test/mocks/mock-ai-operations.ts +205 -0
- package/src/test/mocks/mock-context-builder.ts +84 -0
- package/src/test/mocks/mock-model-provider.ts +21 -0
- package/src/test/mocks/mock-service-factory.ts +64 -0
- package/src/test/mocks/mock-storage.ts +204 -0
- package/src/test/model-parsing.test.ts +78 -0
- package/src/test/services/task-service.test.ts +551 -0
- package/src/test/storage.test.ts +206 -0
- package/src/test/task-loop-git.test.ts +142 -0
- package/src/test/test-mock-setup.ts +46 -0
- package/src/test/test-setup.ts +48 -0
- package/src/test/test-utils.ts +45 -0
- package/src/test/utils/ai-operation-utility.test.ts +306 -0
- package/src/test/utils/error-handling.test.ts +241 -0
- package/src/test/utils/file-utils.test.ts +80 -0
- package/src/test/utils/id-generator.test.ts +44 -0
- package/src/test/utils/model-parser.test.ts +67 -0
- package/src/test/validation.test.ts +19 -0
- package/src/types/callbacks.ts +14 -0
- package/src/types/index.ts +628 -0
- package/src/types/mcp.ts +5 -0
- package/src/types/options.ts +165 -0
- package/src/types/results.ts +216 -0
- package/src/types/workflow-options.ts +113 -0
- package/src/types/workflow-results.ts +87 -0
- package/src/utils/ai-config-builder.ts +33 -0
- package/src/utils/ai-operation-utility.ts +380 -0
- package/src/utils/ai-service-factory.ts +125 -0
- package/src/utils/error-utils.ts +124 -0
- package/src/utils/file-utils.ts +197 -0
- package/src/utils/id-generator.ts +168 -0
- package/src/utils/metadata-utils.ts +48 -0
- package/src/utils/model-executor-parser.ts +80 -0
- package/src/utils/model-parser.ts +58 -0
- package/src/utils/stack-formatter.ts +53 -0
- package/src/utils/storage-utils.ts +94 -0
- package/src/utils/streaming-utils.ts +91 -0
- package/src/utils/task-o-matic-error.ts +393 -0
- package/tsconfig.json +20 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,592 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PRDOperations = void 0;
|
|
37
|
+
const ai_1 = require("ai");
|
|
38
|
+
const prompt_builder_1 = require("../prompt-builder");
|
|
39
|
+
const prompts_1 = require("../../prompts");
|
|
40
|
+
const filesystem_tools_1 = require("./filesystem-tools");
|
|
41
|
+
const base_operations_1 = require("./base-operations");
|
|
42
|
+
const task_o_matic_error_1 = require("../../utils/task-o-matic-error");
|
|
43
|
+
class PRDOperations extends base_operations_1.BaseOperations {
|
|
44
|
+
async parsePRD(prdContent, config, promptOverride, userMessage, streamingOptions, retryConfig, workingDirectory, enableFilesystemTools) {
|
|
45
|
+
// console.log(
|
|
46
|
+
// `[Library Debug] parsePRD called. Config arg has key: ${!!config?.apiKey} Provider internal key: ${!!this.modelProvider.getAIConfig()
|
|
47
|
+
// ?.apiKey}`
|
|
48
|
+
// );
|
|
49
|
+
return this.retryHandler.executeWithRetry(async () => {
|
|
50
|
+
let stackInfo = "";
|
|
51
|
+
try {
|
|
52
|
+
stackInfo = await prompt_builder_1.PromptBuilder.detectStackInfo(workingDirectory);
|
|
53
|
+
if (stackInfo === "Not detected") {
|
|
54
|
+
stackInfo = "";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// Stack info not available
|
|
59
|
+
}
|
|
60
|
+
let enhancedPrompt;
|
|
61
|
+
if (promptOverride) {
|
|
62
|
+
enhancedPrompt = promptOverride;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const variables = {
|
|
66
|
+
PRD_CONTENT: prdContent,
|
|
67
|
+
};
|
|
68
|
+
if (stackInfo) {
|
|
69
|
+
variables.STACK_INFO = stackInfo;
|
|
70
|
+
}
|
|
71
|
+
const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
|
|
72
|
+
name: "prd-parsing",
|
|
73
|
+
type: "user",
|
|
74
|
+
variables,
|
|
75
|
+
});
|
|
76
|
+
if (!promptResult.success) {
|
|
77
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_PARSING_ERROR, `Failed to build PRD parsing prompt: ${promptResult.error}`, {
|
|
78
|
+
context: "Prompt building failed during PRD parsing",
|
|
79
|
+
suggestions: [
|
|
80
|
+
"Verify prompt template exists",
|
|
81
|
+
"Check variable substitution",
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
enhancedPrompt = promptResult.prompt;
|
|
86
|
+
}
|
|
87
|
+
let response;
|
|
88
|
+
if (enableFilesystemTools) {
|
|
89
|
+
const model = this.modelProvider.getModel({
|
|
90
|
+
...this.modelProvider.getAIConfig(),
|
|
91
|
+
...config,
|
|
92
|
+
});
|
|
93
|
+
const allTools = {
|
|
94
|
+
...filesystem_tools_1.filesystemTools,
|
|
95
|
+
};
|
|
96
|
+
const result = await (0, ai_1.streamText)({
|
|
97
|
+
model,
|
|
98
|
+
tools: allTools,
|
|
99
|
+
system: prompts_1.PRD_PARSING_SYSTEM_PROMPT +
|
|
100
|
+
`
|
|
101
|
+
|
|
102
|
+
You have access to filesystem tools that allow you to:
|
|
103
|
+
- readFile: Read the contents of any file in the project
|
|
104
|
+
- listDirectory: List contents of directories
|
|
105
|
+
|
|
106
|
+
Use these tools to understand the project structure, existing code patterns, and dependencies when parsing the PRD and creating tasks.`,
|
|
107
|
+
messages: [
|
|
108
|
+
{ role: "user", content: userMessage || enhancedPrompt },
|
|
109
|
+
],
|
|
110
|
+
maxRetries: 0,
|
|
111
|
+
onChunk: streamingOptions?.onChunk
|
|
112
|
+
? ({ chunk }) => {
|
|
113
|
+
if (chunk.type === "text-delta") {
|
|
114
|
+
streamingOptions.onChunk(chunk.text);
|
|
115
|
+
}
|
|
116
|
+
else if (chunk.type === "reasoning-delta") {
|
|
117
|
+
streamingOptions.onReasoning?.(chunk.text);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
: undefined,
|
|
121
|
+
onFinish: streamingOptions?.onFinish
|
|
122
|
+
? ({ text, finishReason, usage }) => {
|
|
123
|
+
streamingOptions.onFinish({
|
|
124
|
+
text,
|
|
125
|
+
finishReason,
|
|
126
|
+
usage,
|
|
127
|
+
isAborted: false,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
: undefined,
|
|
131
|
+
});
|
|
132
|
+
response = await result.text;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
response = await this.streamText("", config, prompts_1.PRD_PARSING_SYSTEM_PROMPT, userMessage || enhancedPrompt, streamingOptions, { maxAttempts: 1 });
|
|
136
|
+
}
|
|
137
|
+
const parseResult = this.jsonParser.parseJSONFromResponse(response);
|
|
138
|
+
if (!parseResult.success) {
|
|
139
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_PARSING_ERROR, parseResult.error || "Failed to parse PRD response", {
|
|
140
|
+
context: "AI response parsing failed during PRD parsing",
|
|
141
|
+
suggestions: [
|
|
142
|
+
"Check AI response format",
|
|
143
|
+
"Verify JSON structure",
|
|
144
|
+
],
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const parsed = parseResult.data;
|
|
148
|
+
// Handle both { tasks: [...] } and [...] (array) formats
|
|
149
|
+
let tasksList = [];
|
|
150
|
+
let summary = "PRD parsed successfully";
|
|
151
|
+
let estimatedDuration = "Unknown";
|
|
152
|
+
let confidence = 0.7;
|
|
153
|
+
if (Array.isArray(parsed)) {
|
|
154
|
+
tasksList = parsed;
|
|
155
|
+
}
|
|
156
|
+
else if (parsed && typeof parsed === "object") {
|
|
157
|
+
tasksList = parsed.tasks || [];
|
|
158
|
+
summary = parsed.summary || summary;
|
|
159
|
+
estimatedDuration = parsed.estimatedDuration || estimatedDuration;
|
|
160
|
+
confidence = parsed.confidence || confidence;
|
|
161
|
+
}
|
|
162
|
+
const tasks = tasksList.map((task, index) => {
|
|
163
|
+
const taskId = task.id || (index + 1).toString();
|
|
164
|
+
const { title, description, content, effort, dependencies, ...extraData } = task;
|
|
165
|
+
let fullContent = "";
|
|
166
|
+
if (description || content) {
|
|
167
|
+
fullContent = description || content || "";
|
|
168
|
+
}
|
|
169
|
+
if (Object.keys(extraData).length > 0) {
|
|
170
|
+
fullContent += "\n\n## Additional AI-Generated Information\n";
|
|
171
|
+
for (const [key, value] of Object.entries(extraData)) {
|
|
172
|
+
fullContent += `\n**${key}:** ${JSON.stringify(value, null, 2)}`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
id: taskId,
|
|
177
|
+
title: task.title,
|
|
178
|
+
description: task.description || task.content || "",
|
|
179
|
+
content: fullContent,
|
|
180
|
+
status: "todo",
|
|
181
|
+
createdAt: Date.now(),
|
|
182
|
+
updatedAt: Date.now(),
|
|
183
|
+
estimatedEffort: task.effort,
|
|
184
|
+
dependencies: task.dependencies || [],
|
|
185
|
+
tags: task.tags || [],
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
return {
|
|
189
|
+
tasks,
|
|
190
|
+
summary,
|
|
191
|
+
estimatedDuration,
|
|
192
|
+
confidence,
|
|
193
|
+
};
|
|
194
|
+
}, retryConfig, "PRD parsing");
|
|
195
|
+
}
|
|
196
|
+
async reworkPRD(prdContent, feedback, config, promptOverride, userMessage, streamingOptions, retryConfig, workingDirectory, enableFilesystemTools) {
|
|
197
|
+
return this.retryHandler.executeWithRetry(async () => {
|
|
198
|
+
let stackInfo = "";
|
|
199
|
+
try {
|
|
200
|
+
stackInfo = await prompt_builder_1.PromptBuilder.detectStackInfo(workingDirectory);
|
|
201
|
+
if (stackInfo === "Not detected") {
|
|
202
|
+
stackInfo = "";
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
// Stack info not available
|
|
207
|
+
}
|
|
208
|
+
let prompt;
|
|
209
|
+
if (promptOverride) {
|
|
210
|
+
prompt = promptOverride;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
const variables = {
|
|
214
|
+
PRD_CONTENT: prdContent,
|
|
215
|
+
USER_FEEDBACK: feedback,
|
|
216
|
+
};
|
|
217
|
+
if (stackInfo) {
|
|
218
|
+
variables.STACK_INFO = stackInfo;
|
|
219
|
+
}
|
|
220
|
+
const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
|
|
221
|
+
name: "prd-rework",
|
|
222
|
+
type: "user",
|
|
223
|
+
variables,
|
|
224
|
+
});
|
|
225
|
+
if (!promptResult.success) {
|
|
226
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_GENERATION_ERROR, `Failed to build PRD rework prompt: ${promptResult.error}`, {
|
|
227
|
+
context: "Prompt building failed during PRD rework",
|
|
228
|
+
suggestions: [
|
|
229
|
+
"Verify prompt template exists",
|
|
230
|
+
"Check variable substitution",
|
|
231
|
+
],
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
prompt = promptResult.prompt;
|
|
235
|
+
}
|
|
236
|
+
if (enableFilesystemTools) {
|
|
237
|
+
const model = this.modelProvider.getModel({
|
|
238
|
+
...this.modelProvider.getAIConfig(),
|
|
239
|
+
...config,
|
|
240
|
+
});
|
|
241
|
+
const allTools = {
|
|
242
|
+
...filesystem_tools_1.filesystemTools,
|
|
243
|
+
};
|
|
244
|
+
const result = await (0, ai_1.streamText)({
|
|
245
|
+
model,
|
|
246
|
+
tools: allTools,
|
|
247
|
+
system: prompts_1.PRD_REWORK_SYSTEM_PROMPT +
|
|
248
|
+
`
|
|
249
|
+
|
|
250
|
+
You have access to filesystem tools that allow you to:
|
|
251
|
+
- readFile: Read the contents of any file in the project
|
|
252
|
+
- listDirectory: List contents of directories
|
|
253
|
+
|
|
254
|
+
Use these tools to understand the current project structure, existing code patterns, and dependencies when reworking the PRD based on feedback.`,
|
|
255
|
+
messages: [{ role: "user", content: userMessage || prompt }],
|
|
256
|
+
maxRetries: 0,
|
|
257
|
+
onChunk: streamingOptions?.onChunk
|
|
258
|
+
? ({ chunk }) => {
|
|
259
|
+
if (chunk.type === "text-delta") {
|
|
260
|
+
streamingOptions.onChunk(chunk.text);
|
|
261
|
+
}
|
|
262
|
+
else if (chunk.type === "reasoning-delta") {
|
|
263
|
+
streamingOptions.onReasoning?.(chunk.text);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
: undefined,
|
|
267
|
+
onFinish: streamingOptions?.onFinish
|
|
268
|
+
? ({ text, finishReason, usage }) => {
|
|
269
|
+
streamingOptions.onFinish({
|
|
270
|
+
text,
|
|
271
|
+
finishReason,
|
|
272
|
+
usage,
|
|
273
|
+
isAborted: false,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
: undefined,
|
|
277
|
+
});
|
|
278
|
+
return await result.text;
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
return this.streamText("", config, prompts_1.PRD_REWORK_SYSTEM_PROMPT, userMessage || prompt, streamingOptions, { maxAttempts: 1 });
|
|
282
|
+
}
|
|
283
|
+
}, retryConfig, "PRD rework");
|
|
284
|
+
}
|
|
285
|
+
async generatePRDQuestions(prdContent, config, promptOverride, userMessage, streamingOptions, retryConfig, workingDirectory, enableFilesystemTools) {
|
|
286
|
+
return this.retryHandler.executeWithRetry(async () => {
|
|
287
|
+
let stackInfo = "";
|
|
288
|
+
try {
|
|
289
|
+
stackInfo = await prompt_builder_1.PromptBuilder.detectStackInfo(workingDirectory);
|
|
290
|
+
if (stackInfo === "Not detected") {
|
|
291
|
+
stackInfo = "";
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
// Stack info not available
|
|
296
|
+
}
|
|
297
|
+
let prompt;
|
|
298
|
+
if (promptOverride) {
|
|
299
|
+
prompt = promptOverride;
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
const variables = {
|
|
303
|
+
PRD_CONTENT: prdContent,
|
|
304
|
+
};
|
|
305
|
+
if (stackInfo) {
|
|
306
|
+
variables.STACK_INFO = stackInfo;
|
|
307
|
+
}
|
|
308
|
+
const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
|
|
309
|
+
name: "prd-question",
|
|
310
|
+
type: "user",
|
|
311
|
+
variables,
|
|
312
|
+
});
|
|
313
|
+
if (!promptResult.success) {
|
|
314
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_GENERATION_ERROR, `Failed to build PRD question prompt: ${promptResult.error}`, {
|
|
315
|
+
context: "Prompt building failed during PRD question generation",
|
|
316
|
+
suggestions: [
|
|
317
|
+
"Verify prompt template exists",
|
|
318
|
+
"Check variable substitution",
|
|
319
|
+
],
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
prompt = promptResult.prompt;
|
|
323
|
+
}
|
|
324
|
+
const { PRD_QUESTION_SYSTEM_PROMPT } = await Promise.resolve().then(() => __importStar(require("../../prompts")));
|
|
325
|
+
let response;
|
|
326
|
+
if (enableFilesystemTools) {
|
|
327
|
+
const model = this.modelProvider.getModel({
|
|
328
|
+
...this.modelProvider.getAIConfig(),
|
|
329
|
+
...config,
|
|
330
|
+
});
|
|
331
|
+
const allTools = { ...filesystem_tools_1.filesystemTools };
|
|
332
|
+
const result = await (0, ai_1.streamText)({
|
|
333
|
+
model,
|
|
334
|
+
tools: allTools,
|
|
335
|
+
system: PRD_QUESTION_SYSTEM_PROMPT +
|
|
336
|
+
`\n\nYou have access to filesystem tools to check existing code/structure if needed.`,
|
|
337
|
+
messages: [{ role: "user", content: userMessage || prompt }],
|
|
338
|
+
maxRetries: 0,
|
|
339
|
+
onChunk: streamingOptions?.onChunk
|
|
340
|
+
? ({ chunk }) => {
|
|
341
|
+
if (chunk.type === "text-delta") {
|
|
342
|
+
streamingOptions.onChunk(chunk.text);
|
|
343
|
+
}
|
|
344
|
+
else if (chunk.type === "reasoning-delta") {
|
|
345
|
+
streamingOptions.onReasoning?.(chunk.text);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
: undefined,
|
|
349
|
+
onFinish: streamingOptions?.onFinish
|
|
350
|
+
? ({ text, finishReason, usage }) => {
|
|
351
|
+
streamingOptions.onFinish({
|
|
352
|
+
text,
|
|
353
|
+
finishReason,
|
|
354
|
+
usage,
|
|
355
|
+
isAborted: false,
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
: undefined,
|
|
359
|
+
});
|
|
360
|
+
response = await result.text;
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
response = await this.streamText("", config, PRD_QUESTION_SYSTEM_PROMPT, userMessage || prompt, streamingOptions, { maxAttempts: 1 });
|
|
364
|
+
}
|
|
365
|
+
const parseResult = this.jsonParser.parseJSONFromResponse(response);
|
|
366
|
+
if (!parseResult.success) {
|
|
367
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_GENERATION_ERROR, parseResult.error || "Failed to parse PRD questions", {
|
|
368
|
+
context: "AI response parsing failed during PRD question generation",
|
|
369
|
+
suggestions: [
|
|
370
|
+
"Check AI response format",
|
|
371
|
+
"Verify JSON structure",
|
|
372
|
+
],
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
return parseResult.data?.questions || [];
|
|
376
|
+
}, retryConfig, "PRD questioning");
|
|
377
|
+
}
|
|
378
|
+
async answerPRDQuestions(prdContent, questions, config, contextInfo, streamingOptions, retryConfig) {
|
|
379
|
+
return this.retryHandler.executeWithRetry(async () => {
|
|
380
|
+
const questionsText = questions
|
|
381
|
+
.map((q, i) => `${i + 1}. ${q}`)
|
|
382
|
+
.join("\n");
|
|
383
|
+
const contextText = contextInfo
|
|
384
|
+
? `\n\nProject Context:\n${contextInfo.stackInfo
|
|
385
|
+
? `Technology Stack: ${contextInfo.stackInfo}\n`
|
|
386
|
+
: ""}${contextInfo.projectDescription
|
|
387
|
+
? `Project Description: ${contextInfo.projectDescription}\n`
|
|
388
|
+
: ""}`
|
|
389
|
+
: "";
|
|
390
|
+
const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
|
|
391
|
+
name: "prd-question-answer",
|
|
392
|
+
type: "user",
|
|
393
|
+
variables: {
|
|
394
|
+
PRD_CONTENT: prdContent,
|
|
395
|
+
QUESTIONS_TEXT: questionsText,
|
|
396
|
+
CONTEXT_TEXT: contextText,
|
|
397
|
+
},
|
|
398
|
+
});
|
|
399
|
+
if (!promptResult.success) {
|
|
400
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_GENERATION_ERROR, `Failed to build PRD question answer prompt: ${promptResult.error}`, {
|
|
401
|
+
context: "Prompt building failed during PRD answer generation",
|
|
402
|
+
suggestions: [
|
|
403
|
+
"Verify prompt template exists",
|
|
404
|
+
"Check variable substitution",
|
|
405
|
+
],
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
const systemPromptResult = prompt_builder_1.PromptBuilder.buildPrompt({
|
|
409
|
+
name: "prd-question-answer",
|
|
410
|
+
type: "system",
|
|
411
|
+
variables: {},
|
|
412
|
+
});
|
|
413
|
+
const response = await this.streamText("", config, systemPromptResult.prompt, promptResult.prompt, streamingOptions, { maxAttempts: 1 });
|
|
414
|
+
const parseResult = this.jsonParser.parseJSONFromResponse(response);
|
|
415
|
+
if (!parseResult.success) {
|
|
416
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_GENERATION_ERROR, parseResult.error || "Failed to parse PRD answers response", {
|
|
417
|
+
context: "AI response parsing failed during PRD answer generation",
|
|
418
|
+
suggestions: [
|
|
419
|
+
"Check AI response format",
|
|
420
|
+
"Verify JSON structure",
|
|
421
|
+
],
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
const answers = {};
|
|
425
|
+
const numberedAnswers = parseResult.data?.answers || {};
|
|
426
|
+
questions.forEach((question, index) => {
|
|
427
|
+
const key = String(index + 1);
|
|
428
|
+
if (numberedAnswers[key]) {
|
|
429
|
+
answers[question] = numberedAnswers[key];
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
return answers;
|
|
433
|
+
}, retryConfig, "PRD question answering");
|
|
434
|
+
}
|
|
435
|
+
async generatePRD(description, config, promptOverride, userMessage, streamingOptions, retryConfig) {
|
|
436
|
+
return this.retryHandler.executeWithRetry(async () => {
|
|
437
|
+
const systemPrompt = prompts_1.PRD_GENERATION_SYSTEM_PROMPT;
|
|
438
|
+
const userContent = userMessage || `Product Description:\n${description}`;
|
|
439
|
+
return this.streamText("", config, systemPrompt, userContent, streamingOptions, { maxAttempts: 1 });
|
|
440
|
+
}, retryConfig, "PRD generation");
|
|
441
|
+
}
|
|
442
|
+
async combinePRDs(prds, originalDescription, config, promptOverride, userMessage, streamingOptions, retryConfig) {
|
|
443
|
+
return this.retryHandler.executeWithRetry(async () => {
|
|
444
|
+
const systemPrompt = prompts_1.PRD_COMBINATION_SYSTEM_PROMPT;
|
|
445
|
+
let userContent = userMessage;
|
|
446
|
+
if (!userContent) {
|
|
447
|
+
userContent = `Original Description:\n${originalDescription}\n\n`;
|
|
448
|
+
userContent += `<generated_prds>\n`;
|
|
449
|
+
prds.forEach((prd, index) => {
|
|
450
|
+
userContent += ` <prd id="${index + 1}">\n${prd}\n </prd>\n`;
|
|
451
|
+
});
|
|
452
|
+
userContent += `</generated_prds>\n`;
|
|
453
|
+
}
|
|
454
|
+
return this.streamText("", config, systemPrompt, userContent, streamingOptions, { maxAttempts: 1 });
|
|
455
|
+
}, retryConfig, "PRD combination");
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Suggest a technology stack based on PRD analysis.
|
|
459
|
+
*/
|
|
460
|
+
async suggestStack(prdContent, projectName, config, promptOverride, userMessage, streamingOptions, retryConfig, workingDirectory, enableFilesystemTools) {
|
|
461
|
+
return this.retryHandler.executeWithRetry(async () => {
|
|
462
|
+
// Try to detect stack info for context
|
|
463
|
+
let stackInfo = "";
|
|
464
|
+
try {
|
|
465
|
+
stackInfo = await prompt_builder_1.PromptBuilder.detectStackInfo(workingDirectory);
|
|
466
|
+
if (stackInfo === "Not detected") {
|
|
467
|
+
stackInfo = "";
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
catch (error) {
|
|
471
|
+
// Stack info not available
|
|
472
|
+
}
|
|
473
|
+
let enhancedPrompt;
|
|
474
|
+
if (promptOverride) {
|
|
475
|
+
enhancedPrompt = promptOverride;
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
const variables = {
|
|
479
|
+
PRD_CONTENT: prdContent,
|
|
480
|
+
};
|
|
481
|
+
if (stackInfo) {
|
|
482
|
+
variables.STACK_INFO = `## Existing Stack Info\n${stackInfo}`;
|
|
483
|
+
}
|
|
484
|
+
if (projectName) {
|
|
485
|
+
variables.PROJECT_NAME = `## Project Name\nUse this project name: ${projectName}`;
|
|
486
|
+
}
|
|
487
|
+
const promptResult = prompt_builder_1.PromptBuilder.buildPrompt({
|
|
488
|
+
name: "prd-suggest-stack",
|
|
489
|
+
type: "user",
|
|
490
|
+
variables,
|
|
491
|
+
});
|
|
492
|
+
if (!promptResult.success) {
|
|
493
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_GENERATION_ERROR, `Failed to build stack suggestion prompt: ${promptResult.error}`, {
|
|
494
|
+
context: "Prompt building failed during stack suggestion",
|
|
495
|
+
suggestions: [
|
|
496
|
+
"Verify prompt template exists",
|
|
497
|
+
"Check variable substitution",
|
|
498
|
+
],
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
enhancedPrompt = promptResult.prompt;
|
|
502
|
+
}
|
|
503
|
+
let response;
|
|
504
|
+
if (enableFilesystemTools) {
|
|
505
|
+
const model = this.modelProvider.getModel({
|
|
506
|
+
...this.modelProvider.getAIConfig(),
|
|
507
|
+
...config,
|
|
508
|
+
});
|
|
509
|
+
const allTools = {
|
|
510
|
+
...filesystem_tools_1.filesystemTools,
|
|
511
|
+
};
|
|
512
|
+
const result = await (0, ai_1.streamText)({
|
|
513
|
+
model,
|
|
514
|
+
tools: allTools,
|
|
515
|
+
system: prompts_1.PRD_SUGGEST_STACK_SYSTEM_PROMPT +
|
|
516
|
+
`\n\nYou have access to filesystem tools that allow you to:\n- readFile: Read the contents of any file in the project\n- listDirectory: List contents of directories\n\nUse these tools to understand the project structure and existing dependencies when suggesting the stack.`,
|
|
517
|
+
messages: [
|
|
518
|
+
{ role: "user", content: userMessage || enhancedPrompt },
|
|
519
|
+
],
|
|
520
|
+
maxRetries: 0,
|
|
521
|
+
onChunk: streamingOptions?.onChunk
|
|
522
|
+
? ({ chunk }) => {
|
|
523
|
+
if (chunk.type === "text-delta") {
|
|
524
|
+
streamingOptions.onChunk(chunk.text);
|
|
525
|
+
}
|
|
526
|
+
else if (chunk.type === "reasoning-delta") {
|
|
527
|
+
streamingOptions.onReasoning?.(chunk.text);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
: undefined,
|
|
531
|
+
onFinish: streamingOptions?.onFinish
|
|
532
|
+
? ({ text, finishReason, usage }) => {
|
|
533
|
+
streamingOptions.onFinish({
|
|
534
|
+
text,
|
|
535
|
+
finishReason,
|
|
536
|
+
usage,
|
|
537
|
+
isAborted: false,
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
: undefined,
|
|
541
|
+
});
|
|
542
|
+
response = await result.text;
|
|
543
|
+
}
|
|
544
|
+
else {
|
|
545
|
+
response = await this.streamText("", config, prompts_1.PRD_SUGGEST_STACK_SYSTEM_PROMPT, userMessage || enhancedPrompt, streamingOptions, { maxAttempts: 1 });
|
|
546
|
+
}
|
|
547
|
+
// Parse the JSON response
|
|
548
|
+
const parseResult = this.jsonParser.parseJSONFromResponse(response);
|
|
549
|
+
if (!parseResult.success) {
|
|
550
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.PRD_GENERATION_ERROR, parseResult.error || "Failed to parse stack suggestion response", {
|
|
551
|
+
context: "AI response parsing failed during stack suggestion",
|
|
552
|
+
suggestions: [
|
|
553
|
+
"Check AI response format",
|
|
554
|
+
"Verify JSON structure",
|
|
555
|
+
],
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
const parsed = parseResult.data;
|
|
559
|
+
// Validate and apply defaults to the config
|
|
560
|
+
const validatedConfig = this.validateStackConfig(parsed.config || parsed);
|
|
561
|
+
return {
|
|
562
|
+
config: validatedConfig,
|
|
563
|
+
reasoning: parsed.reasoning || "No reasoning provided.",
|
|
564
|
+
};
|
|
565
|
+
}, retryConfig, "Stack suggestion");
|
|
566
|
+
}
|
|
567
|
+
/**
|
|
568
|
+
* Validate and apply defaults to a partial BTSConfig.
|
|
569
|
+
*/
|
|
570
|
+
validateStackConfig(partial) {
|
|
571
|
+
return {
|
|
572
|
+
projectName: partial.projectName || "my-project",
|
|
573
|
+
frontend: partial.frontend || "none",
|
|
574
|
+
backend: partial.backend || "none",
|
|
575
|
+
database: partial.database || "none",
|
|
576
|
+
orm: partial.orm || "none",
|
|
577
|
+
api: partial.api || "none",
|
|
578
|
+
auth: partial.auth || "none",
|
|
579
|
+
payments: partial.payments || "none",
|
|
580
|
+
dbSetup: partial.dbSetup || "none",
|
|
581
|
+
runtime: partial.runtime || "bun",
|
|
582
|
+
packageManager: partial.packageManager || "bun",
|
|
583
|
+
git: partial.git ?? true,
|
|
584
|
+
install: partial.install ?? true,
|
|
585
|
+
webDeploy: partial.webDeploy || "none",
|
|
586
|
+
serverDeploy: partial.serverDeploy || "none",
|
|
587
|
+
addons: Array.isArray(partial.addons) ? partial.addons : [],
|
|
588
|
+
examples: Array.isArray(partial.examples) ? partial.examples : [],
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
exports.PRDOperations = PRDOperations;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research-tools.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/research-tools.ts"],"names":[],"mappings":"AAKA,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAgC;CAwMhD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResearchTools = void 0;
|
|
4
|
+
const ai_service_factory_1 = require("../../utils/ai-service-factory");
|
|
5
|
+
class ResearchTools {
|
|
6
|
+
storage = (0, ai_service_factory_1.getStorage)();
|
|
7
|
+
}
|
|
8
|
+
exports.ResearchTools = ResearchTools;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { RetryConfig } from "../../types";
|
|
2
|
+
export declare class RetryHandler {
|
|
3
|
+
private getRetryConfig;
|
|
4
|
+
private shouldRetryError;
|
|
5
|
+
private delay;
|
|
6
|
+
executeWithRetry<T>(operation: () => Promise<T>, retryConfig?: Partial<RetryConfig>, operationName?: string): Promise<T>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=retry-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-handler.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/retry-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,qBAAa,YAAY;IACvB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,gBAAgB;YAaV,KAAK;IAIb,gBAAgB,CAAC,CAAC,EACtB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAClC,aAAa,GAAE,MAAuB,GACrC,OAAO,CAAC,CAAC,CAAC;CA4Cd"}
|