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,147 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('path');
3
+ const chalk = require('chalk');
4
+ const { runOrchestration } = require('./orchestrate');
5
+ const {
6
+ parseSpecTargets,
7
+ runMultiSpecViaOrchestrate
8
+ } = require('../spec/multi-spec-orchestrate');
9
+
10
+ const { ContextCollector } = require('../spec/bootstrap/context-collector');
11
+ const { QuestionnaireEngine } = require('../spec/bootstrap/questionnaire-engine');
12
+ const { DraftGenerator } = require('../spec/bootstrap/draft-generator');
13
+ const { TraceEmitter } = require('../spec/bootstrap/trace-emitter');
14
+
15
+ async function runSpecBootstrap(options = {}, dependencies = {}) {
16
+ const projectPath = dependencies.projectPath || process.cwd();
17
+
18
+ const specTargets = parseSpecTargets({
19
+ spec: options.spec || options.name,
20
+ specs: options.specs
21
+ });
22
+
23
+ if (specTargets.length > 1) {
24
+ const executeOrchestration = dependencies.runOrchestration || runOrchestration;
25
+ return runMultiSpecViaOrchestrate({
26
+ specTargets,
27
+ projectPath,
28
+ commandOptions: options,
29
+ runOrchestration: executeOrchestration,
30
+ commandLabel: 'Multi-spec bootstrap',
31
+ nextActionLabel: 'Multi-spec bootstrap defaulted to orchestrate mode.'
32
+ });
33
+ }
34
+
35
+ const contextCollector = dependencies.contextCollector || new ContextCollector(projectPath);
36
+ const questionnaireEngine = dependencies.questionnaireEngine || new QuestionnaireEngine({
37
+ prompt: dependencies.prompt,
38
+ maxQuestions: dependencies.maxQuestions
39
+ });
40
+ const draftGenerator = dependencies.draftGenerator || new DraftGenerator();
41
+ const traceEmitter = dependencies.traceEmitter || new TraceEmitter();
42
+
43
+ if (options.nonInteractive && specTargets.length === 0) {
44
+ throw new Error('--name is required in non-interactive mode');
45
+ }
46
+
47
+ const context = await contextCollector.collect();
48
+ const answers = await questionnaireEngine.collect({
49
+ nonInteractive: options.nonInteractive,
50
+ specName: specTargets[0] || options.name,
51
+ profile: options.profile,
52
+ template: options.template
53
+ });
54
+
55
+ const specName = (specTargets[0] || options.name || answers.specName || '').trim();
56
+ if (!specName) {
57
+ throw new Error('Spec name is required');
58
+ }
59
+
60
+ const draft = draftGenerator.generate({
61
+ specName,
62
+ profile: options.profile || 'general',
63
+ template: options.template || 'default',
64
+ context,
65
+ answers
66
+ });
67
+
68
+ const specPath = path.join(projectPath, '.kiro', 'specs', specName);
69
+ const files = {
70
+ requirements: path.join(specPath, 'requirements.md'),
71
+ design: path.join(specPath, 'design.md'),
72
+ tasks: path.join(specPath, 'tasks.md')
73
+ };
74
+
75
+ if (!options.dryRun) {
76
+ await fs.ensureDir(specPath);
77
+ await fs.writeFile(files.requirements, draft.requirements, 'utf8');
78
+ await fs.writeFile(files.design, draft.design, 'utf8');
79
+ await fs.writeFile(files.tasks, draft.tasks, 'utf8');
80
+ }
81
+
82
+ const result = {
83
+ success: true,
84
+ specName,
85
+ specPath: path.relative(projectPath, specPath),
86
+ dryRun: !!options.dryRun,
87
+ files: {
88
+ requirements: path.relative(projectPath, files.requirements),
89
+ design: path.relative(projectPath, files.design),
90
+ tasks: path.relative(projectPath, files.tasks)
91
+ },
92
+ trace: {
93
+ template: options.template || 'default',
94
+ profile: options.profile || 'general',
95
+ parameters: {
96
+ nonInteractive: !!options.nonInteractive,
97
+ dryRun: !!options.dryRun,
98
+ json: !!options.json
99
+ },
100
+ context: {
101
+ totalSpecs: context.totalSpecs,
102
+ preferredLanguage: context.preferredLanguage
103
+ },
104
+ mapping: draft.metadata.mapping
105
+ },
106
+ preview: {
107
+ requirements: draft.requirements,
108
+ design: draft.design,
109
+ tasks: draft.tasks
110
+ }
111
+ };
112
+
113
+ traceEmitter.emit(result, { json: options.json });
114
+ return result;
115
+ }
116
+
117
+ function registerSpecBootstrapCommand(program) {
118
+ program
119
+ .command('spec-bootstrap')
120
+ .description('Bootstrap requirements/design/tasks draft (use: kse spec bootstrap)')
121
+ .option('--name <spec-name>', 'Spec name to generate')
122
+ .option('--spec <name>', 'Alias of --name')
123
+ .option('--specs <names>', 'Comma-separated Spec identifiers (multi-spec defaults to orchestrate mode)')
124
+ .option('--template <template-id>', 'Template hint for draft generation')
125
+ .option('--profile <profile-id>', 'Profile for default generation strategy')
126
+ .option('--non-interactive', 'Disable prompts and use arguments/defaults only')
127
+ .option('--dry-run', 'Preview generation result without writing files')
128
+ .option('--json', 'Output machine-readable JSON')
129
+ .option('--max-parallel <n>', 'Maximum parallel agents when orchestrate mode is used', parseInt)
130
+ .action(async (options) => {
131
+ try {
132
+ await runSpecBootstrap(options);
133
+ } catch (error) {
134
+ if (options.json) {
135
+ console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
136
+ } else {
137
+ console.error(chalk.red('❌ Spec bootstrap failed:'), error.message);
138
+ }
139
+ process.exit(1);
140
+ }
141
+ });
142
+ }
143
+
144
+ module.exports = {
145
+ registerSpecBootstrapCommand,
146
+ runSpecBootstrap
147
+ };
@@ -0,0 +1,157 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('path');
3
+ const chalk = require('chalk');
4
+ const { runOrchestration } = require('./orchestrate');
5
+ const {
6
+ parseSpecTargets,
7
+ runMultiSpecViaOrchestrate
8
+ } = require('../spec/multi-spec-orchestrate');
9
+
10
+ const { PolicyLoader } = require('../spec-gate/policy/policy-loader');
11
+ const { RuleRegistry } = require('../spec-gate/rules/rule-registry');
12
+ const { createDefaultRules } = require('../spec-gate/rules/default-rules');
13
+ const { GateEngine } = require('../spec-gate/engine/gate-engine');
14
+ const { ResultEmitter } = require('../spec-gate/result-emitter');
15
+
16
+ async function runSpecGate(options = {}, dependencies = {}) {
17
+ const projectPath = dependencies.projectPath || process.cwd();
18
+ const specTargets = parseSpecTargets(options);
19
+
20
+ if (specTargets.length === 0) {
21
+ throw new Error('Either --spec or --specs is required');
22
+ }
23
+
24
+ if (specTargets.length > 1) {
25
+ const executeOrchestration = dependencies.runOrchestration || runOrchestration;
26
+ return runMultiSpecViaOrchestrate({
27
+ specTargets,
28
+ projectPath,
29
+ commandOptions: options,
30
+ runOrchestration: executeOrchestration,
31
+ commandLabel: 'Multi-spec gate',
32
+ nextActionLabel: 'Multi-spec gate execution defaulted to orchestrate mode.'
33
+ });
34
+ }
35
+
36
+ const specId = specTargets[0];
37
+
38
+ const specPath = path.join(projectPath, '.kiro', 'specs', specId);
39
+ if (!await fs.pathExists(specPath)) {
40
+ throw new Error(`Spec not found: ${specId}`);
41
+ }
42
+
43
+ const policyLoader = dependencies.policyLoader || new PolicyLoader(projectPath);
44
+ const policy = dependencies.policy || await policyLoader.load({
45
+ policy: options.policy,
46
+ strict: options.strict
47
+ });
48
+
49
+ const registry = dependencies.registry || new RuleRegistry(createDefaultRules(projectPath));
50
+ const engine = dependencies.engine || new GateEngine({
51
+ registry,
52
+ policy
53
+ });
54
+
55
+ const result = await engine.evaluate({ specId });
56
+ const emitter = dependencies.emitter || new ResultEmitter(projectPath);
57
+ const emitted = await emitter.emit(result, {
58
+ json: options.json,
59
+ out: options.out,
60
+ silent: options.silent
61
+ });
62
+
63
+ return {
64
+ ...result,
65
+ report_path: emitted.outputPath
66
+ };
67
+ }
68
+
69
+ async function generateSpecGatePolicyTemplate(options = {}, dependencies = {}) {
70
+ const projectPath = dependencies.projectPath || process.cwd();
71
+ const loader = dependencies.policyLoader || new PolicyLoader(projectPath);
72
+ const template = loader.getTemplate();
73
+
74
+ const outputPath = options.out
75
+ ? (path.isAbsolute(options.out) ? options.out : path.join(projectPath, options.out))
76
+ : path.join(projectPath, '.kiro', 'config', 'spec-gate-policy.template.json');
77
+
78
+ await fs.ensureDir(path.dirname(outputPath));
79
+ await fs.writeJson(outputPath, template, { spaces: 2 });
80
+
81
+ if (!options.silent) {
82
+ console.log(chalk.green('✅ Spec gate policy template generated:'));
83
+ console.log(` ${outputPath}`);
84
+ }
85
+
86
+ return {
87
+ success: true,
88
+ outputPath
89
+ };
90
+ }
91
+
92
+ function registerSpecGateCommand(program) {
93
+ const specGate = program
94
+ .command('spec-gate')
95
+ .description('Run standardized Spec gate checks (use: kse spec gate)');
96
+
97
+ specGate
98
+ .command('run')
99
+ .description('Execute gate checks for one or more Specs')
100
+ .option('--spec <name>', 'Single Spec identifier')
101
+ .option('--specs <names>', 'Comma-separated Spec identifiers (multi-spec defaults to orchestrate mode)')
102
+ .option('--policy <path>', 'Policy JSON path')
103
+ .option('--strict', 'Enable strict mode override')
104
+ .option('--json', 'Output machine-readable JSON')
105
+ .option('--out <path>', 'Write JSON result to file')
106
+ .option('--max-parallel <n>', 'Maximum parallel agents when orchestrate mode is used', parseInt)
107
+ .action(async options => {
108
+ try {
109
+ await runSpecGate(options);
110
+ } catch (error) {
111
+ if (options.json) {
112
+ console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
113
+ } else {
114
+ console.error(chalk.red('❌ Spec gate failed:'), error.message);
115
+ }
116
+ process.exit(1);
117
+ }
118
+ });
119
+
120
+ specGate
121
+ .command('policy-template')
122
+ .description('Generate policy template JSON for Spec gate')
123
+ .option('--out <path>', 'Template output path')
124
+ .action(async options => {
125
+ try {
126
+ await generateSpecGatePolicyTemplate(options);
127
+ } catch (error) {
128
+ console.error(chalk.red('❌ Failed to generate policy template:'), error.message);
129
+ process.exit(1);
130
+ }
131
+ });
132
+ }
133
+
134
+ async function _runGateInOrchestrateMode(specTargets, options, dependencies) {
135
+ const projectPath = dependencies.projectPath || process.cwd();
136
+ const executeOrchestration = dependencies.runOrchestration || runOrchestration;
137
+
138
+ return runMultiSpecViaOrchestrate({
139
+ specTargets,
140
+ projectPath,
141
+ commandOptions: options,
142
+ runOrchestration: executeOrchestration,
143
+ commandLabel: 'Multi-spec gate',
144
+ nextActionLabel: 'Multi-spec gate execution defaulted to orchestrate mode.'
145
+ });
146
+ }
147
+
148
+ function _parseSpecTargets(options = {}) {
149
+ return parseSpecTargets(options);
150
+ }
151
+
152
+ module.exports = {
153
+ registerSpecGateCommand,
154
+ runSpecGate,
155
+ generateSpecGatePolicyTemplate,
156
+ _parseSpecTargets
157
+ };
@@ -0,0 +1,205 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('path');
3
+ const chalk = require('chalk');
4
+ const { runOrchestration } = require('./orchestrate');
5
+ const {
6
+ parseSpecTargets,
7
+ runMultiSpecViaOrchestrate
8
+ } = require('../spec/multi-spec-orchestrate');
9
+
10
+ const { PipelineStateStore } = require('../spec/pipeline/state-store');
11
+ const { StageRunner } = require('../spec/pipeline/stage-runner');
12
+ const { createDefaultStageAdapters } = require('../spec/pipeline/stage-adapters');
13
+
14
+ async function runSpecPipeline(options = {}, dependencies = {}) {
15
+ const projectPath = dependencies.projectPath || process.cwd();
16
+ const specTargets = parseSpecTargets(options);
17
+ if (specTargets.length === 0) {
18
+ throw new Error('Either --spec or --specs is required');
19
+ }
20
+
21
+ if (specTargets.length > 1) {
22
+ const executeOrchestration = dependencies.runOrchestration || runOrchestration;
23
+ return runMultiSpecViaOrchestrate({
24
+ specTargets,
25
+ projectPath,
26
+ commandOptions: options,
27
+ runOrchestration: executeOrchestration,
28
+ commandLabel: 'Multi-spec pipeline',
29
+ nextActionLabel: 'Multi-spec execution defaulted to orchestrate mode.'
30
+ });
31
+ }
32
+
33
+ const specId = specTargets[0];
34
+
35
+ const specPath = path.join(projectPath, '.kiro', 'specs', specId);
36
+ if (!await fs.pathExists(specPath)) {
37
+ throw new Error(`Spec not found: ${specId}`);
38
+ }
39
+
40
+ const stateStore = dependencies.stateStore || new PipelineStateStore(projectPath);
41
+ const adapters = dependencies.adapters || createDefaultStageAdapters(projectPath);
42
+ const stageRunner = dependencies.stageRunner || new StageRunner({
43
+ stateStore,
44
+ adapters
45
+ });
46
+
47
+ let state;
48
+ if (options.resume) {
49
+ state = await stateStore.loadLatest(specId);
50
+ }
51
+
52
+ if (!state) {
53
+ state = await stateStore.create(specId, {
54
+ failFast: options.failFast !== false,
55
+ continueOnWarning: !!options.continueOnWarning
56
+ });
57
+ }
58
+
59
+ const runContext = {
60
+ specId,
61
+ runId: state.run_id,
62
+ fromStage: options.fromStage,
63
+ toStage: options.toStage,
64
+ dryRun: !!options.dryRun,
65
+ resume: !!options.resume,
66
+ failFast: options.failFast !== false,
67
+ continueOnWarning: !!options.continueOnWarning,
68
+ strict: !!options.strict,
69
+ gateOut: options.gateOut,
70
+ state
71
+ };
72
+
73
+ const execution = await stageRunner.run(runContext);
74
+ await stateStore.markFinished(state, execution.status);
75
+
76
+ const result = {
77
+ spec_id: specId,
78
+ run_id: state.run_id,
79
+ status: execution.status,
80
+ stage_results: execution.stageResults,
81
+ failure: execution.failure,
82
+ next_actions: buildNextActions(execution),
83
+ state_file: path.relative(projectPath, stateStore.getRunPath(specId, state.run_id))
84
+ };
85
+
86
+ if (options.out) {
87
+ const outPath = path.isAbsolute(options.out)
88
+ ? options.out
89
+ : path.join(projectPath, options.out);
90
+ await fs.ensureDir(path.dirname(outPath));
91
+ await fs.writeJson(outPath, result, { spaces: 2 });
92
+ result.output_file = outPath;
93
+ }
94
+
95
+ if (options.json) {
96
+ console.log(JSON.stringify(result, null, 2));
97
+ } else {
98
+ printResult(result);
99
+ }
100
+
101
+ return result;
102
+ }
103
+
104
+ function registerSpecPipelineCommand(program) {
105
+ const pipeline = program
106
+ .command('spec-pipeline')
107
+ .description('Run Spec workflow pipeline (use: kse spec pipeline run)');
108
+
109
+ pipeline
110
+ .command('run')
111
+ .description('Execute pipeline stages for one or more Specs')
112
+ .option('--spec <name>', 'Single Spec identifier')
113
+ .option('--specs <names>', 'Comma-separated Spec identifiers (multi-spec defaults to orchestrate mode)')
114
+ .option('--from-stage <stage>', 'Start stage (requirements/design/tasks/gate)')
115
+ .option('--to-stage <stage>', 'End stage (requirements/design/tasks/gate)')
116
+ .option('--resume', 'Resume from latest unfinished stage state')
117
+ .option('--dry-run', 'Preview pipeline execution without writing stage outputs')
118
+ .option('--json', 'Output machine-readable JSON')
119
+ .option('--out <path>', 'Write pipeline result JSON to file')
120
+ .option('--max-parallel <n>', 'Maximum parallel agents when orchestrate mode is used', parseInt)
121
+ .option('--continue-on-warning', 'Continue when stage returns warnings')
122
+ .option('--no-fail-fast', 'Do not stop immediately on failed stage')
123
+ .option('--strict', 'Enable strict mode for downstream gate stage')
124
+ .option('--gate-out <path>', 'Output path for nested gate stage report')
125
+ .action(async options => {
126
+ try {
127
+ await runSpecPipeline(options);
128
+ } catch (error) {
129
+ if (options.json) {
130
+ console.log(JSON.stringify({ success: false, error: error.message }, null, 2));
131
+ } else {
132
+ console.error(chalk.red('❌ Spec pipeline failed:'), error.message);
133
+ }
134
+ process.exit(1);
135
+ }
136
+ });
137
+ }
138
+
139
+ function printResult(result) {
140
+ const statusColor = result.status === 'completed' ? chalk.green : chalk.red;
141
+
142
+ console.log(chalk.red('🔥') + ' Spec Workflow Pipeline');
143
+ console.log();
144
+ console.log(`${chalk.gray('Spec:')} ${result.spec_id}`);
145
+ console.log(`${chalk.gray('Run:')} ${result.run_id}`);
146
+ console.log(`${chalk.gray('Status:')} ${statusColor(result.status)}`);
147
+ console.log();
148
+
149
+ console.log(chalk.bold('Stage Results'));
150
+ result.stage_results.forEach(stage => {
151
+ const icon = stage.status === 'completed'
152
+ ? chalk.green('✓')
153
+ : stage.status === 'warning'
154
+ ? chalk.yellow('!')
155
+ : stage.status === 'skipped'
156
+ ? chalk.gray('→')
157
+ : chalk.red('✗');
158
+ console.log(` ${icon} ${stage.name}: ${stage.status}`);
159
+ });
160
+
161
+ if (result.next_actions.length > 0) {
162
+ console.log();
163
+ console.log(chalk.bold('Next Actions'));
164
+ result.next_actions.forEach(action => console.log(` - ${action}`));
165
+ }
166
+ }
167
+
168
+ function buildNextActions(execution) {
169
+ if (execution.status === 'completed') {
170
+ return ['Review pipeline output and continue implementation on completed Spec stages.'];
171
+ }
172
+
173
+ if (execution.failure && execution.failure.stage) {
174
+ return [
175
+ `Resolve failure at stage: ${execution.failure.stage}`,
176
+ 'Use --resume to continue from the last unfinished stage after remediation.'
177
+ ];
178
+ }
179
+
180
+ return ['Inspect stage_results for failure details and re-run pipeline.'];
181
+ }
182
+
183
+ async function _runPipelineInOrchestrateMode(specTargets, options, dependencies) {
184
+ const projectPath = dependencies.projectPath || process.cwd();
185
+ const executeOrchestration = dependencies.runOrchestration || runOrchestration;
186
+
187
+ return runMultiSpecViaOrchestrate({
188
+ specTargets,
189
+ projectPath,
190
+ commandOptions: options,
191
+ runOrchestration: executeOrchestration,
192
+ commandLabel: 'Multi-spec pipeline',
193
+ nextActionLabel: 'Multi-spec execution defaulted to orchestrate mode.'
194
+ });
195
+ }
196
+
197
+ function _parseSpecTargets(options = {}) {
198
+ return parseSpecTargets(options);
199
+ }
200
+
201
+ module.exports = {
202
+ registerSpecPipelineCommand,
203
+ runSpecPipeline,
204
+ _parseSpecTargets
205
+ };