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,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KiloExecutor = void 0;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const logger_1 = require("../logger");
|
|
6
|
+
class KiloExecutor {
|
|
7
|
+
name = "kilo";
|
|
8
|
+
config;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
supportsSessionResumption() {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
async execute(message, dry = false, config) {
|
|
16
|
+
// Merge constructor config with execution config (execution takes precedence)
|
|
17
|
+
const finalConfig = { ...this.config, ...config };
|
|
18
|
+
// Build arguments array
|
|
19
|
+
const args = [];
|
|
20
|
+
// Add model if specified
|
|
21
|
+
if (finalConfig.model) {
|
|
22
|
+
args.push("-mo", finalConfig.model);
|
|
23
|
+
logger_1.logger.progress(`🤖 Using model: ${finalConfig.model}`);
|
|
24
|
+
}
|
|
25
|
+
// Add session resumption if specified
|
|
26
|
+
if (finalConfig.continueLastSession) {
|
|
27
|
+
args.push("-c");
|
|
28
|
+
logger_1.logger.progress("🔄 Continuing last session");
|
|
29
|
+
}
|
|
30
|
+
else if (finalConfig.sessionId) {
|
|
31
|
+
args.push("-s", finalConfig.sessionId);
|
|
32
|
+
logger_1.logger.progress(`🔄 Resuming session: ${finalConfig.sessionId}`);
|
|
33
|
+
}
|
|
34
|
+
// Run in autonomous mode (non-interactive) for automation
|
|
35
|
+
args.push("--auto");
|
|
36
|
+
// Enable auto-approval of all tool permissions
|
|
37
|
+
args.push("--yolo");
|
|
38
|
+
// Add prompt as positional argument
|
|
39
|
+
args.push(message);
|
|
40
|
+
if (dry) {
|
|
41
|
+
logger_1.logger.progress(`🔧 Using executor: ${this.name}`);
|
|
42
|
+
logger_1.logger.progress(`kilocode ${args.join(" ")}`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Launch kilocode and wait for it to complete
|
|
46
|
+
const child = (0, node_child_process_1.spawn)("kilocode", args, {
|
|
47
|
+
stdio: "inherit", // Give tool full terminal control
|
|
48
|
+
});
|
|
49
|
+
// Wait for completion (blocking)
|
|
50
|
+
await new Promise((resolve, reject) => {
|
|
51
|
+
child.on("close", (code) => {
|
|
52
|
+
if (code === 0) {
|
|
53
|
+
logger_1.logger.success("✅ Kilo Code execution completed successfully");
|
|
54
|
+
resolve();
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const error = new Error(`Kilo Code exited with code ${code}`);
|
|
58
|
+
logger_1.logger.error(`❌ ${error.message}`);
|
|
59
|
+
reject(error);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
child.on("error", (error) => {
|
|
63
|
+
logger_1.logger.error(`❌ Failed to launch Kilo Code: ${error.message}`);
|
|
64
|
+
reject(error);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.KiloExecutor = KiloExecutor;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExecutorConfig, ExternalExecutor } from "../../types";
|
|
2
|
+
export declare class OpencodeExecutor implements ExternalExecutor {
|
|
3
|
+
name: string;
|
|
4
|
+
private config?;
|
|
5
|
+
constructor(config?: ExecutorConfig);
|
|
6
|
+
supportsSessionResumption(): boolean;
|
|
7
|
+
execute(message: string, dry?: boolean, config?: ExecutorConfig): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=opencode-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-executor.d.ts","sourceRoot":"","sources":["../../../src/lib/executors/opencode-executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpE,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAc;IAClB,OAAO,CAAC,MAAM,CAAC,CAAiB;gBAEpB,MAAM,CAAC,EAAE,cAAc;IAInC,yBAAyB,IAAI,OAAO;IAI9B,OAAO,CACX,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,OAAe,EACpB,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;CA2DjB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpencodeExecutor = void 0;
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const logger_1 = require("../logger");
|
|
6
|
+
class OpencodeExecutor {
|
|
7
|
+
name = "opencode";
|
|
8
|
+
config;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
supportsSessionResumption() {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
async execute(message, dry = false, config) {
|
|
16
|
+
// Merge constructor config with execution config (execution takes precedence)
|
|
17
|
+
const finalConfig = { ...this.config, ...config };
|
|
18
|
+
// Build arguments array
|
|
19
|
+
const args = [];
|
|
20
|
+
// Add model if specified
|
|
21
|
+
if (finalConfig.model) {
|
|
22
|
+
args.push("-m", finalConfig.model);
|
|
23
|
+
logger_1.logger.progress(`🤖 Using model: ${finalConfig.model}`);
|
|
24
|
+
}
|
|
25
|
+
// Add session resumption if specified
|
|
26
|
+
if (finalConfig.continueLastSession) {
|
|
27
|
+
args.push("-c");
|
|
28
|
+
logger_1.logger.progress("🔄 Continuing last session");
|
|
29
|
+
}
|
|
30
|
+
else if (finalConfig.sessionId) {
|
|
31
|
+
args.push("-s", finalConfig.sessionId);
|
|
32
|
+
logger_1.logger.progress(`🔄 Resuming session: ${finalConfig.sessionId}`);
|
|
33
|
+
}
|
|
34
|
+
// Use 'run' subcommand with message as positional argument
|
|
35
|
+
args.push("run", message);
|
|
36
|
+
if (dry) {
|
|
37
|
+
logger_1.logger.progress(`🔧 Using executor: ${this.name}`);
|
|
38
|
+
// Quote arguments that contain spaces for display
|
|
39
|
+
const quotedArgs = args.map((arg) => arg.includes(" ") ? `"${arg.replace(/"/g, '\\"')}"` : arg);
|
|
40
|
+
logger_1.logger.progress(`opencode ${quotedArgs.join(" ")}`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Launch opencode and wait for it to complete
|
|
44
|
+
const child = (0, node_child_process_1.spawn)("opencode", args, {
|
|
45
|
+
stdio: "inherit", // Give tool full terminal control
|
|
46
|
+
});
|
|
47
|
+
// Wait for completion (blocking)
|
|
48
|
+
await new Promise((resolve, reject) => {
|
|
49
|
+
child.on("close", (code) => {
|
|
50
|
+
if (code === 0) {
|
|
51
|
+
logger_1.logger.success("✅ Opencode execution completed successfully");
|
|
52
|
+
resolve();
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const error = new Error(`Opencode exited with code ${code}`);
|
|
56
|
+
logger_1.logger.error(`❌ ${error.message}`);
|
|
57
|
+
reject(error);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
child.on("error", (error) => {
|
|
61
|
+
logger_1.logger.error(`❌ Failed to launch opencode: ${error.message}`);
|
|
62
|
+
reject(error);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.OpencodeExecutor = OpencodeExecutor;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git state captured before and after execution
|
|
3
|
+
*/
|
|
4
|
+
export interface GitState {
|
|
5
|
+
beforeHead: string;
|
|
6
|
+
afterHead: string;
|
|
7
|
+
hasUncommittedChanges: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Commit information extracted from git state
|
|
11
|
+
*/
|
|
12
|
+
export interface CommitInfo {
|
|
13
|
+
message: string;
|
|
14
|
+
files: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if new commits were made since a given HEAD
|
|
18
|
+
* Used to detect if the AI agent already committed during execution
|
|
19
|
+
*/
|
|
20
|
+
export declare function hasNewCommitsSince(beforeHead: string, execFn?: (command: string) => Promise<{
|
|
21
|
+
stdout: string;
|
|
22
|
+
stderr: string;
|
|
23
|
+
}>): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Capture git state (HEAD commit and uncommitted changes)
|
|
26
|
+
*/
|
|
27
|
+
export declare function captureGitState(execFn?: (command: string) => Promise<{
|
|
28
|
+
stdout: string;
|
|
29
|
+
stderr: string;
|
|
30
|
+
}>): Promise<Partial<GitState>>;
|
|
31
|
+
/**
|
|
32
|
+
* Extract commit message and file list from git state
|
|
33
|
+
* This function analyzes the actual git state to generate appropriate commit info
|
|
34
|
+
*/
|
|
35
|
+
export declare function extractCommitInfo(taskId: string, taskTitle: string, executionMessage: string, gitState: GitState, execFn?: (command: string) => Promise<{
|
|
36
|
+
stdout: string;
|
|
37
|
+
stderr: string;
|
|
38
|
+
}>, aiOps?: any): Promise<CommitInfo>;
|
|
39
|
+
/**
|
|
40
|
+
* Auto-commit changes using the provided commit info
|
|
41
|
+
*/
|
|
42
|
+
export declare function autoCommit(commitInfo: CommitInfo, execFn?: (command: string) => Promise<{
|
|
43
|
+
stdout: string;
|
|
44
|
+
stderr: string;
|
|
45
|
+
}>): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Commit a specific file with a custom message
|
|
48
|
+
*/
|
|
49
|
+
export declare function commitFile(filePath: string, message: string, execFn?: (command: string) => Promise<{
|
|
50
|
+
stdout: string;
|
|
51
|
+
stderr: string;
|
|
52
|
+
}>): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Check if the working directory is clean
|
|
55
|
+
*/
|
|
56
|
+
export declare function isClean(execFn?: (command: string) => Promise<{
|
|
57
|
+
stdout: string;
|
|
58
|
+
stderr: string;
|
|
59
|
+
}>): Promise<boolean>;
|
|
60
|
+
/**
|
|
61
|
+
* Get the current branch name
|
|
62
|
+
*/
|
|
63
|
+
export declare function getCurrentBranch(execFn?: (command: string) => Promise<{
|
|
64
|
+
stdout: string;
|
|
65
|
+
stderr: string;
|
|
66
|
+
}>): Promise<string>;
|
|
67
|
+
/**
|
|
68
|
+
* Create a new branch for benchmarking
|
|
69
|
+
*/
|
|
70
|
+
export declare function createBenchmarkBranch(name: string, baseBranch?: string, execFn?: (command: string) => Promise<{
|
|
71
|
+
stdout: string;
|
|
72
|
+
stderr: string;
|
|
73
|
+
}>): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Checkout an existing branch
|
|
76
|
+
*/
|
|
77
|
+
export declare function checkoutBranch(name: string, execFn?: (command: string) => Promise<{
|
|
78
|
+
stdout: string;
|
|
79
|
+
stderr: string;
|
|
80
|
+
}>): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Delete a benchmark branch (force delete)
|
|
83
|
+
*/
|
|
84
|
+
export declare function cleanupBenchmarkBranch(name: string, execFn?: (command: string) => Promise<{
|
|
85
|
+
stdout: string;
|
|
86
|
+
stderr: string;
|
|
87
|
+
}>): Promise<void>;
|
|
88
|
+
//# sourceMappingURL=git-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-utils.d.ts","sourceRoot":"","sources":["../../src/lib/git-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasNewCommitsSince = hasNewCommitsSince;
|
|
4
|
+
exports.captureGitState = captureGitState;
|
|
5
|
+
exports.extractCommitInfo = extractCommitInfo;
|
|
6
|
+
exports.autoCommit = autoCommit;
|
|
7
|
+
exports.commitFile = commitFile;
|
|
8
|
+
exports.isClean = isClean;
|
|
9
|
+
exports.getCurrentBranch = getCurrentBranch;
|
|
10
|
+
exports.createBenchmarkBranch = createBenchmarkBranch;
|
|
11
|
+
exports.checkoutBranch = checkoutBranch;
|
|
12
|
+
exports.cleanupBenchmarkBranch = cleanupBenchmarkBranch;
|
|
13
|
+
const child_process_1 = require("child_process");
|
|
14
|
+
const util_1 = require("util");
|
|
15
|
+
const logger_1 = require("./logger");
|
|
16
|
+
const ai_service_factory_1 = require("../utils/ai-service-factory");
|
|
17
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
18
|
+
/**
|
|
19
|
+
* Check if new commits were made since a given HEAD
|
|
20
|
+
* Used to detect if the AI agent already committed during execution
|
|
21
|
+
*/
|
|
22
|
+
async function hasNewCommitsSince(beforeHead, execFn = execAsync) {
|
|
23
|
+
if (!beforeHead)
|
|
24
|
+
return false;
|
|
25
|
+
try {
|
|
26
|
+
const { stdout } = await execFn("git rev-parse HEAD");
|
|
27
|
+
return stdout.trim() !== beforeHead;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Capture git state (HEAD commit and uncommitted changes)
|
|
35
|
+
*/
|
|
36
|
+
async function captureGitState(execFn = execAsync) {
|
|
37
|
+
try {
|
|
38
|
+
const { stdout: headStdout } = await execFn("git rev-parse HEAD");
|
|
39
|
+
const { stdout: statusStdout } = await execFn("git status --porcelain");
|
|
40
|
+
return {
|
|
41
|
+
beforeHead: headStdout.trim(),
|
|
42
|
+
afterHead: headStdout.trim(),
|
|
43
|
+
hasUncommittedChanges: statusStdout.trim().length > 0,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
// Git might not be initialized or no commits yet
|
|
48
|
+
return {};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extract commit message and file list from git state
|
|
53
|
+
* This function analyzes the actual git state to generate appropriate commit info
|
|
54
|
+
*/
|
|
55
|
+
async function extractCommitInfo(taskId, taskTitle, executionMessage, gitState, execFn = execAsync, aiOps = (0, ai_service_factory_1.getAIOperations)()) {
|
|
56
|
+
try {
|
|
57
|
+
// Case 1: Executor created a commit
|
|
58
|
+
if (gitState.beforeHead !== gitState.afterHead) {
|
|
59
|
+
logger_1.logger.info("📝 Executor created a commit, extracting info...");
|
|
60
|
+
const { stdout } = await execFn(`git show --stat --format="%s%n%b" ${gitState.afterHead}`);
|
|
61
|
+
const lines = stdout.trim().split("\n");
|
|
62
|
+
const message = lines[0].trim();
|
|
63
|
+
// Parse files from stat output (e.g. " src/file.ts | 10 +")
|
|
64
|
+
const files = lines
|
|
65
|
+
.slice(1)
|
|
66
|
+
.filter((line) => line.includes("|"))
|
|
67
|
+
.map((line) => line.split("|")[0].trim());
|
|
68
|
+
return {
|
|
69
|
+
message,
|
|
70
|
+
files,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Case 2: Executor left uncommitted changes
|
|
74
|
+
if (gitState.hasUncommittedChanges) {
|
|
75
|
+
logger_1.logger.info("📝 Uncommitted changes detected, generating commit message...");
|
|
76
|
+
// Get the diff to send to AI
|
|
77
|
+
const { stdout: diff } = await execFn("git diff HEAD");
|
|
78
|
+
// Get list of changed files
|
|
79
|
+
const { stdout: status } = await execFn("git status --porcelain");
|
|
80
|
+
const files = status
|
|
81
|
+
.split("\n")
|
|
82
|
+
.filter((line) => line.length > 0)
|
|
83
|
+
.map((line) => line.substring(3).trim())
|
|
84
|
+
.filter((file) => file.length > 0);
|
|
85
|
+
// Use AI to generate commit message based on the diff
|
|
86
|
+
const prompt = `Based on the following git diff, generate a concise git commit message.
|
|
87
|
+
|
|
88
|
+
Task: ${taskTitle}
|
|
89
|
+
|
|
90
|
+
Git Diff:
|
|
91
|
+
${diff.substring(0, 10000)} // Limit diff size
|
|
92
|
+
|
|
93
|
+
Please respond in JSON format:
|
|
94
|
+
{
|
|
95
|
+
"message": "concise commit message following conventional commits format"
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
The commit message should:
|
|
99
|
+
- Follow conventional commits format (feat:, fix:, refactor:, etc.)
|
|
100
|
+
- Be concise and descriptive
|
|
101
|
+
- Focus on what changed
|
|
102
|
+
`;
|
|
103
|
+
const response = await aiOps.streamText(prompt, undefined, "You are a helpful assistant that generates git commit messages.");
|
|
104
|
+
// Try to parse JSON from response
|
|
105
|
+
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
106
|
+
let message = `feat: complete task ${taskTitle}`;
|
|
107
|
+
if (jsonMatch) {
|
|
108
|
+
try {
|
|
109
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
110
|
+
if (parsed.message) {
|
|
111
|
+
message = parsed.message;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
// Ignore parse error
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
message,
|
|
120
|
+
files,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
// Case 3: No changes detected
|
|
124
|
+
return {
|
|
125
|
+
message: `feat: complete task ${taskTitle}`,
|
|
126
|
+
files: [],
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
logger_1.logger.warn(`⚠️ Failed to extract commit info: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
131
|
+
// Fallback commit info
|
|
132
|
+
return {
|
|
133
|
+
message: `feat: complete task ${taskTitle}`,
|
|
134
|
+
files: [],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Auto-commit changes using the provided commit info
|
|
140
|
+
*/
|
|
141
|
+
async function autoCommit(commitInfo, execFn = execAsync) {
|
|
142
|
+
try {
|
|
143
|
+
const { message, files } = commitInfo;
|
|
144
|
+
if (files.length > 0) {
|
|
145
|
+
// Stage specific files
|
|
146
|
+
const gitAdd = `git add ${files.join(" ")}`;
|
|
147
|
+
logger_1.logger.info(`📦 Staging files: ${gitAdd}`);
|
|
148
|
+
await execFn(gitAdd);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Stage all changes
|
|
152
|
+
logger_1.logger.info("📦 Staging all changes");
|
|
153
|
+
await execFn("git add .");
|
|
154
|
+
}
|
|
155
|
+
// Commit
|
|
156
|
+
const gitCommit = `git commit -m "${message}"`;
|
|
157
|
+
logger_1.logger.info(`💾 Committing: ${message}`);
|
|
158
|
+
await execFn(gitCommit);
|
|
159
|
+
logger_1.logger.success("✅ Changes committed successfully\n");
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
logger_1.logger.warn(`⚠️ Auto-commit failed: ${error instanceof Error ? error.message : "Unknown error"}\n`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Commit a specific file with a custom message
|
|
167
|
+
*/
|
|
168
|
+
async function commitFile(filePath, message, execFn = execAsync) {
|
|
169
|
+
try {
|
|
170
|
+
logger_1.logger.info(`📦 Staging file: ${filePath}`);
|
|
171
|
+
await execFn(`git add ${filePath}`);
|
|
172
|
+
await execFn(`git commit -m "${message}"`);
|
|
173
|
+
logger_1.logger.success("✅ File committed successfully");
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
logger_1.logger.warn(`⚠️ Failed to commit file: ${e instanceof Error ? e.message : "Unknown error"}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Benchmarking Git Utilities
|
|
181
|
+
// ============================================================================
|
|
182
|
+
/**
|
|
183
|
+
* Check if the working directory is clean
|
|
184
|
+
*/
|
|
185
|
+
async function isClean(execFn = execAsync) {
|
|
186
|
+
try {
|
|
187
|
+
const { stdout } = await execFn("git status --porcelain");
|
|
188
|
+
return stdout.trim().length === 0;
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
logger_1.logger.warn("Could not check git status");
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Get the current branch name
|
|
197
|
+
*/
|
|
198
|
+
async function getCurrentBranch(execFn = execAsync) {
|
|
199
|
+
try {
|
|
200
|
+
const { stdout } = await execFn("git rev-parse --abbrev-ref HEAD");
|
|
201
|
+
return stdout.trim();
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
throw new Error("Failed to get current branch");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Create a new branch for benchmarking
|
|
209
|
+
*/
|
|
210
|
+
async function createBenchmarkBranch(name, baseBranch = "HEAD", execFn = execAsync) {
|
|
211
|
+
try {
|
|
212
|
+
logger_1.logger.info(`🌿 Creating benchmark branch: ${name} from ${baseBranch}`);
|
|
213
|
+
await execFn(`git checkout -b ${name} ${baseBranch}`);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
throw new Error(`Failed to create benchmark branch ${name}: ${error}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Checkout an existing branch
|
|
221
|
+
*/
|
|
222
|
+
async function checkoutBranch(name, execFn = execAsync) {
|
|
223
|
+
try {
|
|
224
|
+
logger_1.logger.info(`🌿 Checking out branch: ${name}`);
|
|
225
|
+
await execFn(`git checkout ${name}`);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
throw new Error(`Failed to checkout branch ${name}: ${error}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Delete a benchmark branch (force delete)
|
|
233
|
+
*/
|
|
234
|
+
async function cleanupBenchmarkBranch(name, execFn = execAsync) {
|
|
235
|
+
try {
|
|
236
|
+
logger_1.logger.info(`🗑️ Deleting benchmark branch: ${name}`);
|
|
237
|
+
await execFn(`git branch -D ${name}`);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
logger_1.logger.warn(`Failed to delete branch ${name}: ${error}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Task } from "../types";
|
|
2
|
+
export type TaskEventType = "task:created" | "task:updated" | "task:deleted" | "task:status-changed" | "task:progress" | "execution:start" | "execution:end" | "execution:error" | "log:info" | "log:warn" | "log:error" | "log:success" | "log:progress";
|
|
3
|
+
export interface LogEventPayload {
|
|
4
|
+
message: string;
|
|
5
|
+
context?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface TaskEventPayloads {
|
|
8
|
+
"task:created": {
|
|
9
|
+
task: Task;
|
|
10
|
+
};
|
|
11
|
+
"task:updated": {
|
|
12
|
+
task: Task;
|
|
13
|
+
changes: Partial<Task>;
|
|
14
|
+
};
|
|
15
|
+
"task:deleted": {
|
|
16
|
+
taskId: string;
|
|
17
|
+
};
|
|
18
|
+
"task:status-changed": {
|
|
19
|
+
task: Task;
|
|
20
|
+
oldStatus: string;
|
|
21
|
+
newStatus: string;
|
|
22
|
+
};
|
|
23
|
+
"task:progress": {
|
|
24
|
+
taskId?: string;
|
|
25
|
+
message: string;
|
|
26
|
+
type?: string;
|
|
27
|
+
};
|
|
28
|
+
"execution:start": {
|
|
29
|
+
taskId: string;
|
|
30
|
+
tool: string;
|
|
31
|
+
};
|
|
32
|
+
"execution:end": {
|
|
33
|
+
taskId: string;
|
|
34
|
+
success: boolean;
|
|
35
|
+
};
|
|
36
|
+
"execution:error": {
|
|
37
|
+
taskId: string;
|
|
38
|
+
error: Error;
|
|
39
|
+
};
|
|
40
|
+
"log:info": LogEventPayload;
|
|
41
|
+
"log:warn": LogEventPayload;
|
|
42
|
+
"log:error": LogEventPayload;
|
|
43
|
+
"log:success": LogEventPayload;
|
|
44
|
+
"log:progress": LogEventPayload;
|
|
45
|
+
}
|
|
46
|
+
export type TaskEventHandler<T extends TaskEventType> = (payload: TaskEventPayloads[T]) => Promise<void> | void;
|
|
47
|
+
declare class HookRegistry {
|
|
48
|
+
private static instance;
|
|
49
|
+
private listeners;
|
|
50
|
+
private constructor();
|
|
51
|
+
static getInstance(): HookRegistry;
|
|
52
|
+
/**
|
|
53
|
+
* Register a handler for a specific event type
|
|
54
|
+
*/
|
|
55
|
+
on<T extends TaskEventType>(type: T, handler: TaskEventHandler<T>): void;
|
|
56
|
+
/**
|
|
57
|
+
* Remove a handler
|
|
58
|
+
*/
|
|
59
|
+
off<T extends TaskEventType>(type: T, handler: TaskEventHandler<T>): void;
|
|
60
|
+
/**
|
|
61
|
+
* Emit an event to all registered handlers
|
|
62
|
+
* We don't await handlers to prevent blocking the main flow,
|
|
63
|
+
* but we catch errors to prevent crashes.
|
|
64
|
+
*/
|
|
65
|
+
emit<T extends TaskEventType>(type: T, payload: TaskEventPayloads[T]): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Clear all listeners (useful for testing)
|
|
68
|
+
*/
|
|
69
|
+
clear(): void;
|
|
70
|
+
}
|
|
71
|
+
export declare const hooks: HookRegistry;
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGhC,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,cAAc,GACd,cAAc,GACd,qBAAqB,GACrB,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,UAAU,GACV,UAAU,GACV,WAAW,GACX,aAAa,GACb,cAAc,CAAC;AAGnB,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAGD,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IAC/B,cAAc,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACvD,cAAc,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,qBAAqB,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,eAAe,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,iBAAiB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,eAAe,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,iBAAiB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IACpD,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW,EAAE,eAAe,CAAC;IAC7B,aAAa,EAAE,eAAe,CAAC;IAC/B,cAAc,EAAE,eAAe,CAAC;CACjC;AAGD,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,aAAa,IAAI,CACtD,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,cAAM,YAAY;IAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,SAAS,CAAiD;IAElE,OAAO;WAIO,WAAW,IAAI,YAAY;IAOzC;;OAEG;IACI,EAAE,CAAC,CAAC,SAAS,aAAa,EAC/B,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,IAAI;IAOP;;OAEG;IACI,GAAG,CAAC,CAAC,SAAS,aAAa,EAChC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,IAAI;IAOP;;;;OAIG;IACU,IAAI,CAAC,CAAC,SAAS,aAAa,EACvC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAiBhB;;OAEG;IACI,KAAK,IAAI,IAAI;CAGrB;AAED,eAAO,MAAM,KAAK,cAA6B,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hooks = void 0;
|
|
4
|
+
class HookRegistry {
|
|
5
|
+
static instance;
|
|
6
|
+
listeners;
|
|
7
|
+
constructor() {
|
|
8
|
+
this.listeners = new Map();
|
|
9
|
+
}
|
|
10
|
+
static getInstance() {
|
|
11
|
+
if (!HookRegistry.instance) {
|
|
12
|
+
HookRegistry.instance = new HookRegistry();
|
|
13
|
+
}
|
|
14
|
+
return HookRegistry.instance;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register a handler for a specific event type
|
|
18
|
+
*/
|
|
19
|
+
on(type, handler) {
|
|
20
|
+
if (!this.listeners.has(type)) {
|
|
21
|
+
this.listeners.set(type, new Set());
|
|
22
|
+
}
|
|
23
|
+
this.listeners.get(type).add(handler);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Remove a handler
|
|
27
|
+
*/
|
|
28
|
+
off(type, handler) {
|
|
29
|
+
const handlers = this.listeners.get(type);
|
|
30
|
+
if (handlers) {
|
|
31
|
+
handlers.delete(handler);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Emit an event to all registered handlers
|
|
36
|
+
* We don't await handlers to prevent blocking the main flow,
|
|
37
|
+
* but we catch errors to prevent crashes.
|
|
38
|
+
*/
|
|
39
|
+
async emit(type, payload) {
|
|
40
|
+
const handlers = this.listeners.get(type);
|
|
41
|
+
if (!handlers || handlers.size === 0)
|
|
42
|
+
return;
|
|
43
|
+
const promises = Array.from(handlers).map(async (handler) => {
|
|
44
|
+
try {
|
|
45
|
+
await handler(payload);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
// NOTE: Using console.error here intentionally - this is the hooks system
|
|
49
|
+
// that the logger depends on, so we can't use logger here (circular dependency)
|
|
50
|
+
console.error(`Error in hook handler for event ${type}:`, error);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
await Promise.all(promises);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Clear all listeners (useful for testing)
|
|
57
|
+
*/
|
|
58
|
+
clear() {
|
|
59
|
+
this.listeners.clear();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.hooks = HookRegistry.getInstance();
|