@aligndottech/cli 0.48.0 → 0.50.0

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 (717) hide show
  1. package/README.md +10 -8
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +35 -26
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +7 -2
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/ai.d.ts +11 -0
  9. package/dist/commands/ai.d.ts.map +1 -0
  10. package/dist/commands/ai.js +121 -0
  11. package/dist/commands/ai.js.map +1 -0
  12. package/dist/commands/check.d.ts.map +1 -1
  13. package/dist/commands/check.js +18 -2
  14. package/dist/commands/check.js.map +1 -1
  15. package/dist/commands/connect.d.ts +5 -0
  16. package/dist/commands/connect.d.ts.map +1 -1
  17. package/dist/commands/connect.js +24 -0
  18. package/dist/commands/connect.js.map +1 -1
  19. package/dist/commands/default-action.js +2 -2
  20. package/dist/commands/default-action.js.map +1 -1
  21. package/dist/commands/import/confluence.d.ts.map +1 -1
  22. package/dist/commands/import/confluence.js +24 -5
  23. package/dist/commands/import/confluence.js.map +1 -1
  24. package/dist/commands/import/docs.js +2 -2
  25. package/dist/commands/import/git.d.ts.map +1 -1
  26. package/dist/commands/import/git.js +15 -5
  27. package/dist/commands/import/git.js.map +1 -1
  28. package/dist/commands/import/github.d.ts.map +1 -1
  29. package/dist/commands/import/github.js +34 -7
  30. package/dist/commands/import/github.js.map +1 -1
  31. package/dist/commands/import/gitlab.d.ts.map +1 -1
  32. package/dist/commands/import/gitlab.js +10 -5
  33. package/dist/commands/import/gitlab.js.map +1 -1
  34. package/dist/commands/import/jira.d.ts.map +1 -1
  35. package/dist/commands/import/jira.js +10 -5
  36. package/dist/commands/import/jira.js.map +1 -1
  37. package/dist/commands/import/linear.d.ts.map +1 -1
  38. package/dist/commands/import/linear.js +10 -5
  39. package/dist/commands/import/linear.js.map +1 -1
  40. package/dist/commands/import/notion.d.ts.map +1 -1
  41. package/dist/commands/import/notion.js +10 -5
  42. package/dist/commands/import/notion.js.map +1 -1
  43. package/dist/commands/import/sessions.js +2 -2
  44. package/dist/commands/import/slack.d.ts.map +1 -1
  45. package/dist/commands/import/slack.js +12 -7
  46. package/dist/commands/import/slack.js.map +1 -1
  47. package/dist/commands/import/teams.d.ts.map +1 -1
  48. package/dist/commands/import/teams.js +10 -5
  49. package/dist/commands/import/teams.js.map +1 -1
  50. package/dist/commands/import/zoom.d.ts.map +1 -1
  51. package/dist/commands/import/zoom.js +10 -5
  52. package/dist/commands/import/zoom.js.map +1 -1
  53. package/dist/commands/import.d.ts.map +1 -1
  54. package/dist/commands/import.js +43 -1
  55. package/dist/commands/import.js.map +1 -1
  56. package/dist/commands/local.d.ts.map +1 -1
  57. package/dist/commands/local.js +76 -4
  58. package/dist/commands/local.js.map +1 -1
  59. package/dist/commands/mark.d.ts +37 -0
  60. package/dist/commands/mark.d.ts.map +1 -0
  61. package/dist/commands/mark.js +105 -0
  62. package/dist/commands/mark.js.map +1 -0
  63. package/dist/commands/mcp.d.ts +141 -2
  64. package/dist/commands/mcp.d.ts.map +1 -1
  65. package/dist/commands/mcp.js +72 -14
  66. package/dist/commands/mcp.js.map +1 -1
  67. package/dist/commands/registry.d.ts.map +1 -1
  68. package/dist/commands/registry.js +12 -2
  69. package/dist/commands/registry.js.map +1 -1
  70. package/dist/commands/setup.d.ts +39 -0
  71. package/dist/commands/setup.d.ts.map +1 -1
  72. package/dist/commands/setup.js +118 -241
  73. package/dist/commands/setup.js.map +1 -1
  74. package/dist/commands/share.d.ts +7 -0
  75. package/dist/commands/share.d.ts.map +1 -0
  76. package/dist/commands/share.js +60 -0
  77. package/dist/commands/share.js.map +1 -0
  78. package/dist/commands/sync.d.ts +55 -0
  79. package/dist/commands/sync.d.ts.map +1 -0
  80. package/dist/commands/sync.js +278 -0
  81. package/dist/commands/sync.js.map +1 -0
  82. package/dist/commands/telemetry.d.ts +3 -3
  83. package/dist/commands/telemetry.js +6 -6
  84. package/dist/commands/telemetry.js.map +1 -1
  85. package/dist/commands/why.d.ts.map +1 -1
  86. package/dist/commands/why.js +27 -1
  87. package/dist/commands/why.js.map +1 -1
  88. package/dist/index.d.ts +3 -1
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +3 -0
  91. package/dist/index.js.map +1 -1
  92. package/dist/lib/ask-key-offer.d.ts +38 -0
  93. package/dist/lib/ask-key-offer.d.ts.map +1 -0
  94. package/dist/lib/ask-key-offer.js +130 -0
  95. package/dist/lib/ask-key-offer.js.map +1 -0
  96. package/dist/lib/backfill-state.d.ts +116 -0
  97. package/dist/lib/backfill-state.d.ts.map +1 -0
  98. package/dist/lib/backfill-state.js +342 -0
  99. package/dist/lib/backfill-state.js.map +1 -0
  100. package/dist/lib/backup-copy.d.ts +17 -0
  101. package/dist/lib/backup-copy.d.ts.map +1 -0
  102. package/dist/lib/backup-copy.js +13 -0
  103. package/dist/lib/backup-copy.js.map +1 -0
  104. package/dist/lib/capture-report.d.ts +22 -18
  105. package/dist/lib/capture-report.d.ts.map +1 -1
  106. package/dist/lib/capture-report.js +64 -2
  107. package/dist/lib/capture-report.js.map +1 -1
  108. package/dist/lib/config.d.ts +56 -24
  109. package/dist/lib/config.d.ts.map +1 -1
  110. package/dist/lib/config.js +176 -45
  111. package/dist/lib/config.js.map +1 -1
  112. package/dist/lib/confirm-timeout.d.ts +8 -0
  113. package/dist/lib/confirm-timeout.d.ts.map +1 -0
  114. package/dist/lib/confirm-timeout.js +18 -0
  115. package/dist/lib/confirm-timeout.js.map +1 -0
  116. package/dist/lib/curation/check-marks.d.ts +48 -0
  117. package/dist/lib/curation/check-marks.d.ts.map +1 -0
  118. package/dist/lib/curation/check-marks.js +81 -0
  119. package/dist/lib/curation/check-marks.js.map +1 -0
  120. package/dist/lib/curation/guardrail.d.ts +39 -0
  121. package/dist/lib/curation/guardrail.d.ts.map +1 -0
  122. package/dist/lib/curation/guardrail.js +93 -0
  123. package/dist/lib/curation/guardrail.js.map +1 -0
  124. package/dist/lib/curation/judge.d.ts +3 -0
  125. package/dist/lib/curation/judge.d.ts.map +1 -0
  126. package/dist/lib/curation/judge.js +9 -0
  127. package/dist/lib/curation/judge.js.map +1 -0
  128. package/dist/lib/curation/judgements-db.d.ts +96 -0
  129. package/dist/lib/curation/judgements-db.d.ts.map +1 -0
  130. package/dist/lib/curation/judgements-db.js +200 -0
  131. package/dist/lib/curation/judgements-db.js.map +1 -0
  132. package/dist/lib/curation/last-check.d.ts +32 -0
  133. package/dist/lib/curation/last-check.d.ts.map +1 -0
  134. package/dist/lib/curation/last-check.js +81 -0
  135. package/dist/lib/curation/last-check.js.map +1 -0
  136. package/dist/lib/curation/mark.d.ts +76 -0
  137. package/dist/lib/curation/mark.d.ts.map +1 -0
  138. package/dist/lib/curation/mark.js +359 -0
  139. package/dist/lib/curation/mark.js.map +1 -0
  140. package/dist/lib/curation/text.d.ts +6 -0
  141. package/dist/lib/curation/text.d.ts.map +1 -0
  142. package/dist/lib/curation/text.js +35 -0
  143. package/dist/lib/curation/text.js.map +1 -0
  144. package/dist/lib/fetchers/capture.d.ts +49 -2
  145. package/dist/lib/fetchers/capture.d.ts.map +1 -1
  146. package/dist/lib/fetchers/capture.js +7 -1
  147. package/dist/lib/fetchers/capture.js.map +1 -1
  148. package/dist/lib/fetchers/confluence.d.ts +2 -2
  149. package/dist/lib/fetchers/confluence.d.ts.map +1 -1
  150. package/dist/lib/fetchers/confluence.js.map +1 -1
  151. package/dist/lib/fetchers/git.d.ts +1 -0
  152. package/dist/lib/fetchers/git.d.ts.map +1 -1
  153. package/dist/lib/fetchers/git.js +3 -1
  154. package/dist/lib/fetchers/git.js.map +1 -1
  155. package/dist/lib/fetchers/github.d.ts +44 -5
  156. package/dist/lib/fetchers/github.d.ts.map +1 -1
  157. package/dist/lib/fetchers/github.js +122 -5
  158. package/dist/lib/fetchers/github.js.map +1 -1
  159. package/dist/lib/fetchers/gitlab.d.ts +2 -2
  160. package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
  161. package/dist/lib/fetchers/gitlab.js.map +1 -1
  162. package/dist/lib/fetchers/jira.d.ts +2 -2
  163. package/dist/lib/fetchers/jira.d.ts.map +1 -1
  164. package/dist/lib/fetchers/jira.js.map +1 -1
  165. package/dist/lib/fetchers/linear.d.ts +2 -2
  166. package/dist/lib/fetchers/linear.d.ts.map +1 -1
  167. package/dist/lib/fetchers/linear.js.map +1 -1
  168. package/dist/lib/fetchers/notion.d.ts +2 -2
  169. package/dist/lib/fetchers/notion.d.ts.map +1 -1
  170. package/dist/lib/fetchers/notion.js.map +1 -1
  171. package/dist/lib/fetchers/slack.d.ts +2 -3
  172. package/dist/lib/fetchers/slack.d.ts.map +1 -1
  173. package/dist/lib/fetchers/slack.js.map +1 -1
  174. package/dist/lib/fetchers/teams.d.ts +2 -2
  175. package/dist/lib/fetchers/teams.d.ts.map +1 -1
  176. package/dist/lib/fetchers/teams.js.map +1 -1
  177. package/dist/lib/fetchers/zoom.d.ts +2 -2
  178. package/dist/lib/fetchers/zoom.d.ts.map +1 -1
  179. package/dist/lib/fetchers/zoom.js.map +1 -1
  180. package/dist/lib/gateway-client.d.ts +34 -0
  181. package/dist/lib/gateway-client.d.ts.map +1 -1
  182. package/dist/lib/gateway-client.js +19 -1
  183. package/dist/lib/gateway-client.js.map +1 -1
  184. package/dist/lib/github-text.d.ts +3 -0
  185. package/dist/lib/github-text.d.ts.map +1 -0
  186. package/dist/lib/github-text.js +18 -0
  187. package/dist/lib/github-text.js.map +1 -0
  188. package/dist/lib/hook-context.d.ts +10 -0
  189. package/dist/lib/hook-context.d.ts.map +1 -1
  190. package/dist/lib/hook-context.js +14 -0
  191. package/dist/lib/hook-context.js.map +1 -1
  192. package/dist/lib/import-defaults.d.ts +39 -23
  193. package/dist/lib/import-defaults.d.ts.map +1 -1
  194. package/dist/lib/import-defaults.js +28 -26
  195. package/dist/lib/import-defaults.js.map +1 -1
  196. package/dist/lib/launch/adapters/aider.d.ts +17 -0
  197. package/dist/lib/launch/adapters/aider.d.ts.map +1 -0
  198. package/dist/lib/launch/adapters/aider.js +30 -0
  199. package/dist/lib/launch/adapters/aider.js.map +1 -0
  200. package/dist/lib/launch/adapters/amp.d.ts +18 -0
  201. package/dist/lib/launch/adapters/amp.d.ts.map +1 -0
  202. package/dist/lib/launch/adapters/amp.js +29 -0
  203. package/dist/lib/launch/adapters/amp.js.map +1 -0
  204. package/dist/lib/launch/adapters/auggie.d.ts +18 -0
  205. package/dist/lib/launch/adapters/auggie.d.ts.map +1 -0
  206. package/dist/lib/launch/adapters/auggie.js +34 -0
  207. package/dist/lib/launch/adapters/auggie.js.map +1 -0
  208. package/dist/lib/launch/adapters/cline.d.ts +10 -0
  209. package/dist/lib/launch/adapters/cline.d.ts.map +1 -0
  210. package/dist/lib/launch/adapters/cline.js +41 -0
  211. package/dist/lib/launch/adapters/cline.js.map +1 -0
  212. package/dist/lib/launch/adapters/continue.d.ts +22 -0
  213. package/dist/lib/launch/adapters/continue.d.ts.map +1 -0
  214. package/dist/lib/launch/adapters/continue.js +46 -0
  215. package/dist/lib/launch/adapters/continue.js.map +1 -0
  216. package/dist/lib/launch/adapters/droid.d.ts +19 -0
  217. package/dist/lib/launch/adapters/droid.d.ts.map +1 -0
  218. package/dist/lib/launch/adapters/droid.js +38 -0
  219. package/dist/lib/launch/adapters/droid.js.map +1 -0
  220. package/dist/lib/launch/adapters/gemini-cli.d.ts +13 -14
  221. package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -1
  222. package/dist/lib/launch/adapters/gemini-cli.js +38 -53
  223. package/dist/lib/launch/adapters/gemini-cli.js.map +1 -1
  224. package/dist/lib/launch/adapters/goose.d.ts +20 -0
  225. package/dist/lib/launch/adapters/goose.d.ts.map +1 -0
  226. package/dist/lib/launch/adapters/goose.js +47 -0
  227. package/dist/lib/launch/adapters/goose.js.map +1 -0
  228. package/dist/lib/launch/adapters/grok-build.d.ts +16 -0
  229. package/dist/lib/launch/adapters/grok-build.d.ts.map +1 -0
  230. package/dist/lib/launch/adapters/grok-build.js +25 -0
  231. package/dist/lib/launch/adapters/grok-build.js.map +1 -0
  232. package/dist/lib/launch/adapters/kiro.d.ts +17 -0
  233. package/dist/lib/launch/adapters/kiro.d.ts.map +1 -0
  234. package/dist/lib/launch/adapters/kiro.js +25 -0
  235. package/dist/lib/launch/adapters/kiro.js.map +1 -0
  236. package/dist/lib/launch/adapters/notes.d.ts +7 -0
  237. package/dist/lib/launch/adapters/notes.d.ts.map +1 -0
  238. package/dist/lib/launch/adapters/notes.js +5 -0
  239. package/dist/lib/launch/adapters/notes.js.map +1 -0
  240. package/dist/lib/launch/adapters/qwen.d.ts +25 -0
  241. package/dist/lib/launch/adapters/qwen.d.ts.map +1 -0
  242. package/dist/lib/launch/adapters/qwen.js +67 -0
  243. package/dist/lib/launch/adapters/qwen.js.map +1 -0
  244. package/dist/lib/launch/agents.d.ts +6 -1
  245. package/dist/lib/launch/agents.d.ts.map +1 -1
  246. package/dist/lib/launch/agents.js +12 -4
  247. package/dist/lib/launch/agents.js.map +1 -1
  248. package/dist/lib/launch/amp-state.d.ts +21 -0
  249. package/dist/lib/launch/amp-state.d.ts.map +1 -0
  250. package/dist/lib/launch/amp-state.js +61 -0
  251. package/dist/lib/launch/amp-state.js.map +1 -0
  252. package/dist/lib/launch/auggie-state.d.ts +25 -0
  253. package/dist/lib/launch/auggie-state.d.ts.map +1 -0
  254. package/dist/lib/launch/auggie-state.js +74 -0
  255. package/dist/lib/launch/auggie-state.js.map +1 -0
  256. package/dist/lib/launch/cline-state.d.ts +32 -0
  257. package/dist/lib/launch/cline-state.d.ts.map +1 -0
  258. package/dist/lib/launch/cline-state.js +108 -0
  259. package/dist/lib/launch/cline-state.js.map +1 -0
  260. package/dist/lib/launch/config-writes.d.ts +11 -1
  261. package/dist/lib/launch/config-writes.d.ts.map +1 -1
  262. package/dist/lib/launch/config-writes.js +66 -8
  263. package/dist/lib/launch/config-writes.js.map +1 -1
  264. package/dist/lib/launch/continue-state.d.ts +41 -0
  265. package/dist/lib/launch/continue-state.d.ts.map +1 -0
  266. package/dist/lib/launch/continue-state.js +142 -0
  267. package/dist/lib/launch/continue-state.js.map +1 -0
  268. package/dist/lib/launch/detect.d.ts.map +1 -1
  269. package/dist/lib/launch/detect.js +5 -2
  270. package/dist/lib/launch/detect.js.map +1 -1
  271. package/dist/lib/launch/droid-state.d.ts +24 -0
  272. package/dist/lib/launch/droid-state.d.ts.map +1 -0
  273. package/dist/lib/launch/droid-state.js +74 -0
  274. package/dist/lib/launch/droid-state.js.map +1 -0
  275. package/dist/lib/launch/gemini-state.d.ts +26 -20
  276. package/dist/lib/launch/gemini-state.d.ts.map +1 -1
  277. package/dist/lib/launch/gemini-state.js +95 -37
  278. package/dist/lib/launch/gemini-state.js.map +1 -1
  279. package/dist/lib/launch/gemini-system-file.d.ts +17 -0
  280. package/dist/lib/launch/gemini-system-file.d.ts.map +1 -0
  281. package/dist/lib/launch/gemini-system-file.js +55 -0
  282. package/dist/lib/launch/gemini-system-file.js.map +1 -0
  283. package/dist/lib/launch/gemini-trust.d.ts +3 -1
  284. package/dist/lib/launch/gemini-trust.d.ts.map +1 -1
  285. package/dist/lib/launch/gemini-trust.js +10 -3
  286. package/dist/lib/launch/gemini-trust.js.map +1 -1
  287. package/dist/lib/launch/goose-state.d.ts +53 -0
  288. package/dist/lib/launch/goose-state.d.ts.map +1 -0
  289. package/dist/lib/launch/goose-state.js +137 -0
  290. package/dist/lib/launch/goose-state.js.map +1 -0
  291. package/dist/lib/launch/grok-state.d.ts +42 -0
  292. package/dist/lib/launch/grok-state.d.ts.map +1 -0
  293. package/dist/lib/launch/grok-state.js +128 -0
  294. package/dist/lib/launch/grok-state.js.map +1 -0
  295. package/dist/lib/launch/kiro-state.d.ts +22 -0
  296. package/dist/lib/launch/kiro-state.d.ts.map +1 -0
  297. package/dist/lib/launch/kiro-state.js +59 -0
  298. package/dist/lib/launch/kiro-state.js.map +1 -0
  299. package/dist/lib/launch/launch-files.d.ts.map +1 -1
  300. package/dist/lib/launch/launch-files.js +3 -2
  301. package/dist/lib/launch/launch-files.js.map +1 -1
  302. package/dist/lib/launch/launch.d.ts +51 -2
  303. package/dist/lib/launch/launch.d.ts.map +1 -1
  304. package/dist/lib/launch/launch.js +70 -6
  305. package/dist/lib/launch/launch.js.map +1 -1
  306. package/dist/lib/launch/layer-files.d.ts +12 -0
  307. package/dist/lib/launch/layer-files.d.ts.map +1 -0
  308. package/dist/lib/launch/layer-files.js +43 -0
  309. package/dist/lib/launch/layer-files.js.map +1 -0
  310. package/dist/lib/launch/mcp-child-env.d.ts +30 -0
  311. package/dist/lib/launch/mcp-child-env.d.ts.map +1 -0
  312. package/dist/lib/launch/mcp-child-env.js +151 -0
  313. package/dist/lib/launch/mcp-child-env.js.map +1 -0
  314. package/dist/lib/launch/pick-agent.d.ts.map +1 -1
  315. package/dist/lib/launch/pick-agent.js +7 -6
  316. package/dist/lib/launch/pick-agent.js.map +1 -1
  317. package/dist/lib/launch/picker-options.d.ts.map +1 -1
  318. package/dist/lib/launch/picker-options.js +7 -2
  319. package/dist/lib/launch/picker-options.js.map +1 -1
  320. package/dist/lib/launch/qwen-state.d.ts +30 -0
  321. package/dist/lib/launch/qwen-state.d.ts.map +1 -0
  322. package/dist/lib/launch/qwen-state.js +57 -0
  323. package/dist/lib/launch/qwen-state.js.map +1 -0
  324. package/dist/lib/launch/qwen-trust.d.ts +24 -0
  325. package/dist/lib/launch/qwen-trust.d.ts.map +1 -0
  326. package/dist/lib/launch/qwen-trust.js +100 -0
  327. package/dist/lib/launch/qwen-trust.js.map +1 -0
  328. package/dist/lib/launch/registry/agents/aider.d.ts +3 -0
  329. package/dist/lib/launch/registry/agents/aider.d.ts.map +1 -0
  330. package/dist/lib/launch/registry/agents/aider.js +13 -0
  331. package/dist/lib/launch/registry/agents/aider.js.map +1 -0
  332. package/dist/lib/launch/registry/agents/amp.d.ts +3 -0
  333. package/dist/lib/launch/registry/agents/amp.d.ts.map +1 -0
  334. package/dist/lib/launch/registry/agents/amp.js +14 -0
  335. package/dist/lib/launch/registry/agents/amp.js.map +1 -0
  336. package/dist/lib/launch/registry/agents/auggie.d.ts +3 -0
  337. package/dist/lib/launch/registry/agents/auggie.d.ts.map +1 -0
  338. package/dist/lib/launch/registry/agents/auggie.js +11 -0
  339. package/dist/lib/launch/registry/agents/auggie.js.map +1 -0
  340. package/dist/lib/launch/registry/agents/cline.d.ts +3 -0
  341. package/dist/lib/launch/registry/agents/cline.d.ts.map +1 -0
  342. package/dist/lib/launch/registry/agents/cline.js +19 -0
  343. package/dist/lib/launch/registry/agents/cline.js.map +1 -0
  344. package/dist/lib/launch/registry/agents/continue.d.ts +3 -0
  345. package/dist/lib/launch/registry/agents/continue.d.ts.map +1 -0
  346. package/dist/lib/launch/registry/agents/continue.js +20 -0
  347. package/dist/lib/launch/registry/agents/continue.js.map +1 -0
  348. package/dist/lib/launch/registry/agents/droid.d.ts +3 -0
  349. package/dist/lib/launch/registry/agents/droid.d.ts.map +1 -0
  350. package/dist/lib/launch/registry/agents/droid.js +13 -0
  351. package/dist/lib/launch/registry/agents/droid.js.map +1 -0
  352. package/dist/lib/launch/registry/agents/gemini-cli.js +2 -2
  353. package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
  354. package/dist/lib/launch/registry/agents/goose.d.ts +3 -0
  355. package/dist/lib/launch/registry/agents/goose.d.ts.map +1 -0
  356. package/dist/lib/launch/registry/agents/goose.js +20 -0
  357. package/dist/lib/launch/registry/agents/goose.js.map +1 -0
  358. package/dist/lib/launch/registry/agents/grok-build.d.ts +3 -0
  359. package/dist/lib/launch/registry/agents/grok-build.d.ts.map +1 -0
  360. package/dist/lib/launch/registry/agents/grok-build.js +14 -0
  361. package/dist/lib/launch/registry/agents/grok-build.js.map +1 -0
  362. package/dist/lib/launch/registry/agents/kiro.d.ts +3 -0
  363. package/dist/lib/launch/registry/agents/kiro.d.ts.map +1 -0
  364. package/dist/lib/launch/registry/agents/kiro.js +11 -0
  365. package/dist/lib/launch/registry/agents/kiro.js.map +1 -0
  366. package/dist/lib/launch/registry/agents/qwen.d.ts +3 -0
  367. package/dist/lib/launch/registry/agents/qwen.d.ts.map +1 -0
  368. package/dist/lib/launch/registry/agents/qwen.js +11 -0
  369. package/dist/lib/launch/registry/agents/qwen.js.map +1 -0
  370. package/dist/lib/launch/registry/index.d.ts +4 -1
  371. package/dist/lib/launch/registry/index.d.ts.map +1 -1
  372. package/dist/lib/launch/registry/index.js +15 -2
  373. package/dist/lib/launch/registry/index.js.map +1 -1
  374. package/dist/lib/launch/registry/types.d.ts +17 -1
  375. package/dist/lib/launch/registry/types.d.ts.map +1 -1
  376. package/dist/lib/launch/run-agent.d.ts +11 -0
  377. package/dist/lib/launch/run-agent.d.ts.map +1 -1
  378. package/dist/lib/launch/run-agent.js +22 -1
  379. package/dist/lib/launch/run-agent.js.map +1 -1
  380. package/dist/lib/launch/strict-entry.d.ts +22 -2
  381. package/dist/lib/launch/strict-entry.d.ts.map +1 -1
  382. package/dist/lib/launch/strict-entry.js +82 -2
  383. package/dist/lib/launch/strict-entry.js.map +1 -1
  384. package/dist/lib/launch/yaml-scan.d.ts +59 -0
  385. package/dist/lib/launch/yaml-scan.d.ts.map +1 -0
  386. package/dist/lib/launch/yaml-scan.js +275 -0
  387. package/dist/lib/launch/yaml-scan.js.map +1 -0
  388. package/dist/lib/llm-providers.d.ts +66 -0
  389. package/dist/lib/llm-providers.d.ts.map +1 -0
  390. package/dist/lib/llm-providers.js +150 -0
  391. package/dist/lib/llm-providers.js.map +1 -0
  392. package/dist/lib/local-db-epoch.d.ts +4 -0
  393. package/dist/lib/local-db-epoch.d.ts.map +1 -0
  394. package/dist/lib/local-db-epoch.js +19 -0
  395. package/dist/lib/local-db-epoch.js.map +1 -0
  396. package/dist/lib/local-db-migrate.d.ts +85 -0
  397. package/dist/lib/local-db-migrate.d.ts.map +1 -0
  398. package/dist/lib/local-db-migrate.js +484 -0
  399. package/dist/lib/local-db-migrate.js.map +1 -0
  400. package/dist/lib/local-db-v10.d.ts +28 -0
  401. package/dist/lib/local-db-v10.d.ts.map +1 -0
  402. package/dist/lib/local-db-v10.js +49 -0
  403. package/dist/lib/local-db-v10.js.map +1 -0
  404. package/dist/lib/local-db-v11.d.ts +24 -0
  405. package/dist/lib/local-db-v11.d.ts.map +1 -0
  406. package/dist/lib/local-db-v11.js +25 -0
  407. package/dist/lib/local-db-v11.js.map +1 -0
  408. package/dist/lib/local-db-v7.d.ts +30 -0
  409. package/dist/lib/local-db-v7.d.ts.map +1 -0
  410. package/dist/lib/local-db-v7.js +285 -0
  411. package/dist/lib/local-db-v7.js.map +1 -0
  412. package/dist/lib/local-db-v8.d.ts +22 -0
  413. package/dist/lib/local-db-v8.d.ts.map +1 -0
  414. package/dist/lib/local-db-v8.js +33 -0
  415. package/dist/lib/local-db-v8.js.map +1 -0
  416. package/dist/lib/local-db-v9.d.ts +10 -0
  417. package/dist/lib/local-db-v9.d.ts.map +1 -0
  418. package/dist/lib/local-db-v9.js +8 -0
  419. package/dist/lib/local-db-v9.js.map +1 -0
  420. package/dist/lib/local-db.d.ts +61 -11
  421. package/dist/lib/local-db.d.ts.map +1 -1
  422. package/dist/lib/local-db.js +186 -371
  423. package/dist/lib/local-db.js.map +1 -1
  424. package/dist/lib/local-embeddings.d.ts.map +1 -1
  425. package/dist/lib/local-embeddings.js +2 -2
  426. package/dist/lib/local-embeddings.js.map +1 -1
  427. package/dist/lib/local-gateway-client.d.ts +30 -87
  428. package/dist/lib/local-gateway-client.d.ts.map +1 -1
  429. package/dist/lib/local-gateway-client.js +182 -171
  430. package/dist/lib/local-gateway-client.js.map +1 -1
  431. package/dist/lib/local-ingest.d.ts +129 -0
  432. package/dist/lib/local-ingest.d.ts.map +1 -0
  433. package/dist/lib/local-ingest.js +81 -0
  434. package/dist/lib/local-ingest.js.map +1 -0
  435. package/dist/lib/local-link-pass.d.ts +15 -0
  436. package/dist/lib/local-link-pass.d.ts.map +1 -0
  437. package/dist/lib/local-link-pass.js +61 -0
  438. package/dist/lib/local-link-pass.js.map +1 -0
  439. package/dist/lib/local-llm.d.ts +63 -12
  440. package/dist/lib/local-llm.d.ts.map +1 -1
  441. package/dist/lib/local-llm.js +229 -104
  442. package/dist/lib/local-llm.js.map +1 -1
  443. package/dist/lib/local-mode.d.ts +4 -1
  444. package/dist/lib/local-mode.d.ts.map +1 -1
  445. package/dist/lib/local-mode.js +16 -1
  446. package/dist/lib/local-mode.js.map +1 -1
  447. package/dist/lib/local-provenance.d.ts +14 -0
  448. package/dist/lib/local-provenance.d.ts.map +1 -0
  449. package/dist/lib/local-provenance.js +14 -0
  450. package/dist/lib/local-provenance.js.map +1 -0
  451. package/dist/lib/local-thresholds.d.ts +70 -0
  452. package/dist/lib/local-thresholds.d.ts.map +1 -0
  453. package/dist/lib/local-thresholds.js +79 -0
  454. package/dist/lib/local-thresholds.js.map +1 -0
  455. package/dist/lib/mcp/mark-tool.d.ts +27 -0
  456. package/dist/lib/mcp/mark-tool.d.ts.map +1 -0
  457. package/dist/lib/mcp/mark-tool.js +103 -0
  458. package/dist/lib/mcp/mark-tool.js.map +1 -0
  459. package/dist/lib/mcp/share-tool.d.ts +46 -0
  460. package/dist/lib/mcp/share-tool.d.ts.map +1 -0
  461. package/dist/lib/mcp/share-tool.js +68 -0
  462. package/dist/lib/mcp/share-tool.js.map +1 -0
  463. package/dist/lib/mcp/tool-rules.d.ts +30 -0
  464. package/dist/lib/mcp/tool-rules.d.ts.map +1 -0
  465. package/dist/lib/mcp/tool-rules.js +84 -0
  466. package/dist/lib/mcp/tool-rules.js.map +1 -0
  467. package/dist/lib/mcp-backfill.d.ts +89 -0
  468. package/dist/lib/mcp-backfill.d.ts.map +1 -0
  469. package/dist/lib/mcp-backfill.js +194 -0
  470. package/dist/lib/mcp-backfill.js.map +1 -0
  471. package/dist/lib/mcp-scope.d.ts +90 -0
  472. package/dist/lib/mcp-scope.d.ts.map +1 -0
  473. package/dist/lib/mcp-scope.js +125 -0
  474. package/dist/lib/mcp-scope.js.map +1 -0
  475. package/dist/lib/mcp-sync.d.ts +64 -0
  476. package/dist/lib/mcp-sync.d.ts.map +1 -0
  477. package/dist/lib/mcp-sync.js +183 -0
  478. package/dist/lib/mcp-sync.js.map +1 -0
  479. package/dist/lib/personal-import.d.ts +7 -0
  480. package/dist/lib/personal-import.d.ts.map +1 -1
  481. package/dist/lib/personal-import.js +13 -1
  482. package/dist/lib/personal-import.js.map +1 -1
  483. package/dist/lib/safe-config-write.d.ts +12 -1
  484. package/dist/lib/safe-config-write.d.ts.map +1 -1
  485. package/dist/lib/safe-config-write.js +162 -9
  486. package/dist/lib/safe-config-write.js.map +1 -1
  487. package/dist/lib/scope-choices.d.ts +51 -0
  488. package/dist/lib/scope-choices.d.ts.map +1 -0
  489. package/dist/lib/scope-choices.js +193 -0
  490. package/dist/lib/scope-choices.js.map +1 -0
  491. package/dist/lib/scope-connect.d.ts +82 -0
  492. package/dist/lib/scope-connect.d.ts.map +1 -0
  493. package/dist/lib/scope-connect.js +258 -0
  494. package/dist/lib/scope-connect.js.map +1 -0
  495. package/dist/lib/scope-defaults.d.ts +3 -0
  496. package/dist/lib/scope-defaults.d.ts.map +1 -0
  497. package/dist/lib/scope-defaults.js +42 -0
  498. package/dist/lib/scope-defaults.js.map +1 -0
  499. package/dist/lib/scope-real.d.ts +223 -0
  500. package/dist/lib/scope-real.d.ts.map +1 -0
  501. package/dist/lib/scope-real.js +58 -0
  502. package/dist/lib/scope-real.js.map +1 -0
  503. package/dist/lib/scope-values.d.ts +76 -0
  504. package/dist/lib/scope-values.d.ts.map +1 -0
  505. package/dist/lib/scope-values.js +169 -0
  506. package/dist/lib/scope-values.js.map +1 -0
  507. package/dist/lib/scope.d.ts +161 -0
  508. package/dist/lib/scope.d.ts.map +1 -0
  509. package/dist/lib/scope.js +323 -0
  510. package/dist/lib/scope.js.map +1 -0
  511. package/dist/lib/share/command.d.ts +32 -0
  512. package/dist/lib/share/command.d.ts.map +1 -0
  513. package/dist/lib/share/command.js +136 -0
  514. package/dist/lib/share/command.js.map +1 -0
  515. package/dist/lib/share/ledger.d.ts +59 -0
  516. package/dist/lib/share/ledger.d.ts.map +1 -0
  517. package/dist/lib/share/ledger.js +135 -0
  518. package/dist/lib/share/ledger.js.map +1 -0
  519. package/dist/lib/share/payload.d.ts +92 -0
  520. package/dist/lib/share/payload.d.ts.map +1 -0
  521. package/dist/lib/share/payload.js +138 -0
  522. package/dist/lib/share/payload.js.map +1 -0
  523. package/dist/lib/share/pending.d.ts +48 -0
  524. package/dist/lib/share/pending.d.ts.map +1 -0
  525. package/dist/lib/share/pending.js +130 -0
  526. package/dist/lib/share/pending.js.map +1 -0
  527. package/dist/lib/share/preview.d.ts +18 -0
  528. package/dist/lib/share/preview.d.ts.map +1 -0
  529. package/dist/lib/share/preview.js +72 -0
  530. package/dist/lib/share/preview.js.map +1 -0
  531. package/dist/lib/share/run.d.ts +115 -0
  532. package/dist/lib/share/run.d.ts.map +1 -0
  533. package/dist/lib/share/run.js +261 -0
  534. package/dist/lib/share/run.js.map +1 -0
  535. package/dist/lib/share/salt.d.ts +2 -0
  536. package/dist/lib/share/salt.d.ts.map +1 -0
  537. package/dist/lib/share/salt.js +44 -0
  538. package/dist/lib/share/salt.js.map +1 -0
  539. package/dist/lib/share/secret-patterns.json +100 -0
  540. package/dist/lib/share/secret-scan.d.ts +19 -0
  541. package/dist/lib/share/secret-scan.d.ts.map +1 -0
  542. package/dist/lib/share/secret-scan.js +75 -0
  543. package/dist/lib/share/secret-scan.js.map +1 -0
  544. package/dist/lib/share/tty.d.ts +4 -0
  545. package/dist/lib/share/tty.d.ts.map +1 -0
  546. package/dist/lib/share/tty.js +57 -0
  547. package/dist/lib/share/tty.js.map +1 -0
  548. package/dist/lib/share/visible.d.ts +4 -0
  549. package/dist/lib/share/visible.d.ts.map +1 -0
  550. package/dist/lib/share/visible.js +30 -0
  551. package/dist/lib/share/visible.js.map +1 -0
  552. package/dist/lib/share/wire.d.ts +98 -0
  553. package/dist/lib/share/wire.d.ts.map +1 -0
  554. package/dist/lib/share/wire.js +43 -0
  555. package/dist/lib/share/wire.js.map +1 -0
  556. package/dist/lib/similarity/embedding-matrix.d.ts +64 -0
  557. package/dist/lib/similarity/embedding-matrix.d.ts.map +1 -0
  558. package/dist/lib/similarity/embedding-matrix.js +119 -0
  559. package/dist/lib/similarity/embedding-matrix.js.map +1 -0
  560. package/dist/lib/since-flag.d.ts +11 -0
  561. package/dist/lib/since-flag.d.ts.map +1 -0
  562. package/dist/lib/since-flag.js +24 -0
  563. package/dist/lib/since-flag.js.map +1 -0
  564. package/dist/lib/since.d.ts +59 -0
  565. package/dist/lib/since.d.ts.map +1 -0
  566. package/dist/lib/since.js +86 -0
  567. package/dist/lib/since.js.map +1 -0
  568. package/dist/lib/source-key.d.ts +13 -0
  569. package/dist/lib/source-key.d.ts.map +1 -0
  570. package/dist/lib/source-key.js +60 -0
  571. package/dist/lib/source-key.js.map +1 -0
  572. package/dist/lib/source-sync-state.d.ts +12 -0
  573. package/dist/lib/source-sync-state.d.ts.map +1 -0
  574. package/dist/lib/source-sync-state.js +43 -0
  575. package/dist/lib/source-sync-state.js.map +1 -0
  576. package/dist/lib/startup-backfill-track.d.ts +2 -0
  577. package/dist/lib/startup-backfill-track.d.ts.map +1 -0
  578. package/dist/lib/startup-backfill-track.js +6 -0
  579. package/dist/lib/startup-backfill-track.js.map +1 -0
  580. package/dist/lib/startup-env.d.ts +8 -0
  581. package/dist/lib/startup-env.d.ts.map +1 -0
  582. package/dist/lib/startup-env.js +8 -0
  583. package/dist/lib/startup-env.js.map +1 -0
  584. package/dist/lib/startup-xdg.d.ts +2 -0
  585. package/dist/lib/startup-xdg.d.ts.map +1 -0
  586. package/dist/lib/startup-xdg.js +9 -0
  587. package/dist/lib/startup-xdg.js.map +1 -0
  588. package/dist/lib/sync/after-connect.d.ts +2 -0
  589. package/dist/lib/sync/after-connect.d.ts.map +1 -0
  590. package/dist/lib/sync/after-connect.js +18 -0
  591. package/dist/lib/sync/after-connect.js.map +1 -0
  592. package/dist/lib/sync/bg-claim.d.ts +14 -0
  593. package/dist/lib/sync/bg-claim.d.ts.map +1 -0
  594. package/dist/lib/sync/bg-claim.js +97 -0
  595. package/dist/lib/sync/bg-claim.js.map +1 -0
  596. package/dist/lib/sync/blocked.d.ts +8 -0
  597. package/dist/lib/sync/blocked.d.ts.map +1 -0
  598. package/dist/lib/sync/blocked.js +44 -0
  599. package/dist/lib/sync/blocked.js.map +1 -0
  600. package/dist/lib/sync/classify.d.ts +34 -0
  601. package/dist/lib/sync/classify.d.ts.map +1 -0
  602. package/dist/lib/sync/classify.js +91 -0
  603. package/dist/lib/sync/classify.js.map +1 -0
  604. package/dist/lib/sync/drain.d.ts +16 -0
  605. package/dist/lib/sync/drain.d.ts.map +1 -0
  606. package/dist/lib/sync/drain.js +33 -0
  607. package/dist/lib/sync/drain.js.map +1 -0
  608. package/dist/lib/sync/forget.d.ts +12 -0
  609. package/dist/lib/sync/forget.d.ts.map +1 -0
  610. package/dist/lib/sync/forget.js +32 -0
  611. package/dist/lib/sync/forget.js.map +1 -0
  612. package/dist/lib/sync/launch-hook.d.ts +42 -0
  613. package/dist/lib/sync/launch-hook.d.ts.map +1 -0
  614. package/dist/lib/sync/launch-hook.js +117 -0
  615. package/dist/lib/sync/launch-hook.js.map +1 -0
  616. package/dist/lib/sync/lock.d.ts +35 -0
  617. package/dist/lib/sync/lock.d.ts.map +1 -0
  618. package/dist/lib/sync/lock.js +175 -0
  619. package/dist/lib/sync/lock.js.map +1 -0
  620. package/dist/lib/sync/purge.d.ts +38 -0
  621. package/dist/lib/sync/purge.d.ts.map +1 -0
  622. package/dist/lib/sync/purge.js +61 -0
  623. package/dist/lib/sync/purge.js.map +1 -0
  624. package/dist/lib/sync/real-env.d.ts +208 -0
  625. package/dist/lib/sync/real-env.d.ts.map +1 -0
  626. package/dist/lib/sync/real-env.js +47 -0
  627. package/dist/lib/sync/real-env.js.map +1 -0
  628. package/dist/lib/sync/relink.d.ts +14 -0
  629. package/dist/lib/sync/relink.d.ts.map +1 -0
  630. package/dist/lib/sync/relink.js +36 -0
  631. package/dist/lib/sync/relink.js.map +1 -0
  632. package/dist/lib/sync/report.d.ts +3 -0
  633. package/dist/lib/sync/report.d.ts.map +1 -0
  634. package/dist/lib/sync/report.js +54 -0
  635. package/dist/lib/sync/report.js.map +1 -0
  636. package/dist/lib/sync/run-all.d.ts +23 -0
  637. package/dist/lib/sync/run-all.d.ts.map +1 -0
  638. package/dist/lib/sync/run-all.js +30 -0
  639. package/dist/lib/sync/run-all.js.map +1 -0
  640. package/dist/lib/sync/run-source.d.ts +73 -0
  641. package/dist/lib/sync/run-source.d.ts.map +1 -0
  642. package/dist/lib/sync/run-source.js +262 -0
  643. package/dist/lib/sync/run-source.js.map +1 -0
  644. package/dist/lib/sync/safe-read.d.ts +4 -0
  645. package/dist/lib/sync/safe-read.d.ts.map +1 -0
  646. package/dist/lib/sync/safe-read.js +40 -0
  647. package/dist/lib/sync/safe-read.js.map +1 -0
  648. package/dist/lib/sync/should-background-sync.d.ts +31 -0
  649. package/dist/lib/sync/should-background-sync.d.ts.map +1 -0
  650. package/dist/lib/sync/should-background-sync.js +69 -0
  651. package/dist/lib/sync/should-background-sync.js.map +1 -0
  652. package/dist/lib/sync/source-ids.d.ts +10 -0
  653. package/dist/lib/sync/source-ids.d.ts.map +1 -0
  654. package/dist/lib/sync/source-ids.js +9 -0
  655. package/dist/lib/sync/source-ids.js.map +1 -0
  656. package/dist/lib/sync/sources.d.ts +33 -0
  657. package/dist/lib/sync/sources.d.ts.map +1 -0
  658. package/dist/lib/sync/sources.js +37 -0
  659. package/dist/lib/sync/sources.js.map +1 -0
  660. package/dist/lib/sync/spawn-background.d.ts +27 -0
  661. package/dist/lib/sync/spawn-background.d.ts.map +1 -0
  662. package/dist/lib/sync/spawn-background.js +66 -0
  663. package/dist/lib/sync/spawn-background.js.map +1 -0
  664. package/dist/lib/sync/status.d.ts +57 -0
  665. package/dist/lib/sync/status.d.ts.map +1 -0
  666. package/dist/lib/sync/status.js +166 -0
  667. package/dist/lib/sync/status.js.map +1 -0
  668. package/dist/lib/sync/summary-read.d.ts +19 -0
  669. package/dist/lib/sync/summary-read.d.ts.map +1 -0
  670. package/dist/lib/sync/summary-read.js +39 -0
  671. package/dist/lib/sync/summary-read.js.map +1 -0
  672. package/dist/lib/sync/summary.d.ts +10 -0
  673. package/dist/lib/sync/summary.d.ts.map +1 -0
  674. package/dist/lib/sync/summary.js +80 -0
  675. package/dist/lib/sync/summary.js.map +1 -0
  676. package/dist/lib/sync/sync-state.d.ts +128 -0
  677. package/dist/lib/sync/sync-state.d.ts.map +1 -0
  678. package/dist/lib/sync/sync-state.js +253 -0
  679. package/dist/lib/sync/sync-state.js.map +1 -0
  680. package/dist/lib/sync/telemetry.d.ts +20 -0
  681. package/dist/lib/sync/telemetry.d.ts.map +1 -0
  682. package/dist/lib/sync/telemetry.js +31 -0
  683. package/dist/lib/sync/telemetry.js.map +1 -0
  684. package/dist/lib/sync/threads.d.ts +48 -0
  685. package/dist/lib/sync/threads.d.ts.map +1 -0
  686. package/dist/lib/sync/threads.js +82 -0
  687. package/dist/lib/sync/threads.js.map +1 -0
  688. package/dist/lib/sync/window.d.ts +72 -0
  689. package/dist/lib/sync/window.d.ts.map +1 -0
  690. package/dist/lib/sync/window.js +112 -0
  691. package/dist/lib/sync/window.js.map +1 -0
  692. package/dist/lib/team-cta.d.ts +11 -0
  693. package/dist/lib/team-cta.d.ts.map +1 -0
  694. package/dist/lib/team-cta.js +16 -0
  695. package/dist/lib/team-cta.js.map +1 -0
  696. package/dist/lib/telemetry-ci.d.ts +2 -0
  697. package/dist/lib/telemetry-ci.d.ts.map +1 -0
  698. package/dist/lib/telemetry-ci.js +21 -0
  699. package/dist/lib/telemetry-ci.js.map +1 -0
  700. package/dist/lib/telemetry-consent.d.ts +44 -23
  701. package/dist/lib/telemetry-consent.d.ts.map +1 -1
  702. package/dist/lib/telemetry-consent.js +74 -35
  703. package/dist/lib/telemetry-consent.js.map +1 -1
  704. package/dist/lib/telemetry-env.d.ts +1 -1
  705. package/dist/lib/usage-telemetry.d.ts +87 -22
  706. package/dist/lib/usage-telemetry.d.ts.map +1 -1
  707. package/dist/lib/usage-telemetry.js +263 -74
  708. package/dist/lib/usage-telemetry.js.map +1 -1
  709. package/dist/lib/xdg.d.ts +27 -0
  710. package/dist/lib/xdg.d.ts.map +1 -0
  711. package/dist/lib/xdg.js +56 -0
  712. package/dist/lib/xdg.js.map +1 -0
  713. package/package.json +3 -2
  714. package/dist/commands/push.d.ts +0 -25
  715. package/dist/commands/push.d.ts.map +0 -1
  716. package/dist/commands/push.js +0 -98
  717. package/dist/commands/push.js.map +0 -1
@@ -0,0 +1,93 @@
1
+ /**
2
+ * LM: how the local guardrail reads this person's marks. Pure reads of `local_judgements`; the
3
+ * client calls these and keeps its own flow.
4
+ *
5
+ * Fail direction: with no judge, no judgement rows, or a pre-v7 file, every function returns its
6
+ * input unchanged - a mark can only HIDE or ANNOTATE what the guardrail found, so the absence of
7
+ * marks leaves the guardrail exactly as strict as it was.
8
+ *
9
+ * A false verdict hides a hit ONLY for the file set it was given (Decision 28): suppressing a
10
+ * decision everywhere because it misfired once would hide real conflicts.
11
+ */
12
+ import fs from 'node:fs';
13
+ import { DatabaseSync } from 'node:sqlite';
14
+ import { checkVerdictFor, pairVerdictsFor, supersedeMarkFor } from './judgements-db.js';
15
+ import { agentLabel, hasUnsafeChars, quote } from './text.js';
16
+ /** Whether the file holds any judgement at all: lets the common no-marks path skip identity lookup entirely. */
17
+ export function anyJudgements(dbPath) {
18
+ if (dbPath === '' || !fs.existsSync(dbPath))
19
+ return false;
20
+ const db = new DatabaseSync(dbPath);
21
+ try {
22
+ db.exec('PRAGMA busy_timeout = 30000');
23
+ return db.prepare('SELECT 1 AS x FROM local_judgements LIMIT 1').get() !== undefined;
24
+ }
25
+ catch (e) {
26
+ if (/no such table/i.test(e.message))
27
+ return false;
28
+ throw e;
29
+ }
30
+ finally {
31
+ db.close();
32
+ }
33
+ }
34
+ const day = (iso) => iso.slice(0, 10);
35
+ /** Who made a mark, in words. A mark an agent relayed is always said so: a hit hidden by an agent is never invisible. */
36
+ export const byWhom = (agentId) => (agentId === null ? 'you' : `${agentLabel(agentId)} via MCP`);
37
+ /** Drop hits this judge marked false for exactly this file set; annotate hits they marked false for another set. */
38
+ export function reviewConflicts(dbPath, judgeId, conflicts, contextKey, files = []) {
39
+ const kept = [];
40
+ const notes = [];
41
+ const agentApplied = [];
42
+ // No key (no files, too many, an unnameable path): no file-set mark can apply, in either direction.
43
+ if (contextKey === null)
44
+ return { conflicts, notes, agentApplied };
45
+ for (const c of conflicts) {
46
+ const v = checkVerdictFor(dbPath, judgeId, c.decision_id, contextKey);
47
+ if (v.here?.value === 'false') {
48
+ notes.push(`${quote(c.title)} is hidden: marked false by ${byWhom(v.here.agent_id)} for this set of files on ${day(v.here.judged_at)}. Show it again with: align mark check ${c.decision_id} real --files ${shellFiles(files)}`);
49
+ if (v.here.agent_id !== null)
50
+ agentApplied.push(v.here.judged_at);
51
+ continue;
52
+ }
53
+ if (v.elsewhereFalse && v.here === null) {
54
+ const note = v.elsewhereFalse.agent_id === null
55
+ ? `you marked this a false alarm once, on ${day(v.elsewhereFalse.judged_at)}, for a different set of files; it still shows here`
56
+ : `marked false by ${byWhom(v.elsewhereFalse.agent_id)} once, on ${day(v.elsewhereFalse.judged_at)}, for a different set of files; it still shows here`;
57
+ notes.push(`${quote(c.title)}: ${note}.`);
58
+ kept.push({ ...c, note });
59
+ continue;
60
+ }
61
+ kept.push(c);
62
+ }
63
+ return { conflicts: kept, notes, agentApplied };
64
+ }
65
+ /** Stored conflict links, each annotated when this judge marked the pair (either id order). One read for the whole list. */
66
+ export function annotatePairs(dbPath, judgeId, links) {
67
+ const verdicts = pairVerdictsFor(dbPath, judgeId);
68
+ return links.map((l) => {
69
+ const v = verdicts.get(l.sourceId < l.targetId ? `${l.sourceId}|${l.targetId}` : `${l.targetId}|${l.sourceId}`);
70
+ if (!v)
71
+ return l;
72
+ const who = v.agent_id === null ? 'you' : `${v.agent_id} via MCP`;
73
+ const note = v.value === 'false' ? `marked false alarm by ${who} on ${day(v.judged_at)}` : `marked a real conflict by ${who} on ${day(v.judged_at)}`;
74
+ return { ...l, marked_by_you: { verdict: v.value, judged_at: v.judged_at, note } };
75
+ });
76
+ }
77
+ /** File paths as arguments a shell reads back as the same list: each one single-quoted. */
78
+ export function shellFiles(files) {
79
+ return files.map((f) => (/^[A-Za-z0-9_@%+=:,./-]+$/.test(f) ? f : hasUnsafeChars(f) ? quote(f) : `'${f.replace(/'/g, `'\\''`)}'`)).join(' ');
80
+ }
81
+ /** One line per retrieved decision a mark kept out of this check, naming who marked it and when. */
82
+ export function droppedNote(title, meta, scope = 'check') {
83
+ return `${quote(title)} was left out of this ${scope}: marked not a decision by ${byWhom(meta.agent_id)} on ${day(meta.judged_at)}.`;
84
+ }
85
+ export function hiddenSummary(n) {
86
+ return `${n} related decision${n === 1 ? ' is' : 's are'} hidden by your marks (run \`align mark --list\`)`;
87
+ }
88
+ /** A supersede mark: the older decision is named as replaced, by whom and when. Only for a replacement this judge recorded. */
89
+ export function supersedeNote(dbPath, judgeId, olderId, olderTitle, newerTitle) {
90
+ const m = supersedeMarkFor(dbPath, judgeId, olderId);
91
+ return m ? { note: `${quote(olderTitle)} is superseded by ${quote(newerTitle)}: marked by ${byWhom(m.agent_id)} on ${day(m.judged_at)}.`, agentJudgedAt: m.agent_id === null ? null : m.judged_at } : null;
92
+ }
93
+ //# sourceMappingURL=guardrail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrail.js","sourceRoot":"","sources":["../../../src/lib/curation/guardrail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Judge } from './judgements-db.js';
2
+ export declare function defaultJudge(): Promise<Judge>;
3
+ //# sourceMappingURL=judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../../src/lib/curation/judge.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,wBAAsB,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,CAInD"}
@@ -0,0 +1,9 @@
1
+ /** LM: who "I" am on this machine - the install id the CLI keeps for telemetry (one identity, one writer) and the git email, if any. */
2
+ import { createConfigStore } from '../config.js';
3
+ import { getGitIdentities } from '../git.js';
4
+ export async function defaultJudge() {
5
+ const judgeId = createConfigStore().getInstallId();
6
+ const { email } = await getGitIdentities().catch(() => ({ email: null }));
7
+ return { judgeId, judgeLabel: email };
8
+ }
9
+ //# sourceMappingURL=judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../../src/lib/curation/judge.ts"],"names":[],"mappings":"AAAA,wIAAwI;AACxI,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC,YAAY,EAAE,CAAC;IACnD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,96 @@
1
+ export type JudgementKind = 'conflict_verdict' | 'check_verdict' | 'supersede' | 'not_a_decision' | 'note';
2
+ export type Verdict = 'real' | 'false';
3
+ export interface JudgementRow {
4
+ id: string;
5
+ decision_id: string;
6
+ counterpart_id: string | null;
7
+ context_key: string | null;
8
+ kind: JudgementKind;
9
+ value: Verdict | null;
10
+ note: string | null;
11
+ judge_id: string;
12
+ judge_label: string | null;
13
+ via: 'cli' | 'mcp';
14
+ agent_id: string | null;
15
+ judged_at: string;
16
+ }
17
+ export interface JudgementWrite {
18
+ kind: JudgementKind;
19
+ decisionId: string;
20
+ counterpartId?: string;
21
+ contextKey?: string;
22
+ value?: Verdict;
23
+ note?: string;
24
+ }
25
+ export interface Judge {
26
+ judgeId: string;
27
+ judgeLabel: string | null;
28
+ }
29
+ /** `agentId` is a registry id or 'unknown' and only ever accompanies `via: 'mcp'` (the table's CHECK says so). */
30
+ export type Origin = {
31
+ via: 'cli';
32
+ } | {
33
+ via: 'mcp';
34
+ agentId: string;
35
+ };
36
+ /** Thrown when an agent's write would replace a mark the person made themselves. Nothing was stored. */
37
+ export declare class HumanMarkError extends Error {
38
+ constructor();
39
+ }
40
+ /** Whether an agent's write of `w` would be refused. Lets a caller refuse BEFORE any side effect (the supersedes link). */
41
+ export declare function agentWouldOverrideHuman(dbPath: string, w: JudgementWrite, judge: Judge): boolean;
42
+ /**
43
+ * Store a judgement. Returns whether it REPLACED an earlier one of this judge's (idempotent: the
44
+ * same call twice leaves one row). Delete then insert inside one IMMEDIATE transaction, rather than
45
+ * ON CONFLICT, because the unique index is on an expression and a partial predicate.
46
+ */
47
+ export declare function upsertJudgement(dbPath: string, w: JudgementWrite, judge: Judge, origin: Origin, now?: Date): {
48
+ replaced: boolean;
49
+ id: string;
50
+ };
51
+ /**
52
+ * Take back this judge's own mark for the key (never another judge's). Returns the ids of the marks
53
+ * that were taken back.
54
+ *
55
+ * A verdict a PERSON gave is not deleted but turned into a TOMBSTONE: the same row with no value
56
+ * (`value` NULL, note 'undone'). Readers skip it, so the guardrail behaves as if the verdict never
57
+ * existed, but an agent's write on that key still meets a person's row and is refused until a
58
+ * person marks it again. Without it, undoing a "real" verdict would hand the key to an agent.
59
+ * A mark an agent made, and the kinds an agent cannot write at all, are deleted outright.
60
+ */
61
+ export declare function removeJudgement(dbPath: string, w: Omit<JudgementWrite, 'value' | 'note'>, judge: Judge, now?: Date): string[];
62
+ /** Every row of this judge, newest first, optionally only those that name one decision. */
63
+ export declare function listJudgements(dbPath: string, judgeId: string, decisionId?: string): JudgementRow[];
64
+ export interface CheckVerdictLookup {
65
+ /** This judge's verdict for exactly this file set, if any. `agent_id` is set when an agent relayed it. */
66
+ here: {
67
+ value: Verdict;
68
+ judged_at: string;
69
+ agent_id: string | null;
70
+ } | null;
71
+ /** The newest `false` this judge gave for a DIFFERENT file set: annotates, never hides. */
72
+ elsewhereFalse: {
73
+ judged_at: string;
74
+ agent_id: string | null;
75
+ } | null;
76
+ }
77
+ export declare function checkVerdictFor(dbPath: string, judgeId: string, decisionId: string, contextKey: string | null): CheckVerdictLookup;
78
+ export interface MarkMeta {
79
+ agent_id: string | null;
80
+ judged_at: string;
81
+ }
82
+ /** Decisions this judge excluded from ask and check retrieval, with who marked each and when. */
83
+ export declare function notADecisionMarks(dbPath: string, judgeId: string): Map<string, MarkMeta>;
84
+ /** The newest supersede mark this judge made about `olderId` being replaced, with the newer decision's id. */
85
+ export declare function supersedeMarkFor(dbPath: string, judgeId: string, olderId: string): (MarkMeta & {
86
+ newer: string;
87
+ }) | null;
88
+ /** Every conflict verdict this judge gave, keyed by `lowerId|higherId`: one read for a whole list of pairs. */
89
+ export declare function pairVerdictsFor(dbPath: string, judgeId: string): Map<string, {
90
+ value: Verdict;
91
+ judged_at: string;
92
+ agent_id: string | null;
93
+ }>;
94
+ /** Titles of the decisions that exist among `ids`, so a mark can name an unknown id instead of storing a verdict on nothing. */
95
+ export declare function existingTitles(dbPath: string, ids: string[]): Map<string, string>;
96
+ //# sourceMappingURL=judgements-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judgements-db.d.ts","sourceRoot":"","sources":["../../../src/lib/curation/judgements-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * LM: reads and writes of `local_judgements` (schema v7), one person's verdicts on this machine.
3
+ *
4
+ * "Person" is the installation: `judge_id` is the install id the CLI already keeps, and it is the
5
+ * only identity a local graph has (Decision 11). A judge's later judgement replaces THEIR OWN
6
+ * earlier one on the same key and never touches another judge's row; notes append.
7
+ *
8
+ * `context_key` (a hash of the files a check covered) is REVERSIBLE for a small set: hash the likely
9
+ * paths of a repo and compare. It stays on this machine. Nothing the share phase reads may include it
10
+ * or any file path.
11
+ *
12
+ * TOMBSTONES: when a person undoes a conflict or check verdict, the row stays with `value` NULL and
13
+ * note 'undone' (via 'cli'). Readers skip it, so it is no verdict, but an agent's write on that key
14
+ * still meets a person's row and is refused until a person marks it again. ANYTHING THAT READS THIS
15
+ * TABLE (the share phase included) MUST ignore a verdict-kind row whose value is NULL.
16
+ *
17
+ * Builds before the round-3 fix (never released) let an agent write supersede and not_a_decision rows
18
+ * and gave a supersede link a random id. Those rows still read correctly, and `--undo` removes their
19
+ * judgement but cannot tell their link from a classifier's, so the link stays; no repair is attempted.
20
+ *
21
+ * Ratification is not here: it stays in `decisions.ratified_by` (Decision 14), because storing it
22
+ * twice would give one fact two writers.
23
+ *
24
+ * Every function opens its own short-lived handle, the sync-state pattern, so the MCP server and a
25
+ * sync child can both be live. A reader never creates a missing graph file.
26
+ */
27
+ import { randomUUID } from 'node:crypto';
28
+ import fs from 'node:fs';
29
+ import { DatabaseSync } from 'node:sqlite';
30
+ import { assertSchemaSupported } from '../local-db-migrate.js';
31
+ function withDb(dbPath, fn) {
32
+ const db = new DatabaseSync(dbPath);
33
+ try {
34
+ db.exec('PRAGMA busy_timeout = 30000');
35
+ assertSchemaSupported(db.prepare('PRAGMA user_version').get().user_version);
36
+ return fn(db);
37
+ }
38
+ finally {
39
+ db.close();
40
+ }
41
+ }
42
+ /** A reader must never create the graph it was asked to look at, and a pre-v7 file reads as no judgements. */
43
+ function readDb(dbPath, fallback, fn) {
44
+ if (dbPath === '' || !fs.existsSync(dbPath))
45
+ return fallback;
46
+ return withDb(dbPath, (db) => {
47
+ try {
48
+ return fn(db);
49
+ }
50
+ catch (e) {
51
+ if (/no such table/i.test(e.message))
52
+ return fallback;
53
+ throw e;
54
+ }
55
+ });
56
+ }
57
+ /** The unique-index key of a non-note row: what "the same judgement" means for one judge. */
58
+ function keyOf(w) {
59
+ return w.counterpartId ?? w.contextKey ?? w.decisionId;
60
+ }
61
+ /** Thrown when an agent's write would replace a mark the person made themselves. Nothing was stored. */
62
+ export class HumanMarkError extends Error {
63
+ constructor() {
64
+ super('The person marked this themselves, and an agent cannot replace a person\'s mark.');
65
+ this.name = 'HumanMarkError';
66
+ }
67
+ }
68
+ function humanRowExists(db, w, judge) {
69
+ return db.prepare(`SELECT 1 AS x FROM local_judgements WHERE kind = ? AND judge_id = ? AND decision_id = ?
70
+ AND COALESCE(counterpart_id, context_key, decision_id) = ? AND via = 'cli' LIMIT 1`).get(w.kind, judge.judgeId, w.decisionId, keyOf(w)) !== undefined;
71
+ }
72
+ /** Whether an agent's write of `w` would be refused. Lets a caller refuse BEFORE any side effect (the supersedes link). */
73
+ export function agentWouldOverrideHuman(dbPath, w, judge) {
74
+ if (w.kind === 'note')
75
+ return false;
76
+ return readDb(dbPath, false, (db) => humanRowExists(db, w, judge));
77
+ }
78
+ /**
79
+ * Store a judgement. Returns whether it REPLACED an earlier one of this judge's (idempotent: the
80
+ * same call twice leaves one row). Delete then insert inside one IMMEDIATE transaction, rather than
81
+ * ON CONFLICT, because the unique index is on an expression and a partial predicate.
82
+ */
83
+ export function upsertJudgement(dbPath, w, judge, origin, now = new Date()) {
84
+ return withDb(dbPath, (db) => {
85
+ db.exec('BEGIN IMMEDIATE');
86
+ try {
87
+ let replaced = false;
88
+ let id = randomUUID();
89
+ // A prompt-injected agent must not silence a verdict a person recorded. Checked inside the
90
+ // transaction so a CLI mark landing in between cannot be overwritten.
91
+ if (w.kind !== 'note' && origin.via === 'mcp' && humanRowExists(db, w, judge))
92
+ throw new HumanMarkError();
93
+ if (w.kind !== 'note') {
94
+ const sel = `FROM local_judgements WHERE kind = ? AND judge_id = ? AND decision_id = ?
95
+ AND COALESCE(counterpart_id, context_key, decision_id) = ?`;
96
+ // The row keeps its id when it is replaced: a supersedes link is owned by `mark:<id>`, so a
97
+ // re-mark and its --undo must still find it.
98
+ const before = db.prepare(`SELECT id, value ${sel}`).get(w.kind, judge.judgeId, w.decisionId, keyOf(w));
99
+ if (before) {
100
+ id = before.id;
101
+ // A tombstone (a verdict the person took back) is not an answer being replaced.
102
+ replaced = !(before.value === null && isVerdictKind(w.kind));
103
+ db.prepare(`DELETE ${sel}`).run(w.kind, judge.judgeId, w.decisionId, keyOf(w));
104
+ }
105
+ }
106
+ db.prepare(`INSERT INTO local_judgements (id, decision_id, counterpart_id, context_key, kind, value, note, judge_id, judge_label, via, agent_id, judged_at)
107
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, w.decisionId, w.counterpartId ?? null, w.contextKey ?? null, w.kind, w.value ?? null, w.note ?? null, judge.judgeId, judge.judgeLabel, origin.via, origin.via === 'mcp' ? origin.agentId : null, now.toISOString());
108
+ db.exec('COMMIT');
109
+ return { replaced, id };
110
+ }
111
+ catch (e) {
112
+ db.exec('ROLLBACK');
113
+ throw e;
114
+ }
115
+ });
116
+ }
117
+ const isVerdictKind = (k) => k === 'conflict_verdict' || k === 'check_verdict';
118
+ /**
119
+ * Take back this judge's own mark for the key (never another judge's). Returns the ids of the marks
120
+ * that were taken back.
121
+ *
122
+ * A verdict a PERSON gave is not deleted but turned into a TOMBSTONE: the same row with no value
123
+ * (`value` NULL, note 'undone'). Readers skip it, so the guardrail behaves as if the verdict never
124
+ * existed, but an agent's write on that key still meets a person's row and is refused until a
125
+ * person marks it again. Without it, undoing a "real" verdict would hand the key to an agent.
126
+ * A mark an agent made, and the kinds an agent cannot write at all, are deleted outright.
127
+ */
128
+ export function removeJudgement(dbPath, w, judge, now = new Date()) {
129
+ if (w.kind === 'note')
130
+ throw new Error('Notes append and are not removed by key.');
131
+ return withDb(dbPath, (db) => {
132
+ const sel = `FROM local_judgements WHERE kind = ? AND judge_id = ? AND decision_id = ?
133
+ AND COALESCE(counterpart_id, context_key, decision_id) = ?`;
134
+ const found = db.prepare(`SELECT id, via, value ${sel}`).all(w.kind, judge.judgeId, w.decisionId, keyOf(w));
135
+ const gone = [];
136
+ for (const r of found) {
137
+ if (isVerdictKind(w.kind) && r.via === 'cli') {
138
+ if (r.value === null)
139
+ continue;
140
+ db.prepare(`UPDATE local_judgements SET value = NULL, note = 'undone', judged_at = ? WHERE id = ?`).run(now.toISOString(), r.id);
141
+ }
142
+ else {
143
+ db.prepare('DELETE FROM local_judgements WHERE id = ?').run(r.id);
144
+ }
145
+ gone.push(r.id);
146
+ }
147
+ return gone;
148
+ });
149
+ }
150
+ /** Every row of this judge, newest first, optionally only those that name one decision. */
151
+ export function listJudgements(dbPath, judgeId, decisionId) {
152
+ return readDb(dbPath, [], (db) => db.prepare(
153
+ // Anonymous placeholders, each bound: Node 22.16's DatabaseSync rejects numbered ones with 'column index out of range'.
154
+ `SELECT * FROM local_judgements WHERE judge_id = ? AND (? IS NULL OR decision_id = ? OR counterpart_id = ?)
155
+ AND NOT (value IS NULL AND kind IN ('conflict_verdict', 'check_verdict'))
156
+ ORDER BY judged_at DESC, rowid DESC`).all(judgeId, decisionId ?? null, decisionId ?? null, decisionId ?? null));
157
+ }
158
+ export function checkVerdictFor(dbPath, judgeId, decisionId, contextKey) {
159
+ return readDb(dbPath, { here: null, elsewhereFalse: null }, (db) => {
160
+ const rows = db.prepare(`SELECT context_key, value, judged_at, agent_id FROM local_judgements WHERE kind = 'check_verdict' AND value IS NOT NULL AND judge_id = ? AND decision_id = ?
161
+ ORDER BY judged_at DESC, rowid DESC`).all(judgeId, decisionId);
162
+ const here = contextKey === null ? undefined : rows.find((r) => r.context_key === contextKey);
163
+ const other = rows.find((r) => r.context_key !== contextKey && r.value === 'false');
164
+ return {
165
+ here: here ? { value: here.value, judged_at: here.judged_at, agent_id: here.agent_id } : null,
166
+ elsewhereFalse: other ? { judged_at: other.judged_at, agent_id: other.agent_id } : null,
167
+ };
168
+ });
169
+ }
170
+ /** Decisions this judge excluded from ask and check retrieval, with who marked each and when. */
171
+ export function notADecisionMarks(dbPath, judgeId) {
172
+ return readDb(dbPath, new Map(), (db) => new Map(db.prepare(`SELECT decision_id, agent_id, judged_at FROM local_judgements WHERE kind = 'not_a_decision' AND judge_id = ?`).all(judgeId)
173
+ .map((r) => [r.decision_id, { agent_id: r.agent_id, judged_at: r.judged_at }])));
174
+ }
175
+ /** The newest supersede mark this judge made about `olderId` being replaced, with the newer decision's id. */
176
+ export function supersedeMarkFor(dbPath, judgeId, olderId) {
177
+ return readDb(dbPath, null, (db) => {
178
+ const r = db.prepare(`SELECT decision_id AS newer, agent_id, judged_at FROM local_judgements WHERE kind = 'supersede' AND judge_id = ? AND counterpart_id = ?
179
+ ORDER BY judged_at DESC, rowid DESC LIMIT 1`).get(judgeId, olderId);
180
+ return r ?? null;
181
+ });
182
+ }
183
+ /** Every conflict verdict this judge gave, keyed by `lowerId|higherId`: one read for a whole list of pairs. */
184
+ export function pairVerdictsFor(dbPath, judgeId) {
185
+ return readDb(dbPath, new Map(), (db) => new Map(db.prepare(`SELECT decision_id, counterpart_id, value, judged_at, agent_id FROM local_judgements WHERE kind = 'conflict_verdict' AND value IS NOT NULL AND judge_id = ?`).all(judgeId)
186
+ .map((r) => [`${r.decision_id}|${r.counterpart_id}`, { value: r.value, judged_at: r.judged_at, agent_id: r.agent_id }])));
187
+ }
188
+ /** Titles of the decisions that exist among `ids`, so a mark can name an unknown id instead of storing a verdict on nothing. */
189
+ export function existingTitles(dbPath, ids) {
190
+ return readDb(dbPath, new Map(), (db) => {
191
+ const found = new Map();
192
+ for (const id of ids) {
193
+ const row = db.prepare('SELECT title FROM decisions WHERE id = ?').get(id);
194
+ if (row)
195
+ found.set(id, row.title);
196
+ }
197
+ return found;
198
+ });
199
+ }
200
+ //# sourceMappingURL=judgements-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judgements-db.js","sourceRoot":"","sources":["../../../src/lib/curation/judgements-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface LastCheck {
2
+ checked_at: string;
3
+ /** The directory the check ran in: a default from another checkout is not this one's. */
4
+ cwd: string;
5
+ /** The git HEAD it ran at (null outside a repository): a default from before a commit or a branch switch is not this check's. */
6
+ head: string | null;
7
+ files: string[];
8
+ /** Every decision the check retrieved (a hit hidden by a mark is still here), so a default is offered only for a decision it covered. */
9
+ decision_ids: string[];
10
+ }
11
+ export declare function lastCheckPath(): string;
12
+ /**
13
+ * Best effort: a check must never fail because its bookkeeping could not be written. Written to a
14
+ * fresh private temp file (`wx`, 0600) and renamed over the target, so a symlink planted at the
15
+ * target is never written through and an existing file's looser mode is not kept. A target that is
16
+ * not a regular file (a link, a directory) is left alone.
17
+ */
18
+ export declare function writeLastCheck(entry: LastCheck, file?: string): void;
19
+ export declare function readLastCheck(file?: string): LastCheck | null;
20
+ /** The entry for one check: the files it covered (its own list if it gave one, else read from the diff), every decision it retrieved, and where it ran. Never the diff. */
21
+ export declare function lastCheckFor(diff: string, result: {
22
+ relevant_decisions?: Array<{
23
+ id: string;
24
+ }>;
25
+ conflicts?: Array<{
26
+ decision_id: string;
27
+ }>;
28
+ checked_files?: string[];
29
+ }, now?: Date, cwd?: string, head?: string | null): LastCheck;
30
+ /** The git HEAD of the current directory, or null outside a repository (or without git). */
31
+ export declare function gitHead(): Promise<string | null>;
32
+ //# sourceMappingURL=last-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-check.d.ts","sourceRoot":"","sources":["../../../src/lib/curation/last-check.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,GAAG,EAAE,MAAM,CAAC;IACZ,iIAAiI;IACjI,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yIAAyI;IACzI,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,SAAkB,GAAG,IAAI,CAe7E;AAED,wBAAgB,aAAa,CAAC,IAAI,SAAkB,GAAG,SAAS,GAAG,IAAI,CAWtE;AAED,2KAA2K;AAC3K,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IAAE,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC5H,GAAG,OAAa,EAChB,GAAG,SAAgB,EACnB,IAAI,GAAE,MAAM,GAAG,IAAW,GACzB,SAAS,CAGX;AAED,4FAA4F;AAC5F,wBAAsB,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOtD"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * LM: what `align check` last looked at, so a person can mark a hit right after seeing it without
3
+ * retyping paths. `$XDG_STATE_HOME/align-cli/last-check.json` (private, overwritten each run).
4
+ * Holds decision ids and repo-relative file paths only; the diff itself is never stored. It never
5
+ * leaves the machine. A missing or unreadable file reads as "no last check".
6
+ */
7
+ import { randomBytes } from 'node:crypto';
8
+ import { execa } from 'execa';
9
+ import fs from 'node:fs';
10
+ import os from 'node:os';
11
+ import path from 'node:path';
12
+ import { absoluteXdg } from '../xdg.js';
13
+ import { filesFromDiff } from './mark.js';
14
+ export function lastCheckPath() {
15
+ const xdg = absoluteXdg(process.env, 'XDG_STATE_HOME');
16
+ const home = xdg
17
+ ?? (process.platform === 'win32'
18
+ ? (process.env['LOCALAPPDATA'] ?? path.join(os.homedir(), 'AppData', 'Local'))
19
+ : path.join(os.homedir(), '.local', 'state'));
20
+ return path.join(home, 'align-cli', 'last-check.json');
21
+ }
22
+ /**
23
+ * Best effort: a check must never fail because its bookkeeping could not be written. Written to a
24
+ * fresh private temp file (`wx`, 0600) and renamed over the target, so a symlink planted at the
25
+ * target is never written through and an existing file's looser mode is not kept. A target that is
26
+ * not a regular file (a link, a directory) is left alone.
27
+ */
28
+ export function writeLastCheck(entry, file = lastCheckPath()) {
29
+ let tmp;
30
+ try {
31
+ fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 });
32
+ const existing = fs.lstatSync(file, { throwIfNoEntry: false });
33
+ if (existing && !existing.isFile())
34
+ return;
35
+ tmp = `${file}.${process.pid}.${randomBytes(6).toString('hex')}.tmp`;
36
+ fs.writeFileSync(tmp, JSON.stringify(entry), { encoding: 'utf8', mode: 0o600, flag: 'wx' });
37
+ fs.renameSync(tmp, file);
38
+ tmp = undefined;
39
+ }
40
+ catch {
41
+ // Not writable: marking then asks for --files, which is the honest fallback.
42
+ }
43
+ finally {
44
+ if (tmp)
45
+ try {
46
+ fs.unlinkSync(tmp);
47
+ }
48
+ catch { /* already gone */ }
49
+ }
50
+ }
51
+ export function readLastCheck(file = lastCheckPath()) {
52
+ try {
53
+ // A planted link is not ours to read (writing already refuses one).
54
+ if (!fs.lstatSync(file).isFile())
55
+ return null;
56
+ const v = JSON.parse(fs.readFileSync(file, 'utf8'));
57
+ if (!Array.isArray(v.files) || v.files.some((f) => typeof f !== 'string'))
58
+ return null;
59
+ const strings = (x) => (Array.isArray(x) ? x.filter((y) => typeof y === 'string') : []);
60
+ return { checked_at: typeof v.checked_at === 'string' ? v.checked_at : '', cwd: typeof v.cwd === 'string' ? v.cwd : '', head: typeof v.head === 'string' ? v.head : null, files: v.files, decision_ids: strings(v.decision_ids) };
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ /** The entry for one check: the files it covered (its own list if it gave one, else read from the diff), every decision it retrieved, and where it ran. Never the diff. */
67
+ export function lastCheckFor(diff, result, now = new Date(), cwd = process.cwd(), head = null) {
68
+ const ids = new Set([...(result.relevant_decisions ?? []).map((d) => d.id), ...(result.conflicts ?? []).map((c) => c.decision_id)]);
69
+ return { checked_at: now.toISOString(), cwd, head, files: result.checked_files ?? filesFromDiff(diff), decision_ids: [...ids] };
70
+ }
71
+ /** The git HEAD of the current directory, or null outside a repository (or without git). */
72
+ export async function gitHead() {
73
+ try {
74
+ const { stdout } = await execa('git', ['rev-parse', 'HEAD']);
75
+ return stdout.trim() || null;
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ //# sourceMappingURL=last-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"last-check.js","sourceRoot":"","sources":["../../../src/lib/curation/last-check.ts"],"names":[],"mappings":"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"}