@nanonets/graft 0.24.0 → 0.25.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 (791) hide show
  1. package/README.md +26 -21
  2. package/dist/ask/ask.d.ts +8 -0
  3. package/dist/ask/ask.d.ts.map +1 -1
  4. package/dist/ask/ask.js +33 -12
  5. package/dist/ask/ask.js.map +1 -1
  6. package/dist/blast/render.js +1 -1
  7. package/dist/blast/render.js.map +1 -1
  8. package/dist/brand.js +1 -1
  9. package/dist/brand.js.map +1 -1
  10. package/dist/check/learning-edits.d.ts +18 -3
  11. package/dist/check/learning-edits.d.ts.map +1 -1
  12. package/dist/check/learning-edits.js +54 -10
  13. package/dist/check/learning-edits.js.map +1 -1
  14. package/dist/check/local-check.d.ts +7 -3
  15. package/dist/check/local-check.d.ts.map +1 -1
  16. package/dist/check/local-check.js +55 -11
  17. package/dist/check/local-check.js.map +1 -1
  18. package/dist/check/types.d.ts +11 -2
  19. package/dist/check/types.d.ts.map +1 -1
  20. package/dist/claude/format.d.ts +11 -7
  21. package/dist/claude/format.d.ts.map +1 -1
  22. package/dist/claude/format.js +50 -28
  23. package/dist/claude/format.js.map +1 -1
  24. package/dist/claude/hook-io.d.ts +44 -0
  25. package/dist/claude/hook-io.d.ts.map +1 -0
  26. package/dist/claude/hook-io.js +144 -0
  27. package/dist/claude/hook-io.js.map +1 -0
  28. package/dist/claude/hook-layers.d.ts +4 -2
  29. package/dist/claude/hook-layers.d.ts.map +1 -1
  30. package/dist/claude/hook-layers.js +21 -4
  31. package/dist/claude/hook-layers.js.map +1 -1
  32. package/dist/claude/hooks.d.ts +9 -32
  33. package/dist/claude/hooks.d.ts.map +1 -1
  34. package/dist/claude/hooks.js +154 -350
  35. package/dist/claude/hooks.js.map +1 -1
  36. package/dist/claude/init.d.ts.map +1 -1
  37. package/dist/claude/init.js +56 -18
  38. package/dist/claude/init.js.map +1 -1
  39. package/dist/claude/note-signals.d.ts +6 -0
  40. package/dist/claude/note-signals.d.ts.map +1 -1
  41. package/dist/claude/note-signals.js +14 -3
  42. package/dist/claude/note-signals.js.map +1 -1
  43. package/dist/claude/post-bash.d.ts +26 -0
  44. package/dist/claude/post-bash.d.ts.map +1 -0
  45. package/dist/claude/post-bash.js +191 -0
  46. package/dist/claude/post-bash.js.map +1 -0
  47. package/dist/claude/pre-bash-skills.d.ts +21 -0
  48. package/dist/claude/pre-bash-skills.d.ts.map +1 -0
  49. package/dist/claude/pre-bash-skills.js +253 -0
  50. package/dist/claude/pre-bash-skills.js.map +1 -0
  51. package/dist/claude/pre-bash.d.ts +50 -0
  52. package/dist/claude/pre-bash.d.ts.map +1 -0
  53. package/dist/claude/pre-bash.js +245 -0
  54. package/dist/claude/pre-bash.js.map +1 -0
  55. package/dist/claude/prompt-consent.d.ts +19 -0
  56. package/dist/claude/prompt-consent.d.ts.map +1 -0
  57. package/dist/claude/prompt-consent.js +14 -0
  58. package/dist/claude/prompt-consent.js.map +1 -0
  59. package/dist/claude/prompt-hook.d.ts +76 -0
  60. package/dist/claude/prompt-hook.d.ts.map +1 -0
  61. package/dist/claude/prompt-hook.js +303 -0
  62. package/dist/claude/prompt-hook.js.map +1 -0
  63. package/dist/claude/prompt-skills.d.ts +19 -0
  64. package/dist/claude/prompt-skills.d.ts.map +1 -0
  65. package/dist/claude/prompt-skills.js +305 -0
  66. package/dist/claude/prompt-skills.js.map +1 -0
  67. package/dist/claude/session-metrics.js +4 -4
  68. package/dist/claude/session-metrics.js.map +1 -1
  69. package/dist/claude/settings-merge.d.ts +10 -0
  70. package/dist/claude/settings-merge.d.ts.map +1 -1
  71. package/dist/claude/settings-merge.js +46 -17
  72. package/dist/claude/settings-merge.js.map +1 -1
  73. package/dist/claude/shim-template.d.ts.map +1 -1
  74. package/dist/claude/shim-template.js +86 -28
  75. package/dist/claude/shim-template.js.map +1 -1
  76. package/dist/claude/skill-template.d.ts +2 -0
  77. package/dist/claude/skill-template.d.ts.map +1 -1
  78. package/dist/claude/skill-template.js +53 -34
  79. package/dist/claude/skill-template.js.map +1 -1
  80. package/dist/claude/skill-use.d.ts +16 -0
  81. package/dist/claude/skill-use.d.ts.map +1 -0
  82. package/dist/claude/skill-use.js +78 -0
  83. package/dist/claude/skill-use.js.map +1 -0
  84. package/dist/claude/skills-hook-util.d.ts +25 -0
  85. package/dist/claude/skills-hook-util.d.ts.map +1 -0
  86. package/dist/claude/skills-hook-util.js +71 -0
  87. package/dist/claude/skills-hook-util.js.map +1 -0
  88. package/dist/claude/skills-wiring.d.ts +26 -0
  89. package/dist/claude/skills-wiring.d.ts.map +1 -0
  90. package/dist/claude/skills-wiring.js +110 -0
  91. package/dist/claude/skills-wiring.js.map +1 -0
  92. package/dist/claude/start-init.d.ts +13 -0
  93. package/dist/claude/start-init.d.ts.map +1 -0
  94. package/dist/claude/start-init.js +75 -0
  95. package/dist/claude/start-init.js.map +1 -0
  96. package/dist/claude/start-skills.d.ts +31 -0
  97. package/dist/claude/start-skills.d.ts.map +1 -0
  98. package/dist/claude/start-skills.js +274 -0
  99. package/dist/claude/start-skills.js.map +1 -0
  100. package/dist/claude/state.d.ts +19 -7
  101. package/dist/claude/state.d.ts.map +1 -1
  102. package/dist/claude/state.js +59 -4
  103. package/dist/claude/state.js.map +1 -1
  104. package/dist/claude/stop-skills.d.ts +23 -0
  105. package/dist/claude/stop-skills.d.ts.map +1 -0
  106. package/dist/claude/stop-skills.js +233 -0
  107. package/dist/claude/stop-skills.js.map +1 -0
  108. package/dist/claude/stop.d.ts +23 -0
  109. package/dist/claude/stop.d.ts.map +1 -0
  110. package/dist/claude/stop.js +219 -0
  111. package/dist/claude/stop.js.map +1 -0
  112. package/dist/claude/tally.d.ts +29 -41
  113. package/dist/claude/tally.d.ts.map +1 -1
  114. package/dist/claude/tally.js +111 -165
  115. package/dist/claude/tally.js.map +1 -1
  116. package/dist/claude/walls-hook.d.ts +52 -0
  117. package/dist/claude/walls-hook.d.ts.map +1 -0
  118. package/dist/claude/walls-hook.js +279 -0
  119. package/dist/claude/walls-hook.js.map +1 -0
  120. package/dist/cli-epilogue.d.ts.map +1 -1
  121. package/dist/cli-epilogue.js +24 -14
  122. package/dist/cli-epilogue.js.map +1 -1
  123. package/dist/cli-meta.js +3 -3
  124. package/dist/cli-meta.js.map +1 -1
  125. package/dist/cli-picker.d.ts +24 -0
  126. package/dist/cli-picker.d.ts.map +1 -1
  127. package/dist/cli-picker.js +44 -11
  128. package/dist/cli-picker.js.map +1 -1
  129. package/dist/cli.d.ts.map +1 -1
  130. package/dist/cli.js +475 -390
  131. package/dist/cli.js.map +1 -1
  132. package/dist/cloud/head-learnings.d.ts +13 -0
  133. package/dist/cloud/head-learnings.d.ts.map +1 -0
  134. package/dist/cloud/head-learnings.js +84 -0
  135. package/dist/cloud/head-learnings.js.map +1 -0
  136. package/dist/cloud/lookup-activity.d.ts +18 -0
  137. package/dist/cloud/lookup-activity.d.ts.map +1 -0
  138. package/dist/cloud/lookup-activity.js +56 -0
  139. package/dist/cloud/lookup-activity.js.map +1 -0
  140. package/dist/cloud/nudge.d.ts +15 -7
  141. package/dist/cloud/nudge.d.ts.map +1 -1
  142. package/dist/cloud/nudge.js +45 -33
  143. package/dist/cloud/nudge.js.map +1 -1
  144. package/dist/cloud/onboarding.d.ts +273 -0
  145. package/dist/cloud/onboarding.d.ts.map +1 -0
  146. package/dist/cloud/onboarding.js +612 -0
  147. package/dist/cloud/onboarding.js.map +1 -0
  148. package/dist/cloud/other-repos.d.ts +39 -0
  149. package/dist/cloud/other-repos.d.ts.map +1 -0
  150. package/dist/cloud/other-repos.js +137 -0
  151. package/dist/cloud/other-repos.js.map +1 -0
  152. package/dist/cloud/pair.d.ts +86 -0
  153. package/dist/cloud/pair.d.ts.map +1 -0
  154. package/dist/cloud/pair.js +270 -0
  155. package/dist/cloud/pair.js.map +1 -0
  156. package/dist/cloud/workspace-sync.d.ts +75 -11
  157. package/dist/cloud/workspace-sync.d.ts.map +1 -1
  158. package/dist/cloud/workspace-sync.js +409 -53
  159. package/dist/cloud/workspace-sync.js.map +1 -1
  160. package/dist/cloud/workspace.d.ts +95 -10
  161. package/dist/cloud/workspace.d.ts.map +1 -1
  162. package/dist/cloud/workspace.js +112 -9
  163. package/dist/cloud/workspace.js.map +1 -1
  164. package/dist/graph/native.d.ts +2 -0
  165. package/dist/graph/native.d.ts.map +1 -1
  166. package/dist/graph/native.js +29 -4
  167. package/dist/graph/native.js.map +1 -1
  168. package/dist/hosts/claude-global.d.ts +14 -0
  169. package/dist/hosts/claude-global.d.ts.map +1 -1
  170. package/dist/hosts/claude-global.js +39 -4
  171. package/dist/hosts/claude-global.js.map +1 -1
  172. package/dist/hosts/codex-hooks.d.ts +6 -0
  173. package/dist/hosts/codex-hooks.d.ts.map +1 -1
  174. package/dist/hosts/codex-hooks.js +89 -16
  175. package/dist/hosts/codex-hooks.js.map +1 -1
  176. package/dist/hosts/codex-trust.d.ts +28 -0
  177. package/dist/hosts/codex-trust.d.ts.map +1 -0
  178. package/dist/hosts/codex-trust.js +280 -0
  179. package/dist/hosts/codex-trust.js.map +1 -0
  180. package/dist/hosts/cursor-hooks.d.ts.map +1 -1
  181. package/dist/hosts/cursor-hooks.js +3 -1
  182. package/dist/hosts/cursor-hooks.js.map +1 -1
  183. package/dist/init/candidates.d.ts +60 -0
  184. package/dist/init/candidates.d.ts.map +1 -0
  185. package/dist/init/candidates.js +202 -0
  186. package/dist/init/candidates.js.map +1 -0
  187. package/dist/init/claude-call.d.ts +51 -0
  188. package/dist/init/claude-call.d.ts.map +1 -0
  189. package/dist/init/claude-call.js +199 -0
  190. package/dist/init/claude-call.js.map +1 -0
  191. package/dist/init/discover-worker.d.ts +18 -0
  192. package/dist/init/discover-worker.d.ts.map +1 -0
  193. package/dist/init/discover-worker.js +111 -0
  194. package/dist/init/discover-worker.js.map +1 -0
  195. package/dist/init/handover.d.ts +16 -0
  196. package/dist/init/handover.d.ts.map +1 -0
  197. package/dist/init/handover.js +92 -0
  198. package/dist/init/handover.js.map +1 -0
  199. package/dist/init/howtos.d.ts +20 -0
  200. package/dist/init/howtos.d.ts.map +1 -0
  201. package/dist/init/howtos.js +90 -0
  202. package/dist/init/howtos.js.map +1 -0
  203. package/dist/init/init-record.d.ts +134 -0
  204. package/dist/init/init-record.d.ts.map +1 -0
  205. package/dist/init/init-record.js +339 -0
  206. package/dist/init/init-record.js.map +1 -0
  207. package/dist/init/install-paths.d.ts +6 -0
  208. package/dist/init/install-paths.d.ts.map +1 -0
  209. package/dist/init/install-paths.js +87 -0
  210. package/dist/init/install-paths.js.map +1 -0
  211. package/dist/init/install-record.d.ts +21 -0
  212. package/dist/init/install-record.d.ts.map +1 -0
  213. package/dist/init/install-record.js +144 -0
  214. package/dist/init/install-record.js.map +1 -0
  215. package/dist/init/keep-answer.d.ts +43 -0
  216. package/dist/init/keep-answer.d.ts.map +1 -0
  217. package/dist/init/keep-answer.js +118 -0
  218. package/dist/init/keep-answer.js.map +1 -0
  219. package/dist/init/keep-gate.d.ts +30 -0
  220. package/dist/init/keep-gate.d.ts.map +1 -0
  221. package/dist/init/keep-gate.js +178 -0
  222. package/dist/init/keep-gate.js.map +1 -0
  223. package/dist/init/keep-list.d.ts +67 -0
  224. package/dist/init/keep-list.d.ts.map +1 -0
  225. package/dist/init/keep-list.js +232 -0
  226. package/dist/init/keep-list.js.map +1 -0
  227. package/dist/init/keep.d.ts +52 -0
  228. package/dist/init/keep.d.ts.map +1 -0
  229. package/dist/init/keep.js +393 -0
  230. package/dist/init/keep.js.map +1 -0
  231. package/dist/init/look-back-mine.d.ts +37 -0
  232. package/dist/init/look-back-mine.d.ts.map +1 -0
  233. package/dist/init/look-back-mine.js +215 -0
  234. package/dist/init/look-back-mine.js.map +1 -0
  235. package/dist/init/look-back.d.ts +81 -0
  236. package/dist/init/look-back.d.ts.map +1 -0
  237. package/dist/init/look-back.js +170 -0
  238. package/dist/init/look-back.js.map +1 -0
  239. package/dist/init/miners.d.ts +46 -0
  240. package/dist/init/miners.d.ts.map +1 -0
  241. package/dist/init/miners.js +141 -0
  242. package/dist/init/miners.js.map +1 -0
  243. package/dist/init/name-call.d.ts +37 -0
  244. package/dist/init/name-call.d.ts.map +1 -0
  245. package/dist/init/name-call.js +151 -0
  246. package/dist/init/name-call.js.map +1 -0
  247. package/dist/init/plain-file.d.ts +11 -0
  248. package/dist/init/plain-file.d.ts.map +1 -0
  249. package/dist/init/plain-file.js +83 -0
  250. package/dist/init/plain-file.js.map +1 -0
  251. package/dist/init/prefs.d.ts +70 -0
  252. package/dist/init/prefs.d.ts.map +1 -0
  253. package/dist/init/prefs.js +282 -0
  254. package/dist/init/prefs.js.map +1 -0
  255. package/dist/init/relay.d.ts +15 -0
  256. package/dist/init/relay.d.ts.map +1 -0
  257. package/dist/init/relay.js +15 -0
  258. package/dist/init/relay.js.map +1 -0
  259. package/dist/init/replay-runs.d.ts +121 -0
  260. package/dist/init/replay-runs.d.ts.map +1 -0
  261. package/dist/init/replay-runs.js +457 -0
  262. package/dist/init/replay-runs.js.map +1 -0
  263. package/dist/init/replay-tamper.d.ts +18 -0
  264. package/dist/init/replay-tamper.d.ts.map +1 -0
  265. package/dist/init/replay-tamper.js +87 -0
  266. package/dist/init/replay-tamper.js.map +1 -0
  267. package/dist/init/review-screen.d.ts +74 -0
  268. package/dist/init/review-screen.d.ts.map +1 -0
  269. package/dist/init/review-screen.js +258 -0
  270. package/dist/init/review-screen.js.map +1 -0
  271. package/dist/init/review-tty.d.ts +29 -0
  272. package/dist/init/review-tty.d.ts.map +1 -0
  273. package/dist/init/review-tty.js +218 -0
  274. package/dist/init/review-tty.js.map +1 -0
  275. package/dist/init/review.d.ts +12 -0
  276. package/dist/init/review.d.ts.map +1 -0
  277. package/dist/init/review.js +12 -0
  278. package/dist/init/review.js.map +1 -0
  279. package/dist/init/run.d.ts +87 -0
  280. package/dist/init/run.d.ts.map +1 -0
  281. package/dist/init/run.js +347 -0
  282. package/dist/init/run.js.map +1 -0
  283. package/dist/init/sessions.d.ts +63 -0
  284. package/dist/init/sessions.d.ts.map +1 -0
  285. package/dist/init/sessions.js +377 -0
  286. package/dist/init/sessions.js.map +1 -0
  287. package/dist/init/transcript.d.ts +81 -0
  288. package/dist/init/transcript.d.ts.map +1 -0
  289. package/dist/init/transcript.js +216 -0
  290. package/dist/init/transcript.js.map +1 -0
  291. package/dist/init/types.d.ts +139 -0
  292. package/dist/init/types.d.ts.map +1 -0
  293. package/dist/init/types.js +2 -0
  294. package/dist/init/types.js.map +1 -0
  295. package/dist/mcp/brains.d.ts +72 -0
  296. package/dist/mcp/brains.d.ts.map +1 -0
  297. package/dist/mcp/brains.js +220 -0
  298. package/dist/mcp/brains.js.map +1 -0
  299. package/dist/mcp/server.d.ts +3 -1
  300. package/dist/mcp/server.d.ts.map +1 -1
  301. package/dist/mcp/server.js +40 -5
  302. package/dist/mcp/server.js.map +1 -1
  303. package/dist/mcp/tools.d.ts.map +1 -1
  304. package/dist/mcp/tools.js +7 -2
  305. package/dist/mcp/tools.js.map +1 -1
  306. package/dist/notes/cold-start.d.ts +5 -184
  307. package/dist/notes/cold-start.d.ts.map +1 -1
  308. package/dist/notes/cold-start.js +5 -575
  309. package/dist/notes/cold-start.js.map +1 -1
  310. package/dist/notes/edit-overlap.d.ts.map +1 -1
  311. package/dist/notes/edit-overlap.js +4 -1
  312. package/dist/notes/edit-overlap.js.map +1 -1
  313. package/dist/notes/every-repo.d.ts +18 -0
  314. package/dist/notes/every-repo.d.ts.map +1 -0
  315. package/dist/notes/every-repo.js +86 -0
  316. package/dist/notes/every-repo.js.map +1 -0
  317. package/dist/notes/guardrails.d.ts +8 -0
  318. package/dist/notes/guardrails.d.ts.map +1 -0
  319. package/dist/notes/guardrails.js +38 -0
  320. package/dist/notes/guardrails.js.map +1 -0
  321. package/dist/notes/lesson-index.d.ts +13 -0
  322. package/dist/notes/lesson-index.d.ts.map +1 -0
  323. package/dist/notes/lesson-index.js +135 -0
  324. package/dist/notes/lesson-index.js.map +1 -0
  325. package/dist/notes/linked-learnings.d.ts +8 -0
  326. package/dist/notes/linked-learnings.d.ts.map +1 -0
  327. package/dist/notes/linked-learnings.js +113 -0
  328. package/dist/notes/linked-learnings.js.map +1 -0
  329. package/dist/notes/notes.d.ts +8 -4
  330. package/dist/notes/notes.d.ts.map +1 -1
  331. package/dist/notes/notes.js +9 -7
  332. package/dist/notes/notes.js.map +1 -1
  333. package/dist/notes/pr-reviews.d.ts +4 -0
  334. package/dist/notes/pr-reviews.d.ts.map +1 -1
  335. package/dist/notes/pr-reviews.js +6 -5
  336. package/dist/notes/pr-reviews.js.map +1 -1
  337. package/dist/notes/replace.d.ts +14 -0
  338. package/dist/notes/replace.d.ts.map +1 -0
  339. package/dist/notes/replace.js +38 -0
  340. package/dist/notes/replace.js.map +1 -0
  341. package/dist/notes/repo-notes-dir.d.ts +2 -0
  342. package/dist/notes/repo-notes-dir.d.ts.map +1 -0
  343. package/dist/notes/repo-notes-dir.js +16 -0
  344. package/dist/notes/repo-notes-dir.js.map +1 -0
  345. package/dist/notes/repo-trail.d.ts +1 -1
  346. package/dist/notes/repo-trail.d.ts.map +1 -1
  347. package/dist/notes/repo-trail.js +24 -4
  348. package/dist/notes/repo-trail.js.map +1 -1
  349. package/dist/search/grep.d.ts.map +1 -1
  350. package/dist/search/grep.js +4 -2
  351. package/dist/search/grep.js.map +1 -1
  352. package/dist/search/user-regexp.d.ts +26 -0
  353. package/dist/search/user-regexp.d.ts.map +1 -0
  354. package/dist/search/user-regexp.js +150 -0
  355. package/dist/search/user-regexp.js.map +1 -0
  356. package/dist/skills/anchors-cli.d.ts +38 -0
  357. package/dist/skills/anchors-cli.d.ts.map +1 -0
  358. package/dist/skills/anchors-cli.js +279 -0
  359. package/dist/skills/anchors-cli.js.map +1 -0
  360. package/dist/skills/anchors-git.d.ts +29 -0
  361. package/dist/skills/anchors-git.d.ts.map +1 -0
  362. package/dist/skills/anchors-git.js +241 -0
  363. package/dist/skills/anchors-git.js.map +1 -0
  364. package/dist/skills/anchors-wide.d.ts +25 -0
  365. package/dist/skills/anchors-wide.d.ts.map +1 -0
  366. package/dist/skills/anchors-wide.js +481 -0
  367. package/dist/skills/anchors-wide.js.map +1 -0
  368. package/dist/skills/anchors.d.ts +32 -0
  369. package/dist/skills/anchors.d.ts.map +1 -0
  370. package/dist/skills/anchors.js +485 -0
  371. package/dist/skills/anchors.js.map +1 -0
  372. package/dist/skills/check-result.d.ts +26 -0
  373. package/dist/skills/check-result.d.ts.map +1 -0
  374. package/dist/skills/check-result.js +46 -0
  375. package/dist/skills/check-result.js.map +1 -0
  376. package/dist/skills/cli-skills-1b.d.ts +17 -0
  377. package/dist/skills/cli-skills-1b.d.ts.map +1 -0
  378. package/dist/skills/cli-skills-1b.js +166 -0
  379. package/dist/skills/cli-skills-1b.js.map +1 -0
  380. package/dist/skills/cli-skills-2.d.ts +35 -0
  381. package/dist/skills/cli-skills-2.d.ts.map +1 -0
  382. package/dist/skills/cli-skills-2.js +129 -0
  383. package/dist/skills/cli-skills-2.js.map +1 -0
  384. package/dist/skills/cli-skills-report-1b.d.ts +49 -0
  385. package/dist/skills/cli-skills-report-1b.d.ts.map +1 -0
  386. package/dist/skills/cli-skills-report-1b.js +191 -0
  387. package/dist/skills/cli-skills-report-1b.js.map +1 -0
  388. package/dist/skills/cli-skills-report.d.ts +86 -0
  389. package/dist/skills/cli-skills-report.d.ts.map +1 -0
  390. package/dist/skills/cli-skills-report.js +121 -0
  391. package/dist/skills/cli-skills-report.js.map +1 -0
  392. package/dist/skills/cli-skills.d.ts +30 -0
  393. package/dist/skills/cli-skills.d.ts.map +1 -0
  394. package/dist/skills/cli-skills.js +379 -0
  395. package/dist/skills/cli-skills.js.map +1 -0
  396. package/dist/skills/codex-sandbox.d.ts +6 -0
  397. package/dist/skills/codex-sandbox.d.ts.map +1 -0
  398. package/dist/skills/codex-sandbox.js +55 -0
  399. package/dist/skills/codex-sandbox.js.map +1 -0
  400. package/dist/skills/compile-split.d.ts +57 -0
  401. package/dist/skills/compile-split.d.ts.map +1 -0
  402. package/dist/skills/compile-split.js +550 -0
  403. package/dist/skills/compile-split.js.map +1 -0
  404. package/dist/skills/compile-version.d.ts +37 -0
  405. package/dist/skills/compile-version.d.ts.map +1 -0
  406. package/dist/skills/compile-version.js +56 -0
  407. package/dist/skills/compile-version.js.map +1 -0
  408. package/dist/skills/compile-waits.d.ts +12 -0
  409. package/dist/skills/compile-waits.d.ts.map +1 -0
  410. package/dist/skills/compile-waits.js +52 -0
  411. package/dist/skills/compile-waits.js.map +1 -0
  412. package/dist/skills/compile-words.d.ts +85 -0
  413. package/dist/skills/compile-words.d.ts.map +1 -0
  414. package/dist/skills/compile-words.js +445 -0
  415. package/dist/skills/compile-words.js.map +1 -0
  416. package/dist/skills/compile.d.ts +42 -0
  417. package/dist/skills/compile.d.ts.map +1 -0
  418. package/dist/skills/compile.js +505 -0
  419. package/dist/skills/compile.js.map +1 -0
  420. package/dist/skills/credit-facts.d.ts +8 -0
  421. package/dist/skills/credit-facts.d.ts.map +1 -0
  422. package/dist/skills/credit-facts.js +32 -0
  423. package/dist/skills/credit-facts.js.map +1 -0
  424. package/dist/skills/credit.d.ts +86 -0
  425. package/dist/skills/credit.d.ts.map +1 -0
  426. package/dist/skills/credit.js +259 -0
  427. package/dist/skills/credit.js.map +1 -0
  428. package/dist/skills/directive-words.d.ts +11 -0
  429. package/dist/skills/directive-words.d.ts.map +1 -0
  430. package/dist/skills/directive-words.js +33 -0
  431. package/dist/skills/directive-words.js.map +1 -0
  432. package/dist/skills/fidelity.d.ts +42 -0
  433. package/dist/skills/fidelity.d.ts.map +1 -0
  434. package/dist/skills/fidelity.js +138 -0
  435. package/dist/skills/fidelity.js.map +1 -0
  436. package/dist/skills/fold-gated.d.ts +3 -0
  437. package/dist/skills/fold-gated.d.ts.map +1 -0
  438. package/dist/skills/fold-gated.js +78 -0
  439. package/dist/skills/fold-gated.js.map +1 -0
  440. package/dist/skills/fold.d.ts +87 -0
  441. package/dist/skills/fold.d.ts.map +1 -0
  442. package/dist/skills/fold.js +348 -0
  443. package/dist/skills/fold.js.map +1 -0
  444. package/dist/skills/follow-learnings.d.ts +128 -0
  445. package/dist/skills/follow-learnings.d.ts.map +1 -0
  446. package/dist/skills/follow-learnings.js +278 -0
  447. package/dist/skills/follow-learnings.js.map +1 -0
  448. package/dist/skills/forget-notice.d.ts +44 -0
  449. package/dist/skills/forget-notice.d.ts.map +1 -0
  450. package/dist/skills/forget-notice.js +131 -0
  451. package/dist/skills/forget-notice.js.map +1 -0
  452. package/dist/skills/front-version.d.ts +12 -0
  453. package/dist/skills/front-version.d.ts.map +1 -0
  454. package/dist/skills/front-version.js +87 -0
  455. package/dist/skills/front-version.js.map +1 -0
  456. package/dist/skills/host-facts.d.ts +51 -0
  457. package/dist/skills/host-facts.d.ts.map +1 -0
  458. package/dist/skills/host-facts.js +134 -0
  459. package/dist/skills/host-facts.js.map +1 -0
  460. package/dist/skills/learning-steps.d.ts +43 -0
  461. package/dist/skills/learning-steps.d.ts.map +1 -0
  462. package/dist/skills/learning-steps.js +294 -0
  463. package/dist/skills/learning-steps.js.map +1 -0
  464. package/dist/skills/ledger.d.ts +43 -0
  465. package/dist/skills/ledger.d.ts.map +1 -0
  466. package/dist/skills/ledger.js +336 -0
  467. package/dist/skills/ledger.js.map +1 -0
  468. package/dist/skills/lesson-gate.d.ts +25 -0
  469. package/dist/skills/lesson-gate.d.ts.map +1 -0
  470. package/dist/skills/lesson-gate.js +316 -0
  471. package/dist/skills/lesson-gate.js.map +1 -0
  472. package/dist/skills/lessons.d.ts +60 -0
  473. package/dist/skills/lessons.d.ts.map +1 -0
  474. package/dist/skills/lessons.js +396 -0
  475. package/dist/skills/lessons.js.map +1 -0
  476. package/dist/skills/offer-answers.d.ts +20 -0
  477. package/dist/skills/offer-answers.d.ts.map +1 -0
  478. package/dist/skills/offer-answers.js +51 -0
  479. package/dist/skills/offer-answers.js.map +1 -0
  480. package/dist/skills/offer-drift.d.ts +35 -0
  481. package/dist/skills/offer-drift.d.ts.map +1 -0
  482. package/dist/skills/offer-drift.js +98 -0
  483. package/dist/skills/offer-drift.js.map +1 -0
  484. package/dist/skills/offer-lesson.d.ts +31 -0
  485. package/dist/skills/offer-lesson.d.ts.map +1 -0
  486. package/dist/skills/offer-lesson.js +123 -0
  487. package/dist/skills/offer-lesson.js.map +1 -0
  488. package/dist/skills/offer-lines.d.ts +40 -0
  489. package/dist/skills/offer-lines.d.ts.map +1 -0
  490. package/dist/skills/offer-lines.js +80 -0
  491. package/dist/skills/offer-lines.js.map +1 -0
  492. package/dist/skills/offer-moment.d.ts +102 -0
  493. package/dist/skills/offer-moment.d.ts.map +1 -0
  494. package/dist/skills/offer-moment.js +260 -0
  495. package/dist/skills/offer-moment.js.map +1 -0
  496. package/dist/skills/offer-repair.d.ts +36 -0
  497. package/dist/skills/offer-repair.d.ts.map +1 -0
  498. package/dist/skills/offer-repair.js +212 -0
  499. package/dist/skills/offer-repair.js.map +1 -0
  500. package/dist/skills/offer-retire.d.ts +53 -0
  501. package/dist/skills/offer-retire.d.ts.map +1 -0
  502. package/dist/skills/offer-retire.js +149 -0
  503. package/dist/skills/offer-retire.js.map +1 -0
  504. package/dist/skills/offer-update.d.ts +54 -0
  505. package/dist/skills/offer-update.d.ts.map +1 -0
  506. package/dist/skills/offer-update.js +115 -0
  507. package/dist/skills/offer-update.js.map +1 -0
  508. package/dist/skills/offer-words-1b.d.ts +32 -0
  509. package/dist/skills/offer-words-1b.d.ts.map +1 -0
  510. package/dist/skills/offer-words-1b.js +80 -0
  511. package/dist/skills/offer-words-1b.js.map +1 -0
  512. package/dist/skills/offer-words-2.d.ts +123 -0
  513. package/dist/skills/offer-words-2.d.ts.map +1 -0
  514. package/dist/skills/offer-words-2.js +194 -0
  515. package/dist/skills/offer-words-2.js.map +1 -0
  516. package/dist/skills/offer-words.d.ts +65 -0
  517. package/dist/skills/offer-words.d.ts.map +1 -0
  518. package/dist/skills/offer-words.js +205 -0
  519. package/dist/skills/offer-words.js.map +1 -0
  520. package/dist/skills/offers.d.ts +66 -0
  521. package/dist/skills/offers.d.ts.map +1 -0
  522. package/dist/skills/offers.js +284 -0
  523. package/dist/skills/offers.js.map +1 -0
  524. package/dist/skills/own-folder.d.ts +9 -0
  525. package/dist/skills/own-folder.d.ts.map +1 -0
  526. package/dist/skills/own-folder.js +36 -0
  527. package/dist/skills/own-folder.js.map +1 -0
  528. package/dist/skills/person.d.ts +34 -0
  529. package/dist/skills/person.d.ts.map +1 -0
  530. package/dist/skills/person.js +102 -0
  531. package/dist/skills/person.js.map +1 -0
  532. package/dist/skills/probe-clean.d.ts +9 -0
  533. package/dist/skills/probe-clean.d.ts.map +1 -0
  534. package/dist/skills/probe-clean.js +48 -0
  535. package/dist/skills/probe-clean.js.map +1 -0
  536. package/dist/skills/probes.d.ts +26 -0
  537. package/dist/skills/probes.d.ts.map +1 -0
  538. package/dist/skills/probes.js +225 -0
  539. package/dist/skills/probes.js.map +1 -0
  540. package/dist/skills/recall.d.ts +119 -0
  541. package/dist/skills/recall.d.ts.map +1 -0
  542. package/dist/skills/recall.js +370 -0
  543. package/dist/skills/recall.js.map +1 -0
  544. package/dist/skills/receipts.d.ts +44 -0
  545. package/dist/skills/receipts.d.ts.map +1 -0
  546. package/dist/skills/receipts.js +223 -0
  547. package/dist/skills/receipts.js.map +1 -0
  548. package/dist/skills/run-checkout.d.ts +4 -0
  549. package/dist/skills/run-checkout.d.ts.map +1 -0
  550. package/dist/skills/run-checkout.js +37 -0
  551. package/dist/skills/run-checkout.js.map +1 -0
  552. package/dist/skills/runblock.d.ts +47 -0
  553. package/dist/skills/runblock.d.ts.map +1 -0
  554. package/dist/skills/runblock.js +227 -0
  555. package/dist/skills/runblock.js.map +1 -0
  556. package/dist/skills/save-gate.d.ts +64 -0
  557. package/dist/skills/save-gate.d.ts.map +1 -0
  558. package/dist/skills/save-gate.js +354 -0
  559. package/dist/skills/save-gate.js.map +1 -0
  560. package/dist/skills/save-parse.d.ts +42 -0
  561. package/dist/skills/save-parse.d.ts.map +1 -0
  562. package/dist/skills/save-parse.js +172 -0
  563. package/dist/skills/save-parse.js.map +1 -0
  564. package/dist/skills/save-store.d.ts +12 -0
  565. package/dist/skills/save-store.d.ts.map +1 -0
  566. package/dist/skills/save-store.js +22 -0
  567. package/dist/skills/save-store.js.map +1 -0
  568. package/dist/skills/save-verify.d.ts +59 -0
  569. package/dist/skills/save-verify.d.ts.map +1 -0
  570. package/dist/skills/save-verify.js +390 -0
  571. package/dist/skills/save-verify.js.map +1 -0
  572. package/dist/skills/settings.d.ts +48 -0
  573. package/dist/skills/settings.d.ts.map +1 -0
  574. package/dist/skills/settings.js +155 -0
  575. package/dist/skills/settings.js.map +1 -0
  576. package/dist/skills/skill-diff.d.ts +40 -0
  577. package/dist/skills/skill-diff.d.ts.map +1 -0
  578. package/dist/skills/skill-diff.js +191 -0
  579. package/dist/skills/skill-diff.js.map +1 -0
  580. package/dist/skills/skill-file.d.ts +24 -0
  581. package/dist/skills/skill-file.d.ts.map +1 -0
  582. package/dist/skills/skill-file.js +97 -0
  583. package/dist/skills/skill-file.js.map +1 -0
  584. package/dist/skills/skill-rebuild.d.ts +27 -0
  585. package/dist/skills/skill-rebuild.d.ts.map +1 -0
  586. package/dist/skills/skill-rebuild.js +85 -0
  587. package/dist/skills/skill-rebuild.js.map +1 -0
  588. package/dist/skills/skillmd.d.ts +17 -0
  589. package/dist/skills/skillmd.d.ts.map +1 -0
  590. package/dist/skills/skillmd.js +219 -0
  591. package/dist/skills/skillmd.js.map +1 -0
  592. package/dist/skills/skills.d.ts +28 -8
  593. package/dist/skills/skills.d.ts.map +1 -1
  594. package/dist/skills/skills.js +106 -53
  595. package/dist/skills/skills.js.map +1 -1
  596. package/dist/skills/staleness.d.ts +27 -0
  597. package/dist/skills/staleness.d.ts.map +1 -0
  598. package/dist/skills/staleness.js +178 -0
  599. package/dist/skills/staleness.js.map +1 -0
  600. package/dist/skills/state.d.ts +36 -0
  601. package/dist/skills/state.d.ts.map +1 -0
  602. package/dist/skills/state.js +259 -0
  603. package/dist/skills/state.js.map +1 -0
  604. package/dist/skills/store-fs.d.ts +77 -0
  605. package/dist/skills/store-fs.d.ts.map +1 -0
  606. package/dist/skills/store-fs.js +194 -0
  607. package/dist/skills/store-fs.js.map +1 -0
  608. package/dist/skills/store-held.d.ts +44 -0
  609. package/dist/skills/store-held.d.ts.map +1 -0
  610. package/dist/skills/store-held.js +147 -0
  611. package/dist/skills/store-held.js.map +1 -0
  612. package/dist/skills/store.d.ts +73 -0
  613. package/dist/skills/store.d.ts.map +1 -0
  614. package/dist/skills/store.js +279 -0
  615. package/dist/skills/store.js.map +1 -0
  616. package/dist/skills/types.d.ts +8 -0
  617. package/dist/skills/types.d.ts.map +1 -1
  618. package/dist/skills/update-gate.d.ts +36 -0
  619. package/dist/skills/update-gate.d.ts.map +1 -0
  620. package/dist/skills/update-gate.js +357 -0
  621. package/dist/skills/update-gate.js.map +1 -0
  622. package/dist/skills/update-plan.d.ts +40 -0
  623. package/dist/skills/update-plan.d.ts.map +1 -0
  624. package/dist/skills/update-plan.js +196 -0
  625. package/dist/skills/update-plan.js.map +1 -0
  626. package/dist/skills/validate.d.ts +11 -0
  627. package/dist/skills/validate.d.ts.map +1 -0
  628. package/dist/skills/validate.js +112 -0
  629. package/dist/skills/validate.js.map +1 -0
  630. package/dist/skills/value-line.d.ts +94 -0
  631. package/dist/skills/value-line.d.ts.map +1 -0
  632. package/dist/skills/value-line.js +355 -0
  633. package/dist/skills/value-line.js.map +1 -0
  634. package/dist/skills/versions-fs.d.ts +45 -0
  635. package/dist/skills/versions-fs.d.ts.map +1 -0
  636. package/dist/skills/versions-fs.js +234 -0
  637. package/dist/skills/versions-fs.js.map +1 -0
  638. package/dist/skills/versions.d.ts +56 -0
  639. package/dist/skills/versions.d.ts.map +1 -0
  640. package/dist/skills/versions.js +351 -0
  641. package/dist/skills/versions.js.map +1 -0
  642. package/dist/telemetry/contract.d.ts +15 -1
  643. package/dist/telemetry/contract.d.ts.map +1 -1
  644. package/dist/telemetry/contract.js +80 -11
  645. package/dist/telemetry/contract.js.map +1 -1
  646. package/dist/telemetry/gate.js +4 -4
  647. package/dist/telemetry/gate.js.map +1 -1
  648. package/dist/telemetry/index.d.ts +1 -1
  649. package/dist/telemetry/index.d.ts.map +1 -1
  650. package/dist/telemetry/index.js +1 -1
  651. package/dist/telemetry/index.js.map +1 -1
  652. package/dist/telemetry/notice.js +5 -5
  653. package/dist/telemetry/notice.js.map +1 -1
  654. package/dist/telemetry/queue.d.ts.map +1 -1
  655. package/dist/telemetry/queue.js +7 -7
  656. package/dist/telemetry/queue.js.map +1 -1
  657. package/dist/telemetry/track.d.ts.map +1 -1
  658. package/dist/telemetry/track.js +4 -3
  659. package/dist/telemetry/track.js.map +1 -1
  660. package/dist/trace/checks.d.ts +63 -0
  661. package/dist/trace/checks.d.ts.map +1 -0
  662. package/dist/trace/checks.js +495 -0
  663. package/dist/trace/checks.js.map +1 -0
  664. package/dist/trace/claude.d.ts +124 -0
  665. package/dist/trace/claude.d.ts.map +1 -0
  666. package/dist/trace/claude.js +303 -0
  667. package/dist/trace/claude.js.map +1 -0
  668. package/dist/trace/codex-exec.d.ts +22 -0
  669. package/dist/trace/codex-exec.d.ts.map +1 -0
  670. package/dist/trace/codex-exec.js +129 -0
  671. package/dist/trace/codex-exec.js.map +1 -0
  672. package/dist/trace/codex-meta.d.ts +23 -0
  673. package/dist/trace/codex-meta.d.ts.map +1 -0
  674. package/dist/trace/codex-meta.js +112 -0
  675. package/dist/trace/codex-meta.js.map +1 -0
  676. package/dist/trace/codex.d.ts +33 -0
  677. package/dist/trace/codex.d.ts.map +1 -0
  678. package/dist/trace/codex.js +485 -0
  679. package/dist/trace/codex.js.map +1 -0
  680. package/dist/trace/cursor.d.ts +16 -0
  681. package/dist/trace/cursor.d.ts.map +1 -0
  682. package/dist/trace/cursor.js +133 -0
  683. package/dist/trace/cursor.js.map +1 -0
  684. package/dist/trace/dialect.d.ts +43 -0
  685. package/dist/trace/dialect.d.ts.map +1 -0
  686. package/dist/trace/dialect.js +95 -0
  687. package/dist/trace/dialect.js.map +1 -0
  688. package/dist/trace/epochs.d.ts +10 -0
  689. package/dist/trace/epochs.d.ts.map +1 -0
  690. package/dist/trace/epochs.js +16 -0
  691. package/dist/trace/epochs.js.map +1 -0
  692. package/dist/trace/failure.d.ts +15 -0
  693. package/dist/trace/failure.d.ts.map +1 -0
  694. package/dist/trace/failure.js +69 -0
  695. package/dist/trace/failure.js.map +1 -0
  696. package/dist/trace/gate-file.d.ts +71 -0
  697. package/dist/trace/gate-file.d.ts.map +1 -0
  698. package/dist/trace/gate-file.js +329 -0
  699. package/dist/trace/gate-file.js.map +1 -0
  700. package/dist/trace/guard-fast.d.ts +22 -0
  701. package/dist/trace/guard-fast.d.ts.map +1 -0
  702. package/dist/trace/guard-fast.js +213 -0
  703. package/dist/trace/guard-fast.js.map +1 -0
  704. package/dist/trace/housekeeping.d.ts +5 -0
  705. package/dist/trace/housekeeping.d.ts.map +1 -0
  706. package/dist/trace/housekeeping.js +93 -0
  707. package/dist/trace/housekeeping.js.map +1 -0
  708. package/dist/trace/jobs.d.ts +52 -0
  709. package/dist/trace/jobs.d.ts.map +1 -0
  710. package/dist/trace/jobs.js +182 -0
  711. package/dist/trace/jobs.js.map +1 -0
  712. package/dist/trace/known-repo.d.ts +3 -0
  713. package/dist/trace/known-repo.d.ts.map +1 -0
  714. package/dist/trace/known-repo.js +55 -0
  715. package/dist/trace/known-repo.js.map +1 -0
  716. package/dist/trace/pool.d.ts +40 -0
  717. package/dist/trace/pool.d.ts.map +1 -0
  718. package/dist/trace/pool.js +154 -0
  719. package/dist/trace/pool.js.map +1 -0
  720. package/dist/trace/repairs.d.ts +27 -0
  721. package/dist/trace/repairs.d.ts.map +1 -0
  722. package/dist/trace/repairs.js +303 -0
  723. package/dist/trace/repairs.js.map +1 -0
  724. package/dist/trace/run-calls.d.ts +82 -0
  725. package/dist/trace/run-calls.d.ts.map +1 -0
  726. package/dist/trace/run-calls.js +331 -0
  727. package/dist/trace/run-calls.js.map +1 -0
  728. package/dist/trace/run-join.d.ts +20 -0
  729. package/dist/trace/run-join.d.ts.map +1 -0
  730. package/dist/trace/run-join.js +99 -0
  731. package/dist/trace/run-join.js.map +1 -0
  732. package/dist/trace/run-sheets.d.ts +26 -0
  733. package/dist/trace/run-sheets.d.ts.map +1 -0
  734. package/dist/trace/run-sheets.js +145 -0
  735. package/dist/trace/run-sheets.js.map +1 -0
  736. package/dist/trace/run-turns.d.ts +24 -0
  737. package/dist/trace/run-turns.d.ts.map +1 -0
  738. package/dist/trace/run-turns.js +67 -0
  739. package/dist/trace/run-turns.js.map +1 -0
  740. package/dist/trace/run-verdict.d.ts +24 -0
  741. package/dist/trace/run-verdict.d.ts.map +1 -0
  742. package/dist/trace/run-verdict.js +176 -0
  743. package/dist/trace/run-verdict.js.map +1 -0
  744. package/dist/trace/runs.d.ts +54 -0
  745. package/dist/trace/runs.d.ts.map +1 -0
  746. package/dist/trace/runs.js +501 -0
  747. package/dist/trace/runs.js.map +1 -0
  748. package/dist/trace/skill-session.d.ts +64 -0
  749. package/dist/trace/skill-session.d.ts.map +1 -0
  750. package/dist/trace/skill-session.js +232 -0
  751. package/dist/trace/skill-session.js.map +1 -0
  752. package/dist/trace/tamper.d.ts +12 -0
  753. package/dist/trace/tamper.d.ts.map +1 -0
  754. package/dist/trace/tamper.js +405 -0
  755. package/dist/trace/tamper.js.map +1 -0
  756. package/dist/trace/typed.d.ts +30 -0
  757. package/dist/trace/typed.d.ts.map +1 -0
  758. package/dist/trace/typed.js +132 -0
  759. package/dist/trace/typed.js.map +1 -0
  760. package/dist/trace/wall-state.d.ts +86 -0
  761. package/dist/trace/wall-state.d.ts.map +1 -0
  762. package/dist/trace/wall-state.js +279 -0
  763. package/dist/trace/wall-state.js.map +1 -0
  764. package/dist/trace/walls.d.ts +40 -0
  765. package/dist/trace/walls.d.ts.map +1 -0
  766. package/dist/trace/walls.js +318 -0
  767. package/dist/trace/walls.js.map +1 -0
  768. package/dist/upkeep-run.d.ts.map +1 -1
  769. package/dist/upkeep-run.js +2 -23
  770. package/dist/upkeep-run.js.map +1 -1
  771. package/dist/upkeep.d.ts.map +1 -1
  772. package/dist/upkeep.js +2 -3
  773. package/dist/upkeep.js.map +1 -1
  774. package/dist/util/private-fs.d.ts +6 -0
  775. package/dist/util/private-fs.d.ts.map +1 -1
  776. package/dist/util/private-fs.js +9 -1
  777. package/dist/util/private-fs.js.map +1 -1
  778. package/dist/util/state.d.ts.map +1 -1
  779. package/dist/util/state.js +17 -3
  780. package/dist/util/state.js.map +1 -1
  781. package/dist/vendor/tree-sitter-swift/LICENSE +21 -0
  782. package/dist/vendor/tree-sitter-swift/node-types.json +30694 -0
  783. package/dist/vendor/tree-sitter-swift/prebuilds/darwin-arm64/tree-sitter-swift.node +0 -0
  784. package/dist/vendor/tree-sitter-swift/prebuilds/darwin-x64/tree-sitter-swift.node +0 -0
  785. package/dist/vendor/tree-sitter-swift/prebuilds/linux-arm64/tree-sitter-swift.node +0 -0
  786. package/dist/vendor/tree-sitter-swift/prebuilds/linux-x64/tree-sitter-swift.node +0 -0
  787. package/dist/vendor/tree-sitter-swift/prebuilds/win32-arm64/tree-sitter-swift.node +0 -0
  788. package/dist/vendor/tree-sitter-swift/prebuilds/win32-x64/tree-sitter-swift.node +0 -0
  789. package/package.json +6 -3
  790. package/scripts/stamp-telemetry-key.mjs +8 -5
  791. package/scripts/vendor-grammars.mjs +35 -0
@@ -0,0 +1,390 @@
1
+ /**
2
+ * The save gate's decision (design 4.9 steps 1 to 10, `verifySave`), shared
3
+ * by the PreToolUse half and the CLI half so they can't disagree.
4
+ * Re-exported from `save-gate.ts`, where the design names it.
5
+ *
6
+ * Consent is never taken from a flag, an agent message or a file the agent
7
+ * can write alone: it needs the prompt hook's own record of the person's
8
+ * words (a hash) and the line the person typed in the transcript, read at
9
+ * its offset. Every step must have run here and worked, read from the
10
+ * transcript itself, not from the run sheet. Each line is read through the
11
+ * session's host dialect (4.16): Claude Code's lines by their own flags,
12
+ * Codex's typed lines only by the prompt hook's hashes (P30).
13
+ */
14
+ import { homedir } from 'node:os';
15
+ import { findPriorSheet, joinCarriedSheet, readRunSheet } from '../trace/runs.js';
16
+ import { isTypedByPerson, textOf } from '../trace/claude.js';
17
+ import { CLAUDE_DIALECT, CLAUDE_USE, dialectFor, typedOnLine } from '../trace/dialect.js';
18
+ import { classifyAnswer, isSaveRequest, typedSha } from '../trace/typed.js';
19
+ import { redactSecrets, cleanLine } from '../trace/redact.js';
20
+ import { splitTop } from '../trace/shell.js';
21
+ import { callText } from '../trace/checks.js';
22
+ import { callParts, grepNoMatch, MAX_RAW } from '../trace/run-calls.js';
23
+ import { failedText } from '../trace/failure.js';
24
+ import { isHookScriptTamper } from '../trace/tamper.js';
25
+ import { secretReason } from '../notes/secrets.js';
26
+ import { flatLine } from '../notes/flatten.js';
27
+ import { repoName } from '../notes/home.js';
28
+ import { compileRun, refusalWords } from './compile.js';
29
+ import { goodName } from './compile-words.js';
30
+ import { renderSkillMd } from './skillmd.js';
31
+ import { heldRunId, nameTaken, readSkillsStateSafe } from './save-store.js';
32
+ import { stepsTotal } from './store-fs.js';
33
+ import { linkedOwnFolder } from './own-folder.js';
34
+ import { lineAt, lineSha, linesBefore } from './receipts.js';
35
+ import { endsWithLine, isKeepLine, KEEP_IT } from './offer-words.js';
36
+ import { skillSha } from './offer-moment.js';
37
+ import { hostFacts } from './host-facts.js';
38
+ import { offerLinesOf } from './offer-lines.js';
39
+ import { runCheckout } from './run-checkout.js';
40
+ import { stepLearnings } from './follow-learnings.js';
41
+ const NOT = 'trail · not saved: ';
42
+ export const DENY = {
43
+ subagent: `${NOT}only the main session can keep a skill.`,
44
+ noPerson: `${NOT}this session runs without a person at the keyboard (headless, CI or a scratch folder), so Trail keeps nothing from it.`,
45
+ busy: `${NOT}Trail was busy. Run the same command again.`,
46
+ flags: `${NOT}\`trail skills add\` takes only a name and --run <id>.`,
47
+ name: `${NOT}pick a name with lowercase letters, digits and dashes, with at least one letter.`,
48
+ run: `${NOT}that run isn't from this session.`,
49
+ /** D94: a host whose transcript Trail can't read (Cursor, tier D) has no run of this session to keep. */
50
+ unreadable: `${NOT}Trail can't read this tool's session history, so it can't keep skills from it.`,
51
+ secret: `${NOT}a step still holds something that looks like a secret.`,
52
+ changed: `${NOT}the steps changed after the offer, so they aren't the ones the person said yes to. If they want these, they can say "save this as a skill".`,
53
+ askedChanged: `${NOT}the steps changed after you asked. Ask again once the job is done.`,
54
+ };
55
+ /** The person's own ask names `name`: as typed, or with spaces for its dashes. */
56
+ const namedIn = (typed, name) => {
57
+ const t = ` ${typed.toLowerCase().replace(/[^a-z0-9-]+/g, ' ')} `;
58
+ return t.includes(` ${name} `) || t.includes(` ${name.replace(/-/g, ' ')} `);
59
+ };
60
+ const askedNameDeny = (name, use, runId) => `${NOT}the person asked to keep this as ${flatLine(name, 60)}. Run: trail skills add ${flatLine(use, 60)} --run ${flatLine(runId, 40)}`;
61
+ const offeredNameDeny = (name, use, runId) => `${NOT}the offer was for the name ${flatLine(name, 60)}. Run: trail skills add ${flatLine(use, 60)} --run ${flatLine(runId, 40)}`;
62
+ /** The refusal for a tamper mark: a hook script run by hand in its own words (D93), a write naming what it wrote. */
63
+ export const tamperDeny = (what) => isHookScriptTamper(what)
64
+ ? `${NOT}this session ran Trail's hook script by hand, so Trail can't trust its record of what ran.`
65
+ : `${NOT}this session changed Trail's own files (${flatLine(what, 120)}), so Trail can't trust its record of what ran.`;
66
+ const linkDeny = (folder) => `${NOT}${flatLine(folder, 60)} in Trail's home is a link, not Trail's own folder, so Trail won't write through it.`;
67
+ /** D70: a run this session did in another checkout, named in words (`acme/storefront`). */
68
+ function otherRepoDeny(runRepo, scope) {
69
+ const names = [...new Set(scope.map((k) => flatLine(repoName(k), 60)).filter(Boolean))].slice(0, 3);
70
+ const here = names.length ? `, and this session works in ${names.length < 2 ? names[0] : `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`}` : '';
71
+ return `${NOT}that run was done in ${flatLine(repoName(runRepo), 60)}${here}, so Trail can't keep it from here.`;
72
+ }
73
+ const keptDeny = (name) => `${NOT}that run is already kept as the skill ${flatLine(name, 60)}.`;
74
+ const neverRanDeny = (cmds) => `${NOT}these steps never ran here and worked: ${cmds.join('; ')}.`;
75
+ const takenDeny = (name, where, runId, other) => `${NOT}the name ${name} is taken (${where}). Use another: trail skills add ${other} --run ${flatLine(runId, 40)}`;
76
+ const WHERE = {
77
+ personal: 'one of your skills', retired: 'a skill you forgot, which trail skills restore brings back', held: 'a skill Trail is holding for you to keep',
78
+ repo: "this repo's skills", team: "your team's skills", host: 'a skill your agent already has', 'built-in': "one of Trail's own commands", invalid: 'not a folder name',
79
+ };
80
+ /** `name` is free to take for this run: nobody has it, or only a held copy of this same run (D65). */
81
+ function nameFreeFor(name, runId, scope) {
82
+ const where = nameTaken(name, scope);
83
+ return where === null || (where === 'held' && heldRunId(name, scope.env) === runId);
84
+ }
85
+ /** The first free `name-2` .. `name-20` for this run; '<other>' when none is. */
86
+ function numbered(name, runId, scope) {
87
+ for (let k = 2; k <= 20; k++)
88
+ if (goodName(`${name}-${k}`) && nameFreeFor(`${name}-${k}`, runId, scope))
89
+ return `${name}-${k}`;
90
+ return '<other>';
91
+ }
92
+ /** `name` is `base` with a number on the end (`release-npm-3`). */
93
+ const sameNumbered = (name, base) => name.startsWith(`${base}-`) && /^[1-9]\d?$/.test(name.slice(base.length + 1));
94
+ const denied = (deny, extra = {}) => ({ deny, consent: 'none', offerId: null, typed: null, stepsTotal: 0, stepsVerified: 0, verdict: 'held', ...extra });
95
+ const parse = (line) => {
96
+ if (line === null)
97
+ return null;
98
+ try {
99
+ const v = JSON.parse(line);
100
+ return v && typeof v === 'object' && !Array.isArray(v) ? v : null;
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ };
106
+ const NONE = { consent: 'none', offerId: null, typed: null, at: Number.NaN, afterShow: false };
107
+ const pick = (c) => ({ consent: c.consent, offerId: c.offerId, typed: c.typed });
108
+ /** The dialect a session's lines are read with (4.16), and the state its typed lines are judged by. */
109
+ export const dialectUse = (host, st) => ({ dialect: dialectFor(host) ?? CLAUDE_DIALECT, st });
110
+ /**
111
+ * Step 5's second half: the line at `offset` is one the person typed, its words hash to `sha`; and when it was written.
112
+ * `use`: the host's dialect and the session state (Claude's by default).
113
+ */
114
+ export function personLine(tx, offset, sha, mustBe, env, said, use = CLAUDE_USE) {
115
+ const line = lineAt(tx, offset);
116
+ const entry = parse(line);
117
+ const text = entry ? typedOnLine(entry, use, env) : '';
118
+ if (!entry || !text)
119
+ return null;
120
+ if (typedSha(text) !== sha || !mustBe(text))
121
+ return null;
122
+ said?.(text);
123
+ return { typed: { offset, lineSha: lineSha(line) }, at: Date.parse(String(entry.timestamp ?? '')) };
124
+ }
125
+ /**
126
+ * Phase 2 (4.7): a yes to which offers keeps a run as a skill. 1a and 1b's moments; of phase 2's, only moment 5's
127
+ * split, whose new skill is this offer's name. An update, a drift or a retire offer's yes is never a yes to an add.
128
+ */
129
+ export const isSplitOffer = (po) => !!po && po.moment === 'update' && po.fold?.op === 'split' && typeof po.fold.splitName === 'string' && po.fold.splitName === po.name;
130
+ const keepsASkill = (po) => (po.moment === 'update' || po.moment === 'drift' || po.moment === 'retire' ? isSplitOffer(po) : true);
131
+ /** 4.9 step 5: offer-yes, asked, or none, from the hook's record and the person's line. The bindings come after compile. */
132
+ /** `said`: the person's save request as typed (D71 b: a job-less run's asks); never part of the verdict or the receipt. */
133
+ function consentOf(cmd, st, tx, env, said, use) {
134
+ if (!tx)
135
+ return NONE;
136
+ const po = st.pendingOffer;
137
+ if (po && po.runId === cmd.runId && po.shownAt && po.yes && keepsASkill(po)) {
138
+ const ta = po.typedAfter;
139
+ const entry = ta[0]?.answer === 'show' ? ta[1] : ta[0];
140
+ if (entry && entry.answer === 'yes' && entry.sha === po.yes.typedSha) {
141
+ const afterShow = entry !== ta[0];
142
+ const p = personLine(tx, entry.offset, entry.sha, (t) => classifyAnswer(t, afterShow) === 'yes', env, undefined, use);
143
+ if (p)
144
+ return { consent: 'offer-yes', offerId: po.offerId, typed: p.typed, at: p.at, afterShow };
145
+ }
146
+ }
147
+ const sr = st.saveRequest;
148
+ if (sr && sr.runId === cmd.runId && sr.typed && sr.typed.sha === sr.typedSha) {
149
+ const p = personLine(tx, sr.typed.offset, sr.typed.sha, isSaveRequest, env, said, use);
150
+ if (p)
151
+ return { consent: 'asked', offerId: null, typed: p.typed, at: p.at, afterShow: false };
152
+ }
153
+ return NONE;
154
+ }
155
+ /**
156
+ * The agent's last words before the person's line at `offset`: the text of the main session's last reply, when no
157
+ * tool call, tool result or other typed line comes between them; null otherwise, or further back than 1 MB.
158
+ */
159
+ export function replyBefore(tx, offset, env, use = CLAUDE_USE) {
160
+ const lines = linesBefore(tx, offset);
161
+ if (use.dialect.host !== 'claude')
162
+ return replyBeforeEvents(lines, env, use);
163
+ for (let i = lines.length - 1; i >= 0; i--) {
164
+ const e = parse(lines[i]);
165
+ if (!e || e.isSidechain)
166
+ continue;
167
+ if (isTypedByPerson(e, env))
168
+ return null;
169
+ const content = e.message?.content;
170
+ const parts = Array.isArray(content) ? content : [];
171
+ if (e.type === 'user') {
172
+ if (parts.some((p) => p && p.type === 'tool_result'))
173
+ return null;
174
+ continue; // a hook's feedback, a command's output: not the agent's words
175
+ }
176
+ if (e.type !== 'assistant')
177
+ continue; // system rows, attachments, the host's bookkeeping
178
+ if (parts.some((p) => p && p.type === 'tool_use'))
179
+ return null;
180
+ const text = textOf(content);
181
+ if (text.trim())
182
+ return text;
183
+ }
184
+ return null;
185
+ }
186
+ /** replyBefore for a dialect other than Claude's: each line decoded on its own, newest first. */
187
+ function replyBeforeEvents(lines, env, use) {
188
+ for (let i = lines.length - 1; i >= 0; i--) {
189
+ const e = parse(lines[i]);
190
+ if (!e)
191
+ continue;
192
+ const evs = use.dialect.lineEvents(e, {}, undefined, env);
193
+ if (evs.some((ev) => ev.kind === 'tool_call' || ev.kind === 'tool_result'))
194
+ return null;
195
+ if (evs.some((ev) => ev.kind === 'typed' && use.dialect.typedByPerson(ev, use.st, env)))
196
+ return null;
197
+ const said = evs.flatMap((ev) => (ev.kind === 'assistant' ? [ev.text] : []));
198
+ if (said.length)
199
+ return said.join('\n');
200
+ }
201
+ return null;
202
+ }
203
+ const SKEW_MS = 5000;
204
+ /**
205
+ * The person's line answers what it consents to (g5 review). Both: the run had started when they wrote it. An offer's
206
+ * yes: the agent's reply right before it ended with the offer's own question (a Keep line; "Keep it? (yes / no)"
207
+ * after the draft), unless the host shows the offer as Trail's own notice, so a yes to a question the agent added
208
+ * is no yes to the skill.
209
+ */
210
+ function answers(c, po, sheet, tx, env, use) {
211
+ if (c.consent === 'none' || !c.typed)
212
+ return false;
213
+ if (!(Date.parse(sheet.startedAt) <= c.at + SKEW_MS))
214
+ return false;
215
+ if (c.consent === 'asked')
216
+ return true;
217
+ // 1b (R12): the offer's lines through offerLinesOf; an offer with none has no yes.
218
+ const lines = po ? offerLinesOf(po, tx, env, use) : null;
219
+ // A split's line 2 is its own question (4.7), checked word for word below like a keep line.
220
+ if (!po || !lines || !(isKeepLine(lines[1]) || isSplitOffer(po)))
221
+ return false;
222
+ if (po.channel === 'notice' && hostFacts(env, use.dialect.host).offerChannel === 'notice')
223
+ return true;
224
+ // After "show me", 1a's moments ask Keep it?; a split asks its own line 2 again (c3's show directive), as the update gate reads it.
225
+ return endsWithLine(replyBefore(tx, c.typed.offset, env, use) ?? '', c.afterShow && !isSplitOffer(po) ? KEEP_IT : lines[1]);
226
+ }
227
+ const clip = (t) => (t.length > 40_000 ? `${t.slice(0, 8000)}\n…\n${t.slice(-32_000)}` : t);
228
+ /** The command as the fold stored it (4.10, D58c): redacted, or piece by piece when over 2,000 characters. */
229
+ function storedForm(raw, job) {
230
+ if (raw.length > MAX_RAW)
231
+ return callText({ cmd: null, parts: callParts(splitTop(raw), job) });
232
+ return redactSecrets(raw).cmd;
233
+ }
234
+ const storedText = (c) => (c.cmd !== null ? c.cmd : c.parts?.length ? callText(c) : null);
235
+ /** The call and its result as `d` reads their two lines, decoded in order with one memo; null when either isn't there. */
236
+ function callLines(call, tx, use, env) {
237
+ const memo = {};
238
+ const at = (offset) => {
239
+ const e = parse(lineAt(tx, offset));
240
+ return e ? use.dialect.lineEvents(e, memo, offset, env) : [];
241
+ };
242
+ const c = at(call.src.use).find((ev) => ev.kind === 'tool_call' && ev.id === call.id);
243
+ const r = at(call.src.result).find((ev) => ev.kind === 'tool_result' && ev.id === call.id);
244
+ if (!c || c.kind !== 'tool_call' || !r || r.kind !== 'tool_result')
245
+ return null;
246
+ // A result whose exit never showed (ok false, no error flag) is no proof it worked.
247
+ return { block: { name: c.name, input: c.input }, out: { isError: r.isError === true || !r.ok, text: r.text } };
248
+ }
249
+ /** 4.9 step 7 for one call: its tool_use and tool_result lines, read at their offsets, show it ran as stored and worked. */
250
+ export function ranAndWorked(call, tx, job, how = CLAUDE_USE, env = process.env) {
251
+ if (!call || call.fromMark || call.failed || call.src.result === null || call.src.use < 0 || call.src.result < 0)
252
+ return false;
253
+ if (how.dialect.host !== 'claude') {
254
+ const got = callLines(call, tx, how, env);
255
+ return got !== null && workedAs(call, got.block, got.out.isError, got.out.text, job);
256
+ }
257
+ const use = parse(lineAt(tx, call.src.use));
258
+ const res = parse(lineAt(tx, call.src.result));
259
+ if (!use || !res || use.type !== 'assistant' || res.type !== 'user' || use.isSidechain || res.isSidechain)
260
+ return false;
261
+ const block = Array.isArray(use.message?.content) ? use.message.content.find((p) => p && p.type === 'tool_use' && p.id === call.id) : null;
262
+ const out = Array.isArray(res.message?.content) ? res.message.content.find((p) => p && p.type === 'tool_result' && p.tool_use_id === call.id) : null;
263
+ if (!block || !out)
264
+ return false;
265
+ return workedAs(call, block, out.is_error === true, typeof out.content === 'string' ? out.content : textOf(out.content), job);
266
+ }
267
+ /** The call as its lines show it ran: the stored command (or tool), and a result that worked. */
268
+ function workedAs(call, block, isError, text, job) {
269
+ if (call.tool)
270
+ return block.name === call.tool && !isError;
271
+ const raw = block.name === 'Bash' && typeof block.input?.command === 'string' ? block.input.command : null;
272
+ if (raw === null)
273
+ return false;
274
+ const stored = storedText(call);
275
+ if (stored === null || storedForm(raw, job) !== stored)
276
+ return false;
277
+ // A look fails by its exit or the host's flag only, as the fold judges it (D56c).
278
+ if (call.kind === 'look' || call.kind === 'plumbing')
279
+ return !(isError && !grepNoMatch(raw, text));
280
+ return !isError && !failedText(clip(text));
281
+ }
282
+ /**
283
+ * D93: the checkout `sheet` ran in, from the run itself (its sheet's checkout; for an older sheet, the ctx's when it
284
+ * is the run's repo), so both halves compile the same steps wherever the CLI runs; '' when none holds.
285
+ */
286
+ const rootFor = (sheet, ctx, env) => runCheckout(sheet, env, ctx.checkout && ctx.repoKey === sheet.repoKey ? ctx.checkout : '');
287
+ /** 4.9 steps 1 to 10. `cmd` null: the command matched `skills add` but didn't parse (step 1). */
288
+ export function verifySave(cmd, ctx, st, _fold, env = ctx.env) {
289
+ // 3.3 step 3.1, here too: the gate holds even when a caller skipped it.
290
+ if (ctx.subagent)
291
+ return denied(DENY.subagent);
292
+ if (!ctx.fold)
293
+ return denied(DENY.noPerson);
294
+ if (!cmd || cmd.flags.length)
295
+ return denied(DENY.flags);
296
+ if (!goodName(cmd.name))
297
+ return denied(DENY.name);
298
+ if (st.tampered)
299
+ return denied(tamperDeny(st.tampered));
300
+ const linked = linkedOwnFolder(env);
301
+ if (linked)
302
+ return denied(linkDeny(linked));
303
+ const own = readRunSheet(cmd.runId, env);
304
+ // D94: outside Claude Code no run of this session means Trail could not read its history, not a wrong run id.
305
+ if (!own || own.session !== ctx.sessionHash || own.session !== st.sessionHash)
306
+ return denied(ctx.tier !== 'A' ? DENY.unreadable : DENY.run);
307
+ if (!st.scopeKeys.includes(own.repoKey))
308
+ return denied(otherRepoDeny(own.repoKey, st.scopeKeys));
309
+ const keptAs = Object.values(readSkillsStateSafe(env)).find((s) => s.runId === cmd.runId && s.status !== 'retired');
310
+ if (keptAs)
311
+ return denied(keptDeny(keptAs.name));
312
+ let askedWith = null;
313
+ const how = dialectUse(ctx.host, st);
314
+ let c = consentOf(cmd, st, ctx.transcriptPath, env, (t) => { askedWith = t; }, how);
315
+ const po = st.pendingOffer;
316
+ const root = rootFor(own, ctx, env);
317
+ const scope = { repoKeys: st.scopeKeys, checkout: root || ctx.checkout, env };
318
+ // An offer's yes keeps the skill under the offered name; when that was taken since, under a numbered one (`name-2`).
319
+ // A split keeps exactly the name its offer showed (4.7): no numbered stand-in.
320
+ const offered = c.consent === 'offer-yes' && po ? (isSplitOffer(po) || nameFreeFor(po.name, cmd.runId, scope) ? po.name : numbered(po.name, cmd.runId, scope)) : null;
321
+ if (offered !== null && cmd.name !== po.name && cmd.name !== offered && !(offered !== po.name && sameNumbered(cmd.name, po.name))) {
322
+ return denied(offeredNameDeny(po.name, offered, cmd.runId), pick(c));
323
+ }
324
+ // Each sheet read once, so compile and step 7 see the same run.
325
+ const sheets = new Map([[own.id, own]]);
326
+ const read = (id) => {
327
+ if (!sheets.has(id))
328
+ sheets.set(id, readRunSheet(id, env));
329
+ return sheets.get(id);
330
+ };
331
+ const sr = st.saveRequest;
332
+ const compiled = compileRun(own, {
333
+ repoRoot: root, home: env.HOME || homedir(), platform: process.platform, readSheet: read, now: ctx.now,
334
+ prior: findPriorSheet(own, env), name: cmd.name, moment: c.consent === 'offer-yes' ? 'repeated' : 'asked', askedWith,
335
+ applies: c.consent === 'asked' && sr?.scope === 'every repo' ? 'every repo' : own.repoKey,
336
+ // The asked name is free here so compile keeps it; step 9 says where it is taken.
337
+ taken: (n) => n !== cmd.name && nameTaken(n, scope) !== null,
338
+ learnings: stepLearnings({ repoKeys: [own.repoKey], checkout: root, env }),
339
+ });
340
+ if (!compiled.ok)
341
+ return denied(`${NOT}${refusalWords(compiled.reason, compiled.detail)}.`, pick(c));
342
+ const skill = compiled.skill;
343
+ if (skill.name !== cmd.name)
344
+ return denied(DENY.name, pick(c));
345
+ if (c.consent !== 'none' && !answers(c, po, own, ctx.transcriptPath ?? '', env, how))
346
+ c = NONE;
347
+ // What the yes agreed to: the offer's skill, not steps the run gained after it or a sheet changed since.
348
+ if (c.consent === 'offer-yes' && po?.skillSha !== skillSha(skill))
349
+ return denied(DENY.changed, pick(c));
350
+ // D73: the same for an asked save: the skill compiled when the person asked. A request with no sha (older state) too.
351
+ if (c.consent === 'asked' && (typeof sr?.skillSha !== 'string' || sr.skillSha !== skillSha(skill)))
352
+ return denied(DENY.askedChanged, pick(c));
353
+ // An asked save keeps the name Trail gave it when the person asked (names drive the name cue), the numbered one the
354
+ // taken refusal suggests when that name was taken since, or a name the person typed in the ask itself ("save this
355
+ // as a skill called regen-client"). A request with no name (older state): refused.
356
+ if (c.consent === 'asked') {
357
+ const base = typeof sr?.name === 'string' ? sr.name : null;
358
+ if (base === null)
359
+ return denied(DENY.askedChanged, pick(c));
360
+ const use = nameFreeFor(base, cmd.runId, scope) ? base : numbered(base, cmd.runId, scope);
361
+ const typedAsk = askedWith;
362
+ const named = typedAsk !== null && namedIn(typedAsk, cmd.name);
363
+ if (cmd.name !== base && cmd.name !== use && !named && !(use !== base && sameNumbered(cmd.name, base)))
364
+ return denied(askedNameDeny(base, use, cmd.runId), pick(c));
365
+ }
366
+ // Step 7: every step, and the check when it is not a step, ran here and worked.
367
+ const joined = joinCarriedSheet(own, read);
368
+ const byId = new Map(joined.calls.map((x) => [x.id, x]));
369
+ const total = stepsTotal(skill);
370
+ const checkCall = joined.checkIndex === null ? null : joined.calls[joined.checkIndex] ?? null;
371
+ const units = skill.steps.map((s) => ({ ids: s.from ?? [], text: s.cmd }));
372
+ if (skill.check && !skill.checkIsStep)
373
+ units.push({ ids: checkCall ? [checkCall.id] : [], text: skill.check });
374
+ const bad = units.filter((u) => !u.ids.length || !u.ids.every((id) => ranAndWorked(byId.get(id), ctx.transcriptPath ?? '', joined.job, how, env)));
375
+ if (bad.length)
376
+ return denied(neverRanDeny(bad.slice(0, 3).map((u) => cleanLine(u.text, 80) ?? 'a step')), { ...pick(c), stepsTotal: total, stepsVerified: total - bad.length });
377
+ if (secretReason(renderSkillMd(skill)))
378
+ return denied(DENY.secret, { ...pick(c), stepsTotal: total, stepsVerified: total });
379
+ // Step 9. D65: a held item of this name kept from this same run is not in the way; the live save replaces it.
380
+ const where = nameTaken(cmd.name, scope);
381
+ if (where !== null && !(where === 'held' && heldRunId(cmd.name, env) === cmd.runId)) {
382
+ return denied(takenDeny(cmd.name, WHERE[where] ?? where, cmd.runId, offered ?? '<other>'), { ...pick(c), stepsTotal: total, stepsVerified: total });
383
+ }
384
+ const live = c.consent !== 'none' && ctx.learn;
385
+ return {
386
+ ...pick(c), stepsTotal: total, stepsVerified: total, compiled: skill, checkout: root,
387
+ verdict: live ? 'live' : 'held', ...(live ? {} : { heldWhy: ctx.learn ? 'no-yes' : 'host' }),
388
+ };
389
+ }
390
+ //# sourceMappingURL=save-verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-verify.js","sourceRoot":"","sources":["../../src/skills/save-verify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `~/.trail/settings.json`: learned skills on or off (on by default), offers
3
+ * on or off (everywhere or per repo), pauses after two nos, skills a person
4
+ * turned off, and the governor's cache. On by default changes no consent:
5
+ * nothing is kept or changed without the person's typed yes at each offer and
6
+ * update, and a step that can't be undone still asks first.
7
+ *
8
+ * Who may change what is fixed: only the person's own commands (the setters,
9
+ * imported only by `skills/cli-skills.ts`) turn skills and offers on or off;
10
+ * only the offer bookkeeping (`skills/offers.ts`) writes pauses and the
11
+ * governor. `trail init`, upgrades and `trail connect` never write this file.
12
+ * A test pins who imports what.
13
+ *
14
+ * A missing or broken file reads as the defaults. Keys a later version adds
15
+ * are kept on every write.
16
+ */
17
+ import type { TrailSkillSettings } from './types.js';
18
+ export { isTestHome, labInteractive } from './host-facts.js';
19
+ export declare const DEFAULT_SETTINGS: TrailSkillSettings;
20
+ /** Defaults on a missing or bad file; unknown keys are kept on every write. */
21
+ export declare function readSettings(env?: NodeJS.ProcessEnv): TrailSkillSettings;
22
+ /** TRAIL_TEST_NOW (ISO) in a test home only; else new Date(). */
23
+ export declare function trailNow(env?: NodeJS.ProcessEnv): Date;
24
+ /** The local calendar date `YYYY-MM-DD` of a time: days (pauses, session-days, last worked) are the person's days. */
25
+ export declare function localDate(at: Date | string): string;
26
+ /** onSince = now when it turns on. */
27
+ export declare function setSkills(on: boolean, env?: NodeJS.ProcessEnv, now?: Date): TrailSkillSettings;
28
+ /** here: adds or removes that repo key in offRepos; a global off sets offersOffAt. */
29
+ export declare function setOffers(on: boolean, here: string | null, env?: NodeJS.ProcessEnv, now?: Date): TrailSkillSettings;
30
+ export declare function setSkillOff(name: string, off: boolean, env?: NodeJS.ProcessEnv): TrailSkillSettings;
31
+ /**
32
+ * Skills are on by default, so `onSince` (the first week's offer cap, the
33
+ * weekly value line) starts at the first session start that finds them on
34
+ * with no date yet. Writes only `onSince`, and only then; never turns
35
+ * anything on or off. Only src/claude/skills-wiring.ts imports it (the same
36
+ * test).
37
+ */
38
+ export declare function noteSkillsStarted(env?: NodeJS.ProcessEnv, now?: Date): void;
39
+ export declare function pauseRepo(repoKey: string, until: Date, env?: NodeJS.ProcessEnv): TrailSkillSettings;
40
+ export declare function noteGovernor(lastNine: Array<'yes' | 'no' | 'none'>, saidAt: string | null, env?: NodeJS.ProcessEnv): TrailSkillSettings;
41
+ export declare function skillsOn(env?: NodeJS.ProcessEnv): boolean;
42
+ export declare function offersHere(repoKey: string, now?: Date, env?: NodeJS.ProcessEnv): {
43
+ ok: true;
44
+ } | {
45
+ ok: false;
46
+ why: 'off' | 'off-here' | 'paused';
47
+ };
48
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/skills/settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE7D,eAAO,MAAM,gBAAgB,EAAE,kBAIP,CAAC;AAoCzB,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAExE;AAiBD,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,IAAI,CAOnE;AAED,sHAAsH;AACtH,wBAAgB,SAAS,CAAC,EAAE,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAInD;AAID,sCAAsC;AACtC,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,kBAAkB,CAK1G;AAED,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,kBAAkB,CAW/H;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAKnG;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,CAUvF;AAID,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAInG;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAKvI;AAED,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAEzD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAA;CAAE,CAO7J"}
@@ -0,0 +1,155 @@
1
+ import { isTestHome } from './host-facts.js';
2
+ import { readJsonSafe, trailPath, withLock, writePrivate } from '../util/private-fs.js';
3
+ export { isTestHome, labInteractive } from './host-facts.js';
4
+ export const DEFAULT_SETTINGS = Object.freeze({
5
+ v: 1, skills: 'on', onSince: null, offers: 'on', offersOffAt: null, offRepos: Object.freeze([]),
6
+ pausedUntil: Object.freeze({}), skillsOff: Object.freeze([]),
7
+ lastNine: Object.freeze([]), governorSaidAt: null,
8
+ });
9
+ /** How long a person's command waits for the file; a hook's bookkeeping waits less. */
10
+ const PERSON_WAIT_MS = 1000;
11
+ const HOOK_WAIT_MS = 200;
12
+ const ANSWERS = new Set(['yes', 'no', 'none']);
13
+ function settingsPath(env) {
14
+ return trailPath(env, 'settings.json');
15
+ }
16
+ const strOrNull = (v) => (typeof v === 'string' ? v : null);
17
+ const strings = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === 'string') : []);
18
+ /** The known fields of whatever was on disk, each its default when missing or of the wrong shape. */
19
+ function fromRaw(raw) {
20
+ const r = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
21
+ const paused = {};
22
+ if (r.pausedUntil && typeof r.pausedUntil === 'object' && !Array.isArray(r.pausedUntil)) {
23
+ for (const [k, v] of Object.entries(r.pausedUntil))
24
+ if (typeof v === 'string')
25
+ paused[k] = v;
26
+ }
27
+ return {
28
+ v: 1,
29
+ // On unless the person turned skills off (`trail skills off`).
30
+ skills: r.skills === 'off' ? 'off' : 'on',
31
+ onSince: strOrNull(r.onSince),
32
+ offers: r.offers === 'off' ? 'off' : 'on',
33
+ offersOffAt: strOrNull(r.offersOffAt),
34
+ offRepos: strings(r.offRepos),
35
+ pausedUntil: paused,
36
+ skillsOff: strings(r.skillsOff),
37
+ lastNine: (Array.isArray(r.lastNine) ? r.lastNine : []).filter((a) => ANSWERS.has(a)).slice(-9),
38
+ governorSaidAt: strOrNull(r.governorSaidAt),
39
+ };
40
+ }
41
+ /** Defaults on a missing or bad file; unknown keys are kept on every write. */
42
+ export function readSettings(env) {
43
+ return fromRaw(readJsonSafe(settingsPath(env)));
44
+ }
45
+ /** Read, change, write back under the file's lock, keeping keys this version doesn't know. */
46
+ function update(env, change, waitMs) {
47
+ const path = settingsPath(env);
48
+ const done = withLock(path, () => {
49
+ const raw = readJsonSafe(path);
50
+ const keep = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
51
+ const s = fromRaw(raw);
52
+ change(s);
53
+ writePrivate(path, `${JSON.stringify({ ...keep, ...s }, null, 2)}\n`);
54
+ return s;
55
+ }, waitMs);
56
+ if (!done.ok)
57
+ throw new Error('trail: the skills settings are busy (another trail command is writing them). Try again.');
58
+ return done.value;
59
+ }
60
+ /** TRAIL_TEST_NOW (ISO) in a test home only; else new Date(). */
61
+ export function trailNow(env = process.env) {
62
+ const fixed = env.TRAIL_TEST_NOW;
63
+ if (fixed && isTestHome(env)) {
64
+ const d = new Date(fixed);
65
+ if (!Number.isNaN(d.getTime()))
66
+ return d;
67
+ }
68
+ return new Date();
69
+ }
70
+ /** The local calendar date `YYYY-MM-DD` of a time: days (pauses, session-days, last worked) are the person's days. */
71
+ export function localDate(at) {
72
+ const d = typeof at === 'string' ? new Date(at) : at;
73
+ const two = (n) => String(n).padStart(2, '0');
74
+ return `${d.getFullYear()}-${two(d.getMonth() + 1)}-${two(d.getDate())}`;
75
+ }
76
+ // Person-only setters. Only src/skills/cli-skills.ts imports these (a static test, G0).
77
+ /** onSince = now when it turns on. */
78
+ export function setSkills(on, env, now = new Date()) {
79
+ return update(env, (s) => {
80
+ if (on && (s.skills !== 'on' || s.onSince === null))
81
+ s.onSince = now.toISOString();
82
+ s.skills = on ? 'on' : 'off';
83
+ }, PERSON_WAIT_MS);
84
+ }
85
+ /** here: adds or removes that repo key in offRepos; a global off sets offersOffAt. */
86
+ export function setOffers(on, here, env, now = new Date()) {
87
+ return update(env, (s) => {
88
+ if (here !== null) {
89
+ s.offRepos = s.offRepos.filter((k) => k !== here);
90
+ if (!on)
91
+ s.offRepos.push(here);
92
+ return;
93
+ }
94
+ if (!on && s.offers !== 'off')
95
+ s.offersOffAt = now.toISOString();
96
+ if (on)
97
+ s.offersOffAt = null;
98
+ s.offers = on ? 'on' : 'off';
99
+ }, PERSON_WAIT_MS);
100
+ }
101
+ export function setSkillOff(name, off, env) {
102
+ return update(env, (s) => {
103
+ s.skillsOff = s.skillsOff.filter((n) => n !== name);
104
+ if (off)
105
+ s.skillsOff.push(name);
106
+ }, PERSON_WAIT_MS);
107
+ }
108
+ /**
109
+ * Skills are on by default, so `onSince` (the first week's offer cap, the
110
+ * weekly value line) starts at the first session start that finds them on
111
+ * with no date yet. Writes only `onSince`, and only then; never turns
112
+ * anything on or off. Only src/claude/skills-wiring.ts imports it (the same
113
+ * test).
114
+ */
115
+ export function noteSkillsStarted(env, now = new Date()) {
116
+ const s = readSettings(env);
117
+ if (s.skills !== 'on' || s.onSince !== null)
118
+ return;
119
+ try {
120
+ update(env, (cur) => {
121
+ if (cur.skills === 'on' && cur.onSince === null)
122
+ cur.onSince = now.toISOString();
123
+ }, HOOK_WAIT_MS);
124
+ }
125
+ catch {
126
+ /* busy: the next session start tries again */
127
+ }
128
+ }
129
+ // Bookkeeping writers. Only src/skills/offers.ts imports these (the same test).
130
+ export function pauseRepo(repoKey, until, env) {
131
+ return update(env, (s) => {
132
+ s.pausedUntil = { ...s.pausedUntil, [repoKey]: localDate(until) };
133
+ }, HOOK_WAIT_MS);
134
+ }
135
+ export function noteGovernor(lastNine, saidAt, env) {
136
+ return update(env, (s) => {
137
+ s.lastNine = lastNine.filter((a) => ANSWERS.has(a)).slice(-9);
138
+ s.governorSaidAt = saidAt;
139
+ }, HOOK_WAIT_MS);
140
+ }
141
+ export function skillsOn(env) {
142
+ return readSettings(env).skills === 'on';
143
+ }
144
+ export function offersHere(repoKey, now = new Date(), env) {
145
+ const s = readSettings(env);
146
+ if (s.offers === 'off')
147
+ return { ok: false, why: 'off' };
148
+ if (s.offRepos.includes(repoKey))
149
+ return { ok: false, why: 'off-here' };
150
+ const until = s.pausedUntil[repoKey];
151
+ if (until && until > localDate(now))
152
+ return { ok: false, why: 'paused' };
153
+ return { ok: true };
154
+ }
155
+ //# sourceMappingURL=settings.js.map