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,137 @@
|
|
|
1
|
+
const CATEGORY_KEYWORDS = {
|
|
2
|
+
closeLoop: [
|
|
3
|
+
'closed-loop', 'close-loop', 'close loop', 'autonomous loop',
|
|
4
|
+
'auto progress', 'auto-progress', 'automatic progression',
|
|
5
|
+
'闭环', '自动推进', '无需确认', '不等待确认', '自动闭环'
|
|
6
|
+
],
|
|
7
|
+
decomposition: [
|
|
8
|
+
'master/sub', 'master sub', 'master', 'sub-spec', 'sub spec',
|
|
9
|
+
'multi-spec', 'multi spec', 'split', 'decompose', 'decomposition',
|
|
10
|
+
'主从', '多spec', '多 spec', '拆分', '分解'
|
|
11
|
+
],
|
|
12
|
+
orchestration: [
|
|
13
|
+
'orchestrate', 'orchestration', 'parallel', 'dag', 'scheduler',
|
|
14
|
+
'编排', '并行', '调度'
|
|
15
|
+
],
|
|
16
|
+
quality: [
|
|
17
|
+
'quality', 'gate', 'test', 'stability', 'reliability', 'observability',
|
|
18
|
+
'kpi', 'metrics', '验证', '测试', '质量', '观测', '验收'
|
|
19
|
+
],
|
|
20
|
+
docs: [
|
|
21
|
+
'docs', 'documentation', 'guide', 'rollout', 'publish',
|
|
22
|
+
'文档', '指南', '发布', '落地'
|
|
23
|
+
]
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const CONNECTORS = [
|
|
27
|
+
' and ', ' with ', ' then ', ' plus ', ' while ',
|
|
28
|
+
' 并且 ', ' 同时 ', ' 然后 ', ' 以及 ', ' 并 ',
|
|
29
|
+
'并且', '同时', '然后', '以及'
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
function analyzeGoalSemantics(goal) {
|
|
33
|
+
const normalizedGoal = normalizeGoal(goal);
|
|
34
|
+
const clauses = splitIntoClauses(normalizedGoal);
|
|
35
|
+
const categoryScores = scoreCategories(normalizedGoal, clauses);
|
|
36
|
+
|
|
37
|
+
const rankedCategories = Object.entries(categoryScores)
|
|
38
|
+
.sort((a, b) => b[1] - a[1])
|
|
39
|
+
.map(([name]) => name);
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
normalizedGoal,
|
|
43
|
+
clauses,
|
|
44
|
+
categoryScores,
|
|
45
|
+
rankedCategories
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function normalizeGoal(goal) {
|
|
50
|
+
return `${goal || ''}`
|
|
51
|
+
.trim()
|
|
52
|
+
.replace(/\s+/g, ' ');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function splitIntoClauses(goal) {
|
|
56
|
+
if (!goal) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const replaced = goal
|
|
61
|
+
.replace(/[;;。,、]/g, ',')
|
|
62
|
+
.replace(/[::]/g, ' ')
|
|
63
|
+
.replace(/\s+/g, ' ');
|
|
64
|
+
|
|
65
|
+
const roughParts = replaced.split(',').map(item => item.trim()).filter(Boolean);
|
|
66
|
+
const clauses = [];
|
|
67
|
+
|
|
68
|
+
for (const part of roughParts) {
|
|
69
|
+
let splits = [part];
|
|
70
|
+
for (const connector of CONNECTORS) {
|
|
71
|
+
splits = splits
|
|
72
|
+
.flatMap(text => splitByConnector(text, connector))
|
|
73
|
+
.map(text => text.trim())
|
|
74
|
+
.filter(Boolean);
|
|
75
|
+
}
|
|
76
|
+
clauses.push(...splits);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return clauses.length > 0 ? clauses : [goal];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function splitByConnector(text, connector) {
|
|
83
|
+
const normalizedText = ` ${text} `;
|
|
84
|
+
if (!normalizedText.toLowerCase().includes(connector.toLowerCase())) {
|
|
85
|
+
return [text];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return text
|
|
89
|
+
.split(new RegExp(escapeRegex(connector.trim()), 'i'))
|
|
90
|
+
.map(item => item.trim())
|
|
91
|
+
.filter(Boolean);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function scoreCategories(goal, clauses) {
|
|
95
|
+
const text = goal.toLowerCase();
|
|
96
|
+
const scoreMap = {
|
|
97
|
+
closeLoop: 0,
|
|
98
|
+
decomposition: 0,
|
|
99
|
+
orchestration: 0,
|
|
100
|
+
quality: 0,
|
|
101
|
+
docs: 0
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
for (const [category, keywords] of Object.entries(CATEGORY_KEYWORDS)) {
|
|
105
|
+
for (const keyword of keywords) {
|
|
106
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
107
|
+
if (text.includes(lowerKeyword)) {
|
|
108
|
+
scoreMap[category] += 2;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
for (const clause of clauses) {
|
|
114
|
+
const lowerClause = clause.toLowerCase();
|
|
115
|
+
for (const [category, keywords] of Object.entries(CATEGORY_KEYWORDS)) {
|
|
116
|
+
for (const keyword of keywords) {
|
|
117
|
+
const lowerKeyword = keyword.toLowerCase();
|
|
118
|
+
if (lowerClause.includes(lowerKeyword)) {
|
|
119
|
+
scoreMap[category] += 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return scoreMap;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function escapeRegex(value) {
|
|
129
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
module.exports = {
|
|
133
|
+
analyzeGoalSemantics,
|
|
134
|
+
normalizeGoal,
|
|
135
|
+
splitIntoClauses,
|
|
136
|
+
scoreCategories
|
|
137
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Manager for Autonomous Execution
|
|
3
|
+
* Handles persistence and loading of autonomous execution state
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs-extra');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
class StateManager {
|
|
10
|
+
constructor(specName) {
|
|
11
|
+
this.specName = specName;
|
|
12
|
+
this.stateDir = path.join(process.cwd(), '.kiro', 'auto');
|
|
13
|
+
this.stateFile = path.join(this.stateDir, `${specName}-state.json`);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Initialize state directory
|
|
18
|
+
*/
|
|
19
|
+
async initialize() {
|
|
20
|
+
await fs.ensureDir(this.stateDir);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Save execution state
|
|
25
|
+
* @param {Object} state - State to save
|
|
26
|
+
*/
|
|
27
|
+
async saveState(state) {
|
|
28
|
+
await this.initialize();
|
|
29
|
+
|
|
30
|
+
const stateWithMetadata = {
|
|
31
|
+
...state,
|
|
32
|
+
version: '1.0.0',
|
|
33
|
+
specName: this.specName,
|
|
34
|
+
lastUpdated: new Date().toISOString()
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
await fs.writeJson(this.stateFile, stateWithMetadata, { spaces: 2 });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Load execution state
|
|
42
|
+
* @returns {Object|null} - Loaded state or null if not found
|
|
43
|
+
*/
|
|
44
|
+
async loadState() {
|
|
45
|
+
try {
|
|
46
|
+
if (await fs.pathExists(this.stateFile)) {
|
|
47
|
+
return await fs.readJson(this.stateFile);
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
} catch (error) {
|
|
51
|
+
console.error(`Failed to load state: ${error.message}`);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Check if state exists
|
|
58
|
+
* @returns {boolean}
|
|
59
|
+
*/
|
|
60
|
+
async hasState() {
|
|
61
|
+
return await fs.pathExists(this.stateFile);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Clear execution state
|
|
66
|
+
*/
|
|
67
|
+
async clearState() {
|
|
68
|
+
if (await fs.pathExists(this.stateFile)) {
|
|
69
|
+
await fs.remove(this.stateFile);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Create initial state
|
|
75
|
+
* @param {Object} options - Initial state options
|
|
76
|
+
* @returns {Object} - Initial state
|
|
77
|
+
*/
|
|
78
|
+
createInitialState(options = {}) {
|
|
79
|
+
return {
|
|
80
|
+
status: {
|
|
81
|
+
phase: 'initialization',
|
|
82
|
+
isRunning: false,
|
|
83
|
+
isPaused: false,
|
|
84
|
+
startedAt: new Date().toISOString(),
|
|
85
|
+
lastUpdated: new Date().toISOString()
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
taskQueue: {
|
|
89
|
+
tasks: [],
|
|
90
|
+
currentTask: null,
|
|
91
|
+
completedCount: 0,
|
|
92
|
+
failedCount: 0
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
progress: {
|
|
96
|
+
overallProgress: 0,
|
|
97
|
+
phaseProgress: {
|
|
98
|
+
requirements: 0,
|
|
99
|
+
design: 0,
|
|
100
|
+
tasks: 0,
|
|
101
|
+
implementation: 0,
|
|
102
|
+
qa: 0
|
|
103
|
+
},
|
|
104
|
+
estimatedCompletion: null
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
errors: {
|
|
108
|
+
total: 0,
|
|
109
|
+
resolved: 0,
|
|
110
|
+
unresolved: []
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
checkpoints: {
|
|
114
|
+
latest: null,
|
|
115
|
+
history: []
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
decisions: [],
|
|
119
|
+
executionLog: [],
|
|
120
|
+
|
|
121
|
+
config: options.config || {}
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
module.exports = StateManager;
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Queue Manager
|
|
3
|
+
* Manages task execution order, dependencies, and status tracking
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs-extra');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
class TaskQueueManager {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.tasks = [];
|
|
12
|
+
this.taskMap = new Map(); // id -> task
|
|
13
|
+
this.dependencyGraph = new Map(); // id -> [dependent task ids]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Load tasks from tasks.md file
|
|
18
|
+
* @param {string} tasksFilePath - Path to tasks.md
|
|
19
|
+
*/
|
|
20
|
+
async loadTasks(tasksFilePath) {
|
|
21
|
+
const content = await fs.readFile(tasksFilePath, 'utf-8');
|
|
22
|
+
const tasks = this.parseTasks(content);
|
|
23
|
+
|
|
24
|
+
for (const task of tasks) {
|
|
25
|
+
this.addTask(task);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
this.analyzeDependencies();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Parse tasks from markdown content
|
|
33
|
+
* @param {string} content - Markdown content
|
|
34
|
+
* @returns {Array} - Parsed tasks
|
|
35
|
+
*/
|
|
36
|
+
parseTasks(content) {
|
|
37
|
+
const tasks = [];
|
|
38
|
+
const lines = content.split('\n');
|
|
39
|
+
const taskRegex = /^- \[([ x\-~])\](\*)?\s+(\d+(?:\.\d+)?)\s+(.+)/;
|
|
40
|
+
|
|
41
|
+
for (const line of lines) {
|
|
42
|
+
const match = line.match(taskRegex);
|
|
43
|
+
if (match) {
|
|
44
|
+
const [, status, optional, id, title] = match;
|
|
45
|
+
|
|
46
|
+
const taskStatus = this.parseStatus(status);
|
|
47
|
+
const isOptional = optional === '*';
|
|
48
|
+
|
|
49
|
+
tasks.push({
|
|
50
|
+
id,
|
|
51
|
+
title: title.trim(),
|
|
52
|
+
status: taskStatus,
|
|
53
|
+
priority: this.calculatePriority(id),
|
|
54
|
+
dependencies: this.extractDependencies(title),
|
|
55
|
+
optional: isOptional,
|
|
56
|
+
attempts: 0,
|
|
57
|
+
error: null,
|
|
58
|
+
startedAt: null,
|
|
59
|
+
completedAt: null
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return tasks;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Parse task status from checkbox
|
|
69
|
+
* @param {string} checkbox - Checkbox character
|
|
70
|
+
* @returns {string} - Status
|
|
71
|
+
*/
|
|
72
|
+
parseStatus(checkbox) {
|
|
73
|
+
switch (checkbox) {
|
|
74
|
+
case 'x': return 'completed';
|
|
75
|
+
case '-': return 'in-progress';
|
|
76
|
+
case '~': return 'queued';
|
|
77
|
+
default: return 'queued';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Calculate task priority based on ID
|
|
83
|
+
* @param {string} id - Task ID
|
|
84
|
+
* @returns {number} - Priority (1-10)
|
|
85
|
+
*/
|
|
86
|
+
calculatePriority(id) {
|
|
87
|
+
// Earlier tasks have higher priority
|
|
88
|
+
const parts = id.split('.');
|
|
89
|
+
const major = parseInt(parts[0]) || 0;
|
|
90
|
+
return Math.max(1, 11 - major);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Extract dependencies from task title
|
|
95
|
+
* @param {string} title - Task title
|
|
96
|
+
* @returns {Array} - Dependency task IDs
|
|
97
|
+
*/
|
|
98
|
+
extractDependencies(title) {
|
|
99
|
+
// Look for "depends on X.Y" or "after X.Y" patterns
|
|
100
|
+
const depRegex = /(?:depends on|after|requires)\s+(\d+(?:\.\d+)?)/gi;
|
|
101
|
+
const dependencies = [];
|
|
102
|
+
let match;
|
|
103
|
+
|
|
104
|
+
while ((match = depRegex.exec(title)) !== null) {
|
|
105
|
+
dependencies.push(match[1]);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return dependencies;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Add task to queue
|
|
113
|
+
* @param {Object} task - Task to add
|
|
114
|
+
*/
|
|
115
|
+
addTask(task) {
|
|
116
|
+
this.tasks.push(task);
|
|
117
|
+
this.taskMap.set(task.id, task);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get next ready task
|
|
122
|
+
* @returns {Object|null} - Next task or null
|
|
123
|
+
*/
|
|
124
|
+
getNextTask() {
|
|
125
|
+
// Filter ready tasks (dependencies satisfied, not completed/failed)
|
|
126
|
+
const readyTasks = this.tasks.filter(task =>
|
|
127
|
+
task.status === 'queued' &&
|
|
128
|
+
!task.optional &&
|
|
129
|
+
this.isTaskReady(task.id)
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
if (readyTasks.length === 0) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Sort by priority (higher first)
|
|
137
|
+
readyTasks.sort((a, b) => b.priority - a.priority);
|
|
138
|
+
|
|
139
|
+
return readyTasks[0];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Check if task is ready to execute
|
|
144
|
+
* @param {string} taskId - Task ID
|
|
145
|
+
* @returns {boolean}
|
|
146
|
+
*/
|
|
147
|
+
isTaskReady(taskId) {
|
|
148
|
+
const task = this.taskMap.get(taskId);
|
|
149
|
+
if (!task) return false;
|
|
150
|
+
|
|
151
|
+
// Check all dependencies are completed
|
|
152
|
+
for (const depId of task.dependencies) {
|
|
153
|
+
const depTask = this.taskMap.get(depId);
|
|
154
|
+
if (!depTask || depTask.status !== 'completed') {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Mark task as complete
|
|
164
|
+
* @param {string} taskId - Task ID
|
|
165
|
+
*/
|
|
166
|
+
markTaskComplete(taskId) {
|
|
167
|
+
const task = this.taskMap.get(taskId);
|
|
168
|
+
if (task) {
|
|
169
|
+
task.status = 'completed';
|
|
170
|
+
task.completedAt = new Date().toISOString();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Mark task as failed
|
|
176
|
+
* @param {string} taskId - Task ID
|
|
177
|
+
* @param {Error} error - Error that caused failure
|
|
178
|
+
*/
|
|
179
|
+
markTaskFailed(taskId, error) {
|
|
180
|
+
const task = this.taskMap.get(taskId);
|
|
181
|
+
if (task) {
|
|
182
|
+
task.status = 'failed';
|
|
183
|
+
task.error = error.message;
|
|
184
|
+
task.attempts++;
|
|
185
|
+
|
|
186
|
+
// Block dependent tasks
|
|
187
|
+
this.blockDependentTasks(taskId);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Block tasks that depend on failed task
|
|
193
|
+
* @param {string} taskId - Failed task ID
|
|
194
|
+
*/
|
|
195
|
+
blockDependentTasks(taskId) {
|
|
196
|
+
const dependents = this.dependencyGraph.get(taskId) || [];
|
|
197
|
+
for (const depId of dependents) {
|
|
198
|
+
const task = this.taskMap.get(depId);
|
|
199
|
+
if (task && task.status === 'queued') {
|
|
200
|
+
task.status = 'blocked';
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Analyze dependencies and build dependency graph
|
|
207
|
+
*/
|
|
208
|
+
analyzeDependencies() {
|
|
209
|
+
// Build reverse dependency graph (task -> tasks that depend on it)
|
|
210
|
+
for (const task of this.tasks) {
|
|
211
|
+
for (const depId of task.dependencies) {
|
|
212
|
+
if (!this.dependencyGraph.has(depId)) {
|
|
213
|
+
this.dependencyGraph.set(depId, []);
|
|
214
|
+
}
|
|
215
|
+
this.dependencyGraph.get(depId).push(task.id);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Detect circular dependencies
|
|
220
|
+
this.detectCircularDependencies();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Detect circular dependencies
|
|
225
|
+
* @throws {Error} - If circular dependency detected
|
|
226
|
+
*/
|
|
227
|
+
detectCircularDependencies() {
|
|
228
|
+
const visited = new Set();
|
|
229
|
+
const recursionStack = new Set();
|
|
230
|
+
|
|
231
|
+
const hasCycle = (taskId) => {
|
|
232
|
+
visited.add(taskId);
|
|
233
|
+
recursionStack.add(taskId);
|
|
234
|
+
|
|
235
|
+
const task = this.taskMap.get(taskId);
|
|
236
|
+
if (task) {
|
|
237
|
+
for (const depId of task.dependencies) {
|
|
238
|
+
if (!visited.has(depId)) {
|
|
239
|
+
if (hasCycle(depId)) {
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
} else if (recursionStack.has(depId)) {
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
recursionStack.delete(taskId);
|
|
249
|
+
return false;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
for (const task of this.tasks) {
|
|
253
|
+
if (!visited.has(task.id)) {
|
|
254
|
+
if (hasCycle(task.id)) {
|
|
255
|
+
throw new Error(`Circular dependency detected involving task ${task.id}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Set task priority
|
|
263
|
+
* @param {string} taskId - Task ID
|
|
264
|
+
* @param {number} priority - Priority (1-10)
|
|
265
|
+
*/
|
|
266
|
+
setPriority(taskId, priority) {
|
|
267
|
+
const task = this.taskMap.get(taskId);
|
|
268
|
+
if (task) {
|
|
269
|
+
task.priority = Math.max(1, Math.min(10, priority));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Reorder queue based on priorities
|
|
275
|
+
*/
|
|
276
|
+
reorderQueue() {
|
|
277
|
+
this.tasks.sort((a, b) => b.priority - a.priority);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Get queue status
|
|
282
|
+
* @returns {Object} - Queue status
|
|
283
|
+
*/
|
|
284
|
+
getQueueStatus() {
|
|
285
|
+
return {
|
|
286
|
+
total: this.tasks.length,
|
|
287
|
+
queued: this.tasks.filter(t => t.status === 'queued').length,
|
|
288
|
+
inProgress: this.tasks.filter(t => t.status === 'in-progress').length,
|
|
289
|
+
completed: this.tasks.filter(t => t.status === 'completed').length,
|
|
290
|
+
failed: this.tasks.filter(t => t.status === 'failed').length,
|
|
291
|
+
blocked: this.tasks.filter(t => t.status === 'blocked').length
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Get completed tasks
|
|
297
|
+
* @returns {Array} - Completed tasks
|
|
298
|
+
*/
|
|
299
|
+
getCompletedTasks() {
|
|
300
|
+
return this.tasks.filter(t => t.status === 'completed');
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Get failed tasks
|
|
305
|
+
* @returns {Array} - Failed tasks
|
|
306
|
+
*/
|
|
307
|
+
getFailedTasks() {
|
|
308
|
+
return this.tasks.filter(t => t.status === 'failed');
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Get remaining tasks
|
|
313
|
+
* @returns {Array} - Remaining tasks
|
|
314
|
+
*/
|
|
315
|
+
getRemainingTasks() {
|
|
316
|
+
return this.tasks.filter(t =>
|
|
317
|
+
t.status === 'queued' ||
|
|
318
|
+
t.status === 'in-progress' ||
|
|
319
|
+
t.status === 'blocked'
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Get blocked tasks
|
|
325
|
+
* @returns {Array} - Blocked tasks
|
|
326
|
+
*/
|
|
327
|
+
getBlockedTasks() {
|
|
328
|
+
return this.tasks.filter(t => t.status === 'blocked');
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Check if queue has remaining tasks
|
|
333
|
+
* @returns {boolean}
|
|
334
|
+
*/
|
|
335
|
+
hasRemainingTasks() {
|
|
336
|
+
return this.getRemainingTasks().length > 0;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
module.exports = TaskQueueManager;
|