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,267 @@
1
+ /**
2
+ * GitignoreIntegration - Integrates .gitignore auto-fix with adopt/upgrade flows
3
+ *
4
+ * Coordinates detection, backup, transformation, and reporting for .gitignore fixes.
5
+ */
6
+
7
+ const fs = require('fs-extra');
8
+ const path = require('path');
9
+ const chalk = require('chalk');
10
+ const GitignoreDetector = require('./gitignore-detector');
11
+ const GitignoreTransformer = require('./gitignore-transformer');
12
+ const GitignoreBackup = require('./gitignore-backup');
13
+
14
+ /**
15
+ * @typedef {Object} GitignoreFixResult
16
+ * @property {boolean} success - Fix succeeded
17
+ * @property {string} action - 'created' | 'updated' | 'skipped'
18
+ * @property {string} backupId - Backup ID (if created)
19
+ * @property {string[]} added - Rules added
20
+ * @property {string[]} removed - Rules removed
21
+ * @property {string} message - User-friendly message
22
+ */
23
+
24
+ class GitignoreIntegration {
25
+ constructor(dependencies = {}) {
26
+ this.detector = dependencies.detector || new GitignoreDetector();
27
+ this.transformer = dependencies.transformer || new GitignoreTransformer();
28
+ this.backup = dependencies.backup || new GitignoreBackup();
29
+ }
30
+
31
+ /**
32
+ * Runs .gitignore check and fix
33
+ *
34
+ * @param {string} projectPath - Project root path
35
+ * @param {Object} options - Integration options
36
+ * @param {boolean} options.skipBackup - Skip backup creation (dangerous)
37
+ * @param {boolean} options.dryRun - Preview without executing
38
+ * @returns {Promise<GitignoreFixResult>}
39
+ */
40
+ async checkAndFix(projectPath, options = {}) {
41
+ const { skipBackup = false, dryRun = false } = options;
42
+
43
+ try {
44
+ // Stage 1: Detect .gitignore status
45
+ const status = await this.detector.analyzeGitignore(projectPath);
46
+
47
+ // If compliant, no action needed
48
+ if (status.strategy === 'skip') {
49
+ return {
50
+ success: true,
51
+ action: 'skipped',
52
+ backupId: null,
53
+ added: [],
54
+ removed: [],
55
+ message: '.gitignore already optimal'
56
+ };
57
+ }
58
+
59
+ // Stage 2: Transform content
60
+ const transformResult = this.transformer.transform(status.content, status);
61
+
62
+ // Dry run mode - stop here
63
+ if (dryRun) {
64
+ return {
65
+ success: true,
66
+ action: status.strategy === 'add' ? 'would-create' : 'would-update',
67
+ backupId: null,
68
+ added: transformResult.added,
69
+ removed: transformResult.removed,
70
+ message: 'Dry run - no changes made'
71
+ };
72
+ }
73
+
74
+ // Stage 3: Create backup (if file exists and not skipped)
75
+ let backupId = null;
76
+ if (status.exists && !skipBackup) {
77
+ const backupInfo = await this.backup.createBackup(projectPath);
78
+ backupId = backupInfo.id;
79
+ }
80
+
81
+ // Stage 4: Write new .gitignore
82
+ const gitignorePath = path.join(projectPath, '.gitignore');
83
+ await fs.writeFile(gitignorePath, transformResult.content, 'utf8');
84
+
85
+ // Stage 5: Return result
86
+ return {
87
+ success: true,
88
+ action: status.strategy === 'add' ? 'created' : 'updated',
89
+ backupId,
90
+ added: transformResult.added,
91
+ removed: transformResult.removed,
92
+ message: this.generateSuccessMessage(status, backupId)
93
+ };
94
+
95
+ } catch (error) {
96
+ return {
97
+ success: false,
98
+ action: 'failed',
99
+ backupId: null,
100
+ added: [],
101
+ removed: [],
102
+ message: `Failed to fix .gitignore: ${error.message}`
103
+ };
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Integrates with adoption flow
109
+ *
110
+ * @param {string} projectPath - Project root path
111
+ * @returns {Promise<GitignoreFixResult>}
112
+ */
113
+ async integrateWithAdopt(projectPath) {
114
+ return await this.checkAndFix(projectPath);
115
+ }
116
+
117
+ /**
118
+ * Integrates with upgrade flow
119
+ *
120
+ * @param {string} projectPath - Project root path
121
+ * @returns {Promise<GitignoreFixResult>}
122
+ */
123
+ async integrateWithUpgrade(projectPath) {
124
+ return await this.checkAndFix(projectPath);
125
+ }
126
+
127
+ /**
128
+ * Standalone doctor command
129
+ *
130
+ * @param {string} projectPath - Project root path
131
+ * @returns {Promise<GitignoreFixResult>}
132
+ */
133
+ async runDoctor(projectPath) {
134
+ console.log(chalk.blue('🔍 Checking .gitignore configuration...'));
135
+ console.log();
136
+
137
+ const result = await this.checkAndFix(projectPath);
138
+
139
+ // Display detailed result
140
+ this.displayDoctorResult(result);
141
+
142
+ return result;
143
+ }
144
+
145
+ /**
146
+ * Generates success message
147
+ *
148
+ * @param {Object} status - Detection status
149
+ * @param {string} backupId - Backup ID
150
+ * @returns {string}
151
+ */
152
+ generateSuccessMessage(status, backupId) {
153
+ if (status.strategy === 'add') {
154
+ return '.gitignore created with layered strategy';
155
+ } else if (status.strategy === 'update') {
156
+ return `.gitignore updated for team collaboration${backupId ? ` (backup: ${backupId})` : ''}`;
157
+ }
158
+ return '.gitignore already optimal';
159
+ }
160
+
161
+ /**
162
+ * Displays doctor command result
163
+ *
164
+ * @param {GitignoreFixResult} result - Fix result
165
+ */
166
+ displayDoctorResult(result) {
167
+ if (result.action === 'skipped') {
168
+ console.log(chalk.green('✅ .gitignore is already optimal'));
169
+ console.log();
170
+ console.log(chalk.gray(' Current strategy: Layered .kiro/ management'));
171
+ console.log(chalk.gray(' - Specs are committable'));
172
+ console.log(chalk.gray(' - Personal state is excluded'));
173
+ console.log();
174
+ return;
175
+ }
176
+
177
+ if (!result.success) {
178
+ console.log(chalk.red('❌ Failed to fix .gitignore'));
179
+ console.log();
180
+ console.log(chalk.red(` ${result.message}`));
181
+ console.log();
182
+ return;
183
+ }
184
+
185
+ console.log(chalk.green(`✅ .gitignore ${result.action}`));
186
+ console.log();
187
+
188
+ if (result.backupId) {
189
+ console.log(chalk.blue('📦 Backup created:'), result.backupId);
190
+ console.log(chalk.gray(' Location:'), `.kiro/backups/${result.backupId}`);
191
+ console.log();
192
+ }
193
+
194
+ if (result.removed.length > 0) {
195
+ console.log(chalk.yellow('Removed old patterns:'));
196
+ result.removed.forEach(pattern => {
197
+ console.log(chalk.red(` - ${pattern}`));
198
+ });
199
+ console.log();
200
+ }
201
+
202
+ if (result.added.length > 0) {
203
+ console.log(chalk.green('Added layered rules:'));
204
+ console.log(chalk.gray(` + ${result.added.length} exclusion rules`));
205
+ console.log();
206
+ }
207
+
208
+ console.log(chalk.blue('💡 What this means:'));
209
+ console.log(' ✅ Spec documents are now committable');
210
+ console.log(' ✅ Team can see requirements, design, and tasks');
211
+ console.log(' ✅ Personal state is excluded (no merge conflicts)');
212
+ console.log();
213
+
214
+ console.log(chalk.gray(' Learn more:'), chalk.cyan('docs/team-collaboration-guide.md'));
215
+
216
+ if (result.backupId) {
217
+ console.log();
218
+ console.log(chalk.gray(' To rollback:'), chalk.cyan(`kse doctor --restore-gitignore ${result.backupId}`));
219
+ }
220
+
221
+ console.log();
222
+ }
223
+
224
+ /**
225
+ * Displays integration result (for adopt/upgrade flows)
226
+ *
227
+ * @param {GitignoreFixResult} result - Fix result
228
+ */
229
+ displayIntegrationResult(result) {
230
+ if (result.action === 'skipped') {
231
+ return; // No output for compliant .gitignore
232
+ }
233
+
234
+ if (!result.success) {
235
+ console.log(chalk.yellow('⚠️ .gitignore fix failed:'), result.message);
236
+ console.log(chalk.gray(' Run'), chalk.cyan('kse doctor --fix-gitignore'), chalk.gray('to fix manually'));
237
+ return;
238
+ }
239
+
240
+ console.log(chalk.blue('📝 .gitignore updated for team collaboration'));
241
+
242
+ if (result.backupId) {
243
+ console.log(chalk.gray(' Backup:'), result.backupId);
244
+ }
245
+
246
+ if (result.removed.length > 0) {
247
+ console.log(chalk.gray(' Changes:'));
248
+ console.log(chalk.yellow(` - Removed ${result.removed.length} old pattern(s)`));
249
+ }
250
+
251
+ console.log(chalk.green(' + Added layered .kiro/ exclusion rules'));
252
+ console.log(chalk.green(' + Specs are now committable'));
253
+ console.log(chalk.green(' + Personal state is excluded'));
254
+ console.log();
255
+
256
+ console.log(chalk.blue('💡 Why this matters:'));
257
+ console.log(' - Team can see Spec documents (requirements, design, tasks)');
258
+ console.log(' - No merge conflicts on personal state');
259
+ console.log(' - Follows best practices for team collaboration');
260
+ console.log();
261
+
262
+ console.log(chalk.gray(' Learn more:'), chalk.cyan('docs/team-collaboration-guide.md'));
263
+ console.log();
264
+ }
265
+ }
266
+
267
+ module.exports = GitignoreIntegration;
@@ -0,0 +1,193 @@
1
+ /**
2
+ * GitignoreTransformer - Transforms .gitignore to use layered strategy
3
+ *
4
+ * Removes old blanket exclusion patterns and adds layered exclusion rules
5
+ * while preserving user customizations.
6
+ */
7
+
8
+ const LAYERED_RULES_TEMPLATE = require('./layered-rules-template');
9
+
10
+ /**
11
+ * @typedef {Object} TransformResult
12
+ * @property {string} content - New .gitignore content
13
+ * @property {string[]} added - Rules added
14
+ * @property {string[]} removed - Rules removed
15
+ * @property {string[]} preserved - User rules preserved
16
+ */
17
+
18
+ class GitignoreTransformer {
19
+ constructor() {
20
+ // Old patterns to remove
21
+ this.OLD_PATTERNS = [
22
+ /^\.kiro\/?\s*$/,
23
+ /^\.kiro\/\*\s*$/,
24
+ /^\.kiro\/\*\*\s*$/
25
+ ];
26
+ }
27
+
28
+ /**
29
+ * Applies layered strategy to .gitignore
30
+ *
31
+ * @param {string} currentContent - Current .gitignore content (or empty)
32
+ * @param {Object} status - Detection status
33
+ * @returns {TransformResult}
34
+ */
35
+ transform(currentContent, status) {
36
+ const result = {
37
+ content: '',
38
+ added: [],
39
+ removed: [],
40
+ preserved: []
41
+ };
42
+
43
+ if (status.strategy === 'skip') {
44
+ // Already compliant, no changes needed
45
+ result.content = currentContent;
46
+ return result;
47
+ }
48
+
49
+ if (status.strategy === 'add') {
50
+ // Missing .gitignore, create new one
51
+ result.content = LAYERED_RULES_TEMPLATE;
52
+ result.added = this.extractRulePatterns(LAYERED_RULES_TEMPLATE);
53
+ return result;
54
+ }
55
+
56
+ if (status.strategy === 'update') {
57
+ // Remove old patterns and add layered rules
58
+ const cleaned = this.removeOldPatterns(currentContent, result);
59
+ result.content = this.addLayeredRules(cleaned);
60
+ result.added = this.extractRulePatterns(LAYERED_RULES_TEMPLATE);
61
+
62
+ // Track preserved rules
63
+ const lines = currentContent.split(/\r?\n/);
64
+ lines.forEach(line => {
65
+ const trimmed = line.trim();
66
+ if (trimmed && !trimmed.startsWith('#') && !this.isOldPattern(trimmed)) {
67
+ if (!trimmed.includes('.kiro')) {
68
+ result.preserved.push(trimmed);
69
+ }
70
+ }
71
+ });
72
+ }
73
+
74
+ return result;
75
+ }
76
+
77
+ /**
78
+ * Removes old blanket exclusion patterns
79
+ *
80
+ * @param {string} content - .gitignore content
81
+ * @param {TransformResult} result - Result object to track removed patterns
82
+ * @returns {string} - Content with old patterns removed
83
+ */
84
+ removeOldPatterns(content, result) {
85
+ // Detect line ending style
86
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
87
+
88
+ const lines = content.split(/\r?\n/);
89
+ const filtered = [];
90
+ let inManagedSection = false;
91
+
92
+ for (const line of lines) {
93
+ const trimmed = line.trim();
94
+
95
+ // Track kse-managed section
96
+ if (trimmed.includes('kse - DO NOT EDIT THIS SECTION')) {
97
+ inManagedSection = true;
98
+ continue; // Skip managed section start
99
+ } else if (trimmed.includes('End of kse-managed section')) {
100
+ inManagedSection = false;
101
+ continue; // Skip managed section end
102
+ }
103
+
104
+ // Skip lines in managed section
105
+ if (inManagedSection) {
106
+ continue;
107
+ }
108
+
109
+ // Check if line is old pattern
110
+ if (this.isOldPattern(trimmed)) {
111
+ result.removed.push(trimmed);
112
+ continue; // Skip old pattern
113
+ }
114
+
115
+ // Preserve line
116
+ filtered.push(line);
117
+ }
118
+
119
+ return filtered.join(lineEnding);
120
+ }
121
+
122
+ /**
123
+ * Checks if pattern is an old blanket exclusion
124
+ *
125
+ * @param {string} pattern - Pattern to check
126
+ * @returns {boolean}
127
+ */
128
+ isOldPattern(pattern) {
129
+ for (const regex of this.OLD_PATTERNS) {
130
+ if (regex.test(pattern)) {
131
+ return true;
132
+ }
133
+ }
134
+ return false;
135
+ }
136
+
137
+ /**
138
+ * Adds layered exclusion rules
139
+ *
140
+ * @param {string} content - .gitignore content
141
+ * @returns {string} - Content with layered rules added
142
+ */
143
+ addLayeredRules(content) {
144
+ // Detect line ending style from existing content
145
+ const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
146
+
147
+ // Ensure content ends with newline
148
+ let result = content.trim();
149
+
150
+ if (result) {
151
+ result += lineEnding + lineEnding;
152
+ }
153
+
154
+ // Convert template to match line ending style
155
+ const template = LAYERED_RULES_TEMPLATE.replace(/\n/g, lineEnding);
156
+
157
+ // Add layered rules section
158
+ result += template;
159
+
160
+ return result;
161
+ }
162
+
163
+ /**
164
+ * Generates layered rules section
165
+ *
166
+ * @returns {string}
167
+ */
168
+ generateLayeredSection() {
169
+ return LAYERED_RULES_TEMPLATE;
170
+ }
171
+
172
+ /**
173
+ * Extracts rule patterns from template (for reporting)
174
+ *
175
+ * @param {string} template - Template content
176
+ * @returns {string[]} - Rule patterns
177
+ */
178
+ extractRulePatterns(template) {
179
+ const lines = template.split(/\r?\n/);
180
+ const patterns = [];
181
+
182
+ for (const line of lines) {
183
+ const trimmed = line.trim();
184
+ if (trimmed && !trimmed.startsWith('#') && !trimmed.startsWith('=')) {
185
+ patterns.push(trimmed);
186
+ }
187
+ }
188
+
189
+ return patterns;
190
+ }
191
+ }
192
+
193
+ module.exports = GitignoreTransformer;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Layered .gitignore rules template
3
+ *
4
+ * This template defines the layered strategy for .kiro/ directory:
5
+ * - Commit Specs and shared content
6
+ * - Exclude personal state and temporary files
7
+ */
8
+
9
+ const LAYERED_RULES_TEMPLATE = `# ========================================
10
+ # .kiro/ Directory - Layered Management
11
+ # ========================================
12
+ # Generated by kse - DO NOT EDIT THIS SECTION
13
+ # See: docs/team-collaboration-guide.md
14
+
15
+ # Personal state files (DO NOT commit)
16
+ .kiro/steering/CURRENT_CONTEXT.md
17
+ .kiro/contexts/.active
18
+ .kiro/contexts/*/CURRENT_CONTEXT.md
19
+
20
+ # Environment configuration (DO NOT commit)
21
+ .kiro/environments.json
22
+ .kiro/env-backups/
23
+
24
+ # Temporary files and backups (DO NOT commit)
25
+ .kiro/backups/
26
+ .kiro/logs/
27
+ .kiro/reports/
28
+
29
+ # Spec artifacts (COMMIT - but exclude temporary files)
30
+ .kiro/specs/**/SESSION-*.md
31
+ .kiro/specs/**/*-SUMMARY.md
32
+ .kiro/specs/**/*-COMPLETE.md
33
+ .kiro/specs/**/TEMP-*.md
34
+ .kiro/specs/**/WIP-*.md
35
+ .kiro/specs/**/MVP-*.md
36
+
37
+ # ========================================
38
+ # End of kse-managed section
39
+ # ========================================
40
+ `;
41
+
42
+ module.exports = LAYERED_RULES_TEMPLATE;