@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
@@ -1,100 +0,0 @@
1
- import OpenAI from 'openai';
2
- import { parseReviewOutput } from './parse-output.ts';
3
- import { GuardrailError } from '../../core/errors.ts';
4
- import type { Capabilities } from '../base.ts';
5
- import type { ReviewEngine, ReviewInput, ReviewOutput } from './types.ts';
6
- import { buildSystemPrompt, classifyError } from './prompt-builder.ts';
7
-
8
- const MAX_OUTPUT_TOKENS = 4096;
9
-
10
- const SYSTEM_PROMPT_TEMPLATE = `You are a senior software architect reviewing code changes for quality, security, and correctness.
11
-
12
- The codebase context:
13
- {STACK}{GIT_CONTEXT}{DESIGN_SCHEMA}
14
-
15
- Provide structured feedback in exactly this format:
16
-
17
- ## Review Summary
18
- One paragraph overall assessment.
19
-
20
- ## Findings
21
-
22
- For each finding, use this format:
23
- ### [CRITICAL|WARNING|NOTE] <short title>
24
- <explanation>
25
- **Suggestion:** <actionable fix>
26
-
27
- Rules:
28
- - CRITICAL: Blocks merge (security issues, data loss risks, broken contracts)
29
- - WARNING: Should address before merging (logic errors, missing error handling, test gaps)
30
- - NOTE: Improvement suggestion (style, performance, clarity)
31
- - Maximum 10 findings, ranked by severity
32
- - Be specific and constructive
33
- - Reference the file and line when possible`;
34
-
35
- export const openaiCompatibleAdapter: ReviewEngine = {
36
- name: 'openai-compatible',
37
- apiVersion: '1.0.0',
38
-
39
- getCapabilities(): Capabilities {
40
- return { structuredOutput: false, streaming: false, maxContextTokens: 128000, inlineComments: false };
41
- },
42
-
43
- estimateTokens(content: string): number {
44
- return Math.ceil(content.length / 4);
45
- },
46
-
47
- async review(input: ReviewInput): Promise<ReviewOutput> {
48
- const opts = (input.context as Record<string, unknown> | undefined) ?? {};
49
-
50
- // API key: options.apiKey → named env var → OPENAI_API_KEY
51
- const apiKeyEnv = (opts['apiKeyEnv'] as string | undefined) ?? 'OPENAI_API_KEY';
52
- const apiKey = (opts['apiKey'] as string | undefined) ?? process.env[apiKeyEnv] ?? 'ollama';
53
-
54
- const baseURL = (opts['baseUrl'] as string | undefined) ??
55
- process.env.OPENAI_BASE_URL ??
56
- undefined;
57
-
58
- const model = opts['model'] as string | undefined;
59
- if (!model) {
60
- throw new GuardrailError(
61
- 'openai-compatible adapter requires options.model to be set in guardrail.config.yaml',
62
- { code: 'invalid_config', provider: 'openai-compatible' },
63
- );
64
- }
65
-
66
- const systemPrompt = buildSystemPrompt(input, SYSTEM_PROMPT_TEMPLATE);
67
- const client = new OpenAI({ apiKey, ...(baseURL ? { baseURL } : {}) });
68
-
69
- let response: OpenAI.Chat.ChatCompletion;
70
- try {
71
- response = await client.chat.completions.create({
72
- model,
73
- max_tokens: MAX_OUTPUT_TOKENS,
74
- messages: [
75
- { role: 'system', content: systemPrompt },
76
- { role: 'user', content: `Please review the following:\n\n---\n\n${input.content}` },
77
- ],
78
- });
79
- } catch (err) {
80
- const message = err instanceof Error ? err.message : String(err);
81
- const code = classifyError(message);
82
- throw new GuardrailError(`openai-compatible review call failed: ${message}`, {
83
- code,
84
- provider: 'openai-compatible',
85
- retryable: code === 'rate_limit',
86
- });
87
- }
88
-
89
- const rawOutput = response.choices[0]?.message.content ?? '';
90
- return {
91
- findings: parseReviewOutput(rawOutput, 'openai-compatible'),
92
- rawOutput,
93
- usage: response.usage
94
- ? { input: response.usage.prompt_tokens, output: response.usage.completion_tokens }
95
- : undefined,
96
- };
97
- },
98
- };
99
-
100
- export default openaiCompatibleAdapter;
@@ -1,74 +0,0 @@
1
- import type { Finding } from '../../core/findings/types.ts';
2
-
3
- // Matches "path/to/file.ts:42", "`path/to/file.ts`", or bare filenames with common extensions
4
- const FILE_REF = /(?:`([^`]+\.[a-z]{1,6})`|(\b[\w./\-]+\.[a-z]{1,6})(?::(\d+))?)/;
5
-
6
- function extractFileRef(text: string): { file: string; line?: number } {
7
- const m = text.match(FILE_REF);
8
- if (!m) return { file: '<unspecified>' };
9
- const raw = (m[1] ?? m[2])!;
10
- // Skip version strings (v1.2.3) and bare dotfile extensions with no path separator
11
- if (/^v?\d/.test(raw) || (!raw.includes('/') && raw.startsWith('.') && raw.split('.').length === 2)) {
12
- return { file: '<unspecified>' };
13
- }
14
- const line = m[3] ? parseInt(m[3], 10) : undefined;
15
- return { file: raw, line };
16
- }
17
-
18
- // Accepts any of: `### [CRITICAL] title`, `### CRITICAL title`, `### **CRITICAL** title`,
19
- // `### **[CRITICAL]** title`. Severity capture works across variants.
20
- const FINDING_REGEX =
21
- /### (?:\*\*)?\[?(CRITICAL|WARNING|NOTE)\]?(?:\*\*)?\s*(.+?)(?=\n### (?:\*\*)?\[?(?:CRITICAL|WARNING|NOTE)\]?|## Review Summary|$)/gs;
22
-
23
- // "Substantive" output = enough non-whitespace chars to be a real LLM response, not
24
- // an empty/placeholder string. Anything past this with zero parsed findings is likely
25
- // format drift we should warn about.
26
- const NONTRIVIAL_OUTPUT_THRESHOLD = 40;
27
-
28
- /**
29
- * Parses the structured CRITICAL|WARNING|NOTE markdown format produced by all review
30
- * engine adapters. Extracts file:line references from the finding body when present.
31
- *
32
- * Tolerates common LLM format drift (missing brackets, bold wrappers) because the prompt
33
- * alone doesn't guarantee literal `### [CRITICAL]` — models routinely emit
34
- * `### CRITICAL` or `### **CRITICAL**`. A strict parser silently returns zero findings
35
- * on otherwise-valid output, which is exactly the silent-failure mode this file exists to
36
- * prevent.
37
- */
38
- export function parseReviewOutput(output: string, idPrefix: string): Finding[] {
39
- const findings: Finding[] = [];
40
- for (const match of output.matchAll(FINDING_REGEX)) {
41
- const severity = match[1]!.toLowerCase() as Finding['severity'];
42
- const body = match[2]!.trim();
43
- const titleEnd = body.indexOf('\n');
44
- const title = (titleEnd > 0 ? body.slice(0, titleEnd) : body).trim();
45
- const suggestion = body.match(/\*\*Suggestion:\*\*\s*(.+)/s)?.[1]?.trim();
46
- const { file, line } = extractFileRef(body);
47
- findings.push({
48
- id: `${idPrefix}-${findings.length}`,
49
- source: 'review-engine',
50
- severity,
51
- category: 'review-engine',
52
- file,
53
- line,
54
- message: title,
55
- suggestion,
56
- protectedPath: false,
57
- createdAt: new Date().toISOString(),
58
- });
59
- }
60
-
61
- if (findings.length === 0) {
62
- const nonWhitespace = output.replace(/\s/g, '').length;
63
- if (nonWhitespace >= NONTRIVIAL_OUTPUT_THRESHOLD) {
64
- const preview = output.slice(0, 200).replace(/\s+/g, ' ').trim();
65
- // eslint-disable-next-line no-console
66
- console.warn(
67
- `[parseReviewOutput] LLM returned ${output.length} chars but no findings parsed. ` +
68
- `Expected '### [CRITICAL|WARNING|NOTE] …'. Preview: ${preview}${output.length > 200 ? '…' : ''}`,
69
- );
70
- }
71
- }
72
-
73
- return findings;
74
- }
@@ -1,19 +0,0 @@
1
- import type { ReviewInput } from './types.ts';
2
-
3
- const DEFAULT_STACK = 'A web application — stack details unspecified.';
4
-
5
- export function buildSystemPrompt(input: ReviewInput, template: string): string {
6
- const stack = input.context?.stack ?? DEFAULT_STACK;
7
- const gitCtx = input.context?.gitSummary ? `\n\nChange context: ${input.context.gitSummary}` : '';
8
- const designBlock = input.context?.designSchema ? `\n\n${input.context.designSchema}` : '';
9
- return template
10
- .replace('{STACK}', stack)
11
- .replace('{GIT_CONTEXT}', gitCtx)
12
- .replace('{DESIGN_SCHEMA}', designBlock);
13
- }
14
-
15
- export function classifyError(message: string): 'auth' | 'rate_limit' | 'transient_network' {
16
- if (/unauthorized|401|invalid.api.key|authentication|api.key|403/i.test(message)) return 'auth';
17
- if (/rate.limit|429|overloaded|quota/i.test(message)) return 'rate_limit';
18
- return 'transient_network';
19
- }
@@ -1,19 +0,0 @@
1
- import type { AdapterBase } from '../base.ts';
2
- import type { Finding } from '../../core/findings/types.ts';
3
-
4
- export interface ReviewInput {
5
- content: string;
6
- kind: 'spec' | 'pr-diff' | 'file-batch';
7
- context?: { spec?: string; plan?: string; stack?: string; cwd?: string; gitSummary?: string; designSchema?: string };
8
- }
9
-
10
- export interface ReviewOutput {
11
- findings: Finding[];
12
- rawOutput: string;
13
- usage?: { input: number; output: number; costUSD?: number };
14
- }
15
-
16
- export interface ReviewEngine extends AdapterBase {
17
- review(input: ReviewInput): Promise<ReviewOutput>;
18
- estimateTokens(content: string): number;
19
- }
@@ -1,39 +0,0 @@
1
- import { runSafe } from '../../core/shell.ts';
2
-
3
- export type CommitState = 'pending' | 'success' | 'failure' | 'error';
4
-
5
- export interface CommitStatusOptions {
6
- sha: string;
7
- state: CommitState;
8
- description?: string;
9
- context?: string;
10
- targetUrl?: string;
11
- cwd?: string;
12
- }
13
-
14
- function getCurrentSha(cwd: string): string | null {
15
- return runSafe('git', ['rev-parse', 'HEAD'], { cwd })?.trim() ?? null;
16
- }
17
-
18
- export function resolveCommitSha(cwd: string, envSha?: string): string | null {
19
- return envSha
20
- ?? process.env.GITHUB_SHA
21
- ?? getCurrentSha(cwd);
22
- }
23
-
24
- export function postCommitStatus(opts: CommitStatusOptions): boolean {
25
- const payload = JSON.stringify({
26
- state: opts.state,
27
- description: (opts.description ?? '').slice(0, 140),
28
- context: opts.context ?? 'guardrail',
29
- ...(opts.targetUrl ? { target_url: opts.targetUrl } : {}),
30
- });
31
-
32
- const result = runSafe('gh', [
33
- 'api', `repos/{owner}/{repo}/statuses/${opts.sha}`,
34
- '--method', 'POST',
35
- '--input', '-',
36
- ], { cwd: opts.cwd, input: payload });
37
-
38
- return result !== null;
39
- }
@@ -1,77 +0,0 @@
1
- import { runSafe, runThrowing } from '../../core/shell.ts';
2
- import { GuardrailError } from '../../core/errors.ts';
3
- import type { Capabilities } from '../base.ts';
4
- import type { VcsHost, GenericComment, PrMetadata, CreatePrOptions, CreatePrResult } from './types.ts';
5
-
6
- export const githubAdapter: VcsHost = {
7
- name: 'github',
8
- apiVersion: '1.0.0',
9
-
10
- getCapabilities(): Capabilities {
11
- return { structuredOutput: true, streaming: false, maxContextTokens: 0, inlineComments: true };
12
- },
13
-
14
- async getPrDiff(pr: number | string): Promise<string> {
15
- const result = runSafe('gh', ['pr', 'diff', String(pr)]);
16
- if (result === null) throw new GuardrailError(`Failed to get diff for PR ${pr}`, { code: 'transient_network' });
17
- return result;
18
- },
19
-
20
- async getPrMetadata(pr: number | string): Promise<PrMetadata> {
21
- const raw = runThrowing('gh', ['pr', 'view', String(pr), '--json', 'title,body,files,headRefOid,baseRefName,headRefName'], { errorCode: 'transient_network' });
22
- const data = JSON.parse(raw) as { title: string; body: string; files: { path: string }[]; headRefOid: string; baseRefName: string; headRefName: string };
23
- return {
24
- title: data.title,
25
- body: data.body ?? '',
26
- files: (data.files ?? []).map((f: { path: string }) => f.path),
27
- headSha: data.headRefOid,
28
- baseRef: data.baseRefName,
29
- headRef: data.headRefName,
30
- };
31
- },
32
-
33
- async postComment(pr: number | string, body: string): Promise<void> {
34
- runThrowing('gh', ['pr', 'comment', String(pr), '--body', body], { errorCode: 'transient_network' });
35
- },
36
-
37
- async getReviewComments(pr: number | string): Promise<GenericComment[]> {
38
- const raw = runSafe('gh', ['api', `repos/{owner}/{repo}/pulls/${pr}/comments`, '--paginate']);
39
- if (!raw) return [];
40
- try {
41
- const parsed = JSON.parse(raw) as Array<{ id: number; user: { login: string }; body: string; path: string; line?: number; html_url: string }>;
42
- return parsed.map(c => ({ id: c.id, author: c.user.login, body: c.body, path: c.path, line: c.line, url: c.html_url }));
43
- } catch { return []; }
44
- },
45
-
46
- async replyToComment(pr: number | string, commentId: string | number, body: string): Promise<void> {
47
- runThrowing('gh', ['api', `repos/{owner}/{repo}/pulls/${pr}/comments/${commentId}/replies`, '--method', 'POST', '--field', `body=${body}`], { errorCode: 'transient_network' });
48
- },
49
-
50
- async createPr(opts: CreatePrOptions): Promise<CreatePrResult> {
51
- const existing = runSafe('gh', ['pr', 'list', '--head', opts.head, '--json', 'number,url', '--limit', '1']);
52
- if (existing) {
53
- try {
54
- const parsed = JSON.parse(existing) as Array<{ number: number; url: string }>;
55
- if (parsed.length > 0 && parsed[0]) {
56
- return { number: parsed[0].number, url: parsed[0].url, alreadyExisted: true };
57
- }
58
- } catch { /* fall through to create */ }
59
- }
60
-
61
- const args = ['pr', 'create', '--title', opts.title, '--body', opts.body, '--base', opts.base, '--head', opts.head];
62
- if (opts.draft) args.push('--draft');
63
- const raw = runThrowing('gh', args, { errorCode: 'transient_network' });
64
- const url = raw.trim();
65
- const match = url.match(/\/pull\/(\d+)$/);
66
- const number = match ? parseInt(match[1]!, 10) : 0;
67
- return { number, url, alreadyExisted: false };
68
- },
69
-
70
- async push(branch: string, opts?: { setUpstream?: boolean }): Promise<void> {
71
- const args = ['push', 'origin', branch];
72
- if (opts?.setUpstream) args.splice(1, 0, '-u');
73
- runThrowing('git', args, { errorCode: 'transient_network' });
74
- },
75
- };
76
-
77
- export default githubAdapter;
@@ -1,44 +0,0 @@
1
- import type { AdapterBase } from '../base.ts';
2
-
3
- export interface GenericComment {
4
- id: string | number;
5
- author: string;
6
- body: string;
7
- path?: string;
8
- line?: number;
9
- url?: string;
10
- }
11
-
12
- export interface PrMetadata {
13
- title: string;
14
- body: string;
15
- files: string[];
16
- headSha: string;
17
- baseRef: string;
18
- headRef: string;
19
- }
20
-
21
- export interface CreatePrOptions {
22
- title: string;
23
- body: string;
24
- base: string;
25
- head: string;
26
- draft?: boolean;
27
- idempotencyKey?: string;
28
- }
29
-
30
- export interface CreatePrResult {
31
- number: number;
32
- url: string;
33
- alreadyExisted: boolean;
34
- }
35
-
36
- export interface VcsHost extends AdapterBase {
37
- getPrDiff(pr: number | string): Promise<string>;
38
- getPrMetadata(pr: number | string): Promise<PrMetadata>;
39
- postComment(pr: number | string, body: string, idempotencyKey?: string): Promise<void>;
40
- getReviewComments(pr: number | string): Promise<GenericComment[]>;
41
- replyToComment(pr: number | string, commentId: string | number, body: string, idempotencyKey?: string): Promise<void>;
42
- createPr(opts: CreatePrOptions): Promise<CreatePrResult>;
43
- push(branch: string, opts?: { setUpstream?: boolean }): Promise<void>;
44
- }
@@ -1,85 +0,0 @@
1
- /**
2
- * Resolves the canonical package root directory from the perspective of any
3
- * source file in the package. Robust under both source (`src/cli/foo.ts` →
4
- * `<root>`) and compiled (`dist/src/cli/foo.js` → `<root>`) layouts.
5
- *
6
- * Background: every site that hardcoded `path.resolve(dirname(fileURLToPath(...)), '..', '..')`
7
- * worked when called from the source layout but resolved one level shallow under
8
- * the compiled output (landing in `dist/` instead of the package root). The
9
- * real-world soak against `npx @delegance/claude-autopilot@alpha init` surfaced
10
- * this — `init` couldn't find `presets/<name>/guardrail.config.yaml` because it
11
- * was looking at `dist/presets/...` (which doesn't exist; presets ship at the
12
- * package root).
13
- *
14
- * This helper walks up from the caller's `import.meta.url` looking for the
15
- * `@delegance/claude-autopilot` package.json. Both source and compiled callers
16
- * land in the same place.
17
- */
18
-
19
- import * as fs from 'node:fs';
20
- import * as path from 'node:path';
21
- import { fileURLToPath } from 'node:url';
22
-
23
- const PACKAGE_NAME = '@delegance/claude-autopilot';
24
-
25
- /**
26
- * Walks up from the caller's location looking for the package.json that
27
- * declares `name === '@delegance/claude-autopilot'`. Returns the directory
28
- * containing that package.json, or null if not found within `maxDepth` levels.
29
- */
30
- export function findPackageRoot(callerImportMetaUrl: string, maxDepth = 10): string | null {
31
- let dir = path.dirname(fileURLToPath(callerImportMetaUrl));
32
- for (let i = 0; i < maxDepth; i++) {
33
- const candidate = path.join(dir, 'package.json');
34
- if (fs.existsSync(candidate)) {
35
- try {
36
- const pkg = JSON.parse(fs.readFileSync(candidate, 'utf8')) as { name?: string };
37
- if (pkg.name === PACKAGE_NAME) return dir;
38
- } catch {
39
- /* keep walking */
40
- }
41
- }
42
- const parent = path.dirname(dir);
43
- if (parent === dir) break;
44
- dir = parent;
45
- }
46
- return null;
47
- }
48
-
49
- /**
50
- * Throws a clear error if the package root can't be located. Use at sites that
51
- * absolutely require the root (e.g. preset config lookup).
52
- */
53
- export function requirePackageRoot(callerImportMetaUrl: string): string {
54
- const root = findPackageRoot(callerImportMetaUrl);
55
- if (!root) {
56
- throw new Error(
57
- `[claude-autopilot] Could not locate package root from ${fileURLToPath(callerImportMetaUrl)}. ` +
58
- `Reinstall: npm install -g @delegance/claude-autopilot@alpha`,
59
- );
60
- }
61
- return root;
62
- }
63
-
64
- /**
65
- * Resolve a sibling-module path for dynamic `import()` that works under both
66
- * source (caller is `.ts`) and compiled (caller is `.js`) layouts.
67
- *
68
- * Background: `import('./rules/foo.ts')` and `import('./review-engine/auto.ts')`
69
- * are dynamic-import string literals — TS's `rewriteRelativeImportExtensions`
70
- * only rewrites STATIC imports, leaving these string refs as `.ts` post-compile.
71
- * Under compiled output, the actual module is `.js`, so the import fails with
72
- * `Failed to import adapter from .../auto.ts`.
73
- *
74
- * This helper detects whether the caller is itself compiled (`.js`/`.mjs`) and
75
- * rewrites the ref's extension to match.
76
- *
77
- * @param ref Sibling-module ref ending in `.ts` (e.g. `./review-engine/auto.ts`).
78
- * @param callerImportMetaUrl Caller's `import.meta.url`.
79
- * @returns Absolute filesystem path suitable for `import()`.
80
- */
81
- export function resolveSiblingModule(ref: string, callerImportMetaUrl: string): string {
82
- const callerIsCompiled = callerImportMetaUrl.endsWith('.js') || callerImportMetaUrl.endsWith('.mjs');
83
- const adjustedRef = callerIsCompiled ? ref.replace(/\.ts$/, '.js') : ref;
84
- return fileURLToPath(new URL(adjustedRef, callerImportMetaUrl));
85
- }
@@ -1,30 +0,0 @@
1
- // src/cli/autoregress-bridge.ts
2
- import * as path from 'node:path';
3
- import { spawnSync } from 'node:child_process';
4
- import { fileURLToPath } from 'node:url';
5
-
6
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
7
- const SCRIPT = path.resolve(__dirname, '../../scripts/autoregress.ts');
8
-
9
- const VALID_MODES = ['run', 'update', 'generate', 'diff'];
10
-
11
- export function buildAutoregressArgs(args: string[]): string[] {
12
- const mode = args[0] && VALID_MODES.includes(args[0]) ? args[0] : 'run';
13
- const rest = args[0] && VALID_MODES.includes(args[0]) ? args.slice(1) : args;
14
- return [mode, ...rest];
15
- }
16
-
17
- export function runAutoregress(args: string[]): number {
18
- const resolvedArgs = buildAutoregressArgs(args);
19
- const result = spawnSync(
20
- process.execPath,
21
- ['--import', 'tsx', SCRIPT, ...resolvedArgs],
22
- { stdio: 'inherit', cwd: process.cwd() },
23
- );
24
- if (result.error) {
25
- console.error(`[autoregress] failed to launch: ${result.error.message}`);
26
- console.error(` script: ${SCRIPT}`);
27
- return 1;
28
- }
29
- return result.status ?? 1;
30
- }
@@ -1,125 +0,0 @@
1
- import * as path from 'node:path';
2
- import * as fs from 'node:fs';
3
- import {
4
- loadBaseline, saveBaseline, clearBaseline, diffAgainstBaseline,
5
- baselineFilePath,
6
- } from '../core/persist/baseline.ts';
7
- import { loadCachedFindings } from '../core/persist/findings-cache.ts';
8
-
9
- const C = {
10
- reset: '\x1b[0m', bold: '\x1b[1m', dim: '\x1b[2m',
11
- green: '\x1b[32m', yellow: '\x1b[33m', red: '\x1b[31m', cyan: '\x1b[36m',
12
- };
13
- const fmt = (c: keyof typeof C, t: string) => `${C[c]}${t}${C.reset}`;
14
-
15
- export interface BaselineCommandOptions {
16
- cwd?: string;
17
- note?: string;
18
- baselinePath?: string;
19
- }
20
-
21
- export async function runBaseline(sub: string, options: BaselineCommandOptions = {}): Promise<number> {
22
- const cwd = options.cwd ?? process.cwd();
23
- const bPath = baselineFilePath(cwd, options.baselinePath);
24
- const relPath = path.relative(cwd, bPath);
25
-
26
- switch (sub) {
27
- case 'create': {
28
- if (fs.existsSync(bPath)) {
29
- console.log(fmt('yellow', `[baseline] ${relPath} already exists — use \`guardrail baseline update\` to refresh, or \`guardrail baseline clear\` to reset`));
30
- return 1;
31
- }
32
- return createOrUpdate(cwd, bPath, relPath, options.note, 'Created');
33
- }
34
-
35
- case 'update': {
36
- return createOrUpdate(cwd, bPath, relPath, options.note, 'Updated');
37
- }
38
-
39
- case 'show': {
40
- const baseline = loadBaseline(cwd, options.baselinePath);
41
- if (!baseline) {
42
- console.log(fmt('yellow', `[baseline] No baseline found at ${relPath}`));
43
- console.log(fmt('dim', ' Run: guardrail baseline create'));
44
- return 0;
45
- }
46
- console.log(`\n${fmt('bold', '[baseline]')} ${fmt('dim', relPath)}`);
47
- console.log(fmt('dim', ` Created: ${baseline.createdAt} Updated: ${baseline.updatedAt}`));
48
- if (baseline.note) console.log(fmt('dim', ` Note: ${baseline.note}`));
49
- console.log(` ${baseline.entries.length} pinned finding${baseline.entries.length !== 1 ? 's' : ''}\n`);
50
- for (const e of baseline.entries) {
51
- const sev = e.severity === 'critical' ? fmt('red', 'CRIT') : e.severity === 'warning' ? fmt('yellow', 'WARN') : fmt('dim', 'NOTE');
52
- console.log(` [${sev}] ${fmt('dim', `${e.file}${e.line ? `:${e.line}` : ''}`)} ${e.message.slice(0, 70)}`);
53
- }
54
- console.log('');
55
- return 0;
56
- }
57
-
58
- case 'diff': {
59
- const baseline = loadBaseline(cwd, options.baselinePath);
60
- if (!baseline) {
61
- console.log(fmt('yellow', `[baseline] No baseline found — run: guardrail baseline create`));
62
- return 1;
63
- }
64
- const current = loadCachedFindings(cwd);
65
- if (current.length === 0) {
66
- console.log(fmt('yellow', '[baseline] No cached findings — run `guardrail run` or `guardrail scan` first'));
67
- return 1;
68
- }
69
- const diff = diffAgainstBaseline(current, baseline);
70
- console.log(`\n${fmt('bold', '[guardrail baseline diff]')} vs ${fmt('dim', relPath)}\n`);
71
-
72
- if (diff.added.length > 0) {
73
- console.log(fmt('red', ` ${diff.added.length} new finding${diff.added.length !== 1 ? 's' : ''} (not in baseline):`));
74
- for (const f of diff.added) {
75
- const sev = f.severity === 'critical' ? fmt('red', 'CRIT') : f.severity === 'warning' ? fmt('yellow', 'WARN') : fmt('dim', 'NOTE');
76
- console.log(` [${sev}] ${fmt('dim', `${f.file}${f.line ? `:${f.line}` : ''}`)} ${f.message.slice(0, 70)}`);
77
- }
78
- console.log('');
79
- }
80
- if (diff.resolved.length > 0) {
81
- console.log(fmt('green', ` ${diff.resolved.length} resolved (in baseline but not in current):`));
82
- for (const e of diff.resolved) {
83
- console.log(` ${fmt('dim', `${e.file}${e.line ? `:${e.line}` : ''}`)} ${e.message.slice(0, 70)}`);
84
- }
85
- console.log('');
86
- }
87
- if (diff.added.length === 0 && diff.resolved.length === 0) {
88
- console.log(fmt('green', ` ✓ No changes vs baseline (${diff.unchanged.length} pinned findings unchanged)\n`));
89
- } else {
90
- console.log(fmt('dim', ` ${diff.unchanged.length} unchanged · run \`guardrail baseline update\` to pin new state\n`));
91
- }
92
- return diff.added.some(f => f.severity === 'critical') ? 1 : 0;
93
- }
94
-
95
- case 'clear': {
96
- if (!fs.existsSync(bPath)) {
97
- console.log(fmt('dim', `[baseline] No baseline at ${relPath} — nothing to clear`));
98
- return 0;
99
- }
100
- clearBaseline(cwd, options.baselinePath);
101
- console.log(fmt('green', `[baseline] Cleared ${relPath}`));
102
- return 0;
103
- }
104
-
105
- default:
106
- console.error(fmt('red', `[baseline] Unknown subcommand: "${sub}"`));
107
- console.error(fmt('dim', ' Usage: guardrail baseline <create|update|show|diff|clear> [--note "..."]'));
108
- return 1;
109
- }
110
- }
111
-
112
- function createOrUpdate(cwd: string, bPath: string, relPath: string, note: string | undefined, verb: string): number {
113
- const findings = loadCachedFindings(cwd);
114
- if (findings.length === 0) {
115
- console.log(fmt('yellow', '[baseline] No cached findings to snapshot — run `guardrail run` or `guardrail scan` first'));
116
- return 1;
117
- }
118
- const baseline = saveBaseline(cwd, findings, { note, overridePath: bPath === path.join(cwd, '.guardrail-baseline.json') ? undefined : bPath });
119
- console.log(`\n${fmt('green', `[baseline] ${verb}`)} ${fmt('dim', relPath)}`);
120
- console.log(` ${baseline.entries.length} finding${baseline.entries.length !== 1 ? 's' : ''} pinned as accepted baseline`);
121
- if (note) console.log(` Note: ${note}`);
122
- console.log(fmt('dim', `\n Commit this file to share the baseline with your team:`));
123
- console.log(fmt('cyan', ` git add ${relPath} && git commit -m "chore: update guardrail baseline"\n`));
124
- return 0;
125
- }
package/src/cli/ci.ts DELETED
@@ -1,45 +0,0 @@
1
- import { runCommand } from './run.ts';
2
-
3
- export interface CiCommandOptions {
4
- cwd?: string;
5
- configPath?: string;
6
- base?: string;
7
- postComments?: boolean;
8
- sarifOutput?: string;
9
- diff?: boolean;
10
- inlineComments?: boolean;
11
- newOnly?: boolean;
12
- failOn?: 'critical' | 'warning' | 'note' | 'none';
13
- }
14
-
15
- /**
16
- * `guardrail ci` — opinionated single-command CI entrypoint.
17
- *
18
- * Defaults:
19
- * base GITHUB_BASE_REF → HEAD~1
20
- * output guardrail.sarif
21
- * post-comments true
22
- * fail-on critical (or policy.failOn from config)
23
- * new-only false (or policy.newOnly from config)
24
- */
25
- export async function runCi(options: CiCommandOptions = {}): Promise<number> {
26
- const base = options.base
27
- ?? process.env.GITHUB_BASE_REF
28
- ?? process.env.CI_MERGE_REQUEST_TARGET_BRANCH_NAME // GitLab
29
- ?? 'HEAD~1';
30
-
31
- const sarifOutput = options.sarifOutput ?? 'guardrail.sarif';
32
-
33
- return runCommand({
34
- cwd: options.cwd,
35
- configPath: options.configPath,
36
- base,
37
- postComments: options.postComments ?? true,
38
- format: 'sarif',
39
- outputPath: sarifOutput,
40
- diff: options.diff,
41
- inlineComments: options.inlineComments ?? true,
42
- newOnly: options.newOnly,
43
- failOn: options.failOn,
44
- });
45
- }