@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
@@ -0,0 +1,101 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { AbideError, assertNever, HOSTS, hostSchema } from "@coldtea/abide-schema";
5
+ import { installOpencodePlugin, uninstallOpencodePlugin } from "./opencodePlugin.js";
6
+ import { hookScriptPath } from "./packageRoot.js";
7
+ import { homeDir } from "./paths.js";
8
+ import { hookSpecs, installHooks, uninstallHooks } from "./settings.js";
9
+ export const hostLabel = (host) => {
10
+ switch (host) {
11
+ case "claude":
12
+ return "Claude Code";
13
+ case "codex":
14
+ return "Codex";
15
+ case "opencode":
16
+ return "OpenCode";
17
+ default:
18
+ return assertNever(host);
19
+ }
20
+ };
21
+ export const parseHost = (name) => {
22
+ const parsed = hostSchema.safeParse(name.toLowerCase());
23
+ if (!parsed.success)
24
+ throw new AbideError("HOST_UNKNOWN", `"${name}" is not one of ${HOSTS.join(", ")}`);
25
+ return parsed.data;
26
+ };
27
+ const onPath = (bin) => spawnSync("which", [bin], { encoding: "utf8" }).status === 0;
28
+ export const hostPresent = (host) => {
29
+ switch (host) {
30
+ case "claude":
31
+ return existsSync(path.join(homeDir(), ".claude")) || onPath("claude");
32
+ case "codex":
33
+ return existsSync(path.join(homeDir(), ".codex")) || onPath("codex");
34
+ case "opencode":
35
+ return existsSync(path.join(homeDir(), ".config", "opencode")) || onPath("opencode");
36
+ default:
37
+ return assertNever(host);
38
+ }
39
+ };
40
+ export const detectHosts = () => HOSTS.filter(hostPresent);
41
+ /**
42
+ * Where abide's entries live for a host. Claude Code and Codex read the same
43
+ * hooks JSON shape from different files; OpenCode loads a plugin file from a
44
+ * directory it watches, so no config file is edited there.
45
+ */
46
+ export const installTarget = (host, root, project) => {
47
+ switch (host) {
48
+ case "claude":
49
+ return project
50
+ ? path.join(root, ".claude", "settings.json")
51
+ : path.join(homeDir(), ".claude", "settings.json");
52
+ case "codex":
53
+ return project
54
+ ? path.join(root, ".codex", "hooks.json")
55
+ : path.join(homeDir(), ".codex", "hooks.json");
56
+ case "opencode":
57
+ return project
58
+ ? path.join(root, ".opencode", "plugins", "abide.js")
59
+ : path.join(homeDir(), ".config", "opencode", "plugins", "abide.js");
60
+ default:
61
+ return assertNever(host);
62
+ }
63
+ };
64
+ export const installHost = (host, root, project) => {
65
+ const target = installTarget(host, root, project);
66
+ switch (host) {
67
+ case "claude":
68
+ installHooks(target, hookSpecs(hookScriptPath()));
69
+ return {
70
+ host,
71
+ target,
72
+ what: "hooks written: SessionStart, UserPromptSubmit, PostToolUse, Stop",
73
+ };
74
+ case "codex":
75
+ installHooks(target, hookSpecs(hookScriptPath()));
76
+ return {
77
+ host,
78
+ target,
79
+ what: "hooks written: SessionStart, UserPromptSubmit, PostToolUse, Stop",
80
+ afterwards: "Codex trusts new hooks once: start codex, type /hooks, accept the four abide entries.",
81
+ };
82
+ case "opencode":
83
+ installOpencodePlugin(target);
84
+ return { host, target, what: "plugin written; OpenCode loads it at the next start" };
85
+ default:
86
+ return assertNever(host);
87
+ }
88
+ };
89
+ export const uninstallHost = (host, root, project) => {
90
+ const target = installTarget(host, root, project);
91
+ switch (host) {
92
+ case "claude":
93
+ case "codex":
94
+ return uninstallHooks(target);
95
+ case "opencode":
96
+ return uninstallOpencodePlugin(target) ? 1 : 0;
97
+ default:
98
+ return assertNever(host);
99
+ }
100
+ };
101
+ //# sourceMappingURL=hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../src/lib/hosts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { AbideError, type Rule, type Thresholds, type Usage, type Verdict } from "@coldtea/abide-schema";
2
+ export type ModelRule = Rule & {
3
+ check: {
4
+ type: "model";
5
+ };
6
+ };
7
+ export declare const isModelRule: (rule: Rule) => rule is ModelRule;
8
+ export type CheckState = {
9
+ task?: string;
10
+ file?: string;
11
+ files?: string[];
12
+ diff: string;
13
+ };
14
+ export type ModelCheckResult = {
15
+ verdicts: Verdict[];
16
+ usage: Usage;
17
+ latencyMs: number;
18
+ };
19
+ export declare const describeGatewayFailure: (error: unknown) => AbideError;
20
+ /** One call carrying every rule. The state is only the rule set and the change. */
21
+ export declare const checkWithModel: (rules: readonly ModelRule[], state: CheckState, thresholds: Thresholds, timeoutMs: number,
22
+ /** Transient gateway failures to retry. Zero inside a hook, where the budget is the agent's time. */
23
+ retries?: number) => Promise<ModelCheckResult>;
24
+ //# sourceMappingURL=jev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev.d.ts","sourceRoot":"","sources":["../../src/lib/jev.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EAGV,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,KAAK,EACV,KAAK,OAAO,EACb,MAAM,uBAAuB,CAAC;AAU/B,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5D,eAAO,MAAM,WAAW,SAAU,IAAI,KAAG,IAAI,IAAI,SAAwC,CAAC;AAiB1F,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AA6FF,eAAO,MAAM,sBAAsB,UAAW,OAAO,KAAG,UAGvD,CAAC;AAuBF,mFAAmF;AACnF,eAAO,MAAM,cAAc,UAClB,SAAS,SAAS,EAAE,SACpB,UAAU,cACL,UAAU,aACX,MAAM;AACjB,qGAAqG;qBAEpG,OAAO,CAAC,gBAAgB,CA8C1B,CAAC"}
@@ -0,0 +1,169 @@
1
+ import { RetryError } from "ai";
2
+ import { AbideError, assertNever, } from "@coldtea/abide-schema";
3
+ import { bandFor, violationProbability } from "./band.js";
4
+ import { GATEWAY_KEY_ENV, GATEWAY_MODEL_ID, JEV_USD_PER_INPUT_TOKEN, TYPESAFE_MODEL_ID, } from "./constants.js";
5
+ import { credentials, NO_KEY_HINT } from "./credentials.js";
6
+ export const isModelRule = (rule) => rule.check.type === "model";
7
+ const toSdkQuestion = (q) => {
8
+ switch (q.type) {
9
+ case "boolean":
10
+ return q.criteria
11
+ ? { type: "boolean", instructions: q.instructions, criteria: q.criteria }
12
+ : { type: "boolean", instructions: q.instructions };
13
+ case "choice":
14
+ return { type: "choice", instructions: q.instructions, criteria: q.criteria };
15
+ case "score":
16
+ return { type: "score", instructions: q.instructions, criteria: q.criteria };
17
+ default:
18
+ return assertNever(q);
19
+ }
20
+ };
21
+ const toAnswer = (value) => {
22
+ if (typeof value !== "object" || value === null || !("type" in value))
23
+ return undefined;
24
+ const record = { ...value };
25
+ const probabilities = typeof record.probabilities === "object" && record.probabilities !== null
26
+ ? Object.fromEntries(Object.entries(record.probabilities).flatMap(([k, v]) => typeof v === "number" ? [[k, v]] : []))
27
+ : undefined;
28
+ switch (record.type) {
29
+ case "boolean":
30
+ return typeof record.probability === "number"
31
+ ? { type: "boolean", probability: record.probability }
32
+ : undefined;
33
+ case "choice":
34
+ return typeof record.choice === "string"
35
+ ? { type: "choice", choice: record.choice, probabilities }
36
+ : undefined;
37
+ case "score":
38
+ return typeof record.score === "number"
39
+ ? { type: "score", score: record.score, probabilities }
40
+ : undefined;
41
+ default:
42
+ return undefined;
43
+ }
44
+ };
45
+ const isAbort = (error) => error instanceof Error &&
46
+ (error.name === "TimeoutError" ||
47
+ error.name === "AbortError" ||
48
+ error.message === "Delay was aborted");
49
+ const statusOf = (error) => typeof error === "object" &&
50
+ error !== null &&
51
+ "statusCode" in error &&
52
+ typeof error.statusCode === "number"
53
+ ? error.statusCode
54
+ : undefined;
55
+ const bodyOf = (error) => {
56
+ if (typeof error !== "object" ||
57
+ error === null ||
58
+ !("responseBody" in error) ||
59
+ typeof error.responseBody !== "string")
60
+ return undefined;
61
+ try {
62
+ const parsed = JSON.parse(error.responseBody);
63
+ if (typeof parsed === "object" &&
64
+ parsed !== null &&
65
+ "message" in parsed &&
66
+ typeof parsed.message === "string")
67
+ return parsed.message;
68
+ }
69
+ catch {
70
+ // not JSON
71
+ }
72
+ return error.responseBody.slice(0, 160);
73
+ };
74
+ /**
75
+ * The gateway's own words, not the SDK's. A retry that ran out of time says
76
+ * "Delay was aborted"; what the person needs is the answer that made the SDK
77
+ * retry in the first place.
78
+ */
79
+ const explain = (error) => {
80
+ const attempts = RetryError.isInstance(error) ? error.errors : [error];
81
+ const answered = [...attempts].reverse().find((e) => statusOf(e) !== undefined);
82
+ if (answered !== undefined) {
83
+ const status = statusOf(answered);
84
+ const body = bodyOf(answered);
85
+ const tries = attempts.length > 1 ? ` after ${attempts.length} tries` : "";
86
+ return {
87
+ code: "CHECK_FAILED",
88
+ message: `the gateway answered ${status}${tries}${body ? `: ${body}` : ""}`,
89
+ };
90
+ }
91
+ if (attempts.some(isAbort))
92
+ return { code: "CHECK_TIMEOUT", message: "the gateway did not answer within the time allowed" };
93
+ const last = attempts.at(-1);
94
+ return { code: "CHECK_FAILED", message: last instanceof Error ? last.message : String(last) };
95
+ };
96
+ export const describeGatewayFailure = (error) => {
97
+ const failure = explain(error);
98
+ return new AbideError(failure.code, failure.message, { cause: error });
99
+ };
100
+ /**
101
+ * Direct calls carry the key explicitly. The gateway provider reads its key
102
+ * from the environment by the SDK's own convention, so a key found in a file
103
+ * is placed there for this process only.
104
+ */
105
+ const evaluationModel = async (creds) => {
106
+ switch (creds.kind) {
107
+ case "typesafe": {
108
+ const { createTypeSafeAi } = await import("@ai-sdk/typesafe-ai");
109
+ return createTypeSafeAi({ apiKey: creds.key }).evaluationModel(TYPESAFE_MODEL_ID);
110
+ }
111
+ case "gateway":
112
+ process.env[GATEWAY_KEY_ENV] = creds.key;
113
+ return GATEWAY_MODEL_ID;
114
+ default:
115
+ return assertNever(creds);
116
+ }
117
+ };
118
+ /** One call carrying every rule. The state is only the rule set and the change. */
119
+ export const checkWithModel = async (rules, state, thresholds, timeoutMs,
120
+ /** Transient gateway failures to retry. Zero inside a hook, where the budget is the agent's time. */
121
+ retries = 0) => {
122
+ if (rules.length === 0)
123
+ return { verdicts: [], usage: {}, latencyMs: 0 };
124
+ const creds = credentials();
125
+ if (creds.kind === "none")
126
+ throw new AbideError("NO_API_KEY", NO_KEY_HINT);
127
+ const { experimental_evaluate: evaluate } = await import("ai");
128
+ const model = await evaluationModel(creds);
129
+ const questions = {};
130
+ for (const rule of rules)
131
+ questions[rule.id] = toSdkQuestion(rule.check.question);
132
+ const started = performance.now();
133
+ let result;
134
+ try {
135
+ result = await evaluate({
136
+ model,
137
+ state,
138
+ questions,
139
+ maxRetries: retries,
140
+ abortSignal: AbortSignal.timeout(timeoutMs),
141
+ providerOptions: { gateway: { zeroDataRetention: true } },
142
+ });
143
+ }
144
+ catch (error) {
145
+ throw describeGatewayFailure(error);
146
+ }
147
+ const latencyMs = Math.round(performance.now() - started);
148
+ const verdicts = [];
149
+ for (const rule of rules) {
150
+ const answer = toAnswer(result.answers[rule.id]);
151
+ if (answer === undefined)
152
+ continue;
153
+ const { probability, answer: picked } = violationProbability(rule.check.question, answer);
154
+ verdicts.push({
155
+ ruleId: rule.id,
156
+ probability,
157
+ band: bandFor(probability, thresholds),
158
+ ...(picked === undefined ? {} : { answer: picked }),
159
+ });
160
+ }
161
+ const inputTokens = result.usage.inputTokens;
162
+ const usage = {
163
+ inputTokens,
164
+ outputTokens: result.usage.outputTokens,
165
+ costUsd: inputTokens === undefined ? undefined : inputTokens * JEV_USD_PER_INPUT_TOKEN,
166
+ };
167
+ return { verdicts, usage, latencyMs };
168
+ };
169
+ //# sourceMappingURL=jev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jev.js","sourceRoot":"","sources":["../../src/lib/jev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Lint config files at the root and up to two directory levels down (workspaces). */
2
+ export declare const findLintConfigs: (root: string) => string[];
3
+ //# sourceMappingURL=lintConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lintConfig.d.ts","sourceRoot":"","sources":["../../src/lib/lintConfig.ts"],"names":[],"mappings":"AA6BA,sFAAsF;AACtF,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,MAAM,EAsBpD,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { relativeToRoot } from "./paths.js";
4
+ const NAMES = [
5
+ "eslint.config.js",
6
+ "eslint.config.mjs",
7
+ "eslint.config.cjs",
8
+ "eslint.config.ts",
9
+ ".eslintrc",
10
+ ".eslintrc.js",
11
+ ".eslintrc.cjs",
12
+ ".eslintrc.json",
13
+ ".eslintrc.yml",
14
+ ".eslintrc.yaml",
15
+ "biome.json",
16
+ "biome.jsonc",
17
+ ".stylelintrc",
18
+ ".stylelintrc.json",
19
+ ".stylelintrc.js",
20
+ ".stylelintrc.cjs",
21
+ ".stylelintrc.yml",
22
+ "stylelint.config.js",
23
+ "stylelint.config.mjs",
24
+ "stylelint.config.cjs",
25
+ ".oxlintrc.json",
26
+ ];
27
+ const SKIP = new Set(["node_modules", ".git", "dist", "build", ".next", "coverage", "vendor"]);
28
+ /** Lint config files at the root and up to two directory levels down (workspaces). */
29
+ export const findLintConfigs = (root) => {
30
+ const found = [];
31
+ const visit = (dir, depth) => {
32
+ for (const name of NAMES) {
33
+ const file = path.join(dir, name);
34
+ if (existsSync(file))
35
+ found.push(relativeToRoot(root, file));
36
+ }
37
+ if (depth >= 2)
38
+ return;
39
+ let entries;
40
+ try {
41
+ entries = readdirSync(dir, { withFileTypes: true });
42
+ }
43
+ catch {
44
+ return;
45
+ }
46
+ for (const entry of entries) {
47
+ if (entry.isDirectory() && !SKIP.has(entry.name) && !entry.name.startsWith(".")) {
48
+ visit(path.join(dir, entry.name), depth + 1);
49
+ }
50
+ }
51
+ };
52
+ visit(root, 0);
53
+ return found;
54
+ };
55
+ //# sourceMappingURL=lintConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lintConfig.js","sourceRoot":"","sources":["../../src/lib/lintConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,KAAK,GAAG;IACZ,kBAAkB;IAClB,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,WAAW;IACX,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,YAAY;IACZ,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;IACtB,gBAAgB;CACjB,CAAC;AACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE/F,sFAAsF;AACtF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAY,EAAE;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,KAAa,EAAQ,EAAE;QACjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAClC,IAAI,UAAU,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO;QACvB,IAAI,OAAiB,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type Rubric, type Thresholds } from "@coldtea/abide-schema";
2
+ import { type MergedRule } from "./rubricFile.js";
3
+ export type LoadedRules = {
4
+ project: Rubric | undefined;
5
+ global: Rubric | undefined;
6
+ rules: MergedRule[];
7
+ thresholds: Thresholds;
8
+ problems: string[];
9
+ };
10
+ /** Project rubric plus the global one, project winning on a clash. */
11
+ export declare const loadRules: (root: string) => LoadedRules;
12
+ //# sourceMappingURL=loadRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadRules.d.ts","sourceRoot":"","sources":["../../src/lib/loadRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEzF,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,WAyBxC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { DEFAULT_THRESHOLDS } from "@coldtea/abide-schema";
2
+ import { globalRubricPath, rubricPath } from "./paths.js";
3
+ import { mergeRules, readRubric } from "./rubricFile.js";
4
+ /** Project rubric plus the global one, project winning on a clash. */
5
+ export const loadRules = (root) => {
6
+ const problems = [];
7
+ const pick = (file) => {
8
+ const read = readRubric(file);
9
+ switch (read.kind) {
10
+ case "ok":
11
+ return read.rubric;
12
+ case "invalid":
13
+ problems.push(`${read.path}: ${read.issues[0] ?? "invalid"}`);
14
+ return undefined;
15
+ case "missing":
16
+ return undefined;
17
+ default:
18
+ return undefined;
19
+ }
20
+ };
21
+ const project = pick(rubricPath(root));
22
+ const global = pick(globalRubricPath());
23
+ return {
24
+ project,
25
+ global,
26
+ rules: mergeRules(project, global),
27
+ thresholds: project?.thresholds ?? global?.thresholds ?? DEFAULT_THRESHOLDS,
28
+ problems,
29
+ };
30
+ };
31
+ //# sourceMappingURL=loadRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadRules.js","sourceRoot":"","sources":["../../src/lib/loadRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgC,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAU1E,sEAAsE;AACtE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAe,EAAE;IACrD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAsB,EAAE;QAChD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,IAAI;gBACP,OAAO,IAAI,CAAC,MAAM,CAAC;YACrB,KAAK,SAAS;gBACZ,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;gBAC9D,OAAO,SAAS,CAAC;YACnB,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAC;YACnB;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACxC,OAAO;QACL,OAAO;QACP,MAAM;QACN,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;QAClC,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,MAAM,EAAE,UAAU,IAAI,kBAAkB;QAC3E,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const OPENCODE_PLUGIN_MARKER = "abide-opencode-plugin";
2
+ /**
3
+ * The plugin as shipped in the package. The installed file only points at it,
4
+ * so an upgrade needs no reinstall. OpenCode discovers `plugins/*.js` and
5
+ * `*.ts` only, so the installed file is `.js` whatever the package uses.
6
+ */
7
+ export declare const pluginSourcePath: () => string;
8
+ export declare const installOpencodePlugin: (target: string) => void;
9
+ export declare const uninstallOpencodePlugin: (target: string) => boolean;
10
+ //# sourceMappingURL=opencodePlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencodePlugin.d.ts","sourceRoot":"","sources":["../../src/lib/opencodePlugin.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,QAAO,MAA2D,CAAC;AAShG,eAAO,MAAM,qBAAqB,WAAY,MAAM,KAAG,IAGtD,CAAC;AAEF,eAAO,MAAM,uBAAuB,WAAY,MAAM,KAAG,OAWxD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { packageRoot } from "./packageRoot.js";
5
+ export const OPENCODE_PLUGIN_MARKER = "abide-opencode-plugin";
6
+ /**
7
+ * The plugin as shipped in the package. The installed file only points at it,
8
+ * so an upgrade needs no reinstall. OpenCode discovers `plugins/*.js` and
9
+ * `*.ts` only, so the installed file is `.js` whatever the package uses.
10
+ */
11
+ export const pluginSourcePath = () => path.join(packageRoot(), "opencode", "abide.mjs");
12
+ const shim = (source) => [
13
+ `// ${OPENCODE_PLUGIN_MARKER}: written by \`abide init opencode\`; remove with \`abide uninstall opencode\`.`,
14
+ `export { default } from ${JSON.stringify(pathToFileURL(source).href)};`,
15
+ "",
16
+ ].join("\n");
17
+ export const installOpencodePlugin = (target) => {
18
+ mkdirSync(path.dirname(target), { recursive: true });
19
+ writeFileSync(target, shim(pluginSourcePath()));
20
+ };
21
+ export const uninstallOpencodePlugin = (target) => {
22
+ if (!existsSync(target))
23
+ return false;
24
+ let text;
25
+ try {
26
+ text = readFileSync(target, "utf8");
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ if (!text.includes(OPENCODE_PLUGIN_MARKER))
32
+ return false;
33
+ rmSync(target);
34
+ return true;
35
+ };
36
+ //# sourceMappingURL=opencodePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencodePlugin.js","sourceRoot":"","sources":["../../src/lib/opencodePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AAEhG,MAAM,IAAI,GAAG,CAAC,MAAc,EAAU,EAAE,CACtC;IACE,MAAM,sBAAsB,iFAAiF;IAC7G,2BAA2B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG;IACxE,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEf,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAQ,EAAE;IAC5D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAW,EAAE;IACjE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,CAAC,MAAM,CAAC,CAAC;IACf,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type HookOutput } from "@coldtea/abide-schema";
2
+ export type HookEventName = "SessionStart" | "UserPromptSubmit" | "PostToolUse" | "Stop";
3
+ /** The only path to stdout. Everything else goes to stderr, which the host keeps out of the transcript. */
4
+ export declare const emit: (output: HookOutput, event: HookEventName, done: () => void) => void;
5
+ export declare const debug: (message: string) => void;
6
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,kBAAkB,GAAG,aAAa,GAAG,MAAM,CAAC;AAMzF,2GAA2G;AAC3G,eAAO,MAAM,IAAI,WAAY,UAAU,SAAS,aAAa,QAAQ,MAAM,IAAI,KAAG,IA8BjF,CAAC;AAEF,eAAO,MAAM,KAAK,YAAa,MAAM,KAAG,IAEvC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { assertNever } from "@coldtea/abide-schema";
2
+ const write = (payload, done) => {
3
+ process.stdout.write(`${JSON.stringify(payload)}\n`, () => done());
4
+ };
5
+ /** The only path to stdout. Everything else goes to stderr, which the host keeps out of the transcript. */
6
+ export const emit = (output, event, done) => {
7
+ switch (output.kind) {
8
+ case "silent":
9
+ done();
10
+ return;
11
+ case "session-context":
12
+ write({
13
+ ...(output.systemMessage === undefined ? {} : { systemMessage: output.systemMessage }),
14
+ hookSpecificOutput: { hookEventName: event, additionalContext: output.additionalContext },
15
+ }, done);
16
+ return;
17
+ case "block":
18
+ write({
19
+ decision: "block",
20
+ reason: output.reason,
21
+ ...(output.systemMessage === undefined ? {} : { systemMessage: output.systemMessage }),
22
+ }, done);
23
+ return;
24
+ case "notice":
25
+ write({ systemMessage: output.systemMessage }, done);
26
+ return;
27
+ default:
28
+ return assertNever(output);
29
+ }
30
+ };
31
+ export const debug = (message) => {
32
+ if (process.env.ABIDE_DEBUG)
33
+ process.stderr.write(`abide: ${message}\n`);
34
+ };
35
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAmB,MAAM,uBAAuB,CAAC;AAIrE,MAAM,KAAK,GAAG,CAAC,OAAgC,EAAE,IAAgB,EAAQ,EAAE;IACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,2GAA2G;AAC3G,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAkB,EAAE,KAAoB,EAAE,IAAgB,EAAQ,EAAE;IACvF,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,IAAI,EAAE,CAAC;YACP,OAAO;QACT,KAAK,iBAAiB;YACpB,KAAK,CACH;gBACE,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;gBACtF,kBAAkB,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE;aAC1F,EACD,IAAI,CACL,CAAC;YACF,OAAO;QACT,KAAK,OAAO;YACV,KAAK,CACH;gBACE,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;aACvF,EACD,IAAI,CACL,CAAC;YACF,OAAO;QACT,KAAK,QAAQ;YACX,KAAK,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;YACrD,OAAO;QACT;YACE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAe,EAAQ,EAAE;IAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;AAC3E,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Directory of the installed @coldtea/abide package (the one holding package.json). */
2
+ export declare const packageRoot: () => string;
3
+ export declare const hookScriptPath: () => string;
4
+ export declare const binScriptPath: () => string;
5
+ export declare const compileSkillPath: () => string;
6
+ /**
7
+ * Copies the packaged skill into the repo so the agent can read it without
8
+ * leaving the project. A FIFO there would hold the hook and a symlink would
9
+ * redirect the copy, so either falls back to the packaged path.
10
+ */
11
+ export declare const placeCompileSkill: (root: string) => string;
12
+ //# sourceMappingURL=packageRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageRoot.d.ts","sourceRoot":"","sources":["../../src/lib/packageRoot.ts"],"names":[],"mappings":"AAKA,wFAAwF;AACxF,eAAO,MAAM,WAAW,QAAO,MAgB9B,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,MAA2D,CAAC;AAC9F,eAAO,MAAM,aAAa,QAAO,MAAoD,CAAC;AACtF,eAAO,MAAM,gBAAgB,QAAO,MAC6B,CAAC;AAElE;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,MAahD,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { readRegularText, writeRegularFile } from "./regularFile.js";
5
+ /** Directory of the installed @coldtea/abide package (the one holding package.json). */
6
+ export const packageRoot = () => {
7
+ let dir = path.dirname(fileURLToPath(import.meta.url));
8
+ for (;;) {
9
+ const candidate = path.join(dir, "package.json");
10
+ if (existsSync(candidate)) {
11
+ try {
12
+ const name = JSON.parse(readFileSync(candidate, "utf8")).name;
13
+ if (name === "@coldtea/abide")
14
+ return dir;
15
+ }
16
+ catch {
17
+ // keep walking
18
+ }
19
+ }
20
+ const parent = path.dirname(dir);
21
+ if (parent === dir)
22
+ return dir;
23
+ dir = parent;
24
+ }
25
+ };
26
+ export const hookScriptPath = () => path.join(packageRoot(), "dist", "abide-hook.js");
27
+ export const binScriptPath = () => path.join(packageRoot(), "dist", "bin.js");
28
+ export const compileSkillPath = () => path.join(packageRoot(), "skills", "abide-compile", "SKILL.md");
29
+ /**
30
+ * Copies the packaged skill into the repo so the agent can read it without
31
+ * leaving the project. A FIFO there would hold the hook and a symlink would
32
+ * redirect the copy, so either falls back to the packaged path.
33
+ */
34
+ export const placeCompileSkill = (root) => {
35
+ const packaged = compileSkillPath();
36
+ const target = path.join(root, ".abide", "compile-skill.md");
37
+ const skill = readRegularText(packaged);
38
+ if (skill === undefined)
39
+ return packaged;
40
+ try {
41
+ mkdirSync(path.dirname(target), { recursive: true });
42
+ }
43
+ catch {
44
+ return packaged;
45
+ }
46
+ return writeRegularFile(target, skill, { use: "replace", followSymlinks: false })
47
+ ? target
48
+ : packaged;
49
+ };
50
+ //# sourceMappingURL=packageRoot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageRoot.js","sourceRoot":"","sources":["../../src/lib/packageRoot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAErE,wFAAwF;AACxF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAW,EAAE;IACtC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACjD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvE,IAAI,IAAI,KAAK,gBAAgB;oBAAE,OAAO,GAAG,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,GAAG,CAAC;QAC/B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AAC9F,MAAM,CAAC,MAAM,aAAa,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;AAElE;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAU,EAAE;IACxD,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QAC/E,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,QAAQ,CAAC;AACf,CAAC,CAAC"}