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,273 @@
1
+ /**
2
+ * Knowledge Manager
3
+ * Central coordinator for knowledge base operations
4
+ */
5
+
6
+ const fs = require('fs-extra');
7
+ const path = require('path');
8
+ const EntryManager = require('./entry-manager');
9
+ const IndexManager = require('./index-manager');
10
+ const TemplateManager = require('./template-manager');
11
+
12
+ class KnowledgeManager {
13
+ constructor(projectRoot) {
14
+ this.projectRoot = projectRoot;
15
+ this.knowledgePath = path.join(projectRoot, '.kiro', 'knowledge');
16
+
17
+ this.entryManager = new EntryManager(this.knowledgePath);
18
+ this.indexManager = new IndexManager(this.knowledgePath);
19
+ this.templateManager = new TemplateManager(this.knowledgePath);
20
+ }
21
+
22
+ /**
23
+ * Initialize knowledge base
24
+ */
25
+ async initialize() {
26
+ // Create directory structure
27
+ await fs.ensureDir(this.knowledgePath);
28
+ await fs.ensureDir(path.join(this.knowledgePath, 'patterns'));
29
+ await fs.ensureDir(path.join(this.knowledgePath, 'lessons'));
30
+ await fs.ensureDir(path.join(this.knowledgePath, 'workflows'));
31
+ await fs.ensureDir(path.join(this.knowledgePath, 'checklists'));
32
+ await fs.ensureDir(path.join(this.knowledgePath, 'references'));
33
+ await fs.ensureDir(path.join(this.knowledgePath, '.templates'));
34
+ await fs.ensureDir(path.join(this.knowledgePath, '.backups'));
35
+
36
+ // Create README
37
+ const readme = `# Knowledge Base
38
+
39
+ This directory contains your personal knowledge base for this project.
40
+
41
+ ## Structure
42
+
43
+ - \`patterns/\` - Design patterns and architectural solutions
44
+ - \`lessons/\` - Lessons learned from experience
45
+ - \`workflows/\` - Custom workflows and processes
46
+ - \`checklists/\` - Checklists for common tasks
47
+ - \`references/\` - Reference materials and links
48
+
49
+ ## Usage
50
+
51
+ \`\`\`bash
52
+ # Add new entry
53
+ kse knowledge add <type> "<title>"
54
+
55
+ # List all entries
56
+ kse knowledge list
57
+
58
+ # Search entries
59
+ kse knowledge search <keyword>
60
+
61
+ # Analyze knowledge base
62
+ kse knowledge analyze
63
+
64
+ # Integrate knowledge into project
65
+ kse knowledge integrate <id> --target <destination>
66
+ \`\`\`
67
+
68
+ ## Learn More
69
+
70
+ See \`docs/knowledge-management-guide.md\` for complete documentation.
71
+ `;
72
+
73
+ await fs.writeFile(path.join(this.knowledgePath, 'README.md'), readme, 'utf-8');
74
+
75
+ // Initialize index
76
+ await this.indexManager.load();
77
+ await this.indexManager.save();
78
+ }
79
+
80
+ /**
81
+ * Check if knowledge base is initialized
82
+ * @returns {boolean}
83
+ */
84
+ async isInitialized() {
85
+ return fs.pathExists(this.knowledgePath);
86
+ }
87
+
88
+ /**
89
+ * Add new entry
90
+ * @param {string} type - Entry type
91
+ * @param {string} title - Entry title
92
+ * @param {Object} options - Additional options
93
+ * @returns {Object} - Created entry info
94
+ */
95
+ async addEntry(type, title, options = {}) {
96
+ if (!await this.isInitialized()) {
97
+ throw new Error('Knowledge base not initialized. Run: kse knowledge init');
98
+ }
99
+
100
+ // Validate type
101
+ const validTypes = ['pattern', 'lesson', 'workflow', 'checklist', 'reference'];
102
+ if (!validTypes.includes(type)) {
103
+ throw new Error(`Invalid type: ${type}. Valid types: ${validTypes.join(', ')}`);
104
+ }
105
+
106
+ // Get template
107
+ const template = await this.templateManager.getTemplate(type);
108
+
109
+ // Create entry
110
+ const result = await this.entryManager.create(type, title, template, {
111
+ tags: options.tags || [],
112
+ category: options.category || null
113
+ });
114
+
115
+ // Update index
116
+ const entryData = await this.entryManager.read(result.path);
117
+ await this.indexManager.addEntry({
118
+ ...entryData.metadata,
119
+ file: result.file
120
+ });
121
+
122
+ return result;
123
+ }
124
+
125
+ /**
126
+ * Get entry by ID
127
+ * @param {string} id - Entry ID
128
+ * @returns {Object} - Entry data
129
+ */
130
+ async getEntry(id) {
131
+ const entry = await this.indexManager.findById(id);
132
+ if (!entry) {
133
+ throw new Error(`Entry not found: ${id}`);
134
+ }
135
+
136
+ const filePath = path.join(this.knowledgePath, entry.file);
137
+ return this.entryManager.read(filePath);
138
+ }
139
+
140
+ /**
141
+ * Update entry
142
+ * @param {string} id - Entry ID
143
+ * @param {Object} updates - Updates to apply
144
+ */
145
+ async updateEntry(id, updates) {
146
+ const entry = await this.indexManager.findById(id);
147
+ if (!entry) {
148
+ throw new Error(`Entry not found: ${id}`);
149
+ }
150
+
151
+ const filePath = path.join(this.knowledgePath, entry.file);
152
+ await this.entryManager.update(filePath, updates.content, updates.metadata);
153
+
154
+ // Update index
155
+ if (updates.metadata) {
156
+ await this.indexManager.updateEntry(id, updates.metadata);
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Delete entry
162
+ * @param {string} id - Entry ID
163
+ * @param {Object} options - Delete options
164
+ */
165
+ async deleteEntry(id, options = {}) {
166
+ const entry = await this.indexManager.findById(id);
167
+ if (!entry) {
168
+ throw new Error(`Entry not found: ${id}`);
169
+ }
170
+
171
+ const filePath = path.join(this.knowledgePath, entry.file);
172
+ await this.entryManager.delete(filePath, options.backup !== false);
173
+
174
+ // Update index
175
+ await this.indexManager.removeEntry(id);
176
+
177
+ return {
178
+ id,
179
+ title: entry.title,
180
+ deleted: true
181
+ };
182
+ }
183
+
184
+ /**
185
+ * List entries
186
+ * @param {Object} filters - Filter options
187
+ * @returns {Array} - Filtered entries
188
+ */
189
+ async listEntries(filters = {}) {
190
+ await this.indexManager.load();
191
+
192
+ let entries = this.indexManager.index.entries;
193
+
194
+ // Apply filters
195
+ if (filters.type) {
196
+ entries = entries.filter(e => e.type === filters.type);
197
+ }
198
+
199
+ if (filters.tag) {
200
+ entries = entries.filter(e => e.tags.includes(filters.tag));
201
+ }
202
+
203
+ if (filters.status) {
204
+ entries = entries.filter(e => e.status === filters.status);
205
+ }
206
+
207
+ // Apply sorting
208
+ if (filters.sort) {
209
+ const [field, order = 'asc'] = filters.sort.split(':');
210
+ entries.sort((a, b) => {
211
+ const aVal = a[field];
212
+ const bVal = b[field];
213
+ const comparison = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;
214
+ return order === 'desc' ? -comparison : comparison;
215
+ });
216
+ }
217
+
218
+ return entries;
219
+ }
220
+
221
+ /**
222
+ * Search entries
223
+ * @param {string} keyword - Search keyword
224
+ * @param {Object} options - Search options
225
+ * @returns {Array} - Search results
226
+ */
227
+ async search(keyword, options = {}) {
228
+ // Search in index first
229
+ const indexResults = await this.indexManager.search(keyword);
230
+
231
+ if (!options.fullText) {
232
+ return indexResults;
233
+ }
234
+
235
+ // Full-text search in files
236
+ const results = [];
237
+ const lowerKeyword = keyword.toLowerCase();
238
+
239
+ for (const entry of indexResults) {
240
+ const filePath = path.join(this.knowledgePath, entry.file);
241
+ const data = await this.entryManager.read(filePath);
242
+
243
+ if (data.content.toLowerCase().includes(lowerKeyword)) {
244
+ // Extract context snippet
245
+ const lines = data.content.split('\n');
246
+ const matchingLines = lines.filter(line =>
247
+ line.toLowerCase().includes(lowerKeyword)
248
+ );
249
+
250
+ results.push({
251
+ ...entry,
252
+ matches: matchingLines.slice(0, 3),
253
+ score: matchingLines.length
254
+ });
255
+ }
256
+ }
257
+
258
+ // Sort by relevance
259
+ results.sort((a, b) => b.score - a.score);
260
+
261
+ return results;
262
+ }
263
+
264
+ /**
265
+ * Get statistics
266
+ * @returns {Object} - Statistics
267
+ */
268
+ async getStats() {
269
+ return this.indexManager.getStats();
270
+ }
271
+ }
272
+
273
+ module.exports = KnowledgeManager;
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Template Manager
3
+ * Manages entry templates
4
+ */
5
+
6
+ const fs = require('fs-extra');
7
+ const path = require('path');
8
+
9
+ class TemplateManager {
10
+ constructor(knowledgePath) {
11
+ this.knowledgePath = knowledgePath;
12
+ this.templatesDir = path.join(knowledgePath, '.templates');
13
+ this.builtInTemplatesDir = path.join(__dirname, 'templates');
14
+ }
15
+
16
+ /**
17
+ * Get template by type
18
+ * @param {string} type - Template type
19
+ * @returns {string} - Template content
20
+ */
21
+ async getTemplate(type) {
22
+ // Check custom template first
23
+ const customPath = path.join(this.templatesDir, `${type}.md`);
24
+ if (await fs.pathExists(customPath)) {
25
+ return fs.readFile(customPath, 'utf-8');
26
+ }
27
+
28
+ // Fall back to built-in template
29
+ return this.getDefaultTemplate(type);
30
+ }
31
+
32
+ /**
33
+ * List available templates
34
+ * @returns {Array} - Template names
35
+ */
36
+ async listTemplates() {
37
+ const templates = ['pattern', 'lesson', 'workflow', 'checklist', 'reference'];
38
+
39
+ // Check for custom templates
40
+ if (await fs.pathExists(this.templatesDir)) {
41
+ const files = await fs.readdir(this.templatesDir);
42
+ const customTemplates = files
43
+ .filter(f => f.endsWith('.md'))
44
+ .map(f => path.basename(f, '.md'));
45
+
46
+ return [...new Set([...templates, ...customTemplates])];
47
+ }
48
+
49
+ return templates;
50
+ }
51
+
52
+ /**
53
+ * Get default built-in template
54
+ * @param {string} type - Template type
55
+ * @returns {string} - Template content
56
+ */
57
+ getDefaultTemplate(type) {
58
+ const templates = {
59
+ pattern: `## Context
60
+
61
+ Describe when and where this pattern applies.
62
+
63
+ ## Problem
64
+
65
+ What problem does this pattern solve?
66
+
67
+ ## Solution
68
+
69
+ How to implement this pattern.
70
+
71
+ ## Examples
72
+
73
+ \`\`\`javascript
74
+ // Code example
75
+ \`\`\`
76
+
77
+ ## Trade-offs
78
+
79
+ Advantages and disadvantages.
80
+
81
+ ## References
82
+
83
+ - Related patterns
84
+ - External resources
85
+ `,
86
+
87
+ lesson: `## Situation
88
+
89
+ What was the context or project?
90
+
91
+ ## Challenge
92
+
93
+ What problem or challenge did you face?
94
+
95
+ ## Action
96
+
97
+ What did you do to address it?
98
+
99
+ ## Result
100
+
101
+ What was the outcome?
102
+
103
+ ## Lesson Learned
104
+
105
+ What did you learn from this experience?
106
+
107
+ ## Application
108
+
109
+ How can this lesson be applied in the future?
110
+ `,
111
+
112
+ workflow: `## Purpose
113
+
114
+ What is this workflow for?
115
+
116
+ ## Prerequisites
117
+
118
+ What needs to be in place before starting?
119
+
120
+ ## Steps
121
+
122
+ 1. First step
123
+ 2. Second step
124
+ 3. Third step
125
+
126
+ ## Verification
127
+
128
+ How to verify the workflow completed successfully?
129
+
130
+ ## Troubleshooting
131
+
132
+ Common issues and solutions.
133
+
134
+ ## References
135
+
136
+ - Related workflows
137
+ - Documentation links
138
+ `,
139
+
140
+ checklist: `## Purpose
141
+
142
+ What is this checklist for?
143
+
144
+ ## Checklist Items
145
+
146
+ - [ ] Item 1
147
+ - [ ] Item 2
148
+ - [ ] Item 3
149
+
150
+ ## Notes
151
+
152
+ Additional context or tips.
153
+
154
+ ## References
155
+
156
+ - Related checklists
157
+ - Documentation
158
+ `,
159
+
160
+ reference: `## Overview
161
+
162
+ Brief description of this reference.
163
+
164
+ ## Key Information
165
+
166
+ Important details, links, or data.
167
+
168
+ ## Usage
169
+
170
+ How to use this reference.
171
+
172
+ ## Examples
173
+
174
+ Practical examples.
175
+
176
+ ## Related
177
+
178
+ - Related references
179
+ - External links
180
+ `
181
+ };
182
+
183
+ if (!templates[type]) {
184
+ throw new Error(`Unknown template type: ${type}`);
185
+ }
186
+
187
+ return templates[type];
188
+ }
189
+ }
190
+
191
+ module.exports = TemplateManager;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Lock module exports
3
+ * @module lib/lock
4
+ */
5
+
6
+ const { LockManager, DEFAULT_TIMEOUT_HOURS } = require('./lock-manager');
7
+ const { MachineIdentifier } = require('./machine-identifier');
8
+ const { LockFile, LOCK_FILE_NAME, LOCK_VERSION } = require('./lock-file');
9
+ const { TaskLockManager } = require('./task-lock-manager');
10
+ const { SteeringFileLock } = require('./steering-file-lock');
11
+
12
+ module.exports = {
13
+ LockManager,
14
+ MachineIdentifier,
15
+ LockFile,
16
+ DEFAULT_TIMEOUT_HOURS,
17
+ LOCK_FILE_NAME,
18
+ LOCK_VERSION,
19
+ TaskLockManager,
20
+ SteeringFileLock
21
+ };
@@ -0,0 +1,192 @@
1
+ /**
2
+ * LockFile - Manages lock file I/O operations
3
+ * @module lib/lock/lock-file
4
+ */
5
+
6
+ const fs = require('fs').promises;
7
+ const path = require('path');
8
+
9
+ const LOCK_FILE_NAME = '.lock';
10
+ const LOCK_VERSION = '1.0.0';
11
+
12
+ class LockFile {
13
+ /**
14
+ * @param {string} specsDir - Path to specs directory
15
+ */
16
+ constructor(specsDir) {
17
+ this.specsDir = specsDir;
18
+ }
19
+
20
+ /**
21
+ * Get lock file path for a spec
22
+ * @param {string} specName - Name of the Spec
23
+ * @returns {string}
24
+ * @private
25
+ */
26
+ _getLockPath(specName) {
27
+ return path.join(this.specsDir, specName, LOCK_FILE_NAME);
28
+ }
29
+
30
+ /**
31
+ * Read lock metadata from a Spec
32
+ * @param {string} specName - Name of the Spec
33
+ * @returns {Promise<LockMetadata|null>}
34
+ */
35
+ async read(specName) {
36
+ const lockPath = this._getLockPath(specName);
37
+
38
+ try {
39
+ const data = await fs.readFile(lockPath, 'utf8');
40
+ const metadata = JSON.parse(data);
41
+
42
+ if (!this._isValidMetadata(metadata)) {
43
+ return null; // Corrupted lock file
44
+ }
45
+
46
+ return this._normalizeMetadata(metadata);
47
+ } catch (error) {
48
+ if (error.code === 'ENOENT') {
49
+ return null; // No lock file
50
+ }
51
+ if (error instanceof SyntaxError) {
52
+ return null; // Invalid JSON - corrupted
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Write lock metadata to a Spec
60
+ * @param {string} specName - Name of the Spec
61
+ * @param {LockMetadata} metadata - Lock metadata to write
62
+ * @returns {Promise<void>}
63
+ */
64
+ async write(specName, metadata) {
65
+ const lockPath = this._getLockPath(specName);
66
+ const specDir = path.dirname(lockPath);
67
+
68
+ // Ensure spec directory exists
69
+ await fs.mkdir(specDir, { recursive: true });
70
+
71
+ const normalizedMetadata = {
72
+ ...metadata,
73
+ version: metadata.version || LOCK_VERSION
74
+ };
75
+
76
+ if (!this._isValidMetadata(normalizedMetadata)) {
77
+ throw new Error('Invalid lock metadata: missing required fields');
78
+ }
79
+
80
+ // Atomic write using temp file
81
+ const tempPath = `${lockPath}.tmp`;
82
+ const content = JSON.stringify(normalizedMetadata, null, 2);
83
+
84
+ await fs.writeFile(tempPath, content, 'utf8');
85
+ await fs.rename(tempPath, lockPath);
86
+ }
87
+
88
+
89
+ /**
90
+ * Delete lock file from a Spec
91
+ * @param {string} specName - Name of the Spec
92
+ * @returns {Promise<boolean>}
93
+ */
94
+ async delete(specName) {
95
+ const lockPath = this._getLockPath(specName);
96
+
97
+ try {
98
+ await fs.unlink(lockPath);
99
+ return true;
100
+ } catch (error) {
101
+ if (error.code === 'ENOENT') {
102
+ return false; // Already deleted
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Check if lock file exists
110
+ * @param {string} specName - Name of the Spec
111
+ * @returns {Promise<boolean>}
112
+ */
113
+ async exists(specName) {
114
+ const lockPath = this._getLockPath(specName);
115
+
116
+ try {
117
+ await fs.access(lockPath);
118
+ return true;
119
+ } catch {
120
+ return false;
121
+ }
122
+ }
123
+
124
+ /**
125
+ * List all Specs with lock files
126
+ * @returns {Promise<string[]>}
127
+ */
128
+ async listLockedSpecs() {
129
+ const lockedSpecs = [];
130
+
131
+ try {
132
+ const entries = await fs.readdir(this.specsDir, { withFileTypes: true });
133
+
134
+ for (const entry of entries) {
135
+ if (entry.isDirectory()) {
136
+ const lockPath = path.join(this.specsDir, entry.name, LOCK_FILE_NAME);
137
+ try {
138
+ await fs.access(lockPath);
139
+ lockedSpecs.push(entry.name);
140
+ } catch {
141
+ // No lock file
142
+ }
143
+ }
144
+ }
145
+ } catch (error) {
146
+ if (error.code !== 'ENOENT') {
147
+ throw error;
148
+ }
149
+ }
150
+
151
+ return lockedSpecs;
152
+ }
153
+
154
+ /**
155
+ * Validate lock metadata structure
156
+ * @param {Object} metadata
157
+ * @returns {boolean}
158
+ * @private
159
+ */
160
+ _isValidMetadata(metadata) {
161
+ return (
162
+ metadata &&
163
+ typeof metadata.owner === 'string' &&
164
+ typeof metadata.machineId === 'string' &&
165
+ typeof metadata.hostname === 'string' &&
166
+ typeof metadata.timestamp === 'string' &&
167
+ typeof metadata.timeout === 'number' &&
168
+ metadata.owner.length > 0 &&
169
+ metadata.machineId.length > 0
170
+ );
171
+ }
172
+
173
+ /**
174
+ * Normalize metadata with default values for optional fields
175
+ * @param {Object} metadata
176
+ * @returns {LockMetadata}
177
+ * @private
178
+ */
179
+ _normalizeMetadata(metadata) {
180
+ return {
181
+ owner: metadata.owner,
182
+ machineId: metadata.machineId,
183
+ hostname: metadata.hostname,
184
+ timestamp: metadata.timestamp,
185
+ reason: metadata.reason || null,
186
+ timeout: metadata.timeout,
187
+ version: metadata.version || LOCK_VERSION
188
+ };
189
+ }
190
+ }
191
+
192
+ module.exports = { LockFile, LOCK_FILE_NAME, LOCK_VERSION };