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,577 @@
1
+ import type { KnowledgeGraph, ChangeNode, FileNode } from "../domain/types.js"
2
+ import { getNodesByType, getNode } from "../graph/engine.js"
3
+ import { readFileSync, existsSync, readdirSync } from "fs"
4
+ import { join, extname, relative } from "path"
5
+
6
+ export interface MutantDuplicate {
7
+ file_a: string
8
+ file_b: string
9
+ similarity: number
10
+ }
11
+
12
+ /**
13
+ * Options for controlling duplicate detection scope.
14
+ * The AI can use these to focus or exclude specific areas.
15
+ */
16
+ export interface DuplicateDetectionOptions {
17
+ /** Only scan these paths (relative to projectDir). If empty, scan all. */
18
+ focusPaths?: string[]
19
+ /** Exclude paths matching these patterns (supports glob-like wildcards). */
20
+ excludePatterns?: string[]
21
+ /** Exclude these specific file paths (exact match). */
22
+ excludeFiles?: string[]
23
+ /** Already verified file pairs — skip these to avoid re-checking. */
24
+ alreadyVerified?: Array<{ file_a: string; file_b: string }>
25
+ /** Minimum similarity threshold (default 0.85). */
26
+ similarityThreshold?: number
27
+ }
28
+
29
+ export interface ArchitectureViolation {
30
+ file: string
31
+ import_path: string
32
+ from_layer: string
33
+ to_layer: string
34
+ }
35
+
36
+ export interface PatternFragmentation {
37
+ entity: string
38
+ similar_functions: string[]
39
+ pattern: string
40
+ }
41
+
42
+ export interface TemporalVolatility {
43
+ file_a: string
44
+ file_b: string
45
+ co_occurrence_count: number
46
+ change_ids: string[]
47
+ }
48
+
49
+ export interface DriftSignals {
50
+ mutant_duplicates: MutantDuplicate[]
51
+ architecture_violations: ArchitectureViolation[]
52
+ pattern_fragmentation: PatternFragmentation[]
53
+ temporal_volatility: TemporalVolatility[]
54
+ total_signals: number
55
+ }
56
+
57
+ const LAYER_MAP: Record<string, string> = {
58
+ ".tsx": "frontend",
59
+ ".jsx": "frontend",
60
+ ".vue": "frontend",
61
+ ".svelte": "frontend",
62
+ ".ts": "backend",
63
+ ".js": "backend",
64
+ ".py": "backend",
65
+ ".go": "backend",
66
+ ".rs": "backend",
67
+ ".java": "backend",
68
+ ".rb": "backend",
69
+ }
70
+
71
+ export function detectAllSignals(
72
+ graph: KnowledgeGraph,
73
+ projectDir: string,
74
+ options?: DuplicateDetectionOptions,
75
+ ): DriftSignals {
76
+ const result: DriftSignals = {
77
+ mutant_duplicates: [],
78
+ architecture_violations: [],
79
+ pattern_fragmentation: [],
80
+ temporal_volatility: [],
81
+ total_signals: 0,
82
+ }
83
+
84
+ result.mutant_duplicates = detectMutantDuplicates(projectDir, options)
85
+ result.architecture_violations = detectArchitectureViolations(graph, projectDir)
86
+ result.pattern_fragmentation = detectPatternFragmentation(graph)
87
+ result.temporal_volatility = detectTemporalVolatility(graph)
88
+
89
+ result.total_signals =
90
+ result.mutant_duplicates.length +
91
+ result.architecture_violations.length +
92
+ result.pattern_fragmentation.length +
93
+ result.temporal_volatility.length
94
+
95
+ return result
96
+ }
97
+
98
+ function detectMutantDuplicates(
99
+ projectDir: string,
100
+ options?: DuplicateDetectionOptions,
101
+ ): MutantDuplicate[] {
102
+ const duplicates: MutantDuplicate[] = []
103
+ const threshold = options?.similarityThreshold ?? 0.85
104
+ const MAX_COMPARE_SIZE = 5120 // 5KB cap per file for Levenshtein
105
+
106
+ // Build exclusion sets for O(1) lookup
107
+ const excludeSet = new Set(options?.excludeFiles?.map(f => f.replace(/^\.\//, "")) || [])
108
+ const excludePatterns = options?.excludePatterns || []
109
+ const focusPaths = options?.focusPaths || []
110
+
111
+ // Build set of already-verified pairs to skip
112
+ const verifiedPairs = new Set<string>()
113
+ if (options?.alreadyVerified) {
114
+ for (const pair of options.alreadyVerified) {
115
+ // Normalize and store both orderings
116
+ const a = pair.file_a.replace(/^\.\//, "")
117
+ const b = pair.file_b.replace(/^\.\//, "")
118
+ verifiedPairs.add([a, b].sort().join("|||"))
119
+ }
120
+ }
121
+
122
+ // Collect files — either focused or full scan
123
+ let tsFiles: string[]
124
+ if (focusPaths.length > 0) {
125
+ // Focused scan: only scan specified paths
126
+ tsFiles = []
127
+ for (const fp of focusPaths) {
128
+ const fullPath = join(projectDir, fp)
129
+ if (existsSync(fullPath)) {
130
+ tsFiles.push(fullPath)
131
+ } else {
132
+ // Maybe it's a directory — scan it
133
+ tsFiles.push(...collectTsFiles(fullPath))
134
+ }
135
+ }
136
+ } else {
137
+ tsFiles = collectTsFiles(projectDir)
138
+ }
139
+
140
+ // Pre-read and normalize all files once (avoids repeated I/O)
141
+ const fileData: Array<{ path: string; relPath: string; content: string; size: number; tokens: Map<string, number> }> = []
142
+
143
+ for (const filePath of tsFiles) {
144
+ const relPath = relative(projectDir, filePath)
145
+
146
+ // Apply exclusions
147
+ if (excludeSet.has(relPath)) continue
148
+ if (excludePatterns.some(p => matchesPattern(relPath, p))) continue
149
+
150
+ const raw = readFileSafe(filePath)
151
+ if (raw.length < 50) continue
152
+ const content = normalizeCode(raw)
153
+ if (content.length < 50) continue
154
+ const tokens = buildTokenFrequency(content)
155
+ fileData.push({ path: filePath, relPath, content, size: content.length, tokens })
156
+ }
157
+
158
+ // Smart comparison: 3-phase filter to minimize Levenshtein calls
159
+ for (let i = 0; i < fileData.length; i++) {
160
+ for (let j = i + 1; j < fileData.length; j++) {
161
+ const a = fileData[i]
162
+ const b = fileData[j]
163
+
164
+ // Skip already-verified pairs
165
+ const pairKey = [a.relPath, b.relPath].sort().join("|||")
166
+ if (verifiedPairs.has(pairKey)) continue
167
+
168
+ // Phase 1: Size-based skip (files >30% different in size are unlikely duplicates)
169
+ const sizeRatio = Math.abs(a.size - b.size) / Math.max(a.size, b.size)
170
+ if (sizeRatio > 0.3) continue
171
+
172
+ // Phase 2: Token frequency similarity (O(n) fast check)
173
+ const tokenSim = tokenFrequencySimilarity(a.tokens, b.tokens)
174
+ if (tokenSim < 0.7) continue
175
+
176
+ // Phase 3: Levenshtein on capped content (final confirmation)
177
+ const sampleA = a.content.slice(0, MAX_COMPARE_SIZE)
178
+ const sampleB = b.content.slice(0, MAX_COMPARE_SIZE)
179
+ const similarity = levenshteinSimilarity(sampleA, sampleB)
180
+
181
+ if (similarity > threshold) {
182
+ duplicates.push({
183
+ file_a: a.relPath,
184
+ file_b: b.relPath,
185
+ similarity: Math.round(similarity * 100) / 100,
186
+ })
187
+ }
188
+ }
189
+ }
190
+
191
+ return duplicates
192
+ }
193
+
194
+ /**
195
+ * Simple pattern matching (supports * wildcard at end of pattern).
196
+ */
197
+ function matchesPattern(path: string, pattern: string): boolean {
198
+ if (pattern.endsWith("/*")) {
199
+ const prefix = pattern.slice(0, -2)
200
+ return path.startsWith(prefix + "/") || path === prefix
201
+ }
202
+ if (pattern.endsWith("/**")) {
203
+ const prefix = pattern.slice(0, -3)
204
+ return path.startsWith(prefix + "/") || path === prefix
205
+ }
206
+ // Exact match
207
+ return path === pattern
208
+ }
209
+
210
+ function detectArchitectureViolations(graph: KnowledgeGraph, projectDir: string): ArchitectureViolation[] {
211
+ const violations: ArchitectureViolation[] = []
212
+ const tsFiles = collectTsFiles(projectDir)
213
+
214
+ // ── Build layer maps from Knowledge Graph ─────────────────────────
215
+ // 1. Technology → layer from architecture_component nodes
216
+ const techToLayer = new Map<string, string>()
217
+ const archNodes = getNodesByType(graph, "architecture_component")
218
+ for (const arch of archNodes) {
219
+ const meta = arch.metadata as { layer?: string; technology?: string }
220
+ if (meta.layer && meta.technology) {
221
+ techToLayer.set(meta.technology.toLowerCase(), meta.layer)
222
+ }
223
+ }
224
+
225
+ // 2. File path → layer from file nodes in graph
226
+ const fileNodePathToLayer = new Map<string, string>()
227
+ const fileNodes = getNodesByType<FileNode>(graph, "file")
228
+ for (const fn of fileNodes) {
229
+ const path = fn.metadata.path
230
+ if (!path) continue
231
+ // Infer layer from path patterns (same as validator.ts)
232
+ const lower = path.toLowerCase()
233
+ if (lower.includes("client") || lower.includes("frontend") || lower.includes("pages/") || lower.includes("components/")) {
234
+ fileNodePathToLayer.set(path, "frontend")
235
+ } else if (lower.includes("server") || lower.includes("backend") || lower.includes("routes/") || lower.includes("controllers/") || lower.includes("services/") || lower.includes("repositories/")) {
236
+ fileNodePathToLayer.set(path, "backend")
237
+ } else if (lower.includes("database") || lower.includes("migrations/") || lower.includes("schema")) {
238
+ fileNodePathToLayer.set(path, "database")
239
+ } else if (lower.includes("shared") || lower.includes("common")) {
240
+ fileNodePathToLayer.set(path, "shared")
241
+ }
242
+ }
243
+
244
+ for (const filePath of tsFiles) {
245
+ const content = readFileSafe(filePath)
246
+ const imports = extractImports(content)
247
+ const relPath = relative(projectDir, filePath)
248
+
249
+ // Determine source layer: graph file node → path inference → extension fallback
250
+ let fromLayer = fileNodePathToLayer.get(relPath)
251
+ || inferLayerFromPath(relPath)
252
+ || LAYER_MAP[extname(filePath)]
253
+ || "backend"
254
+
255
+ for (const imp of imports) {
256
+ // Determine target layer: technology match → path inference → extension fallback
257
+ let toLayer: string | null = null
258
+
259
+ // Check if import matches an architecture component technology
260
+ const impLower = imp.toLowerCase()
261
+ for (const [tech, layer] of techToLayer) {
262
+ if (impLower.includes(tech)) {
263
+ toLayer = layer
264
+ break
265
+ }
266
+ }
267
+
268
+ // For relative imports, try to resolve and check file nodes
269
+ if (!toLayer && imp.startsWith(".")) {
270
+ const resolved = resolveImportPath(filePath, imp)
271
+ if (resolved) {
272
+ const resolvedRel = relative(projectDir, resolved)
273
+ toLayer = fileNodePathToLayer.get(resolvedRel)
274
+ || inferLayerFromPath(resolvedRel)
275
+ }
276
+ }
277
+
278
+ // Extension fallback (last resort)
279
+ if (!toLayer) {
280
+ const toExt = extname(imp) || extname(resolveImportPath(filePath, imp))
281
+ toLayer = LAYER_MAP[toExt] || "backend"
282
+ }
283
+
284
+ if (fromLayer === "frontend" && toLayer === "backend") {
285
+ // Allow known shared/utility patterns
286
+ if (!imp.includes("api") && !imp.includes("shared") && !imp.includes("types") && !imp.includes("common")) {
287
+ violations.push({
288
+ file: relPath,
289
+ import_path: imp,
290
+ from_layer: fromLayer,
291
+ to_layer: toLayer,
292
+ })
293
+ }
294
+ }
295
+ }
296
+ }
297
+
298
+ return violations
299
+ }
300
+
301
+ /**
302
+ * Infer layer from file path patterns (shared logic with validator.ts/smart-validator.ts).
303
+ */
304
+ function inferLayerFromPath(path: string): string | null {
305
+ const p = path.toLowerCase()
306
+ if (p.includes("client") || p.includes("frontend") || p.includes("pages/") || p.includes("components/")) return "frontend"
307
+ if (p.includes("server") || p.includes("backend") || p.includes("routes/") || p.includes("controllers/") || p.includes("services/") || p.includes("repositories/")) return "backend"
308
+ if (p.includes("database") || p.includes("migrations/") || p.includes("schema")) return "database"
309
+ if (p.includes("shared") || p.includes("common")) return "shared"
310
+ return null
311
+ }
312
+
313
+ function detectPatternFragmentation(graph: KnowledgeGraph): PatternFragmentation[] {
314
+ const fragments: PatternFragmentation[] = []
315
+ const entities = getNodesByType(graph, "entity")
316
+
317
+ for (const entity of entities) {
318
+ const relatedNodes = graph.relationships
319
+ .filter((r) => r.from === entity.id || r.to === entity.id)
320
+ .map((r) => getNode(graph, r.from === entity.id ? r.to : r.from))
321
+ .filter(Boolean)
322
+
323
+ const functionNames = relatedNodes
324
+ .filter((n) => n && (n.type === "symbol" || n.type === "endpoint"))
325
+ .map((n) => n!.name)
326
+
327
+ const stems = functionNames.map((name) => normalizeFunctionName(name))
328
+ const stemCounts: Record<string, string[]> = {}
329
+ for (let i = 0; i < stems.length; i++) {
330
+ const stem = stems[i]
331
+ if (!stemCounts[stem]) stemCounts[stem] = []
332
+ stemCounts[stem].push(functionNames[i])
333
+ }
334
+
335
+ for (const [stem, names] of Object.entries(stemCounts)) {
336
+ if (names.length >= 3) {
337
+ fragments.push({
338
+ entity: entity.name,
339
+ similar_functions: names,
340
+ pattern: stem,
341
+ })
342
+ }
343
+ }
344
+ }
345
+
346
+ return fragments
347
+ }
348
+
349
+ function detectTemporalVolatility(graph: KnowledgeGraph): TemporalVolatility[] {
350
+ const volatile: TemporalVolatility[] = []
351
+ const changes = getNodesByType<ChangeNode>(graph, "change")
352
+
353
+ const fileCoOccurrence: Record<string, { count: number; changeIds: string[] }> = {}
354
+
355
+ for (const change of changes) {
356
+ const files = change.metadata.affected_files || []
357
+ for (let i = 0; i < files.length; i++) {
358
+ for (let j = i + 1; j < files.length; j++) {
359
+ const key = [files[i], files[j]].sort().join("|||")
360
+ if (!fileCoOccurrence[key]) {
361
+ fileCoOccurrence[key] = { count: 0, changeIds: [] }
362
+ }
363
+ fileCoOccurrence[key].count++
364
+ fileCoOccurrence[key].changeIds.push(change.id)
365
+ }
366
+ }
367
+ }
368
+
369
+ for (const [key, data] of Object.entries(fileCoOccurrence)) {
370
+ if (data.count >= 3) {
371
+ const [fileA, fileB] = key.split("|||")
372
+ volatile.push({
373
+ file_a: fileA,
374
+ file_b: fileB,
375
+ co_occurrence_count: data.count,
376
+ change_ids: data.changeIds,
377
+ })
378
+ }
379
+ }
380
+
381
+ return volatile.sort((a, b) => b.co_occurrence_count - a.co_occurrence_count).slice(0, 20)
382
+ }
383
+
384
+ function collectTsFiles(dir: string): string[] {
385
+ const files: string[] = []
386
+ if (!existsSync(dir)) return files
387
+
388
+ const walk = (d: string) => {
389
+ const entries = readdirSync(d, { withFileTypes: true })
390
+ for (const entry of entries) {
391
+ const fullPath = join(d, entry.name)
392
+ if (entry.isDirectory()) {
393
+ if (!entry.name.startsWith(".") && entry.name !== "node_modules" && entry.name !== "dist") {
394
+ walk(fullPath)
395
+ }
396
+ } else if (/\.(ts|tsx|js|jsx)$/.test(entry.name)) {
397
+ files.push(fullPath)
398
+ }
399
+ }
400
+ }
401
+
402
+ walk(dir)
403
+ return files
404
+ }
405
+
406
+ function readFileSafe(path: string): string {
407
+ try {
408
+ return readFileSync(path, "utf-8")
409
+ } catch {
410
+ return ""
411
+ }
412
+ }
413
+
414
+ function normalizeCode(code: string): string {
415
+ return code
416
+ .replace(/\/\/.*$/gm, "")
417
+ .replace(/\/\*[\s\S]*?\*\//g, "")
418
+ // Simplify imports to keep module names (preserves dependency info for duplicate detection)
419
+ .replace(/import\s+\{[^}]*\}\s+from\s+['"]([^'"]+)['"]/g, "import from $1")
420
+ .replace(/import\s+[^\s]+\s+from\s+['"]([^'"]+)['"]/g, "import from $1")
421
+ .replace(/import\s+['"]([^'"]+)['"]/g, "import from $1")
422
+ .replace(/export\s+/g, "")
423
+ .replace(/\s+/g, " ")
424
+ .trim()
425
+ }
426
+
427
+ function extractImports(content: string): string[] {
428
+ const imports: string[] = []
429
+ const importRegex = /import\s+.*from\s+['"]([^'"]+)['"]/g
430
+ let match: RegExpExecArray | null
431
+ while ((match = importRegex.exec(content)) !== null) {
432
+ imports.push(match[1])
433
+ }
434
+ return imports
435
+ }
436
+
437
+ function resolveImportPath(filePath: string, importPath: string): string {
438
+ if (importPath.startsWith(".")) {
439
+ const dir = join(filePath, "..")
440
+ return join(dir, importPath)
441
+ }
442
+ return ""
443
+ }
444
+
445
+ function normalizeFunctionName(name: string): string {
446
+ return name
447
+ .replace(/^(get|fetch|load|find|read|query|search)/i, "")
448
+ .replace(/^(set|create|add|insert|write|save|update|delete|remove)/i, "")
449
+ .toLowerCase()
450
+ }
451
+
452
+ function levenshteinSimilarity(a: string, b: string): number {
453
+ if (a === b) return 1
454
+ if (a.length === 0 || b.length === 0) return 0
455
+
456
+ const lenA = a.length
457
+ const lenB = b.length
458
+ const maxLen = Math.max(lenA, lenB)
459
+
460
+ // Use sampling for very large files to avoid O(m×n) blowup
461
+ if (maxLen > 10000) {
462
+ return quickSimilarity(a, b)
463
+ }
464
+
465
+ const matrix: number[][] = Array.from({ length: lenA + 1 }, () => Array(lenB + 1).fill(0))
466
+
467
+ for (let i = 0; i <= lenA; i++) matrix[i][0] = i
468
+ for (let j = 0; j <= lenB; j++) matrix[0][j] = j
469
+
470
+ for (let i = 1; i <= lenA; i++) {
471
+ for (let j = 1; j <= lenB; j++) {
472
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1
473
+ matrix[i][j] = Math.min(
474
+ matrix[i - 1][j] + 1,
475
+ matrix[i][j - 1] + 1,
476
+ matrix[i - 1][j - 1] + cost,
477
+ )
478
+ }
479
+ }
480
+
481
+ return 1 - matrix[lenA][lenB] / maxLen
482
+ }
483
+
484
+ /**
485
+ * Build a frequency map of meaningful tokens from code.
486
+ * Used as a fast pre-filter before Levenshtein comparison.
487
+ */
488
+ function buildTokenFrequency(code: string): Map<string, number> {
489
+ const freq = new Map<string, number>()
490
+ // Extract identifiers and keywords (ignore operators/punctuation)
491
+ const tokens = code.match(/[a-zA-Z_$][a-zA-Z0-9_$]*/g) || []
492
+ for (const token of tokens) {
493
+ const lower = token.toLowerCase()
494
+ freq.set(lower, (freq.get(lower) || 0) + 1)
495
+ }
496
+ return freq
497
+ }
498
+
499
+ /**
500
+ * Compute cosine-like similarity between two token frequency maps.
501
+ * Returns 0..1 where 1 = identical token distribution.
502
+ * O(n) where n = number of unique tokens.
503
+ */
504
+ function tokenFrequencySimilarity(a: Map<string, number>, b: Map<string, number>): number {
505
+ if (a.size === 0 && b.size === 0) return 1
506
+ if (a.size === 0 || b.size === 0) return 0
507
+
508
+ let dotProduct = 0
509
+ let normA = 0
510
+ let normB = 0
511
+
512
+ // Iterate over the smaller map for efficiency
513
+ const [smaller, larger] = a.size <= b.size ? [a, b] : [b, a]
514
+ for (const [token, countA] of smaller) {
515
+ normA += countA * countA
516
+ const countB = larger.get(token)
517
+ if (countB !== undefined) {
518
+ dotProduct += countA * countB
519
+ }
520
+ }
521
+ for (const [, countB] of larger) {
522
+ normB += countB * countB
523
+ }
524
+
525
+ if (normA === 0 || normB === 0) return 0
526
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB))
527
+ }
528
+
529
+ function quickSimilarity(a: string, b: string): number {
530
+ const sampleA = a.slice(0, 500)
531
+ const sampleB = b.slice(0, 500)
532
+ return levenshteinSimilarity(sampleA, sampleB)
533
+ }
534
+
535
+ export function formatDriftSignals(signals: DriftSignals): string {
536
+ const lines: string[] = []
537
+
538
+ if (signals.total_signals === 0) {
539
+ return "✅ No drift signals detected."
540
+ }
541
+
542
+ lines.push(`## Drift Signals (${signals.total_signals} total)\n`)
543
+
544
+ if (signals.mutant_duplicates.length > 0) {
545
+ lines.push(`### Mutant Duplicates (${signals.mutant_duplicates.length})`)
546
+ for (const d of signals.mutant_duplicates.slice(0, 10)) {
547
+ lines.push(`- ${d.file_a} ↔ ${d.file_b} (${(d.similarity * 100).toFixed(0)}% similar)`)
548
+ }
549
+ lines.push("")
550
+ }
551
+
552
+ if (signals.architecture_violations.length > 0) {
553
+ lines.push(`### Architecture Violations (${signals.architecture_violations.length})`)
554
+ for (const v of signals.architecture_violations.slice(0, 10)) {
555
+ lines.push(`- ${v.file}: imports ${v.import_path} (${v.from_layer} → ${v.to_layer})`)
556
+ }
557
+ lines.push("")
558
+ }
559
+
560
+ if (signals.pattern_fragmentation.length > 0) {
561
+ lines.push(`### Pattern Fragmentation (${signals.pattern_fragmentation.length})`)
562
+ for (const f of signals.pattern_fragmentation.slice(0, 10)) {
563
+ lines.push(`- ${f.entity}: ${f.similar_functions.join(", ")} (pattern: ${f.pattern})`)
564
+ }
565
+ lines.push("")
566
+ }
567
+
568
+ if (signals.temporal_volatility.length > 0) {
569
+ lines.push(`### Temporal Volatility (${signals.temporal_volatility.length})`)
570
+ for (const v of signals.temporal_volatility.slice(0, 10)) {
571
+ lines.push(`- ${v.file_a} ↔ ${v.file_b} (co-occur in ${v.co_occurrence_count} changes)`)
572
+ }
573
+ lines.push("")
574
+ }
575
+
576
+ return lines.join("\n")
577
+ }