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.
Files changed (336) hide show
  1. package/CHANGELOG.md +2513 -0
  2. package/LICENSE +21 -0
  3. package/README.md +765 -0
  4. package/README.zh.md +630 -0
  5. package/bin/kiro-spec-engine.js +796 -0
  6. package/bin/kse.js +3 -0
  7. package/bin/sce.js +3 -0
  8. package/bin/sco.js +3 -0
  9. package/docs/331-poc-adaptation-roadmap.md +156 -0
  10. package/docs/331-poc-dual-track-integration-guide.md +120 -0
  11. package/docs/331-poc-weekly-delivery-checklist.md +52 -0
  12. package/docs/OFFLINE_INSTALL.md +96 -0
  13. package/docs/README.md +279 -0
  14. package/docs/adopt-migration-guide.md +599 -0
  15. package/docs/adoption-guide.md +616 -0
  16. package/docs/agent-hooks-analysis.md +815 -0
  17. package/docs/architecture.md +733 -0
  18. package/docs/articles/ai-driven-development-philosophy-and-practice-review.md +208 -0
  19. package/docs/articles/ai-driven-development-philosophy-and-practice.en.md +459 -0
  20. package/docs/articles/ai-driven-development-philosophy-and-practice.md +492 -0
  21. package/docs/autonomous-control-guide.md +851 -0
  22. package/docs/command-reference.md +1368 -0
  23. package/docs/community.md +115 -0
  24. package/docs/cross-tool-guide.md +555 -0
  25. package/docs/developer-guide.md +619 -0
  26. package/docs/document-governance.md +865 -0
  27. package/docs/environment-management-guide.md +526 -0
  28. package/docs/examples/add-export-command/design.md +194 -0
  29. package/docs/examples/add-export-command/requirements.md +110 -0
  30. package/docs/examples/add-export-command/tasks.md +88 -0
  31. package/docs/examples/add-rest-api/design.md +855 -0
  32. package/docs/examples/add-rest-api/requirements.md +323 -0
  33. package/docs/examples/add-rest-api/tasks.md +355 -0
  34. package/docs/examples/add-user-dashboard/design.md +192 -0
  35. package/docs/examples/add-user-dashboard/requirements.md +143 -0
  36. package/docs/examples/add-user-dashboard/tasks.md +91 -0
  37. package/docs/faq.md +697 -0
  38. package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.json +156 -0
  39. package/docs/handoffs/evidence/ontology/moqui-template-baseline-2026-02-17-232922.md +24 -0
  40. package/docs/images/wechat-qr.png +0 -0
  41. package/docs/integration-modes.md +529 -0
  42. package/docs/integration-philosophy.md +313 -0
  43. package/docs/knowledge-management-guide.md +263 -0
  44. package/docs/manual-workflows-guide.md +418 -0
  45. package/docs/moqui-capability-matrix.md +73 -0
  46. package/docs/moqui-template-core-library-playbook.md +109 -0
  47. package/docs/multi-agent-coordination-guide.md +553 -0
  48. package/docs/multi-repo-management-guide.md +1344 -0
  49. package/docs/quick-start-with-ai-tools.md +375 -0
  50. package/docs/quick-start.md +146 -0
  51. package/docs/release-checklist.md +121 -0
  52. package/docs/releases/README.md +13 -0
  53. package/docs/releases/v1.46.2-validation.md +45 -0
  54. package/docs/releases/v1.46.2.md +50 -0
  55. package/docs/scene-runtime-guide.md +347 -0
  56. package/docs/spec-collaboration-guide.md +369 -0
  57. package/docs/spec-locking-guide.md +225 -0
  58. package/docs/spec-numbering-guide.md +348 -0
  59. package/docs/spec-workflow.md +519 -0
  60. package/docs/steering-strategy-guide.md +196 -0
  61. package/docs/team-collaboration-guide.md +465 -0
  62. package/docs/testing-strategy.md +272 -0
  63. package/docs/tools/claude-guide.md +654 -0
  64. package/docs/tools/cursor-guide.md +706 -0
  65. package/docs/tools/generic-guide.md +446 -0
  66. package/docs/tools/kiro-guide.md +308 -0
  67. package/docs/tools/vscode-guide.md +445 -0
  68. package/docs/tools/windsurf-guide.md +391 -0
  69. package/docs/troubleshooting.md +1135 -0
  70. package/docs/upgrade-guide.md +639 -0
  71. package/docs/value-observability-guide.md +127 -0
  72. package/docs/zh/README.md +341 -0
  73. package/docs/zh/quick-start.md +764 -0
  74. package/docs/zh/release-checklist.md +121 -0
  75. package/docs/zh/releases/README.md +13 -0
  76. package/docs/zh/releases/v1.46.2-validation.md +45 -0
  77. package/docs/zh/releases/v1.46.2.md +50 -0
  78. package/docs/zh/spec-numbering-guide.md +348 -0
  79. package/docs/zh/tools/claude-guide.md +349 -0
  80. package/docs/zh/tools/cursor-guide.md +281 -0
  81. package/docs/zh/tools/generic-guide.md +499 -0
  82. package/docs/zh/tools/kiro-guide.md +342 -0
  83. package/docs/zh/tools/vscode-guide.md +449 -0
  84. package/docs/zh/tools/windsurf-guide.md +378 -0
  85. package/docs/zh/value-observability-guide.md +127 -0
  86. package/docs//344/272/244/344/273/230/346/270/205/345/215/225.md +75 -0
  87. package/lib/adoption/adoption-logger.js +487 -0
  88. package/lib/adoption/adoption-strategy.js +538 -0
  89. package/lib/adoption/backup-manager.js +420 -0
  90. package/lib/adoption/conflict-resolver.js +410 -0
  91. package/lib/adoption/detection-engine.js +275 -0
  92. package/lib/adoption/diff-viewer.js +226 -0
  93. package/lib/adoption/error-formatter.js +509 -0
  94. package/lib/adoption/file-classifier.js +385 -0
  95. package/lib/adoption/progress-reporter.js +534 -0
  96. package/lib/adoption/smart-orchestrator.js +470 -0
  97. package/lib/adoption/strategy-selector.js +218 -0
  98. package/lib/adoption/summary-generator.js +493 -0
  99. package/lib/adoption/template-sync.js +605 -0
  100. package/lib/auto/autonomous-engine.js +485 -0
  101. package/lib/auto/checkpoint-manager.js +300 -0
  102. package/lib/auto/close-loop-runner.js +2476 -0
  103. package/lib/auto/config-schema.js +176 -0
  104. package/lib/auto/decision-engine.js +344 -0
  105. package/lib/auto/error-recovery-manager.js +580 -0
  106. package/lib/auto/goal-decomposer.js +278 -0
  107. package/lib/auto/progress-tracker.js +502 -0
  108. package/lib/auto/safety-manager.js +186 -0
  109. package/lib/auto/semantic-decomposer.js +137 -0
  110. package/lib/auto/state-manager.js +126 -0
  111. package/lib/auto/task-queue-manager.js +340 -0
  112. package/lib/backup/backup-system.js +372 -0
  113. package/lib/backup/selective-backup.js +207 -0
  114. package/lib/collab/agent-registry.js +240 -0
  115. package/lib/collab/collab-manager.js +285 -0
  116. package/lib/collab/contract-manager.js +320 -0
  117. package/lib/collab/coordinator.js +370 -0
  118. package/lib/collab/dependency-manager.js +280 -0
  119. package/lib/collab/index.js +20 -0
  120. package/lib/collab/integration-manager.js +202 -0
  121. package/lib/collab/merge-coordinator.js +252 -0
  122. package/lib/collab/metadata-manager.js +233 -0
  123. package/lib/collab/multi-agent-config.js +120 -0
  124. package/lib/collab/spec-lifecycle-manager.js +304 -0
  125. package/lib/collab/sync-barrier.js +88 -0
  126. package/lib/collab/visualizer.js +208 -0
  127. package/lib/commands/adopt.js +749 -0
  128. package/lib/commands/auto.js +19559 -0
  129. package/lib/commands/collab.js +275 -0
  130. package/lib/commands/context.js +99 -0
  131. package/lib/commands/docs.js +808 -0
  132. package/lib/commands/doctor.js +273 -0
  133. package/lib/commands/env.js +420 -0
  134. package/lib/commands/knowledge.js +309 -0
  135. package/lib/commands/lock.js +235 -0
  136. package/lib/commands/ops.js +409 -0
  137. package/lib/commands/orchestrate.js +446 -0
  138. package/lib/commands/prompt.js +105 -0
  139. package/lib/commands/repo.js +118 -0
  140. package/lib/commands/rollback.js +219 -0
  141. package/lib/commands/scene.js +15549 -0
  142. package/lib/commands/spec-bootstrap.js +147 -0
  143. package/lib/commands/spec-gate.js +157 -0
  144. package/lib/commands/spec-pipeline.js +205 -0
  145. package/lib/commands/status.js +321 -0
  146. package/lib/commands/task.js +199 -0
  147. package/lib/commands/templates.js +654 -0
  148. package/lib/commands/upgrade.js +231 -0
  149. package/lib/commands/value.js +569 -0
  150. package/lib/commands/watch.js +684 -0
  151. package/lib/commands/workflows.js +240 -0
  152. package/lib/commands/workspace-multi.js +325 -0
  153. package/lib/commands/workspace.js +189 -0
  154. package/lib/context/context-exporter.js +378 -0
  155. package/lib/context/prompt-generator.js +482 -0
  156. package/lib/data/moqui-capability-lexicon.json +45 -0
  157. package/lib/environment/backup-system.js +189 -0
  158. package/lib/environment/environment-manager.js +379 -0
  159. package/lib/environment/environment-registry.js +168 -0
  160. package/lib/gitignore/gitignore-backup.js +229 -0
  161. package/lib/gitignore/gitignore-detector.js +239 -0
  162. package/lib/gitignore/gitignore-integration.js +267 -0
  163. package/lib/gitignore/gitignore-transformer.js +193 -0
  164. package/lib/gitignore/layered-rules-template.js +42 -0
  165. package/lib/governance/archive-tool.js +284 -0
  166. package/lib/governance/cleanup-tool.js +237 -0
  167. package/lib/governance/config-manager.js +186 -0
  168. package/lib/governance/diagnostic-engine.js +271 -0
  169. package/lib/governance/doc-reference-checker.js +200 -0
  170. package/lib/governance/execution-logger.js +243 -0
  171. package/lib/governance/file-scanner.js +285 -0
  172. package/lib/governance/hooks-manager.js +333 -0
  173. package/lib/governance/reporter.js +337 -0
  174. package/lib/governance/validation-engine.js +181 -0
  175. package/lib/i18n.js +79 -0
  176. package/lib/knowledge/entry-manager.js +208 -0
  177. package/lib/knowledge/index-manager.js +261 -0
  178. package/lib/knowledge/knowledge-manager.js +273 -0
  179. package/lib/knowledge/template-manager.js +191 -0
  180. package/lib/lock/index.js +21 -0
  181. package/lib/lock/lock-file.js +192 -0
  182. package/lib/lock/lock-manager.js +321 -0
  183. package/lib/lock/machine-identifier.js +135 -0
  184. package/lib/lock/steering-file-lock.js +207 -0
  185. package/lib/lock/task-lock-manager.js +345 -0
  186. package/lib/operations/audit-logger.js +293 -0
  187. package/lib/operations/feedback-manager.js +1147 -0
  188. package/lib/operations/index.js +23 -0
  189. package/lib/operations/models/index.js +170 -0
  190. package/lib/operations/operations-manager.js +151 -0
  191. package/lib/operations/operations-validator.js +280 -0
  192. package/lib/operations/permission-manager.js +354 -0
  193. package/lib/operations/template-loader.js +143 -0
  194. package/lib/orchestrator/agent-spawner.js +629 -0
  195. package/lib/orchestrator/bootstrap-prompt-builder.js +236 -0
  196. package/lib/orchestrator/index.js +19 -0
  197. package/lib/orchestrator/orchestration-engine.js +1270 -0
  198. package/lib/orchestrator/orchestrator-config.js +173 -0
  199. package/lib/orchestrator/status-monitor.js +591 -0
  200. package/lib/python-checker.js +209 -0
  201. package/lib/repo/config-manager.js +580 -0
  202. package/lib/repo/errors/config-error.js +13 -0
  203. package/lib/repo/errors/git-error.js +15 -0
  204. package/lib/repo/errors/repo-error.js +14 -0
  205. package/lib/repo/git-operations.js +181 -0
  206. package/lib/repo/handlers/.gitkeep +1 -0
  207. package/lib/repo/handlers/exec-handler.js +155 -0
  208. package/lib/repo/handlers/health-handler.js +169 -0
  209. package/lib/repo/handlers/init-handler.js +197 -0
  210. package/lib/repo/handlers/status-handler.js +176 -0
  211. package/lib/repo/output-formatter.js +184 -0
  212. package/lib/repo/path-resolver.js +178 -0
  213. package/lib/repo/repo-manager.js +514 -0
  214. package/lib/scene-runtime/audit-emitter.js +59 -0
  215. package/lib/scene-runtime/binding-plugin-loader.js +351 -0
  216. package/lib/scene-runtime/binding-registry.js +349 -0
  217. package/lib/scene-runtime/eval-bridge.js +44 -0
  218. package/lib/scene-runtime/index.js +19 -0
  219. package/lib/scene-runtime/moqui-adapter.js +620 -0
  220. package/lib/scene-runtime/moqui-client.js +606 -0
  221. package/lib/scene-runtime/moqui-extractor.js +2029 -0
  222. package/lib/scene-runtime/plan-compiler.js +208 -0
  223. package/lib/scene-runtime/policy-gate.js +58 -0
  224. package/lib/scene-runtime/runtime-executor.js +358 -0
  225. package/lib/scene-runtime/scene-loader.js +96 -0
  226. package/lib/scene-runtime/scene-ontology.js +959 -0
  227. package/lib/scene-runtime/scene-template-linter.js +852 -0
  228. package/lib/scene-runtime/templates/scene-template-erp-query-v0.1.yaml +28 -0
  229. package/lib/scene-runtime/templates/scene-template-hybrid-shadow-v0.1.yaml +34 -0
  230. package/lib/spec/bootstrap/context-collector.js +48 -0
  231. package/lib/spec/bootstrap/draft-generator.js +158 -0
  232. package/lib/spec/bootstrap/questionnaire-engine.js +70 -0
  233. package/lib/spec/bootstrap/trace-emitter.js +59 -0
  234. package/lib/spec/multi-spec-orchestrate.js +93 -0
  235. package/lib/spec/pipeline/constants.js +6 -0
  236. package/lib/spec/pipeline/stage-adapters.js +118 -0
  237. package/lib/spec/pipeline/stage-runner.js +146 -0
  238. package/lib/spec/pipeline/state-store.js +119 -0
  239. package/lib/spec-gate/engine/gate-engine.js +165 -0
  240. package/lib/spec-gate/policy/default-policy.js +22 -0
  241. package/lib/spec-gate/policy/policy-loader.js +103 -0
  242. package/lib/spec-gate/result-emitter.js +81 -0
  243. package/lib/spec-gate/rules/default-rules.js +156 -0
  244. package/lib/spec-gate/rules/rule-registry.js +51 -0
  245. package/lib/steering/adoption-config.js +164 -0
  246. package/lib/steering/compliance-auto-fixer.js +204 -0
  247. package/lib/steering/compliance-cache.js +99 -0
  248. package/lib/steering/compliance-error-reporter.js +70 -0
  249. package/lib/steering/context-sync-manager.js +273 -0
  250. package/lib/steering/index.js +92 -0
  251. package/lib/steering/spec-steering.js +230 -0
  252. package/lib/steering/steering-compliance-checker.js +73 -0
  253. package/lib/steering/steering-loader.js +144 -0
  254. package/lib/steering/steering-manager.js +289 -0
  255. package/lib/task/index.js +12 -0
  256. package/lib/task/task-claimer.js +489 -0
  257. package/lib/task/task-status-store.js +418 -0
  258. package/lib/templates/cache-manager.js +440 -0
  259. package/lib/templates/content-generalizer.js +247 -0
  260. package/lib/templates/frontmatter-generator.js +128 -0
  261. package/lib/templates/git-handler.js +471 -0
  262. package/lib/templates/metadata-collector.js +328 -0
  263. package/lib/templates/path-utils.js +144 -0
  264. package/lib/templates/registry-parser.js +505 -0
  265. package/lib/templates/spec-reader.js +216 -0
  266. package/lib/templates/template-applicator.js +249 -0
  267. package/lib/templates/template-creator.js +256 -0
  268. package/lib/templates/template-error.js +143 -0
  269. package/lib/templates/template-exporter.js +502 -0
  270. package/lib/templates/template-manager.js +782 -0
  271. package/lib/templates/template-validator.js +361 -0
  272. package/lib/upgrade/migration-engine.js +382 -0
  273. package/lib/upgrade/migrations/.gitkeep +52 -0
  274. package/lib/upgrade/migrations/1.0.0-to-1.1.0.js +78 -0
  275. package/lib/utils/file-diff.js +177 -0
  276. package/lib/utils/fs-utils.js +274 -0
  277. package/lib/utils/tool-detector.js +383 -0
  278. package/lib/utils/validation.js +324 -0
  279. package/lib/value/gate-summary-emitter.js +99 -0
  280. package/lib/value/metric-contract-loader.js +210 -0
  281. package/lib/value/risk-evaluator.js +117 -0
  282. package/lib/value/weekly-snapshot-builder.js +61 -0
  283. package/lib/version/version-checker.js +156 -0
  284. package/lib/version/version-manager.js +327 -0
  285. package/lib/watch/action-executor.js +458 -0
  286. package/lib/watch/event-debouncer.js +323 -0
  287. package/lib/watch/execution-logger.js +550 -0
  288. package/lib/watch/file-watcher.js +499 -0
  289. package/lib/watch/presets.js +266 -0
  290. package/lib/watch/watch-manager.js +533 -0
  291. package/lib/workspace/multi/global-config.js +150 -0
  292. package/lib/workspace/multi/index.js +22 -0
  293. package/lib/workspace/multi/path-utils.js +173 -0
  294. package/lib/workspace/multi/workspace-context-resolver.js +244 -0
  295. package/lib/workspace/multi/workspace-registry.js +196 -0
  296. package/lib/workspace/multi/workspace-state-manager.js +537 -0
  297. package/lib/workspace/multi/workspace.js +90 -0
  298. package/lib/workspace/workspace-manager.js +370 -0
  299. package/lib/workspace/workspace-sync.js +356 -0
  300. package/locales/en.json +114 -0
  301. package/locales/zh.json +114 -0
  302. package/package.json +102 -0
  303. package/template/.kiro/README.md +247 -0
  304. package/template/.kiro/hooks/check-spec-on-create.kiro.hook +17 -0
  305. package/template/.kiro/hooks/run-tests-on-save.kiro.hook +13 -0
  306. package/template/.kiro/hooks/sync-tasks-on-edit.kiro.hook +16 -0
  307. package/template/.kiro/specs/SPEC_WORKFLOW_GUIDE.md +134 -0
  308. package/template/.kiro/steering/CORE_PRINCIPLES.md +133 -0
  309. package/template/.kiro/steering/CURRENT_CONTEXT.md +30 -0
  310. package/template/.kiro/steering/ENVIRONMENT.md +35 -0
  311. package/template/.kiro/steering/RULES_GUIDE.md +46 -0
  312. package/template/.kiro/templates/operations/default/change-impact.md +112 -0
  313. package/template/.kiro/templates/operations/default/deployment.md +91 -0
  314. package/template/.kiro/templates/operations/default/feedback-response.md +269 -0
  315. package/template/.kiro/templates/operations/default/migration-plan.md +172 -0
  316. package/template/.kiro/templates/operations/default/monitoring.md +135 -0
  317. package/template/.kiro/templates/operations/default/operations.md +135 -0
  318. package/template/.kiro/templates/operations/default/rollback.md +143 -0
  319. package/template/.kiro/templates/operations/default/tools.yaml +364 -0
  320. package/template/.kiro/templates/operations/default/troubleshooting.md +123 -0
  321. package/template/.kiro/tools/backup_manager.py +295 -0
  322. package/template/.kiro/tools/configuration_manager.py +218 -0
  323. package/template/.kiro/tools/document_evaluator.py +550 -0
  324. package/template/.kiro/tools/enhancement_logger.py +168 -0
  325. package/template/.kiro/tools/error_handler.py +335 -0
  326. package/template/.kiro/tools/improvement_identifier.py +444 -0
  327. package/template/.kiro/tools/modification_applicator.py +737 -0
  328. package/template/.kiro/tools/quality_gate_enforcer.py +207 -0
  329. package/template/.kiro/tools/quality_scorer.py +305 -0
  330. package/template/.kiro/tools/report_generator.py +154 -0
  331. package/template/.kiro/tools/ultrawork_enhancer.py +676 -0
  332. package/template/.kiro/tools/ultrawork_enhancer_refactored.py +0 -0
  333. package/template/.kiro/tools/ultrawork_enhancer_v2.py +463 -0
  334. package/template/.kiro/tools/ultrawork_enhancer_v3.py +606 -0
  335. package/template/.kiro/tools/workflow_quality_gate.py +100 -0
  336. 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;