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,538 @@
1
+ /**
2
+ * Adoption Strategy
3
+ *
4
+ * Implements different adoption strategies based on project state:
5
+ * - Fresh: Create complete .kiro/ structure from scratch
6
+ * - Partial: Add missing components to existing .kiro/
7
+ * - Full: Upgrade existing complete .kiro/ to current version
8
+ */
9
+
10
+ const path = require('path');
11
+ const {
12
+ pathExists,
13
+ ensureDirectory,
14
+ copyDirectory,
15
+ safeCopy,
16
+ listFiles,
17
+ readJSON,
18
+ writeJSON
19
+ } = require('../utils/fs-utils');
20
+ const VersionManager = require('../version/version-manager');
21
+
22
+ /**
23
+ * Base class for adoption strategies
24
+ */
25
+ class AdoptionStrategy {
26
+ constructor() {
27
+ this.versionManager = new VersionManager();
28
+ this.kiroDir = '.kiro';
29
+ }
30
+
31
+ /**
32
+ * Gets the path to .kiro/ directory
33
+ *
34
+ * @param {string} projectPath - Absolute path to project root
35
+ * @returns {string}
36
+ */
37
+ getKiroPath(projectPath) {
38
+ return path.join(projectPath, this.kiroDir);
39
+ }
40
+
41
+ /**
42
+ * Gets the path to template directory
43
+ * This would be embedded in the kse package
44
+ *
45
+ * @returns {string}
46
+ */
47
+ getTemplatePath() {
48
+ // Template is at template/.kiro/ in the package
49
+ return path.join(__dirname, '../../template/.kiro');
50
+ }
51
+
52
+ /**
53
+ * Executes adoption strategy
54
+ * Must be implemented by subclasses
55
+ *
56
+ * @param {string} projectPath - Absolute path to project root
57
+ * @param {AdoptionMode} mode - Adoption mode
58
+ * @param {AdoptionOptions} options - Adoption options
59
+ * @returns {Promise<AdoptionResult>}
60
+ */
61
+ async execute(projectPath, mode, options) {
62
+ throw new Error('execute() must be implemented by subclass');
63
+ }
64
+
65
+ /**
66
+ * Creates initial directory structure
67
+ *
68
+ * @param {string} kiroPath - Path to .kiro/ directory
69
+ * @returns {Promise<void>}
70
+ */
71
+ async createDirectoryStructure(kiroPath) {
72
+ await ensureDirectory(kiroPath);
73
+ await ensureDirectory(path.join(kiroPath, 'specs'));
74
+ await ensureDirectory(path.join(kiroPath, 'steering'));
75
+ await ensureDirectory(path.join(kiroPath, 'tools'));
76
+ await ensureDirectory(path.join(kiroPath, 'backups'));
77
+ await ensureDirectory(path.join(kiroPath, 'hooks'));
78
+ }
79
+
80
+ /**
81
+ * Copies template files to project
82
+ *
83
+ * @param {string} projectPath - Absolute path to project root
84
+ * @param {Object} options - Copy options
85
+ * @param {boolean} options.overwrite - Whether to overwrite existing files
86
+ * @param {string[]} options.skip - Files to skip
87
+ * @param {Object} options.resolutionMap - Map of file paths to resolutions ('keep' | 'overwrite')
88
+ * @returns {Promise<{created: string[], updated: string[], skipped: string[]}>}
89
+ */
90
+ async copyTemplateFiles(projectPath, options = {}) {
91
+ const { overwrite = false, skip = [], resolutionMap = {} } = options;
92
+ const kiroPath = this.getKiroPath(projectPath);
93
+ const templatePath = this.getTemplatePath();
94
+
95
+ const created = [];
96
+ const updated = [];
97
+ const skipped = [];
98
+
99
+ // Check if template directory exists
100
+ const templateExists = await pathExists(templatePath);
101
+ if (!templateExists) {
102
+ // Template directory doesn't exist yet - this is expected during development
103
+ // In production, templates would be bundled with the package
104
+ return { created, updated, skipped };
105
+ }
106
+
107
+ // Define template structure
108
+ const templateFiles = [
109
+ 'README.md',
110
+ 'steering/CORE_PRINCIPLES.md',
111
+ 'steering/ENVIRONMENT.md',
112
+ 'steering/CURRENT_CONTEXT.md',
113
+ 'steering/RULES_GUIDE.md',
114
+ 'specs/SPEC_WORKFLOW_GUIDE.md',
115
+ 'hooks/sync-tasks-on-edit.kiro.hook',
116
+ 'hooks/check-spec-on-create.kiro.hook',
117
+ 'hooks/run-tests-on-save.kiro.hook'
118
+ ];
119
+
120
+ for (const file of templateFiles) {
121
+ // Check if file should be skipped
122
+ if (skip.includes(file)) {
123
+ skipped.push(file);
124
+ continue;
125
+ }
126
+
127
+ // Check resolution map for this file
128
+ if (resolutionMap[file]) {
129
+ if (resolutionMap[file] === 'keep') {
130
+ skipped.push(file);
131
+ continue;
132
+ }
133
+ // If 'overwrite', proceed with copying
134
+ }
135
+
136
+ const sourcePath = path.join(templatePath, file);
137
+ const destPath = path.join(kiroPath, file);
138
+
139
+ // Check if source exists
140
+ const sourceExists = await pathExists(sourcePath);
141
+ if (!sourceExists) {
142
+ skipped.push(file);
143
+ continue;
144
+ }
145
+
146
+ // Check if destination exists
147
+ const destExists = await pathExists(destPath);
148
+
149
+ // Determine if we should overwrite
150
+ let shouldOverwrite = overwrite;
151
+ if (resolutionMap[file] === 'overwrite') {
152
+ shouldOverwrite = true;
153
+ }
154
+
155
+ if (destExists && !shouldOverwrite) {
156
+ skipped.push(file);
157
+ continue;
158
+ }
159
+
160
+ try {
161
+ await safeCopy(sourcePath, destPath, { overwrite: shouldOverwrite });
162
+
163
+ if (destExists) {
164
+ updated.push(file);
165
+ } else {
166
+ created.push(file);
167
+ }
168
+ } catch (error) {
169
+ // If copy fails, add to skipped
170
+ skipped.push(file);
171
+ }
172
+ }
173
+
174
+ return { created, updated, skipped };
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Fresh Adoption Strategy
180
+ * Creates complete .kiro/ structure from scratch
181
+ */
182
+ class FreshAdoption extends AdoptionStrategy {
183
+ /**
184
+ * Executes fresh adoption
185
+ *
186
+ * @param {string} projectPath - Absolute path to project root
187
+ * @param {AdoptionMode} mode - Should be 'fresh'
188
+ * @param {AdoptionOptions} options - Adoption options
189
+ * @returns {Promise<AdoptionResult>}
190
+ */
191
+ async execute(projectPath, mode, options = {}) {
192
+ const { kseVersion = '1.0.0', dryRun = false } = options;
193
+
194
+ const filesCreated = [];
195
+ const filesUpdated = [];
196
+ const filesSkipped = [];
197
+ const errors = [];
198
+ const warnings = [];
199
+
200
+ try {
201
+ const kiroPath = this.getKiroPath(projectPath);
202
+
203
+ // Check if .kiro/ already exists
204
+ const kiroExists = await pathExists(kiroPath);
205
+ if (kiroExists) {
206
+ throw new Error('.kiro/ directory already exists - use partial or full adoption');
207
+ }
208
+
209
+ if (dryRun) {
210
+ return {
211
+ success: true,
212
+ mode: 'fresh',
213
+ filesCreated: ['(dry-run) .kiro/ structure would be created'],
214
+ filesUpdated: [],
215
+ filesSkipped: [],
216
+ backupId: null,
217
+ errors: [],
218
+ warnings: []
219
+ };
220
+ }
221
+
222
+ // Create directory structure
223
+ await this.createDirectoryStructure(kiroPath);
224
+ filesCreated.push('.kiro/');
225
+ filesCreated.push('.kiro/specs/');
226
+ filesCreated.push('.kiro/steering/');
227
+ filesCreated.push('.kiro/tools/');
228
+ filesCreated.push('.kiro/backups/');
229
+ filesCreated.push('.kiro/hooks/');
230
+
231
+ // Copy template files
232
+ const copyResult = await this.copyTemplateFiles(projectPath, { overwrite: false });
233
+ filesCreated.push(...copyResult.created);
234
+ filesUpdated.push(...copyResult.updated);
235
+ filesSkipped.push(...copyResult.skipped);
236
+
237
+ // Create version.json
238
+ const versionInfo = this.versionManager.createVersionInfo(kseVersion);
239
+ await this.versionManager.writeVersion(projectPath, versionInfo);
240
+ filesCreated.push('version.json');
241
+
242
+ return {
243
+ success: true,
244
+ mode: 'fresh',
245
+ filesCreated,
246
+ filesUpdated,
247
+ filesSkipped,
248
+ backupId: null,
249
+ errors,
250
+ warnings
251
+ };
252
+ } catch (error) {
253
+ errors.push(error.message);
254
+ return {
255
+ success: false,
256
+ mode: 'fresh',
257
+ filesCreated,
258
+ filesUpdated,
259
+ filesSkipped,
260
+ backupId: null,
261
+ errors,
262
+ warnings
263
+ };
264
+ }
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Partial Adoption Strategy
270
+ * Adds missing components to existing .kiro/
271
+ */
272
+ class PartialAdoption extends AdoptionStrategy {
273
+ /**
274
+ * Executes partial adoption
275
+ *
276
+ * @param {string} projectPath - Absolute path to project root
277
+ * @param {AdoptionMode} mode - Should be 'partial'
278
+ * @param {AdoptionOptions} options - Adoption options
279
+ * @returns {Promise<AdoptionResult>}
280
+ */
281
+ async execute(projectPath, mode, options = {}) {
282
+ const { kseVersion = '1.0.0', dryRun = false, backupId = null, force = false, resolutionMap = {} } = options;
283
+
284
+ const filesCreated = [];
285
+ const filesUpdated = [];
286
+ const filesSkipped = [];
287
+ const errors = [];
288
+ const warnings = [];
289
+
290
+ try {
291
+ const kiroPath = this.getKiroPath(projectPath);
292
+
293
+ // Check if .kiro/ exists
294
+ const kiroExists = await pathExists(kiroPath);
295
+ if (!kiroExists) {
296
+ throw new Error('.kiro/ directory does not exist - use fresh adoption');
297
+ }
298
+
299
+ // Check if version.json exists
300
+ const versionPath = path.join(kiroPath, 'version.json');
301
+ const versionExists = await pathExists(versionPath);
302
+ if (versionExists) {
303
+ warnings.push('version.json already exists - use full adoption for upgrades');
304
+ }
305
+
306
+ if (dryRun) {
307
+ return {
308
+ success: true,
309
+ mode: 'partial',
310
+ filesCreated: ['(dry-run) Missing components would be added'],
311
+ filesUpdated: [],
312
+ filesSkipped: [],
313
+ backupId,
314
+ errors: [],
315
+ warnings
316
+ };
317
+ }
318
+
319
+ // Ensure all required directories exist
320
+ const specsPath = path.join(kiroPath, 'specs');
321
+ const steeringPath = path.join(kiroPath, 'steering');
322
+ const toolsPath = path.join(kiroPath, 'tools');
323
+ const backupsPath = path.join(kiroPath, 'backups');
324
+ const hooksPath = path.join(kiroPath, 'hooks');
325
+
326
+ if (!await pathExists(specsPath)) {
327
+ await ensureDirectory(specsPath);
328
+ filesCreated.push('specs/');
329
+ }
330
+
331
+ if (!await pathExists(steeringPath)) {
332
+ await ensureDirectory(steeringPath);
333
+ filesCreated.push('steering/');
334
+ }
335
+
336
+ if (!await pathExists(toolsPath)) {
337
+ await ensureDirectory(toolsPath);
338
+ filesCreated.push('tools/');
339
+ }
340
+
341
+ if (!await pathExists(backupsPath)) {
342
+ await ensureDirectory(backupsPath);
343
+ filesCreated.push('backups/');
344
+ }
345
+
346
+ if (!await pathExists(hooksPath)) {
347
+ await ensureDirectory(hooksPath);
348
+ filesCreated.push('hooks/');
349
+ }
350
+
351
+ // Copy template files (overwrite if force is enabled)
352
+ const copyResult = await this.copyTemplateFiles(projectPath, { overwrite: force, resolutionMap });
353
+ filesCreated.push(...copyResult.created);
354
+ filesUpdated.push(...copyResult.updated);
355
+ filesSkipped.push(...copyResult.skipped);
356
+
357
+ // Create or update version.json
358
+ if (!versionExists) {
359
+ const versionInfo = this.versionManager.createVersionInfo(kseVersion);
360
+ await this.versionManager.writeVersion(projectPath, versionInfo);
361
+ filesCreated.push('version.json');
362
+ } else {
363
+ // Update existing version.json
364
+ const versionInfo = await this.versionManager.readVersion(projectPath);
365
+ if (versionInfo) {
366
+ versionInfo['kse-version'] = kseVersion;
367
+ versionInfo['template-version'] = kseVersion;
368
+ versionInfo['last-upgraded'] = new Date().toISOString();
369
+ await this.versionManager.writeVersion(projectPath, versionInfo);
370
+ filesUpdated.push('version.json');
371
+ }
372
+ }
373
+
374
+ return {
375
+ success: true,
376
+ mode: 'partial',
377
+ filesCreated,
378
+ filesUpdated,
379
+ filesSkipped,
380
+ backupId,
381
+ errors,
382
+ warnings
383
+ };
384
+ } catch (error) {
385
+ errors.push(error.message);
386
+ return {
387
+ success: false,
388
+ mode: 'partial',
389
+ filesCreated,
390
+ filesUpdated,
391
+ filesSkipped,
392
+ backupId,
393
+ errors,
394
+ warnings
395
+ };
396
+ }
397
+ }
398
+ }
399
+
400
+ /**
401
+ * Full Adoption Strategy
402
+ * Upgrades existing complete .kiro/ to current version
403
+ */
404
+ class FullAdoption extends AdoptionStrategy {
405
+ /**
406
+ * Executes full adoption (upgrade)
407
+ *
408
+ * @param {string} projectPath - Absolute path to project root
409
+ * @param {AdoptionMode} mode - Should be 'full'
410
+ * @param {AdoptionOptions} options - Adoption options
411
+ * @returns {Promise<AdoptionResult>}
412
+ */
413
+ async execute(projectPath, mode, options = {}) {
414
+ const { kseVersion = '1.0.0', dryRun = false, backupId = null } = options;
415
+
416
+ const filesCreated = [];
417
+ const filesUpdated = [];
418
+ const filesSkipped = [];
419
+ const errors = [];
420
+ const warnings = [];
421
+
422
+ try {
423
+ const kiroPath = this.getKiroPath(projectPath);
424
+
425
+ // Check if .kiro/ exists
426
+ const kiroExists = await pathExists(kiroPath);
427
+ if (!kiroExists) {
428
+ throw new Error('.kiro/ directory does not exist - use fresh adoption');
429
+ }
430
+
431
+ // Read existing version
432
+ const existingVersion = await this.versionManager.readVersion(projectPath);
433
+ if (!existingVersion) {
434
+ throw new Error('version.json not found - use partial adoption');
435
+ }
436
+
437
+ const currentVersion = existingVersion['kse-version'];
438
+
439
+ // Check if upgrade is needed
440
+ if (!this.versionManager.needsUpgrade(currentVersion, kseVersion)) {
441
+ warnings.push(`Already at version ${kseVersion} - no upgrade needed`);
442
+ return {
443
+ success: true,
444
+ mode: 'full',
445
+ filesCreated: [],
446
+ filesUpdated: [],
447
+ filesSkipped: [],
448
+ backupId,
449
+ errors: [],
450
+ warnings
451
+ };
452
+ }
453
+
454
+ if (dryRun) {
455
+ return {
456
+ success: true,
457
+ mode: 'full',
458
+ filesCreated: [],
459
+ filesUpdated: [`(dry-run) Would upgrade from ${currentVersion} to ${kseVersion}`],
460
+ filesSkipped: [],
461
+ backupId,
462
+ errors: [],
463
+ warnings
464
+ };
465
+ }
466
+
467
+ // Copy template files (overwrite template files, preserve user content)
468
+ // User content is in specs/ and any custom files
469
+ const copyResult = await this.copyTemplateFiles(projectPath, {
470
+ overwrite: true,
471
+ skip: [] // Don't skip anything - we want to update templates
472
+ });
473
+ filesCreated.push(...copyResult.created);
474
+ filesUpdated.push(...copyResult.updated);
475
+ filesSkipped.push(...copyResult.skipped);
476
+
477
+ // Update version.json with upgrade history
478
+ const updatedVersion = this.versionManager.addUpgradeHistory(
479
+ existingVersion,
480
+ currentVersion,
481
+ kseVersion,
482
+ true
483
+ );
484
+ await this.versionManager.writeVersion(projectPath, updatedVersion);
485
+ filesUpdated.push('version.json');
486
+
487
+ return {
488
+ success: true,
489
+ mode: 'full',
490
+ filesCreated,
491
+ filesUpdated,
492
+ filesSkipped,
493
+ backupId,
494
+ errors,
495
+ warnings
496
+ };
497
+ } catch (error) {
498
+ errors.push(error.message);
499
+ return {
500
+ success: false,
501
+ mode: 'full',
502
+ filesCreated,
503
+ filesUpdated,
504
+ filesSkipped,
505
+ backupId,
506
+ errors,
507
+ warnings
508
+ };
509
+ }
510
+ }
511
+ }
512
+
513
+ /**
514
+ * Factory function to get the appropriate strategy
515
+ *
516
+ * @param {AdoptionMode} mode - Adoption mode ('fresh', 'partial', 'full')
517
+ * @returns {AdoptionStrategy}
518
+ */
519
+ function getAdoptionStrategy(mode) {
520
+ switch (mode) {
521
+ case 'fresh':
522
+ return new FreshAdoption();
523
+ case 'partial':
524
+ return new PartialAdoption();
525
+ case 'full':
526
+ return new FullAdoption();
527
+ default:
528
+ throw new Error(`Unknown adoption mode: ${mode}`);
529
+ }
530
+ }
531
+
532
+ module.exports = {
533
+ AdoptionStrategy,
534
+ FreshAdoption,
535
+ PartialAdoption,
536
+ FullAdoption,
537
+ getAdoptionStrategy
538
+ };