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,444 @@
1
+ import type { KnowledgeGraph, ChangeNode } from "../domain/types.js"
2
+ import { updateNode, getNodesByType } from "../graph/engine.js"
3
+ import { computeImpact } from "../graph/traverse.js"
4
+ import { createChange, classifyApprovalLevel } from "../changes/manager.js"
5
+ import { validateGraph } from "../validation/validator.js"
6
+
7
+ export interface EnforcementResult {
8
+ allowed: boolean
9
+ reason: string
10
+ change_id?: string
11
+ validation_passed: boolean
12
+ sdd_updated: boolean
13
+ impact_summary?: string
14
+ blocking_reasons?: string[]
15
+ }
16
+
17
+ /**
18
+ * Options for controlling enforcement behavior.
19
+ */
20
+ export interface EnforcementOptions {
21
+ /** Skip impact analysis (faster for simple changes). */
22
+ skipImpactAnalysis?: boolean
23
+ /** Skip validation (if already validated recently). */
24
+ skipValidation?: boolean
25
+ /** Force a specific approval level. */
26
+ forceApprovalLevel?: "AUTO" | "REVIEW" | "APPROVAL"
27
+ /** Maximum depth for impact analysis traversal. */
28
+ maxImpactDepth?: number
29
+ /** Cache for validation results (graph_version → result). */
30
+ validationCache?: Map<string, { valid: boolean; errors: any[]; timestamp: number }>
31
+ }
32
+
33
+ export interface ChangeRequest {
34
+ type: "add_functionality" | "modify_functionality" | "delete_functionality" | "bug_fix" | "refactor" | "architecture_change"
35
+ description: string
36
+ affected_files?: string[]
37
+ affected_entities?: string[]
38
+ }
39
+
40
+ export function classifyChangeRequest(description: string): ChangeRequest {
41
+ const lower = description.toLowerCase()
42
+
43
+ if (/adicionar|add|criar|create|nov[oa]/.test(lower)) {
44
+ return { type: "add_functionality", description }
45
+ }
46
+ if (/modificar|modify|alterar|change|atualizar|update|editar|edit/.test(lower)) {
47
+ return { type: "modify_functionality", description }
48
+ }
49
+ if (/deletar|delete|remover|remove|excluir|exclui/.test(lower)) {
50
+ return { type: "delete_functionality", description }
51
+ }
52
+ if (/corrigir|fix|bug|erro|error/.test(lower)) {
53
+ return { type: "bug_fix", description }
54
+ }
55
+ if (/refatorar|refactor|reorganizar|reorganize/.test(lower)) {
56
+ return { type: "refactor", description }
57
+ }
58
+ if (/migrar|migrate|trocar|replace|substituir|banco|database|auth|autenticação/.test(lower)) {
59
+ return { type: "architecture_change", description }
60
+ }
61
+
62
+ return { type: "modify_functionality", description }
63
+ }
64
+
65
+ export function enforceSddFirst(
66
+ graph: KnowledgeGraph,
67
+ request: ChangeRequest,
68
+ options?: EnforcementOptions,
69
+ ): EnforcementResult {
70
+ const result: EnforcementResult = {
71
+ allowed: false,
72
+ reason: "",
73
+ validation_passed: false,
74
+ sdd_updated: false,
75
+ blocking_reasons: [],
76
+ }
77
+
78
+ // Step 1: Check if SDD is initialized
79
+ if (!graph.nodes.some((n) => n.type === "project")) {
80
+ result.reason = "SDD not initialized. Run sdd.initialize first."
81
+ result.blocking_reasons = ["No project node in graph"]
82
+ return result
83
+ }
84
+
85
+ // Step 2: Check if graph has enough specification
86
+ const entities = getNodesByType(graph, "entity")
87
+ const features = getNodesByType(graph, "feature")
88
+ if (entities.length === 0 && features.length === 0) {
89
+ result.reason = "SDD has no specification. Create features and entities before implementing."
90
+ result.blocking_reasons = ["No entities or features defined"]
91
+ return result
92
+ }
93
+
94
+ // Step 3: For delete/modify, check if target exists
95
+ if (request.type === "delete_functionality" || request.type === "modify_functionality") {
96
+ const found = graph.nodes.filter((n) => {
97
+ const nameMatch = request.description.toLowerCase().includes(n.name.toLowerCase())
98
+ const idMatch = request.description.toLowerCase().includes(n.id.toLowerCase())
99
+ return nameMatch || idMatch
100
+ })
101
+
102
+ if (found.length === 0 && request.type === "delete_functionality") {
103
+ result.reason = `Cannot delete: no matching node found for "${request.description}". Specify the exact entity/feature name.`
104
+ result.blocking_reasons = ["Target not found in SDD"]
105
+ return result
106
+ }
107
+ }
108
+
109
+ // Step 4: Classify approval level
110
+ const proposal = {
111
+ title: request.description,
112
+ reason: request.description,
113
+ affected_node_ids: request.affected_entities || [],
114
+ new_nodes: [],
115
+ modified_nodes: [],
116
+ removed_node_ids: [],
117
+ affected_files: request.affected_files || [],
118
+ affected_tests: [],
119
+ implementation_tasks: [],
120
+ }
121
+
122
+ let approvalLevel = options?.forceApprovalLevel || classifyApprovalLevel(proposal, graph)
123
+
124
+ // Step 4b: Upgrade approval for cross-layer changes
125
+ if (approvalLevel !== "BLOCKED" && !options?.forceApprovalLevel && request.affected_files && request.affected_files.length > 0) {
126
+ const crossLayerDetected = detectCrossLayerChange(request.affected_files, graph)
127
+ if (crossLayerDetected) {
128
+ if (approvalLevel === "AUTO") approvalLevel = "REVIEW"
129
+ else if (approvalLevel === "REVIEW") approvalLevel = "APPROVAL"
130
+ }
131
+ }
132
+
133
+ // Step 5: Architecture changes need explicit approval
134
+ if (request.type === "architecture_change" || approvalLevel === "BLOCKED") {
135
+ result.reason = `This change requires explicit approval. Level: ${approvalLevel}. Description: ${request.description}`
136
+ result.blocking_reasons = [
137
+ `Approval level: ${approvalLevel}`,
138
+ "Architecture changes require human confirmation",
139
+ ]
140
+ return result
141
+ }
142
+
143
+ // Step 6: Create the change node
144
+ let changeNode: ChangeNode
145
+ try {
146
+ changeNode = createChange(graph, proposal)
147
+ result.change_id = changeNode.id
148
+ } catch (e) {
149
+ result.reason = `Failed to create change: ${e}`
150
+ return result
151
+ }
152
+
153
+ // Step 7: Validate SDD
154
+ if (options?.skipValidation) {
155
+ result.validation_passed = true // Assume valid if skipped
156
+ } else {
157
+ // Check validation cache
158
+ let validation: { valid: boolean; errors: any[] }
159
+ const graphVersion = graph.metadata.updated_at
160
+ const cachedValidation = options?.validationCache?.get(graphVersion)
161
+ const cacheMaxAge = 60000 // 1 minute
162
+
163
+ if (cachedValidation && (Date.now() - cachedValidation.timestamp) < cacheMaxAge) {
164
+ validation = cachedValidation
165
+ } else {
166
+ validation = validateGraph(graph)
167
+ if (options?.validationCache) {
168
+ options.validationCache.set(graphVersion, { ...validation, timestamp: Date.now() })
169
+ }
170
+ }
171
+
172
+ result.validation_passed = validation.valid
173
+
174
+ if (!validation.valid) {
175
+ result.reason = `SDD validation failed with ${validation.errors.length} errors. Fix specification before implementing.`
176
+ result.blocking_reasons = validation.errors.map((e: any) => `[${e.code}] ${e.message}`)
177
+ updateNode(graph, changeNode.id, { status: "BLOCKED" })
178
+ return result
179
+ }
180
+ }
181
+
182
+ // Step 7b: Test-before-merge check for APPROVAL-level changes
183
+ if (approvalLevel === "APPROVAL") {
184
+ const affectedReqs = request.affected_entities || []
185
+ const hasTestCoverage = checkTestCoverageForAffected(graph, affectedReqs)
186
+ if (!hasTestCoverage && affectedReqs.length > 0) {
187
+ result.blocking_reasons = result.blocking_reasons || []
188
+ result.blocking_reasons.push(
189
+ `APPROVAL-level change affects ${affectedReqs.length} entity(ies) but none have test coverage. ` +
190
+ `Add test nodes and link them with 'tested_by' relationships before proceeding.`
191
+ )
192
+ }
193
+ }
194
+
195
+ // Step 8: Compute impact
196
+ if (!options?.skipImpactAnalysis && request.affected_entities && request.affected_entities.length > 0) {
197
+ const impactNodes = new Set<string>()
198
+ const maxDepth = options?.maxImpactDepth ?? 3
199
+ for (const entityId of request.affected_entities) {
200
+ const impact = computeImpact(graph, entityId, maxDepth)
201
+ for (const n of impact.direct) impactNodes.add(n.id)
202
+ for (const n of impact.indirect) impactNodes.add(n.id)
203
+ }
204
+ result.impact_summary = `Impact: ${impactNodes.size} nodes affected`
205
+ } else if (options?.skipImpactAnalysis) {
206
+ result.impact_summary = "Impact analysis skipped"
207
+ }
208
+
209
+ // Step 9: All checks passed
210
+ result.allowed = true
211
+ result.reason = `SDD-first workflow: Change ${changeNode.id} created and validated. Proceed with implementation.`
212
+ result.sdd_updated = true
213
+
214
+ updateNode(graph, changeNode.id, { status: "APPROVED" })
215
+
216
+ return result
217
+ }
218
+
219
+ /**
220
+ * Detect if a change affects files across different architecture layers
221
+ * (e.g., frontend files + backend files).
222
+ */
223
+ function detectCrossLayerChange(files: string[], graph: KnowledgeGraph): boolean {
224
+ let hasFrontend = false
225
+ let hasBackend = false
226
+ let hasDatabase = false
227
+
228
+ for (const file of files) {
229
+ const path = file.toLowerCase()
230
+ if (path.includes("client") || path.includes("frontend") || path.includes("pages/") || path.includes("components/")) {
231
+ hasFrontend = true
232
+ } else if (path.includes("server") || path.includes("backend") || path.includes("routes/") || path.includes("controllers/") || path.includes("services/") || path.includes("repositories/")) {
233
+ hasBackend = true
234
+ } else if (path.includes("database") || path.includes("migrations/") || path.includes("schema")) {
235
+ hasDatabase = true
236
+ }
237
+ }
238
+
239
+ // Cross-layer if frontend+backend or frontend+database
240
+ return (hasFrontend && hasBackend) || (hasFrontend && hasDatabase) || (hasBackend && hasDatabase)
241
+ }
242
+
243
+ /**
244
+ * Check if affected entities have test coverage.
245
+ * Returns true if at least one entity has a test linked via 'tested_by'.
246
+ */
247
+ function checkTestCoverageForAffected(
248
+ graph: KnowledgeGraph,
249
+ affectedEntities: string[],
250
+ ): boolean {
251
+ if (affectedEntities.length === 0) return true
252
+
253
+ for (const entityName of affectedEntities) {
254
+ // Find entity node by name or ID
255
+ const entity = graph.nodes.find(
256
+ (n) => (n.type === "entity" || n.type === "requirement" || n.type === "feature") &&
257
+ (n.id === entityName || n.name.toLowerCase() === entityName.toLowerCase())
258
+ )
259
+ if (!entity) continue
260
+
261
+ // Check if this entity has any test linked
262
+ const hasTest = graph.relationships.some(
263
+ (r) => r.from === entity.id && r.type === "tested_by"
264
+ )
265
+ if (!hasTest) return false
266
+ }
267
+
268
+ return true
269
+ }
270
+
271
+ export function buildEnforcementPrompt(
272
+ request: ChangeRequest,
273
+ result: EnforcementResult,
274
+ ): string {
275
+ const lines: string[] = [
276
+ "## SDD Enforcement Status\n",
277
+ `**Request Type:** ${request.type}`,
278
+ `**Description:** ${request.description}`,
279
+ `**Allowed:** ${result.allowed ? "YES" : "NO"}`,
280
+ `**Change ID:** ${result.change_id || "N/A"}`,
281
+ `**Validation:** ${result.validation_passed ? "PASSED" : "FAILED"}`,
282
+ `**SDD Updated:** ${result.sdd_updated ? "YES" : "NO"}`,
283
+ ]
284
+
285
+ if (result.impact_summary) {
286
+ lines.push(`\n**Impact:** ${result.impact_summary}`)
287
+ }
288
+
289
+ if (result.blocking_reasons && result.blocking_reasons.length > 0) {
290
+ lines.push("\n### Blocking Reasons")
291
+ for (const reason of result.blocking_reasons) {
292
+ lines.push(`- ${reason}`)
293
+ }
294
+ }
295
+
296
+ if (result.allowed) {
297
+ lines.push("\n### Next Steps")
298
+ lines.push("1. Update the SDD specification with the changes")
299
+ lines.push("2. Validate the updated SDD")
300
+ lines.push("3. Implement the code changes")
301
+ lines.push("4. Run tests")
302
+ lines.push("5. Verify implementation against SDD")
303
+ lines.push("6. Update the Knowledge Graph")
304
+ lines.push(`7. Complete change ${result.change_id}`)
305
+ } else {
306
+ lines.push("\n### Action Required")
307
+ lines.push("The SDD must be updated before code changes can proceed.")
308
+ lines.push("Use the discovery process to gather missing information.")
309
+ }
310
+
311
+ return lines.join("\n")
312
+ }
313
+
314
+ /**
315
+ * Smart batch enforcement: for AUTO-level changes, execute the full cycle
316
+ * (create change → validate → approve) in one call without user interaction.
317
+ */
318
+ export function enforceSmartBatch(
319
+ graph: KnowledgeGraph,
320
+ request: ChangeRequest,
321
+ affectedEntities: string[] = [],
322
+ affectedFiles: string[] = [],
323
+ options?: EnforcementOptions,
324
+ ): EnforcementResult & { auto_completed: boolean } {
325
+ // Share validation cache between enforceSddFirst and the post-check
326
+ // to avoid running validateGraph() twice
327
+ const sharedValidationCache = options?.validationCache ?? new Map()
328
+ const sharedOptions = { ...options, validationCache: sharedValidationCache }
329
+
330
+ const result = enforceSddFirst(graph, {
331
+ ...request,
332
+ affected_entities: affectedEntities,
333
+ affected_files: affectedFiles,
334
+ }, sharedOptions)
335
+
336
+ // If the change was auto-approved, reuse the cached validation result
337
+ if (result.allowed && result.change_id) {
338
+ const graphVersion = graph.metadata.updated_at
339
+ const cachedValidation = sharedValidationCache.get(graphVersion)
340
+ const validation = cachedValidation || validateGraph(graph)
341
+ if (validation.valid) {
342
+ return { ...result, auto_completed: true }
343
+ } else {
344
+ return {
345
+ ...result,
346
+ auto_completed: false,
347
+ reason: `Change created but validation failed: ${validation.errors.length} error(s). Fix spec before implementing.`,
348
+ }
349
+ }
350
+ }
351
+
352
+ return { ...result, auto_completed: false }
353
+ }
354
+
355
+ export function getSddEnforcementRules(): string {
356
+ return `
357
+ ## SDD-FIRST ENFORCEMENT RULES (MANDATORY)
358
+
359
+ You are operating under STRICT Spec-Driven Development enforcement.
360
+
361
+ ### Rule 1: SDD is always first
362
+ Before ANY code modification:
363
+ - If SDD is not initialized: run sdd.initialize
364
+ - If specification is incomplete: run sdd.discover and complete it
365
+ - If specification exists: validate it with sdd.validate
366
+
367
+ ### Rule 2: Every change must go through SDD
368
+ When the user requests ANY change:
369
+ 1. Classify the change (add/modify/delete/bug_fix/refactor/architecture)
370
+ 2. Create a Change node with sdd.create_change
371
+ 3. Perform impact analysis with sdd.analyze_impact
372
+ 4. Update the specification BEFORE writing code
373
+ 5. Validate the updated specification
374
+ 6. Only THEN implement the code
375
+ 7. After implementation, validate again
376
+ 8. Complete the change with sdd.complete_change
377
+
378
+ ### Rule 3: Never skip SDD for "simple" changes
379
+ Even small changes must update the specification.
380
+ A "typo fix" in a field name is a specification change.
381
+ Renaming a variable that appears in the API is a specification change.
382
+
383
+ ### Rule 4: Specification validation is mandatory
384
+ After EVERY specification update:
385
+ - Run sdd.validate
386
+ - If validation fails: fix the specification
387
+ - Only proceed to implementation after validation passes
388
+
389
+ ### Rule 5: Code must match specification
390
+ After implementation:
391
+ - Run sdd.detect_drift
392
+ - If drift detected: reconcile specification and code
393
+ - The specification is always the source of truth
394
+
395
+ ### Rule 6: Changes must be traceable
396
+ Every change must have:
397
+ - A Change node in the graph
398
+ - Affected nodes identified
399
+ - Impact analysis performed
400
+ - Validation before and after implementation
401
+
402
+ ### Rule 7: Architecture changes need approval
403
+ Any change to:
404
+ - Database engine
405
+ - Authentication mechanism
406
+ - Multi-tenancy model
407
+ - API public contract
408
+ - Core business rules
409
+ Requires explicit user approval before implementation.
410
+
411
+ ### Rule 8: Discovery is mandatory for new areas
412
+ When the user requests a new feature/area:
413
+ - Check if SDD has enough information
414
+ - If not: run sdd.discover
415
+ - Never assume implementation details
416
+ - Ask for missing information
417
+ - Update SDD before implementing
418
+
419
+ ### Rule 9: Shell commands cannot bypass enforcement
420
+ Using shell commands to write source files is PROHIBITED without SDD approval:
421
+ - python3 heredocs (python3 - <<'EOF' ... open('file','w') ... EOF)
422
+ - python3 -c with open().write()
423
+ - node -e with fs.writeFileSync()
424
+ - Shell redirects (> file.ts, >> file.ts)
425
+ - cat >, tee, sed -i on source files
426
+ - ANY command that creates or modifies .ts, .tsx, .js, .py, .go, .rs files
427
+
428
+ All shell commands are monitored. The ONLY acceptable way to write code:
429
+ sdd.enforce → sdd.update_from_answers → sdd.approve_change → Write/Edit tools
430
+
431
+ ### Enforcement Summary
432
+ The workflow is ALWAYS:
433
+ UNDERSTAND → MODEL → SPECIFY → ANALYZE IMPACT → APPROVE → PLAN → IMPLEMENT → TEST → VERIFY → SYNC
434
+
435
+ NEVER: IMPLEMENT → DOCUMENT
436
+ NEVER: Use shell commands to bypass SDD
437
+
438
+ ### Shell Command Monitoring
439
+ All run_terminal_command calls are analyzed. Commands writing source files:
440
+ - BLOCKED if no SDD Change node covers the target files
441
+ - ALLOWED only after sdd.enforce → sdd.approve_change
442
+ - Logged in audit trail regardless of outcome
443
+ `
444
+ }
@@ -0,0 +1,263 @@
1
+ /**
2
+ * SDD Workflow State Tracker (FEAT-087/FEAT-100)
3
+ *
4
+ * Tracks whether the current agent session is inside a valid SDD workflow.
5
+ * Graph mutation tools (add_node, update_node, etc.) are blocked unless
6
+ * the session has passed through sdd.enforce or an approved Change exists.
7
+ *
8
+ * Uses module-level state (not AsyncLocalStorage) because OpenCode tools
9
+ * execute synchronously within a single tool-call boundary.
10
+ */
11
+
12
+ export interface WorkflowState {
13
+ /** Whether sdd.enforce has been called in this session */
14
+ enforced: boolean
15
+ /** Change node ID created by sdd.enforce */
16
+ changeId: string | null
17
+ /** Whether the current change has been approved */
18
+ approved: boolean
19
+ /** Whether sdd.validate has passed since last enforce */
20
+ validated: boolean
21
+ /** Timestamp of last enforce call */
22
+ enforcedAt: number
23
+ /** Whether discovery is in progress (sdd.discover was called) */
24
+ discovering: boolean
25
+ /** Whether the SDD spec has been updated since last enforce (add_node, update_node, update_from_answers) */
26
+ specUpdated: boolean
27
+ }
28
+
29
+ const state: WorkflowState = {
30
+ enforced: false,
31
+ changeId: null,
32
+ approved: false,
33
+ validated: false,
34
+ enforcedAt: 0,
35
+ discovering: false,
36
+ specUpdated: false,
37
+ }
38
+
39
+ /** Reset workflow state (called on session start or /sdd off) */
40
+ export function resetWorkflowState(): void {
41
+ state.enforced = false
42
+ state.changeId = null
43
+ state.approved = false
44
+ state.validated = false
45
+ state.enforcedAt = 0
46
+ state.discovering = false
47
+ state.specUpdated = false
48
+ }
49
+
50
+ /** Mark that sdd.enforce was called */
51
+ export function markEnforced(changeId: string): void {
52
+ state.enforced = true
53
+ state.changeId = changeId
54
+ state.approved = false
55
+ state.validated = false
56
+ state.enforcedAt = Date.now()
57
+ state.specUpdated = false
58
+ }
59
+
60
+ /** Mark that the change was approved */
61
+ export function markApproved(): void {
62
+ state.approved = true
63
+ }
64
+
65
+ /** Mark that sdd.validate passed */
66
+ export function markValidated(): void {
67
+ state.validated = true
68
+ }
69
+
70
+ /** Mark that discovery is in progress */
71
+ export function markDiscovering(discovering: boolean): void {
72
+ state.discovering = discovering
73
+ }
74
+
75
+ /** Mark that the SDD spec has been updated (add_node, update_node, update_from_answers) */
76
+ export function markSpecUpdated(): void {
77
+ state.specUpdated = true
78
+ }
79
+
80
+ /** Mark that the change was completed (resets state) */
81
+ export function markCompleted(): void {
82
+ state.enforced = false
83
+ state.changeId = null
84
+ state.approved = false
85
+ state.validated = false
86
+ state.enforcedAt = 0
87
+ state.specUpdated = false
88
+ }
89
+
90
+ /** Check if workflow is in a valid state for graph mutations */
91
+ export function isWorkflowValid(): { valid: boolean; reason?: string } {
92
+ if (!state.enforced) {
93
+ return {
94
+ valid: false,
95
+ reason: "No SDD workflow active. Call sdd.enforce first to classify the change and create a Change node.",
96
+ }
97
+ }
98
+
99
+ // Allow a 30-minute window for workflow completion
100
+ const maxAge = 30 * 60 * 1000
101
+ if (Date.now() - state.enforcedAt > maxAge) {
102
+ return {
103
+ valid: false,
104
+ reason: "SDD workflow expired (>30 min). Call sdd.enforce again.",
105
+ }
106
+ }
107
+
108
+ return { valid: true }
109
+ }
110
+
111
+ /** Get current workflow state (read-only) */
112
+ export function getWorkflowState(): Readonly<WorkflowState> {
113
+ return { ...state }
114
+ }
115
+
116
+ /**
117
+ * Tools that are ALLOWED without workflow context.
118
+ * These are read-only or workflow-entry tools.
119
+ */
120
+ export const WORKFLOW_EXEMPT_TOOLS = new Set([
121
+ "sdd.initialize",
122
+ "sdd.inspect",
123
+ "sdd.query_graph",
124
+ "sdd.list_nodes",
125
+ "sdd.count_nodes",
126
+ "sdd.get_nodes_by_status",
127
+ "sdd.get_context",
128
+ "sdd.find_path",
129
+ "sdd.analyze_impact",
130
+ "sdd.validate",
131
+ "sdd.detect_drift",
132
+ "sdd.config_drift",
133
+ "sdd.detect_sync_conflicts",
134
+ "sdd.quality",
135
+ "sdd.contradictions",
136
+ "sdd.verify_usage",
137
+ "sdd.find_dead_code",
138
+ "sdd.parse_symbols",
139
+ "sdd.analyze_complexity",
140
+ "sdd.code_metrics",
141
+ "sdd.detect_smells",
142
+ "sdd.analyze_dependencies",
143
+ "sdd.anti_patterns",
144
+ "sdd.clone_detection",
145
+ "sdd.promises",
146
+ "sdd.coverage",
147
+ "sdd.check_compliance",
148
+ "sdd.security_audit",
149
+ "sdd.analyze_scalability",
150
+ "sdd.traverse_outgoing",
151
+ "sdd.traverse_incoming",
152
+ "sdd.traverse_both",
153
+ "sdd.get_subgraph",
154
+ "sdd.pending_changes",
155
+ "sdd.list_snapshots",
156
+ "sdd.sync_status",
157
+ "sdd.remote_status",
158
+ "sdd.mcp_server_info",
159
+ "sdd.handle_mcp_tool",
160
+ // Workflow entry points (start the workflow)
161
+ "sdd.enforce",
162
+ "sdd.enforce_rules",
163
+ "sdd.discover",
164
+ "sdd.update_from_answers",
165
+ "sdd.create_change",
166
+ "sdd.approve_change",
167
+ "sdd.complete_change",
168
+ "sdd.verify_implementation",
169
+ // Enterprise workflows (they manage their own enforcement)
170
+ "sdd.bug_fix",
171
+ "sdd.hotfix",
172
+ "sdd.refactoring",
173
+ "sdd.deprecate",
174
+ "sdd.create_migration",
175
+ "sdd.create_experiment",
176
+ "sdd.create_flag",
177
+ "sdd.create_tenant",
178
+ "sdd.onboard_developer",
179
+ "sdd.report_incident",
180
+ "sdd.create_sla",
181
+ "sdd.estimate_cost",
182
+ "sdd.generate_docs",
183
+ "sdd.knowledge_transfer",
184
+ "sdd.disaster_recovery_plan",
185
+ "sdd.setup_monitoring",
186
+ "sdd.generate_dashboard",
187
+ // Toggle and config
188
+ "sdd.toggle",
189
+ "sdd.toggle_status",
190
+ "sdd.constitution",
191
+ // Session and export
192
+ "sdd.session_handoff",
193
+ "sdd.workflow_export",
194
+ // Permissions
195
+ "sdd.load_permissions_config",
196
+ "sdd.save_permissions_config",
197
+ "sdd.check_permission",
198
+ "sdd.check_change_approval",
199
+ "sdd.set_role",
200
+ "sdd.get_user_role",
201
+ "sdd.audit_log",
202
+ "sdd.detect_remote",
203
+ // Infrastructure
204
+ "sdd.install_hooks",
205
+ "sdd.brownfield_scan",
206
+ "sdd.start_dashboard",
207
+ "sdd.generate_cicd",
208
+ // Sync
209
+ "sdd.sync_pull",
210
+ "sdd.sync_push",
211
+ "sdd.merge_graphs",
212
+ // Rollback
213
+ "sdd.rollback",
214
+ "sdd.rollback_history",
215
+ "sdd.create_snapshot",
216
+ // Graph build
217
+ "sdd.build_graph",
218
+ ])
219
+
220
+ /**
221
+ * Tools that REQUIRE workflow context (graph mutations).
222
+ * These modify the SDD graph and must go through the workflow.
223
+ */
224
+ export const WORKFLOW_REQUIRED_TOOLS = new Set([
225
+ "sdd.add_node",
226
+ "sdd.update_node",
227
+ "sdd.remove_node",
228
+ "sdd.add_relationship",
229
+ "sdd.remove_relationship",
230
+ "sdd.generate_code",
231
+ "sdd.remove_dead_code",
232
+ ])
233
+
234
+ /**
235
+ * Check if a tool requires workflow context.
236
+ * Returns null if the tool is allowed, or an error message if blocked.
237
+ */
238
+ export function checkToolAccess(toolName: string): { allowed: boolean; reason?: string } {
239
+ // SDD tools only
240
+ if (!toolName.startsWith("sdd.")) {
241
+ return { allowed: true }
242
+ }
243
+
244
+ // Exempt tools are always allowed
245
+ if (WORKFLOW_EXEMPT_TOOLS.has(toolName)) {
246
+ return { allowed: true }
247
+ }
248
+
249
+ // Required tools need workflow context
250
+ if (WORKFLOW_REQUIRED_TOOLS.has(toolName)) {
251
+ const workflow = isWorkflowValid()
252
+ if (!workflow.valid) {
253
+ return {
254
+ allowed: false,
255
+ reason: `[SDD BLOCKED] Tool "${toolName}" requires an active SDD workflow.\n\n${workflow.reason}\n\nWorkflow: sdd.enforce → sdd.update_from_answers → sdd.approve_change → THEN use ${toolName}`,
256
+ }
257
+ }
258
+ return { allowed: true }
259
+ }
260
+
261
+ // Unknown SDD tools are allowed (future tools)
262
+ return { allowed: true }
263
+ }