opencode-telos 1.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 (568) hide show
  1. package/README.md +927 -0
  2. package/dist/code-intelligence/analyzer.d.ts +9 -0
  3. package/dist/code-intelligence/analyzer.d.ts.map +1 -0
  4. package/dist/code-intelligence/analyzer.js +321 -0
  5. package/dist/code-intelligence/analyzer.js.map +1 -0
  6. package/dist/code-intelligence/ast/cache.d.ts +16 -0
  7. package/dist/code-intelligence/ast/cache.d.ts.map +1 -0
  8. package/dist/code-intelligence/ast/cache.js +44 -0
  9. package/dist/code-intelligence/ast/cache.js.map +1 -0
  10. package/dist/code-intelligence/ast/common.d.ts +8 -0
  11. package/dist/code-intelligence/ast/common.d.ts.map +1 -0
  12. package/dist/code-intelligence/ast/common.js +42 -0
  13. package/dist/code-intelligence/ast/common.js.map +1 -0
  14. package/dist/code-intelligence/ast/component.d.ts +10 -0
  15. package/dist/code-intelligence/ast/component.d.ts.map +1 -0
  16. package/dist/code-intelligence/ast/component.js +38 -0
  17. package/dist/code-intelligence/ast/component.js.map +1 -0
  18. package/dist/code-intelligence/ast/fallback.d.ts +9 -0
  19. package/dist/code-intelligence/ast/fallback.d.ts.map +1 -0
  20. package/dist/code-intelligence/ast/fallback.js +38 -0
  21. package/dist/code-intelligence/ast/fallback.js.map +1 -0
  22. package/dist/code-intelligence/ast/index.d.ts +5 -0
  23. package/dist/code-intelligence/ast/index.d.ts.map +1 -0
  24. package/dist/code-intelligence/ast/index.js +5 -0
  25. package/dist/code-intelligence/ast/index.js.map +1 -0
  26. package/dist/code-intelligence/ast/ir.d.ts +72 -0
  27. package/dist/code-intelligence/ast/ir.d.ts.map +1 -0
  28. package/dist/code-intelligence/ast/ir.js +2 -0
  29. package/dist/code-intelligence/ast/ir.js.map +1 -0
  30. package/dist/code-intelligence/ast/metrics.d.ts +25 -0
  31. package/dist/code-intelligence/ast/metrics.d.ts.map +1 -0
  32. package/dist/code-intelligence/ast/metrics.js +38 -0
  33. package/dist/code-intelligence/ast/metrics.js.map +1 -0
  34. package/dist/code-intelligence/ast/registry.d.ts +5 -0
  35. package/dist/code-intelligence/ast/registry.d.ts.map +1 -0
  36. package/dist/code-intelligence/ast/registry.js +22 -0
  37. package/dist/code-intelligence/ast/registry.js.map +1 -0
  38. package/dist/code-intelligence/ast/tree-sitter.d.ts +8 -0
  39. package/dist/code-intelligence/ast/tree-sitter.d.ts.map +1 -0
  40. package/dist/code-intelligence/ast/tree-sitter.js +247 -0
  41. package/dist/code-intelligence/ast/tree-sitter.js.map +1 -0
  42. package/dist/code-intelligence/ast/typescript.d.ts +8 -0
  43. package/dist/code-intelligence/ast/typescript.d.ts.map +1 -0
  44. package/dist/code-intelligence/ast/typescript.js +147 -0
  45. package/dist/code-intelligence/ast/typescript.js.map +1 -0
  46. package/dist/index.d.ts +10 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +18 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/mcp/server.d.ts +27 -0
  51. package/dist/mcp/server.d.ts.map +1 -0
  52. package/dist/mcp/server.js +67 -0
  53. package/dist/mcp/server.js.map +1 -0
  54. package/dist/opencode/hooks.d.ts +9 -0
  55. package/dist/opencode/hooks.d.ts.map +1 -0
  56. package/dist/opencode/hooks.js +583 -0
  57. package/dist/opencode/hooks.js.map +1 -0
  58. package/dist/opencode/router/categories.d.ts +31 -0
  59. package/dist/opencode/router/categories.d.ts.map +1 -0
  60. package/dist/opencode/router/categories.js +165 -0
  61. package/dist/opencode/router/categories.js.map +1 -0
  62. package/dist/opencode/router/embeddings.d.ts +41 -0
  63. package/dist/opencode/router/embeddings.d.ts.map +1 -0
  64. package/dist/opencode/router/embeddings.js +136 -0
  65. package/dist/opencode/router/embeddings.js.map +1 -0
  66. package/dist/opencode/router/graph-state-snapshot.d.ts +35 -0
  67. package/dist/opencode/router/graph-state-snapshot.d.ts.map +1 -0
  68. package/dist/opencode/router/graph-state-snapshot.js +129 -0
  69. package/dist/opencode/router/graph-state-snapshot.js.map +1 -0
  70. package/dist/opencode/router/index.d.ts +21 -0
  71. package/dist/opencode/router/index.d.ts.map +1 -0
  72. package/dist/opencode/router/index.js +23 -0
  73. package/dist/opencode/router/index.js.map +1 -0
  74. package/dist/opencode/router/intent-classifier.d.ts +35 -0
  75. package/dist/opencode/router/intent-classifier.d.ts.map +1 -0
  76. package/dist/opencode/router/intent-classifier.js +108 -0
  77. package/dist/opencode/router/intent-classifier.js.map +1 -0
  78. package/dist/opencode/router/semantic-nudge.d.ts +42 -0
  79. package/dist/opencode/router/semantic-nudge.d.ts.map +1 -0
  80. package/dist/opencode/router/semantic-nudge.js +73 -0
  81. package/dist/opencode/router/semantic-nudge.js.map +1 -0
  82. package/dist/opencode/router/state-gate.d.ts +25 -0
  83. package/dist/opencode/router/state-gate.d.ts.map +1 -0
  84. package/dist/opencode/router/state-gate.js +178 -0
  85. package/dist/opencode/router/state-gate.js.map +1 -0
  86. package/dist/opencode/router/tool-embeddings.d.ts +36 -0
  87. package/dist/opencode/router/tool-embeddings.d.ts.map +1 -0
  88. package/dist/opencode/router/tool-embeddings.js +140 -0
  89. package/dist/opencode/router/tool-embeddings.js.map +1 -0
  90. package/dist/opencode/router/tool-registry.d.ts +45 -0
  91. package/dist/opencode/router/tool-registry.d.ts.map +1 -0
  92. package/dist/opencode/router/tool-registry.js +103 -0
  93. package/dist/opencode/router/tool-registry.js.map +1 -0
  94. package/dist/opencode/router/tool-taxonomy.d.ts +51 -0
  95. package/dist/opencode/router/tool-taxonomy.d.ts.map +1 -0
  96. package/dist/opencode/router/tool-taxonomy.js +250 -0
  97. package/dist/opencode/router/tool-taxonomy.js.map +1 -0
  98. package/dist/opencode/router/tools-composite.d.ts +21 -0
  99. package/dist/opencode/router/tools-composite.d.ts.map +1 -0
  100. package/dist/opencode/router/tools-composite.js +684 -0
  101. package/dist/opencode/router/tools-composite.js.map +1 -0
  102. package/dist/opencode/shell-hooks.d.ts +7 -0
  103. package/dist/opencode/shell-hooks.d.ts.map +1 -0
  104. package/dist/opencode/shell-hooks.js +96 -0
  105. package/dist/opencode/shell-hooks.js.map +1 -0
  106. package/dist/opencode/system-prompt.d.ts +10 -0
  107. package/dist/opencode/system-prompt.d.ts.map +1 -0
  108. package/dist/opencode/system-prompt.js +600 -0
  109. package/dist/opencode/system-prompt.js.map +1 -0
  110. package/dist/opencode/tools.d.ts +8 -0
  111. package/dist/opencode/tools.d.ts.map +1 -0
  112. package/dist/opencode/tools.js +3731 -0
  113. package/dist/opencode/tools.js.map +1 -0
  114. package/dist/opencode/workflows/chains.d.ts +52 -0
  115. package/dist/opencode/workflows/chains.d.ts.map +1 -0
  116. package/dist/opencode/workflows/chains.js +170 -0
  117. package/dist/opencode/workflows/chains.js.map +1 -0
  118. package/dist/opencode/workflows/executor.d.ts +52 -0
  119. package/dist/opencode/workflows/executor.d.ts.map +1 -0
  120. package/dist/opencode/workflows/executor.js +130 -0
  121. package/dist/opencode/workflows/executor.js.map +1 -0
  122. package/dist/opencode/workflows/index.d.ts +14 -0
  123. package/dist/opencode/workflows/index.d.ts.map +1 -0
  124. package/dist/opencode/workflows/index.js +15 -0
  125. package/dist/opencode/workflows/index.js.map +1 -0
  126. package/dist/opencode/workflows/tools-workflow.d.ts +24 -0
  127. package/dist/opencode/workflows/tools-workflow.d.ts.map +1 -0
  128. package/dist/opencode/workflows/tools-workflow.js +85 -0
  129. package/dist/opencode/workflows/tools-workflow.js.map +1 -0
  130. package/dist/opencode/workflows/types.d.ts +32 -0
  131. package/dist/opencode/workflows/types.d.ts.map +1 -0
  132. package/dist/opencode/workflows/types.js +13 -0
  133. package/dist/opencode/workflows/types.js.map +1 -0
  134. package/dist/sdd/analysis/compliance.d.ts +30 -0
  135. package/dist/sdd/analysis/compliance.d.ts.map +1 -0
  136. package/dist/sdd/analysis/compliance.js +251 -0
  137. package/dist/sdd/analysis/compliance.js.map +1 -0
  138. package/dist/sdd/analysis/scalability.d.ts +15 -0
  139. package/dist/sdd/analysis/scalability.d.ts.map +1 -0
  140. package/dist/sdd/analysis/scalability.js +72 -0
  141. package/dist/sdd/analysis/scalability.js.map +1 -0
  142. package/dist/sdd/analysis/security.d.ts +25 -0
  143. package/dist/sdd/analysis/security.d.ts.map +1 -0
  144. package/dist/sdd/analysis/security.js +94 -0
  145. package/dist/sdd/analysis/security.js.map +1 -0
  146. package/dist/sdd/brownfield/scanner.d.ts +31 -0
  147. package/dist/sdd/brownfield/scanner.d.ts.map +1 -0
  148. package/dist/sdd/brownfield/scanner.js +228 -0
  149. package/dist/sdd/brownfield/scanner.js.map +1 -0
  150. package/dist/sdd/cache/manager.d.ts +237 -0
  151. package/dist/sdd/cache/manager.d.ts.map +1 -0
  152. package/dist/sdd/cache/manager.js +770 -0
  153. package/dist/sdd/cache/manager.js.map +1 -0
  154. package/dist/sdd/cache/snapshot-store.d.ts +39 -0
  155. package/dist/sdd/cache/snapshot-store.d.ts.map +1 -0
  156. package/dist/sdd/cache/snapshot-store.js +156 -0
  157. package/dist/sdd/cache/snapshot-store.js.map +1 -0
  158. package/dist/sdd/changes/manager.d.ts +58 -0
  159. package/dist/sdd/changes/manager.d.ts.map +1 -0
  160. package/dist/sdd/changes/manager.js +235 -0
  161. package/dist/sdd/changes/manager.js.map +1 -0
  162. package/dist/sdd/cicd/generators.d.ts +16 -0
  163. package/dist/sdd/cicd/generators.d.ts.map +1 -0
  164. package/dist/sdd/cicd/generators.js +1042 -0
  165. package/dist/sdd/cicd/generators.js.map +1 -0
  166. package/dist/sdd/code-quality/complexity.d.ts +38 -0
  167. package/dist/sdd/code-quality/complexity.d.ts.map +1 -0
  168. package/dist/sdd/code-quality/complexity.js +161 -0
  169. package/dist/sdd/code-quality/complexity.js.map +1 -0
  170. package/dist/sdd/code-quality/conventions.d.ts +33 -0
  171. package/dist/sdd/code-quality/conventions.d.ts.map +1 -0
  172. package/dist/sdd/code-quality/conventions.js +193 -0
  173. package/dist/sdd/code-quality/conventions.js.map +1 -0
  174. package/dist/sdd/code-quality/dependencies.d.ts +27 -0
  175. package/dist/sdd/code-quality/dependencies.d.ts.map +1 -0
  176. package/dist/sdd/code-quality/dependencies.js +142 -0
  177. package/dist/sdd/code-quality/dependencies.js.map +1 -0
  178. package/dist/sdd/code-quality/import-analyzer.d.ts +49 -0
  179. package/dist/sdd/code-quality/import-analyzer.d.ts.map +1 -0
  180. package/dist/sdd/code-quality/import-analyzer.js +213 -0
  181. package/dist/sdd/code-quality/import-analyzer.js.map +1 -0
  182. package/dist/sdd/code-quality/metrics.d.ts +35 -0
  183. package/dist/sdd/code-quality/metrics.d.ts.map +1 -0
  184. package/dist/sdd/code-quality/metrics.js +172 -0
  185. package/dist/sdd/code-quality/metrics.js.map +1 -0
  186. package/dist/sdd/code-quality/smells.d.ts +38 -0
  187. package/dist/sdd/code-quality/smells.d.ts.map +1 -0
  188. package/dist/sdd/code-quality/smells.js +319 -0
  189. package/dist/sdd/code-quality/smells.js.map +1 -0
  190. package/dist/sdd/code-quality/symbol-parser.d.ts +28 -0
  191. package/dist/sdd/code-quality/symbol-parser.d.ts.map +1 -0
  192. package/dist/sdd/code-quality/symbol-parser.js +230 -0
  193. package/dist/sdd/code-quality/symbol-parser.js.map +1 -0
  194. package/dist/sdd/code-quality/usage-tracker.d.ts +59 -0
  195. package/dist/sdd/code-quality/usage-tracker.d.ts.map +1 -0
  196. package/dist/sdd/code-quality/usage-tracker.js +402 -0
  197. package/dist/sdd/code-quality/usage-tracker.js.map +1 -0
  198. package/dist/sdd/code-quality/utils.d.ts +6 -0
  199. package/dist/sdd/code-quality/utils.d.ts.map +1 -0
  200. package/dist/sdd/code-quality/utils.js +14 -0
  201. package/dist/sdd/code-quality/utils.js.map +1 -0
  202. package/dist/sdd/codegen/generator.d.ts +42 -0
  203. package/dist/sdd/codegen/generator.d.ts.map +1 -0
  204. package/dist/sdd/codegen/generator.js +1023 -0
  205. package/dist/sdd/codegen/generator.js.map +1 -0
  206. package/dist/sdd/constitution/validator.d.ts +37 -0
  207. package/dist/sdd/constitution/validator.d.ts.map +1 -0
  208. package/dist/sdd/constitution/validator.js +192 -0
  209. package/dist/sdd/constitution/validator.js.map +1 -0
  210. package/dist/sdd/cost/estimator.d.ts +31 -0
  211. package/dist/sdd/cost/estimator.d.ts.map +1 -0
  212. package/dist/sdd/cost/estimator.js +92 -0
  213. package/dist/sdd/cost/estimator.js.map +1 -0
  214. package/dist/sdd/coverage/tracker.d.ts +47 -0
  215. package/dist/sdd/coverage/tracker.d.ts.map +1 -0
  216. package/dist/sdd/coverage/tracker.js +251 -0
  217. package/dist/sdd/coverage/tracker.js.map +1 -0
  218. package/dist/sdd/disaster/recovery.d.ts +11 -0
  219. package/dist/sdd/disaster/recovery.d.ts.map +1 -0
  220. package/dist/sdd/disaster/recovery.js +55 -0
  221. package/dist/sdd/disaster/recovery.js.map +1 -0
  222. package/dist/sdd/discovery/adaptive.d.ts +14 -0
  223. package/dist/sdd/discovery/adaptive.d.ts.map +1 -0
  224. package/dist/sdd/discovery/adaptive.js +145 -0
  225. package/dist/sdd/discovery/adaptive.js.map +1 -0
  226. package/dist/sdd/discovery/briefing-analyzer.d.ts +66 -0
  227. package/dist/sdd/discovery/briefing-analyzer.d.ts.map +1 -0
  228. package/dist/sdd/discovery/briefing-analyzer.js +672 -0
  229. package/dist/sdd/discovery/briefing-analyzer.js.map +1 -0
  230. package/dist/sdd/discovery/briefing.d.ts +109 -0
  231. package/dist/sdd/discovery/briefing.d.ts.map +1 -0
  232. package/dist/sdd/discovery/briefing.js +617 -0
  233. package/dist/sdd/discovery/briefing.js.map +1 -0
  234. package/dist/sdd/discovery/graph-builder.d.ts +10 -0
  235. package/dist/sdd/discovery/graph-builder.d.ts.map +1 -0
  236. package/dist/sdd/discovery/graph-builder.js +510 -0
  237. package/dist/sdd/discovery/graph-builder.js.map +1 -0
  238. package/dist/sdd/documentation/generator.d.ts +7 -0
  239. package/dist/sdd/documentation/generator.d.ts.map +1 -0
  240. package/dist/sdd/documentation/generator.js +119 -0
  241. package/dist/sdd/documentation/generator.js.map +1 -0
  242. package/dist/sdd/domain/types.d.ts +460 -0
  243. package/dist/sdd/domain/types.d.ts.map +1 -0
  244. package/dist/sdd/domain/types.js +25 -0
  245. package/dist/sdd/domain/types.js.map +1 -0
  246. package/dist/sdd/drift/detector.d.ts +28 -0
  247. package/dist/sdd/drift/detector.d.ts.map +1 -0
  248. package/dist/sdd/drift/detector.js +379 -0
  249. package/dist/sdd/drift/detector.js.map +1 -0
  250. package/dist/sdd/drift/exclusion.d.ts +54 -0
  251. package/dist/sdd/drift/exclusion.d.ts.map +1 -0
  252. package/dist/sdd/drift/exclusion.js +179 -0
  253. package/dist/sdd/drift/exclusion.js.map +1 -0
  254. package/dist/sdd/drift/signals.d.ts +52 -0
  255. package/dist/sdd/drift/signals.d.ts.map +1 -0
  256. package/dist/sdd/drift/signals.js +470 -0
  257. package/dist/sdd/drift/signals.js.map +1 -0
  258. package/dist/sdd/enforcement/interceptor.d.ts +47 -0
  259. package/dist/sdd/enforcement/interceptor.d.ts.map +1 -0
  260. package/dist/sdd/enforcement/interceptor.js +365 -0
  261. package/dist/sdd/enforcement/interceptor.js.map +1 -0
  262. package/dist/sdd/enforcement/workflow-tracker.d.ts +66 -0
  263. package/dist/sdd/enforcement/workflow-tracker.d.ts.map +1 -0
  264. package/dist/sdd/enforcement/workflow-tracker.js +229 -0
  265. package/dist/sdd/enforcement/workflow-tracker.js.map +1 -0
  266. package/dist/sdd/graph/engine.d.ts +44 -0
  267. package/dist/sdd/graph/engine.d.ts.map +1 -0
  268. package/dist/sdd/graph/engine.js +203 -0
  269. package/dist/sdd/graph/engine.js.map +1 -0
  270. package/dist/sdd/graph/index.d.ts +160 -0
  271. package/dist/sdd/graph/index.d.ts.map +1 -0
  272. package/dist/sdd/graph/index.js +624 -0
  273. package/dist/sdd/graph/index.js.map +1 -0
  274. package/dist/sdd/graph/integrity-guard.d.ts +129 -0
  275. package/dist/sdd/graph/integrity-guard.d.ts.map +1 -0
  276. package/dist/sdd/graph/integrity-guard.js +263 -0
  277. package/dist/sdd/graph/integrity-guard.js.map +1 -0
  278. package/dist/sdd/graph/integrity.d.ts +79 -0
  279. package/dist/sdd/graph/integrity.d.ts.map +1 -0
  280. package/dist/sdd/graph/integrity.js +462 -0
  281. package/dist/sdd/graph/integrity.js.map +1 -0
  282. package/dist/sdd/graph/pruner.d.ts +27 -0
  283. package/dist/sdd/graph/pruner.d.ts.map +1 -0
  284. package/dist/sdd/graph/pruner.js +203 -0
  285. package/dist/sdd/graph/pruner.js.map +1 -0
  286. package/dist/sdd/graph/traverse.d.ts +43 -0
  287. package/dist/sdd/graph/traverse.d.ts.map +1 -0
  288. package/dist/sdd/graph/traverse.js +265 -0
  289. package/dist/sdd/graph/traverse.js.map +1 -0
  290. package/dist/sdd/incidents/manager.d.ts +10 -0
  291. package/dist/sdd/incidents/manager.d.ts.map +1 -0
  292. package/dist/sdd/incidents/manager.js +63 -0
  293. package/dist/sdd/incidents/manager.js.map +1 -0
  294. package/dist/sdd/knowledge/transfer.d.ts +24 -0
  295. package/dist/sdd/knowledge/transfer.d.ts.map +1 -0
  296. package/dist/sdd/knowledge/transfer.js +94 -0
  297. package/dist/sdd/knowledge/transfer.js.map +1 -0
  298. package/dist/sdd/migrations/fixes.d.ts +2 -0
  299. package/dist/sdd/migrations/fixes.d.ts.map +1 -0
  300. package/dist/sdd/migrations/fixes.js +159 -0
  301. package/dist/sdd/migrations/fixes.js.map +1 -0
  302. package/dist/sdd/migrations/index.d.ts +2 -0
  303. package/dist/sdd/migrations/index.d.ts.map +1 -0
  304. package/dist/sdd/migrations/index.js +5 -0
  305. package/dist/sdd/migrations/index.js.map +1 -0
  306. package/dist/sdd/migrations/migration-runner.d.ts +41 -0
  307. package/dist/sdd/migrations/migration-runner.d.ts.map +1 -0
  308. package/dist/sdd/migrations/migration-runner.js +91 -0
  309. package/dist/sdd/migrations/migration-runner.js.map +1 -0
  310. package/dist/sdd/monitoring/setup.d.ts +40 -0
  311. package/dist/sdd/monitoring/setup.d.ts.map +1 -0
  312. package/dist/sdd/monitoring/setup.js +177 -0
  313. package/dist/sdd/monitoring/setup.js.map +1 -0
  314. package/dist/sdd/monitoring/telemetry.d.ts +18 -0
  315. package/dist/sdd/monitoring/telemetry.d.ts.map +1 -0
  316. package/dist/sdd/monitoring/telemetry.js +37 -0
  317. package/dist/sdd/monitoring/telemetry.js.map +1 -0
  318. package/dist/sdd/patterns/anti-patterns.d.ts +21 -0
  319. package/dist/sdd/patterns/anti-patterns.d.ts.map +1 -0
  320. package/dist/sdd/patterns/anti-patterns.js +286 -0
  321. package/dist/sdd/patterns/anti-patterns.js.map +1 -0
  322. package/dist/sdd/patterns/ast-clones.d.ts +23 -0
  323. package/dist/sdd/patterns/ast-clones.d.ts.map +1 -0
  324. package/dist/sdd/patterns/ast-clones.js +171 -0
  325. package/dist/sdd/patterns/ast-clones.js.map +1 -0
  326. package/dist/sdd/patterns/config-drift.d.ts +16 -0
  327. package/dist/sdd/patterns/config-drift.d.ts.map +1 -0
  328. package/dist/sdd/patterns/config-drift.js +322 -0
  329. package/dist/sdd/patterns/config-drift.js.map +1 -0
  330. package/dist/sdd/patterns/contradictions.d.ts +38 -0
  331. package/dist/sdd/patterns/contradictions.d.ts.map +1 -0
  332. package/dist/sdd/patterns/contradictions.js +237 -0
  333. package/dist/sdd/patterns/contradictions.js.map +1 -0
  334. package/dist/sdd/patterns/learner.d.ts +49 -0
  335. package/dist/sdd/patterns/learner.d.ts.map +1 -0
  336. package/dist/sdd/patterns/learner.js +226 -0
  337. package/dist/sdd/patterns/learner.js.map +1 -0
  338. package/dist/sdd/permissions/access.d.ts +69 -0
  339. package/dist/sdd/permissions/access.d.ts.map +1 -0
  340. package/dist/sdd/permissions/access.js +333 -0
  341. package/dist/sdd/permissions/access.js.map +1 -0
  342. package/dist/sdd/persistence/repository.d.ts +60 -0
  343. package/dist/sdd/persistence/repository.d.ts.map +1 -0
  344. package/dist/sdd/persistence/repository.js +96 -0
  345. package/dist/sdd/persistence/repository.js.map +1 -0
  346. package/dist/sdd/persistence/sqlite.d.ts +122 -0
  347. package/dist/sdd/persistence/sqlite.d.ts.map +1 -0
  348. package/dist/sdd/persistence/sqlite.js +602 -0
  349. package/dist/sdd/persistence/sqlite.js.map +1 -0
  350. package/dist/sdd/persistence/yaml.d.ts +41 -0
  351. package/dist/sdd/persistence/yaml.d.ts.map +1 -0
  352. package/dist/sdd/persistence/yaml.js +382 -0
  353. package/dist/sdd/persistence/yaml.js.map +1 -0
  354. package/dist/sdd/promises/classifier.d.ts +48 -0
  355. package/dist/sdd/promises/classifier.d.ts.map +1 -0
  356. package/dist/sdd/promises/classifier.js +215 -0
  357. package/dist/sdd/promises/classifier.js.map +1 -0
  358. package/dist/sdd/promises/tracker.d.ts +20 -0
  359. package/dist/sdd/promises/tracker.d.ts.map +1 -0
  360. package/dist/sdd/promises/tracker.js +204 -0
  361. package/dist/sdd/promises/tracker.js.map +1 -0
  362. package/dist/sdd/quality/scorer.d.ts +44 -0
  363. package/dist/sdd/quality/scorer.d.ts.map +1 -0
  364. package/dist/sdd/quality/scorer.js +216 -0
  365. package/dist/sdd/quality/scorer.js.map +1 -0
  366. package/dist/sdd/rollback/manager.d.ts +45 -0
  367. package/dist/sdd/rollback/manager.d.ts.map +1 -0
  368. package/dist/sdd/rollback/manager.js +266 -0
  369. package/dist/sdd/rollback/manager.js.map +1 -0
  370. package/dist/sdd/session/handoff.d.ts +52 -0
  371. package/dist/sdd/session/handoff.d.ts.map +1 -0
  372. package/dist/sdd/session/handoff.js +264 -0
  373. package/dist/sdd/session/handoff.js.map +1 -0
  374. package/dist/sdd/sla/tracker.d.ts +11 -0
  375. package/dist/sdd/sla/tracker.d.ts.map +1 -0
  376. package/dist/sdd/sla/tracker.js +52 -0
  377. package/dist/sdd/sla/tracker.js.map +1 -0
  378. package/dist/sdd/sync/git-sync.d.ts +61 -0
  379. package/dist/sdd/sync/git-sync.d.ts.map +1 -0
  380. package/dist/sdd/sync/git-sync.js +297 -0
  381. package/dist/sdd/sync/git-sync.js.map +1 -0
  382. package/dist/sdd/toggle/state.d.ts +8 -0
  383. package/dist/sdd/toggle/state.d.ts.map +1 -0
  384. package/dist/sdd/toggle/state.js +32 -0
  385. package/dist/sdd/toggle/state.js.map +1 -0
  386. package/dist/sdd/transactions/manager.d.ts +12 -0
  387. package/dist/sdd/transactions/manager.d.ts.map +1 -0
  388. package/dist/sdd/transactions/manager.js +80 -0
  389. package/dist/sdd/transactions/manager.js.map +1 -0
  390. package/dist/sdd/validation/coverage-index.d.ts +117 -0
  391. package/dist/sdd/validation/coverage-index.d.ts.map +1 -0
  392. package/dist/sdd/validation/coverage-index.js +251 -0
  393. package/dist/sdd/validation/coverage-index.js.map +1 -0
  394. package/dist/sdd/validation/executable.d.ts +26 -0
  395. package/dist/sdd/validation/executable.d.ts.map +1 -0
  396. package/dist/sdd/validation/executable.js +122 -0
  397. package/dist/sdd/validation/executable.js.map +1 -0
  398. package/dist/sdd/validation/smart-validator.d.ts +53 -0
  399. package/dist/sdd/validation/smart-validator.d.ts.map +1 -0
  400. package/dist/sdd/validation/smart-validator.js +347 -0
  401. package/dist/sdd/validation/smart-validator.js.map +1 -0
  402. package/dist/sdd/validation/validator.d.ts +39 -0
  403. package/dist/sdd/validation/validator.d.ts.map +1 -0
  404. package/dist/sdd/validation/validator.js +512 -0
  405. package/dist/sdd/validation/validator.js.map +1 -0
  406. package/dist/sdd/workflow/exporter.d.ts +36 -0
  407. package/dist/sdd/workflow/exporter.d.ts.map +1 -0
  408. package/dist/sdd/workflow/exporter.js +112 -0
  409. package/dist/sdd/workflow/exporter.js.map +1 -0
  410. package/dist/sdd/workflows/ab-testing.d.ts +18 -0
  411. package/dist/sdd/workflows/ab-testing.d.ts.map +1 -0
  412. package/dist/sdd/workflows/ab-testing.js +67 -0
  413. package/dist/sdd/workflows/ab-testing.js.map +1 -0
  414. package/dist/sdd/workflows/bug-fix.d.ts +13 -0
  415. package/dist/sdd/workflows/bug-fix.d.ts.map +1 -0
  416. package/dist/sdd/workflows/bug-fix.js +65 -0
  417. package/dist/sdd/workflows/bug-fix.js.map +1 -0
  418. package/dist/sdd/workflows/data-migration.d.ts +14 -0
  419. package/dist/sdd/workflows/data-migration.d.ts.map +1 -0
  420. package/dist/sdd/workflows/data-migration.js +68 -0
  421. package/dist/sdd/workflows/data-migration.js.map +1 -0
  422. package/dist/sdd/workflows/deprecation.d.ts +15 -0
  423. package/dist/sdd/workflows/deprecation.d.ts.map +1 -0
  424. package/dist/sdd/workflows/deprecation.js +68 -0
  425. package/dist/sdd/workflows/deprecation.js.map +1 -0
  426. package/dist/sdd/workflows/feature-flags.d.ts +14 -0
  427. package/dist/sdd/workflows/feature-flags.d.ts.map +1 -0
  428. package/dist/sdd/workflows/feature-flags.js +73 -0
  429. package/dist/sdd/workflows/feature-flags.js.map +1 -0
  430. package/dist/sdd/workflows/hotfix.d.ts +13 -0
  431. package/dist/sdd/workflows/hotfix.d.ts.map +1 -0
  432. package/dist/sdd/workflows/hotfix.js +67 -0
  433. package/dist/sdd/workflows/hotfix.js.map +1 -0
  434. package/dist/sdd/workflows/multi-tenancy.d.ts +13 -0
  435. package/dist/sdd/workflows/multi-tenancy.d.ts.map +1 -0
  436. package/dist/sdd/workflows/multi-tenancy.js +68 -0
  437. package/dist/sdd/workflows/multi-tenancy.js.map +1 -0
  438. package/dist/sdd/workflows/onboarding.d.ts +7 -0
  439. package/dist/sdd/workflows/onboarding.d.ts.map +1 -0
  440. package/dist/sdd/workflows/onboarding.js +43 -0
  441. package/dist/sdd/workflows/onboarding.js.map +1 -0
  442. package/dist/sdd/workflows/refactoring.d.ts +14 -0
  443. package/dist/sdd/workflows/refactoring.d.ts.map +1 -0
  444. package/dist/sdd/workflows/refactoring.js +73 -0
  445. package/dist/sdd/workflows/refactoring.js.map +1 -0
  446. package/dist/server/events.d.ts +64 -0
  447. package/dist/server/events.d.ts.map +1 -0
  448. package/dist/server/events.js +149 -0
  449. package/dist/server/events.js.map +1 -0
  450. package/dist/server/server.d.ts +33 -0
  451. package/dist/server/server.d.ts.map +1 -0
  452. package/dist/server/server.js +1019 -0
  453. package/dist/server/server.js.map +1 -0
  454. package/marketplace.json +39 -0
  455. package/package.json +65 -0
  456. package/src/code-intelligence/analyzer.ts +350 -0
  457. package/src/code-intelligence/ast/cache.ts +61 -0
  458. package/src/code-intelligence/ast/common.ts +62 -0
  459. package/src/code-intelligence/ast/component.ts +39 -0
  460. package/src/code-intelligence/ast/fallback.ts +44 -0
  461. package/src/code-intelligence/ast/index.ts +4 -0
  462. package/src/code-intelligence/ast/ir.ts +91 -0
  463. package/src/code-intelligence/ast/metrics.ts +65 -0
  464. package/src/code-intelligence/ast/registry.ts +28 -0
  465. package/src/code-intelligence/ast/tree-sitter.ts +226 -0
  466. package/src/code-intelligence/ast/typescript.ts +140 -0
  467. package/src/index.ts +22 -0
  468. package/src/mcp/server.ts +77 -0
  469. package/src/opencode/hooks.ts +728 -0
  470. package/src/opencode/router/categories.ts +192 -0
  471. package/src/opencode/router/embeddings.ts +149 -0
  472. package/src/opencode/router/graph-state-snapshot.ts +163 -0
  473. package/src/opencode/router/index.ts +44 -0
  474. package/src/opencode/router/intent-classifier.ts +140 -0
  475. package/src/opencode/router/semantic-nudge.ts +89 -0
  476. package/src/opencode/router/state-gate.ts +192 -0
  477. package/src/opencode/router/tool-embeddings.ts +162 -0
  478. package/src/opencode/router/tool-registry.ts +135 -0
  479. package/src/opencode/router/tool-taxonomy.ts +284 -0
  480. package/src/opencode/router/tools-composite.ts +685 -0
  481. package/src/opencode/shell-hooks.ts +115 -0
  482. package/src/opencode/system-prompt.ts +617 -0
  483. package/src/opencode/tools.ts +4102 -0
  484. package/src/opencode/workflows/chains.ts +205 -0
  485. package/src/opencode/workflows/executor.ts +172 -0
  486. package/src/opencode/workflows/index.ts +21 -0
  487. package/src/opencode/workflows/tools-workflow.ts +91 -0
  488. package/src/opencode/workflows/types.ts +42 -0
  489. package/src/sdd/analysis/compliance.ts +279 -0
  490. package/src/sdd/analysis/scalability.ts +97 -0
  491. package/src/sdd/analysis/security.ts +135 -0
  492. package/src/sdd/brownfield/scanner.ts +276 -0
  493. package/src/sdd/cache/manager.ts +899 -0
  494. package/src/sdd/cache/snapshot-store.ts +185 -0
  495. package/src/sdd/changes/manager.ts +326 -0
  496. package/src/sdd/cicd/generators.ts +1095 -0
  497. package/src/sdd/code-quality/complexity.ts +235 -0
  498. package/src/sdd/code-quality/conventions.ts +220 -0
  499. package/src/sdd/code-quality/dependencies.ts +203 -0
  500. package/src/sdd/code-quality/import-analyzer.ts +294 -0
  501. package/src/sdd/code-quality/metrics.ts +232 -0
  502. package/src/sdd/code-quality/smells.ts +415 -0
  503. package/src/sdd/code-quality/symbol-parser.ts +335 -0
  504. package/src/sdd/code-quality/usage-tracker.ts +527 -0
  505. package/src/sdd/code-quality/utils.ts +13 -0
  506. package/src/sdd/codegen/generator.ts +1181 -0
  507. package/src/sdd/constitution/validator.ts +253 -0
  508. package/src/sdd/cost/estimator.ts +147 -0
  509. package/src/sdd/coverage/tracker.ts +342 -0
  510. package/src/sdd/disaster/recovery.ts +79 -0
  511. package/src/sdd/discovery/adaptive.ts +167 -0
  512. package/src/sdd/discovery/briefing-analyzer.ts +802 -0
  513. package/src/sdd/discovery/briefing.ts +770 -0
  514. package/src/sdd/discovery/graph-builder.ts +598 -0
  515. package/src/sdd/documentation/generator.ts +158 -0
  516. package/src/sdd/domain/types.ts +658 -0
  517. package/src/sdd/drift/detector.ts +465 -0
  518. package/src/sdd/drift/exclusion.ts +223 -0
  519. package/src/sdd/drift/signals.ts +577 -0
  520. package/src/sdd/enforcement/interceptor.ts +444 -0
  521. package/src/sdd/enforcement/workflow-tracker.ts +263 -0
  522. package/src/sdd/graph/engine.ts +277 -0
  523. package/src/sdd/graph/index.ts +700 -0
  524. package/src/sdd/graph/integrity-guard.ts +348 -0
  525. package/src/sdd/graph/integrity.ts +628 -0
  526. package/src/sdd/graph/pruner.ts +221 -0
  527. package/src/sdd/graph/traverse.ts +331 -0
  528. package/src/sdd/incidents/manager.ts +87 -0
  529. package/src/sdd/knowledge/transfer.ts +140 -0
  530. package/src/sdd/migrations/fixes.ts +154 -0
  531. package/src/sdd/migrations/index.ts +14 -0
  532. package/src/sdd/migrations/migration-runner.ts +118 -0
  533. package/src/sdd/monitoring/setup.ts +237 -0
  534. package/src/sdd/monitoring/telemetry.ts +44 -0
  535. package/src/sdd/patterns/anti-patterns.ts +333 -0
  536. package/src/sdd/patterns/ast-clones.ts +214 -0
  537. package/src/sdd/patterns/config-drift.ts +346 -0
  538. package/src/sdd/patterns/contradictions.ts +323 -0
  539. package/src/sdd/patterns/learner.ts +266 -0
  540. package/src/sdd/permissions/access.ts +478 -0
  541. package/src/sdd/persistence/repository.ts +166 -0
  542. package/src/sdd/persistence/sqlite.ts +703 -0
  543. package/src/sdd/persistence/yaml.ts +409 -0
  544. package/src/sdd/promises/classifier.ts +253 -0
  545. package/src/sdd/promises/tracker.ts +258 -0
  546. package/src/sdd/quality/scorer.ts +263 -0
  547. package/src/sdd/rollback/manager.ts +361 -0
  548. package/src/sdd/session/handoff.ts +354 -0
  549. package/src/sdd/sla/tracker.ts +68 -0
  550. package/src/sdd/sync/git-sync.ts +401 -0
  551. package/src/sdd/toggle/state.ts +38 -0
  552. package/src/sdd/transactions/manager.ts +93 -0
  553. package/src/sdd/validation/coverage-index.ts +339 -0
  554. package/src/sdd/validation/executable.ts +127 -0
  555. package/src/sdd/validation/smart-validator.ts +470 -0
  556. package/src/sdd/validation/validator.ts +641 -0
  557. package/src/sdd/workflow/exporter.ts +169 -0
  558. package/src/sdd/workflows/ab-testing.ts +90 -0
  559. package/src/sdd/workflows/bug-fix.ts +81 -0
  560. package/src/sdd/workflows/data-migration.ts +86 -0
  561. package/src/sdd/workflows/deprecation.ts +87 -0
  562. package/src/sdd/workflows/feature-flags.ts +91 -0
  563. package/src/sdd/workflows/hotfix.ts +83 -0
  564. package/src/sdd/workflows/multi-tenancy.ts +84 -0
  565. package/src/sdd/workflows/onboarding.ts +82 -0
  566. package/src/sdd/workflows/refactoring.ts +90 -0
  567. package/src/server/events.ts +184 -0
  568. package/src/server/server.ts +1088 -0
@@ -0,0 +1,728 @@
1
+ import type { Hooks } from "@opencode-ai/plugin"
2
+ import { createRepository } from "../sdd/persistence/repository.js"
3
+ import { SDD_CORE_SYSTEM_PROMPT, buildSddContextPack } from "./system-prompt.js"
4
+ import { detectDrift } from "../sdd/drift/detector.js"
5
+ import { validateGraph } from "../sdd/validation/validator.js"
6
+ import { getPendingChanges } from "../sdd/changes/manager.js"
7
+ import { isSddEnabled, setToggleState, getToggleState } from "../sdd/toggle/state.js"
8
+ import { generateHandoff, formatHandoffPack, computeGraphHealth } from "../sdd/session/handoff.js"
9
+ import { checkPermission, getUserRoleWithAuth, addAuditEntry } from "../sdd/permissions/access.js"
10
+ import { createSnapshot } from "../sdd/rollback/manager.js"
11
+ import { extractPromises } from "../sdd/promises/tracker.js"
12
+ import { calculateCoverage } from "../sdd/coverage/tracker.js"
13
+ import { getCacheManager } from "../sdd/cache/manager.js"
14
+ import { checkToolAccess, resetWorkflowState, getWorkflowState, markSpecUpdated } from "../sdd/enforcement/workflow-tracker.js"
15
+ import { formatNudgeInput } from "./router/semantic-nudge.js"
16
+ import { getToolsForSession } from "./router/tool-registry.js"
17
+ import { invalidateSnapshotCache } from "./router/graph-state-snapshot.js"
18
+ import { runMigrations, hasPendingMigrations } from "../sdd/migrations/index.js"
19
+
20
+ const SDD_FILE_PATTERNS = [
21
+ /\.ts$/,
22
+ /\.tsx$/,
23
+ /\.js$/,
24
+ /\.jsx$/,
25
+ /\.py$/,
26
+ /\.go$/,
27
+ /\.rs$/,
28
+ /\.java$/,
29
+ /\.rb$/,
30
+ /\.vue$/,
31
+ /\.svelte$/,
32
+ ]
33
+
34
+ const SDD_EXCLUDED_PATTERNS = [
35
+ /node_modules/,
36
+ /\.sdd\//,
37
+ /dist\//,
38
+ /build\//,
39
+ /\.git\//,
40
+ /\.opencode\//,
41
+ /package\.json/,
42
+ /tsconfig\.json/,
43
+ /\.env/,
44
+ ]
45
+
46
+ /**
47
+ * Patterns that indicate a shell command is writing source files.
48
+ * Used to enforce SDD-first even when agents try to bypass via run_terminal_command.
49
+ */
50
+ const SRC_EXT = /\.(?:ts|tsx|js|jsx|mjs|mts|py|go|rs|java|rb|vue|svelte|c|cpp|h|hpp|cs|swift|kt)$/
51
+ const SRC_FILE = /([^\s>"]+\.(?:ts|tsx|js|jsx|mjs|mts|py|go|rs|java|rb|vue|svelte|c|cpp|h|hpp|cs|swift|kt))/
52
+
53
+ const SHELL_WRITE_PATTERNS: Array<{ pattern: RegExp; extractor: (match: RegExpMatchArray) => string[] }> = [
54
+ // open('file','w').write(...) pattern (primary detection for python heredocs and -c)
55
+ {
56
+ pattern: /open\(['"]([^'"]+)['"]/g,
57
+ extractor: (m) => [m[1]],
58
+ },
59
+ // node -e "fs.writeFileSync('file',...)"
60
+ {
61
+ pattern: /node\s+(-e|--eval)\s+['"].*writeFile(?:Sync)?\s*\(\s*['"]([^'"]+)['"]/,
62
+ extractor: (m) => [m[2]],
63
+ },
64
+ // touch file.ts (creates new files)
65
+ {
66
+ pattern: /touch\s+(\S+\.\w+)/,
67
+ extractor: (m) => [m[1]],
68
+ },
69
+ // install [options] source dest.ts (copies/creates files)
70
+ {
71
+ pattern: /install\s+(?:[^\s]+\s+)*?(\S+\.\w+)\s*$/,
72
+ extractor: (m) => [m[1]],
73
+ },
74
+ // dd if=... of=file.ts
75
+ {
76
+ pattern: /dd\s+.*of=([^\s>]+)/,
77
+ extractor: (m) => [m[1]],
78
+ },
79
+ // truncate -s 0 file.ts or truncate --size=0 file.ts
80
+ {
81
+ pattern: /truncate\s+(?:\S+\s+)*?(\S+\.\w+)$/,
82
+ extractor: (m) => [m[1]],
83
+ },
84
+ // Generic shell redirect: any command > file.ts or >> file.ts
85
+ {
86
+ pattern: />\s*(\S+\.\w+)/,
87
+ extractor: (m) => [m[1]],
88
+ },
89
+ // sed -i 's/...' file.ts
90
+ {
91
+ pattern: /sed\s+(-i[^\s]*|--in-place)\s+['"][^"]*['"]\s+([^\s]+)/,
92
+ extractor: (m) => [m[2]],
93
+ },
94
+ // mv/rename to source file
95
+ {
96
+ pattern: /mv\s+\S+\s+(\S+\.\w+)/,
97
+ extractor: (m) => [m[1]],
98
+ },
99
+ // cp source dest (copying to source file)
100
+ {
101
+ pattern: /cp\s+\S+\s+(\S+\.\w+)/,
102
+ extractor: (m) => [m[1]],
103
+ },
104
+ // tee file.ts
105
+ {
106
+ pattern: /tee\s+(?:-a\s+)?(\S+\.\w+)/,
107
+ extractor: (m) => [m[1]],
108
+ },
109
+ ]
110
+
111
+ /**
112
+ * Detect if a shell command attempts to write source code files.
113
+ * Returns extracted file paths that match source patterns.
114
+ * Exported for testing.
115
+ */
116
+ export function detectShellFileWrites(command: string): string[] {
117
+ const files: string[] = []
118
+
119
+ for (const { pattern, extractor } of SHELL_WRITE_PATTERNS) {
120
+ // Reset lastIndex for global patterns
121
+ pattern.lastIndex = 0
122
+
123
+ if (pattern.global) {
124
+ let match: RegExpMatchArray | null
125
+ while ((match = pattern.exec(command)) !== null) {
126
+ const paths = extractor(match)
127
+ for (const p of paths) { if (p && SRC_EXT.test(p) &&
128
+ !SDD_EXCLUDED_PATTERNS.some((ep) => ep.test(p))) {
129
+ files.push(p)
130
+ }
131
+ }
132
+ }
133
+ } else {
134
+ const match = command.match(pattern)
135
+ if (match) {
136
+ const paths = extractor(match)
137
+ for (const p of paths) {
138
+ if (p && SRC_EXT.test(p) &&
139
+ !SDD_EXCLUDED_PATTERNS.some((ep) => ep.test(p))) {
140
+ files.push(p)
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
146
+
147
+ // Also detect heredoc-style writes (python3 - <<'EOF' ... open('file','w') ... EOF)
148
+ // These are multi-line patterns; the command string may contain newlines
149
+ if (/python[3]?\s+\-/.test(command) || /node\s+(-e|--eval)/.test(command)) {
150
+ // Extract all open('file','w') or writeFileSync calls
151
+ const openPattern = /open\(['"]([^'"]+)['"]/g
152
+ let match: RegExpMatchArray | null
153
+ while ((match = openPattern.exec(command)) !== null) {
154
+ const p = match[1]
155
+ if (p && SRC_EXT.test(p) &&
156
+ !SDD_EXCLUDED_PATTERNS.some((ep) => ep.test(p))) {
157
+ if (!files.includes(p)) files.push(p)
158
+ }
159
+ }
160
+
161
+ const writePattern = /writeFile(?:Sync)?\s*\(\s*['"]([^'"]+)['"]/g
162
+ while ((match = writePattern.exec(command)) !== null) {
163
+ const p = match[1]
164
+ if (p && SRC_EXT.test(p) &&
165
+ !SDD_EXCLUDED_PATTERNS.some((ep) => ep.test(p))) {
166
+ if (!files.includes(p)) files.push(p)
167
+ }
168
+ }
169
+ }
170
+
171
+ return [...new Set(files)]
172
+ }
173
+
174
+ export function createSddHooks(): Hooks {
175
+ let systemInjected = false
176
+
177
+ return {
178
+ "experimental.chat.system.transform": async (_input, output) => {
179
+ if (systemInjected) return
180
+ if (!isSddEnabled(process.cwd())) return
181
+
182
+ // Run pending migrations on first load
183
+ if (hasPendingMigrations(process.cwd())) {
184
+ try {
185
+ const migrationResults = runMigrations(process.cwd())
186
+ const successful = migrationResults.filter(r => r.success)
187
+ if (successful.length > 0) {
188
+ output.system.push(`## 🔄 opencode-telos Migrations: ${successful.length} fix(es) applied`)
189
+ }
190
+ } catch (err) {
191
+ // Don't block system init on migration errors
192
+ console.error("[opencode-telos] Migration error:", err)
193
+ }
194
+ }
195
+
196
+ const repo = createRepository(process.cwd())
197
+ if (repo.isInitialized()) {
198
+ // Restore persistent cache from disk (cross-session)
199
+ const cacheMgr = getCacheManager(process.cwd())
200
+ cacheMgr.restoreFromPersistentCache()
201
+
202
+ output.system.push(SDD_CORE_SYSTEM_PROMPT)
203
+
204
+ // Tool Registry: injeta tools relevantes para o estado atual do grafo
205
+ try {
206
+ const { getGraphSnapshot } = await import("./router/graph-state-snapshot.js")
207
+ const snapshot = getGraphSnapshot(process.cwd())
208
+ const { formatGraphState } = await import("./router/graph-state-snapshot.js")
209
+ output.system.push(formatGraphState(snapshot))
210
+ } catch {}
211
+ try {
212
+ const graph = repo.loadGraph()
213
+
214
+ // Inject context pack for focused node info
215
+ const contextPack = buildSddContextPack(graph)
216
+ output.system.push(contextPack)
217
+
218
+ // Validation is cheap enough to expose blocking state. Drift, full
219
+ // health, promises, coverage and handoff are available on demand;
220
+ // running all of them at session start is expensive on large repos.
221
+ const validation = validateGraph(graph)
222
+ if (!validation.valid || validation.warnings.length > 0) {
223
+ const valLines = ["## SDD Validation"]
224
+ valLines.push(`**Valid:** ${validation.valid ? "✅" : "❌"}`)
225
+ if (validation.errors.length > 0) valLines.push(`**Errors:** ${validation.errors.length}`)
226
+ if (validation.warnings.length > 0) valLines.push(`**Warnings:** ${validation.warnings.length}`)
227
+ output.system.push(valLines.join("\n"))
228
+ }
229
+
230
+ // Inject pending changes summary
231
+ const pending = getPendingChanges(graph)
232
+ if (pending.length > 0) {
233
+ output.system.push(`## Pending Changes: ${pending.length} change(s) awaiting action`)
234
+ }
235
+
236
+ // G: Save graph snapshot to disk for fast cross-session restore
237
+ try {
238
+ const cacheMgrForSnapshot = getCacheManager(process.cwd())
239
+ cacheMgrForSnapshot.saveGraphSnapshot(graph)
240
+ } catch {}
241
+ } catch {
242
+ // Handoff is optional, don't fail if it can't be generated
243
+ }
244
+ // Persist cache to disk for cross-session reuse
245
+ try {
246
+ const cacheMgr = getCacheManager(process.cwd())
247
+ cacheMgr.persistToDisk()
248
+ } catch {}
249
+ systemInjected = true
250
+ }
251
+ },
252
+
253
+ "chat.message": async (_input, output) => {
254
+ if (!output.parts) return
255
+
256
+ for (const part of output.parts) {
257
+ if (part.type !== "text") continue
258
+
259
+ const text = part.text.trim()
260
+
261
+ // Detect /sdd commands
262
+ if (text === "/sdd on") {
263
+ const state = setToggleState(process.cwd(), true)
264
+ systemInjected = false
265
+ part.text = `✅ SDD enforcement **enabled** at ${state.changed_at}.\n\nSpec-Driven Development is now active. All code changes will go through the SDD workflow.`
266
+ return
267
+ }
268
+
269
+ if (text === "/sdd off") {
270
+ const state = setToggleState(process.cwd(), false)
271
+ systemInjected = false
272
+ resetWorkflowState()
273
+ part.text = `⏸️ SDD enforcement **disabled** at ${state.changed_at}.\n\nYou can now make code changes freely without SDD workflow. Use \`/sdd on\` to re-enable.`
274
+ return
275
+ }
276
+
277
+ if (text === "/sdd status") {
278
+ const state = getToggleState(process.cwd())
279
+ const status = state.enabled ? "🟢 ON" : "🔴 OFF"
280
+ part.text = `SDD Status: ${status}\nLast changed: ${state.changed_at}\n\nCommands: \`/sdd on\`, \`/sdd off\`, \`/sdd status\`, \`/sdd cache reset\``
281
+ return
282
+ }
283
+
284
+ // H: /sdd cache reset — full cache reset without killing the process
285
+ if (text === "/sdd cache reset") {
286
+ const cacheMgr = getCacheManager(process.cwd())
287
+ const result = cacheMgr.fullReset()
288
+ const lines = ["## 🧹 Cache Reset Complete"]
289
+ lines.push(`- Memory cache: ${result.cleared.memory ? "✅ cleared" : "⏭️ skipped"}`)
290
+ lines.push(`- Persistent cache: ${result.cleared.disk ? "✅ cleared" : "⏭️ no file"}`)
291
+ lines.push(`- Graph snapshot: ${result.cleared.snapshot ? "✅ cleared" : "⏭️ no snapshot"}`)
292
+ lines.push(`- Lock file: ${result.cleared.lock ? "✅ released" : "⏭️ no lock"}`)
293
+ lines.push(`\nInvalidation version: ${cacheMgr.getInvalidationVersion()}`)
294
+ lines.push("\nThe next tool call will recompute fresh results.")
295
+ part.text = lines.join("\n")
296
+ return
297
+ }
298
+
299
+ // Semantic nudge — replaces regex-based pattern detection
300
+ if (isSddEnabled(process.cwd())) {
301
+ const nudge = formatNudgeInput(text)
302
+ if (nudge) {
303
+ part.text += `\n\n${nudge}`
304
+ }
305
+ }
306
+ }
307
+ },
308
+
309
+ "tool.execute.before": async (input, output) => {
310
+ // Skip enforcement if SDD is disabled
311
+ if (!isSddEnabled(process.cwd())) return
312
+
313
+ // Enforce workflow context for SDD graph mutation tools
314
+ if (input.tool.startsWith("sdd.")) {
315
+ const access = checkToolAccess(input.tool)
316
+ if (!access.allowed) {
317
+ addAuditEntry(
318
+ process.cwd(),
319
+ process.env.USER || "current",
320
+ input.tool,
321
+ "graph",
322
+ "denied",
323
+ access.reason || "Workflow not active",
324
+ )
325
+ throw new Error(access.reason)
326
+ }
327
+ }
328
+
329
+ // Intercept shell commands that write source files (bypass prevention)
330
+ if (input.tool === "run_terminal_command") {
331
+ const command = output.args?.command || output.args?.cmd || ""
332
+ if (typeof command === "string" && command.length > 0) {
333
+ // ENFORCEMENT: Block shell writes to .sdd/ directory
334
+ if (command.includes(".sdd/") && (/[>]|writeFile|open\(['"].*['"],\s*['"]w/.test(command))) {
335
+ addAuditEntry(
336
+ process.cwd(),
337
+ process.env.USER || "current",
338
+ "shell_command",
339
+ ".sdd/",
340
+ "denied",
341
+ "Shell command writes to .sdd/ directory",
342
+ )
343
+ throw new Error(
344
+ [
345
+ `[SDD BLOCKED] Shell command detected that writes to .sdd/ directory.`,
346
+ ` Command: ${command.slice(0, 200)}`,
347
+ "",
348
+ "The Knowledge Graph can ONLY be modified through SDD tools.",
349
+ "Direct shell edits to .sdd/ are not allowed.",
350
+ ].join("\n"),
351
+ )
352
+ }
353
+
354
+ const detectedFiles = detectShellFileWrites(command)
355
+ if (detectedFiles.length > 0) {
356
+ const repo = createRepository(process.cwd())
357
+ if (!repo.isInitialized()) return
358
+
359
+ const graph = repo.loadGraph()
360
+
361
+ // Check spec nodes exist
362
+ const specNodeTypes = ["feature", "entity", "requirement", "architecture_component", "module"]
363
+ const hasSpecNodes = graph.nodes.some(n => specNodeTypes.includes(n.type))
364
+
365
+ if (!hasSpecNodes && graph.nodes.length > 0) {
366
+ addAuditEntry(
367
+ process.cwd(),
368
+ process.env.USER || "current",
369
+ "shell_command",
370
+ detectedFiles.join(", "),
371
+ "denied",
372
+ "Shell command writes source files without spec nodes",
373
+ )
374
+ throw new Error(
375
+ [
376
+ `[SDD BLOCKED] Shell command detected that writes source files:`,
377
+ ` Files: ${detectedFiles.join(", ")}`,
378
+ "",
379
+ "The Knowledge Graph has no feature, entity, requirement, or component nodes.",
380
+ "You MUST create specification nodes before writing code:",
381
+ "",
382
+ "1. Run sdd.discover to create features and entities",
383
+ "2. Run sdd.update_from_answers to populate the specification",
384
+ "3. THEN retry this write",
385
+ "",
386
+ "Or run sdd.full_cycle for the complete automated cycle.",
387
+ ].join("\n"),
388
+ )
389
+ }
390
+
391
+ // Check for approved Change node covering these files
392
+ const approvedChanges = getPendingChanges(graph).filter((c) => {
393
+ if (c.status !== "APPROVED") return false
394
+ const affectedFiles = c.metadata.affected_files || []
395
+ return detectedFiles.some((f) =>
396
+ affectedFiles.some((af: string) => f.includes(af) || af.includes(f))
397
+ )
398
+ })
399
+
400
+ if (approvedChanges.length === 0) {
401
+ addAuditEntry(
402
+ process.cwd(),
403
+ process.env.USER || "current",
404
+ "shell_command",
405
+ detectedFiles.join(", "),
406
+ "denied",
407
+ "No approved Change node for shell-written files",
408
+ )
409
+ throw new Error(
410
+ [
411
+ `[SDD BLOCKED] Shell command detected that writes source files without SDD approval:`,
412
+ ` Command: ${command.slice(0, 200)}`,
413
+ ` Files: ${detectedFiles.join(", ")}`,
414
+ "",
415
+ "Using shell commands to bypass SDD enforcement is not allowed.",
416
+ "You MUST follow the SDD workflow before writing code:",
417
+ "",
418
+ "1. Run sdd.enforce to classify and create a Change node",
419
+ "2. Run sdd.update_from_answers to update the specification",
420
+ "3. Run sdd.approve_change to approve the Change",
421
+ "4. THEN retry this write",
422
+ "",
423
+ "Or run sdd.full_cycle for the complete automated cycle.",
424
+ ].join("\n"),
425
+ )
426
+ }
427
+
428
+ // ENFORCEMENT: Require spec update before shell write
429
+ const shellWorkflow = getWorkflowState()
430
+ if (shellWorkflow.enforced && !shellWorkflow.specUpdated) {
431
+ addAuditEntry(
432
+ process.cwd(),
433
+ process.env.USER || "current",
434
+ "shell_command",
435
+ detectedFiles.join(", "),
436
+ "denied",
437
+ "SDD spec not updated after enforce",
438
+ )
439
+ throw new Error(
440
+ [
441
+ `[SDD BLOCKED] Cannot write code before updating the specification.`,
442
+ ` Files: ${detectedFiles.join(", ")}`,
443
+ ` Change: ${shellWorkflow.changeId}`,
444
+ "",
445
+ "After sdd.enforce, you MUST update the SDD graph BEFORE writing code:",
446
+ "",
447
+ "1. Run sdd.add_node to create feature/entity/business_rule nodes",
448
+ "2. Run sdd.update_from_answers to populate the specification",
449
+ "3. Run sdd.validate to verify the updated spec",
450
+ "4. THEN retry this write",
451
+ "",
452
+ "The SDD specification is the source of truth. Code must follow the spec, not the other way around.",
453
+ ].join("\n"),
454
+ )
455
+ }
456
+
457
+ // Approved — create snapshots
458
+ for (const change of approvedChanges) {
459
+ createSnapshot(graph, change.id, process.cwd())
460
+ }
461
+ addAuditEntry(
462
+ process.cwd(),
463
+ process.env.USER || "current",
464
+ "shell_command",
465
+ detectedFiles.join(", "),
466
+ "allowed",
467
+ `Approved changes: ${approvedChanges.map((c) => c.id).join(", ")}`,
468
+ )
469
+ return
470
+ }
471
+ }
472
+ }
473
+
474
+ // Intercept file write tools (Write, Edit) to enforce SDD-first
475
+ if (input.tool === "Write" || input.tool === "Edit") {
476
+ const filePath = output.args?.filePath || output.args?.path || ""
477
+
478
+ // ENFORCEMENT: Block direct writes to .sdd/ directory
479
+ // The SDD graph can ONLY be modified through sdd.* tools
480
+ if (filePath.includes(".sdd/")) {
481
+ addAuditEntry(
482
+ process.cwd(),
483
+ process.env.USER || "current",
484
+ input.tool,
485
+ filePath,
486
+ "denied",
487
+ "Direct .sdd/ modification blocked",
488
+ )
489
+ throw new Error(
490
+ [
491
+ `[SDD BLOCKED] Cannot write directly to .sdd/ directory.`,
492
+ ` File: ${filePath}`,
493
+ "",
494
+ "The Knowledge Graph can ONLY be modified through SDD tools:",
495
+ "- sdd.add_node / sdd.update_node / sdd.remove_node",
496
+ "- sdd.add_relationship / sdd.remove_relationship",
497
+ "- sdd.build_graph (initial setup)",
498
+ "",
499
+ "Direct file edits to .sdd/ are not allowed.",
500
+ ].join("\n"),
501
+ )
502
+ }
503
+
504
+ // Check if this is a source code file
505
+ const isSourceFile = SDD_FILE_PATTERNS.some((p) => p.test(filePath)) &&
506
+ !SDD_EXCLUDED_PATTERNS.some((p) => p.test(filePath))
507
+
508
+ if (!isSourceFile) return
509
+
510
+ // Check if SDD is initialized
511
+ const repo = createRepository(process.cwd())
512
+ if (!repo.isInitialized()) return
513
+
514
+ const graph = repo.loadGraph()
515
+
516
+ // Check if graph has required spec nodes before allowing code creation
517
+ const specNodeTypes = ["feature", "entity", "requirement", "architecture_component", "module"]
518
+ const hasSpecNodes = graph.nodes.some(n => specNodeTypes.includes(n.type))
519
+
520
+ if (!hasSpecNodes && graph.nodes.length > 0) {
521
+ addAuditEntry(
522
+ process.cwd(),
523
+ process.env.USER || "current",
524
+ "write_file",
525
+ filePath,
526
+ "denied",
527
+ "No spec nodes in graph",
528
+ )
529
+ throw new Error(
530
+ [
531
+ `[SDD BLOCKED] Cannot create code without specification.`,
532
+ "",
533
+ "The Knowledge Graph has no feature, entity, requirement, or component nodes.",
534
+ "You MUST create specification nodes before writing code:",
535
+ "",
536
+ "1. Run sdd.discover to create features and entities",
537
+ "2. Run sdd.update_from_answers to populate the specification",
538
+ "3. THEN retry this write",
539
+ "",
540
+ "Or run sdd.full_cycle for the complete automated cycle.",
541
+ ].join("\n"),
542
+ )
543
+ }
544
+
545
+ // Check permissions before allowing changes
546
+ const userRole = getUserRoleWithAuth(process.cwd(), process.env.USER || "current")
547
+ const hasPermission = checkPermission(userRole, "create_change", process.cwd())
548
+
549
+ if (!hasPermission) {
550
+ addAuditEntry(
551
+ process.cwd(),
552
+ process.env.USER || "current",
553
+ "write_file",
554
+ filePath,
555
+ "denied",
556
+ "Insufficient permissions",
557
+ )
558
+ throw new Error(
559
+ [
560
+ `[SDD PERMISSION DENIED] Cannot modify ${filePath}.`,
561
+ "",
562
+ `Your role (${userRole}) does not have permission to create changes.`,
563
+ "Contact an admin to grant you the 'create_change' permission.",
564
+ ].join("\n"),
565
+ )
566
+ }
567
+
568
+ // Find an approved Change node that covers this file
569
+ const approvedChanges = getPendingChanges(graph).filter((c) => {
570
+ if (c.status !== "APPROVED") return false
571
+ const files = c.metadata.affected_files || []
572
+ return files.some((f: string) => filePath.includes(f) || f.includes(filePath))
573
+ })
574
+
575
+ if (approvedChanges.length > 0) {
576
+ // ENFORCEMENT: Require spec update before code write
577
+ const workflow = getWorkflowState()
578
+ if (workflow.enforced && !workflow.specUpdated) {
579
+ addAuditEntry(
580
+ process.cwd(),
581
+ process.env.USER || "current",
582
+ "write_file",
583
+ filePath,
584
+ "denied",
585
+ "SDD spec not updated after enforce",
586
+ )
587
+ throw new Error(
588
+ [
589
+ `[SDD BLOCKED] Cannot write code before updating the specification.`,
590
+ ` File: ${filePath}`,
591
+ ` Change: ${workflow.changeId}`,
592
+ "",
593
+ "After sdd.enforce, you MUST update the SDD graph BEFORE writing code:",
594
+ "",
595
+ "1. Run sdd.add_node to create feature/entity/business_rule nodes",
596
+ "2. Run sdd.update_from_answers to populate the specification",
597
+ "3. Run sdd.validate to verify the updated spec",
598
+ "4. THEN retry this write",
599
+ "",
600
+ "The SDD specification is the source of truth. Code must follow the spec, not the other way around.",
601
+ ].join("\n"),
602
+ )
603
+ }
604
+
605
+ // Create snapshot before approving change
606
+ for (const change of approvedChanges) {
607
+ createSnapshot(graph, change.id, process.cwd())
608
+ }
609
+ addAuditEntry(
610
+ process.cwd(),
611
+ process.env.USER || "current",
612
+ "write_file",
613
+ filePath,
614
+ "allowed",
615
+ `Approved changes: ${approvedChanges.map((c) => c.id).join(", ")}`,
616
+ )
617
+ return
618
+ }
619
+
620
+ // File not covered by any approved Change → BLOCK the write
621
+ addAuditEntry(
622
+ process.cwd(),
623
+ process.env.USER || "current",
624
+ "write_file",
625
+ filePath,
626
+ "denied",
627
+ "No approved Change node",
628
+ )
629
+ throw new Error(
630
+ [
631
+ `[SDD BLOCKED] Cannot modify ${filePath}.`,
632
+ "",
633
+ "This file is not covered by an approved SDD Change node.",
634
+ "You MUST follow the SDD workflow before writing code:",
635
+ "",
636
+ "1. Run sdd.enforce to classify and create a Change node",
637
+ "2. Run sdd.update_from_answers to update the specification",
638
+ "3. Run sdd.approve_change to approve the Change",
639
+ "4. THEN retry this write",
640
+ "",
641
+ "Or run sdd.full_cycle for the complete automated cycle.",
642
+ ].join("\n"),
643
+ )
644
+ }
645
+ },
646
+
647
+ "tool.execute.after": async (input, output) => {
648
+ if (!input.tool.startsWith("sdd.")) return
649
+
650
+ const timestamp = new Date().toISOString()
651
+ if (output.metadata) {
652
+ output.metadata.sdd_tool = true
653
+ output.metadata.sdd_timestamp = timestamp
654
+ }
655
+
656
+ // Invalidate state snapshot cache after mutations
657
+ const mutationTools = [
658
+ "sdd.add_node", "sdd.update_node", "sdd.remove_node",
659
+ "sdd.add_relationship", "sdd.remove_relationship",
660
+ "sdd.build_graph", "sdd.update_from_answers",
661
+ "sdd.enforce", "sdd.approve_change", "sdd.complete_change",
662
+ "sdd.generate_code",
663
+ // Composite tools
664
+ "sdd.graph_mutation", "sdd.graph_admin",
665
+ "sdd.workflow_new_feature", "sdd.workflow_bug_fix",
666
+ "sdd.workflow_hotfix", "sdd.workflow_refactor",
667
+ "sdd.workflow_full_cycle",
668
+ ]
669
+ if (mutationTools.includes(input.tool)) {
670
+ invalidateSnapshotCache()
671
+ }
672
+
673
+ // Mark spec as updated when spec-mutating tools are called
674
+ const specMutationTools = new Set([
675
+ "sdd.add_node", "sdd.update_node", "sdd.remove_node",
676
+ "sdd.add_relationship", "sdd.remove_relationship",
677
+ "sdd.update_from_answers",
678
+ "sdd.build_graph",
679
+ "sdd.generate_code",
680
+ // Composite tools that update spec
681
+ "sdd.graph_mutation", "sdd.graph_admin",
682
+ "sdd.workflow_new_feature", "sdd.workflow_bug_fix",
683
+ "sdd.workflow_hotfix", "sdd.workflow_refactor",
684
+ "sdd.workflow_full_cycle",
685
+ ])
686
+ if (specMutationTools.has(input.tool)) {
687
+ markSpecUpdated()
688
+ }
689
+ },
690
+
691
+ "tool.definition": async (input, output) => {
692
+ if (!isSddEnabled(process.cwd())) return
693
+
694
+ // Inject SDD enforcement warning into run_terminal_command description
695
+ if (input.toolID === "run_terminal_command") {
696
+ const warning = [
697
+ "",
698
+ "",
699
+ "[SDD ENFORCEMENT] This tool is monitored. Any command that writes",
700
+ "source code files (.ts, .tsx, .js, .jsx, .py, .go, .rs, etc.)",
701
+ "WILL BE BLOCKED unless an approved SDD Change node covers those files.",
702
+ "",
703
+ "Use sdd.enforce BEFORE modifying code. Shell commands cannot",
704
+ "bypass SDD-first workflow.",
705
+ ].join("\n")
706
+ output.description = (output.description || "") + warning
707
+ }
708
+ },
709
+
710
+ "permission.ask": async (input, output) => {
711
+ const pattern = input.pattern
712
+ if (typeof pattern === "string" && pattern.includes("sdd.")) {
713
+ output.status = "allow"
714
+ } else if (Array.isArray(pattern) && pattern.some((p: string) => p.includes("sdd."))) {
715
+ output.status = "allow"
716
+ }
717
+ },
718
+
719
+ dispose: async () => {
720
+ // E: Persist cache and release resources on session end
721
+ try {
722
+ const cacheMgr = getCacheManager(process.cwd())
723
+ cacheMgr.persistToDisk()
724
+ cacheMgr.releaseWriteLock()
725
+ } catch {}
726
+ },
727
+ }
728
+ }