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,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const git_utils_1 = require("../lib/git-utils");
|
|
8
|
+
describe("Task Loop Git Integration", () => {
|
|
9
|
+
const mockTaskTitle = "Test Task";
|
|
10
|
+
const mockExecutionMessage = "Executed task";
|
|
11
|
+
it("should extract commit info from existing commit", async () => {
|
|
12
|
+
const gitState = {
|
|
13
|
+
beforeHead: "abc",
|
|
14
|
+
afterHead: "def",
|
|
15
|
+
hasUncommittedChanges: false,
|
|
16
|
+
};
|
|
17
|
+
const mockExec = async (cmd) => {
|
|
18
|
+
if (cmd.includes("git show")) {
|
|
19
|
+
return {
|
|
20
|
+
stdout: "feat: test commit\n\nBody\n src/file.ts | 10 +",
|
|
21
|
+
stderr: "",
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return { stdout: "", stderr: "" };
|
|
25
|
+
};
|
|
26
|
+
const result = await (0, git_utils_1.extractCommitInfo)("1", mockTaskTitle, mockExecutionMessage, gitState, mockExec);
|
|
27
|
+
assert_1.default.strictEqual(result.message, "feat: test commit");
|
|
28
|
+
assert_1.default.deepStrictEqual(result.files, ["src/file.ts"]);
|
|
29
|
+
});
|
|
30
|
+
it("should generate commit info from uncommitted changes", async () => {
|
|
31
|
+
const gitState = {
|
|
32
|
+
beforeHead: "abc",
|
|
33
|
+
afterHead: "abc",
|
|
34
|
+
hasUncommittedChanges: true,
|
|
35
|
+
};
|
|
36
|
+
const mockExec = async (cmd) => {
|
|
37
|
+
if (cmd.includes("git diff")) {
|
|
38
|
+
return { stdout: "diff content", stderr: "" };
|
|
39
|
+
}
|
|
40
|
+
if (cmd.includes("git status")) {
|
|
41
|
+
return { stdout: " M src/changed.ts", stderr: "" };
|
|
42
|
+
}
|
|
43
|
+
return { stdout: "", stderr: "" };
|
|
44
|
+
};
|
|
45
|
+
const mockAiOps = {
|
|
46
|
+
streamText: async () => JSON.stringify({ message: "fix: auto commit" }),
|
|
47
|
+
};
|
|
48
|
+
const result = await (0, git_utils_1.extractCommitInfo)("1", mockTaskTitle, mockExecutionMessage, gitState, mockExec, mockAiOps);
|
|
49
|
+
assert_1.default.strictEqual(result.message, "fix: auto commit");
|
|
50
|
+
assert_1.default.deepStrictEqual(result.files, ["src/changed.ts"]);
|
|
51
|
+
});
|
|
52
|
+
it("should return default info when no changes", async () => {
|
|
53
|
+
const gitState = {
|
|
54
|
+
beforeHead: "abc",
|
|
55
|
+
afterHead: "abc",
|
|
56
|
+
hasUncommittedChanges: false,
|
|
57
|
+
};
|
|
58
|
+
const result = await (0, git_utils_1.extractCommitInfo)("1", mockTaskTitle, mockExecutionMessage, gitState);
|
|
59
|
+
assert_1.default.strictEqual(result.message, `feat: complete task ${mockTaskTitle}`);
|
|
60
|
+
assert_1.default.deepStrictEqual(result.files, []);
|
|
61
|
+
});
|
|
62
|
+
it("should handle git command failures gracefully", async () => {
|
|
63
|
+
const gitState = {
|
|
64
|
+
beforeHead: "abc",
|
|
65
|
+
afterHead: "def",
|
|
66
|
+
hasUncommittedChanges: false,
|
|
67
|
+
};
|
|
68
|
+
const mockExec = async () => {
|
|
69
|
+
throw new Error("Git failed");
|
|
70
|
+
};
|
|
71
|
+
const result = await (0, git_utils_1.extractCommitInfo)("1", mockTaskTitle, mockExecutionMessage, gitState, mockExec);
|
|
72
|
+
assert_1.default.strictEqual(result.message, `feat: complete task ${mockTaskTitle}`);
|
|
73
|
+
assert_1.default.deepStrictEqual(result.files, []);
|
|
74
|
+
});
|
|
75
|
+
it("should handle invalid AI JSON response", async () => {
|
|
76
|
+
const gitState = {
|
|
77
|
+
beforeHead: "abc",
|
|
78
|
+
afterHead: "abc",
|
|
79
|
+
hasUncommittedChanges: true,
|
|
80
|
+
};
|
|
81
|
+
const mockExec = async (cmd) => {
|
|
82
|
+
if (cmd.includes("git diff"))
|
|
83
|
+
return { stdout: "diff", stderr: "" };
|
|
84
|
+
if (cmd.includes("git status"))
|
|
85
|
+
return { stdout: " M file.ts", stderr: "" };
|
|
86
|
+
return { stdout: "", stderr: "" };
|
|
87
|
+
};
|
|
88
|
+
const mockAiOps = {
|
|
89
|
+
streamText: async () => "Not JSON",
|
|
90
|
+
};
|
|
91
|
+
const result = await (0, git_utils_1.extractCommitInfo)("1", mockTaskTitle, mockExecutionMessage, gitState, mockExec, mockAiOps);
|
|
92
|
+
assert_1.default.strictEqual(result.message, `feat: complete task ${mockTaskTitle}`);
|
|
93
|
+
assert_1.default.deepStrictEqual(result.files, ["file.ts"]);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Mock Setup - Provides mock instances for ai-service-factory
|
|
3
|
+
* Uses the injectTestInstances function to inject mocks
|
|
4
|
+
*/
|
|
5
|
+
import { MockStorage } from "./mocks/mock-storage";
|
|
6
|
+
import { MockAIOperations } from "./mocks/mock-ai-operations";
|
|
7
|
+
import { MockModelProvider } from "./mocks/mock-model-provider";
|
|
8
|
+
import { MockContextBuilder } from "./mocks/mock-context-builder";
|
|
9
|
+
export declare let mockStorage: MockStorage;
|
|
10
|
+
export declare let mockAIOperations: MockAIOperations;
|
|
11
|
+
export declare let mockModelProvider: MockModelProvider;
|
|
12
|
+
export declare let mockContextBuilder: MockContextBuilder;
|
|
13
|
+
/**
|
|
14
|
+
* Initialize fresh mock instances and inject them into the service factory
|
|
15
|
+
*/
|
|
16
|
+
export declare function resetMocks(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get current mock instances for test assertions
|
|
19
|
+
*/
|
|
20
|
+
export declare function getMocks(): {
|
|
21
|
+
storage: MockStorage;
|
|
22
|
+
aiOperations: MockAIOperations;
|
|
23
|
+
modelProvider: MockModelProvider;
|
|
24
|
+
contextBuilder: MockContextBuilder;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=test-mock-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-mock-setup.d.ts","sourceRoot":"","sources":["../../src/test/test-mock-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAIlE,eAAO,IAAI,WAAW,EAAE,WAAW,CAAC;AACpC,eAAO,IAAI,gBAAgB,EAAE,gBAAgB,CAAC;AAC9C,eAAO,IAAI,iBAAiB,EAAE,iBAAiB,CAAC;AAChD,eAAO,IAAI,kBAAkB,EAAE,kBAAkB,CAAC;AAElD;;GAEG;AACH,wBAAgB,UAAU,SAazB;AAED;;GAEG;AACH,wBAAgB,QAAQ;;;;;EAOvB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test Mock Setup - Provides mock instances for ai-service-factory
|
|
4
|
+
* Uses the injectTestInstances function to inject mocks
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.mockContextBuilder = exports.mockModelProvider = exports.mockAIOperations = exports.mockStorage = void 0;
|
|
8
|
+
exports.resetMocks = resetMocks;
|
|
9
|
+
exports.getMocks = getMocks;
|
|
10
|
+
const mock_storage_1 = require("./mocks/mock-storage");
|
|
11
|
+
const mock_ai_operations_1 = require("./mocks/mock-ai-operations");
|
|
12
|
+
const mock_model_provider_1 = require("./mocks/mock-model-provider");
|
|
13
|
+
const mock_context_builder_1 = require("./mocks/mock-context-builder");
|
|
14
|
+
const ai_service_factory_1 = require("../utils/ai-service-factory");
|
|
15
|
+
/**
|
|
16
|
+
* Initialize fresh mock instances and inject them into the service factory
|
|
17
|
+
*/
|
|
18
|
+
function resetMocks() {
|
|
19
|
+
exports.mockStorage = new mock_storage_1.MockStorage();
|
|
20
|
+
exports.mockAIOperations = new mock_ai_operations_1.MockAIOperations(); // Cast to any to avoid type issues
|
|
21
|
+
exports.mockModelProvider = new mock_model_provider_1.MockModelProvider();
|
|
22
|
+
exports.mockContextBuilder = new mock_context_builder_1.MockContextBuilder(exports.mockStorage);
|
|
23
|
+
// Inject mocks into the service factory
|
|
24
|
+
(0, ai_service_factory_1.injectTestInstances)({
|
|
25
|
+
storage: exports.mockStorage,
|
|
26
|
+
aiOperations: exports.mockAIOperations,
|
|
27
|
+
modelProvider: exports.mockModelProvider,
|
|
28
|
+
contextBuilder: exports.mockContextBuilder,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get current mock instances for test assertions
|
|
33
|
+
*/
|
|
34
|
+
function getMocks() {
|
|
35
|
+
return {
|
|
36
|
+
storage: exports.mockStorage,
|
|
37
|
+
aiOperations: exports.mockAIOperations,
|
|
38
|
+
modelProvider: exports.mockModelProvider,
|
|
39
|
+
contextBuilder: exports.mockContextBuilder,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Setup - Global test configuration and cleanup
|
|
3
|
+
* This file sets up the test environment to ensure proper isolation and configuration
|
|
4
|
+
*/
|
|
5
|
+
export declare function setupTestEnvironment(): {
|
|
6
|
+
config: import("../lib/config").Config;
|
|
7
|
+
workingDir: string;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=test-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-setup.d.ts","sourceRoot":"","sources":["../../src/test/test-setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsCH,wBAAgB,oBAAoB;;;EAMnC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Test Setup - Global test configuration and cleanup
|
|
4
|
+
* This file sets up the test environment to ensure proper isolation and configuration
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.setupTestEnvironment = setupTestEnvironment;
|
|
8
|
+
const config_1 = require("../lib/config");
|
|
9
|
+
const hooks_1 = require("../lib/hooks");
|
|
10
|
+
const test_mock_setup_1 = require("./test-mock-setup");
|
|
11
|
+
// Global test setup
|
|
12
|
+
before(async function () {
|
|
13
|
+
// Set up a test working directory
|
|
14
|
+
const testDir = process.cwd();
|
|
15
|
+
config_1.configManager.setWorkingDirectory(testDir);
|
|
16
|
+
// Set up a minimal test configuration (no need to load from disk)
|
|
17
|
+
config_1.configManager.setConfig({
|
|
18
|
+
ai: {
|
|
19
|
+
provider: "openrouter",
|
|
20
|
+
model: "anthropic/claude-3-5-sonnet",
|
|
21
|
+
maxTokens: 4000,
|
|
22
|
+
temperature: 0.7,
|
|
23
|
+
apiKey: "test-key",
|
|
24
|
+
},
|
|
25
|
+
workingDirectory: testDir,
|
|
26
|
+
});
|
|
27
|
+
// Reset mocks to ensure clean state
|
|
28
|
+
(0, test_mock_setup_1.resetMocks)();
|
|
29
|
+
});
|
|
30
|
+
// Clean up between tests
|
|
31
|
+
afterEach(function () {
|
|
32
|
+
// Reset mocks to ensure clean state
|
|
33
|
+
(0, test_mock_setup_1.resetMocks)();
|
|
34
|
+
// Clean up hooks to prevent interference
|
|
35
|
+
hooks_1.hooks.clear();
|
|
36
|
+
});
|
|
37
|
+
// Additional test utilities
|
|
38
|
+
function setupTestEnvironment() {
|
|
39
|
+
// This can be called in individual tests for additional setup
|
|
40
|
+
return {
|
|
41
|
+
config: config_1.configManager.getConfig(),
|
|
42
|
+
workingDir: config_1.configManager.getWorkingDirectory(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { MockStorage } from "./mocks/mock-storage";
|
|
2
|
+
import { MockAIOperations } from "./mocks/mock-ai-operations";
|
|
3
|
+
import { MockModelProvider } from "./mocks/mock-model-provider";
|
|
4
|
+
import { MockContextBuilder } from "./mocks/mock-context-builder";
|
|
5
|
+
export interface TestContext {
|
|
6
|
+
storage: MockStorage;
|
|
7
|
+
aiOperations: MockAIOperations;
|
|
8
|
+
modelProvider: MockModelProvider;
|
|
9
|
+
contextBuilder: MockContextBuilder;
|
|
10
|
+
}
|
|
11
|
+
export declare function createTestContext(): TestContext;
|
|
12
|
+
export declare function createTestTaskData(): {
|
|
13
|
+
title: string;
|
|
14
|
+
description: string;
|
|
15
|
+
content: string;
|
|
16
|
+
effort: "medium";
|
|
17
|
+
};
|
|
18
|
+
export declare function createTestPRDData(): {
|
|
19
|
+
description: string;
|
|
20
|
+
content: string;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../src/test/test-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,iBAAiB,CAAC;IACjC,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAc/C;AAED,wBAAgB,kBAAkB;;;;;EAOjC;AAED,wBAAgB,iBAAiB;;;EAMhC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTestContext = createTestContext;
|
|
4
|
+
exports.createTestTaskData = createTestTaskData;
|
|
5
|
+
exports.createTestPRDData = createTestPRDData;
|
|
6
|
+
const mock_service_factory_1 = require("./mocks/mock-service-factory");
|
|
7
|
+
const mock_storage_1 = require("./mocks/mock-storage");
|
|
8
|
+
const mock_ai_operations_1 = require("./mocks/mock-ai-operations");
|
|
9
|
+
const mock_model_provider_1 = require("./mocks/mock-model-provider");
|
|
10
|
+
const mock_context_builder_1 = require("./mocks/mock-context-builder");
|
|
11
|
+
function createTestContext() {
|
|
12
|
+
(0, mock_service_factory_1.resetMockServices)();
|
|
13
|
+
const storage = new mock_storage_1.MockStorage();
|
|
14
|
+
const aiOperations = new mock_ai_operations_1.MockAIOperations();
|
|
15
|
+
const modelProvider = new mock_model_provider_1.MockModelProvider();
|
|
16
|
+
const contextBuilder = new mock_context_builder_1.MockContextBuilder(storage);
|
|
17
|
+
return {
|
|
18
|
+
storage,
|
|
19
|
+
aiOperations,
|
|
20
|
+
modelProvider,
|
|
21
|
+
contextBuilder,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function createTestTaskData() {
|
|
25
|
+
return {
|
|
26
|
+
title: "Test Task",
|
|
27
|
+
description: "This is a test task description",
|
|
28
|
+
content: "Full content for the test task",
|
|
29
|
+
effort: "medium",
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function createTestPRDData() {
|
|
33
|
+
return {
|
|
34
|
+
description: "Test PRD description",
|
|
35
|
+
content: "# Test PRD\n\nThis is a test PRD document with multiple sections.\n\n## Features\n- Feature 1\n- Feature 2\n\n## Requirements\n- Requirement 1\n- Requirement 2",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-operation-utility.test.d.ts","sourceRoot":"","sources":["../../../src/test/utils/ai-operation-utility.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,290 @@
|
|
|
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
|
+
const assert = __importStar(require("assert"));
|
|
37
|
+
const ai_operation_utility_1 = require("../../utils/ai-operation-utility");
|
|
38
|
+
const task_o_matic_error_1 = require("../../utils/task-o-matic-error");
|
|
39
|
+
/**
|
|
40
|
+
* ⚠️ CRITICAL: These tests use 100% MOCKS - ZERO real AI calls
|
|
41
|
+
* No API calls are made, no costs incurred, tests run fast
|
|
42
|
+
*/
|
|
43
|
+
describe("AIOperationUtility", () => {
|
|
44
|
+
let utility;
|
|
45
|
+
let mockRetryHandler;
|
|
46
|
+
let mockModelProvider;
|
|
47
|
+
let mockContext7Client;
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
// Create utility instance
|
|
50
|
+
utility = new ai_operation_utility_1.AIOperationUtility();
|
|
51
|
+
// Create mock retry handler - NO REAL RETRIES
|
|
52
|
+
mockRetryHandler = {
|
|
53
|
+
executeWithRetry: async (operation) => {
|
|
54
|
+
// Execute immediately without real retry logic
|
|
55
|
+
return await operation();
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
// Create mock model provider - NO REAL AI MODELS
|
|
59
|
+
mockModelProvider = {
|
|
60
|
+
getModel: () => ({
|
|
61
|
+
// Mock AI SDK v2 compliant model
|
|
62
|
+
specificationVersion: "v2",
|
|
63
|
+
provider: "mock",
|
|
64
|
+
modelId: "mock-model",
|
|
65
|
+
doGenerate: async () => ({
|
|
66
|
+
text: "Mock response",
|
|
67
|
+
finishReason: "stop",
|
|
68
|
+
usage: {
|
|
69
|
+
promptTokens: 10,
|
|
70
|
+
completionTokens: 5,
|
|
71
|
+
totalTokens: 15,
|
|
72
|
+
},
|
|
73
|
+
}),
|
|
74
|
+
doStream: async () => ({
|
|
75
|
+
stream: (async function* () {
|
|
76
|
+
yield { type: "text-delta", textDelta: "Mock" };
|
|
77
|
+
yield { type: "text-delta", textDelta: " response" };
|
|
78
|
+
})(),
|
|
79
|
+
}),
|
|
80
|
+
}),
|
|
81
|
+
getAIConfig: () => ({
|
|
82
|
+
provider: "mock",
|
|
83
|
+
model: "mock-model",
|
|
84
|
+
apiKey: "mock-key",
|
|
85
|
+
}),
|
|
86
|
+
};
|
|
87
|
+
// Create mock Context7 client - NO REAL DOCUMENTATION FETCHES
|
|
88
|
+
mockContext7Client = {
|
|
89
|
+
saveContext7Documentation: () => {
|
|
90
|
+
// Mock save - no real file writes
|
|
91
|
+
},
|
|
92
|
+
getMCPTools: async () => ({}),
|
|
93
|
+
};
|
|
94
|
+
// Inject mocks into utility
|
|
95
|
+
utility.retryHandler = mockRetryHandler;
|
|
96
|
+
utility.modelProvider = mockModelProvider;
|
|
97
|
+
utility.context7Client = mockContext7Client;
|
|
98
|
+
});
|
|
99
|
+
describe("executeAIOperation", () => {
|
|
100
|
+
it("should execute operation successfully and return result with metrics", async () => {
|
|
101
|
+
// Mock operation that returns a simple result
|
|
102
|
+
const mockResult = { data: "test result" };
|
|
103
|
+
const operation = async () => mockResult;
|
|
104
|
+
const result = await utility.executeAIOperation("test operation", operation);
|
|
105
|
+
assert.deepStrictEqual(result.result, mockResult);
|
|
106
|
+
assert.ok("duration" in result.metrics);
|
|
107
|
+
assert.strictEqual(typeof result.metrics.duration, "number");
|
|
108
|
+
assert.ok(result.metrics.duration >= 0);
|
|
109
|
+
});
|
|
110
|
+
it("should throw TaskOMaticError when operation fails", async () => {
|
|
111
|
+
// Mock operation that throws an error
|
|
112
|
+
const operation = async () => {
|
|
113
|
+
throw new Error("Mock AI failure");
|
|
114
|
+
};
|
|
115
|
+
try {
|
|
116
|
+
await utility.executeAIOperation("test operation", operation);
|
|
117
|
+
assert.fail("Should have thrown TaskOMaticError");
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
assert.ok(error instanceof task_o_matic_error_1.TaskOMaticError);
|
|
121
|
+
assert.strictEqual(error.code, "AI_OPERATION_FAILED");
|
|
122
|
+
assert.ok(error.message.includes("test operation"));
|
|
123
|
+
assert.ok(Array.isArray(error.suggestions));
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
it("should preserve error details in TaskOMaticError", async () => {
|
|
127
|
+
const originalError = new Error("Original error message");
|
|
128
|
+
const operation = async () => {
|
|
129
|
+
throw originalError;
|
|
130
|
+
};
|
|
131
|
+
try {
|
|
132
|
+
await utility.executeAIOperation("test operation", operation);
|
|
133
|
+
assert.fail("Should have thrown");
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
assert.ok(error instanceof task_o_matic_error_1.TaskOMaticError);
|
|
137
|
+
const taskError = error;
|
|
138
|
+
assert.strictEqual(taskError.cause, originalError);
|
|
139
|
+
assert.ok(taskError.context?.includes("test operation"));
|
|
140
|
+
assert.ok("operationName" in (taskError.metadata || {}));
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
it("should capture duration metrics correctly", async () => {
|
|
144
|
+
const operation = async () => {
|
|
145
|
+
// Simulate some work
|
|
146
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
147
|
+
return { data: "result" };
|
|
148
|
+
};
|
|
149
|
+
const result = await utility.executeAIOperation("slow operation", operation);
|
|
150
|
+
assert.ok(result.metrics.duration >= 50);
|
|
151
|
+
});
|
|
152
|
+
it("should respect maxRetries option", async () => {
|
|
153
|
+
let attemptCount = 0;
|
|
154
|
+
// Mock retry handler that counts attempts
|
|
155
|
+
utility.retryHandler = {
|
|
156
|
+
executeWithRetry: async (operation, config) => {
|
|
157
|
+
attemptCount++;
|
|
158
|
+
assert.strictEqual(config.maxAttempts, 5);
|
|
159
|
+
return await operation();
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
const operation = async () => ({ data: "result" });
|
|
163
|
+
await utility.executeAIOperation("test", operation, { maxRetries: 5 });
|
|
164
|
+
assert.strictEqual(attemptCount, 1);
|
|
165
|
+
});
|
|
166
|
+
it("should extract token usage from result if available", async () => {
|
|
167
|
+
const mockResult = {
|
|
168
|
+
data: "test",
|
|
169
|
+
usage: {
|
|
170
|
+
prompt_tokens: 100,
|
|
171
|
+
completion_tokens: 50,
|
|
172
|
+
total_tokens: 150,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
const operation = async () => mockResult;
|
|
176
|
+
const result = await utility.executeAIOperation("test", operation);
|
|
177
|
+
assert.deepStrictEqual(result.metrics.tokenUsage, {
|
|
178
|
+
prompt: 100,
|
|
179
|
+
completion: 50,
|
|
180
|
+
total: 150,
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
it("should return undefined tokenUsage if not available in result", async () => {
|
|
184
|
+
const mockResult = { data: "test" };
|
|
185
|
+
const operation = async () => mockResult;
|
|
186
|
+
const result = await utility.executeAIOperation("test", operation);
|
|
187
|
+
assert.strictEqual(result.metrics.tokenUsage, undefined);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe("streamTextWithTools", () => {
|
|
191
|
+
it("should verify method signature exists - NO REAL AI CALL", async () => {
|
|
192
|
+
// This test verifies the method exists and has the correct signature
|
|
193
|
+
// We don't actually call it to avoid real AI calls
|
|
194
|
+
assert.strictEqual(typeof utility.streamTextWithTools, "function");
|
|
195
|
+
// Verify the method is accessible
|
|
196
|
+
assert.ok("streamTextWithTools" in utility);
|
|
197
|
+
});
|
|
198
|
+
it("should pass tools to streamText when provided - NO REAL AI CALL", async () => {
|
|
199
|
+
// This test would verify tool passing in a real scenario
|
|
200
|
+
// For now, we just verify the method accepts tools parameter
|
|
201
|
+
const mockTools = {
|
|
202
|
+
readFile: {
|
|
203
|
+
description: "Read a file",
|
|
204
|
+
parameters: {},
|
|
205
|
+
execute: async () => ({}),
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
// The method should not throw
|
|
209
|
+
try {
|
|
210
|
+
// We can't fully test without real AI, but we verify the signature
|
|
211
|
+
assert.strictEqual(typeof utility.streamTextWithTools, "function");
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
assert.fail("Should not throw with valid parameters");
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe("Error Handling", () => {
|
|
219
|
+
it("should wrap string errors in Error objects", async () => {
|
|
220
|
+
const operation = async () => {
|
|
221
|
+
throw "String error";
|
|
222
|
+
};
|
|
223
|
+
try {
|
|
224
|
+
await utility.executeAIOperation("test", operation);
|
|
225
|
+
assert.fail("Should have thrown");
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
assert.ok(error instanceof task_o_matic_error_1.TaskOMaticError);
|
|
229
|
+
assert.ok(error.cause instanceof Error);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
it("should include suggestions in thrown errors", async () => {
|
|
233
|
+
const operation = async () => {
|
|
234
|
+
throw new Error("Network timeout");
|
|
235
|
+
};
|
|
236
|
+
try {
|
|
237
|
+
await utility.executeAIOperation("test", operation);
|
|
238
|
+
assert.fail("Should have thrown");
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
const taskError = error;
|
|
242
|
+
assert.ok(Array.isArray(taskError.suggestions));
|
|
243
|
+
assert.ok(taskError.suggestions.length > 0);
|
|
244
|
+
assert.ok(taskError.suggestions?.includes("Check AI configuration"));
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe("Metrics Collection", () => {
|
|
249
|
+
it("should always include duration in metrics", async () => {
|
|
250
|
+
const operation = async () => ({ data: "result" });
|
|
251
|
+
const result = await utility.executeAIOperation("test", operation);
|
|
252
|
+
assert.ok("duration" in result.metrics);
|
|
253
|
+
assert.strictEqual(typeof result.metrics.duration, "number");
|
|
254
|
+
assert.ok(result.metrics.duration >= 0);
|
|
255
|
+
});
|
|
256
|
+
it("should capture metrics even on error", async () => {
|
|
257
|
+
const operation = async () => {
|
|
258
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
259
|
+
throw new Error("Failure");
|
|
260
|
+
};
|
|
261
|
+
try {
|
|
262
|
+
await utility.executeAIOperation("test", operation);
|
|
263
|
+
assert.fail("Should have thrown");
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
const taskError = error;
|
|
267
|
+
assert.ok("duration" in (taskError.metadata || {}));
|
|
268
|
+
assert.ok(taskError.metadata?.duration >= 10);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
describe("Streaming Options", () => {
|
|
273
|
+
it("should wrap streaming options without modifying original", async () => {
|
|
274
|
+
let chunkCount = 0;
|
|
275
|
+
const originalOnChunk = (chunk) => {
|
|
276
|
+
chunkCount++;
|
|
277
|
+
};
|
|
278
|
+
const streamingOptions = {
|
|
279
|
+
onChunk: originalOnChunk,
|
|
280
|
+
};
|
|
281
|
+
// The wrapping happens internally, we just verify it doesn't throw
|
|
282
|
+
const operation = async () => ({ data: "result" });
|
|
283
|
+
await utility.executeAIOperation("test", operation, {
|
|
284
|
+
streamingOptions,
|
|
285
|
+
});
|
|
286
|
+
// Original callback should not be modified
|
|
287
|
+
assert.strictEqual(streamingOptions.onChunk, originalOnChunk);
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handling.test.d.ts","sourceRoot":"","sources":["../../../src/test/utils/error-handling.test.ts"],"names":[],"mappings":""}
|