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,654 @@
1
+ /**
2
+ * Templates Command
3
+ *
4
+ * Manages Spec templates from official and custom sources
5
+ */
6
+
7
+ const chalk = require('chalk');
8
+ const path = require('path');
9
+ const fs = require('fs-extra');
10
+ const TemplateManager = require('../templates/template-manager');
11
+ const { TemplateError } = require('../templates/template-error');
12
+
13
+ /**
14
+ * Format template list for display
15
+ *
16
+ * @param {Array} templates - Template entries
17
+ * @param {Object} options - Display options
18
+ * @returns {void}
19
+ */
20
+ function displayTemplateList(templates, options = {}) {
21
+ const { source = null, category = null } = options;
22
+
23
+ if (templates.length === 0) {
24
+ console.log(chalk.yellow('No templates found'));
25
+
26
+ if (source || category) {
27
+ console.log(chalk.gray('Try removing filters or updating templates'));
28
+ } else {
29
+ console.log(chalk.gray('Run'), chalk.cyan('kse templates update'), chalk.gray('to download templates'));
30
+ }
31
+
32
+ return;
33
+ }
34
+
35
+ // Group by category
36
+ const byCategory = {};
37
+ templates.forEach(template => {
38
+ const cat = template.category || 'uncategorized';
39
+ if (!byCategory[cat]) {
40
+ byCategory[cat] = [];
41
+ }
42
+ byCategory[cat].push(template);
43
+ });
44
+
45
+ // Display each category
46
+ Object.keys(byCategory).sort().forEach(cat => {
47
+ console.log();
48
+ console.log(chalk.blue.bold(`${cat}`));
49
+ console.log();
50
+
51
+ byCategory[cat].forEach(template => {
52
+ const difficultyColor = {
53
+ 'beginner': chalk.green,
54
+ 'intermediate': chalk.yellow,
55
+ 'advanced': chalk.red
56
+ }[template.difficulty] || chalk.gray;
57
+
58
+ const sourcePrefix = template.source && template.source !== 'official'
59
+ ? chalk.gray(`[${template.source}] `)
60
+ : '';
61
+
62
+ console.log(` ${sourcePrefix}${chalk.cyan(template.id)}`);
63
+ console.log(` ${template.name}`);
64
+ console.log(` ${chalk.gray(template.description)}`);
65
+ console.log(` ${difficultyColor(template.difficulty)} • ${chalk.gray(template.tags.join(', '))}`);
66
+ console.log();
67
+ });
68
+ });
69
+
70
+ console.log(chalk.gray(`Total: ${templates.length} template(s)`));
71
+ }
72
+
73
+ /**
74
+ * Format template details for display
75
+ *
76
+ * @param {Object} template - Template entry
77
+ * @returns {void}
78
+ */
79
+ function displayTemplateDetails(template) {
80
+ console.log();
81
+ console.log(chalk.blue.bold(template.name));
82
+ console.log();
83
+
84
+ console.log(chalk.gray('ID:'), chalk.cyan(template.id));
85
+ console.log(chalk.gray('Category:'), template.category);
86
+
87
+ const difficultyColor = {
88
+ 'beginner': chalk.green,
89
+ 'intermediate': chalk.yellow,
90
+ 'advanced': chalk.red
91
+ }[template.difficulty] || chalk.gray;
92
+
93
+ console.log(chalk.gray('Difficulty:'), difficultyColor(template.difficulty));
94
+
95
+ if (template.source) {
96
+ console.log(chalk.gray('Source:'), template.source);
97
+ }
98
+
99
+ console.log();
100
+ console.log(chalk.gray('Description:'));
101
+ console.log(` ${template.description}`);
102
+ console.log();
103
+
104
+ if (template.tags && template.tags.length > 0) {
105
+ console.log(chalk.gray('Tags:'), template.tags.join(', '));
106
+ console.log();
107
+ }
108
+
109
+ if (template.applicable_scenarios && template.applicable_scenarios.length > 0) {
110
+ console.log(chalk.gray('Applicable Scenarios:'));
111
+ template.applicable_scenarios.forEach(scenario => {
112
+ console.log(` • ${scenario}`);
113
+ });
114
+ console.log();
115
+ }
116
+
117
+ if (template.files && template.files.length > 0) {
118
+ console.log(chalk.gray('Files:'));
119
+ template.files.forEach(file => {
120
+ console.log(` • ${file}`);
121
+ });
122
+ console.log();
123
+ }
124
+
125
+ if (template.author) {
126
+ console.log(chalk.gray('Author:'), template.author);
127
+ }
128
+
129
+ if (template.created_at) {
130
+ console.log(chalk.gray('Created:'), template.created_at);
131
+ }
132
+
133
+ if (template.updated_at) {
134
+ console.log(chalk.gray('Updated:'), template.updated_at);
135
+ }
136
+
137
+ console.log();
138
+ console.log(chalk.blue('Usage:'));
139
+ console.log(` ${chalk.cyan(`kse spec create my-feature --template ${template.id}`)}`);
140
+ console.log();
141
+ }
142
+
143
+ /**
144
+ * List templates command
145
+ *
146
+ * @param {Object} options - Command options
147
+ * @returns {Promise<void>}
148
+ */
149
+ async function listTemplates(options = {}) {
150
+ const { category = null, source = null } = options;
151
+
152
+ console.log(chalk.red('🔥') + ' Spec Templates');
153
+
154
+ try {
155
+ const manager = new TemplateManager();
156
+ const templates = await manager.listTemplates({ category, source });
157
+
158
+ displayTemplateList(templates, { category, source });
159
+
160
+ } catch (error) {
161
+ console.log();
162
+ console.log(chalk.red('❌ Error:'), error.message);
163
+
164
+ if (error instanceof TemplateError) {
165
+ if (error.suggestions && error.suggestions.length > 0) {
166
+ console.log();
167
+ console.log(chalk.yellow('💡 Suggestions:'));
168
+ error.suggestions.forEach(suggestion => {
169
+ console.log(` • ${suggestion}`);
170
+ });
171
+ }
172
+ }
173
+
174
+ process.exit(1);
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Search templates command
180
+ *
181
+ * @param {string} keyword - Search keyword
182
+ * @param {Object} options - Command options
183
+ * @returns {Promise<void>}
184
+ */
185
+ async function searchTemplates(keyword, options = {}) {
186
+ const { category = null } = options;
187
+
188
+ console.log(chalk.red('🔥') + ` Searching templates for: ${chalk.cyan(keyword)}`);
189
+
190
+ try {
191
+ const manager = new TemplateManager();
192
+ const templates = await manager.searchTemplates(keyword, { category });
193
+
194
+ displayTemplateList(templates, { category });
195
+
196
+ } catch (error) {
197
+ console.log();
198
+ console.log(chalk.red('❌ Error:'), error.message);
199
+
200
+ if (error instanceof TemplateError && error.suggestions) {
201
+ console.log();
202
+ console.log(chalk.yellow('💡 Suggestions:'));
203
+ error.suggestions.forEach(suggestion => {
204
+ console.log(` • ${suggestion}`);
205
+ });
206
+ }
207
+
208
+ process.exit(1);
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Show template details command
214
+ *
215
+ * @param {string} templatePath - Template path (e.g., "web-features/rest-api")
216
+ * @returns {Promise<void>}
217
+ */
218
+ async function showTemplate(templatePath) {
219
+ console.log(chalk.red('🔥') + ' Template Details');
220
+
221
+ try {
222
+ const manager = new TemplateManager();
223
+ const template = await manager.showTemplate(templatePath);
224
+
225
+ displayTemplateDetails(template);
226
+
227
+ } catch (error) {
228
+ console.log();
229
+ console.log(chalk.red('❌ Error:'), error.message);
230
+
231
+ if (error instanceof TemplateError && error.suggestions) {
232
+ console.log();
233
+ console.log(chalk.yellow('💡 Suggestions:'));
234
+ error.suggestions.forEach(suggestion => {
235
+ console.log(` • ${suggestion}`);
236
+ });
237
+ }
238
+
239
+ process.exit(1);
240
+ }
241
+ }
242
+
243
+ /**
244
+ * Update templates command
245
+ *
246
+ * @param {Object} options - Command options
247
+ * @returns {Promise<void>}
248
+ */
249
+ async function updateTemplates(options = {}) {
250
+ const { source = null, version = null } = options;
251
+
252
+ const targetDesc = source
253
+ ? `source "${source}"`
254
+ : 'all sources';
255
+
256
+ console.log(chalk.red('🔥') + ` Updating templates from ${targetDesc}...`);
257
+ console.log();
258
+
259
+ try {
260
+ const manager = new TemplateManager();
261
+ const result = await manager.updateTemplates(source, version);
262
+
263
+ console.log(chalk.green('✅ Update complete!'));
264
+ console.log();
265
+
266
+ if (result.changes) {
267
+ const { added, modified, deleted } = result.changes;
268
+
269
+ if (added > 0) {
270
+ console.log(chalk.green(` Added: ${added} template(s)`));
271
+ }
272
+
273
+ if (modified > 0) {
274
+ console.log(chalk.yellow(` Modified: ${modified} template(s)`));
275
+ }
276
+
277
+ if (deleted > 0) {
278
+ console.log(chalk.red(` Deleted: ${deleted} template(s)`));
279
+ }
280
+
281
+ if (added === 0 && modified === 0 && deleted === 0) {
282
+ console.log(chalk.gray(' No changes detected'));
283
+ }
284
+ }
285
+
286
+ console.log();
287
+ console.log(chalk.blue('💡 Next steps:'));
288
+ console.log(` ${chalk.cyan('kse templates list')} - View all templates`);
289
+ console.log(` ${chalk.cyan('kse templates search <keyword>')} - Search templates`);
290
+
291
+ } catch (error) {
292
+ console.log();
293
+ console.log(chalk.red('❌ Error:'), error.message);
294
+
295
+ if (error instanceof TemplateError && error.suggestions) {
296
+ console.log();
297
+ console.log(chalk.yellow('💡 Suggestions:'));
298
+ error.suggestions.forEach(suggestion => {
299
+ console.log(` • ${suggestion}`);
300
+ });
301
+ }
302
+
303
+ process.exit(1);
304
+ }
305
+ }
306
+
307
+ /**
308
+ * Add template source command
309
+ *
310
+ * @param {string} name - Source name
311
+ * @param {string} gitUrl - Git repository URL
312
+ * @returns {Promise<void>}
313
+ */
314
+ async function addSource(name, gitUrl) {
315
+ console.log(chalk.red('🔥') + ` Adding template source: ${chalk.cyan(name)}`);
316
+ console.log();
317
+
318
+ try {
319
+ const manager = new TemplateManager();
320
+ await manager.addSource(name, gitUrl);
321
+
322
+ console.log(chalk.green('✅ Source added successfully!'));
323
+ console.log();
324
+ console.log(chalk.blue('💡 Next steps:'));
325
+ console.log(` ${chalk.cyan('kse templates update --source ' + name)} - Download templates from this source`);
326
+ console.log(` ${chalk.cyan('kse templates list --source ' + name)} - View templates from this source`);
327
+
328
+ } catch (error) {
329
+ console.log();
330
+ console.log(chalk.red('❌ Error:'), error.message);
331
+
332
+ if (error instanceof TemplateError && error.suggestions) {
333
+ console.log();
334
+ console.log(chalk.yellow('💡 Suggestions:'));
335
+ error.suggestions.forEach(suggestion => {
336
+ console.log(` • ${suggestion}`);
337
+ });
338
+ }
339
+
340
+ process.exit(1);
341
+ }
342
+ }
343
+
344
+ /**
345
+ * Remove template source command
346
+ *
347
+ * @param {string} name - Source name
348
+ * @returns {Promise<void>}
349
+ */
350
+ async function removeSource(name) {
351
+ console.log(chalk.red('🔥') + ` Removing template source: ${chalk.cyan(name)}`);
352
+ console.log();
353
+
354
+ try {
355
+ const manager = new TemplateManager();
356
+ await manager.removeSource(name);
357
+
358
+ console.log(chalk.green('✅ Source removed successfully!'));
359
+ console.log();
360
+ console.log(chalk.gray('Note: Cached templates from this source are still available'));
361
+ console.log(chalk.gray('Run'), chalk.cyan('kse templates cache --clear --source ' + name), chalk.gray('to remove them'));
362
+
363
+ } catch (error) {
364
+ console.log();
365
+ console.log(chalk.red('❌ Error:'), error.message);
366
+
367
+ if (error instanceof TemplateError && error.suggestions) {
368
+ console.log();
369
+ console.log(chalk.yellow('💡 Suggestions:'));
370
+ error.suggestions.forEach(suggestion => {
371
+ console.log(` • ${suggestion}`);
372
+ });
373
+ }
374
+
375
+ process.exit(1);
376
+ }
377
+ }
378
+
379
+ /**
380
+ * List template sources command
381
+ *
382
+ * @returns {Promise<void>}
383
+ */
384
+ async function listSources() {
385
+ console.log(chalk.red('🔥') + ' Template Sources');
386
+ console.log();
387
+
388
+ try {
389
+ const manager = new TemplateManager();
390
+ const sources = await manager.listSources();
391
+
392
+ if (sources.length === 0) {
393
+ console.log(chalk.yellow('No template sources configured'));
394
+ console.log();
395
+ console.log(chalk.gray('Add a source:'), chalk.cyan('kse templates add-source <name> <git-url>'));
396
+ return;
397
+ }
398
+
399
+ sources.forEach(source => {
400
+ const typeLabel = source.type === 'official'
401
+ ? chalk.blue('[Official]')
402
+ : chalk.gray('[Custom]');
403
+
404
+ const statusLabel = source.enabled
405
+ ? chalk.green('✓ Enabled')
406
+ : chalk.gray('✗ Disabled');
407
+
408
+ console.log(`${typeLabel} ${chalk.cyan(source.name)}`);
409
+ console.log(` URL: ${source.url}`);
410
+ console.log(` Status: ${statusLabel}`);
411
+
412
+ if (source.last_updated) {
413
+ console.log(` Last Updated: ${new Date(source.last_updated).toLocaleString()}`);
414
+ }
415
+
416
+ if (source.version) {
417
+ console.log(` Version: ${source.version}`);
418
+ }
419
+
420
+ console.log();
421
+ });
422
+
423
+ console.log(chalk.blue('💡 Commands:'));
424
+ console.log(` ${chalk.cyan('kse templates update')} - Update all sources`);
425
+ console.log(` ${chalk.cyan('kse templates add-source <name> <url>')} - Add custom source`);
426
+ console.log(` ${chalk.cyan('kse templates remove-source <name>')} - Remove source`);
427
+
428
+ } catch (error) {
429
+ console.log();
430
+ console.log(chalk.red('❌ Error:'), error.message);
431
+
432
+ if (error instanceof TemplateError && error.suggestions) {
433
+ console.log();
434
+ console.log(chalk.yellow('💡 Suggestions:'));
435
+ error.suggestions.forEach(suggestion => {
436
+ console.log(` • ${suggestion}`);
437
+ });
438
+ }
439
+
440
+ process.exit(1);
441
+ }
442
+ }
443
+
444
+ /**
445
+ * Cache management command
446
+ *
447
+ * @param {Object} options - Command options
448
+ * @returns {Promise<void>}
449
+ */
450
+ async function cacheCommand(options = {}) {
451
+ const { clear = false, source = null } = options;
452
+
453
+ console.log(chalk.red('🔥') + ' Template Cache');
454
+ console.log();
455
+
456
+ try {
457
+ const manager = new TemplateManager();
458
+
459
+ if (clear) {
460
+ // Clear cache
461
+ const targetDesc = source
462
+ ? `source "${source}"`
463
+ : 'all sources';
464
+
465
+ console.log(chalk.yellow(`Clearing cache for ${targetDesc}...`));
466
+ console.log();
467
+
468
+ await manager.clearCache(source);
469
+
470
+ console.log(chalk.green('✅ Cache cleared successfully!'));
471
+ console.log();
472
+ console.log(chalk.gray('Run'), chalk.cyan('kse templates update'), chalk.gray('to re-download templates'));
473
+
474
+ } else {
475
+ // Show cache status
476
+ const status = await manager.getCacheStatus();
477
+
478
+ if (!status || Object.keys(status.sources || {}).length === 0) {
479
+ console.log(chalk.yellow('Cache is empty'));
480
+ console.log();
481
+ console.log(chalk.gray('Run'), chalk.cyan('kse templates update'), chalk.gray('to download templates'));
482
+ return;
483
+ }
484
+
485
+ console.log(chalk.blue('Cache Status:'));
486
+ console.log();
487
+
488
+ Object.entries(status.sources).forEach(([sourceName, sourceInfo]) => {
489
+ console.log(chalk.cyan(sourceName));
490
+ console.log(` Templates: ${sourceInfo.template_count}`);
491
+ console.log(` Size: ${formatBytes(sourceInfo.size_bytes)}`);
492
+ console.log(` Last Updated: ${new Date(sourceInfo.last_updated).toLocaleString()}`);
493
+
494
+ if (sourceInfo.version) {
495
+ console.log(` Version: ${sourceInfo.version}`);
496
+ }
497
+
498
+ console.log();
499
+ });
500
+
501
+ if (status.last_check) {
502
+ console.log(chalk.gray(`Last Check: ${new Date(status.last_check).toLocaleString()}`));
503
+ console.log();
504
+ }
505
+
506
+ console.log(chalk.blue('💡 Commands:'));
507
+ console.log(` ${chalk.cyan('kse templates cache --clear')} - Clear all cache`);
508
+ console.log(` ${chalk.cyan('kse templates cache --clear --source <name>')} - Clear specific source`);
509
+ console.log(` ${chalk.cyan('kse templates update')} - Update cached templates`);
510
+ }
511
+
512
+ } catch (error) {
513
+ console.log();
514
+ console.log(chalk.red('❌ Error:'), error.message);
515
+
516
+ if (error instanceof TemplateError && error.suggestions) {
517
+ console.log();
518
+ console.log(chalk.yellow('💡 Suggestions:'));
519
+ error.suggestions.forEach(suggestion => {
520
+ console.log(` • ${suggestion}`);
521
+ });
522
+ }
523
+
524
+ process.exit(1);
525
+ }
526
+ }
527
+
528
+ /**
529
+ * Format bytes to human-readable string
530
+ *
531
+ * @param {number} bytes - Bytes
532
+ * @returns {string} Formatted string
533
+ */
534
+ function formatBytes(bytes) {
535
+ if (bytes === 0) return '0 B';
536
+
537
+ const k = 1024;
538
+ const sizes = ['B', 'KB', 'MB', 'GB'];
539
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
540
+
541
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
542
+ }
543
+
544
+ /**
545
+ * Display template guide
546
+ *
547
+ * @returns {Promise<void>}
548
+ */
549
+ async function displayGuide() {
550
+ console.log(chalk.red('🔥') + ' Spec Template Guide');
551
+ console.log();
552
+
553
+ console.log(chalk.blue.bold('What are Spec Templates?'));
554
+ console.log();
555
+ console.log('Spec templates are pre-built frameworks for common feature types.');
556
+ console.log('They provide structured requirements, design patterns, and task lists');
557
+ console.log('to help you get started quickly with best practices.');
558
+ console.log();
559
+
560
+ console.log(chalk.blue.bold('Quick Start:'));
561
+ console.log();
562
+ console.log(`1. ${chalk.cyan('kse templates list')} - Browse available templates`);
563
+ console.log(`2. ${chalk.cyan('kse templates show <template-id>')} - View template details`);
564
+ console.log(`3. ${chalk.cyan('kse spec create my-feature --template <template-id>')} - Create spec from template`);
565
+ console.log();
566
+
567
+ console.log(chalk.blue.bold('Common Commands:'));
568
+ console.log();
569
+ console.log(` ${chalk.cyan('kse templates list')} - List all templates`);
570
+ console.log(` ${chalk.cyan('kse templates search <keyword>')} - Search templates`);
571
+ console.log(` ${chalk.cyan('kse templates update')} - Update template library`);
572
+ console.log(` ${chalk.cyan('kse templates sources')} - Manage template sources`);
573
+ console.log(` ${chalk.cyan('kse templates cache')} - View cache status`);
574
+ console.log();
575
+
576
+ console.log(chalk.blue.bold('Custom Sources:'));
577
+ console.log();
578
+ console.log('You can add your own template repositories:');
579
+ console.log(` ${chalk.cyan('kse templates add-source my-templates https://github.com/user/templates.git')}`);
580
+ console.log();
581
+
582
+ console.log(chalk.blue.bold('Documentation:'));
583
+ console.log();
584
+ console.log('For more information, see:');
585
+ console.log(` ${chalk.gray('docs/spec-workflow.md')}`);
586
+ console.log(` ${chalk.gray('https://github.com/heguangyong/scene-capability-engine')}`);
587
+ console.log();
588
+ }
589
+
590
+ /**
591
+ * Create template from existing Spec command
592
+ *
593
+ * @param {Object} options - Command options
594
+ * @returns {Promise<void>}
595
+ */
596
+ async function createFromSpec(options = {}) {
597
+ const {
598
+ spec,
599
+ output = null,
600
+ preview = false,
601
+ dryRun = false,
602
+ interactive = true
603
+ } = options;
604
+
605
+ if (!spec) {
606
+ console.log(chalk.red('❌ Error: Spec identifier is required'));
607
+ console.log();
608
+ console.log(chalk.gray('Usage:'), chalk.cyan('kse templates create-from-spec --spec <identifier>'));
609
+ console.log();
610
+ console.log(chalk.gray('Example:'), chalk.cyan('kse templates create-from-spec --spec 22-00'));
611
+ process.exit(1);
612
+ }
613
+
614
+ try {
615
+ const TemplateCreator = require('../templates/template-creator');
616
+ const creator = new TemplateCreator({ interactive });
617
+
618
+ const result = await creator.createTemplate({
619
+ spec,
620
+ output,
621
+ preview,
622
+ dryRun,
623
+ interactive
624
+ });
625
+
626
+ if (!result.dryRun) {
627
+ console.log(chalk.green('✅ Template created successfully!'));
628
+ }
629
+
630
+ } catch (error) {
631
+ console.log();
632
+ console.log(chalk.red('❌ Error:'), error.message);
633
+
634
+ if (error.stack && process.env.DEBUG) {
635
+ console.log();
636
+ console.log(chalk.gray(error.stack));
637
+ }
638
+
639
+ process.exit(1);
640
+ }
641
+ }
642
+
643
+ module.exports = {
644
+ listTemplates,
645
+ searchTemplates,
646
+ showTemplate,
647
+ updateTemplates,
648
+ addSource,
649
+ removeSource,
650
+ listSources,
651
+ cacheCommand,
652
+ displayGuide,
653
+ createFromSpec
654
+ };