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,365 @@
1
+ import { updateNode, getNodesByType } from "../graph/engine.js";
2
+ import { computeImpact } from "../graph/traverse.js";
3
+ import { createChange, classifyApprovalLevel } from "../changes/manager.js";
4
+ import { validateGraph } from "../validation/validator.js";
5
+ export function classifyChangeRequest(description) {
6
+ const lower = description.toLowerCase();
7
+ if (/adicionar|add|criar|create|nov[oa]/.test(lower)) {
8
+ return { type: "add_functionality", description };
9
+ }
10
+ if (/modificar|modify|alterar|change|atualizar|update|editar|edit/.test(lower)) {
11
+ return { type: "modify_functionality", description };
12
+ }
13
+ if (/deletar|delete|remover|remove|excluir|exclui/.test(lower)) {
14
+ return { type: "delete_functionality", description };
15
+ }
16
+ if (/corrigir|fix|bug|erro|error/.test(lower)) {
17
+ return { type: "bug_fix", description };
18
+ }
19
+ if (/refatorar|refactor|reorganizar|reorganize/.test(lower)) {
20
+ return { type: "refactor", description };
21
+ }
22
+ if (/migrar|migrate|trocar|replace|substituir|banco|database|auth|autenticação/.test(lower)) {
23
+ return { type: "architecture_change", description };
24
+ }
25
+ return { type: "modify_functionality", description };
26
+ }
27
+ export function enforceSddFirst(graph, request, options) {
28
+ const result = {
29
+ allowed: false,
30
+ reason: "",
31
+ validation_passed: false,
32
+ sdd_updated: false,
33
+ blocking_reasons: [],
34
+ };
35
+ // Step 1: Check if SDD is initialized
36
+ if (!graph.nodes.some((n) => n.type === "project")) {
37
+ result.reason = "SDD not initialized. Run sdd.initialize first.";
38
+ result.blocking_reasons = ["No project node in graph"];
39
+ return result;
40
+ }
41
+ // Step 2: Check if graph has enough specification
42
+ const entities = getNodesByType(graph, "entity");
43
+ const features = getNodesByType(graph, "feature");
44
+ if (entities.length === 0 && features.length === 0) {
45
+ result.reason = "SDD has no specification. Create features and entities before implementing.";
46
+ result.blocking_reasons = ["No entities or features defined"];
47
+ return result;
48
+ }
49
+ // Step 3: For delete/modify, check if target exists
50
+ if (request.type === "delete_functionality" || request.type === "modify_functionality") {
51
+ const found = graph.nodes.filter((n) => {
52
+ const nameMatch = request.description.toLowerCase().includes(n.name.toLowerCase());
53
+ const idMatch = request.description.toLowerCase().includes(n.id.toLowerCase());
54
+ return nameMatch || idMatch;
55
+ });
56
+ if (found.length === 0 && request.type === "delete_functionality") {
57
+ result.reason = `Cannot delete: no matching node found for "${request.description}". Specify the exact entity/feature name.`;
58
+ result.blocking_reasons = ["Target not found in SDD"];
59
+ return result;
60
+ }
61
+ }
62
+ // Step 4: Classify approval level
63
+ const proposal = {
64
+ title: request.description,
65
+ reason: request.description,
66
+ affected_node_ids: request.affected_entities || [],
67
+ new_nodes: [],
68
+ modified_nodes: [],
69
+ removed_node_ids: [],
70
+ affected_files: request.affected_files || [],
71
+ affected_tests: [],
72
+ implementation_tasks: [],
73
+ };
74
+ let approvalLevel = options?.forceApprovalLevel || classifyApprovalLevel(proposal, graph);
75
+ // Step 4b: Upgrade approval for cross-layer changes
76
+ if (approvalLevel !== "BLOCKED" && !options?.forceApprovalLevel && request.affected_files && request.affected_files.length > 0) {
77
+ const crossLayerDetected = detectCrossLayerChange(request.affected_files, graph);
78
+ if (crossLayerDetected) {
79
+ if (approvalLevel === "AUTO")
80
+ approvalLevel = "REVIEW";
81
+ else if (approvalLevel === "REVIEW")
82
+ approvalLevel = "APPROVAL";
83
+ }
84
+ }
85
+ // Step 5: Architecture changes need explicit approval
86
+ if (request.type === "architecture_change" || approvalLevel === "BLOCKED") {
87
+ result.reason = `This change requires explicit approval. Level: ${approvalLevel}. Description: ${request.description}`;
88
+ result.blocking_reasons = [
89
+ `Approval level: ${approvalLevel}`,
90
+ "Architecture changes require human confirmation",
91
+ ];
92
+ return result;
93
+ }
94
+ // Step 6: Create the change node
95
+ let changeNode;
96
+ try {
97
+ changeNode = createChange(graph, proposal);
98
+ result.change_id = changeNode.id;
99
+ }
100
+ catch (e) {
101
+ result.reason = `Failed to create change: ${e}`;
102
+ return result;
103
+ }
104
+ // Step 7: Validate SDD
105
+ if (options?.skipValidation) {
106
+ result.validation_passed = true; // Assume valid if skipped
107
+ }
108
+ else {
109
+ // Check validation cache
110
+ let validation;
111
+ const graphVersion = graph.metadata.updated_at;
112
+ const cachedValidation = options?.validationCache?.get(graphVersion);
113
+ const cacheMaxAge = 60000; // 1 minute
114
+ if (cachedValidation && (Date.now() - cachedValidation.timestamp) < cacheMaxAge) {
115
+ validation = cachedValidation;
116
+ }
117
+ else {
118
+ validation = validateGraph(graph);
119
+ if (options?.validationCache) {
120
+ options.validationCache.set(graphVersion, { ...validation, timestamp: Date.now() });
121
+ }
122
+ }
123
+ result.validation_passed = validation.valid;
124
+ if (!validation.valid) {
125
+ result.reason = `SDD validation failed with ${validation.errors.length} errors. Fix specification before implementing.`;
126
+ result.blocking_reasons = validation.errors.map((e) => `[${e.code}] ${e.message}`);
127
+ updateNode(graph, changeNode.id, { status: "BLOCKED" });
128
+ return result;
129
+ }
130
+ }
131
+ // Step 7b: Test-before-merge check for APPROVAL-level changes
132
+ if (approvalLevel === "APPROVAL") {
133
+ const affectedReqs = request.affected_entities || [];
134
+ const hasTestCoverage = checkTestCoverageForAffected(graph, affectedReqs);
135
+ if (!hasTestCoverage && affectedReqs.length > 0) {
136
+ result.blocking_reasons = result.blocking_reasons || [];
137
+ result.blocking_reasons.push(`APPROVAL-level change affects ${affectedReqs.length} entity(ies) but none have test coverage. ` +
138
+ `Add test nodes and link them with 'tested_by' relationships before proceeding.`);
139
+ }
140
+ }
141
+ // Step 8: Compute impact
142
+ if (!options?.skipImpactAnalysis && request.affected_entities && request.affected_entities.length > 0) {
143
+ const impactNodes = new Set();
144
+ const maxDepth = options?.maxImpactDepth ?? 3;
145
+ for (const entityId of request.affected_entities) {
146
+ const impact = computeImpact(graph, entityId, maxDepth);
147
+ for (const n of impact.direct)
148
+ impactNodes.add(n.id);
149
+ for (const n of impact.indirect)
150
+ impactNodes.add(n.id);
151
+ }
152
+ result.impact_summary = `Impact: ${impactNodes.size} nodes affected`;
153
+ }
154
+ else if (options?.skipImpactAnalysis) {
155
+ result.impact_summary = "Impact analysis skipped";
156
+ }
157
+ // Step 9: All checks passed
158
+ result.allowed = true;
159
+ result.reason = `SDD-first workflow: Change ${changeNode.id} created and validated. Proceed with implementation.`;
160
+ result.sdd_updated = true;
161
+ updateNode(graph, changeNode.id, { status: "APPROVED" });
162
+ return result;
163
+ }
164
+ /**
165
+ * Detect if a change affects files across different architecture layers
166
+ * (e.g., frontend files + backend files).
167
+ */
168
+ function detectCrossLayerChange(files, graph) {
169
+ let hasFrontend = false;
170
+ let hasBackend = false;
171
+ let hasDatabase = false;
172
+ for (const file of files) {
173
+ const path = file.toLowerCase();
174
+ if (path.includes("client") || path.includes("frontend") || path.includes("pages/") || path.includes("components/")) {
175
+ hasFrontend = true;
176
+ }
177
+ else if (path.includes("server") || path.includes("backend") || path.includes("routes/") || path.includes("controllers/") || path.includes("services/") || path.includes("repositories/")) {
178
+ hasBackend = true;
179
+ }
180
+ else if (path.includes("database") || path.includes("migrations/") || path.includes("schema")) {
181
+ hasDatabase = true;
182
+ }
183
+ }
184
+ // Cross-layer if frontend+backend or frontend+database
185
+ return (hasFrontend && hasBackend) || (hasFrontend && hasDatabase) || (hasBackend && hasDatabase);
186
+ }
187
+ /**
188
+ * Check if affected entities have test coverage.
189
+ * Returns true if at least one entity has a test linked via 'tested_by'.
190
+ */
191
+ function checkTestCoverageForAffected(graph, affectedEntities) {
192
+ if (affectedEntities.length === 0)
193
+ return true;
194
+ for (const entityName of affectedEntities) {
195
+ // Find entity node by name or ID
196
+ const entity = graph.nodes.find((n) => (n.type === "entity" || n.type === "requirement" || n.type === "feature") &&
197
+ (n.id === entityName || n.name.toLowerCase() === entityName.toLowerCase()));
198
+ if (!entity)
199
+ continue;
200
+ // Check if this entity has any test linked
201
+ const hasTest = graph.relationships.some((r) => r.from === entity.id && r.type === "tested_by");
202
+ if (!hasTest)
203
+ return false;
204
+ }
205
+ return true;
206
+ }
207
+ export function buildEnforcementPrompt(request, result) {
208
+ const lines = [
209
+ "## SDD Enforcement Status\n",
210
+ `**Request Type:** ${request.type}`,
211
+ `**Description:** ${request.description}`,
212
+ `**Allowed:** ${result.allowed ? "YES" : "NO"}`,
213
+ `**Change ID:** ${result.change_id || "N/A"}`,
214
+ `**Validation:** ${result.validation_passed ? "PASSED" : "FAILED"}`,
215
+ `**SDD Updated:** ${result.sdd_updated ? "YES" : "NO"}`,
216
+ ];
217
+ if (result.impact_summary) {
218
+ lines.push(`\n**Impact:** ${result.impact_summary}`);
219
+ }
220
+ if (result.blocking_reasons && result.blocking_reasons.length > 0) {
221
+ lines.push("\n### Blocking Reasons");
222
+ for (const reason of result.blocking_reasons) {
223
+ lines.push(`- ${reason}`);
224
+ }
225
+ }
226
+ if (result.allowed) {
227
+ lines.push("\n### Next Steps");
228
+ lines.push("1. Update the SDD specification with the changes");
229
+ lines.push("2. Validate the updated SDD");
230
+ lines.push("3. Implement the code changes");
231
+ lines.push("4. Run tests");
232
+ lines.push("5. Verify implementation against SDD");
233
+ lines.push("6. Update the Knowledge Graph");
234
+ lines.push(`7. Complete change ${result.change_id}`);
235
+ }
236
+ else {
237
+ lines.push("\n### Action Required");
238
+ lines.push("The SDD must be updated before code changes can proceed.");
239
+ lines.push("Use the discovery process to gather missing information.");
240
+ }
241
+ return lines.join("\n");
242
+ }
243
+ /**
244
+ * Smart batch enforcement: for AUTO-level changes, execute the full cycle
245
+ * (create change → validate → approve) in one call without user interaction.
246
+ */
247
+ export function enforceSmartBatch(graph, request, affectedEntities = [], affectedFiles = [], options) {
248
+ // Share validation cache between enforceSddFirst and the post-check
249
+ // to avoid running validateGraph() twice
250
+ const sharedValidationCache = options?.validationCache ?? new Map();
251
+ const sharedOptions = { ...options, validationCache: sharedValidationCache };
252
+ const result = enforceSddFirst(graph, {
253
+ ...request,
254
+ affected_entities: affectedEntities,
255
+ affected_files: affectedFiles,
256
+ }, sharedOptions);
257
+ // If the change was auto-approved, reuse the cached validation result
258
+ if (result.allowed && result.change_id) {
259
+ const graphVersion = graph.metadata.updated_at;
260
+ const cachedValidation = sharedValidationCache.get(graphVersion);
261
+ const validation = cachedValidation || validateGraph(graph);
262
+ if (validation.valid) {
263
+ return { ...result, auto_completed: true };
264
+ }
265
+ else {
266
+ return {
267
+ ...result,
268
+ auto_completed: false,
269
+ reason: `Change created but validation failed: ${validation.errors.length} error(s). Fix spec before implementing.`,
270
+ };
271
+ }
272
+ }
273
+ return { ...result, auto_completed: false };
274
+ }
275
+ export function getSddEnforcementRules() {
276
+ return `
277
+ ## SDD-FIRST ENFORCEMENT RULES (MANDATORY)
278
+
279
+ You are operating under STRICT Spec-Driven Development enforcement.
280
+
281
+ ### Rule 1: SDD is always first
282
+ Before ANY code modification:
283
+ - If SDD is not initialized: run sdd.initialize
284
+ - If specification is incomplete: run sdd.discover and complete it
285
+ - If specification exists: validate it with sdd.validate
286
+
287
+ ### Rule 2: Every change must go through SDD
288
+ When the user requests ANY change:
289
+ 1. Classify the change (add/modify/delete/bug_fix/refactor/architecture)
290
+ 2. Create a Change node with sdd.create_change
291
+ 3. Perform impact analysis with sdd.analyze_impact
292
+ 4. Update the specification BEFORE writing code
293
+ 5. Validate the updated specification
294
+ 6. Only THEN implement the code
295
+ 7. After implementation, validate again
296
+ 8. Complete the change with sdd.complete_change
297
+
298
+ ### Rule 3: Never skip SDD for "simple" changes
299
+ Even small changes must update the specification.
300
+ A "typo fix" in a field name is a specification change.
301
+ Renaming a variable that appears in the API is a specification change.
302
+
303
+ ### Rule 4: Specification validation is mandatory
304
+ After EVERY specification update:
305
+ - Run sdd.validate
306
+ - If validation fails: fix the specification
307
+ - Only proceed to implementation after validation passes
308
+
309
+ ### Rule 5: Code must match specification
310
+ After implementation:
311
+ - Run sdd.detect_drift
312
+ - If drift detected: reconcile specification and code
313
+ - The specification is always the source of truth
314
+
315
+ ### Rule 6: Changes must be traceable
316
+ Every change must have:
317
+ - A Change node in the graph
318
+ - Affected nodes identified
319
+ - Impact analysis performed
320
+ - Validation before and after implementation
321
+
322
+ ### Rule 7: Architecture changes need approval
323
+ Any change to:
324
+ - Database engine
325
+ - Authentication mechanism
326
+ - Multi-tenancy model
327
+ - API public contract
328
+ - Core business rules
329
+ Requires explicit user approval before implementation.
330
+
331
+ ### Rule 8: Discovery is mandatory for new areas
332
+ When the user requests a new feature/area:
333
+ - Check if SDD has enough information
334
+ - If not: run sdd.discover
335
+ - Never assume implementation details
336
+ - Ask for missing information
337
+ - Update SDD before implementing
338
+
339
+ ### Rule 9: Shell commands cannot bypass enforcement
340
+ Using shell commands to write source files is PROHIBITED without SDD approval:
341
+ - python3 heredocs (python3 - <<'EOF' ... open('file','w') ... EOF)
342
+ - python3 -c with open().write()
343
+ - node -e with fs.writeFileSync()
344
+ - Shell redirects (> file.ts, >> file.ts)
345
+ - cat >, tee, sed -i on source files
346
+ - ANY command that creates or modifies .ts, .tsx, .js, .py, .go, .rs files
347
+
348
+ All shell commands are monitored. The ONLY acceptable way to write code:
349
+ sdd.enforce → sdd.update_from_answers → sdd.approve_change → Write/Edit tools
350
+
351
+ ### Enforcement Summary
352
+ The workflow is ALWAYS:
353
+ UNDERSTAND → MODEL → SPECIFY → ANALYZE IMPACT → APPROVE → PLAN → IMPLEMENT → TEST → VERIFY → SYNC
354
+
355
+ NEVER: IMPLEMENT → DOCUMENT
356
+ NEVER: Use shell commands to bypass SDD
357
+
358
+ ### Shell Command Monitoring
359
+ All run_terminal_command calls are analyzed. Commands writing source files:
360
+ - BLOCKED if no SDD Change node covers the target files
361
+ - ALLOWED only after sdd.enforce → sdd.approve_change
362
+ - Logged in audit trail regardless of outcome
363
+ `;
364
+ }
365
+ //# sourceMappingURL=interceptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../../src/sdd/enforcement/interceptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAmC1D,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAA;IAEvC,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAA;IACnD,CAAC;IACD,IAAI,8DAA8D,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/E,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAA;IACtD,CAAC;IACD,IAAI,8CAA8C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAA;IACtD,CAAC;IACD,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,CAAA;IACzC,CAAC;IACD,IAAI,2CAA2C,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,CAAA;IAC1C,CAAC;IACD,IAAI,2EAA2E,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5F,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAA;IACrD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAqB,EACrB,OAAsB,EACtB,OAA4B;IAE5B,MAAM,MAAM,GAAsB;QAChC,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,EAAE;QACV,iBAAiB,EAAE,KAAK;QACxB,WAAW,EAAE,KAAK;QAClB,gBAAgB,EAAE,EAAE;KACrB,CAAA;IAED,sCAAsC;IACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,MAAM,GAAG,gDAAgD,CAAA;QAChE,MAAM,CAAC,gBAAgB,GAAG,CAAC,0BAA0B,CAAC,CAAA;QACtD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,MAAM,GAAG,6EAA6E,CAAA;QAC7F,MAAM,CAAC,gBAAgB,GAAG,CAAC,iCAAiC,CAAC,CAAA;QAC7D,OAAO,MAAM,CAAA;IACf,CAAC;IAED,oDAAoD;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAsB,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;QACvF,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;YAClF,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YAC9E,OAAO,SAAS,IAAI,OAAO,CAAA;QAC7B,CAAC,CAAC,CAAA;QAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAClE,MAAM,CAAC,MAAM,GAAG,8CAA8C,OAAO,CAAC,WAAW,2CAA2C,CAAA;YAC5H,MAAM,CAAC,gBAAgB,GAAG,CAAC,yBAAyB,CAAC,CAAA;YACrD,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,QAAQ,GAAG;QACf,KAAK,EAAE,OAAO,CAAC,WAAW;QAC1B,MAAM,EAAE,OAAO,CAAC,WAAW;QAC3B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,EAAE;QAClD,SAAS,EAAE,EAAE;QACb,cAAc,EAAE,EAAE;QAClB,gBAAgB,EAAE,EAAE;QACpB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;QAC5C,cAAc,EAAE,EAAE;QAClB,oBAAoB,EAAE,EAAE;KACzB,CAAA;IAED,IAAI,aAAa,GAAG,OAAO,EAAE,kBAAkB,IAAI,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAEzF,oDAAoD;IACpD,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,OAAO,EAAE,kBAAkB,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/H,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;QAChF,IAAI,kBAAkB,EAAE,CAAC;YACvB,IAAI,aAAa,KAAK,MAAM;gBAAE,aAAa,GAAG,QAAQ,CAAA;iBACjD,IAAI,aAAa,KAAK,QAAQ;gBAAE,aAAa,GAAG,UAAU,CAAA;QACjE,CAAC;IACH,CAAC;IAED,sDAAsD;IACtD,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAC1E,MAAM,CAAC,MAAM,GAAG,kDAAkD,aAAa,kBAAkB,OAAO,CAAC,WAAW,EAAE,CAAA;QACtH,MAAM,CAAC,gBAAgB,GAAG;YACxB,mBAAmB,aAAa,EAAE;YAClC,iDAAiD;SAClD,CAAA;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,iCAAiC;IACjC,IAAI,UAAsB,CAAA;IAC1B,IAAI,CAAC;QACH,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC1C,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,EAAE,CAAA;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,MAAM,GAAG,4BAA4B,CAAC,EAAE,CAAA;QAC/C,OAAO,MAAM,CAAA;IACf,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;QAC5B,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAA,CAAC,0BAA0B;IAC5D,CAAC;SAAM,CAAC;QACN,yBAAyB;QACzB,IAAI,UAA6C,CAAA;QACjD,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAA;QAC9C,MAAM,gBAAgB,GAAG,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,YAAY,CAAC,CAAA;QACpE,MAAM,WAAW,GAAG,KAAK,CAAA,CAAC,WAAW;QAErC,IAAI,gBAAgB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,WAAW,EAAE,CAAC;YAChF,UAAU,GAAG,gBAAgB,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;YACjC,IAAI,OAAO,EAAE,eAAe,EAAE,CAAC;gBAC7B,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,GAAG,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACrF,CAAC;QACH,CAAC;QAED,MAAM,CAAC,iBAAiB,GAAG,UAAU,CAAC,KAAK,CAAA;QAE3C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,MAAM,GAAG,8BAA8B,UAAU,CAAC,MAAM,CAAC,MAAM,iDAAiD,CAAA;YACvH,MAAM,CAAC,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;YACvF,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;YACvD,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,IAAI,aAAa,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAA;QACpD,MAAM,eAAe,GAAG,4BAA4B,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;QACzE,IAAI,CAAC,eAAe,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAA;YACvD,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAC1B,iCAAiC,YAAY,CAAC,MAAM,4CAA4C;gBAChG,gFAAgF,CACjF,CAAA;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,OAAO,EAAE,kBAAkB,IAAI,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtG,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;QACrC,MAAM,QAAQ,GAAG,OAAO,EAAE,cAAc,IAAI,CAAC,CAAA;QAC7C,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACvD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM;gBAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACpD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;gBAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,MAAM,CAAC,cAAc,GAAG,WAAW,WAAW,CAAC,IAAI,iBAAiB,CAAA;IACtE,CAAC;SAAM,IAAI,OAAO,EAAE,kBAAkB,EAAE,CAAC;QACvC,MAAM,CAAC,cAAc,GAAG,yBAAyB,CAAA;IACnD,CAAC;IAED,4BAA4B;IAC5B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,MAAM,CAAC,MAAM,GAAG,8BAA8B,UAAU,CAAC,EAAE,sDAAsD,CAAA;IACjH,MAAM,CAAC,WAAW,GAAG,IAAI,CAAA;IAEzB,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;IAExD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAAC,KAAe,EAAE,KAAqB;IACpE,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,IAAI,WAAW,GAAG,KAAK,CAAA;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACpH,WAAW,GAAG,IAAI,CAAA;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5L,UAAU,GAAG,IAAI,CAAA;QACnB,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChG,WAAW,GAAG,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,OAAO,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC,CAAA;AACnG,CAAC;AAED;;;GAGG;AACH,SAAS,4BAA4B,CACnC,KAAqB,EACrB,gBAA0B;IAE1B,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAE9C,KAAK,MAAM,UAAU,IAAI,gBAAgB,EAAE,CAAC;QAC1C,iCAAiC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;YAC9E,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAC7E,CAAA;QACD,IAAI,CAAC,MAAM;YAAE,SAAQ;QAErB,2CAA2C;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CACtD,CAAA;QACD,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;IAC5B,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAsB,EACtB,MAAyB;IAEzB,MAAM,KAAK,GAAa;QACtB,6BAA6B;QAC7B,qBAAqB,OAAO,CAAC,IAAI,EAAE;QACnC,oBAAoB,OAAO,CAAC,WAAW,EAAE;QACzC,gBAAgB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QAC/C,kBAAkB,MAAM,CAAC,SAAS,IAAI,KAAK,EAAE;QAC7C,mBAAmB,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;QACnE,oBAAoB,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;KACxD,CAAA;IAED,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,IAAI,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QACpC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAC9B,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;QAC9D,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;QAC3C,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1B,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;QAClD,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;QAC3C,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;IACtD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QACnC,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;QACtE,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACxE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAqB,EACrB,OAAsB,EACtB,mBAA6B,EAAE,EAC/B,gBAA0B,EAAE,EAC5B,OAA4B;IAE5B,oEAAoE;IACpE,yCAAyC;IACzC,MAAM,qBAAqB,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,GAAG,EAAE,CAAA;IACnE,MAAM,aAAa,GAAG,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,CAAA;IAE5E,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE;QACpC,GAAG,OAAO;QACV,iBAAiB,EAAE,gBAAgB;QACnC,cAAc,EAAE,aAAa;KAC9B,EAAE,aAAa,CAAC,CAAA;IAEjB,sEAAsE;IACtE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAA;QAC9C,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAChE,MAAM,UAAU,GAAG,gBAAgB,IAAI,aAAa,CAAC,KAAK,CAAC,CAAA;QAC3D,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,CAAA;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,GAAG,MAAM;gBACT,cAAc,EAAE,KAAK;gBACrB,MAAM,EAAE,yCAAyC,UAAU,CAAC,MAAM,CAAC,MAAM,0CAA0C;aACpH,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFR,CAAA;AACD,CAAC"}
@@ -0,0 +1,66 @@
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
+ export interface WorkflowState {
12
+ /** Whether sdd.enforce has been called in this session */
13
+ enforced: boolean;
14
+ /** Change node ID created by sdd.enforce */
15
+ changeId: string | null;
16
+ /** Whether the current change has been approved */
17
+ approved: boolean;
18
+ /** Whether sdd.validate has passed since last enforce */
19
+ validated: boolean;
20
+ /** Timestamp of last enforce call */
21
+ enforcedAt: number;
22
+ /** Whether discovery is in progress (sdd.discover was called) */
23
+ discovering: boolean;
24
+ /** Whether the SDD spec has been updated since last enforce (add_node, update_node, update_from_answers) */
25
+ specUpdated: boolean;
26
+ }
27
+ /** Reset workflow state (called on session start or /sdd off) */
28
+ export declare function resetWorkflowState(): void;
29
+ /** Mark that sdd.enforce was called */
30
+ export declare function markEnforced(changeId: string): void;
31
+ /** Mark that the change was approved */
32
+ export declare function markApproved(): void;
33
+ /** Mark that sdd.validate passed */
34
+ export declare function markValidated(): void;
35
+ /** Mark that discovery is in progress */
36
+ export declare function markDiscovering(discovering: boolean): void;
37
+ /** Mark that the SDD spec has been updated (add_node, update_node, update_from_answers) */
38
+ export declare function markSpecUpdated(): void;
39
+ /** Mark that the change was completed (resets state) */
40
+ export declare function markCompleted(): void;
41
+ /** Check if workflow is in a valid state for graph mutations */
42
+ export declare function isWorkflowValid(): {
43
+ valid: boolean;
44
+ reason?: string;
45
+ };
46
+ /** Get current workflow state (read-only) */
47
+ export declare function getWorkflowState(): Readonly<WorkflowState>;
48
+ /**
49
+ * Tools that are ALLOWED without workflow context.
50
+ * These are read-only or workflow-entry tools.
51
+ */
52
+ export declare const WORKFLOW_EXEMPT_TOOLS: Set<string>;
53
+ /**
54
+ * Tools that REQUIRE workflow context (graph mutations).
55
+ * These modify the SDD graph and must go through the workflow.
56
+ */
57
+ export declare const WORKFLOW_REQUIRED_TOOLS: Set<string>;
58
+ /**
59
+ * Check if a tool requires workflow context.
60
+ * Returns null if the tool is allowed, or an error message if blocked.
61
+ */
62
+ export declare function checkToolAccess(toolName: string): {
63
+ allowed: boolean;
64
+ reason?: string;
65
+ };
66
+ //# sourceMappingURL=workflow-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-tracker.d.ts","sourceRoot":"","sources":["../../../src/sdd/enforcement/workflow-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAA;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,mDAAmD;IACnD,QAAQ,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAA;IAClB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,WAAW,EAAE,OAAO,CAAA;IACpB,4GAA4G;IAC5G,WAAW,EAAE,OAAO,CAAA;CACrB;AAYD,iEAAiE;AACjE,wBAAgB,kBAAkB,IAAI,IAAI,CAQzC;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOnD;AAED,wCAAwC;AACxC,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,oCAAoC;AACpC,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,yCAAyC;AACzC,wBAAgB,eAAe,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAE1D;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wDAAwD;AACxD,wBAAgB,aAAa,IAAI,IAAI,CAOpC;AAED,gEAAgE;AAChE,wBAAgB,eAAe,IAAI;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAkBrE;AAED,6CAA6C;AAC7C,wBAAgB,gBAAgB,IAAI,QAAQ,CAAC,aAAa,CAAC,CAE1D;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,aAkGhC,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,aAQlC,CAAA;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBvF"}
@@ -0,0 +1,229 @@
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
+ const state = {
12
+ enforced: false,
13
+ changeId: null,
14
+ approved: false,
15
+ validated: false,
16
+ enforcedAt: 0,
17
+ discovering: false,
18
+ specUpdated: false,
19
+ };
20
+ /** Reset workflow state (called on session start or /sdd off) */
21
+ export function resetWorkflowState() {
22
+ state.enforced = false;
23
+ state.changeId = null;
24
+ state.approved = false;
25
+ state.validated = false;
26
+ state.enforcedAt = 0;
27
+ state.discovering = false;
28
+ state.specUpdated = false;
29
+ }
30
+ /** Mark that sdd.enforce was called */
31
+ export function markEnforced(changeId) {
32
+ state.enforced = true;
33
+ state.changeId = changeId;
34
+ state.approved = false;
35
+ state.validated = false;
36
+ state.enforcedAt = Date.now();
37
+ state.specUpdated = false;
38
+ }
39
+ /** Mark that the change was approved */
40
+ export function markApproved() {
41
+ state.approved = true;
42
+ }
43
+ /** Mark that sdd.validate passed */
44
+ export function markValidated() {
45
+ state.validated = true;
46
+ }
47
+ /** Mark that discovery is in progress */
48
+ export function markDiscovering(discovering) {
49
+ state.discovering = discovering;
50
+ }
51
+ /** Mark that the SDD spec has been updated (add_node, update_node, update_from_answers) */
52
+ export function markSpecUpdated() {
53
+ state.specUpdated = true;
54
+ }
55
+ /** Mark that the change was completed (resets state) */
56
+ export function markCompleted() {
57
+ state.enforced = false;
58
+ state.changeId = null;
59
+ state.approved = false;
60
+ state.validated = false;
61
+ state.enforcedAt = 0;
62
+ state.specUpdated = false;
63
+ }
64
+ /** Check if workflow is in a valid state for graph mutations */
65
+ export function isWorkflowValid() {
66
+ if (!state.enforced) {
67
+ return {
68
+ valid: false,
69
+ reason: "No SDD workflow active. Call sdd.enforce first to classify the change and create a Change node.",
70
+ };
71
+ }
72
+ // Allow a 30-minute window for workflow completion
73
+ const maxAge = 30 * 60 * 1000;
74
+ if (Date.now() - state.enforcedAt > maxAge) {
75
+ return {
76
+ valid: false,
77
+ reason: "SDD workflow expired (>30 min). Call sdd.enforce again.",
78
+ };
79
+ }
80
+ return { valid: true };
81
+ }
82
+ /** Get current workflow state (read-only) */
83
+ export function getWorkflowState() {
84
+ return { ...state };
85
+ }
86
+ /**
87
+ * Tools that are ALLOWED without workflow context.
88
+ * These are read-only or workflow-entry tools.
89
+ */
90
+ export const WORKFLOW_EXEMPT_TOOLS = new Set([
91
+ "sdd.initialize",
92
+ "sdd.inspect",
93
+ "sdd.query_graph",
94
+ "sdd.list_nodes",
95
+ "sdd.count_nodes",
96
+ "sdd.get_nodes_by_status",
97
+ "sdd.get_context",
98
+ "sdd.find_path",
99
+ "sdd.analyze_impact",
100
+ "sdd.validate",
101
+ "sdd.detect_drift",
102
+ "sdd.config_drift",
103
+ "sdd.detect_sync_conflicts",
104
+ "sdd.quality",
105
+ "sdd.contradictions",
106
+ "sdd.verify_usage",
107
+ "sdd.find_dead_code",
108
+ "sdd.parse_symbols",
109
+ "sdd.analyze_complexity",
110
+ "sdd.code_metrics",
111
+ "sdd.detect_smells",
112
+ "sdd.analyze_dependencies",
113
+ "sdd.anti_patterns",
114
+ "sdd.clone_detection",
115
+ "sdd.promises",
116
+ "sdd.coverage",
117
+ "sdd.check_compliance",
118
+ "sdd.security_audit",
119
+ "sdd.analyze_scalability",
120
+ "sdd.traverse_outgoing",
121
+ "sdd.traverse_incoming",
122
+ "sdd.traverse_both",
123
+ "sdd.get_subgraph",
124
+ "sdd.pending_changes",
125
+ "sdd.list_snapshots",
126
+ "sdd.sync_status",
127
+ "sdd.remote_status",
128
+ "sdd.mcp_server_info",
129
+ "sdd.handle_mcp_tool",
130
+ // Workflow entry points (start the workflow)
131
+ "sdd.enforce",
132
+ "sdd.enforce_rules",
133
+ "sdd.discover",
134
+ "sdd.update_from_answers",
135
+ "sdd.create_change",
136
+ "sdd.approve_change",
137
+ "sdd.complete_change",
138
+ "sdd.verify_implementation",
139
+ // Enterprise workflows (they manage their own enforcement)
140
+ "sdd.bug_fix",
141
+ "sdd.hotfix",
142
+ "sdd.refactoring",
143
+ "sdd.deprecate",
144
+ "sdd.create_migration",
145
+ "sdd.create_experiment",
146
+ "sdd.create_flag",
147
+ "sdd.create_tenant",
148
+ "sdd.onboard_developer",
149
+ "sdd.report_incident",
150
+ "sdd.create_sla",
151
+ "sdd.estimate_cost",
152
+ "sdd.generate_docs",
153
+ "sdd.knowledge_transfer",
154
+ "sdd.disaster_recovery_plan",
155
+ "sdd.setup_monitoring",
156
+ "sdd.generate_dashboard",
157
+ // Toggle and config
158
+ "sdd.toggle",
159
+ "sdd.toggle_status",
160
+ "sdd.constitution",
161
+ // Session and export
162
+ "sdd.session_handoff",
163
+ "sdd.workflow_export",
164
+ // Permissions
165
+ "sdd.load_permissions_config",
166
+ "sdd.save_permissions_config",
167
+ "sdd.check_permission",
168
+ "sdd.check_change_approval",
169
+ "sdd.set_role",
170
+ "sdd.get_user_role",
171
+ "sdd.audit_log",
172
+ "sdd.detect_remote",
173
+ // Infrastructure
174
+ "sdd.install_hooks",
175
+ "sdd.brownfield_scan",
176
+ "sdd.start_dashboard",
177
+ "sdd.generate_cicd",
178
+ // Sync
179
+ "sdd.sync_pull",
180
+ "sdd.sync_push",
181
+ "sdd.merge_graphs",
182
+ // Rollback
183
+ "sdd.rollback",
184
+ "sdd.rollback_history",
185
+ "sdd.create_snapshot",
186
+ // Graph build
187
+ "sdd.build_graph",
188
+ ]);
189
+ /**
190
+ * Tools that REQUIRE workflow context (graph mutations).
191
+ * These modify the SDD graph and must go through the workflow.
192
+ */
193
+ export const WORKFLOW_REQUIRED_TOOLS = new Set([
194
+ "sdd.add_node",
195
+ "sdd.update_node",
196
+ "sdd.remove_node",
197
+ "sdd.add_relationship",
198
+ "sdd.remove_relationship",
199
+ "sdd.generate_code",
200
+ "sdd.remove_dead_code",
201
+ ]);
202
+ /**
203
+ * Check if a tool requires workflow context.
204
+ * Returns null if the tool is allowed, or an error message if blocked.
205
+ */
206
+ export function checkToolAccess(toolName) {
207
+ // SDD tools only
208
+ if (!toolName.startsWith("sdd.")) {
209
+ return { allowed: true };
210
+ }
211
+ // Exempt tools are always allowed
212
+ if (WORKFLOW_EXEMPT_TOOLS.has(toolName)) {
213
+ return { allowed: true };
214
+ }
215
+ // Required tools need workflow context
216
+ if (WORKFLOW_REQUIRED_TOOLS.has(toolName)) {
217
+ const workflow = isWorkflowValid();
218
+ if (!workflow.valid) {
219
+ return {
220
+ allowed: false,
221
+ 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}`,
222
+ };
223
+ }
224
+ return { allowed: true };
225
+ }
226
+ // Unknown SDD tools are allowed (future tools)
227
+ return { allowed: true };
228
+ }
229
+ //# sourceMappingURL=workflow-tracker.js.map