scene-capability-engine 3.0.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/CHANGELOG.md +2513 -0
- package/LICENSE +21 -0
- package/README.md +765 -0
- package/README.zh.md +630 -0
- package/bin/kiro-spec-engine.js +796 -0
- package/bin/kse.js +3 -0
- package/bin/sce.js +3 -0
- package/bin/sco.js +3 -0
- package/docs/331-poc-adaptation-roadmap.md +156 -0
- package/docs/331-poc-dual-track-integration-guide.md +120 -0
- package/docs/331-poc-weekly-delivery-checklist.md +52 -0
- package/docs/OFFLINE_INSTALL.md +96 -0
- package/docs/README.md +279 -0
- package/docs/adopt-migration-guide.md +599 -0
- package/docs/adoption-guide.md +616 -0
- package/docs/agent-hooks-analysis.md +815 -0
- package/docs/architecture.md +733 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice-review.md +208 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice.en.md +459 -0
- package/docs/articles/ai-driven-development-philosophy-and-practice.md +492 -0
- package/docs/autonomous-control-guide.md +851 -0
- package/docs/command-reference.md +1368 -0
- package/docs/community.md +115 -0
- package/docs/cross-tool-guide.md +555 -0
- package/docs/developer-guide.md +619 -0
- package/docs/document-governance.md +865 -0
- package/docs/environment-management-guide.md +526 -0
- package/docs/examples/add-export-command/design.md +194 -0
- package/docs/examples/add-export-command/requirements.md +110 -0
- package/docs/examples/add-export-command/tasks.md +88 -0
- package/docs/examples/add-rest-api/design.md +855 -0
- package/docs/examples/add-rest-api/requirements.md +323 -0
- package/docs/examples/add-rest-api/tasks.md +355 -0
- package/docs/examples/add-user-dashboard/design.md +192 -0
- package/docs/examples/add-user-dashboard/requirements.md +143 -0
- package/docs/examples/add-user-dashboard/tasks.md +91 -0
- package/docs/faq.md +697 -0
- package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.json +156 -0
- package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.md +24 -0
- package/docs/images/wechat-qr.png +0 -0
- package/docs/integration-modes.md +529 -0
- package/docs/integration-philosophy.md +313 -0
- package/docs/knowledge-management-guide.md +263 -0
- package/docs/manual-workflows-guide.md +418 -0
- package/docs/moqui-capability-matrix.md +73 -0
- package/docs/moqui-template-core-library-playbook.md +109 -0
- package/docs/multi-agent-coordination-guide.md +553 -0
- package/docs/multi-repo-management-guide.md +1344 -0
- package/docs/quick-start-with-ai-tools.md +375 -0
- package/docs/quick-start.md +146 -0
- package/docs/release-checklist.md +121 -0
- package/docs/releases/README.md +13 -0
- package/docs/releases/v1.46.2-validation.md +45 -0
- package/docs/releases/v1.46.2.md +50 -0
- package/docs/scene-runtime-guide.md +347 -0
- package/docs/spec-collaboration-guide.md +369 -0
- package/docs/spec-locking-guide.md +225 -0
- package/docs/spec-numbering-guide.md +348 -0
- package/docs/spec-workflow.md +519 -0
- package/docs/steering-strategy-guide.md +196 -0
- package/docs/team-collaboration-guide.md +465 -0
- package/docs/testing-strategy.md +272 -0
- package/docs/tools/claude-guide.md +654 -0
- package/docs/tools/cursor-guide.md +706 -0
- package/docs/tools/generic-guide.md +446 -0
- package/docs/tools/kiro-guide.md +308 -0
- package/docs/tools/vscode-guide.md +445 -0
- package/docs/tools/windsurf-guide.md +391 -0
- package/docs/troubleshooting.md +1135 -0
- package/docs/upgrade-guide.md +639 -0
- package/docs/value-observability-guide.md +127 -0
- package/docs/zh/README.md +341 -0
- package/docs/zh/quick-start.md +764 -0
- package/docs/zh/release-checklist.md +121 -0
- package/docs/zh/releases/README.md +13 -0
- package/docs/zh/releases/v1.46.2-validation.md +45 -0
- package/docs/zh/releases/v1.46.2.md +50 -0
- package/docs/zh/spec-numbering-guide.md +348 -0
- package/docs/zh/tools/claude-guide.md +349 -0
- package/docs/zh/tools/cursor-guide.md +281 -0
- package/docs/zh/tools/generic-guide.md +499 -0
- package/docs/zh/tools/kiro-guide.md +342 -0
- package/docs/zh/tools/vscode-guide.md +449 -0
- package/docs/zh/tools/windsurf-guide.md +378 -0
- package/docs/zh/value-observability-guide.md +127 -0
- package/docs//344/272/244/344/273/230/346/270/205/345/215/225.md +75 -0
- package/lib/adoption/adoption-logger.js +487 -0
- package/lib/adoption/adoption-strategy.js +538 -0
- package/lib/adoption/backup-manager.js +420 -0
- package/lib/adoption/conflict-resolver.js +410 -0
- package/lib/adoption/detection-engine.js +275 -0
- package/lib/adoption/diff-viewer.js +226 -0
- package/lib/adoption/error-formatter.js +509 -0
- package/lib/adoption/file-classifier.js +385 -0
- package/lib/adoption/progress-reporter.js +534 -0
- package/lib/adoption/smart-orchestrator.js +470 -0
- package/lib/adoption/strategy-selector.js +218 -0
- package/lib/adoption/summary-generator.js +493 -0
- package/lib/adoption/template-sync.js +605 -0
- package/lib/auto/autonomous-engine.js +485 -0
- package/lib/auto/checkpoint-manager.js +300 -0
- package/lib/auto/close-loop-runner.js +2476 -0
- package/lib/auto/config-schema.js +176 -0
- package/lib/auto/decision-engine.js +344 -0
- package/lib/auto/error-recovery-manager.js +580 -0
- package/lib/auto/goal-decomposer.js +278 -0
- package/lib/auto/progress-tracker.js +502 -0
- package/lib/auto/safety-manager.js +186 -0
- package/lib/auto/semantic-decomposer.js +137 -0
- package/lib/auto/state-manager.js +126 -0
- package/lib/auto/task-queue-manager.js +340 -0
- package/lib/backup/backup-system.js +372 -0
- package/lib/backup/selective-backup.js +207 -0
- package/lib/collab/agent-registry.js +240 -0
- package/lib/collab/collab-manager.js +285 -0
- package/lib/collab/contract-manager.js +320 -0
- package/lib/collab/coordinator.js +370 -0
- package/lib/collab/dependency-manager.js +280 -0
- package/lib/collab/index.js +20 -0
- package/lib/collab/integration-manager.js +202 -0
- package/lib/collab/merge-coordinator.js +252 -0
- package/lib/collab/metadata-manager.js +233 -0
- package/lib/collab/multi-agent-config.js +120 -0
- package/lib/collab/spec-lifecycle-manager.js +304 -0
- package/lib/collab/sync-barrier.js +88 -0
- package/lib/collab/visualizer.js +208 -0
- package/lib/commands/adopt.js +749 -0
- package/lib/commands/auto.js +19559 -0
- package/lib/commands/collab.js +275 -0
- package/lib/commands/context.js +99 -0
- package/lib/commands/docs.js +808 -0
- package/lib/commands/doctor.js +273 -0
- package/lib/commands/env.js +420 -0
- package/lib/commands/knowledge.js +309 -0
- package/lib/commands/lock.js +235 -0
- package/lib/commands/ops.js +409 -0
- package/lib/commands/orchestrate.js +446 -0
- package/lib/commands/prompt.js +105 -0
- package/lib/commands/repo.js +118 -0
- package/lib/commands/rollback.js +219 -0
- package/lib/commands/scene.js +15549 -0
- package/lib/commands/spec-bootstrap.js +147 -0
- package/lib/commands/spec-gate.js +157 -0
- package/lib/commands/spec-pipeline.js +205 -0
- package/lib/commands/status.js +321 -0
- package/lib/commands/task.js +199 -0
- package/lib/commands/templates.js +654 -0
- package/lib/commands/upgrade.js +231 -0
- package/lib/commands/value.js +569 -0
- package/lib/commands/watch.js +684 -0
- package/lib/commands/workflows.js +240 -0
- package/lib/commands/workspace-multi.js +325 -0
- package/lib/commands/workspace.js +189 -0
- package/lib/context/context-exporter.js +378 -0
- package/lib/context/prompt-generator.js +482 -0
- package/lib/data/moqui-capability-lexicon.json +45 -0
- package/lib/environment/backup-system.js +189 -0
- package/lib/environment/environment-manager.js +379 -0
- package/lib/environment/environment-registry.js +168 -0
- package/lib/gitignore/gitignore-backup.js +229 -0
- package/lib/gitignore/gitignore-detector.js +239 -0
- package/lib/gitignore/gitignore-integration.js +267 -0
- package/lib/gitignore/gitignore-transformer.js +193 -0
- package/lib/gitignore/layered-rules-template.js +42 -0
- package/lib/governance/archive-tool.js +284 -0
- package/lib/governance/cleanup-tool.js +237 -0
- package/lib/governance/config-manager.js +186 -0
- package/lib/governance/diagnostic-engine.js +271 -0
- package/lib/governance/doc-reference-checker.js +200 -0
- package/lib/governance/execution-logger.js +243 -0
- package/lib/governance/file-scanner.js +285 -0
- package/lib/governance/hooks-manager.js +333 -0
- package/lib/governance/reporter.js +337 -0
- package/lib/governance/validation-engine.js +181 -0
- package/lib/i18n.js +79 -0
- package/lib/knowledge/entry-manager.js +208 -0
- package/lib/knowledge/index-manager.js +261 -0
- package/lib/knowledge/knowledge-manager.js +273 -0
- package/lib/knowledge/template-manager.js +191 -0
- package/lib/lock/index.js +21 -0
- package/lib/lock/lock-file.js +192 -0
- package/lib/lock/lock-manager.js +321 -0
- package/lib/lock/machine-identifier.js +135 -0
- package/lib/lock/steering-file-lock.js +207 -0
- package/lib/lock/task-lock-manager.js +345 -0
- package/lib/operations/audit-logger.js +293 -0
- package/lib/operations/feedback-manager.js +1147 -0
- package/lib/operations/index.js +23 -0
- package/lib/operations/models/index.js +170 -0
- package/lib/operations/operations-manager.js +151 -0
- package/lib/operations/operations-validator.js +280 -0
- package/lib/operations/permission-manager.js +354 -0
- package/lib/operations/template-loader.js +143 -0
- package/lib/orchestrator/agent-spawner.js +629 -0
- package/lib/orchestrator/bootstrap-prompt-builder.js +236 -0
- package/lib/orchestrator/index.js +19 -0
- package/lib/orchestrator/orchestration-engine.js +1270 -0
- package/lib/orchestrator/orchestrator-config.js +173 -0
- package/lib/orchestrator/status-monitor.js +591 -0
- package/lib/python-checker.js +209 -0
- package/lib/repo/config-manager.js +580 -0
- package/lib/repo/errors/config-error.js +13 -0
- package/lib/repo/errors/git-error.js +15 -0
- package/lib/repo/errors/repo-error.js +14 -0
- package/lib/repo/git-operations.js +181 -0
- package/lib/repo/handlers/.gitkeep +1 -0
- package/lib/repo/handlers/exec-handler.js +155 -0
- package/lib/repo/handlers/health-handler.js +169 -0
- package/lib/repo/handlers/init-handler.js +197 -0
- package/lib/repo/handlers/status-handler.js +176 -0
- package/lib/repo/output-formatter.js +184 -0
- package/lib/repo/path-resolver.js +178 -0
- package/lib/repo/repo-manager.js +514 -0
- package/lib/scene-runtime/audit-emitter.js +59 -0
- package/lib/scene-runtime/binding-plugin-loader.js +351 -0
- package/lib/scene-runtime/binding-registry.js +349 -0
- package/lib/scene-runtime/eval-bridge.js +44 -0
- package/lib/scene-runtime/index.js +19 -0
- package/lib/scene-runtime/moqui-adapter.js +620 -0
- package/lib/scene-runtime/moqui-client.js +606 -0
- package/lib/scene-runtime/moqui-extractor.js +2029 -0
- package/lib/scene-runtime/plan-compiler.js +208 -0
- package/lib/scene-runtime/policy-gate.js +58 -0
- package/lib/scene-runtime/runtime-executor.js +358 -0
- package/lib/scene-runtime/scene-loader.js +96 -0
- package/lib/scene-runtime/scene-ontology.js +959 -0
- package/lib/scene-runtime/scene-template-linter.js +852 -0
- package/lib/scene-runtime/templates/scene-template-erp-query-v0.1.yaml +28 -0
- package/lib/scene-runtime/templates/scene-template-hybrid-shadow-v0.1.yaml +34 -0
- package/lib/spec/bootstrap/context-collector.js +48 -0
- package/lib/spec/bootstrap/draft-generator.js +158 -0
- package/lib/spec/bootstrap/questionnaire-engine.js +70 -0
- package/lib/spec/bootstrap/trace-emitter.js +59 -0
- package/lib/spec/multi-spec-orchestrate.js +93 -0
- package/lib/spec/pipeline/constants.js +6 -0
- package/lib/spec/pipeline/stage-adapters.js +118 -0
- package/lib/spec/pipeline/stage-runner.js +146 -0
- package/lib/spec/pipeline/state-store.js +119 -0
- package/lib/spec-gate/engine/gate-engine.js +165 -0
- package/lib/spec-gate/policy/default-policy.js +22 -0
- package/lib/spec-gate/policy/policy-loader.js +103 -0
- package/lib/spec-gate/result-emitter.js +81 -0
- package/lib/spec-gate/rules/default-rules.js +156 -0
- package/lib/spec-gate/rules/rule-registry.js +51 -0
- package/lib/steering/adoption-config.js +164 -0
- package/lib/steering/compliance-auto-fixer.js +204 -0
- package/lib/steering/compliance-cache.js +99 -0
- package/lib/steering/compliance-error-reporter.js +70 -0
- package/lib/steering/context-sync-manager.js +273 -0
- package/lib/steering/index.js +92 -0
- package/lib/steering/spec-steering.js +230 -0
- package/lib/steering/steering-compliance-checker.js +73 -0
- package/lib/steering/steering-loader.js +144 -0
- package/lib/steering/steering-manager.js +289 -0
- package/lib/task/index.js +12 -0
- package/lib/task/task-claimer.js +489 -0
- package/lib/task/task-status-store.js +418 -0
- package/lib/templates/cache-manager.js +440 -0
- package/lib/templates/content-generalizer.js +247 -0
- package/lib/templates/frontmatter-generator.js +128 -0
- package/lib/templates/git-handler.js +471 -0
- package/lib/templates/metadata-collector.js +328 -0
- package/lib/templates/path-utils.js +144 -0
- package/lib/templates/registry-parser.js +505 -0
- package/lib/templates/spec-reader.js +216 -0
- package/lib/templates/template-applicator.js +249 -0
- package/lib/templates/template-creator.js +256 -0
- package/lib/templates/template-error.js +143 -0
- package/lib/templates/template-exporter.js +502 -0
- package/lib/templates/template-manager.js +782 -0
- package/lib/templates/template-validator.js +361 -0
- package/lib/upgrade/migration-engine.js +382 -0
- package/lib/upgrade/migrations/.gitkeep +52 -0
- package/lib/upgrade/migrations/1.0.0-to-1.1.0.js +78 -0
- package/lib/utils/file-diff.js +177 -0
- package/lib/utils/fs-utils.js +274 -0
- package/lib/utils/tool-detector.js +383 -0
- package/lib/utils/validation.js +324 -0
- package/lib/value/gate-summary-emitter.js +99 -0
- package/lib/value/metric-contract-loader.js +210 -0
- package/lib/value/risk-evaluator.js +117 -0
- package/lib/value/weekly-snapshot-builder.js +61 -0
- package/lib/version/version-checker.js +156 -0
- package/lib/version/version-manager.js +327 -0
- package/lib/watch/action-executor.js +458 -0
- package/lib/watch/event-debouncer.js +323 -0
- package/lib/watch/execution-logger.js +550 -0
- package/lib/watch/file-watcher.js +499 -0
- package/lib/watch/presets.js +266 -0
- package/lib/watch/watch-manager.js +533 -0
- package/lib/workspace/multi/global-config.js +150 -0
- package/lib/workspace/multi/index.js +22 -0
- package/lib/workspace/multi/path-utils.js +173 -0
- package/lib/workspace/multi/workspace-context-resolver.js +244 -0
- package/lib/workspace/multi/workspace-registry.js +196 -0
- package/lib/workspace/multi/workspace-state-manager.js +537 -0
- package/lib/workspace/multi/workspace.js +90 -0
- package/lib/workspace/workspace-manager.js +370 -0
- package/lib/workspace/workspace-sync.js +356 -0
- package/locales/en.json +114 -0
- package/locales/zh.json +114 -0
- package/package.json +102 -0
- package/template/.kiro/README.md +247 -0
- package/template/.kiro/hooks/check-spec-on-create.kiro.hook +17 -0
- package/template/.kiro/hooks/run-tests-on-save.kiro.hook +13 -0
- package/template/.kiro/hooks/sync-tasks-on-edit.kiro.hook +16 -0
- package/template/.kiro/specs/SPEC_WORKFLOW_GUIDE.md +134 -0
- package/template/.kiro/steering/CORE_PRINCIPLES.md +133 -0
- package/template/.kiro/steering/CURRENT_CONTEXT.md +30 -0
- package/template/.kiro/steering/ENVIRONMENT.md +35 -0
- package/template/.kiro/steering/RULES_GUIDE.md +46 -0
- package/template/.kiro/templates/operations/default/change-impact.md +112 -0
- package/template/.kiro/templates/operations/default/deployment.md +91 -0
- package/template/.kiro/templates/operations/default/feedback-response.md +269 -0
- package/template/.kiro/templates/operations/default/migration-plan.md +172 -0
- package/template/.kiro/templates/operations/default/monitoring.md +135 -0
- package/template/.kiro/templates/operations/default/operations.md +135 -0
- package/template/.kiro/templates/operations/default/rollback.md +143 -0
- package/template/.kiro/templates/operations/default/tools.yaml +364 -0
- package/template/.kiro/templates/operations/default/troubleshooting.md +123 -0
- package/template/.kiro/tools/backup_manager.py +295 -0
- package/template/.kiro/tools/configuration_manager.py +218 -0
- package/template/.kiro/tools/document_evaluator.py +550 -0
- package/template/.kiro/tools/enhancement_logger.py +168 -0
- package/template/.kiro/tools/error_handler.py +335 -0
- package/template/.kiro/tools/improvement_identifier.py +444 -0
- package/template/.kiro/tools/modification_applicator.py +737 -0
- package/template/.kiro/tools/quality_gate_enforcer.py +207 -0
- package/template/.kiro/tools/quality_scorer.py +305 -0
- package/template/.kiro/tools/report_generator.py +154 -0
- package/template/.kiro/tools/ultrawork_enhancer.py +676 -0
- package/template/.kiro/tools/ultrawork_enhancer_refactored.py +0 -0
- package/template/.kiro/tools/ultrawork_enhancer_v2.py +463 -0
- package/template/.kiro/tools/ultrawork_enhancer_v3.py +606 -0
- package/template/.kiro/tools/workflow_quality_gate.py +100 -0
- package/template/README.md +111 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration Schema for Autonomous Control
|
|
3
|
+
* Defines and validates autonomous execution configuration
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const DEFAULT_CONFIG = {
|
|
7
|
+
version: '1.0.0',
|
|
8
|
+
mode: 'balanced',
|
|
9
|
+
|
|
10
|
+
checkpoints: {
|
|
11
|
+
requirementsReview: false,
|
|
12
|
+
designReview: false,
|
|
13
|
+
tasksReview: false,
|
|
14
|
+
phaseCompletion: true,
|
|
15
|
+
finalReview: true,
|
|
16
|
+
errorThreshold: 5
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
errorRecovery: {
|
|
20
|
+
enabled: true,
|
|
21
|
+
maxAttempts: 3,
|
|
22
|
+
strategies: ['syntax-fix', 'import-resolution', 'type-correction', 'null-check', 'error-handling'],
|
|
23
|
+
learningEnabled: true
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
safety: {
|
|
27
|
+
requireProductionConfirmation: true,
|
|
28
|
+
requireExternalResourceConfirmation: true,
|
|
29
|
+
requireDestructiveOperationConfirmation: true,
|
|
30
|
+
allowedOperations: [],
|
|
31
|
+
blockedOperations: []
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
performance: {
|
|
35
|
+
maxConcurrentTasks: 1,
|
|
36
|
+
taskTimeout: 300000, // 5 minutes
|
|
37
|
+
checkpointInterval: 600000 // 10 minutes
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
notifications: {
|
|
41
|
+
enabled: true,
|
|
42
|
+
onCheckpoint: true,
|
|
43
|
+
onError: true,
|
|
44
|
+
onCompletion: true
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const MODE_PRESETS = {
|
|
49
|
+
conservative: {
|
|
50
|
+
checkpoints: {
|
|
51
|
+
requirementsReview: true,
|
|
52
|
+
designReview: true,
|
|
53
|
+
tasksReview: true,
|
|
54
|
+
phaseCompletion: true,
|
|
55
|
+
finalReview: true,
|
|
56
|
+
errorThreshold: 3
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
balanced: {
|
|
61
|
+
checkpoints: {
|
|
62
|
+
requirementsReview: false,
|
|
63
|
+
designReview: false,
|
|
64
|
+
tasksReview: false,
|
|
65
|
+
phaseCompletion: true,
|
|
66
|
+
finalReview: true,
|
|
67
|
+
errorThreshold: 5
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
aggressive: {
|
|
72
|
+
checkpoints: {
|
|
73
|
+
requirementsReview: false,
|
|
74
|
+
designReview: false,
|
|
75
|
+
tasksReview: false,
|
|
76
|
+
phaseCompletion: false,
|
|
77
|
+
finalReview: true,
|
|
78
|
+
errorThreshold: 10
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Validate autonomous configuration
|
|
85
|
+
* @param {Object} config - Configuration to validate
|
|
86
|
+
* @returns {Object} - { valid: boolean, errors: string[] }
|
|
87
|
+
*/
|
|
88
|
+
function validateConfig(config) {
|
|
89
|
+
const errors = [];
|
|
90
|
+
|
|
91
|
+
if (!config) {
|
|
92
|
+
return { valid: false, errors: ['Configuration is required'] };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Validate mode
|
|
96
|
+
if (config.mode && !['conservative', 'balanced', 'aggressive'].includes(config.mode)) {
|
|
97
|
+
errors.push('mode must be "conservative", "balanced", or "aggressive"');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Validate checkpoints
|
|
101
|
+
if (config.checkpoints) {
|
|
102
|
+
if (typeof config.checkpoints.errorThreshold === 'number' && config.checkpoints.errorThreshold < 1) {
|
|
103
|
+
errors.push('checkpoints.errorThreshold must be >= 1');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Validate error recovery
|
|
108
|
+
if (config.errorRecovery) {
|
|
109
|
+
if (typeof config.errorRecovery.maxAttempts === 'number' && config.errorRecovery.maxAttempts < 1) {
|
|
110
|
+
errors.push('errorRecovery.maxAttempts must be >= 1');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Validate performance
|
|
115
|
+
if (config.performance) {
|
|
116
|
+
if (typeof config.performance.maxConcurrentTasks === 'number' && config.performance.maxConcurrentTasks < 1) {
|
|
117
|
+
errors.push('performance.maxConcurrentTasks must be >= 1');
|
|
118
|
+
}
|
|
119
|
+
if (typeof config.performance.taskTimeout === 'number' && config.performance.taskTimeout < 1000) {
|
|
120
|
+
errors.push('performance.taskTimeout must be >= 1000ms');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
valid: errors.length === 0,
|
|
126
|
+
errors
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Merge configurations with hierarchy: defaults < global < project
|
|
132
|
+
* @param {Object} globalConfig - Global configuration
|
|
133
|
+
* @param {Object} projectConfig - Project-specific configuration
|
|
134
|
+
* @returns {Object} - Merged configuration
|
|
135
|
+
*/
|
|
136
|
+
function mergeConfigs(globalConfig = {}, projectConfig = {}) {
|
|
137
|
+
const merged = JSON.parse(JSON.stringify(DEFAULT_CONFIG));
|
|
138
|
+
|
|
139
|
+
// Apply mode preset if specified
|
|
140
|
+
const mode = projectConfig.mode || globalConfig.mode || DEFAULT_CONFIG.mode;
|
|
141
|
+
if (MODE_PRESETS[mode]) {
|
|
142
|
+
Object.assign(merged.checkpoints, MODE_PRESETS[mode].checkpoints);
|
|
143
|
+
}
|
|
144
|
+
merged.mode = mode;
|
|
145
|
+
|
|
146
|
+
// Deep merge global config
|
|
147
|
+
deepMerge(merged, globalConfig);
|
|
148
|
+
|
|
149
|
+
// Deep merge project config (overrides global)
|
|
150
|
+
deepMerge(merged, projectConfig);
|
|
151
|
+
|
|
152
|
+
return merged;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Deep merge source into target
|
|
157
|
+
* @param {Object} target - Target object
|
|
158
|
+
* @param {Object} source - Source object
|
|
159
|
+
*/
|
|
160
|
+
function deepMerge(target, source) {
|
|
161
|
+
for (const key in source) {
|
|
162
|
+
if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
|
|
163
|
+
if (!target[key]) target[key] = {};
|
|
164
|
+
deepMerge(target[key], source[key]);
|
|
165
|
+
} else {
|
|
166
|
+
target[key] = source[key];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
module.exports = {
|
|
172
|
+
DEFAULT_CONFIG,
|
|
173
|
+
MODE_PRESETS,
|
|
174
|
+
validateConfig,
|
|
175
|
+
mergeConfigs
|
|
176
|
+
};
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision Engine
|
|
3
|
+
* Autonomous technical decision-making with documentation
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
class DecisionEngine {
|
|
7
|
+
constructor(projectContext = {}) {
|
|
8
|
+
this.projectContext = projectContext;
|
|
9
|
+
this.decisionHistory = [];
|
|
10
|
+
this.outcomeTracking = new Map(); // decision type -> outcomes
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Choose technology stack
|
|
15
|
+
* @param {Object} requirements - Requirements object
|
|
16
|
+
* @returns {Object} - Technology choices
|
|
17
|
+
*/
|
|
18
|
+
async chooseTechnologyStack(requirements) {
|
|
19
|
+
const decision = {
|
|
20
|
+
id: this.generateDecisionId(),
|
|
21
|
+
timestamp: new Date().toISOString(),
|
|
22
|
+
category: 'technology',
|
|
23
|
+
decision: 'Technology Stack Selection',
|
|
24
|
+
rationale: 'Based on project requirements and existing patterns',
|
|
25
|
+
alternatives: [],
|
|
26
|
+
impact: 'high',
|
|
27
|
+
reversible: false
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Analyze project context
|
|
31
|
+
const hasTypeScript = this.projectContext.hasTypeScript || false;
|
|
32
|
+
const hasReact = this.projectContext.hasReact || false;
|
|
33
|
+
|
|
34
|
+
const stack = {
|
|
35
|
+
language: hasTypeScript ? 'TypeScript' : 'JavaScript',
|
|
36
|
+
testing: 'Jest',
|
|
37
|
+
buildTool: 'npm'
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
decision.choices = stack;
|
|
41
|
+
decision.rationale = `Selected ${stack.language} for consistency with existing codebase`;
|
|
42
|
+
|
|
43
|
+
this.documentDecision(decision);
|
|
44
|
+
return stack;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Select architecture pattern
|
|
49
|
+
* @param {Object} requirements - Requirements object
|
|
50
|
+
* @returns {string} - Architecture pattern
|
|
51
|
+
*/
|
|
52
|
+
async selectArchitecturePattern(requirements) {
|
|
53
|
+
const decision = {
|
|
54
|
+
id: this.generateDecisionId(),
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
category: 'architecture',
|
|
57
|
+
decision: 'Architecture Pattern Selection',
|
|
58
|
+
alternatives: ['MVC', 'Layered', 'Microservices', 'Event-Driven'],
|
|
59
|
+
impact: 'high',
|
|
60
|
+
reversible: false
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
// Default to layered architecture for CLI tools
|
|
64
|
+
const pattern = 'Layered';
|
|
65
|
+
decision.choice = pattern;
|
|
66
|
+
decision.rationale = 'Layered architecture provides clear separation of concerns for CLI tools';
|
|
67
|
+
|
|
68
|
+
this.documentDecision(decision);
|
|
69
|
+
return pattern;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Choose testing framework
|
|
74
|
+
* @param {string} language - Programming language
|
|
75
|
+
* @returns {string} - Testing framework
|
|
76
|
+
*/
|
|
77
|
+
async chooseTestingFramework(language) {
|
|
78
|
+
const frameworks = {
|
|
79
|
+
JavaScript: 'Jest',
|
|
80
|
+
TypeScript: 'Jest',
|
|
81
|
+
Python: 'pytest',
|
|
82
|
+
Java: 'JUnit'
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const framework = frameworks[language] || 'Jest';
|
|
86
|
+
|
|
87
|
+
const decision = {
|
|
88
|
+
id: this.generateDecisionId(),
|
|
89
|
+
timestamp: new Date().toISOString(),
|
|
90
|
+
category: 'technology',
|
|
91
|
+
decision: `Testing Framework: ${framework}`,
|
|
92
|
+
rationale: `Standard testing framework for ${language}`,
|
|
93
|
+
alternatives: Object.values(frameworks).filter(f => f !== framework),
|
|
94
|
+
impact: 'medium',
|
|
95
|
+
reversible: true
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
this.documentDecision(decision);
|
|
99
|
+
return framework;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Select data structure
|
|
104
|
+
* @param {Object} requirements - Requirements for data structure
|
|
105
|
+
* @returns {string} - Data structure choice
|
|
106
|
+
*/
|
|
107
|
+
async selectDataStructure(requirements) {
|
|
108
|
+
const { accessPattern, size, operations } = requirements;
|
|
109
|
+
|
|
110
|
+
let structure = 'Array';
|
|
111
|
+
let rationale = 'Default choice for simple collections';
|
|
112
|
+
|
|
113
|
+
if (operations?.includes('fast-lookup')) {
|
|
114
|
+
structure = 'Map';
|
|
115
|
+
rationale = 'Map provides O(1) lookup performance';
|
|
116
|
+
} else if (operations?.includes('unique')) {
|
|
117
|
+
structure = 'Set';
|
|
118
|
+
rationale = 'Set ensures uniqueness automatically';
|
|
119
|
+
} else if (accessPattern === 'queue') {
|
|
120
|
+
structure = 'Array with shift/push';
|
|
121
|
+
rationale = 'Array methods provide queue semantics';
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const decision = {
|
|
125
|
+
id: this.generateDecisionId(),
|
|
126
|
+
timestamp: new Date().toISOString(),
|
|
127
|
+
category: 'implementation',
|
|
128
|
+
decision: `Data Structure: ${structure}`,
|
|
129
|
+
rationale,
|
|
130
|
+
alternatives: ['Array', 'Map', 'Set', 'Object'],
|
|
131
|
+
impact: 'low',
|
|
132
|
+
reversible: true
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
this.documentDecision(decision);
|
|
136
|
+
return structure;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Choose naming convention
|
|
141
|
+
* @param {Object} context - Context information
|
|
142
|
+
* @returns {Object} - Naming conventions
|
|
143
|
+
*/
|
|
144
|
+
async chooseNamingConvention(context) {
|
|
145
|
+
// Detect existing patterns from project
|
|
146
|
+
const conventions = {
|
|
147
|
+
files: 'kebab-case',
|
|
148
|
+
classes: 'PascalCase',
|
|
149
|
+
functions: 'camelCase',
|
|
150
|
+
constants: 'UPPER_SNAKE_CASE',
|
|
151
|
+
variables: 'camelCase'
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const decision = {
|
|
155
|
+
id: this.generateDecisionId(),
|
|
156
|
+
timestamp: new Date().toISOString(),
|
|
157
|
+
category: 'implementation',
|
|
158
|
+
decision: 'Naming Conventions',
|
|
159
|
+
rationale: 'Following JavaScript/Node.js community standards',
|
|
160
|
+
conventions,
|
|
161
|
+
impact: 'low',
|
|
162
|
+
reversible: true
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
this.documentDecision(decision);
|
|
166
|
+
return conventions;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Determine file structure
|
|
171
|
+
* @param {Array} components - Components to organize
|
|
172
|
+
* @returns {Object} - File structure
|
|
173
|
+
*/
|
|
174
|
+
async determineFileStructure(components) {
|
|
175
|
+
const structure = {
|
|
176
|
+
pattern: 'feature-based',
|
|
177
|
+
directories: components.map(c => `lib/${c}`),
|
|
178
|
+
rationale: 'Feature-based organization for better modularity'
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
const decision = {
|
|
182
|
+
id: this.generateDecisionId(),
|
|
183
|
+
timestamp: new Date().toISOString(),
|
|
184
|
+
category: 'implementation',
|
|
185
|
+
decision: 'File Structure Organization',
|
|
186
|
+
rationale: structure.rationale,
|
|
187
|
+
structure,
|
|
188
|
+
impact: 'medium',
|
|
189
|
+
reversible: true
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
this.documentDecision(decision);
|
|
193
|
+
return structure;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Decide if code should be refactored
|
|
198
|
+
* @param {Object} code - Code metrics
|
|
199
|
+
* @param {Object} metrics - Code metrics
|
|
200
|
+
* @returns {boolean} - Should refactor
|
|
201
|
+
*/
|
|
202
|
+
async shouldRefactor(code, metrics) {
|
|
203
|
+
const { complexity, duplication, length } = metrics;
|
|
204
|
+
|
|
205
|
+
const shouldRefactor = complexity > 10 || duplication > 0.2 || length > 300;
|
|
206
|
+
|
|
207
|
+
if (shouldRefactor) {
|
|
208
|
+
const decision = {
|
|
209
|
+
id: this.generateDecisionId(),
|
|
210
|
+
timestamp: new Date().toISOString(),
|
|
211
|
+
category: 'quality',
|
|
212
|
+
decision: 'Refactor Code',
|
|
213
|
+
rationale: `Complexity: ${complexity}, Duplication: ${duplication}, Length: ${length}`,
|
|
214
|
+
impact: 'medium',
|
|
215
|
+
reversible: false
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
this.documentDecision(decision);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return shouldRefactor;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Decide if tests should be added
|
|
226
|
+
* @param {number} coverage - Current coverage
|
|
227
|
+
* @param {Object} requirements - Requirements
|
|
228
|
+
* @returns {boolean} - Should add tests
|
|
229
|
+
*/
|
|
230
|
+
async shouldAddTests(coverage, requirements) {
|
|
231
|
+
const targetCoverage = requirements.targetCoverage || 80;
|
|
232
|
+
const shouldAdd = coverage < targetCoverage;
|
|
233
|
+
|
|
234
|
+
if (shouldAdd) {
|
|
235
|
+
const decision = {
|
|
236
|
+
id: this.generateDecisionId(),
|
|
237
|
+
timestamp: new Date().toISOString(),
|
|
238
|
+
category: 'quality',
|
|
239
|
+
decision: 'Add Tests',
|
|
240
|
+
rationale: `Current coverage ${coverage}% below target ${targetCoverage}%`,
|
|
241
|
+
impact: 'medium',
|
|
242
|
+
reversible: false
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
this.documentDecision(decision);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return shouldAdd;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Decide if optimization is needed
|
|
253
|
+
* @param {Object} performance - Performance metrics
|
|
254
|
+
* @param {Object} requirements - Requirements
|
|
255
|
+
* @returns {boolean} - Should optimize
|
|
256
|
+
*/
|
|
257
|
+
async shouldOptimize(performance, requirements) {
|
|
258
|
+
const { responseTime, throughput } = performance;
|
|
259
|
+
const { maxResponseTime, minThroughput } = requirements;
|
|
260
|
+
|
|
261
|
+
const shouldOptimize =
|
|
262
|
+
(maxResponseTime && responseTime > maxResponseTime) ||
|
|
263
|
+
(minThroughput && throughput < minThroughput);
|
|
264
|
+
|
|
265
|
+
if (shouldOptimize) {
|
|
266
|
+
const decision = {
|
|
267
|
+
id: this.generateDecisionId(),
|
|
268
|
+
timestamp: new Date().toISOString(),
|
|
269
|
+
category: 'quality',
|
|
270
|
+
decision: 'Optimize Performance',
|
|
271
|
+
rationale: `Response time: ${responseTime}ms, Throughput: ${throughput} req/s`,
|
|
272
|
+
impact: 'high',
|
|
273
|
+
reversible: false
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
this.documentDecision(decision);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return shouldOptimize;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Document a decision
|
|
284
|
+
* @param {Object} decision - Decision details
|
|
285
|
+
*/
|
|
286
|
+
documentDecision(decision) {
|
|
287
|
+
this.decisionHistory.push(decision);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Get decision history
|
|
292
|
+
* @returns {Array} - Decision history
|
|
293
|
+
*/
|
|
294
|
+
getDecisionHistory() {
|
|
295
|
+
return this.decisionHistory;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Track decision outcome
|
|
300
|
+
* @param {string} decisionId - Decision ID
|
|
301
|
+
* @param {boolean} success - Outcome success
|
|
302
|
+
*/
|
|
303
|
+
trackOutcome(decisionId, success) {
|
|
304
|
+
const decision = this.decisionHistory.find(d => d.id === decisionId);
|
|
305
|
+
if (!decision) return;
|
|
306
|
+
|
|
307
|
+
const category = decision.category;
|
|
308
|
+
if (!this.outcomeTracking.has(category)) {
|
|
309
|
+
this.outcomeTracking.set(category, { successes: 0, failures: 0 });
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
const outcomes = this.outcomeTracking.get(category);
|
|
313
|
+
if (success) {
|
|
314
|
+
outcomes.successes++;
|
|
315
|
+
} else {
|
|
316
|
+
outcomes.failures++;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Get success rate for decision category
|
|
322
|
+
* @param {string} category - Decision category
|
|
323
|
+
* @returns {number} - Success rate (0-1)
|
|
324
|
+
*/
|
|
325
|
+
getSuccessRate(category) {
|
|
326
|
+
const outcomes = this.outcomeTracking.get(category);
|
|
327
|
+
if (!outcomes) return 0;
|
|
328
|
+
|
|
329
|
+
const total = outcomes.successes + outcomes.failures;
|
|
330
|
+
if (total === 0) return 0;
|
|
331
|
+
|
|
332
|
+
return outcomes.successes / total;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Generate unique decision ID
|
|
337
|
+
* @returns {string} - Decision ID
|
|
338
|
+
*/
|
|
339
|
+
generateDecisionId() {
|
|
340
|
+
return `decision-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
module.exports = DecisionEngine;
|