@coldtea/abide 0.0.1

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 (370) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/abide-hook.d.ts +2 -0
  4. package/dist/abide-hook.d.ts.map +1 -0
  5. package/dist/abide-hook.js +23 -0
  6. package/dist/abide-hook.js.map +1 -0
  7. package/dist/bin.d.ts +3 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +64 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/commands/audit.d.ts +3 -0
  12. package/dist/commands/audit.d.ts.map +1 -0
  13. package/dist/commands/audit.js +79 -0
  14. package/dist/commands/audit.js.map +1 -0
  15. package/dist/commands/bench.d.ts +3 -0
  16. package/dist/commands/bench.d.ts.map +1 -0
  17. package/dist/commands/bench.js +206 -0
  18. package/dist/commands/bench.js.map +1 -0
  19. package/dist/commands/calibrate.d.ts +3 -0
  20. package/dist/commands/calibrate.d.ts.map +1 -0
  21. package/dist/commands/calibrate.js +159 -0
  22. package/dist/commands/calibrate.js.map +1 -0
  23. package/dist/commands/check.d.ts +3 -0
  24. package/dist/commands/check.d.ts.map +1 -0
  25. package/dist/commands/check.js +106 -0
  26. package/dist/commands/check.js.map +1 -0
  27. package/dist/commands/compile.d.ts +3 -0
  28. package/dist/commands/compile.d.ts.map +1 -0
  29. package/dist/commands/compile.js +116 -0
  30. package/dist/commands/compile.js.map +1 -0
  31. package/dist/commands/init.d.ts +4 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +93 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/login.d.ts +3 -0
  36. package/dist/commands/login.d.ts.map +1 -0
  37. package/dist/commands/login.js +58 -0
  38. package/dist/commands/login.js.map +1 -0
  39. package/dist/commands/replay.d.ts +4 -0
  40. package/dist/commands/replay.d.ts.map +1 -0
  41. package/dist/commands/replay.js +118 -0
  42. package/dist/commands/replay.js.map +1 -0
  43. package/dist/commands/report.d.ts +5 -0
  44. package/dist/commands/report.d.ts.map +1 -0
  45. package/dist/commands/report.js +78 -0
  46. package/dist/commands/report.js.map +1 -0
  47. package/dist/commands/rubric.d.ts +3 -0
  48. package/dist/commands/rubric.d.ts.map +1 -0
  49. package/dist/commands/rubric.js +40 -0
  50. package/dist/commands/rubric.js.map +1 -0
  51. package/dist/commands/uninstall.d.ts +2 -0
  52. package/dist/commands/uninstall.d.ts.map +1 -0
  53. package/dist/commands/uninstall.js +31 -0
  54. package/dist/commands/uninstall.js.map +1 -0
  55. package/dist/hooks/postToolUse.d.ts +3 -0
  56. package/dist/hooks/postToolUse.d.ts.map +1 -0
  57. package/dist/hooks/postToolUse.js +145 -0
  58. package/dist/hooks/postToolUse.js.map +1 -0
  59. package/dist/hooks/sessionStart.d.ts +11 -0
  60. package/dist/hooks/sessionStart.d.ts.map +1 -0
  61. package/dist/hooks/sessionStart.js +83 -0
  62. package/dist/hooks/sessionStart.js.map +1 -0
  63. package/dist/hooks/stop.d.ts +26 -0
  64. package/dist/hooks/stop.d.ts.map +1 -0
  65. package/dist/hooks/stop.js +227 -0
  66. package/dist/hooks/stop.js.map +1 -0
  67. package/dist/hooks/turnStart.d.ts +8 -0
  68. package/dist/hooks/turnStart.d.ts.map +1 -0
  69. package/dist/hooks/turnStart.js +40 -0
  70. package/dist/hooks/turnStart.js.map +1 -0
  71. package/dist/lib/applyPatch.d.ts +22 -0
  72. package/dist/lib/applyPatch.d.ts.map +1 -0
  73. package/dist/lib/applyPatch.js +63 -0
  74. package/dist/lib/applyPatch.js.map +1 -0
  75. package/dist/lib/audit.d.ts +40 -0
  76. package/dist/lib/audit.d.ts.map +1 -0
  77. package/dist/lib/audit.js +215 -0
  78. package/dist/lib/audit.js.map +1 -0
  79. package/dist/lib/band.d.ts +20 -0
  80. package/dist/lib/band.d.ts.map +1 -0
  81. package/dist/lib/band.js +40 -0
  82. package/dist/lib/band.js.map +1 -0
  83. package/dist/lib/calibration.d.ts +13 -0
  84. package/dist/lib/calibration.d.ts.map +1 -0
  85. package/dist/lib/calibration.js +25 -0
  86. package/dist/lib/calibration.js.map +1 -0
  87. package/dist/lib/checkRunner.d.ts +34 -0
  88. package/dist/lib/checkRunner.d.ts.map +1 -0
  89. package/dist/lib/checkRunner.js +76 -0
  90. package/dist/lib/checkRunner.js.map +1 -0
  91. package/dist/lib/claude.d.ts +4 -0
  92. package/dist/lib/claude.d.ts.map +1 -0
  93. package/dist/lib/claude.js +28 -0
  94. package/dist/lib/claude.js.map +1 -0
  95. package/dist/lib/compilePrompt.d.ts +22 -0
  96. package/dist/lib/compilePrompt.d.ts.map +1 -0
  97. package/dist/lib/compilePrompt.js +33 -0
  98. package/dist/lib/compilePrompt.js.map +1 -0
  99. package/dist/lib/constants.d.ts +33 -0
  100. package/dist/lib/constants.d.ts.map +1 -0
  101. package/dist/lib/constants.js +33 -0
  102. package/dist/lib/constants.js.map +1 -0
  103. package/dist/lib/coverage.d.ts +7 -0
  104. package/dist/lib/coverage.d.ts.map +1 -0
  105. package/dist/lib/coverage.js +17 -0
  106. package/dist/lib/coverage.js.map +1 -0
  107. package/dist/lib/credentials.d.ts +27 -0
  108. package/dist/lib/credentials.d.ts.map +1 -0
  109. package/dist/lib/credentials.js +89 -0
  110. package/dist/lib/credentials.js.map +1 -0
  111. package/dist/lib/diff.d.ts +30 -0
  112. package/dist/lib/diff.d.ts.map +1 -0
  113. package/dist/lib/diff.js +139 -0
  114. package/dist/lib/diff.js.map +1 -0
  115. package/dist/lib/events.d.ts +5 -0
  116. package/dist/lib/events.d.ts.map +1 -0
  117. package/dist/lib/events.js +38 -0
  118. package/dist/lib/events.js.map +1 -0
  119. package/dist/lib/git.d.ts +37 -0
  120. package/dist/lib/git.d.ts.map +1 -0
  121. package/dist/lib/git.js +163 -0
  122. package/dist/lib/git.js.map +1 -0
  123. package/dist/lib/hookRunner.d.ts +10 -0
  124. package/dist/lib/hookRunner.d.ts.map +1 -0
  125. package/dist/lib/hookRunner.js +52 -0
  126. package/dist/lib/hookRunner.js.map +1 -0
  127. package/dist/lib/hosts.d.ts +20 -0
  128. package/dist/lib/hosts.d.ts.map +1 -0
  129. package/dist/lib/hosts.js +101 -0
  130. package/dist/lib/hosts.js.map +1 -0
  131. package/dist/lib/jev.d.ts +24 -0
  132. package/dist/lib/jev.d.ts.map +1 -0
  133. package/dist/lib/jev.js +169 -0
  134. package/dist/lib/jev.js.map +1 -0
  135. package/dist/lib/lintConfig.d.ts +3 -0
  136. package/dist/lib/lintConfig.d.ts.map +1 -0
  137. package/dist/lib/lintConfig.js +55 -0
  138. package/dist/lib/lintConfig.js.map +1 -0
  139. package/dist/lib/loadRules.d.ts +12 -0
  140. package/dist/lib/loadRules.d.ts.map +1 -0
  141. package/dist/lib/loadRules.js +31 -0
  142. package/dist/lib/loadRules.js.map +1 -0
  143. package/dist/lib/opencodePlugin.d.ts +10 -0
  144. package/dist/lib/opencodePlugin.d.ts.map +1 -0
  145. package/dist/lib/opencodePlugin.js +36 -0
  146. package/dist/lib/opencodePlugin.js.map +1 -0
  147. package/dist/lib/output.d.ts +6 -0
  148. package/dist/lib/output.d.ts.map +1 -0
  149. package/dist/lib/output.js +35 -0
  150. package/dist/lib/output.js.map +1 -0
  151. package/dist/lib/packageRoot.d.ts +12 -0
  152. package/dist/lib/packageRoot.d.ts.map +1 -0
  153. package/dist/lib/packageRoot.js +50 -0
  154. package/dist/lib/packageRoot.js.map +1 -0
  155. package/dist/lib/paths.d.ts +24 -0
  156. package/dist/lib/paths.d.ts.map +1 -0
  157. package/dist/lib/paths.js +75 -0
  158. package/dist/lib/paths.js.map +1 -0
  159. package/dist/lib/reason.d.ts +11 -0
  160. package/dist/lib/reason.d.ts.map +1 -0
  161. package/dist/lib/reason.js +31 -0
  162. package/dist/lib/reason.js.map +1 -0
  163. package/dist/lib/regularFile.d.ts +26 -0
  164. package/dist/lib/regularFile.d.ts.map +1 -0
  165. package/dist/lib/regularFile.js +77 -0
  166. package/dist/lib/regularFile.js.map +1 -0
  167. package/dist/lib/replay.d.ts +74 -0
  168. package/dist/lib/replay.d.ts.map +1 -0
  169. package/dist/lib/replay.js +250 -0
  170. package/dist/lib/replay.js.map +1 -0
  171. package/dist/lib/replayCodex.d.ts +6 -0
  172. package/dist/lib/replayCodex.d.ts.map +1 -0
  173. package/dist/lib/replayCodex.js +132 -0
  174. package/dist/lib/replayCodex.js.map +1 -0
  175. package/dist/lib/replayOpencode.d.ts +15 -0
  176. package/dist/lib/replayOpencode.d.ts.map +1 -0
  177. package/dist/lib/replayOpencode.js +154 -0
  178. package/dist/lib/replayOpencode.js.map +1 -0
  179. package/dist/lib/rubricFile.d.ts +31 -0
  180. package/dist/lib/rubricFile.d.ts.map +1 -0
  181. package/dist/lib/rubricFile.js +75 -0
  182. package/dist/lib/rubricFile.js.map +1 -0
  183. package/dist/lib/scope.d.ts +4 -0
  184. package/dist/lib/scope.d.ts.map +1 -0
  185. package/dist/lib/scope.js +14 -0
  186. package/dist/lib/scope.js.map +1 -0
  187. package/dist/lib/session.d.ts +48 -0
  188. package/dist/lib/session.d.ts.map +1 -0
  189. package/dist/lib/session.js +182 -0
  190. package/dist/lib/session.js.map +1 -0
  191. package/dist/lib/settings.d.ts +26 -0
  192. package/dist/lib/settings.d.ts.map +1 -0
  193. package/dist/lib/settings.js +104 -0
  194. package/dist/lib/settings.js.map +1 -0
  195. package/dist/lib/sources.d.ts +28 -0
  196. package/dist/lib/sources.d.ts.map +1 -0
  197. package/dist/lib/sources.js +137 -0
  198. package/dist/lib/sources.js.map +1 -0
  199. package/dist/lib/stdin.d.ts +3 -0
  200. package/dist/lib/stdin.d.ts.map +1 -0
  201. package/dist/lib/stdin.js +24 -0
  202. package/dist/lib/stdin.js.map +1 -0
  203. package/dist/lib/transcript.d.ts +3 -0
  204. package/dist/lib/transcript.d.ts.map +1 -0
  205. package/dist/lib/transcript.js +57 -0
  206. package/dist/lib/transcript.js.map +1 -0
  207. package/dist/lib/ui.d.ts +8 -0
  208. package/dist/lib/ui.d.ts.map +1 -0
  209. package/dist/lib/ui.js +34 -0
  210. package/dist/lib/ui.js.map +1 -0
  211. package/dist/ui/components/Buckets.d.ts +6 -0
  212. package/dist/ui/components/Buckets.d.ts.map +1 -0
  213. package/dist/ui/components/Buckets.js +11 -0
  214. package/dist/ui/components/Buckets.js.map +1 -0
  215. package/dist/ui/components/Callout.d.ts +11 -0
  216. package/dist/ui/components/Callout.d.ts.map +1 -0
  217. package/dist/ui/components/Callout.js +10 -0
  218. package/dist/ui/components/Callout.js.map +1 -0
  219. package/dist/ui/components/Checklist.d.ts +10 -0
  220. package/dist/ui/components/Checklist.d.ts.map +1 -0
  221. package/dist/ui/components/Checklist.js +8 -0
  222. package/dist/ui/components/Checklist.js.map +1 -0
  223. package/dist/ui/components/Columns.d.ts +28 -0
  224. package/dist/ui/components/Columns.d.ts.map +1 -0
  225. package/dist/ui/components/Columns.js +20 -0
  226. package/dist/ui/components/Columns.js.map +1 -0
  227. package/dist/ui/components/Header.d.ts +9 -0
  228. package/dist/ui/components/Header.d.ts.map +1 -0
  229. package/dist/ui/components/Header.js +7 -0
  230. package/dist/ui/components/Header.js.map +1 -0
  231. package/dist/ui/components/Live.d.ts +16 -0
  232. package/dist/ui/components/Live.d.ts.map +1 -0
  233. package/dist/ui/components/Live.js +40 -0
  234. package/dist/ui/components/Live.js.map +1 -0
  235. package/dist/ui/components/RuleTable.d.ts +15 -0
  236. package/dist/ui/components/RuleTable.d.ts.map +1 -0
  237. package/dist/ui/components/RuleTable.js +81 -0
  238. package/dist/ui/components/RuleTable.js.map +1 -0
  239. package/dist/ui/components/Section.d.ts +10 -0
  240. package/dist/ui/components/Section.d.ts.map +1 -0
  241. package/dist/ui/components/Section.js +8 -0
  242. package/dist/ui/components/Section.js.map +1 -0
  243. package/dist/ui/components/Verdicts.d.ts +9 -0
  244. package/dist/ui/components/Verdicts.d.ts.map +1 -0
  245. package/dist/ui/components/Verdicts.js +12 -0
  246. package/dist/ui/components/Verdicts.js.map +1 -0
  247. package/dist/ui/render.d.ts +20 -0
  248. package/dist/ui/render.d.ts.map +1 -0
  249. package/dist/ui/render.js +32 -0
  250. package/dist/ui/render.js.map +1 -0
  251. package/dist/ui/theme.d.ts +37 -0
  252. package/dist/ui/theme.d.ts.map +1 -0
  253. package/dist/ui/theme.js +63 -0
  254. package/dist/ui/theme.js.map +1 -0
  255. package/dist/ui/views/AuditView.d.ts +18 -0
  256. package/dist/ui/views/AuditView.d.ts.map +1 -0
  257. package/dist/ui/views/AuditView.js +48 -0
  258. package/dist/ui/views/AuditView.js.map +1 -0
  259. package/dist/ui/views/BenchView.d.ts +33 -0
  260. package/dist/ui/views/BenchView.d.ts.map +1 -0
  261. package/dist/ui/views/BenchView.js +19 -0
  262. package/dist/ui/views/BenchView.js.map +1 -0
  263. package/dist/ui/views/CalibrateView.d.ts +26 -0
  264. package/dist/ui/views/CalibrateView.d.ts.map +1 -0
  265. package/dist/ui/views/CalibrateView.js +42 -0
  266. package/dist/ui/views/CalibrateView.js.map +1 -0
  267. package/dist/ui/views/CheckView.d.ts +19 -0
  268. package/dist/ui/views/CheckView.d.ts.map +1 -0
  269. package/dist/ui/views/CheckView.js +15 -0
  270. package/dist/ui/views/CheckView.js.map +1 -0
  271. package/dist/ui/views/ErrorView.d.ts +4 -0
  272. package/dist/ui/views/ErrorView.d.ts.map +1 -0
  273. package/dist/ui/views/ErrorView.js +26 -0
  274. package/dist/ui/views/ErrorView.js.map +1 -0
  275. package/dist/ui/views/HelpView.d.ts +2 -0
  276. package/dist/ui/views/HelpView.d.ts.map +1 -0
  277. package/dist/ui/views/HelpView.js +25 -0
  278. package/dist/ui/views/HelpView.js.map +1 -0
  279. package/dist/ui/views/InitView.d.ts +27 -0
  280. package/dist/ui/views/InitView.d.ts.map +1 -0
  281. package/dist/ui/views/InitView.js +24 -0
  282. package/dist/ui/views/InitView.js.map +1 -0
  283. package/dist/ui/views/ReplayView.d.ts +16 -0
  284. package/dist/ui/views/ReplayView.d.ts.map +1 -0
  285. package/dist/ui/views/ReplayView.js +44 -0
  286. package/dist/ui/views/ReplayView.js.map +1 -0
  287. package/dist/ui/views/ReportView.d.ts +14 -0
  288. package/dist/ui/views/ReportView.d.ts.map +1 -0
  289. package/dist/ui/views/ReportView.js +86 -0
  290. package/dist/ui/views/ReportView.js.map +1 -0
  291. package/dist/ui/views/RubricView.d.ts +18 -0
  292. package/dist/ui/views/RubricView.d.ts.map +1 -0
  293. package/dist/ui/views/RubricView.js +18 -0
  294. package/dist/ui/views/RubricView.js.map +1 -0
  295. package/opencode/abide.mjs +246 -0
  296. package/package.json +50 -0
  297. package/skills/abide-compile/SKILL.md +173 -0
  298. package/src/abide-hook.ts +23 -0
  299. package/src/bin.ts +64 -0
  300. package/src/commands/audit.ts +97 -0
  301. package/src/commands/bench.ts +226 -0
  302. package/src/commands/calibrate.ts +165 -0
  303. package/src/commands/check.ts +114 -0
  304. package/src/commands/compile.ts +127 -0
  305. package/src/commands/init.ts +109 -0
  306. package/src/commands/login.ts +61 -0
  307. package/src/commands/replay.ts +148 -0
  308. package/src/commands/report.ts +83 -0
  309. package/src/commands/rubric.ts +45 -0
  310. package/src/commands/uninstall.ts +33 -0
  311. package/src/hooks/postToolUse.ts +171 -0
  312. package/src/hooks/sessionStart.ts +100 -0
  313. package/src/hooks/stop.ts +275 -0
  314. package/src/hooks/turnStart.ts +36 -0
  315. package/src/lib/applyPatch.ts +75 -0
  316. package/src/lib/audit.ts +265 -0
  317. package/src/lib/band.ts +49 -0
  318. package/src/lib/calibration.ts +35 -0
  319. package/src/lib/checkRunner.ts +124 -0
  320. package/src/lib/claude.ts +35 -0
  321. package/src/lib/compilePrompt.ts +67 -0
  322. package/src/lib/constants.ts +39 -0
  323. package/src/lib/coverage.ts +21 -0
  324. package/src/lib/credentials.ts +104 -0
  325. package/src/lib/diff.ts +209 -0
  326. package/src/lib/events.ts +34 -0
  327. package/src/lib/git.ts +206 -0
  328. package/src/lib/hookRunner.ts +55 -0
  329. package/src/lib/hosts.ts +112 -0
  330. package/src/lib/jev.ts +223 -0
  331. package/src/lib/lintConfig.ts +53 -0
  332. package/src/lib/loadRules.ts +39 -0
  333. package/src/lib/opencodePlugin.ts +38 -0
  334. package/src/lib/output.ts +44 -0
  335. package/src/lib/packageRoot.ts +48 -0
  336. package/src/lib/paths.ts +96 -0
  337. package/src/lib/reason.ts +46 -0
  338. package/src/lib/regularFile.ts +96 -0
  339. package/src/lib/replay.ts +314 -0
  340. package/src/lib/replayCodex.ts +130 -0
  341. package/src/lib/replayOpencode.ts +186 -0
  342. package/src/lib/rubricFile.ts +99 -0
  343. package/src/lib/scope.ts +18 -0
  344. package/src/lib/session.ts +223 -0
  345. package/src/lib/settings.ts +112 -0
  346. package/src/lib/sources.ts +154 -0
  347. package/src/lib/stdin.ts +23 -0
  348. package/src/lib/transcript.ts +49 -0
  349. package/src/lib/ui.ts +38 -0
  350. package/src/ui/components/Buckets.tsx +30 -0
  351. package/src/ui/components/Callout.tsx +26 -0
  352. package/src/ui/components/Checklist.tsx +29 -0
  353. package/src/ui/components/Columns.tsx +62 -0
  354. package/src/ui/components/Header.tsx +35 -0
  355. package/src/ui/components/Live.tsx +73 -0
  356. package/src/ui/components/RuleTable.tsx +94 -0
  357. package/src/ui/components/Section.tsx +24 -0
  358. package/src/ui/components/Verdicts.tsx +40 -0
  359. package/src/ui/render.tsx +51 -0
  360. package/src/ui/theme.ts +65 -0
  361. package/src/ui/views/AuditView.tsx +140 -0
  362. package/src/ui/views/BenchView.tsx +87 -0
  363. package/src/ui/views/CalibrateView.tsx +108 -0
  364. package/src/ui/views/CheckView.tsx +56 -0
  365. package/src/ui/views/ErrorView.tsx +32 -0
  366. package/src/ui/views/HelpView.tsx +51 -0
  367. package/src/ui/views/InitView.tsx +103 -0
  368. package/src/ui/views/ReplayView.tsx +100 -0
  369. package/src/ui/views/ReportView.tsx +225 -0
  370. package/src/ui/views/RubricView.tsx +82 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Coldtea AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # @coldtea/abide
2
+
3
+ The `abide` command and the hook script. Abide makes your coding agent abide by the rules in your own AGENTS.md, on every edit, from outside the agent's context window.
4
+
5
+ ```
6
+ npx @coldtea/abide login # paste your TypeSafe key once
7
+ npx @coldtea/abide init # hooks into every agent on this machine
8
+ ```
9
+
10
+ Everything else, including which agents are supported, what a check costs and how the rubric works, is in the [main README](https://github.com/coldteadotai/abide#readme).
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=abide-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abide-hook.d.ts","sourceRoot":"","sources":["../src/abide-hook.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { handlePostToolUse } from "./hooks/postToolUse.js";
2
+ import { handleSessionStart } from "./hooks/sessionStart.js";
3
+ import { handleStop } from "./hooks/stop.js";
4
+ import { handleTurnStart } from "./hooks/turnStart.js";
5
+ import { runHook } from "./lib/hookRunner.js";
6
+ const name = process.argv[2];
7
+ switch (name) {
8
+ case "session-start":
9
+ await runHook("session-start", handleSessionStart, 8_000);
10
+ break;
11
+ case "turn-start":
12
+ await runHook("turn-start", handleTurnStart, 8_000);
13
+ break;
14
+ case "post-tool-use":
15
+ await runHook("post-tool-use", handlePostToolUse, 18_000);
16
+ break;
17
+ case "stop":
18
+ await runHook("stop", handleStop, 28_000);
19
+ break;
20
+ default:
21
+ process.exit(0);
22
+ }
23
+ //# sourceMappingURL=abide-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abide-hook.js","sourceRoot":"","sources":["../src/abide-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAQ,IAAI,EAAE,CAAC;IACb,KAAK,eAAe;QAClB,MAAM,OAAO,CAAC,eAAe,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM;IACR,KAAK,YAAY;QACf,MAAM,OAAO,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM;IACR,KAAK,eAAe;QAClB,MAAM,OAAO,CAAC,eAAe,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM;IACR,KAAK,MAAM;QACT,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM;IACR;QACE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import { runAudit } from "./commands/audit.js";
3
+ import { runBench } from "./commands/bench.js";
4
+ import { runCalibrate } from "./commands/calibrate.js";
5
+ import { runCheckCommand } from "./commands/check.js";
6
+ import { runCompile } from "./commands/compile.js";
7
+ import { runInit } from "./commands/init.js";
8
+ import { runLogin } from "./commands/login.js";
9
+ import { runReplay } from "./commands/replay.js";
10
+ import { runReport } from "./commands/report.js";
11
+ import { runRubric } from "./commands/rubric.js";
12
+ import { runUninstall } from "./commands/uninstall.js";
13
+ import { showError, showStatic } from "./ui/render.js";
14
+ import { HelpView } from "./ui/views/HelpView.js";
15
+ process.stdout.on("error", (error) => {
16
+ if (error.code === "EPIPE")
17
+ process.exit(0);
18
+ });
19
+ const main = async () => {
20
+ const [command, ...rest] = process.argv.slice(2);
21
+ switch (command) {
22
+ case "login":
23
+ return runLogin(rest);
24
+ case "init":
25
+ return runInit(rest);
26
+ case "compile":
27
+ return runCompile(rest, false);
28
+ case "tune":
29
+ return runCompile(rest, true);
30
+ case "rubric":
31
+ return runRubric(rest);
32
+ case "calibrate":
33
+ return runCalibrate(rest);
34
+ case "check":
35
+ return runCheckCommand(rest);
36
+ case "audit":
37
+ return runAudit(rest);
38
+ case "report":
39
+ return runReport(rest);
40
+ case "replay":
41
+ return runReplay(rest);
42
+ case "bench":
43
+ return runBench(rest);
44
+ case "uninstall":
45
+ return runUninstall(rest);
46
+ case undefined:
47
+ case "help":
48
+ case "--help":
49
+ case "-h":
50
+ await showStatic(HelpView());
51
+ return 0;
52
+ default:
53
+ await showError(new Error(`Unknown command "${command}". Try: abide help`));
54
+ return 1;
55
+ }
56
+ };
57
+ try {
58
+ process.exitCode = await main();
59
+ }
60
+ catch (error) {
61
+ await showError(error);
62
+ process.exitCode = 1;
63
+ }
64
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;IAC1D,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,KAAK,IAAqB,EAAE;IACvC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,WAAW;YACd,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7B,OAAO,CAAC,CAAC;QACX;YACE,MAAM,SAAS,CAAC,IAAI,KAAK,CAAC,oBAAoB,OAAO,oBAAoB,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,CAAC;IACH,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC;AAClC,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Judges every file in scope as if it had just been written, and reports what breaks which rule. */
2
+ export declare const runAudit: (argv: string[]) => Promise<number>;
3
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAYA,qGAAqG;AACrG,eAAO,MAAM,QAAQ,SAAgB,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAmF7D,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { parseArgs } from "node:util";
2
+ import { AbideError } from "@coldtea/abide-schema";
3
+ import { auditFiles, auditableFiles, listRepoFiles, tallyByRule } from "../lib/audit.js";
4
+ import { isGitRepo } from "../lib/git.js";
5
+ import { hasApiKey, NO_KEY_HINT } from "../lib/credentials.js";
6
+ import { loadRules } from "../lib/loadRules.js";
7
+ import { findRepoRoot } from "../lib/paths.js";
8
+ import { say, usd } from "../lib/ui.js";
9
+ import { Header } from "../ui/components/Header.js";
10
+ import { showLive } from "../ui/render.js";
11
+ import { AuditView } from "../ui/views/AuditView.js";
12
+ /** Judges every file in scope as if it had just been written, and reports what breaks which rule. */
13
+ export const runAudit = async (argv) => {
14
+ const { values, positionals } = parseArgs({
15
+ args: argv,
16
+ allowPositionals: true,
17
+ options: {
18
+ concurrency: { type: "string", default: "3" },
19
+ "max-files": { type: "string" },
20
+ all: { type: "boolean", default: false },
21
+ json: { type: "boolean", default: false },
22
+ },
23
+ });
24
+ const root = findRepoRoot(process.cwd());
25
+ if (!hasApiKey(root))
26
+ throw new AbideError("NO_API_KEY", NO_KEY_HINT);
27
+ if (!isGitRepo(root))
28
+ throw new AbideError("GIT_UNAVAILABLE", "audit walks the files git knows about, and this is not a git repository");
29
+ const loaded = loadRules(root);
30
+ if (loaded.rules.length === 0)
31
+ throw new AbideError("RUBRIC_MISSING", "no rubric here or in ~/.abide; run abide compile first");
32
+ const candidates = listRepoFiles(root, positionals);
33
+ const { files: inScope, skipped } = auditableFiles(root, candidates, loaded.rules);
34
+ const cap = values["max-files"] === undefined ? Infinity : Number(values["max-files"]);
35
+ const files = inScope.slice(0, cap);
36
+ const concurrency = Math.max(1, Number(values.concurrency));
37
+ const run = async (progress) => {
38
+ const started = performance.now();
39
+ const results = await auditFiles(root, files, loaded.rules, loaded.thresholds, concurrency, (done, total, spend) => {
40
+ progress(`${done} of ${total} files ${"·"} about ${usd(spend)}`);
41
+ });
42
+ return {
43
+ root,
44
+ files: files.length,
45
+ skipped,
46
+ results,
47
+ tallies: tallyByRule(results),
48
+ spendUsd: results.reduce((s, r) => s + r.costUsd, 0),
49
+ elapsedMs: performance.now() - started,
50
+ all: values.all,
51
+ };
52
+ };
53
+ if (values.json) {
54
+ const data = await run(() => { });
55
+ say(JSON.stringify({
56
+ root,
57
+ files: data.files,
58
+ skipped: data.skipped,
59
+ spendUsd: data.spendUsd,
60
+ elapsedMs: data.elapsedMs,
61
+ byRule: data.tallies,
62
+ byFile: data.results,
63
+ }));
64
+ return data.tallies.some((t) => t.broken.length > 0) ? 1 : 0;
65
+ }
66
+ return showLive({
67
+ header: Header({
68
+ command: "audit",
69
+ where: root,
70
+ note: files.length === 0
71
+ ? "no files in scope of any edit-phase rule"
72
+ : `${files.length} files in scope, ${concurrency} at a time`,
73
+ }),
74
+ run,
75
+ done: (data) => AuditView({ data }),
76
+ code: (data) => (data.tallies.some((t) => t.broken.length > 0) ? 1 : 0),
77
+ });
78
+ };
79
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Measures the check path on this machine: process start, Jev latency, tokens, spend, and real sessions. */
2
+ export declare const runBench: (argv: string[]) => Promise<number>;
3
+ //# sourceMappingURL=bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../src/commands/bench.ts"],"names":[],"mappings":"AAuEA,6GAA6G;AAC7G,eAAO,MAAM,QAAQ,SAAgB,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAyJ7D,CAAC"}
@@ -0,0 +1,206 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import path from "node:path";
3
+ import { parseArgs } from "node:util";
4
+ import { AbideError } from "@coldtea/abide-schema";
5
+ import { runCheck } from "../lib/checkRunner.js";
6
+ import { EDIT_CHECK_TIMEOUT_MS, TURN_CHECK_TIMEOUT_MS } from "../lib/constants.js";
7
+ import { readEvents } from "../lib/events.js";
8
+ import { hasApiKey, NO_KEY_HINT } from "../lib/credentials.js";
9
+ import { loadRules } from "../lib/loadRules.js";
10
+ import { hookScriptPath } from "../lib/packageRoot.js";
11
+ import { findRepoRoot } from "../lib/paths.js";
12
+ import { clearTurn, turnDir } from "../lib/session.js";
13
+ import { median, percentile, say } from "../lib/ui.js";
14
+ import { Header } from "../ui/components/Header.js";
15
+ import { showLive } from "../ui/render.js";
16
+ import { BenchView } from "../ui/views/BenchView.js";
17
+ const smallDiff = `@@ -10,6 +10,12 @@ export const loadUser = async (id: string) => {
18
+ const row = await db.users.find(id);
19
+ + if (!row) {
20
+ + return null;
21
+ + }
22
+ + const name = row.name.trim();
23
+ + const email = row.email.toLowerCase();
24
+ + const createdAt = new Date(row.created_at);
25
+ + const plan = row.plan ?? "free";
26
+ + const seats = Number(row.seats ?? 1);
27
+ + return { id, name, email, createdAt, plan, seats };
28
+ - return row;
29
+ };`;
30
+ const largeDiff = [
31
+ "@@ -1,4 +1,54 @@",
32
+ '+import { z } from "zod";',
33
+ "+",
34
+ "+const inputSchema = z.object({ id: z.string(), limit: z.number().int().min(1).max(100) });",
35
+ "+",
36
+ ...Array.from({ length: 46 }, (_, i) => `+ const step${i} = compute(step${Math.max(0, i - 1)}, ${i});`),
37
+ "+export const handler = async (req: Request) => {",
38
+ "+ const input = inputSchema.parse(await req.json());",
39
+ "+ return Response.json({ ok: true, input });",
40
+ "+};",
41
+ ].join("\n");
42
+ const SAMPLE = "src/abide-bench-sample.ts";
43
+ const spawnHook = (script, name, payload) => {
44
+ const started = performance.now();
45
+ spawnSync("node", [script, name], {
46
+ input: JSON.stringify(payload),
47
+ encoding: "utf8",
48
+ timeout: 30_000,
49
+ });
50
+ return performance.now() - started;
51
+ };
52
+ const times = async (n, fn) => {
53
+ const out = [];
54
+ for (let i = 0; i < n; i += 1)
55
+ out.push(await fn());
56
+ return out;
57
+ };
58
+ const row = (what, values) => ({
59
+ what,
60
+ median: median(values) ?? 0,
61
+ p90: percentile(values, 90) ?? 0,
62
+ });
63
+ /** Measures the check path on this machine: process start, Jev latency, tokens, spend, and real sessions. */
64
+ export const runBench = async (argv) => {
65
+ const { values } = parseArgs({
66
+ args: argv,
67
+ options: { runs: { type: "string", default: "5" }, json: { type: "boolean", default: false } },
68
+ });
69
+ const runs = Math.max(1, Number(values.runs));
70
+ const root = findRepoRoot(process.cwd());
71
+ if (!hasApiKey(root))
72
+ throw new AbideError("NO_API_KEY", NO_KEY_HINT);
73
+ const loaded = loadRules(root);
74
+ if (loaded.rules.length === 0)
75
+ throw new AbideError("RUBRIC_MISSING", "no rubric to bench with; run abide compile first");
76
+ const script = hookScriptPath();
77
+ const sample = path.join(root, SAMPLE);
78
+ const activeModelRules = loaded.rules.filter((r) => r.status === "active" && r.check.type === "model").length;
79
+ const run = async (progress) => {
80
+ progress("hook process start");
81
+ const startup = await times(runs, async () => spawnHook(script, "session-start", { hook_event_name: "nope" }));
82
+ const edit = async (diff) => {
83
+ const out = await runCheck({
84
+ phase: "edit",
85
+ fileDiffs: [{ file: SAMPLE, text: diff }],
86
+ task: "Add a user loader",
87
+ rules: loaded.rules,
88
+ thresholds: loaded.thresholds,
89
+ timeoutMs: EDIT_CHECK_TIMEOUT_MS,
90
+ retries: 2,
91
+ });
92
+ return {
93
+ latency: out.modelLatencyMs,
94
+ tokens: out.usage.inputTokens ?? 0,
95
+ cost: out.usage.costUsd ?? 0,
96
+ rules: out.modelRules.length,
97
+ };
98
+ };
99
+ progress("warming the connection");
100
+ const warm = await edit(smallDiff);
101
+ let i = 0;
102
+ const small = await times(runs, async () => {
103
+ progress(`edit check, small diff ${(i += 1)}/${runs}`);
104
+ return (await edit(smallDiff)).latency;
105
+ });
106
+ i = 0;
107
+ const large = await times(runs, async () => {
108
+ progress(`edit check, large diff ${(i += 1)}/${runs}`);
109
+ return (await edit(largeDiff)).latency;
110
+ });
111
+ const largeOnce = await edit(largeDiff);
112
+ const turnCheck = () => runCheck({
113
+ phase: "turn",
114
+ fileDiffs: [{ file: SAMPLE, text: largeDiff }],
115
+ task: "Add a user loader",
116
+ rules: loaded.rules,
117
+ thresholds: loaded.thresholds,
118
+ timeoutMs: TURN_CHECK_TIMEOUT_MS,
119
+ retries: 2,
120
+ });
121
+ const turnOut = await turnCheck();
122
+ i = 0;
123
+ const turn = turnOut.modelRules.length === 0
124
+ ? []
125
+ : await times(runs, async () => {
126
+ progress(`turn check ${(i += 1)}/${runs}`);
127
+ return (await turnCheck()).modelLatencyMs;
128
+ });
129
+ i = 0;
130
+ const fullHook = await times(runs, async () => {
131
+ progress(`whole PostToolUse hook ${(i += 1)}/${runs}`);
132
+ return spawnHook(script, "post-tool-use", {
133
+ session_id: "abide-bench",
134
+ cwd: root,
135
+ hook_event_name: "PostToolUse",
136
+ tool_name: "Write",
137
+ tool_input: {
138
+ file_path: sample,
139
+ content: largeDiff
140
+ .split("\n")
141
+ .slice(1)
142
+ .map((l) => l.slice(1))
143
+ .join("\n"),
144
+ },
145
+ tool_response: {
146
+ type: "create",
147
+ filePath: sample,
148
+ originalFile: null,
149
+ structuredPatch: [],
150
+ },
151
+ });
152
+ });
153
+ clearTurn(turnDir("abide-bench", undefined));
154
+ const sessions = new Map();
155
+ for (const e of readEvents(root)) {
156
+ if (e.kind !== "check" || e.sessionId === undefined || e.sessionId === "abide-bench")
157
+ continue;
158
+ const s = sessions.get(e.sessionId) ?? { edits: 0, latency: 0, cost: 0 };
159
+ s.edits += 1;
160
+ s.latency += e.latencyMs;
161
+ s.cost += e.usage?.costUsd ?? 0;
162
+ sessions.set(e.sessionId, s);
163
+ }
164
+ const all = [...sessions.values()];
165
+ return {
166
+ root,
167
+ runs,
168
+ activeModelRules,
169
+ rows: [
170
+ row("hook process start, no network", startup),
171
+ row(`edit check, small diff, ${warm.rules} rules`, small),
172
+ row(`edit check, large diff, ${largeOnce.rules} rules`, large),
173
+ ...(turn.length > 0 ? [row(`turn check, ${turnOut.modelRules.length} rules`, turn)] : []),
174
+ row("whole PostToolUse hook, large diff", fullHook),
175
+ ],
176
+ tokens: { small: warm.tokens, large: largeOnce.tokens },
177
+ cost: { small: warm.cost, large: largeOnce.cost },
178
+ perTurn: {
179
+ latencyMs: 15 * (median(fullHook) ?? 0) + (median(turn) ?? 0),
180
+ costUsd: 15 * largeOnce.cost + (turnOut.usage.costUsd ?? 0),
181
+ },
182
+ sessions: all.length === 0
183
+ ? null
184
+ : {
185
+ count: all.length,
186
+ medianChecks: median(all.map((s) => s.edits)) ?? 0,
187
+ medianLatencyMs: median(all.map((s) => s.latency)) ?? 0,
188
+ medianCostUsd: median(all.map((s) => s.cost)) ?? 0,
189
+ },
190
+ };
191
+ };
192
+ if (values.json) {
193
+ say(JSON.stringify(await run(() => { })));
194
+ return 0;
195
+ }
196
+ return showLive({
197
+ header: Header({
198
+ command: "bench",
199
+ where: root,
200
+ note: `${activeModelRules} active model rules, ${runs} runs each`,
201
+ }),
202
+ run,
203
+ done: (data) => BenchView({ data }),
204
+ });
205
+ };
206
+ //# sourceMappingURL=bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bench.js","sourceRoot":"","sources":["../../src/commands/bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Runs every model rule against the repo's own recent hunks and marks the ones that never decide. */
2
+ export declare const runCalibrate: (argv: string[]) => Promise<number>;
3
+ //# sourceMappingURL=calibrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibrate.d.ts","sourceRoot":"","sources":["../../src/commands/calibrate.ts"],"names":[],"mappings":"AAkCA,sGAAsG;AACtG,eAAO,MAAM,YAAY,SAAgB,MAAM,EAAE,KAAG,OAAO,CAAC,MAAM,CAiIjE,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { parseArgs } from "node:util";
2
+ import { AbideError, DEFAULT_THRESHOLDS } from "@coldtea/abide-schema";
3
+ import { summarizeCalibration } from "../lib/calibration.js";
4
+ import { runCheck } from "../lib/checkRunner.js";
5
+ import { EDIT_CHECK_TIMEOUT_MS, TURN_CHECK_TIMEOUT_MS } from "../lib/constants.js";
6
+ import { recentHistory } from "../lib/git.js";
7
+ import { hasApiKey, NO_KEY_HINT } from "../lib/credentials.js";
8
+ import { findRepoRoot, globalRubricPath, homeDir, rubricPath } from "../lib/paths.js";
9
+ import { readRubric, writeRubric } from "../lib/rubricFile.js";
10
+ import { say } from "../lib/ui.js";
11
+ import { Header } from "../ui/components/Header.js";
12
+ import { showLive, showStatic } from "../ui/render.js";
13
+ import { CalibrateView } from "../ui/views/CalibrateView.js";
14
+ import { Callout } from "../ui/components/Callout.js";
15
+ const statusAfter = (rule, verdict) => {
16
+ if (rule.status === "disabled")
17
+ return "disabled";
18
+ switch (verdict) {
19
+ case "weak":
20
+ return "weak";
21
+ case "noisy":
22
+ return "noisy";
23
+ case "decisive":
24
+ return "active";
25
+ case "skipped":
26
+ return rule.status;
27
+ default:
28
+ return rule.status;
29
+ }
30
+ };
31
+ /** Runs every model rule against the repo's own recent hunks and marks the ones that never decide. */
32
+ export const runCalibrate = async (argv) => {
33
+ const { values } = parseArgs({
34
+ args: argv,
35
+ options: {
36
+ global: { type: "boolean", default: false },
37
+ hunks: { type: "string", default: "20" },
38
+ commits: { type: "string", default: "8" },
39
+ json: { type: "boolean", default: false },
40
+ },
41
+ });
42
+ const repoRoot = findRepoRoot(process.cwd());
43
+ if (!hasApiKey(repoRoot))
44
+ throw new AbideError("NO_API_KEY", NO_KEY_HINT);
45
+ const file = values.global ? globalRubricPath() : rubricPath(repoRoot);
46
+ const read = readRubric(file);
47
+ if (read.kind === "missing")
48
+ throw new AbideError("RUBRIC_MISSING", `${file} does not exist yet; compile first`);
49
+ if (read.kind === "invalid")
50
+ throw new AbideError("RUBRIC_INVALID", `${file}: ${read.issues[0] ?? "invalid"}`);
51
+ const rubric = read.rubric;
52
+ const thresholds = rubric.thresholds ?? DEFAULT_THRESHOLDS;
53
+ const where = values.global ? homeDir() : repoRoot;
54
+ const modelRules = rubric.rules.filter((r) => r.check.type === "model" && r.status !== "disabled");
55
+ if (modelRules.length === 0) {
56
+ await showStatic(Callout({ tone: "ok", title: "No model-checked rules to calibrate" }));
57
+ return 0;
58
+ }
59
+ const rulesToRun = modelRules.map((r) => ({ ...r, status: "active" }));
60
+ const history = recentHistory(repoRoot, Number(values.hunks), Number(values.commits));
61
+ if (history.hunks.length === 0 && history.commits.length === 0) {
62
+ await showStatic(Callout({
63
+ tone: "warn",
64
+ title: "No usable history in this repository yet, so calibration is skipped",
65
+ children: null,
66
+ }));
67
+ return 0;
68
+ }
69
+ const run = async (progress) => {
70
+ const samples = new Map();
71
+ let spendUsd = 0;
72
+ let calls = 0;
73
+ const record = (verdicts) => {
74
+ for (const v of verdicts)
75
+ samples.set(v.ruleId, [...(samples.get(v.ruleId) ?? []), v.probability]);
76
+ };
77
+ let n = 0;
78
+ for (const hunk of history.hunks) {
79
+ progress(`hunk ${(n += 1)} of ${history.hunks.length} ${hunk.file}`);
80
+ try {
81
+ const out = await runCheck({
82
+ phase: "edit",
83
+ fileDiffs: [{ file: hunk.file, text: hunk.text }],
84
+ task: hunk.subject,
85
+ rules: rulesToRun,
86
+ thresholds,
87
+ timeoutMs: EDIT_CHECK_TIMEOUT_MS,
88
+ retries: 2,
89
+ });
90
+ record(out.verdicts);
91
+ spendUsd += out.usage.costUsd ?? 0;
92
+ calls += 1;
93
+ }
94
+ catch {
95
+ // a hunk that could not be judged is one fewer sample, nothing more
96
+ }
97
+ }
98
+ n = 0;
99
+ for (const commit of history.commits) {
100
+ progress(`commit ${(n += 1)} of ${history.commits.length} ${commit.subject.slice(0, 60)}`);
101
+ try {
102
+ const out = await runCheck({
103
+ phase: "turn",
104
+ fileDiffs: commit.fileDiffs,
105
+ task: commit.subject,
106
+ rules: rulesToRun,
107
+ thresholds,
108
+ timeoutMs: TURN_CHECK_TIMEOUT_MS,
109
+ retries: 2,
110
+ });
111
+ record(out.verdicts);
112
+ spendUsd += out.usage.costUsd ?? 0;
113
+ calls += 1;
114
+ }
115
+ catch {
116
+ // as above
117
+ }
118
+ }
119
+ const at = new Date().toISOString();
120
+ const rows = [];
121
+ const rules = rubric.rules.map((rule) => {
122
+ if (rule.check.type !== "model" || rule.status === "disabled")
123
+ return rule;
124
+ const summary = summarizeCalibration(samples.get(rule.id) ?? [], thresholds);
125
+ rows.push({ id: rule.id, when: rule.when ?? "", ...summary, states: summary.hunks });
126
+ return {
127
+ ...rule,
128
+ status: statusAfter(rule, summary.verdict),
129
+ calibration: { at, ...summary },
130
+ };
131
+ });
132
+ writeRubric(file, { ...rubric, rules });
133
+ return {
134
+ root: where,
135
+ file,
136
+ hunks: history.hunks.length,
137
+ commits: history.commits.length,
138
+ calls,
139
+ spendUsd,
140
+ rows,
141
+ weak: rules.filter((r) => r.status === "weak").map((r) => r.id),
142
+ noisy: rules.filter((r) => r.status === "noisy").map((r) => r.id),
143
+ };
144
+ };
145
+ if (values.json) {
146
+ say(JSON.stringify(await run(() => { })));
147
+ return 0;
148
+ }
149
+ return showLive({
150
+ header: Header({
151
+ command: "calibrate",
152
+ where,
153
+ note: `${modelRules.length} rules against ${history.hunks.length} hunks and ${history.commits.length} commits from git history`,
154
+ }),
155
+ run,
156
+ done: (data) => CalibrateView({ data }),
157
+ });
158
+ };
159
+ //# sourceMappingURL=calibrate.js.map