@delegance/claude-autopilot 5.0.1 → 5.0.3

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 (412) hide show
  1. package/dist/src/adapters/review-engine/codex.js +13 -1
  2. package/dist/src/cli/index.js +39 -1
  3. package/dist/src/cli/preflight.js +17 -4
  4. package/dist/src/cli/scan.js +12 -0
  5. package/package.json +4 -3
  6. package/dist/presets/go/rules/go-sql-injection.d.ts.map +0 -1
  7. package/dist/presets/go/rules/go-sql-injection.js.map +0 -1
  8. package/dist/presets/nextjs-supabase/rules/supabase-rls-bypass.d.ts.map +0 -1
  9. package/dist/presets/nextjs-supabase/rules/supabase-rls-bypass.js.map +0 -1
  10. package/dist/presets/python-fastapi/rules/fastapi-missing-auth.d.ts.map +0 -1
  11. package/dist/presets/python-fastapi/rules/fastapi-missing-auth.js.map +0 -1
  12. package/dist/presets/rails-postgres/rules/rails-sql-injection.d.ts.map +0 -1
  13. package/dist/presets/rails-postgres/rules/rails-sql-injection.js.map +0 -1
  14. package/dist/presets/t3/rules/t3-server-only.d.ts.map +0 -1
  15. package/dist/presets/t3/rules/t3-server-only.js.map +0 -1
  16. package/dist/src/adapters/base.d.ts.map +0 -1
  17. package/dist/src/adapters/base.js.map +0 -1
  18. package/dist/src/adapters/council/claude.d.ts.map +0 -1
  19. package/dist/src/adapters/council/claude.js.map +0 -1
  20. package/dist/src/adapters/council/openai.d.ts.map +0 -1
  21. package/dist/src/adapters/council/openai.js.map +0 -1
  22. package/dist/src/adapters/council/types.d.ts.map +0 -1
  23. package/dist/src/adapters/council/types.js.map +0 -1
  24. package/dist/src/adapters/loader.d.ts.map +0 -1
  25. package/dist/src/adapters/loader.js.map +0 -1
  26. package/dist/src/adapters/migration-runner/supabase.d.ts.map +0 -1
  27. package/dist/src/adapters/migration-runner/supabase.js.map +0 -1
  28. package/dist/src/adapters/migration-runner/types.d.ts.map +0 -1
  29. package/dist/src/adapters/migration-runner/types.js.map +0 -1
  30. package/dist/src/adapters/review-bot-parser/cursor.d.ts.map +0 -1
  31. package/dist/src/adapters/review-bot-parser/cursor.js.map +0 -1
  32. package/dist/src/adapters/review-bot-parser/declarative-base.d.ts.map +0 -1
  33. package/dist/src/adapters/review-bot-parser/declarative-base.js.map +0 -1
  34. package/dist/src/adapters/review-bot-parser/types.d.ts.map +0 -1
  35. package/dist/src/adapters/review-bot-parser/types.js.map +0 -1
  36. package/dist/src/adapters/review-engine/auto.d.ts.map +0 -1
  37. package/dist/src/adapters/review-engine/auto.js.map +0 -1
  38. package/dist/src/adapters/review-engine/claude.d.ts.map +0 -1
  39. package/dist/src/adapters/review-engine/claude.js.map +0 -1
  40. package/dist/src/adapters/review-engine/codex.d.ts.map +0 -1
  41. package/dist/src/adapters/review-engine/codex.js.map +0 -1
  42. package/dist/src/adapters/review-engine/gemini.d.ts.map +0 -1
  43. package/dist/src/adapters/review-engine/gemini.js.map +0 -1
  44. package/dist/src/adapters/review-engine/openai-compatible.d.ts.map +0 -1
  45. package/dist/src/adapters/review-engine/openai-compatible.js.map +0 -1
  46. package/dist/src/adapters/review-engine/parse-output.d.ts.map +0 -1
  47. package/dist/src/adapters/review-engine/parse-output.js.map +0 -1
  48. package/dist/src/adapters/review-engine/prompt-builder.d.ts.map +0 -1
  49. package/dist/src/adapters/review-engine/prompt-builder.js.map +0 -1
  50. package/dist/src/adapters/review-engine/types.d.ts.map +0 -1
  51. package/dist/src/adapters/review-engine/types.js.map +0 -1
  52. package/dist/src/adapters/vcs-host/commit-status.d.ts.map +0 -1
  53. package/dist/src/adapters/vcs-host/commit-status.js.map +0 -1
  54. package/dist/src/adapters/vcs-host/github.d.ts.map +0 -1
  55. package/dist/src/adapters/vcs-host/github.js.map +0 -1
  56. package/dist/src/adapters/vcs-host/types.d.ts.map +0 -1
  57. package/dist/src/adapters/vcs-host/types.js.map +0 -1
  58. package/dist/src/cli/_pkg-root.d.ts.map +0 -1
  59. package/dist/src/cli/_pkg-root.js.map +0 -1
  60. package/dist/src/cli/autoregress-bridge.d.ts.map +0 -1
  61. package/dist/src/cli/autoregress-bridge.js.map +0 -1
  62. package/dist/src/cli/baseline.d.ts.map +0 -1
  63. package/dist/src/cli/baseline.js.map +0 -1
  64. package/dist/src/cli/ci.d.ts.map +0 -1
  65. package/dist/src/cli/ci.js.map +0 -1
  66. package/dist/src/cli/costs.d.ts.map +0 -1
  67. package/dist/src/cli/costs.js.map +0 -1
  68. package/dist/src/cli/council.d.ts.map +0 -1
  69. package/dist/src/cli/council.js.map +0 -1
  70. package/dist/src/cli/detector.d.ts.map +0 -1
  71. package/dist/src/cli/detector.js.map +0 -1
  72. package/dist/src/cli/explain.d.ts.map +0 -1
  73. package/dist/src/cli/explain.js.map +0 -1
  74. package/dist/src/cli/fix.d.ts.map +0 -1
  75. package/dist/src/cli/fix.js.map +0 -1
  76. package/dist/src/cli/hook.d.ts.map +0 -1
  77. package/dist/src/cli/hook.js.map +0 -1
  78. package/dist/src/cli/ignore-helper.d.ts.map +0 -1
  79. package/dist/src/cli/ignore-helper.js.map +0 -1
  80. package/dist/src/cli/index.d.ts.map +0 -1
  81. package/dist/src/cli/index.js.map +0 -1
  82. package/dist/src/cli/lsp.d.ts.map +0 -1
  83. package/dist/src/cli/lsp.js.map +0 -1
  84. package/dist/src/cli/mcp.d.ts.map +0 -1
  85. package/dist/src/cli/mcp.js.map +0 -1
  86. package/dist/src/cli/migrate-v4.d.ts.map +0 -1
  87. package/dist/src/cli/migrate-v4.js.map +0 -1
  88. package/dist/src/cli/pr-comment.d.ts.map +0 -1
  89. package/dist/src/cli/pr-comment.js.map +0 -1
  90. package/dist/src/cli/pr-desc.d.ts.map +0 -1
  91. package/dist/src/cli/pr-desc.js.map +0 -1
  92. package/dist/src/cli/pr-review-comments.d.ts.map +0 -1
  93. package/dist/src/cli/pr-review-comments.js.map +0 -1
  94. package/dist/src/cli/pr.d.ts.map +0 -1
  95. package/dist/src/cli/pr.js.map +0 -1
  96. package/dist/src/cli/preflight.d.ts.map +0 -1
  97. package/dist/src/cli/preflight.js.map +0 -1
  98. package/dist/src/cli/report.d.ts.map +0 -1
  99. package/dist/src/cli/report.js.map +0 -1
  100. package/dist/src/cli/run.d.ts.map +0 -1
  101. package/dist/src/cli/run.js.map +0 -1
  102. package/dist/src/cli/scan.d.ts.map +0 -1
  103. package/dist/src/cli/scan.js.map +0 -1
  104. package/dist/src/cli/setup.d.ts.map +0 -1
  105. package/dist/src/cli/setup.js.map +0 -1
  106. package/dist/src/cli/test-gen.d.ts.map +0 -1
  107. package/dist/src/cli/test-gen.js.map +0 -1
  108. package/dist/src/cli/triage.d.ts.map +0 -1
  109. package/dist/src/cli/triage.js.map +0 -1
  110. package/dist/src/cli/watch.d.ts.map +0 -1
  111. package/dist/src/cli/watch.js.map +0 -1
  112. package/dist/src/cli/worker.d.ts.map +0 -1
  113. package/dist/src/cli/worker.js.map +0 -1
  114. package/dist/src/core/cache/cached-engine.d.ts.map +0 -1
  115. package/dist/src/core/cache/cached-engine.js.map +0 -1
  116. package/dist/src/core/cache/review-cache.d.ts.map +0 -1
  117. package/dist/src/core/cache/review-cache.js.map +0 -1
  118. package/dist/src/core/chunking/index.d.ts.map +0 -1
  119. package/dist/src/core/chunking/index.js.map +0 -1
  120. package/dist/src/core/chunking/risk-ranker.d.ts.map +0 -1
  121. package/dist/src/core/chunking/risk-ranker.js.map +0 -1
  122. package/dist/src/core/config/loader.d.ts.map +0 -1
  123. package/dist/src/core/config/loader.js.map +0 -1
  124. package/dist/src/core/config/preset-resolver.d.ts.map +0 -1
  125. package/dist/src/core/config/preset-resolver.js.map +0 -1
  126. package/dist/src/core/config/schema.d.ts.map +0 -1
  127. package/dist/src/core/config/schema.js.map +0 -1
  128. package/dist/src/core/config/types.d.ts.map +0 -1
  129. package/dist/src/core/config/types.js.map +0 -1
  130. package/dist/src/core/council/config.d.ts.map +0 -1
  131. package/dist/src/core/council/config.js.map +0 -1
  132. package/dist/src/core/council/context.d.ts.map +0 -1
  133. package/dist/src/core/council/context.js.map +0 -1
  134. package/dist/src/core/council/runner.d.ts.map +0 -1
  135. package/dist/src/core/council/runner.js.map +0 -1
  136. package/dist/src/core/council/types.d.ts.map +0 -1
  137. package/dist/src/core/council/types.js.map +0 -1
  138. package/dist/src/core/detect/git-context.d.ts.map +0 -1
  139. package/dist/src/core/detect/git-context.js.map +0 -1
  140. package/dist/src/core/detect/llm-key.d.ts.map +0 -1
  141. package/dist/src/core/detect/llm-key.js.map +0 -1
  142. package/dist/src/core/detect/protected-paths.d.ts.map +0 -1
  143. package/dist/src/core/detect/protected-paths.js.map +0 -1
  144. package/dist/src/core/detect/provider-usage.d.ts.map +0 -1
  145. package/dist/src/core/detect/provider-usage.js.map +0 -1
  146. package/dist/src/core/detect/stack.d.ts.map +0 -1
  147. package/dist/src/core/detect/stack.js.map +0 -1
  148. package/dist/src/core/detect/workspaces.d.ts.map +0 -1
  149. package/dist/src/core/detect/workspaces.js.map +0 -1
  150. package/dist/src/core/errors.d.ts.map +0 -1
  151. package/dist/src/core/errors.js.map +0 -1
  152. package/dist/src/core/findings/dedup.d.ts.map +0 -1
  153. package/dist/src/core/findings/dedup.js.map +0 -1
  154. package/dist/src/core/findings/types.d.ts.map +0 -1
  155. package/dist/src/core/findings/types.js.map +0 -1
  156. package/dist/src/core/fix/generator.d.ts.map +0 -1
  157. package/dist/src/core/fix/generator.js.map +0 -1
  158. package/dist/src/core/git/diff-hunks.d.ts.map +0 -1
  159. package/dist/src/core/git/diff-hunks.js.map +0 -1
  160. package/dist/src/core/git/touched-files.d.ts.map +0 -1
  161. package/dist/src/core/git/touched-files.js.map +0 -1
  162. package/dist/src/core/ignore/index.d.ts.map +0 -1
  163. package/dist/src/core/ignore/index.js.map +0 -1
  164. package/dist/src/core/index.d.ts.map +0 -1
  165. package/dist/src/core/index.js.map +0 -1
  166. package/dist/src/core/logging/ndjson-writer.d.ts.map +0 -1
  167. package/dist/src/core/logging/ndjson-writer.js.map +0 -1
  168. package/dist/src/core/logging/redaction.d.ts.map +0 -1
  169. package/dist/src/core/logging/redaction.js.map +0 -1
  170. package/dist/src/core/mcp/concurrency.d.ts.map +0 -1
  171. package/dist/src/core/mcp/concurrency.js.map +0 -1
  172. package/dist/src/core/mcp/handlers/fix-finding.d.ts.map +0 -1
  173. package/dist/src/core/mcp/handlers/fix-finding.js.map +0 -1
  174. package/dist/src/core/mcp/handlers/get-capabilities.d.ts.map +0 -1
  175. package/dist/src/core/mcp/handlers/get-capabilities.js.map +0 -1
  176. package/dist/src/core/mcp/handlers/get-findings.d.ts.map +0 -1
  177. package/dist/src/core/mcp/handlers/get-findings.js.map +0 -1
  178. package/dist/src/core/mcp/handlers/review-diff.d.ts.map +0 -1
  179. package/dist/src/core/mcp/handlers/review-diff.js.map +0 -1
  180. package/dist/src/core/mcp/handlers/scan-files.d.ts.map +0 -1
  181. package/dist/src/core/mcp/handlers/scan-files.js.map +0 -1
  182. package/dist/src/core/mcp/handlers/validate-fix.d.ts.map +0 -1
  183. package/dist/src/core/mcp/handlers/validate-fix.js.map +0 -1
  184. package/dist/src/core/mcp/run-store.d.ts.map +0 -1
  185. package/dist/src/core/mcp/run-store.js.map +0 -1
  186. package/dist/src/core/mcp/workspace.d.ts.map +0 -1
  187. package/dist/src/core/mcp/workspace.js.map +0 -1
  188. package/dist/src/core/persist/baseline.d.ts.map +0 -1
  189. package/dist/src/core/persist/baseline.js.map +0 -1
  190. package/dist/src/core/persist/cost-log.d.ts.map +0 -1
  191. package/dist/src/core/persist/cost-log.js.map +0 -1
  192. package/dist/src/core/persist/findings-cache.d.ts.map +0 -1
  193. package/dist/src/core/persist/findings-cache.js.map +0 -1
  194. package/dist/src/core/persist/triage.d.ts.map +0 -1
  195. package/dist/src/core/persist/triage.js.map +0 -1
  196. package/dist/src/core/phases/static-rules.d.ts.map +0 -1
  197. package/dist/src/core/phases/static-rules.js.map +0 -1
  198. package/dist/src/core/phases/tests.d.ts.map +0 -1
  199. package/dist/src/core/phases/tests.js.map +0 -1
  200. package/dist/src/core/pipeline/review-phase.d.ts.map +0 -1
  201. package/dist/src/core/pipeline/review-phase.js.map +0 -1
  202. package/dist/src/core/pipeline/run.d.ts.map +0 -1
  203. package/dist/src/core/pipeline/run.js.map +0 -1
  204. package/dist/src/core/runtime/idempotency.d.ts.map +0 -1
  205. package/dist/src/core/runtime/idempotency.js.map +0 -1
  206. package/dist/src/core/runtime/lock.d.ts.map +0 -1
  207. package/dist/src/core/runtime/lock.js.map +0 -1
  208. package/dist/src/core/runtime/state.d.ts.map +0 -1
  209. package/dist/src/core/runtime/state.js.map +0 -1
  210. package/dist/src/core/schema-alignment/detector.d.ts.map +0 -1
  211. package/dist/src/core/schema-alignment/detector.js.map +0 -1
  212. package/dist/src/core/schema-alignment/extractor/index.d.ts.map +0 -1
  213. package/dist/src/core/schema-alignment/extractor/index.js.map +0 -1
  214. package/dist/src/core/schema-alignment/extractor/prisma.d.ts.map +0 -1
  215. package/dist/src/core/schema-alignment/extractor/prisma.js.map +0 -1
  216. package/dist/src/core/schema-alignment/extractor/sql.d.ts.map +0 -1
  217. package/dist/src/core/schema-alignment/extractor/sql.js.map +0 -1
  218. package/dist/src/core/schema-alignment/llm-check.d.ts.map +0 -1
  219. package/dist/src/core/schema-alignment/llm-check.js.map +0 -1
  220. package/dist/src/core/schema-alignment/scanner.d.ts.map +0 -1
  221. package/dist/src/core/schema-alignment/scanner.js.map +0 -1
  222. package/dist/src/core/schema-alignment/types.d.ts.map +0 -1
  223. package/dist/src/core/schema-alignment/types.js.map +0 -1
  224. package/dist/src/core/shell.d.ts.map +0 -1
  225. package/dist/src/core/shell.js.map +0 -1
  226. package/dist/src/core/static-rules/registry.d.ts.map +0 -1
  227. package/dist/src/core/static-rules/registry.js.map +0 -1
  228. package/dist/src/core/static-rules/rules/brand-tokens.d.ts.map +0 -1
  229. package/dist/src/core/static-rules/rules/brand-tokens.js.map +0 -1
  230. package/dist/src/core/static-rules/rules/console-log.d.ts.map +0 -1
  231. package/dist/src/core/static-rules/rules/console-log.js.map +0 -1
  232. package/dist/src/core/static-rules/rules/hardcoded-secrets.d.ts.map +0 -1
  233. package/dist/src/core/static-rules/rules/hardcoded-secrets.js.map +0 -1
  234. package/dist/src/core/static-rules/rules/insecure-redirect.d.ts.map +0 -1
  235. package/dist/src/core/static-rules/rules/insecure-redirect.js.map +0 -1
  236. package/dist/src/core/static-rules/rules/large-file.d.ts.map +0 -1
  237. package/dist/src/core/static-rules/rules/large-file.js.map +0 -1
  238. package/dist/src/core/static-rules/rules/missing-auth.d.ts.map +0 -1
  239. package/dist/src/core/static-rules/rules/missing-auth.js.map +0 -1
  240. package/dist/src/core/static-rules/rules/missing-tests.d.ts.map +0 -1
  241. package/dist/src/core/static-rules/rules/missing-tests.js.map +0 -1
  242. package/dist/src/core/static-rules/rules/npm-audit.d.ts.map +0 -1
  243. package/dist/src/core/static-rules/rules/npm-audit.js.map +0 -1
  244. package/dist/src/core/static-rules/rules/package-lock-sync.d.ts.map +0 -1
  245. package/dist/src/core/static-rules/rules/package-lock-sync.js.map +0 -1
  246. package/dist/src/core/static-rules/rules/schema-alignment.d.ts.map +0 -1
  247. package/dist/src/core/static-rules/rules/schema-alignment.js.map +0 -1
  248. package/dist/src/core/static-rules/rules/sql-injection.d.ts.map +0 -1
  249. package/dist/src/core/static-rules/rules/sql-injection.js.map +0 -1
  250. package/dist/src/core/static-rules/rules/ssrf.d.ts.map +0 -1
  251. package/dist/src/core/static-rules/rules/ssrf.js.map +0 -1
  252. package/dist/src/core/static-rules/rules/todo-fixme.d.ts.map +0 -1
  253. package/dist/src/core/static-rules/rules/todo-fixme.js.map +0 -1
  254. package/dist/src/core/static-rules/tailwind-extractor.d.ts.map +0 -1
  255. package/dist/src/core/static-rules/tailwind-extractor.js.map +0 -1
  256. package/dist/src/core/test-gen/coverage-analyzer.d.ts.map +0 -1
  257. package/dist/src/core/test-gen/coverage-analyzer.js.map +0 -1
  258. package/dist/src/core/test-gen/framework-detector.d.ts.map +0 -1
  259. package/dist/src/core/test-gen/framework-detector.js.map +0 -1
  260. package/dist/src/core/test-gen/test-writer.d.ts.map +0 -1
  261. package/dist/src/core/test-gen/test-writer.js.map +0 -1
  262. package/dist/src/core/ui/design-context-loader.d.ts.map +0 -1
  263. package/dist/src/core/ui/design-context-loader.js.map +0 -1
  264. package/dist/src/core/worker/client.d.ts.map +0 -1
  265. package/dist/src/core/worker/client.js.map +0 -1
  266. package/dist/src/core/worker/lockfile.d.ts.map +0 -1
  267. package/dist/src/core/worker/lockfile.js.map +0 -1
  268. package/dist/src/core/worker/server.d.ts.map +0 -1
  269. package/dist/src/core/worker/server.js.map +0 -1
  270. package/dist/src/formatters/github-annotations.d.ts.map +0 -1
  271. package/dist/src/formatters/github-annotations.js.map +0 -1
  272. package/dist/src/formatters/index.d.ts.map +0 -1
  273. package/dist/src/formatters/index.js.map +0 -1
  274. package/dist/src/formatters/junit.d.ts.map +0 -1
  275. package/dist/src/formatters/junit.js.map +0 -1
  276. package/dist/src/formatters/sarif.d.ts.map +0 -1
  277. package/dist/src/formatters/sarif.js.map +0 -1
  278. package/dist/src/index.d.ts.map +0 -1
  279. package/dist/src/index.js.map +0 -1
  280. package/src/adapters/base.ts +0 -19
  281. package/src/adapters/council/claude.ts +0 -41
  282. package/src/adapters/council/openai.ts +0 -40
  283. package/src/adapters/council/types.ts +0 -7
  284. package/src/adapters/loader.ts +0 -108
  285. package/src/adapters/migration-runner/supabase.ts +0 -56
  286. package/src/adapters/migration-runner/types.ts +0 -36
  287. package/src/adapters/review-bot-parser/cursor.ts +0 -13
  288. package/src/adapters/review-bot-parser/declarative-base.ts +0 -64
  289. package/src/adapters/review-bot-parser/types.ts +0 -9
  290. package/src/adapters/review-engine/auto.ts +0 -94
  291. package/src/adapters/review-engine/claude.ts +0 -100
  292. package/src/adapters/review-engine/codex.ts +0 -82
  293. package/src/adapters/review-engine/gemini.ts +0 -105
  294. package/src/adapters/review-engine/openai-compatible.ts +0 -100
  295. package/src/adapters/review-engine/parse-output.ts +0 -74
  296. package/src/adapters/review-engine/prompt-builder.ts +0 -19
  297. package/src/adapters/review-engine/types.ts +0 -19
  298. package/src/adapters/vcs-host/commit-status.ts +0 -39
  299. package/src/adapters/vcs-host/github.ts +0 -77
  300. package/src/adapters/vcs-host/types.ts +0 -44
  301. package/src/cli/_pkg-root.ts +0 -85
  302. package/src/cli/autoregress-bridge.ts +0 -30
  303. package/src/cli/baseline.ts +0 -125
  304. package/src/cli/ci.ts +0 -45
  305. package/src/cli/costs.ts +0 -80
  306. package/src/cli/council.ts +0 -96
  307. package/src/cli/detector.ts +0 -92
  308. package/src/cli/explain.ts +0 -197
  309. package/src/cli/fix.ts +0 -249
  310. package/src/cli/hook.ts +0 -124
  311. package/src/cli/ignore-helper.ts +0 -116
  312. package/src/cli/index.ts +0 -612
  313. package/src/cli/lsp.ts +0 -200
  314. package/src/cli/mcp.ts +0 -206
  315. package/src/cli/migrate-v4.ts +0 -388
  316. package/src/cli/pr-comment.ts +0 -139
  317. package/src/cli/pr-desc.ts +0 -168
  318. package/src/cli/pr-review-comments.ts +0 -92
  319. package/src/cli/pr.ts +0 -76
  320. package/src/cli/preflight.ts +0 -235
  321. package/src/cli/report.ts +0 -186
  322. package/src/cli/run.ts +0 -425
  323. package/src/cli/scan.ts +0 -233
  324. package/src/cli/setup.ts +0 -191
  325. package/src/cli/test-gen.ts +0 -125
  326. package/src/cli/triage.ts +0 -137
  327. package/src/cli/watch.ts +0 -190
  328. package/src/cli/worker.ts +0 -109
  329. package/src/core/.gitkeep +0 -0
  330. package/src/core/cache/cached-engine.ts +0 -32
  331. package/src/core/cache/review-cache.ts +0 -70
  332. package/src/core/chunking/index.ts +0 -113
  333. package/src/core/chunking/risk-ranker.ts +0 -56
  334. package/src/core/config/loader.ts +0 -53
  335. package/src/core/config/preset-resolver.ts +0 -46
  336. package/src/core/config/schema.ts +0 -181
  337. package/src/core/config/types.ts +0 -98
  338. package/src/core/council/config.ts +0 -71
  339. package/src/core/council/context.ts +0 -17
  340. package/src/core/council/runner.ts +0 -83
  341. package/src/core/council/types.ts +0 -45
  342. package/src/core/detect/git-context.ts +0 -27
  343. package/src/core/detect/llm-key.ts +0 -89
  344. package/src/core/detect/protected-paths.ts +0 -63
  345. package/src/core/detect/provider-usage.ts +0 -74
  346. package/src/core/detect/stack.ts +0 -153
  347. package/src/core/detect/workspaces.ts +0 -103
  348. package/src/core/errors.ts +0 -37
  349. package/src/core/findings/dedup.ts +0 -14
  350. package/src/core/findings/types.ts +0 -39
  351. package/src/core/fix/generator.ts +0 -149
  352. package/src/core/git/diff-hunks.ts +0 -86
  353. package/src/core/git/touched-files.ts +0 -73
  354. package/src/core/ignore/index.ts +0 -54
  355. package/src/core/index.ts +0 -1
  356. package/src/core/logging/ndjson-writer.ts +0 -37
  357. package/src/core/logging/redaction.ts +0 -19
  358. package/src/core/mcp/concurrency.ts +0 -16
  359. package/src/core/mcp/handlers/fix-finding.ts +0 -126
  360. package/src/core/mcp/handlers/get-capabilities.ts +0 -62
  361. package/src/core/mcp/handlers/get-findings.ts +0 -36
  362. package/src/core/mcp/handlers/review-diff.ts +0 -65
  363. package/src/core/mcp/handlers/scan-files.ts +0 -65
  364. package/src/core/mcp/handlers/validate-fix.ts +0 -41
  365. package/src/core/mcp/run-store.ts +0 -85
  366. package/src/core/mcp/workspace.ts +0 -35
  367. package/src/core/persist/baseline.ts +0 -112
  368. package/src/core/persist/cost-log.ts +0 -30
  369. package/src/core/persist/findings-cache.ts +0 -43
  370. package/src/core/persist/triage.ts +0 -112
  371. package/src/core/phases/static-rules.ts +0 -93
  372. package/src/core/phases/tests.ts +0 -51
  373. package/src/core/pipeline/review-phase.ts +0 -182
  374. package/src/core/pipeline/run.ts +0 -116
  375. package/src/core/runtime/idempotency.ts +0 -6
  376. package/src/core/runtime/lock.ts +0 -29
  377. package/src/core/runtime/state.ts +0 -97
  378. package/src/core/schema-alignment/detector.ts +0 -59
  379. package/src/core/schema-alignment/extractor/index.ts +0 -24
  380. package/src/core/schema-alignment/extractor/prisma.ts +0 -21
  381. package/src/core/schema-alignment/extractor/sql.ts +0 -99
  382. package/src/core/schema-alignment/llm-check.ts +0 -91
  383. package/src/core/schema-alignment/scanner.ts +0 -107
  384. package/src/core/schema-alignment/types.ts +0 -43
  385. package/src/core/shell.ts +0 -48
  386. package/src/core/static-rules/registry.ts +0 -59
  387. package/src/core/static-rules/rules/brand-tokens.ts +0 -145
  388. package/src/core/static-rules/rules/console-log.ts +0 -42
  389. package/src/core/static-rules/rules/hardcoded-secrets.ts +0 -83
  390. package/src/core/static-rules/rules/insecure-redirect.ts +0 -67
  391. package/src/core/static-rules/rules/large-file.ts +0 -37
  392. package/src/core/static-rules/rules/missing-auth.ts +0 -70
  393. package/src/core/static-rules/rules/missing-tests.ts +0 -57
  394. package/src/core/static-rules/rules/npm-audit.ts +0 -38
  395. package/src/core/static-rules/rules/package-lock-sync.ts +0 -54
  396. package/src/core/static-rules/rules/schema-alignment.ts +0 -132
  397. package/src/core/static-rules/rules/sql-injection.ts +0 -71
  398. package/src/core/static-rules/rules/ssrf.ts +0 -63
  399. package/src/core/static-rules/rules/todo-fixme.ts +0 -40
  400. package/src/core/static-rules/tailwind-extractor.ts +0 -38
  401. package/src/core/test-gen/coverage-analyzer.ts +0 -93
  402. package/src/core/test-gen/framework-detector.ts +0 -21
  403. package/src/core/test-gen/test-writer.ts +0 -33
  404. package/src/core/ui/design-context-loader.ts +0 -87
  405. package/src/core/worker/client.ts +0 -46
  406. package/src/core/worker/lockfile.ts +0 -38
  407. package/src/core/worker/server.ts +0 -81
  408. package/src/formatters/github-annotations.ts +0 -36
  409. package/src/formatters/index.ts +0 -3
  410. package/src/formatters/junit.ts +0 -52
  411. package/src/formatters/sarif.ts +0 -103
  412. package/src/index.ts +0 -3
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;