@delegance/claude-autopilot 5.0.0 → 5.0.2

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 (406) hide show
  1. package/dist/presets/go/rules/go-sql-injection.d.ts +4 -0
  2. package/dist/presets/nextjs-supabase/rules/supabase-rls-bypass.d.ts +4 -0
  3. package/dist/presets/python-fastapi/rules/fastapi-missing-auth.d.ts +4 -0
  4. package/dist/presets/rails-postgres/rules/rails-sql-injection.d.ts +4 -0
  5. package/dist/presets/t3/rules/t3-server-only.d.ts +4 -0
  6. package/dist/src/adapters/base.d.ts +11 -0
  7. package/dist/src/adapters/council/claude.d.ts +3 -0
  8. package/dist/src/adapters/council/openai.d.ts +3 -0
  9. package/dist/src/adapters/council/types.d.ts +5 -0
  10. package/dist/src/adapters/loader.d.ts +11 -0
  11. package/dist/src/adapters/migration-runner/supabase.d.ts +4 -0
  12. package/dist/src/adapters/migration-runner/types.d.ts +31 -0
  13. package/dist/src/adapters/review-bot-parser/cursor.d.ts +3 -0
  14. package/dist/src/adapters/review-bot-parser/declarative-base.d.ts +13 -0
  15. package/{src/adapters/review-bot-parser/types.ts → dist/src/adapters/review-bot-parser/types.d.ts} +4 -4
  16. package/dist/src/adapters/review-engine/auto.d.ts +4 -0
  17. package/dist/src/adapters/review-engine/claude.d.ts +4 -0
  18. package/dist/src/adapters/review-engine/codex.d.ts +4 -0
  19. package/dist/src/adapters/review-engine/gemini.d.ts +4 -0
  20. package/dist/src/adapters/review-engine/openai-compatible.d.ts +4 -0
  21. package/dist/src/adapters/review-engine/parse-output.d.ts +13 -0
  22. package/dist/src/adapters/review-engine/prompt-builder.d.ts +4 -0
  23. package/dist/src/adapters/review-engine/types.d.ts +28 -0
  24. package/dist/src/adapters/vcs-host/commit-status.d.ts +12 -0
  25. package/dist/src/adapters/vcs-host/github.d.ts +4 -0
  26. package/dist/src/adapters/vcs-host/types.d.ts +42 -0
  27. package/{src/cli/_pkg-root.ts → dist/src/cli/_pkg-root.d.ts} +4 -42
  28. package/dist/src/cli/autoregress-bridge.d.ts +3 -0
  29. package/dist/src/cli/baseline.d.ts +7 -0
  30. package/dist/src/cli/ci.d.ts +23 -0
  31. package/dist/src/cli/costs.d.ts +2 -0
  32. package/dist/src/cli/council.d.ts +8 -0
  33. package/dist/src/cli/detector.d.ts +8 -0
  34. package/dist/src/cli/explain.d.ts +8 -0
  35. package/dist/src/cli/fix.d.ts +10 -0
  36. package/dist/src/cli/hook.d.ts +9 -0
  37. package/dist/src/cli/ignore-helper.d.ts +7 -0
  38. package/dist/src/cli/index.d.ts +3 -0
  39. package/dist/src/cli/index.js +39 -1
  40. package/dist/src/cli/lsp.d.ts +29 -0
  41. package/dist/src/cli/mcp.d.ts +5 -0
  42. package/dist/src/cli/migrate-v4.d.ts +28 -0
  43. package/dist/src/cli/pr-comment.d.ts +13 -0
  44. package/dist/src/cli/pr-desc.d.ts +31 -0
  45. package/dist/src/cli/pr-review-comments.d.ts +12 -0
  46. package/dist/src/cli/pr.d.ts +9 -0
  47. package/dist/src/cli/preflight.d.ts +8 -0
  48. package/dist/src/cli/preflight.js +17 -4
  49. package/dist/src/cli/report.d.ts +7 -0
  50. package/dist/src/cli/run.d.ts +23 -0
  51. package/dist/src/cli/scan.d.ts +11 -0
  52. package/dist/src/cli/setup.d.ts +9 -0
  53. package/dist/src/cli/test-gen.d.ts +10 -0
  54. package/dist/src/cli/triage.d.ts +5 -0
  55. package/dist/src/cli/watch.d.ts +18 -0
  56. package/dist/src/cli/worker.d.ts +5 -0
  57. package/dist/src/core/cache/cached-engine.d.ts +8 -0
  58. package/dist/src/core/cache/review-cache.d.ts +21 -0
  59. package/dist/src/core/chunking/index.d.ts +18 -0
  60. package/dist/src/core/chunking/risk-ranker.d.ts +10 -0
  61. package/dist/src/core/config/loader.d.ts +3 -0
  62. package/dist/src/core/config/preset-resolver.d.ts +9 -0
  63. package/dist/src/core/config/schema.d.ts +342 -0
  64. package/dist/src/core/config/types.d.ts +115 -0
  65. package/dist/src/core/council/config.d.ts +3 -0
  66. package/dist/src/core/council/context.d.ts +2 -0
  67. package/dist/src/core/council/runner.d.ts +4 -0
  68. package/dist/src/core/council/types.d.ts +36 -0
  69. package/dist/src/core/detect/git-context.d.ts +12 -0
  70. package/dist/src/core/detect/llm-key.d.ts +38 -0
  71. package/dist/src/core/detect/protected-paths.d.ts +6 -0
  72. package/dist/src/core/detect/provider-usage.d.ts +17 -0
  73. package/dist/src/core/detect/stack.d.ts +6 -0
  74. package/dist/src/core/detect/workspaces.d.ts +11 -0
  75. package/dist/src/core/errors.d.ts +17 -0
  76. package/dist/src/core/findings/dedup.d.ts +4 -0
  77. package/dist/src/core/findings/types.d.ts +33 -0
  78. package/dist/src/core/fix/generator.d.ts +17 -0
  79. package/dist/src/core/git/diff-hunks.d.ts +22 -0
  80. package/dist/src/core/git/touched-files.d.ts +11 -0
  81. package/dist/src/core/ignore/index.d.ts +11 -0
  82. package/dist/src/core/index.d.ts +2 -0
  83. package/dist/src/core/logging/ndjson-writer.d.ts +16 -0
  84. package/dist/src/core/logging/redaction.d.ts +4 -0
  85. package/dist/src/core/mcp/concurrency.d.ts +2 -0
  86. package/dist/src/core/mcp/handlers/fix-finding.d.ts +17 -0
  87. package/dist/src/core/mcp/handlers/get-capabilities.d.ts +14 -0
  88. package/dist/src/core/mcp/handlers/get-findings.d.ts +13 -0
  89. package/dist/src/core/mcp/handlers/review-diff.d.ts +18 -0
  90. package/dist/src/core/mcp/handlers/scan-files.d.ts +15 -0
  91. package/dist/src/core/mcp/handlers/validate-fix.d.ts +12 -0
  92. package/dist/src/core/mcp/run-store.d.ts +12 -0
  93. package/dist/src/core/mcp/workspace.d.ts +3 -0
  94. package/dist/src/core/persist/baseline.d.ts +39 -0
  95. package/dist/src/core/persist/cost-log.d.ts +11 -0
  96. package/dist/src/core/persist/findings-cache.d.ts +9 -0
  97. package/dist/src/core/persist/triage.d.ts +30 -0
  98. package/dist/src/core/phases/static-rules.d.ts +24 -0
  99. package/dist/src/core/phases/tests.d.ts +15 -0
  100. package/dist/src/core/pipeline/review-phase.d.ts +27 -0
  101. package/dist/src/core/pipeline/run.d.ts +27 -0
  102. package/dist/src/core/runtime/idempotency.d.ts +2 -0
  103. package/dist/src/core/runtime/lock.d.ts +5 -0
  104. package/dist/src/core/runtime/state.d.ts +39 -0
  105. package/dist/src/core/schema-alignment/detector.d.ts +3 -0
  106. package/dist/src/core/schema-alignment/extractor/index.d.ts +3 -0
  107. package/dist/src/core/schema-alignment/extractor/prisma.d.ts +3 -0
  108. package/dist/src/core/schema-alignment/extractor/sql.d.ts +3 -0
  109. package/dist/src/core/schema-alignment/llm-check.d.ts +4 -0
  110. package/dist/src/core/schema-alignment/scanner.d.ts +3 -0
  111. package/dist/src/core/schema-alignment/types.d.ts +38 -0
  112. package/dist/src/core/shell.d.ts +15 -0
  113. package/dist/src/core/static-rules/registry.d.ts +5 -0
  114. package/dist/src/core/static-rules/rules/brand-tokens.d.ts +3 -0
  115. package/dist/src/core/static-rules/rules/console-log.d.ts +3 -0
  116. package/dist/src/core/static-rules/rules/hardcoded-secrets.d.ts +3 -0
  117. package/dist/src/core/static-rules/rules/insecure-redirect.d.ts +3 -0
  118. package/dist/src/core/static-rules/rules/large-file.d.ts +3 -0
  119. package/dist/src/core/static-rules/rules/missing-auth.d.ts +3 -0
  120. package/dist/src/core/static-rules/rules/missing-tests.d.ts +3 -0
  121. package/dist/src/core/static-rules/rules/npm-audit.d.ts +3 -0
  122. package/dist/src/core/static-rules/rules/package-lock-sync.d.ts +3 -0
  123. package/dist/src/core/static-rules/rules/schema-alignment.d.ts +3 -0
  124. package/dist/src/core/static-rules/rules/sql-injection.d.ts +3 -0
  125. package/dist/src/core/static-rules/rules/ssrf.d.ts +3 -0
  126. package/dist/src/core/static-rules/rules/todo-fixme.d.ts +3 -0
  127. package/dist/src/core/static-rules/tailwind-extractor.d.ts +7 -0
  128. package/dist/src/core/test-gen/coverage-analyzer.d.ts +7 -0
  129. package/dist/src/core/test-gen/framework-detector.d.ts +3 -0
  130. package/dist/src/core/test-gen/test-writer.d.ts +4 -0
  131. package/dist/src/core/ui/design-context-loader.d.ts +7 -0
  132. package/dist/src/core/worker/client.d.ts +23 -0
  133. package/dist/src/core/worker/lockfile.d.ts +12 -0
  134. package/dist/src/core/worker/server.d.ts +17 -0
  135. package/dist/src/formatters/github-annotations.d.ts +5 -0
  136. package/{src/formatters/index.ts → dist/src/formatters/index.d.ts} +1 -0
  137. package/dist/src/formatters/junit.d.ts +5 -0
  138. package/dist/src/formatters/sarif.d.ts +56 -0
  139. package/{src/index.ts → dist/src/index.d.ts} +1 -0
  140. package/package.json +7 -6
  141. package/dist/presets/go/rules/go-sql-injection.js.map +0 -1
  142. package/dist/presets/nextjs-supabase/rules/supabase-rls-bypass.js.map +0 -1
  143. package/dist/presets/python-fastapi/rules/fastapi-missing-auth.js.map +0 -1
  144. package/dist/presets/rails-postgres/rules/rails-sql-injection.js.map +0 -1
  145. package/dist/presets/t3/rules/t3-server-only.js.map +0 -1
  146. package/dist/src/adapters/base.js.map +0 -1
  147. package/dist/src/adapters/council/claude.js.map +0 -1
  148. package/dist/src/adapters/council/openai.js.map +0 -1
  149. package/dist/src/adapters/council/types.js.map +0 -1
  150. package/dist/src/adapters/loader.js.map +0 -1
  151. package/dist/src/adapters/migration-runner/supabase.js.map +0 -1
  152. package/dist/src/adapters/migration-runner/types.js.map +0 -1
  153. package/dist/src/adapters/review-bot-parser/cursor.js.map +0 -1
  154. package/dist/src/adapters/review-bot-parser/declarative-base.js.map +0 -1
  155. package/dist/src/adapters/review-bot-parser/types.js.map +0 -1
  156. package/dist/src/adapters/review-engine/auto.js.map +0 -1
  157. package/dist/src/adapters/review-engine/claude.js.map +0 -1
  158. package/dist/src/adapters/review-engine/codex.js.map +0 -1
  159. package/dist/src/adapters/review-engine/gemini.js.map +0 -1
  160. package/dist/src/adapters/review-engine/openai-compatible.js.map +0 -1
  161. package/dist/src/adapters/review-engine/parse-output.js.map +0 -1
  162. package/dist/src/adapters/review-engine/prompt-builder.js.map +0 -1
  163. package/dist/src/adapters/review-engine/types.js.map +0 -1
  164. package/dist/src/adapters/vcs-host/commit-status.js.map +0 -1
  165. package/dist/src/adapters/vcs-host/github.js.map +0 -1
  166. package/dist/src/adapters/vcs-host/types.js.map +0 -1
  167. package/dist/src/cli/_pkg-root.js.map +0 -1
  168. package/dist/src/cli/autoregress-bridge.js.map +0 -1
  169. package/dist/src/cli/baseline.js.map +0 -1
  170. package/dist/src/cli/ci.js.map +0 -1
  171. package/dist/src/cli/costs.js.map +0 -1
  172. package/dist/src/cli/council.js.map +0 -1
  173. package/dist/src/cli/detector.js.map +0 -1
  174. package/dist/src/cli/explain.js.map +0 -1
  175. package/dist/src/cli/fix.js.map +0 -1
  176. package/dist/src/cli/hook.js.map +0 -1
  177. package/dist/src/cli/ignore-helper.js.map +0 -1
  178. package/dist/src/cli/index.js.map +0 -1
  179. package/dist/src/cli/lsp.js.map +0 -1
  180. package/dist/src/cli/mcp.js.map +0 -1
  181. package/dist/src/cli/migrate-v4.js.map +0 -1
  182. package/dist/src/cli/pr-comment.js.map +0 -1
  183. package/dist/src/cli/pr-desc.js.map +0 -1
  184. package/dist/src/cli/pr-review-comments.js.map +0 -1
  185. package/dist/src/cli/pr.js.map +0 -1
  186. package/dist/src/cli/preflight.js.map +0 -1
  187. package/dist/src/cli/report.js.map +0 -1
  188. package/dist/src/cli/run.js.map +0 -1
  189. package/dist/src/cli/scan.js.map +0 -1
  190. package/dist/src/cli/setup.js.map +0 -1
  191. package/dist/src/cli/test-gen.js.map +0 -1
  192. package/dist/src/cli/triage.js.map +0 -1
  193. package/dist/src/cli/watch.js.map +0 -1
  194. package/dist/src/cli/worker.js.map +0 -1
  195. package/dist/src/core/cache/cached-engine.js.map +0 -1
  196. package/dist/src/core/cache/review-cache.js.map +0 -1
  197. package/dist/src/core/chunking/index.js.map +0 -1
  198. package/dist/src/core/chunking/risk-ranker.js.map +0 -1
  199. package/dist/src/core/config/loader.js.map +0 -1
  200. package/dist/src/core/config/preset-resolver.js.map +0 -1
  201. package/dist/src/core/config/schema.js.map +0 -1
  202. package/dist/src/core/config/types.js.map +0 -1
  203. package/dist/src/core/council/config.js.map +0 -1
  204. package/dist/src/core/council/context.js.map +0 -1
  205. package/dist/src/core/council/runner.js.map +0 -1
  206. package/dist/src/core/council/types.js.map +0 -1
  207. package/dist/src/core/detect/git-context.js.map +0 -1
  208. package/dist/src/core/detect/llm-key.js.map +0 -1
  209. package/dist/src/core/detect/protected-paths.js.map +0 -1
  210. package/dist/src/core/detect/provider-usage.js.map +0 -1
  211. package/dist/src/core/detect/stack.js.map +0 -1
  212. package/dist/src/core/detect/workspaces.js.map +0 -1
  213. package/dist/src/core/errors.js.map +0 -1
  214. package/dist/src/core/findings/dedup.js.map +0 -1
  215. package/dist/src/core/findings/types.js.map +0 -1
  216. package/dist/src/core/fix/generator.js.map +0 -1
  217. package/dist/src/core/git/diff-hunks.js.map +0 -1
  218. package/dist/src/core/git/touched-files.js.map +0 -1
  219. package/dist/src/core/ignore/index.js.map +0 -1
  220. package/dist/src/core/index.js.map +0 -1
  221. package/dist/src/core/logging/ndjson-writer.js.map +0 -1
  222. package/dist/src/core/logging/redaction.js.map +0 -1
  223. package/dist/src/core/mcp/concurrency.js.map +0 -1
  224. package/dist/src/core/mcp/handlers/fix-finding.js.map +0 -1
  225. package/dist/src/core/mcp/handlers/get-capabilities.js.map +0 -1
  226. package/dist/src/core/mcp/handlers/get-findings.js.map +0 -1
  227. package/dist/src/core/mcp/handlers/review-diff.js.map +0 -1
  228. package/dist/src/core/mcp/handlers/scan-files.js.map +0 -1
  229. package/dist/src/core/mcp/handlers/validate-fix.js.map +0 -1
  230. package/dist/src/core/mcp/run-store.js.map +0 -1
  231. package/dist/src/core/mcp/workspace.js.map +0 -1
  232. package/dist/src/core/persist/baseline.js.map +0 -1
  233. package/dist/src/core/persist/cost-log.js.map +0 -1
  234. package/dist/src/core/persist/findings-cache.js.map +0 -1
  235. package/dist/src/core/persist/triage.js.map +0 -1
  236. package/dist/src/core/phases/static-rules.js.map +0 -1
  237. package/dist/src/core/phases/tests.js.map +0 -1
  238. package/dist/src/core/pipeline/review-phase.js.map +0 -1
  239. package/dist/src/core/pipeline/run.js.map +0 -1
  240. package/dist/src/core/runtime/idempotency.js.map +0 -1
  241. package/dist/src/core/runtime/lock.js.map +0 -1
  242. package/dist/src/core/runtime/state.js.map +0 -1
  243. package/dist/src/core/schema-alignment/detector.js.map +0 -1
  244. package/dist/src/core/schema-alignment/extractor/index.js.map +0 -1
  245. package/dist/src/core/schema-alignment/extractor/prisma.js.map +0 -1
  246. package/dist/src/core/schema-alignment/extractor/sql.js.map +0 -1
  247. package/dist/src/core/schema-alignment/llm-check.js.map +0 -1
  248. package/dist/src/core/schema-alignment/scanner.js.map +0 -1
  249. package/dist/src/core/schema-alignment/types.js.map +0 -1
  250. package/dist/src/core/shell.js.map +0 -1
  251. package/dist/src/core/static-rules/registry.js.map +0 -1
  252. package/dist/src/core/static-rules/rules/brand-tokens.js.map +0 -1
  253. package/dist/src/core/static-rules/rules/console-log.js.map +0 -1
  254. package/dist/src/core/static-rules/rules/hardcoded-secrets.js.map +0 -1
  255. package/dist/src/core/static-rules/rules/insecure-redirect.js.map +0 -1
  256. package/dist/src/core/static-rules/rules/large-file.js.map +0 -1
  257. package/dist/src/core/static-rules/rules/missing-auth.js.map +0 -1
  258. package/dist/src/core/static-rules/rules/missing-tests.js.map +0 -1
  259. package/dist/src/core/static-rules/rules/npm-audit.js.map +0 -1
  260. package/dist/src/core/static-rules/rules/package-lock-sync.js.map +0 -1
  261. package/dist/src/core/static-rules/rules/schema-alignment.js.map +0 -1
  262. package/dist/src/core/static-rules/rules/sql-injection.js.map +0 -1
  263. package/dist/src/core/static-rules/rules/ssrf.js.map +0 -1
  264. package/dist/src/core/static-rules/rules/todo-fixme.js.map +0 -1
  265. package/dist/src/core/static-rules/tailwind-extractor.js.map +0 -1
  266. package/dist/src/core/test-gen/coverage-analyzer.js.map +0 -1
  267. package/dist/src/core/test-gen/framework-detector.js.map +0 -1
  268. package/dist/src/core/test-gen/test-writer.js.map +0 -1
  269. package/dist/src/core/ui/design-context-loader.js.map +0 -1
  270. package/dist/src/core/worker/client.js.map +0 -1
  271. package/dist/src/core/worker/lockfile.js.map +0 -1
  272. package/dist/src/core/worker/server.js.map +0 -1
  273. package/dist/src/formatters/github-annotations.js.map +0 -1
  274. package/dist/src/formatters/index.js.map +0 -1
  275. package/dist/src/formatters/junit.js.map +0 -1
  276. package/dist/src/formatters/sarif.js.map +0 -1
  277. package/dist/src/index.js.map +0 -1
  278. package/src/adapters/base.ts +0 -19
  279. package/src/adapters/council/claude.ts +0 -41
  280. package/src/adapters/council/openai.ts +0 -40
  281. package/src/adapters/council/types.ts +0 -7
  282. package/src/adapters/loader.ts +0 -108
  283. package/src/adapters/migration-runner/supabase.ts +0 -56
  284. package/src/adapters/migration-runner/types.ts +0 -36
  285. package/src/adapters/review-bot-parser/cursor.ts +0 -13
  286. package/src/adapters/review-bot-parser/declarative-base.ts +0 -64
  287. package/src/adapters/review-engine/auto.ts +0 -94
  288. package/src/adapters/review-engine/claude.ts +0 -100
  289. package/src/adapters/review-engine/codex.ts +0 -82
  290. package/src/adapters/review-engine/gemini.ts +0 -105
  291. package/src/adapters/review-engine/openai-compatible.ts +0 -100
  292. package/src/adapters/review-engine/parse-output.ts +0 -74
  293. package/src/adapters/review-engine/prompt-builder.ts +0 -19
  294. package/src/adapters/review-engine/types.ts +0 -19
  295. package/src/adapters/vcs-host/commit-status.ts +0 -39
  296. package/src/adapters/vcs-host/github.ts +0 -77
  297. package/src/adapters/vcs-host/types.ts +0 -44
  298. package/src/cli/autoregress-bridge.ts +0 -30
  299. package/src/cli/baseline.ts +0 -125
  300. package/src/cli/ci.ts +0 -45
  301. package/src/cli/costs.ts +0 -80
  302. package/src/cli/council.ts +0 -96
  303. package/src/cli/detector.ts +0 -92
  304. package/src/cli/explain.ts +0 -197
  305. package/src/cli/fix.ts +0 -249
  306. package/src/cli/hook.ts +0 -124
  307. package/src/cli/ignore-helper.ts +0 -116
  308. package/src/cli/index.ts +0 -612
  309. package/src/cli/lsp.ts +0 -200
  310. package/src/cli/mcp.ts +0 -206
  311. package/src/cli/migrate-v4.ts +0 -388
  312. package/src/cli/pr-comment.ts +0 -139
  313. package/src/cli/pr-desc.ts +0 -168
  314. package/src/cli/pr-review-comments.ts +0 -92
  315. package/src/cli/pr.ts +0 -76
  316. package/src/cli/preflight.ts +0 -235
  317. package/src/cli/report.ts +0 -186
  318. package/src/cli/run.ts +0 -425
  319. package/src/cli/scan.ts +0 -233
  320. package/src/cli/setup.ts +0 -191
  321. package/src/cli/test-gen.ts +0 -125
  322. package/src/cli/triage.ts +0 -137
  323. package/src/cli/watch.ts +0 -190
  324. package/src/cli/worker.ts +0 -109
  325. package/src/core/.gitkeep +0 -0
  326. package/src/core/cache/cached-engine.ts +0 -32
  327. package/src/core/cache/review-cache.ts +0 -70
  328. package/src/core/chunking/index.ts +0 -113
  329. package/src/core/chunking/risk-ranker.ts +0 -56
  330. package/src/core/config/loader.ts +0 -53
  331. package/src/core/config/preset-resolver.ts +0 -46
  332. package/src/core/config/schema.ts +0 -181
  333. package/src/core/config/types.ts +0 -98
  334. package/src/core/council/config.ts +0 -71
  335. package/src/core/council/context.ts +0 -17
  336. package/src/core/council/runner.ts +0 -83
  337. package/src/core/council/types.ts +0 -45
  338. package/src/core/detect/git-context.ts +0 -27
  339. package/src/core/detect/llm-key.ts +0 -89
  340. package/src/core/detect/protected-paths.ts +0 -63
  341. package/src/core/detect/provider-usage.ts +0 -74
  342. package/src/core/detect/stack.ts +0 -153
  343. package/src/core/detect/workspaces.ts +0 -103
  344. package/src/core/errors.ts +0 -37
  345. package/src/core/findings/dedup.ts +0 -14
  346. package/src/core/findings/types.ts +0 -39
  347. package/src/core/fix/generator.ts +0 -149
  348. package/src/core/git/diff-hunks.ts +0 -86
  349. package/src/core/git/touched-files.ts +0 -73
  350. package/src/core/ignore/index.ts +0 -54
  351. package/src/core/index.ts +0 -1
  352. package/src/core/logging/ndjson-writer.ts +0 -37
  353. package/src/core/logging/redaction.ts +0 -19
  354. package/src/core/mcp/concurrency.ts +0 -16
  355. package/src/core/mcp/handlers/fix-finding.ts +0 -126
  356. package/src/core/mcp/handlers/get-capabilities.ts +0 -62
  357. package/src/core/mcp/handlers/get-findings.ts +0 -36
  358. package/src/core/mcp/handlers/review-diff.ts +0 -65
  359. package/src/core/mcp/handlers/scan-files.ts +0 -65
  360. package/src/core/mcp/handlers/validate-fix.ts +0 -41
  361. package/src/core/mcp/run-store.ts +0 -85
  362. package/src/core/mcp/workspace.ts +0 -35
  363. package/src/core/persist/baseline.ts +0 -112
  364. package/src/core/persist/cost-log.ts +0 -30
  365. package/src/core/persist/findings-cache.ts +0 -43
  366. package/src/core/persist/triage.ts +0 -112
  367. package/src/core/phases/static-rules.ts +0 -93
  368. package/src/core/phases/tests.ts +0 -51
  369. package/src/core/pipeline/review-phase.ts +0 -182
  370. package/src/core/pipeline/run.ts +0 -116
  371. package/src/core/runtime/idempotency.ts +0 -6
  372. package/src/core/runtime/lock.ts +0 -29
  373. package/src/core/runtime/state.ts +0 -97
  374. package/src/core/schema-alignment/detector.ts +0 -59
  375. package/src/core/schema-alignment/extractor/index.ts +0 -24
  376. package/src/core/schema-alignment/extractor/prisma.ts +0 -21
  377. package/src/core/schema-alignment/extractor/sql.ts +0 -99
  378. package/src/core/schema-alignment/llm-check.ts +0 -91
  379. package/src/core/schema-alignment/scanner.ts +0 -107
  380. package/src/core/schema-alignment/types.ts +0 -43
  381. package/src/core/shell.ts +0 -48
  382. package/src/core/static-rules/registry.ts +0 -59
  383. package/src/core/static-rules/rules/brand-tokens.ts +0 -145
  384. package/src/core/static-rules/rules/console-log.ts +0 -42
  385. package/src/core/static-rules/rules/hardcoded-secrets.ts +0 -83
  386. package/src/core/static-rules/rules/insecure-redirect.ts +0 -67
  387. package/src/core/static-rules/rules/large-file.ts +0 -37
  388. package/src/core/static-rules/rules/missing-auth.ts +0 -70
  389. package/src/core/static-rules/rules/missing-tests.ts +0 -57
  390. package/src/core/static-rules/rules/npm-audit.ts +0 -38
  391. package/src/core/static-rules/rules/package-lock-sync.ts +0 -54
  392. package/src/core/static-rules/rules/schema-alignment.ts +0 -132
  393. package/src/core/static-rules/rules/sql-injection.ts +0 -71
  394. package/src/core/static-rules/rules/ssrf.ts +0 -63
  395. package/src/core/static-rules/rules/todo-fixme.ts +0 -40
  396. package/src/core/static-rules/tailwind-extractor.ts +0 -38
  397. package/src/core/test-gen/coverage-analyzer.ts +0 -93
  398. package/src/core/test-gen/framework-detector.ts +0 -21
  399. package/src/core/test-gen/test-writer.ts +0 -33
  400. package/src/core/ui/design-context-loader.ts +0 -87
  401. package/src/core/worker/client.ts +0 -46
  402. package/src/core/worker/lockfile.ts +0 -38
  403. package/src/core/worker/server.ts +0 -81
  404. package/src/formatters/github-annotations.ts +0 -36
  405. package/src/formatters/junit.ts +0 -52
  406. package/src/formatters/sarif.ts +0 -103
package/src/cli/worker.ts DELETED
@@ -1,109 +0,0 @@
1
- import { readLock, writeLock, deleteLock, isWorkerAlive } from '../core/worker/lockfile.ts';
2
- import { stopWorker, getWorkerStatus } from '../core/worker/client.ts';
3
- import { startWorkerServer } from '../core/worker/server.ts';
4
- import { loadConfig } from '../core/config/loader.ts';
5
- import type { ReviewEngine } from '../adapters/review-engine/types.ts';
6
- import * as path from 'node:path';
7
- import * as fs from 'node:fs';
8
-
9
- const C = { reset: '\x1b[0m', green: '\x1b[32m', red: '\x1b[31m', yellow: '\x1b[33m', dim: '\x1b[2m', bold: '\x1b[1m' };
10
-
11
- export async function runWorker(sub: string | undefined, options: { cwd?: string; configPath?: string } = {}): Promise<number> {
12
- const cwd = options.cwd ?? process.cwd();
13
- const configPath = options.configPath ?? path.join(cwd, 'guardrail.config.yaml');
14
-
15
- switch (sub) {
16
- case 'start':
17
- return workerStart(cwd, configPath);
18
- case 'stop':
19
- return workerStop(cwd);
20
- case 'status':
21
- return workerStatus(cwd);
22
- default:
23
- console.error(`${C.red}[worker] Unknown subcommand: "${sub ?? ''}". Use start|stop|status${C.reset}`);
24
- return 1;
25
- }
26
- }
27
-
28
- async function workerStart(cwd: string, configPath: string): Promise<number> {
29
- const existing = readLock(cwd);
30
- if (existing && isWorkerAlive(existing)) {
31
- console.log(`${C.yellow}[worker] Already running — pid ${existing.pid} port ${existing.port}${C.reset}`);
32
- return 0;
33
- }
34
-
35
- let config = { configVersion: 1 as const };
36
- if (fs.existsSync(configPath)) {
37
- const loaded = await loadConfig(configPath);
38
- if (loaded) config = loaded;
39
- }
40
-
41
- // Lazy import to avoid loading review engine at CLI startup
42
- const { loadAdapter } = await import('../adapters/loader.ts');
43
- const { runReviewPhase } = await import('../core/pipeline/review-phase.ts');
44
-
45
- const engineRef = (config as { reviewEngine?: unknown }).reviewEngine;
46
- const ref = typeof engineRef === 'string' ? engineRef : (engineRef as { adapter?: string })?.adapter ?? 'auto';
47
- const engineOptions = typeof engineRef === 'object' && engineRef !== null
48
- ? (engineRef as { options?: Record<string, unknown> }).options
49
- : undefined;
50
-
51
- const engine = await loadAdapter({
52
- point: 'review-engine',
53
- ref,
54
- options: engineOptions,
55
- });
56
-
57
- const server = await startWorkerServer({
58
- cwd,
59
- onReview: async (files, cfg) => {
60
- const result = await runReviewPhase({ touchedFiles: files, config: cfg, engine: engine as unknown as ReviewEngine });
61
- return { findings: result.findings, usage: result.costUSD !== undefined ? { costUSD: result.costUSD } : undefined };
62
- },
63
- });
64
-
65
- writeLock(cwd, { pid: process.pid, port: server.port, startedAt: new Date().toISOString() });
66
-
67
- const cleanup = () => { deleteLock(cwd); server.close().then(() => process.exit(0)); };
68
- process.on('SIGTERM', cleanup);
69
- process.on('SIGINT', cleanup);
70
-
71
- console.log(`${C.green}[worker] Started — pid ${process.pid} port ${server.port}${C.reset}`);
72
- console.log(`${C.dim} guardrail run --use-worker # dispatch review chunks to this worker${C.reset}`);
73
-
74
- await new Promise(() => {}); // keep alive
75
- return 0;
76
- }
77
-
78
- async function workerStop(cwd: string): Promise<number> {
79
- const lock = readLock(cwd);
80
- if (!lock) { console.log('[worker] No worker running'); return 0; }
81
- if (!isWorkerAlive(lock)) { deleteLock(cwd); console.log('[worker] Stale lockfile removed'); return 0; }
82
- await stopWorker(lock);
83
- // Give it 3s to exit, then SIGTERM
84
- await new Promise(r => setTimeout(r, 1000));
85
- if (isWorkerAlive(lock)) {
86
- try { process.kill(lock.pid, 'SIGTERM'); } catch { /* already dead */ }
87
- }
88
- deleteLock(cwd);
89
- console.log(`${C.green}[worker] Stopped${C.reset}`);
90
- return 0;
91
- }
92
-
93
- async function workerStatus(cwd: string): Promise<number> {
94
- const lock = readLock(cwd);
95
- if (!lock) { console.log('[worker] Not running'); return 1; }
96
- if (!isWorkerAlive(lock)) { console.log(`[worker] Dead (stale lock — pid ${lock.pid})`); return 1; }
97
- try {
98
- const status = await getWorkerStatus(lock);
99
- console.log(`[worker] Running`);
100
- console.log(` pid: ${status.pid}`);
101
- console.log(` port: ${status.port}`);
102
- console.log(` jobs processed: ${status.jobsProcessed}`);
103
- console.log(` uptime: ${Math.round(status.uptimeMs / 1000)}s`);
104
- return 0;
105
- } catch {
106
- console.log(`[worker] Running (pid ${lock.pid} port ${lock.port}) — status endpoint unreachable`);
107
- return 0;
108
- }
109
- }
package/src/core/.gitkeep DELETED
File without changes
@@ -1,32 +0,0 @@
1
- import type { ReviewEngine, ReviewInput, ReviewOutput } from '../../adapters/review-engine/types.ts';
2
- import type { Capabilities } from '../../adapters/base.ts';
3
- import { ReviewCache, type ReviewCacheOptions } from './review-cache.ts';
4
-
5
- /**
6
- * Wraps any ReviewEngine with file-based response caching.
7
- * Cache key = SHA-256(adapterName + model + content).
8
- */
9
- export function withCache(engine: ReviewEngine, options: ReviewCacheOptions = {}): ReviewEngine {
10
- const cache = new ReviewCache(options);
11
- const model = (engine as { model?: string }).model ?? engine.name;
12
-
13
- return {
14
- name: engine.name,
15
- apiVersion: engine.apiVersion,
16
- getCapabilities(): Capabilities {
17
- return engine.getCapabilities();
18
- },
19
- estimateTokens(content: string): number {
20
- return engine.estimateTokens(content);
21
- },
22
- async review(input: ReviewInput): Promise<ReviewOutput> {
23
- const keyPayload = `${input.content}\x00${input.kind}\x00${input.context?.stack ?? ''}`;
24
- const key = ReviewCache.keyFor(engine.name, model, keyPayload);
25
- const cached = await cache.get(key);
26
- if (cached) return { ...cached, usage: cached.usage ? { ...cached.usage, costUSD: 0 } : undefined };
27
- const output = await engine.review(input);
28
- await cache.set(key, output);
29
- return output;
30
- },
31
- };
32
- }
@@ -1,70 +0,0 @@
1
- import * as fs from 'node:fs/promises';
2
- import * as os from 'node:os';
3
- import * as path from 'node:path';
4
- import { createHash } from 'node:crypto';
5
- import type { ReviewOutput } from '../../adapters/review-engine/types.ts';
6
-
7
- export interface CacheEntry {
8
- key: string;
9
- output: ReviewOutput;
10
- createdAt: string;
11
- expiresAt: string;
12
- }
13
-
14
- export interface ReviewCacheOptions {
15
- cacheDir?: string;
16
- ttlMs?: number;
17
- }
18
-
19
- const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000; // 24h
20
- // Prefer env override, then ~/.guardrail-cache to survive across cwd changes and container restarts
21
- const DEFAULT_CACHE_DIR = process.env.AUTOPILOT_CACHE_DIR
22
- ? path.join(process.env.AUTOPILOT_CACHE_DIR, 'reviews')
23
- : path.join(os.homedir(), '.guardrail-cache', 'reviews');
24
-
25
- export class ReviewCache {
26
- private readonly cacheDir: string;
27
- private readonly ttlMs: number;
28
-
29
- constructor(options: ReviewCacheOptions = {}) {
30
- this.cacheDir = options.cacheDir ?? DEFAULT_CACHE_DIR;
31
- this.ttlMs = options.ttlMs ?? DEFAULT_TTL_MS;
32
- }
33
-
34
- static keyFor(adapterName: string, model: string, content: string): string {
35
- return createHash('sha256').update(`${adapterName}:${model}:${content}`).digest('hex');
36
- }
37
-
38
- async get(key: string): Promise<ReviewOutput | undefined> {
39
- const filePath = this.entryPath(key);
40
- try {
41
- const raw = await fs.readFile(filePath, 'utf8');
42
- const entry: CacheEntry = JSON.parse(raw);
43
- if (new Date(entry.expiresAt) < new Date()) {
44
- await fs.unlink(filePath).catch(() => undefined);
45
- return undefined;
46
- }
47
- return entry.output;
48
- } catch {
49
- return undefined;
50
- }
51
- }
52
-
53
- async set(key: string, output: ReviewOutput): Promise<void> {
54
- await fs.mkdir(this.cacheDir, { recursive: true });
55
- const entry: CacheEntry = {
56
- key,
57
- output,
58
- createdAt: new Date().toISOString(),
59
- expiresAt: new Date(Date.now() + this.ttlMs).toISOString(),
60
- };
61
- const filePath = this.entryPath(key);
62
- const tmp = `${filePath}.tmp`;
63
- await fs.writeFile(tmp, JSON.stringify(entry), 'utf8');
64
- await fs.rename(tmp, filePath);
65
- }
66
-
67
- private entryPath(key: string): string {
68
- return path.join(this.cacheDir, `${key}.json`);
69
- }
70
- }
@@ -1,113 +0,0 @@
1
- import * as fs from 'node:fs/promises';
2
- import * as path from 'node:path';
3
- import type { ReviewEngine, ReviewInput } from '../../adapters/review-engine/types.ts';
4
- import type { GuardrailConfig } from '../config/types.ts';
5
- import { rankByRisk } from './risk-ranker.ts';
6
- import { getFileDiffs, formatDiffContent } from '../git/diff-hunks.ts';
7
-
8
- export interface ReviewChunk {
9
- content: string;
10
- kind: ReviewInput['kind'];
11
- files: string[];
12
- }
13
-
14
- export interface BuildChunksInput {
15
- touchedFiles: string[];
16
- strategy: 'auto' | 'single-pass' | 'file-level' | 'diff' | 'auto-diff';
17
- chunking?: GuardrailConfig['chunking'];
18
- engine: ReviewEngine;
19
- cwd?: string;
20
- protectedPaths?: string[];
21
- base?: string; // git base ref — required for 'diff'/'auto-diff' strategy
22
- }
23
-
24
- const DEFAULT_SMALL_TIER_TOKENS = 8000;
25
- const DEFAULT_FILE_TIER_TOKENS = 60000;
26
-
27
- export async function buildReviewChunks(input: BuildChunksInput): Promise<ReviewChunk[]> {
28
- const smallMax = input.chunking?.smallTierMaxTokens ?? DEFAULT_SMALL_TIER_TOKENS;
29
- const fileMax = input.chunking?.perFileMaxTokens ?? DEFAULT_FILE_TIER_TOKENS;
30
-
31
- // Diff strategy: send unified diff hunks instead of full file contents
32
- if (input.strategy === 'diff') {
33
- return buildDiffChunks(input);
34
- }
35
-
36
- // auto-diff: try diff first; fall back to full-file auto if diff is empty
37
- // (handles new files, initial commits, or repos with no base ref)
38
- if (input.strategy === 'auto-diff') {
39
- const diffChunks = buildDiffChunks(input);
40
- if (diffChunks.length > 0) return diffChunks;
41
- // fall through to auto with full files
42
- }
43
-
44
- const ranked = rankByRisk(input.touchedFiles, { protectedPaths: input.protectedPaths });
45
- const fileContents = await readFiles(ranked, input.cwd);
46
-
47
- if (input.strategy === 'single-pass') {
48
- const combined = formatBatch(fileContents);
49
- return [{ content: combined, kind: 'file-batch', files: [...fileContents.keys()] }];
50
- }
51
-
52
- if (input.strategy === 'auto') {
53
- const combined = formatBatch(fileContents);
54
- if (input.engine.estimateTokens(combined) <= smallMax) {
55
- return [{ content: combined, kind: 'file-batch', files: [...fileContents.keys()] }];
56
- }
57
- // fall through to file-level
58
- }
59
-
60
- // file-level: one chunk per readable file, truncated to fileMax tokens
61
- const chunks: ReviewChunk[] = [];
62
- for (const [filePath, content] of fileContents) {
63
- const truncated = truncateToTokens(content, fileMax, input.engine);
64
- chunks.push({ content: `// File: ${filePath}\n${truncated}`, kind: 'file-batch', files: [filePath] });
65
- }
66
- return chunks;
67
- }
68
-
69
- function buildDiffChunks(input: BuildChunksInput): ReviewChunk[] {
70
- const cwd = input.cwd ?? process.cwd();
71
- const base = input.base ?? 'HEAD~1';
72
- const ranked = rankByRisk(input.touchedFiles, { protectedPaths: input.protectedPaths });
73
- const diffs = getFileDiffs(cwd, base, ranked);
74
-
75
- if (diffs.length === 0) return [];
76
-
77
- // Single chunk — diff content is already compact; truncation handled in formatDiffContent
78
- const content = formatDiffContent(diffs);
79
- return [{ content, kind: 'file-batch', files: diffs.map(d => d.file) }];
80
- }
81
-
82
- async function readFiles(touchedFiles: string[], cwd?: string): Promise<Map<string, string>> {
83
- const result = new Map<string, string>();
84
- for (const f of touchedFiles) {
85
- const resolved = cwd ? path.resolve(cwd, f) : path.resolve(f);
86
- try {
87
- result.set(f, await fs.readFile(resolved, 'utf8'));
88
- } catch {
89
- // deleted or unreadable — skip silently
90
- }
91
- }
92
- return result;
93
- }
94
-
95
- function formatBatch(fileContents: Map<string, string>): string {
96
- const parts: string[] = [];
97
- for (const [filePath, content] of fileContents) {
98
- parts.push(`// File: ${filePath}\n${content}`);
99
- }
100
- return parts.join('\n\n---\n\n');
101
- }
102
-
103
- function truncateToTokens(content: string, maxTokens: number, engine: ReviewEngine): string {
104
- if (engine.estimateTokens(content) <= maxTokens) return content;
105
- let lo = 0;
106
- let hi = content.length;
107
- while (hi - lo > 128) {
108
- const mid = (lo + hi) >> 1;
109
- if (engine.estimateTokens(content.slice(0, mid)) <= maxTokens) lo = mid;
110
- else hi = mid;
111
- }
112
- return content.slice(0, lo) + '\n// [truncated]';
113
- }
@@ -1,56 +0,0 @@
1
- import { minimatch } from 'minimatch';
2
-
3
- interface RankOptions {
4
- protectedPaths?: string[];
5
- }
6
-
7
- const AUTH_PATTERNS = [
8
- /auth/i, /login/i, /logout/i, /session/i, /token/i, /jwt/i, /oauth/i,
9
- /password/i, /credential/i, /secret/i, /permission/i, /role/i, /acl/i,
10
- ];
11
-
12
- const PAYMENT_PATTERNS = [
13
- /payment/i, /billing/i, /stripe/i, /checkout/i, /invoice/i, /charge/i,
14
- /subscription/i, /wallet/i, /transaction/i, /refund/i,
15
- ];
16
-
17
- const CORE_PATTERNS = [
18
- /\/services\//i, /\/core\//i, /\/api\//i, /\/routes?\//i,
19
- /\/controllers?\//i, /\/models?\//i, /\/middleware\//i, /\/handlers?\//i,
20
- ];
21
-
22
- const TEST_EXT = /\.(test|spec)\.[a-z]+$/i;
23
- const DOC_EXT = /\.(md|txt|rst|adoc)$/i;
24
- const CONFIG_EXT = /\.(ya?ml|json|toml|ini|env)$/i;
25
- const CONFIG_NAMES = /(config|settings|env|constants)\./i;
26
-
27
- function scoreFile(file: string, protectedPaths: string[]): number {
28
- const norm = file.replace(/\\/g, '/');
29
-
30
- // Protected paths are highest risk
31
- for (const pattern of protectedPaths) {
32
- if (minimatch(norm, pattern, { matchBase: false }) ||
33
- minimatch(norm, pattern, { matchBase: true })) {
34
- return 100;
35
- }
36
- }
37
-
38
- if (TEST_EXT.test(norm)) return 10;
39
- if (DOC_EXT.test(norm)) return 5;
40
-
41
- if (AUTH_PATTERNS.some(p => p.test(norm))) return 80;
42
- if (PAYMENT_PATTERNS.some(p => p.test(norm))) return 70;
43
- if (CORE_PATTERNS.some(p => p.test(norm))) return 50;
44
- if (CONFIG_EXT.test(norm) || CONFIG_NAMES.test(norm)) return 40;
45
-
46
- return 30;
47
- }
48
-
49
- /**
50
- * Returns files sorted highest-risk first so LLM sees the most sensitive code
51
- * at the start of its context window.
52
- */
53
- export function rankByRisk(files: string[], options: RankOptions = {}): string[] {
54
- const protectedPaths = options.protectedPaths ?? [];
55
- return [...files].sort((a, b) => scoreFile(b, protectedPaths) - scoreFile(a, protectedPaths));
56
- }
@@ -1,53 +0,0 @@
1
- import * as fs from 'node:fs/promises';
2
- import * as yaml from 'js-yaml';
3
- import Ajv from 'ajv';
4
- import { GuardrailError } from '../errors.ts';
5
- import type { GuardrailConfig } from './types.ts';
6
- import { GUARDRAIL_CONFIG_SCHEMA } from './schema.ts';
7
-
8
- const ajv = new Ajv({ allErrors: true, strict: false });
9
- const validate = ajv.compile(GUARDRAIL_CONFIG_SCHEMA);
10
-
11
- export async function loadConfig(path: string): Promise<GuardrailConfig> {
12
- let content: string;
13
- try {
14
- content = await fs.readFile(path, 'utf8');
15
- } catch (err) {
16
- throw new GuardrailError(`Config file not found: ${path}`, {
17
- code: 'user_input',
18
- details: { path, cause: err instanceof Error ? err.message : String(err) },
19
- });
20
- }
21
-
22
- let parsed: unknown;
23
- try {
24
- parsed = yaml.load(content);
25
- } catch (err) {
26
- throw new GuardrailError(`Invalid YAML in ${path}`, {
27
- code: 'invalid_config',
28
- details: { path, cause: err instanceof Error ? err.message : String(err) },
29
- });
30
- }
31
-
32
- if (!validate(parsed)) {
33
- const errors = (validate.errors ?? []).map(e => {
34
- const loc = e.instancePath ? e.instancePath.replace(/^\//, '').replace(/\//g, '.') : '<root>';
35
- // enum errors: list allowed values
36
- if (e.keyword === 'enum' && Array.isArray(e.params?.allowedValues)) {
37
- return `${loc}: must be one of ${(e.params.allowedValues as unknown[]).map(v => JSON.stringify(v)).join(', ')}`;
38
- }
39
- // additionalProperties: name the unexpected key
40
- if (e.keyword === 'additionalProperties' && e.params?.additionalProperty) {
41
- return `${loc}: unexpected key "${e.params.additionalProperty as string}"`;
42
- }
43
- return `${loc}: ${e.message ?? 'invalid'}`;
44
- });
45
- const summary = errors.slice(0, 5).join('\n ');
46
- throw new GuardrailError(
47
- `guardrail.config.yaml is invalid:\n ${summary}${errors.length > 5 ? `\n …and ${errors.length - 5} more` : ''}`,
48
- { code: 'invalid_config', details: { path, errors } },
49
- );
50
- }
51
-
52
- return parsed as GuardrailConfig;
53
- }
@@ -1,46 +0,0 @@
1
- import * as fs from 'node:fs/promises';
2
- import * as path from 'node:path';
3
- import { loadConfig } from './loader.ts';
4
- import { GuardrailError } from '../errors.ts';
5
- import type { GuardrailConfig } from './types.ts';
6
-
7
- const PRESET_ROOT = path.resolve(process.cwd(), 'presets');
8
-
9
- export interface ResolvedPreset {
10
- name: string;
11
- config: GuardrailConfig;
12
- stack: string;
13
- }
14
-
15
- export async function resolvePreset(name: string): Promise<ResolvedPreset> {
16
- const presetDir = path.join(PRESET_ROOT, name);
17
- try {
18
- await fs.stat(presetDir);
19
- } catch {
20
- throw new GuardrailError(`Preset not found: ${name}`, {
21
- code: 'invalid_config',
22
- details: { name, presetDir },
23
- });
24
- }
25
-
26
- const config = await loadConfig(path.join(presetDir, 'guardrail.config.yaml'));
27
- let stack = '';
28
- try {
29
- stack = await fs.readFile(path.join(presetDir, 'stack.md'), 'utf8');
30
- } catch {
31
- stack = config.stack ?? '';
32
- }
33
- return { name, config, stack };
34
- }
35
-
36
- export function mergeConfigs(preset: GuardrailConfig, user: GuardrailConfig): GuardrailConfig {
37
- return {
38
- ...preset,
39
- ...user,
40
- // Arrays are concatenated (preset values first) so user additions don't discard preset invariants
41
- protectedPaths: [...(preset.protectedPaths ?? []), ...(user.protectedPaths ?? [])],
42
- staticRules: [...(preset.staticRules ?? []), ...(user.staticRules ?? [])],
43
- thresholds: { ...preset.thresholds, ...user.thresholds },
44
- chunking: { ...preset.chunking, ...user.chunking },
45
- };
46
- }
@@ -1,181 +0,0 @@
1
- export const GUARDRAIL_CONFIG_SCHEMA = {
2
- $schema: 'http://json-schema.org/draft-07/schema#',
3
- type: 'object',
4
- required: ['configVersion'],
5
- additionalProperties: false,
6
- properties: {
7
- configVersion: { const: 1 },
8
- preset: { type: 'string' },
9
- reviewEngine: { $ref: '#/definitions/adapterRef' },
10
- vcsHost: { $ref: '#/definitions/adapterRef' },
11
- migrationRunner: { $ref: '#/definitions/adapterRef' },
12
- reviewBot: { $ref: '#/definitions/adapterRef' },
13
- adapterAllowlist: { type: 'array', items: { type: 'string' } },
14
- protectedPaths: { type: 'array', items: { type: 'string' } },
15
- staticRules: {
16
- type: 'array',
17
- items: {
18
- oneOf: [
19
- { type: 'string' },
20
- { type: 'object', required: ['adapter'], properties: { adapter: { type: 'string' }, options: { type: 'object' } } },
21
- ],
22
- },
23
- },
24
- staticRulesParallel: { type: 'boolean' },
25
- stack: { type: 'string' },
26
- testCommand: { type: ['string', 'null'] },
27
- thresholds: {
28
- type: 'object',
29
- properties: {
30
- bugbotAutoFix: { type: 'number' },
31
- bugbotProposePatch: { type: 'number' },
32
- maxValidateRetries: { type: 'number' },
33
- maxCodexRetries: { type: 'number' },
34
- maxBugbotRounds: { type: 'number' },
35
- },
36
- additionalProperties: false,
37
- },
38
- ignore: {
39
- type: 'array',
40
- items: {
41
- oneOf: [
42
- { type: 'string' },
43
- {
44
- type: 'object',
45
- required: ['path'],
46
- properties: {
47
- rule: { type: 'string' },
48
- path: { type: 'string' },
49
- },
50
- additionalProperties: false,
51
- },
52
- ],
53
- },
54
- },
55
- reviewStrategy: { enum: ['auto', 'single-pass', 'file-level', 'diff', 'auto-diff'] },
56
- chunking: {
57
- type: 'object',
58
- properties: {
59
- smallTierMaxTokens: { type: 'number' },
60
- partialReviewTokens: { type: 'number' },
61
- perFileMaxTokens: { type: 'number' },
62
- parallelism: { type: 'number' },
63
- rateLimitBackoff: { enum: ['exp', 'linear', 'none'] },
64
- },
65
- additionalProperties: false,
66
- },
67
- policy: {
68
- type: 'object',
69
- properties: {
70
- failOn: { enum: ['critical', 'warning', 'note', 'none'] },
71
- newOnly: { type: 'boolean' },
72
- baselinePath: { type: 'string' },
73
- },
74
- additionalProperties: false,
75
- },
76
- pipeline: {
77
- type: 'object',
78
- properties: {
79
- runReviewOnStaticFail: { type: 'boolean' },
80
- runReviewOnTestFail: { type: 'boolean' },
81
- },
82
- additionalProperties: false,
83
- },
84
- cost: {
85
- type: 'object',
86
- properties: {
87
- maxPerRun: { type: 'number' },
88
- estimateBeforeRun: { type: 'boolean' },
89
- pricing: { type: 'object' },
90
- },
91
- additionalProperties: false,
92
- },
93
- brand: {
94
- type: 'object',
95
- properties: {
96
- colorsFrom: { type: 'string' },
97
- colors: { type: 'array', items: { type: 'string' } },
98
- fonts: { type: 'array', items: { type: 'string' } },
99
- componentLibrary: {
100
- oneOf: [
101
- { type: 'string' },
102
- {
103
- type: 'object',
104
- properties: {
105
- tokens: { type: 'string' },
106
- guide: { type: 'string' },
107
- },
108
- additionalProperties: false,
109
- },
110
- ],
111
- },
112
- },
113
- additionalProperties: false,
114
- },
115
- 'schema-alignment': {
116
- type: 'object',
117
- properties: {
118
- enabled: { type: 'boolean' },
119
- migrationGlobs: { type: 'array', items: { type: 'string', minLength: 1 } },
120
- layerRoots: {
121
- type: 'object',
122
- properties: {
123
- types: { type: 'array', items: { type: 'string' }, minItems: 1 },
124
- api: { type: 'array', items: { type: 'string' }, minItems: 1 },
125
- ui: { type: 'array', items: { type: 'string' }, minItems: 1 },
126
- },
127
- additionalProperties: false,
128
- },
129
- llmCheck: { type: 'boolean' },
130
- severity: { enum: ['warning', 'error'] },
131
- },
132
- additionalProperties: false,
133
- },
134
- cache: { type: 'object' },
135
- persistence: { type: 'object' },
136
- concurrency: { type: 'object' },
137
- council: {
138
- type: 'object',
139
- required: ['models', 'synthesizer'],
140
- additionalProperties: false,
141
- properties: {
142
- models: {
143
- type: 'array',
144
- minItems: 2,
145
- items: {
146
- type: 'object',
147
- required: ['adapter', 'model', 'label'],
148
- additionalProperties: false,
149
- properties: {
150
- adapter: { type: 'string' },
151
- model: { type: 'string' },
152
- label: { type: 'string' },
153
- },
154
- },
155
- },
156
- synthesizer: {
157
- type: 'object',
158
- required: ['adapter', 'model', 'label'],
159
- additionalProperties: false,
160
- properties: {
161
- adapter: { type: 'string' },
162
- model: { type: 'string' },
163
- label: { type: 'string' },
164
- },
165
- },
166
- timeout_ms: { type: 'number' },
167
- min_successful_responses: { type: 'number' },
168
- parallel_input_max_tokens: { type: 'number' },
169
- synthesis_input_max_tokens: { type: 'number' },
170
- },
171
- },
172
- },
173
- definitions: {
174
- adapterRef: {
175
- oneOf: [
176
- { type: 'string' },
177
- { type: 'object', required: ['adapter'], properties: { adapter: { type: 'string' }, options: { type: 'object' } } },
178
- ],
179
- },
180
- },
181
- } as const;