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,487 @@
1
+ /**
2
+ * Adoption Logger
3
+ *
4
+ * Provides detailed logging for debugging and troubleshooting adoption process.
5
+ * Logs internal operations not shown in progress display.
6
+ *
7
+ * Core Responsibilities:
8
+ * - Log all operations when verbose mode is enabled
9
+ * - Include timestamps and operation details
10
+ * - Write logs to file for later review
11
+ * - Support different log levels (info, debug, verbose)
12
+ * - Don't clutter normal output
13
+ */
14
+
15
+ const fs = require('fs');
16
+ const path = require('path');
17
+
18
+ /**
19
+ * Log levels
20
+ */
21
+ const LogLevel = {
22
+ ERROR: 0,
23
+ WARN: 1,
24
+ INFO: 2,
25
+ DEBUG: 3,
26
+ VERBOSE: 4
27
+ };
28
+
29
+ /**
30
+ * Log level names
31
+ */
32
+ const LogLevelNames = {
33
+ 0: 'ERROR',
34
+ 1: 'WARN',
35
+ 2: 'INFO',
36
+ 3: 'DEBUG',
37
+ 4: 'VERBOSE'
38
+ };
39
+
40
+ /**
41
+ * Adoption Logger for detailed operation logging
42
+ */
43
+ class AdoptionLogger {
44
+ constructor(options = {}) {
45
+ this.enabled = options.enabled !== false;
46
+ this.level = this._parseLogLevel(options.level || 'info');
47
+ this.logToFile = options.logToFile !== false;
48
+ this.logToConsole = options.logToConsole || false;
49
+ this.logFilePath = options.logFilePath || null;
50
+ this.logBuffer = [];
51
+ this.maxBufferSize = options.maxBufferSize || 1000;
52
+ this.startTime = Date.now();
53
+ }
54
+
55
+ /**
56
+ * Parses log level from string or number
57
+ *
58
+ * @param {string|number} level - Log level
59
+ * @returns {number}
60
+ * @private
61
+ */
62
+ _parseLogLevel(level) {
63
+ if (typeof level === 'number') {
64
+ return level;
65
+ }
66
+
67
+ const levelMap = {
68
+ 'error': 0, // LogLevel.ERROR
69
+ 'warn': 1, // LogLevel.WARN
70
+ 'info': 2, // LogLevel.INFO
71
+ 'debug': 3, // LogLevel.DEBUG
72
+ 'verbose': 4 // LogLevel.VERBOSE
73
+ };
74
+
75
+ return levelMap[level.toLowerCase()] !== undefined ? levelMap[level.toLowerCase()] : 2; // Default to INFO
76
+ }
77
+
78
+ /**
79
+ * Initializes log file
80
+ *
81
+ * @param {string} projectPath - Project path
82
+ * @param {string} adoptionId - Adoption ID (timestamp)
83
+ */
84
+ initialize(projectPath, adoptionId) {
85
+ if (!this.logToFile) return;
86
+
87
+ try {
88
+ // Create logs directory if it doesn't exist
89
+ const logsDir = path.join(projectPath, '.kiro', 'logs');
90
+ if (!fs.existsSync(logsDir)) {
91
+ fs.mkdirSync(logsDir, { recursive: true });
92
+ }
93
+
94
+ // Set log file path
95
+ this.logFilePath = path.join(logsDir, `adopt-${adoptionId}.log`);
96
+
97
+ // Write header
98
+ const header = [
99
+ '='.repeat(80),
100
+ `Kiro Spec Engine - Adoption Log`,
101
+ `Adoption ID: ${adoptionId}`,
102
+ `Start Time: ${new Date().toISOString()}`,
103
+ `Log Level: ${LogLevelNames[this.level]}`,
104
+ '='.repeat(80),
105
+ ''
106
+ ].join('\n');
107
+
108
+ fs.writeFileSync(this.logFilePath, header, 'utf8');
109
+
110
+ this.info('Logger initialized', { logFile: this.logFilePath });
111
+ } catch (error) {
112
+ // Silently fail - logging is not critical
113
+ this.logToFile = false;
114
+ this.logFilePath = null;
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Logs a message at specified level
120
+ *
121
+ * @param {number} level - Log level
122
+ * @param {string} message - Log message
123
+ * @param {Object} data - Additional data
124
+ * @private
125
+ */
126
+ _log(level, message, data = null) {
127
+ if (!this.enabled || level > this.level) {
128
+ return;
129
+ }
130
+
131
+ const timestamp = new Date().toISOString();
132
+ const elapsed = Date.now() - this.startTime;
133
+ const levelName = LogLevelNames[level];
134
+
135
+ // Format log entry
136
+ const logEntry = {
137
+ timestamp,
138
+ elapsed,
139
+ level: levelName,
140
+ message,
141
+ data
142
+ };
143
+
144
+ // Add to buffer
145
+ this.logBuffer.push(logEntry);
146
+ if (this.logBuffer.length > this.maxBufferSize) {
147
+ this.logBuffer.shift();
148
+ }
149
+
150
+ // Format for output
151
+ const formattedMessage = this._formatLogEntry(logEntry);
152
+
153
+ // Write to console if enabled
154
+ if (this.logToConsole) {
155
+ console.log(formattedMessage);
156
+ }
157
+
158
+ // Write to file if enabled
159
+ if (this.logToFile && this.logFilePath) {
160
+ try {
161
+ fs.appendFileSync(this.logFilePath, formattedMessage + '\n', 'utf8');
162
+ } catch (error) {
163
+ // Silently fail - logging is not critical
164
+ }
165
+ }
166
+ }
167
+
168
+ /**
169
+ * Formats log entry for output
170
+ *
171
+ * @param {Object} entry - Log entry
172
+ * @returns {string}
173
+ * @private
174
+ */
175
+ _formatLogEntry(entry) {
176
+ const parts = [
177
+ `[${entry.timestamp}]`,
178
+ `[+${this._formatElapsed(entry.elapsed)}]`,
179
+ `[${entry.level}]`,
180
+ entry.message
181
+ ];
182
+
183
+ if (entry.data) {
184
+ parts.push(JSON.stringify(entry.data, null, 2));
185
+ }
186
+
187
+ return parts.join(' ');
188
+ }
189
+
190
+ /**
191
+ * Formats elapsed time
192
+ *
193
+ * @param {number} ms - Milliseconds
194
+ * @returns {string}
195
+ * @private
196
+ */
197
+ _formatElapsed(ms) {
198
+ if (ms < 1000) {
199
+ return `${ms}ms`;
200
+ } else if (ms < 60000) {
201
+ return `${(ms / 1000).toFixed(2)}s`;
202
+ } else {
203
+ const minutes = Math.floor(ms / 60000);
204
+ const seconds = ((ms % 60000) / 1000).toFixed(2);
205
+ return `${minutes}m${seconds}s`;
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Logs error message
211
+ *
212
+ * @param {string} message - Error message
213
+ * @param {Object} data - Additional data
214
+ */
215
+ error(message, data = null) {
216
+ this._log(LogLevel.ERROR, message, data);
217
+ }
218
+
219
+ /**
220
+ * Logs warning message
221
+ *
222
+ * @param {string} message - Warning message
223
+ * @param {Object} data - Additional data
224
+ */
225
+ warn(message, data = null) {
226
+ this._log(LogLevel.WARN, message, data);
227
+ }
228
+
229
+ /**
230
+ * Logs info message
231
+ *
232
+ * @param {string} message - Info message
233
+ * @param {Object} data - Additional data
234
+ */
235
+ info(message, data = null) {
236
+ this._log(LogLevel.INFO, message, data);
237
+ }
238
+
239
+ /**
240
+ * Logs debug message
241
+ *
242
+ * @param {string} message - Debug message
243
+ * @param {Object} data - Additional data
244
+ */
245
+ debug(message, data = null) {
246
+ this._log(LogLevel.DEBUG, message, data);
247
+ }
248
+
249
+ /**
250
+ * Logs verbose message
251
+ *
252
+ * @param {string} message - Verbose message
253
+ * @param {Object} data - Additional data
254
+ */
255
+ verbose(message, data = null) {
256
+ this._log(LogLevel.VERBOSE, message, data);
257
+ }
258
+
259
+ /**
260
+ * Logs operation start
261
+ *
262
+ * @param {string} operation - Operation name
263
+ * @param {Object} params - Operation parameters
264
+ */
265
+ startOperation(operation, params = null) {
266
+ this.info(`Starting operation: ${operation}`, params);
267
+ }
268
+
269
+ /**
270
+ * Logs operation end
271
+ *
272
+ * @param {string} operation - Operation name
273
+ * @param {Object} result - Operation result
274
+ */
275
+ endOperation(operation, result = null) {
276
+ this.info(`Completed operation: ${operation}`, result);
277
+ }
278
+
279
+ /**
280
+ * Logs operation error
281
+ *
282
+ * @param {string} operation - Operation name
283
+ * @param {Error} error - Error object
284
+ */
285
+ operationError(operation, error) {
286
+ this.error(`Operation failed: ${operation}`, {
287
+ message: error.message,
288
+ stack: error.stack
289
+ });
290
+ }
291
+
292
+ /**
293
+ * Logs file operation
294
+ *
295
+ * @param {string} operation - Operation type (create, update, delete, preserve)
296
+ * @param {string} filePath - File path
297
+ * @param {Object} details - Additional details
298
+ */
299
+ fileOperation(operation, filePath, details = null) {
300
+ this.debug(`File ${operation}: ${filePath}`, details);
301
+ }
302
+
303
+ /**
304
+ * Logs detection result
305
+ *
306
+ * @param {Object} state - Project state
307
+ */
308
+ detectionResult(state) {
309
+ this.info('Project state detected', {
310
+ hasKiroDir: state.hasKiroDir,
311
+ hasVersionFile: state.hasVersionFile,
312
+ currentVersion: state.currentVersion,
313
+ targetVersion: state.targetVersion,
314
+ conflictsCount: state.conflicts ? state.conflicts.length : 0
315
+ });
316
+ }
317
+
318
+ /**
319
+ * Logs strategy selection
320
+ *
321
+ * @param {string} mode - Selected mode
322
+ * @param {string} reason - Selection reason
323
+ */
324
+ strategySelected(mode, reason) {
325
+ this.info('Strategy selected', { mode, reason });
326
+ }
327
+
328
+ /**
329
+ * Logs conflict resolution
330
+ *
331
+ * @param {string} filePath - File path
332
+ * @param {string} resolution - Resolution action
333
+ * @param {string} reason - Resolution reason
334
+ */
335
+ conflictResolved(filePath, resolution, reason) {
336
+ this.debug('Conflict resolved', { filePath, resolution, reason });
337
+ }
338
+
339
+ /**
340
+ * Logs backup creation
341
+ *
342
+ * @param {Object} backup - Backup result
343
+ */
344
+ backupCreated(backup) {
345
+ this.info('Backup created', {
346
+ id: backup.id,
347
+ location: backup.location,
348
+ filesCount: backup.filesCount,
349
+ totalSize: backup.totalSize
350
+ });
351
+ }
352
+
353
+ /**
354
+ * Logs validation result
355
+ *
356
+ * @param {Object} validation - Validation result
357
+ */
358
+ validationResult(validation) {
359
+ if (validation.success) {
360
+ this.info('Validation successful', {
361
+ filesVerified: validation.filesVerified
362
+ });
363
+ } else {
364
+ this.error('Validation failed', {
365
+ error: validation.error
366
+ });
367
+ }
368
+ }
369
+
370
+ /**
371
+ * Logs adoption plan
372
+ *
373
+ * @param {Object} plan - Adoption plan
374
+ */
375
+ adoptionPlan(plan) {
376
+ this.info('Adoption plan created', {
377
+ mode: plan.mode,
378
+ requiresBackup: plan.requiresBackup,
379
+ changesCount: {
380
+ created: plan.changes.created.length,
381
+ updated: plan.changes.updated.length,
382
+ deleted: plan.changes.deleted ? plan.changes.deleted.length : 0,
383
+ preserved: plan.changes.preserved.length
384
+ }
385
+ });
386
+ }
387
+
388
+ /**
389
+ * Logs adoption result
390
+ *
391
+ * @param {Object} result - Adoption result
392
+ */
393
+ adoptionResult(result) {
394
+ if (result.success) {
395
+ this.info('Adoption completed successfully', {
396
+ mode: result.mode,
397
+ backupId: result.backup ? result.backup.id : null,
398
+ changesCount: {
399
+ created: result.changes.created.length,
400
+ updated: result.changes.updated.length,
401
+ deleted: result.changes.deleted ? result.changes.deleted.length : 0,
402
+ preserved: result.changes.preserved.length
403
+ }
404
+ });
405
+ } else {
406
+ this.error('Adoption failed', {
407
+ errors: result.errors
408
+ });
409
+ }
410
+ }
411
+
412
+ /**
413
+ * Flushes log buffer to file
414
+ */
415
+ flush() {
416
+ if (!this.logToFile || !this.logFilePath) return;
417
+
418
+ try {
419
+ // Write footer
420
+ const footer = [
421
+ '',
422
+ '='.repeat(80),
423
+ `End Time: ${new Date().toISOString()}`,
424
+ `Total Duration: ${this._formatElapsed(Date.now() - this.startTime)}`,
425
+ `Total Log Entries: ${this.logBuffer.length}`,
426
+ '='.repeat(80)
427
+ ].join('\n');
428
+
429
+ fs.appendFileSync(this.logFilePath, footer + '\n', 'utf8');
430
+ } catch (error) {
431
+ // Silently fail - logging is not critical
432
+ }
433
+ }
434
+
435
+ /**
436
+ * Gets log file path
437
+ *
438
+ * @returns {string|null}
439
+ */
440
+ getLogFilePath() {
441
+ return this.logFilePath;
442
+ }
443
+
444
+ /**
445
+ * Gets log buffer
446
+ *
447
+ * @returns {Array}
448
+ */
449
+ getLogBuffer() {
450
+ return this.logBuffer;
451
+ }
452
+
453
+ /**
454
+ * Clears log buffer
455
+ */
456
+ clearBuffer() {
457
+ this.logBuffer = [];
458
+ }
459
+
460
+ /**
461
+ * Enables logging
462
+ */
463
+ enable() {
464
+ this.enabled = true;
465
+ }
466
+
467
+ /**
468
+ * Disables logging
469
+ */
470
+ disable() {
471
+ this.enabled = false;
472
+ }
473
+
474
+ /**
475
+ * Sets log level
476
+ *
477
+ * @param {string|number} level - Log level
478
+ */
479
+ setLevel(level) {
480
+ this.level = this._parseLogLevel(level);
481
+ }
482
+ }
483
+
484
+ // Export class and constants
485
+ module.exports = AdoptionLogger;
486
+ module.exports.LogLevel = LogLevel;
487
+ module.exports.LogLevelNames = LogLevelNames;