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,385 @@
1
+ /**
2
+ * File Classifier
3
+ *
4
+ * Automatically classifies files for smart conflict resolution.
5
+ * Determines file categories based on path patterns to apply
6
+ * appropriate resolution strategies.
7
+ */
8
+
9
+ const path = require('path');
10
+
11
+ /**
12
+ * File categories for classification
13
+ */
14
+ const FileCategory = {
15
+ TEMPLATE: 'template', // steering/, tools/, README.md
16
+ USER_CONTENT: 'user-content', // specs/, custom files
17
+ CONFIG: 'config', // version.json, adoption-config.json
18
+ GENERATED: 'generated' // backups/, logs/, node_modules/
19
+ };
20
+
21
+ /**
22
+ * Resolution actions for each category
23
+ */
24
+ const ResolutionAction = {
25
+ PRESERVE: 'preserve', // Keep existing file
26
+ UPDATE: 'update', // Backup + update to latest
27
+ MERGE: 'merge', // Backup + merge changes
28
+ SKIP: 'skip' // Skip (regenerate if needed)
29
+ };
30
+
31
+ /**
32
+ * File Classifier
33
+ *
34
+ * Classifies files based on path patterns and applies
35
+ * appropriate resolution rules.
36
+ */
37
+ class FileClassifier {
38
+ constructor() {
39
+ // Template file patterns (relative to .kiro/)
40
+ this.templatePatterns = [
41
+ 'steering/CORE_PRINCIPLES.md',
42
+ 'steering/ENVIRONMENT.md',
43
+ 'steering/RULES_GUIDE.md',
44
+ 'tools/ultrawork_enhancer.py',
45
+ 'README.md',
46
+ 'ultrawork-application-guide.md',
47
+ 'ultrawork-integration-summary.md',
48
+ 'sisyphus-deep-dive.md'
49
+ ];
50
+
51
+ // Template directory patterns
52
+ this.templateDirs = [
53
+ 'steering',
54
+ 'tools'
55
+ ];
56
+
57
+ // User content directory patterns
58
+ this.userContentDirs = [
59
+ 'specs'
60
+ ];
61
+
62
+ // Config file patterns
63
+ this.configPatterns = [
64
+ 'version.json',
65
+ 'adoption-config.json'
66
+ ];
67
+
68
+ // Generated directory patterns
69
+ this.generatedDirs = [
70
+ 'backups',
71
+ 'logs',
72
+ 'node_modules',
73
+ '.git'
74
+ ];
75
+
76
+ // Special cases that always preserve
77
+ this.alwaysPreserve = [
78
+ 'steering/CURRENT_CONTEXT.md'
79
+ ];
80
+ }
81
+
82
+ /**
83
+ * Classify a file based on its path
84
+ *
85
+ * @param {string} filePath - File path relative to .kiro/
86
+ * @returns {string} FileCategory
87
+ */
88
+ classifyFile(filePath) {
89
+ // Normalize path separators
90
+ const normalizedPath = this.normalizePath(filePath);
91
+
92
+ // Check special cases first (always preserve)
93
+ if (this.isAlwaysPreserve(normalizedPath)) {
94
+ return FileCategory.USER_CONTENT;
95
+ }
96
+
97
+ // Check if it's a generated file/directory
98
+ if (this.isGenerated(normalizedPath)) {
99
+ return FileCategory.GENERATED;
100
+ }
101
+
102
+ // Check if it's a config file
103
+ if (this.isConfig(normalizedPath)) {
104
+ return FileCategory.CONFIG;
105
+ }
106
+
107
+ // Check if it's user content
108
+ if (this.isUserContent(normalizedPath)) {
109
+ return FileCategory.USER_CONTENT;
110
+ }
111
+
112
+ // Check if it's a template file
113
+ if (this.isTemplate(normalizedPath)) {
114
+ return FileCategory.TEMPLATE;
115
+ }
116
+
117
+ // Default: treat unknown files as user content (safer)
118
+ return FileCategory.USER_CONTENT;
119
+ }
120
+
121
+ /**
122
+ * Get resolution rule for a file
123
+ *
124
+ * @param {string} filePath - File path relative to .kiro/
125
+ * @returns {Object} Resolution rule
126
+ */
127
+ getResolutionRule(filePath) {
128
+ const category = this.classifyFile(filePath);
129
+ const normalizedPath = this.normalizePath(filePath);
130
+
131
+ // Special case: CURRENT_CONTEXT.md always preserve
132
+ if (this.isAlwaysPreserve(normalizedPath)) {
133
+ return {
134
+ category: FileCategory.USER_CONTENT,
135
+ action: ResolutionAction.PRESERVE,
136
+ requiresBackup: false,
137
+ reason: 'User-specific context file'
138
+ };
139
+ }
140
+
141
+ switch (category) {
142
+ case FileCategory.TEMPLATE:
143
+ return {
144
+ category,
145
+ action: ResolutionAction.UPDATE,
146
+ requiresBackup: true,
147
+ reason: 'Template file should be updated to latest version'
148
+ };
149
+
150
+ case FileCategory.USER_CONTENT:
151
+ return {
152
+ category,
153
+ action: ResolutionAction.PRESERVE,
154
+ requiresBackup: false,
155
+ reason: 'User content should always be preserved'
156
+ };
157
+
158
+ case FileCategory.CONFIG:
159
+ return {
160
+ category,
161
+ action: ResolutionAction.MERGE,
162
+ requiresBackup: true,
163
+ reason: 'Config file should be merged with updates'
164
+ };
165
+
166
+ case FileCategory.GENERATED:
167
+ return {
168
+ category,
169
+ action: ResolutionAction.SKIP,
170
+ requiresBackup: false,
171
+ reason: 'Generated file can be recreated'
172
+ };
173
+
174
+ default:
175
+ // Fallback: preserve unknown files
176
+ return {
177
+ category: FileCategory.USER_CONTENT,
178
+ action: ResolutionAction.PRESERVE,
179
+ requiresBackup: false,
180
+ reason: 'Unknown file type, preserving for safety'
181
+ };
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Check if file should always be preserved
187
+ *
188
+ * @param {string} normalizedPath - Normalized file path
189
+ * @returns {boolean}
190
+ */
191
+ isAlwaysPreserve(normalizedPath) {
192
+ return this.alwaysPreserve.some(pattern =>
193
+ normalizedPath === pattern || normalizedPath.endsWith('/' + pattern)
194
+ );
195
+ }
196
+
197
+ /**
198
+ * Check if file is a template
199
+ *
200
+ * @param {string} normalizedPath - Normalized file path
201
+ * @returns {boolean}
202
+ */
203
+ isTemplate(normalizedPath) {
204
+ // Check exact template file patterns
205
+ if (this.templatePatterns.some(pattern =>
206
+ normalizedPath === pattern || normalizedPath.endsWith('/' + pattern)
207
+ )) {
208
+ return true;
209
+ }
210
+
211
+ // Check if file is in a template directory
212
+ const parts = normalizedPath.split('/');
213
+ if (parts.length > 0) {
214
+ const firstDir = parts[0];
215
+ if (this.templateDirs.includes(firstDir)) {
216
+ return true;
217
+ }
218
+ }
219
+
220
+ return false;
221
+ }
222
+
223
+ /**
224
+ * Check if file is user content
225
+ *
226
+ * @param {string} normalizedPath - Normalized file path
227
+ * @returns {boolean}
228
+ */
229
+ isUserContent(normalizedPath) {
230
+ const parts = normalizedPath.split('/');
231
+ if (parts.length > 0) {
232
+ const firstDir = parts[0];
233
+ if (this.userContentDirs.includes(firstDir)) {
234
+ return true;
235
+ }
236
+ }
237
+
238
+ // Files not in any known directory are treated as user content
239
+ return false;
240
+ }
241
+
242
+ /**
243
+ * Check if file is a config file
244
+ *
245
+ * @param {string} normalizedPath - Normalized file path
246
+ * @returns {boolean}
247
+ */
248
+ isConfig(normalizedPath) {
249
+ return this.configPatterns.some(pattern =>
250
+ normalizedPath === pattern || normalizedPath.endsWith('/' + pattern)
251
+ );
252
+ }
253
+
254
+ /**
255
+ * Check if file is generated
256
+ *
257
+ * @param {string} normalizedPath - Normalized file path
258
+ * @returns {boolean}
259
+ */
260
+ isGenerated(normalizedPath) {
261
+ const parts = normalizedPath.split('/');
262
+ if (parts.length > 0) {
263
+ const firstDir = parts[0];
264
+ if (this.generatedDirs.includes(firstDir)) {
265
+ return true;
266
+ }
267
+ }
268
+
269
+ return false;
270
+ }
271
+
272
+ /**
273
+ * Normalize path separators to forward slashes
274
+ *
275
+ * @param {string} filePath - File path
276
+ * @returns {string} Normalized path
277
+ */
278
+ normalizePath(filePath) {
279
+ if (!filePath) {
280
+ return '';
281
+ }
282
+
283
+ // Convert backslashes to forward slashes
284
+ let normalized = filePath.replace(/\\/g, '/');
285
+
286
+ // Remove leading .kiro/ if present
287
+ if (normalized.startsWith('.kiro/')) {
288
+ normalized = normalized.substring(6);
289
+ }
290
+
291
+ // Remove leading slash
292
+ if (normalized.startsWith('/')) {
293
+ normalized = normalized.substring(1);
294
+ }
295
+
296
+ return normalized;
297
+ }
298
+
299
+ /**
300
+ * Classify multiple files at once
301
+ *
302
+ * @param {string[]} filePaths - Array of file paths
303
+ * @returns {Object} Map of file paths to categories
304
+ */
305
+ classifyFiles(filePaths) {
306
+ const result = {};
307
+
308
+ for (const filePath of filePaths) {
309
+ result[filePath] = this.classifyFile(filePath);
310
+ }
311
+
312
+ return result;
313
+ }
314
+
315
+ /**
316
+ * Get resolution rules for multiple files
317
+ *
318
+ * @param {string[]} filePaths - Array of file paths
319
+ * @returns {Object} Map of file paths to resolution rules
320
+ */
321
+ getResolutionRules(filePaths) {
322
+ const result = {};
323
+
324
+ for (const filePath of filePaths) {
325
+ result[filePath] = this.getResolutionRule(filePath);
326
+ }
327
+
328
+ return result;
329
+ }
330
+
331
+ /**
332
+ * Get files by category
333
+ *
334
+ * @param {string[]} filePaths - Array of file paths
335
+ * @param {string} category - FileCategory to filter by
336
+ * @returns {string[]} Files matching the category
337
+ */
338
+ getFilesByCategory(filePaths, category) {
339
+ return filePaths.filter(filePath =>
340
+ this.classifyFile(filePath) === category
341
+ );
342
+ }
343
+
344
+ /**
345
+ * Get files by action
346
+ *
347
+ * @param {string[]} filePaths - Array of file paths
348
+ * @param {string} action - ResolutionAction to filter by
349
+ * @returns {string[]} Files matching the action
350
+ */
351
+ getFilesByAction(filePaths, action) {
352
+ return filePaths.filter(filePath => {
353
+ const rule = this.getResolutionRule(filePath);
354
+ return rule.action === action;
355
+ });
356
+ }
357
+
358
+ /**
359
+ * Check if file requires backup
360
+ *
361
+ * @param {string} filePath - File path
362
+ * @returns {boolean}
363
+ */
364
+ requiresBackup(filePath) {
365
+ const rule = this.getResolutionRule(filePath);
366
+ return rule.requiresBackup;
367
+ }
368
+
369
+ /**
370
+ * Get all files that require backup
371
+ *
372
+ * @param {string[]} filePaths - Array of file paths
373
+ * @returns {string[]} Files that require backup
374
+ */
375
+ getFilesRequiringBackup(filePaths) {
376
+ return filePaths.filter(filePath => this.requiresBackup(filePath));
377
+ }
378
+ }
379
+
380
+ // Export classes and constants
381
+ module.exports = {
382
+ FileClassifier,
383
+ FileCategory,
384
+ ResolutionAction
385
+ };