@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/dist/lib/ui.js ADDED
@@ -0,0 +1,34 @@
1
+ export const say = (line = "") => {
2
+ process.stdout.write(`${line}\n`);
3
+ };
4
+ export const warn = (line) => {
5
+ process.stderr.write(`${line}\n`);
6
+ };
7
+ export const table = (rows) => {
8
+ const widths = [];
9
+ for (const row of rows)
10
+ row.forEach((cell, i) => (widths[i] = Math.max(widths[i] ?? 0, cell.length)));
11
+ return rows
12
+ .map((row) => row.map((cell, i) => (i === row.length - 1 ? cell : cell.padEnd(widths[i] ?? 0))).join(" "))
13
+ .join("\n");
14
+ };
15
+ export const ms = (n) => n >= 1000 ? `${(n / 1000).toFixed(1)}s` : `${Math.round(n)}ms`;
16
+ export const usd = (n) => (n < 0.01 ? `$${n.toFixed(5)}` : `$${n.toFixed(3)}`);
17
+ export const median = (values) => {
18
+ if (values.length === 0)
19
+ return undefined;
20
+ const sorted = [...values].sort((a, b) => a - b);
21
+ const mid = Math.floor(sorted.length / 2);
22
+ const a = sorted[mid];
23
+ const b = sorted[mid - 1];
24
+ if (a === undefined)
25
+ return undefined;
26
+ return sorted.length % 2 === 1 || b === undefined ? a : (a + b) / 2;
27
+ };
28
+ export const percentile = (values, p) => {
29
+ if (values.length === 0)
30
+ return undefined;
31
+ const sorted = [...values].sort((a, b) => a - b);
32
+ return sorted[Math.min(sorted.length - 1, Math.ceil((p / 100) * sorted.length) - 1)];
33
+ };
34
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/lib/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Rule } from "@coldtea/abide-schema";
2
+ /** One line: how many rules, and how each one is enforced. */
3
+ export declare function Buckets({ rules }: {
4
+ rules: readonly Rule[];
5
+ }): import("react").JSX.Element;
6
+ //# sourceMappingURL=Buckets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Buckets.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Buckets.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAIlD,8DAA8D;AAC9D,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA;CAAE,+BAuB5D"}
@@ -0,0 +1,11 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { bucketCounts } from "../../lib/rubricFile.js";
4
+ import { glyph, palette } from "../theme.js";
5
+ /** One line: how many rules, and how each one is enforced. */
6
+ export function Buckets({ rules }) {
7
+ const c = bucketCounts(rules);
8
+ const part = (n, label, color) => (_jsxs(_Fragment, { children: [_jsxs(Text, { color: palette.mist, children: [" ", glyph.dotSep, " "] }), _jsx(Text, { color: n > 0 ? color : palette.ash, bold: n > 0, children: n }), _jsxs(Text, { color: n > 0 ? palette.cloud : palette.ash, children: [" ", label] })] }));
9
+ return (_jsxs(Box, { children: [_jsx(Text, { color: palette.cloud, bold: true, children: c.total }), _jsx(Text, { color: palette.cloud, children: " rules" }), part(c.model, "checked by Jev", palette.indigo), part(c.lint, "for your linter", palette.sage), part(c.deferred, "deferred", palette.ceramicWarm), part(c.unenforceable, "unenforceable", palette.ash)] }));
10
+ }
11
+ //# sourceMappingURL=Buckets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Buckets.js","sourceRoot":"","sources":["../../../src/ui/components/Buckets.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7C,8DAA8D;AAC9D,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAA8B;IAC3D,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,KAAa,EAAE,KAAa,EAAE,EAAE,CAAC,CACxD,8BACE,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,kBAAI,KAAK,CAAC,MAAM,SAAS,EAClD,KAAC,IAAI,IAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,YAClD,CAAC,GACG,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,kBAAI,KAAK,IAAQ,IAChE,CACJ,CAAC;IACF,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,kBAC7B,CAAC,CAAC,KAAK,GACH,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,uBAAe,EACxC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,EAC/C,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,EAC7C,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EACjD,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,IAChD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ReactNode } from "react";
2
+ import { type Tone } from "../theme.js";
3
+ type CalloutProps = {
4
+ tone: Tone;
5
+ title: string;
6
+ children?: ReactNode;
7
+ };
8
+ /** Something the reader should act on, boxed so it is not lost in a table. */
9
+ export declare function Callout({ tone, title, children }: CalloutProps): import("react").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=Callout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Callout.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAoB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAE1D,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAExE,8EAA8E;AAC9E,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAkB9D"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { glyph, toneColor } from "../theme.js";
4
+ /** Something the reader should act on, boxed so it is not lost in a table. */
5
+ export function Callout({ tone, title, children }) {
6
+ const color = toneColor[tone];
7
+ const mark = tone === "ok" ? glyph.check : tone === "bad" ? glyph.cross : glyph.dot;
8
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: color, paddingX: 1, marginBottom: 1, alignSelf: "flex-start", children: [_jsxs(Text, { color: color, bold: true, children: [mark, " ", title] }), children ? _jsx(Box, { flexDirection: "column", children: children }) : null] }));
9
+ }
10
+ //# sourceMappingURL=Callout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Callout.js","sourceRoot":"","sources":["../../../src/ui/components/Callout.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAa,MAAM,aAAa,CAAC;AAI1D,8EAA8E;AAC9E,MAAM,UAAU,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAgB;IAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IACpF,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,EAClB,QAAQ,EAAE,CAAC,EACX,YAAY,EAAE,CAAC,EACf,SAAS,EAAC,YAAY,aAEtB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,mBACrB,IAAI,OAAG,KAAK,IACR,EACN,QAAQ,CAAC,CAAC,CAAC,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,IAC3D,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export type Step = {
2
+ ok: boolean;
3
+ text: string;
4
+ detail?: string;
5
+ };
6
+ /** What happened, one line per step, so a person can see where an install stopped. */
7
+ export declare function Checklist({ steps }: {
8
+ steps: readonly Step[];
9
+ }): import("react").JSX.Element;
10
+ //# sourceMappingURL=Checklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checklist.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Checklist.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,IAAI,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA;CAAE,+BAsB9D"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { glyph, palette } from "../theme.js";
4
+ /** What happened, one line per step, so a person can see where an install stopped. */
5
+ export function Checklist({ steps }) {
6
+ return (_jsx(Box, { flexDirection: "column", children: steps.map((step, i) => (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: step.ok ? palette.sage : palette.rose, children: step.ok ? glyph.check : glyph.cross }), _jsxs(Text, { color: palette.cloud, children: [" ", step.text] })] }), step.detail ? (_jsx(Box, { paddingLeft: 2, children: _jsx(Text, { color: palette.ash, wrap: "truncate-end", children: step.detail }) })) : null] }, i))) }));
7
+ }
8
+ //# sourceMappingURL=Checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Checklist.js","sourceRoot":"","sources":["../../../src/ui/components/Checklist.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI7C,sFAAsF;AACtF,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAA8B;IAC7D,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,MAAC,GAAG,IAAS,aAAa,EAAC,QAAQ,aACjC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,YAC/C,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAC/B,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,kBAAI,IAAI,CAAC,IAAI,IAAQ,IAC3C,EACL,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CACb,KAAC,GAAG,IAAC,WAAW,EAAE,CAAC,YACjB,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAC,cAAc,YAC1C,IAAI,CAAC,MAAM,GACP,GACH,CACP,CAAC,CAAC,CAAC,IAAI,KAbA,CAAC,CAcL,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ export type Column = {
2
+ key: string;
3
+ label: string;
4
+ /** Fixed width, or omitted for the one column that takes what is left. */
5
+ width?: number;
6
+ align?: "left" | "right";
7
+ keep?: "head" | "tail";
8
+ };
9
+ export type Cell = {
10
+ text: string;
11
+ color?: string;
12
+ bold?: boolean;
13
+ dim?: boolean;
14
+ };
15
+ export type Row = Record<string, Cell>;
16
+ type ColumnsProps = {
17
+ columns: Column[];
18
+ rows: Row[];
19
+ indent?: number;
20
+ };
21
+ /**
22
+ * A table that fits the terminal. Fixed columns keep their width whatever
23
+ * happens, the flexible one takes what is left, and every cell is cut with an
24
+ * ellipsis rather than wrapped, so a row is always one line.
25
+ */
26
+ export declare function Columns({ columns, rows, indent }: ColumnsProps): import("react").JSX.Element;
27
+ export {};
28
+ //# sourceMappingURL=Columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Columns.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Columns.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,MAAM,GAAG;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AACnF,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEvC,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAKxE;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAU,EAAE,EAAE,YAAY,+BAoClE"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useStdout } from "ink";
3
+ import { palette, truncate } from "../theme.js";
4
+ const GAP = 2;
5
+ const MIN_FLEX = 10;
6
+ /**
7
+ * A table that fits the terminal. Fixed columns keep their width whatever
8
+ * happens, the flexible one takes what is left, and every cell is cut with an
9
+ * ellipsis rather than wrapped, so a row is always one line.
10
+ */
11
+ export function Columns({ columns, rows, indent = 0 }) {
12
+ const { stdout } = useStdout();
13
+ const available = Math.max(60, (stdout?.columns ?? 100) - indent - 1);
14
+ const fixed = columns.reduce((sum, c) => sum + (c.width ?? 0), 0) + GAP * (columns.length - 1);
15
+ const flexWidth = Math.max(MIN_FLEX, available - fixed);
16
+ const widthOf = (c) => c.width ?? flexWidth;
17
+ const cell = (c, content, header, last) => (_jsx(Box, { width: widthOf(c), flexShrink: 0, marginRight: last ? 0 : GAP, justifyContent: c.align === "right" ? "flex-end" : "flex-start", children: _jsx(Text, { color: header ? palette.ash : (content.color ?? palette.cloud), bold: content.bold, dimColor: content.dim, wrap: "truncate", children: truncate(content.text, widthOf(c), c.keep ?? "head") }) }, c.key));
18
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { children: columns.map((c, i) => cell(c, { text: c.label }, true, i === columns.length - 1)) }), rows.map((row, r) => (_jsx(Box, { children: columns.map((c, i) => cell(c, row[c.key] ?? { text: "" }, false, i === columns.length - 1)) }, r)))] }));
19
+ }
20
+ //# sourceMappingURL=Columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Columns.js","sourceRoot":"","sources":["../../../src/ui/components/Columns.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgBhD,MAAM,GAAG,GAAG,CAAC,CAAC;AACd,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAgB;IACjE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/F,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC;IAC5D,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,OAAa,EAAE,MAAe,EAAE,IAAa,EAAE,EAAE,CAAC,CACzE,KAAC,GAAG,IAEF,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EACjB,UAAU,EAAE,CAAC,EACb,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAC3B,cAAc,EAAE,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,YAE/D,KAAC,IAAI,IACH,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,EAC9D,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,QAAQ,EAAE,OAAO,CAAC,GAAG,EACrB,IAAI,EAAC,UAAU,YAEd,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,GAChD,IAbF,CAAC,CAAC,GAAG,CAcN,CACP,CAAC;IACF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,GAAG,cAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAO,EAC7F,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,KAAC,GAAG,cACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpB,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CACrE,IAHO,CAAC,CAIL,CACP,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ type HeaderProps = {
2
+ command: string;
3
+ /** Where this ran, on its own line: a person switching between repos should not have to guess. */
4
+ where?: string;
5
+ note?: string;
6
+ };
7
+ export declare function Header({ command, where, note }: HeaderProps): import("react").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Header.tsx"],"names":[],"mappings":"AAGA,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,kGAAkG;IAClG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,WAAW,+BAwB3D"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { glyph, palette } from "../theme.js";
4
+ export function Header({ command, where, note }) {
5
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: palette.teal, bold: true, children: "abide" }), _jsxs(Text, { color: palette.mist, children: [" ", glyph.dotSep, " "] }), _jsx(Text, { color: palette.cloud, bold: true, children: command })] }), where ? (_jsx(Text, { color: palette.ash, wrap: "truncate-start", children: where })) : null, note ? (_jsx(Text, { color: palette.mist, wrap: "wrap", children: note })) : null] }));
6
+ }
7
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/ui/components/Header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAS7C,MAAM,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAe;IAC1D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,4BAExB,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,kBAAI,KAAK,CAAC,MAAM,SAAS,EAClD,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,kBAC7B,OAAO,GACH,IACH,EACL,KAAK,CAAC,CAAC,CAAC,CACP,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAC,gBAAgB,YAC5C,KAAK,GACD,CACR,CAAC,CAAC,CAAC,IAAI,EACP,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAC,MAAM,YACnC,IAAI,GACA,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from "react";
2
+ export type Progress = (label: string) => void;
3
+ type LiveProps<T> = {
4
+ /** Shown above the spinner while `run` is going. */
5
+ header: ReactNode;
6
+ run: (progress: Progress) => Promise<T>;
7
+ done: (result: T) => ReactNode;
8
+ failed: (error: unknown) => ReactNode;
9
+ onExit?: (code: number) => void;
10
+ /** Redraw the progress line. Off on a pipe, where every frame would be printed as a new line. */
11
+ animate?: boolean;
12
+ };
13
+ /** Runs a job and draws its progress, then its result, then leaves. */
14
+ export declare function Live<T>({ header, run, done, failed, onExit, animate }: LiveProps<T>): import("react").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=Live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Live.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Live.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG5D,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAE/C,KAAK,SAAS,CAAC,CAAC,IAAI;IAClB,oDAAoD;IACpD,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAC;IAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,iGAAiG;IACjG,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAOF,uEAAuE;AACvE,wBAAgB,IAAI,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAc,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,+BAgD1F"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useApp } from "ink";
3
+ import Spinner from "ink-spinner";
4
+ import { useEffect, useState } from "react";
5
+ import { palette } from "../theme.js";
6
+ /** Runs a job and draws its progress, then its result, then leaves. */
7
+ export function Live({ header, run, done, failed, onExit, animate = true }) {
8
+ const { exit } = useApp();
9
+ const [state, setState] = useState({ kind: "running", label: "starting" });
10
+ useEffect(() => {
11
+ let alive = true;
12
+ run((label) => {
13
+ if (alive && animate)
14
+ setState({ kind: "running", label });
15
+ })
16
+ .then((result) => {
17
+ if (alive)
18
+ setState({ kind: "done", result });
19
+ })
20
+ .catch((error) => {
21
+ if (alive)
22
+ setState({ kind: "failed", error });
23
+ });
24
+ return () => {
25
+ alive = false;
26
+ };
27
+ // The job runs once for the life of the view.
28
+ // eslint-disable-next-line react-hooks/exhaustive-deps
29
+ }, []);
30
+ // Leave only after the final frame has been drawn, not in the same tick it was asked for.
31
+ useEffect(() => {
32
+ if (state.kind === "running")
33
+ return;
34
+ onExit?.(state.kind === "done" ? 0 : 1);
35
+ exit();
36
+ }, [state.kind, exit, onExit]);
37
+ // The result view draws its own header, so the wrapper shows one only while there is nothing else to show.
38
+ return (_jsxs(Box, { flexDirection: "column", children: [state.kind === "running" ? header : null, state.kind === "running" ? (animate ? (_jsxs(Box, { children: [_jsx(Text, { color: palette.teal, children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { color: palette.mist, children: [" ", state.label] })] })) : (_jsx(Text, { color: palette.mist, children: "working" }))) : state.kind === "done" ? (done(state.result)) : (failed(state.error))] }));
39
+ }
40
+ //# sourceMappingURL=Live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Live.js","sourceRoot":"","sources":["../../../src/ui/components/Live.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,OAAO,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAoBtC,uEAAuE;AACvE,MAAM,UAAU,IAAI,CAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAgB;IACzF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IACrF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACZ,IAAI,KAAK,IAAI,OAAO;gBAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC;aACC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,IAAI,KAAK;gBAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,IAAI,KAAK;gBAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;QACF,8CAA8C;QAC9C,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,0FAA0F;IAC1F,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO;QACrC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/B,2GAA2G;IAC3G,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EACxC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAC1B,OAAO,CAAC,CAAC,CAAC,CACR,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,YACvB,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,kBAAI,KAAK,CAAC,KAAK,IAAQ,IAC5C,CACP,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,wBAAgB,CAC1C,CACF,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CACnB,CAAC,CAAC,CAAC,CACF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CACpB,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Rule } from "@coldtea/abide-schema";
2
+ export type RuleStats = {
3
+ checks: number;
4
+ fired: number;
5
+ flagged: number;
6
+ };
7
+ type RuleTableProps = {
8
+ rules: readonly Rule[];
9
+ stats?: ReadonlyMap<string, RuleStats>;
10
+ /** Only rules abide checks: the model ones. */
11
+ runnableOnly?: boolean;
12
+ };
13
+ export declare function RuleTable({ rules, stats, runnableOnly }: RuleTableProps): import("react").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=RuleTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuleTable.d.ts","sourceRoot":"","sources":["../../../src/ui/components/RuleTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,uBAAuB,CAAC;AAK9D,MAAM,MAAM,SAAS,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AA8C3E,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,YAAoB,EAAE,EAAE,cAAc,+BAmC/E"}
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { assertNever } from "@coldtea/abide-schema";
3
+ import { Columns } from "./Columns.js";
4
+ import { glyph, meter, palette, scopeLabel } from "../theme.js";
5
+ const statusCell = (status) => {
6
+ switch (status) {
7
+ case "active":
8
+ return { text: `${glyph.dot} active`, color: palette.sage };
9
+ case "weak":
10
+ return { text: `${glyph.dot} weak`, color: palette.amber, bold: true };
11
+ case "noisy":
12
+ return { text: `${glyph.dot} noisy`, color: palette.rose, bold: true };
13
+ case "disabled":
14
+ return { text: `${glyph.ring} off`, color: palette.ash };
15
+ default:
16
+ return assertNever(status);
17
+ }
18
+ };
19
+ const checkCell = (rule) => {
20
+ switch (rule.check.type) {
21
+ case "lint":
22
+ return { text: "linter", color: palette.sage };
23
+ case "model":
24
+ return { text: `jev ${rule.check.question.type}`, color: palette.indigo };
25
+ case "deferred":
26
+ return { text: "deferred", color: palette.ceramicWarm };
27
+ case "unenforceable":
28
+ return { text: "unenforceable", color: palette.ash };
29
+ default:
30
+ return assertNever(rule.check);
31
+ }
32
+ };
33
+ const whenCell = (rule) => {
34
+ if (rule.check.type === "model")
35
+ return { text: rule.when ?? "", color: rule.when === "turn" ? palette.plum : palette.mist };
36
+ return { text: "", color: palette.ash };
37
+ };
38
+ const calibrationCell = (rule) => {
39
+ const c = rule.calibration;
40
+ if (!c || c.verdict === "skipped")
41
+ return { text: c ? "skipped" : "", color: palette.ash };
42
+ const color = c.verdict === "decisive" ? palette.mist : c.verdict === "weak" ? palette.amber : palette.rose;
43
+ return { text: `${meter(c.median, 6)} ${c.median.toFixed(2)}`, color };
44
+ };
45
+ export function RuleTable({ rules, stats, runnableOnly = false }) {
46
+ const shown = runnableOnly ? rules.filter((r) => r.check.type === "model") : rules;
47
+ const columns = [
48
+ { key: "id", label: "rule", width: 30 },
49
+ { key: "check", label: "check", width: 12 },
50
+ { key: "when", label: "when", width: 4 },
51
+ { key: "status", label: "status", width: 9 },
52
+ ...(stats
53
+ ? [{ key: "fired", label: "fired / checks", width: 14, align: "right" }]
54
+ : []),
55
+ { key: "cal", label: "calibration", width: 12 },
56
+ { key: "scope", label: "scope" },
57
+ ];
58
+ const rows = shown.map((rule) => {
59
+ const s = stats?.get(rule.id);
60
+ return {
61
+ id: {
62
+ text: rule.id,
63
+ color: rule.status === "active" ? palette.cloud : palette.mist,
64
+ bold: rule.status === "active",
65
+ },
66
+ check: checkCell(rule),
67
+ when: whenCell(rule),
68
+ status: statusCell(rule.status),
69
+ fired: s
70
+ ? {
71
+ text: `${s.fired} / ${s.checks}`,
72
+ color: s.fired > 0 ? palette.rose : s.checks > 0 ? palette.mist : palette.ash,
73
+ }
74
+ : { text: "", color: palette.ash },
75
+ cal: calibrationCell(rule),
76
+ scope: { text: scopeLabel(rule.scope), color: rule.scope ? palette.mist : palette.ash },
77
+ };
78
+ });
79
+ return _jsx(Columns, { columns: columns, rows: rows, indent: 2 });
80
+ }
81
+ //# sourceMappingURL=RuleTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuleTable.js","sourceRoot":"","sources":["../../../src/ui/components/RuleTable.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from "react";
2
+ type SectionProps = {
3
+ title: string;
4
+ children: ReactNode;
5
+ aside?: string;
6
+ };
7
+ /** A titled block with a thin teal rule down its left, so a long report scans in pieces. */
8
+ export declare function Section({ title, aside, children }: SectionProps): import("react").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=Section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Section.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Section.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,KAAK,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,4FAA4F;AAC5F,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,+BAgB/D"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { glyph, palette } from "../theme.js";
4
+ /** A titled block with a thin teal rule down its left, so a long report scans in pieces. */
5
+ export function Section({ title, aside, children }) {
6
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: palette.teal, children: glyph.bar }), _jsxs(Text, { color: palette.cloud, bold: true, children: [" ", title] }), aside ? _jsxs(Text, { color: palette.mist, children: [" ", aside] }) : null] }), _jsx(Box, { flexDirection: "column", paddingLeft: 2, children: children })] }));
7
+ }
8
+ //# sourceMappingURL=Section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Section.js","sourceRoot":"","sources":["../../../src/ui/components/Section.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI7C,4FAA4F;AAC5F,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAgB;IAC9D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,YAAG,KAAK,CAAC,GAAG,GAAQ,EAC7C,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,mBAC7B,GAAG,EACH,KAAK,IACD,EACN,KAAK,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,kBAAI,KAAK,IAAQ,CAAC,CAAC,CAAC,IAAI,IACtD,EACN,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,YACvC,QAAQ,GACL,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Verdict } from "@coldtea/abide-schema";
2
+ type VerdictsProps = {
3
+ verdicts: readonly Verdict[];
4
+ all?: boolean;
5
+ };
6
+ /** Verdicts as meters, loudest first. Clear ones fold into one quiet line unless asked for. */
7
+ export declare function Verdicts({ verdicts, all }: VerdictsProps): import("react").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=Verdicts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Verdicts.d.ts","sourceRoot":"","sources":["../../../src/ui/components/Verdicts.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAMrD,KAAK,aAAa,GAAG;IAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAErE,+FAA+F;AAC/F,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAW,EAAE,EAAE,aAAa,+BA6BhE"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { glyph, meter, palette } from "../theme.js";
4
+ const bandColor = (band) => band === "act" ? palette.rose : band === "flag" ? palette.amber : palette.mist;
5
+ /** Verdicts as meters, loudest first. Clear ones fold into one quiet line unless asked for. */
6
+ export function Verdicts({ verdicts, all = false }) {
7
+ const sorted = [...verdicts].sort((a, b) => b.probability - a.probability);
8
+ const shown = all ? sorted : sorted.filter((v) => v.band !== "clear");
9
+ const hidden = sorted.length - shown.length;
10
+ return (_jsxs(Box, { flexDirection: "column", children: [shown.map((v) => (_jsxs(Box, { children: [_jsx(Text, { color: bandColor(v.band), children: meter(v.probability) }), _jsxs(Text, { color: bandColor(v.band), bold: v.band === "act", children: [" ", v.probability.toFixed(2)] }), _jsxs(Text, { color: v.band === "clear" ? palette.mist : palette.cloud, bold: v.band === "act", children: [" ", v.ruleId] }), v.answer ? _jsxs(Text, { color: palette.ash, children: [" ", v.answer] }) : null] }, v.ruleId))), hidden > 0 ? (_jsxs(Text, { color: palette.ash, children: [glyph.check, " ", hidden, " ", hidden === 1 ? "rule" : "rules", " clear"] })) : shown.length === 0 ? (_jsxs(Text, { color: palette.sage, children: [glyph.check, " nothing to report"] })) : null] }));
11
+ }
12
+ //# sourceMappingURL=Verdicts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Verdicts.js","sourceRoot":"","sources":["../../../src/ui/components/Verdicts.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,SAAS,GAAG,CAAC,IAAqB,EAAU,EAAE,CAClD,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;AAIjF,+FAA+F;AAC/F,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAE,GAAG,GAAG,KAAK,EAAiB;IAC/D,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAChB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAQ,EAC7D,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,KAAK,aACnD,GAAG,EACH,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IACpB,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,KAAK,aACnF,IAAI,EACJ,CAAC,CAAC,MAAM,IACJ,EACN,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,GAAG,kBAAI,CAAC,CAAC,MAAM,IAAQ,CAAC,CAAC,CAAC,IAAI,KAVvD,CAAC,CAAC,MAAM,CAWZ,CACP,CAAC,EACD,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACZ,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,GAAG,aACrB,KAAK,CAAC,KAAK,OAAG,MAAM,OAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,cAClD,CACR,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,MAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,aAAG,KAAK,CAAC,KAAK,0BAA0B,CAClE,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ import { type Progress } from "./components/Live.js";
3
+ /**
4
+ * Draws a finished view once and leaves. Ink prints the final frame on a pipe
5
+ * too, so `abide report | less` still reads well. Nothing in the hooks goes
6
+ * through here: their stdout belongs to the host.
7
+ */
8
+ export declare const showStatic: (element: ReactElement) => Promise<void>;
9
+ type LiveJob<T> = {
10
+ header: ReactNode;
11
+ run: (progress: Progress) => Promise<T>;
12
+ done: (result: T) => ReactNode;
13
+ /** Exit code once the result is drawn. */
14
+ code?: (result: T) => number;
15
+ };
16
+ /** Runs a job under a spinner, draws its result, and resolves to the exit code. */
17
+ export declare const showLive: <T>(job: LiveJob<T>) => Promise<number>;
18
+ export declare const showError: (error: unknown) => Promise<void>;
19
+ export {};
20
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/ui/render.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG3D;;;;GAIG;AACH,eAAO,MAAM,UAAU,YAAmB,YAAY,KAAG,OAAO,CAAC,IAAI,CAIpE,CAAC;AAEF,KAAK,OAAO,CAAC,CAAC,IAAI;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,GAAG,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAC;IAC/B,0CAA0C;IAC1C,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC;CAC9B,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,QAAQ,GAAU,CAAC,OAAQ,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,MAAM,CAqBlE,CAAC;AAEF,eAAO,MAAM,SAAS,UAAiB,OAAO,KAAG,OAAO,CAAC,IAAI,CAE5D,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from "ink";
3
+ import { Live } from "./components/Live.js";
4
+ import { ErrorView } from "./views/ErrorView.js";
5
+ /**
6
+ * Draws a finished view once and leaves. Ink prints the final frame on a pipe
7
+ * too, so `abide report | less` still reads well. Nothing in the hooks goes
8
+ * through here: their stdout belongs to the host.
9
+ */
10
+ export const showStatic = async (element) => {
11
+ const instance = render(element, { patchConsole: false, exitOnCtrlC: true });
12
+ instance.unmount();
13
+ await instance.waitUntilExit();
14
+ };
15
+ /** Runs a job under a spinner, draws its result, and resolves to the exit code. */
16
+ export const showLive = async (job) => {
17
+ const outcome = { code: 0 };
18
+ const instance = render(_jsx(Live, { header: job.header, run: job.run, done: (result) => {
19
+ outcome.result = { value: result };
20
+ return job.done(result);
21
+ }, failed: (error) => _jsx(ErrorView, { error: error }), onExit: (exitCode) => {
22
+ outcome.code = exitCode;
23
+ }, animate: Boolean(process.stdout.isTTY) }), { patchConsole: false, exitOnCtrlC: true });
24
+ await instance.waitUntilExit();
25
+ if (outcome.result !== undefined && job.code)
26
+ return job.code(outcome.result.value);
27
+ return outcome.code;
28
+ };
29
+ export const showError = async (error) => {
30
+ await showStatic(_jsx(ErrorView, { error: error }));
31
+ };
32
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAiB,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,OAAqB,EAAiB,EAAE;IACvE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,QAAQ,CAAC,OAAO,EAAE,CAAC;IACnB,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;AACjC,CAAC,CAAC;AAUF,mFAAmF;AACnF,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAM,GAAe,EAAmB,EAAE;IACrE,MAAM,OAAO,GAA4C,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACrE,MAAM,QAAQ,GAAG,MAAM,CACrB,KAAC,IAAI,IACH,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACf,OAAO,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YACnC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,EACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI,EAC9C,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;YACnB,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;QAC1B,CAAC,EACD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GACtC,EACF,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAC3C,CAAC;IACF,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpF,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,KAAc,EAAiB,EAAE;IAC/D,MAAM,UAAU,CAAC,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC,CAAC;AAChD,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ /** Coldtea's palette, as a terminal can show it. Truecolor where available; chalk degrades the rest. */
2
+ export declare const palette: {
3
+ readonly teal: "#3da5a8";
4
+ readonly tealLight: "#58c4c8";
5
+ readonly sage: "#5cbd68";
6
+ readonly ceramic: "#d8c4a0";
7
+ readonly ceramicWarm: "#c4a46e";
8
+ readonly amber: "#d49a50";
9
+ readonly amberBright: "#e0ac62";
10
+ readonly rose: "#c9627d";
11
+ readonly plum: "#a468c2";
12
+ readonly indigo: "#6876d8";
13
+ readonly copper: "#b97b47";
14
+ readonly mist: "#8d96a3";
15
+ readonly ash: "#5a6370";
16
+ readonly cloud: "#cdd3dc";
17
+ readonly paper: "#f0ece6";
18
+ };
19
+ export type Tone = "accent" | "ok" | "warn" | "bad" | "info" | "muted" | "text" | "highlight";
20
+ export declare const toneColor: Record<Tone, string>;
21
+ export declare const glyph: {
22
+ readonly dot: "●";
23
+ readonly ring: "○";
24
+ readonly check: "✓";
25
+ readonly cross: "✗";
26
+ readonly arrow: "→";
27
+ readonly bar: "▎";
28
+ readonly dotSep: "·";
29
+ readonly ellipsis: "…";
30
+ };
31
+ /** Cuts a string to fit, keeping the tail readable when the head is the boring part. */
32
+ export declare const truncate: (value: string, max: number, keep?: "head" | "tail") => string;
33
+ /** A probability as a small bar: filled tenths, in the band's colour. */
34
+ export declare const meter: (probability: number, width?: number) => string;
35
+ /** Globs as a person reads them: a list of whole-tree extension globs becomes `ts, tsx`; anything else stays a glob. */
36
+ export declare const scopeLabel: (scope: readonly string[] | undefined) => string;
37
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA,wGAAwG;AACxG,eAAO,MAAM,OAAO;aAClB,IAAI,EAAE,SAAS;aACf,SAAS,EAAE,SAAS;aACpB,IAAI,EAAE,SAAS;aACf,OAAO,EAAE,SAAS;aAClB,WAAW,EAAE,SAAS;aACtB,KAAK,EAAE,SAAS;aAChB,WAAW,EAAE,SAAS;aACtB,IAAI,EAAE,SAAS;aACf,IAAI,EAAE,SAAS;aACf,MAAM,EAAE,SAAS;aACjB,MAAM,EAAE,SAAS;aACjB,IAAI,EAAE,SAAS;aACf,GAAG,EAAE,SAAS;aACd,KAAK,EAAE,SAAS;aAChB,KAAK,EAAE,SAAS;CACR,CAAC;AAEX,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE9F,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAS1C,CAAC;AAEF,eAAO,MAAM,KAAK;aAChB,GAAG,EAAE,GAAG;aACR,IAAI,EAAE,GAAG;aACT,KAAK,EAAE,GAAG;aACV,KAAK,EAAE,GAAG;aACV,KAAK,EAAE,GAAG;aACV,GAAG,EAAE,GAAG;aACR,MAAM,EAAE,GAAG;aACX,QAAQ,EAAE,GAAG;CACL,CAAC;AAEX,wFAAwF;AACxF,eAAO,MAAM,QAAQ,UAAW,MAAM,OAAO,MAAM,SAAQ,MAAM,GAAG,MAAM,KAAY,MAMrF,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,KAAK,gBAAiB,MAAM,qBAAe,MAGvD,CAAC;AAEF,wHAAwH;AACxH,eAAO,MAAM,UAAU,UAAW,SAAS,MAAM,EAAE,GAAG,SAAS,KAAG,MAKjE,CAAC"}