@nanonets/graft 0.24.1 → 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 (480) hide show
  1. package/README.md +26 -21
  2. package/dist/blast/render.js +1 -1
  3. package/dist/blast/render.js.map +1 -1
  4. package/dist/brand.js +1 -1
  5. package/dist/brand.js.map +1 -1
  6. package/dist/check/learning-edits.d.ts +18 -3
  7. package/dist/check/learning-edits.d.ts.map +1 -1
  8. package/dist/check/learning-edits.js +54 -10
  9. package/dist/check/learning-edits.js.map +1 -1
  10. package/dist/check/local-check.d.ts +7 -3
  11. package/dist/check/local-check.d.ts.map +1 -1
  12. package/dist/check/local-check.js +55 -11
  13. package/dist/check/local-check.js.map +1 -1
  14. package/dist/check/types.d.ts +11 -2
  15. package/dist/check/types.d.ts.map +1 -1
  16. package/dist/claude/format.d.ts +11 -7
  17. package/dist/claude/format.d.ts.map +1 -1
  18. package/dist/claude/format.js +50 -28
  19. package/dist/claude/format.js.map +1 -1
  20. package/dist/claude/hook-io.js +1 -1
  21. package/dist/claude/hook-io.js.map +1 -1
  22. package/dist/claude/hook-layers.d.ts +4 -2
  23. package/dist/claude/hook-layers.d.ts.map +1 -1
  24. package/dist/claude/hook-layers.js +21 -4
  25. package/dist/claude/hook-layers.js.map +1 -1
  26. package/dist/claude/hooks.d.ts +9 -32
  27. package/dist/claude/hooks.d.ts.map +1 -1
  28. package/dist/claude/hooks.js +154 -350
  29. package/dist/claude/hooks.js.map +1 -1
  30. package/dist/claude/init.d.ts.map +1 -1
  31. package/dist/claude/init.js +56 -18
  32. package/dist/claude/init.js.map +1 -1
  33. package/dist/claude/note-signals.d.ts +6 -0
  34. package/dist/claude/note-signals.d.ts.map +1 -1
  35. package/dist/claude/note-signals.js +14 -3
  36. package/dist/claude/note-signals.js.map +1 -1
  37. package/dist/claude/post-bash.d.ts +26 -0
  38. package/dist/claude/post-bash.d.ts.map +1 -0
  39. package/dist/claude/post-bash.js +191 -0
  40. package/dist/claude/post-bash.js.map +1 -0
  41. package/dist/claude/pre-bash-skills.d.ts +21 -0
  42. package/dist/claude/pre-bash-skills.d.ts.map +1 -0
  43. package/dist/claude/pre-bash-skills.js +253 -0
  44. package/dist/claude/pre-bash-skills.js.map +1 -0
  45. package/dist/claude/pre-bash.d.ts +50 -0
  46. package/dist/claude/pre-bash.d.ts.map +1 -0
  47. package/dist/claude/pre-bash.js +245 -0
  48. package/dist/claude/pre-bash.js.map +1 -0
  49. package/dist/claude/prompt-consent.d.ts +19 -0
  50. package/dist/claude/prompt-consent.d.ts.map +1 -0
  51. package/dist/claude/prompt-consent.js +14 -0
  52. package/dist/claude/prompt-consent.js.map +1 -0
  53. package/dist/claude/prompt-hook.d.ts +76 -0
  54. package/dist/claude/prompt-hook.d.ts.map +1 -0
  55. package/dist/claude/prompt-hook.js +303 -0
  56. package/dist/claude/prompt-hook.js.map +1 -0
  57. package/dist/claude/prompt-skills.d.ts +19 -0
  58. package/dist/claude/prompt-skills.d.ts.map +1 -0
  59. package/dist/claude/prompt-skills.js +305 -0
  60. package/dist/claude/prompt-skills.js.map +1 -0
  61. package/dist/claude/session-metrics.js +4 -4
  62. package/dist/claude/session-metrics.js.map +1 -1
  63. package/dist/claude/settings-merge.d.ts +10 -0
  64. package/dist/claude/settings-merge.d.ts.map +1 -1
  65. package/dist/claude/settings-merge.js +46 -17
  66. package/dist/claude/settings-merge.js.map +1 -1
  67. package/dist/claude/shim-template.d.ts.map +1 -1
  68. package/dist/claude/shim-template.js +86 -28
  69. package/dist/claude/shim-template.js.map +1 -1
  70. package/dist/claude/skill-template.d.ts +2 -0
  71. package/dist/claude/skill-template.d.ts.map +1 -1
  72. package/dist/claude/skill-template.js +53 -34
  73. package/dist/claude/skill-template.js.map +1 -1
  74. package/dist/claude/skill-use.d.ts +16 -0
  75. package/dist/claude/skill-use.d.ts.map +1 -0
  76. package/dist/claude/skill-use.js +78 -0
  77. package/dist/claude/skill-use.js.map +1 -0
  78. package/dist/claude/skills-wiring.d.ts +26 -0
  79. package/dist/claude/skills-wiring.d.ts.map +1 -0
  80. package/dist/claude/skills-wiring.js +110 -0
  81. package/dist/claude/skills-wiring.js.map +1 -0
  82. package/dist/claude/start-init.d.ts +13 -0
  83. package/dist/claude/start-init.d.ts.map +1 -0
  84. package/dist/claude/start-init.js +75 -0
  85. package/dist/claude/start-init.js.map +1 -0
  86. package/dist/claude/start-skills.d.ts +31 -0
  87. package/dist/claude/start-skills.d.ts.map +1 -0
  88. package/dist/claude/start-skills.js +274 -0
  89. package/dist/claude/start-skills.js.map +1 -0
  90. package/dist/claude/state.d.ts +19 -7
  91. package/dist/claude/state.d.ts.map +1 -1
  92. package/dist/claude/state.js +59 -4
  93. package/dist/claude/state.js.map +1 -1
  94. package/dist/claude/stop-skills.d.ts +23 -0
  95. package/dist/claude/stop-skills.d.ts.map +1 -0
  96. package/dist/claude/stop-skills.js +233 -0
  97. package/dist/claude/stop-skills.js.map +1 -0
  98. package/dist/claude/stop.d.ts +23 -0
  99. package/dist/claude/stop.d.ts.map +1 -0
  100. package/dist/claude/stop.js +219 -0
  101. package/dist/claude/stop.js.map +1 -0
  102. package/dist/claude/tally.d.ts +29 -41
  103. package/dist/claude/tally.d.ts.map +1 -1
  104. package/dist/claude/tally.js +111 -165
  105. package/dist/claude/tally.js.map +1 -1
  106. package/dist/claude/walls-hook.d.ts +52 -0
  107. package/dist/claude/walls-hook.d.ts.map +1 -0
  108. package/dist/claude/walls-hook.js +279 -0
  109. package/dist/claude/walls-hook.js.map +1 -0
  110. package/dist/cli-epilogue.d.ts.map +1 -1
  111. package/dist/cli-epilogue.js +24 -14
  112. package/dist/cli-epilogue.js.map +1 -1
  113. package/dist/cli-meta.js +3 -3
  114. package/dist/cli-meta.js.map +1 -1
  115. package/dist/cli-picker.d.ts.map +1 -1
  116. package/dist/cli-picker.js +8 -6
  117. package/dist/cli-picker.js.map +1 -1
  118. package/dist/cli.d.ts.map +1 -1
  119. package/dist/cli.js +238 -402
  120. package/dist/cli.js.map +1 -1
  121. package/dist/cloud/head-learnings.d.ts +13 -0
  122. package/dist/cloud/head-learnings.d.ts.map +1 -0
  123. package/dist/cloud/head-learnings.js +84 -0
  124. package/dist/cloud/head-learnings.js.map +1 -0
  125. package/dist/cloud/lookup-activity.d.ts +5 -3
  126. package/dist/cloud/lookup-activity.d.ts.map +1 -1
  127. package/dist/cloud/lookup-activity.js +8 -8
  128. package/dist/cloud/lookup-activity.js.map +1 -1
  129. package/dist/cloud/nudge.d.ts +15 -7
  130. package/dist/cloud/nudge.d.ts.map +1 -1
  131. package/dist/cloud/nudge.js +42 -33
  132. package/dist/cloud/nudge.js.map +1 -1
  133. package/dist/cloud/onboarding.d.ts +37 -1
  134. package/dist/cloud/onboarding.d.ts.map +1 -1
  135. package/dist/cloud/onboarding.js +77 -1
  136. package/dist/cloud/onboarding.js.map +1 -1
  137. package/dist/cloud/other-repos.d.ts +39 -0
  138. package/dist/cloud/other-repos.d.ts.map +1 -0
  139. package/dist/cloud/other-repos.js +137 -0
  140. package/dist/cloud/other-repos.js.map +1 -0
  141. package/dist/cloud/pair.d.ts +17 -7
  142. package/dist/cloud/pair.d.ts.map +1 -1
  143. package/dist/cloud/pair.js +81 -60
  144. package/dist/cloud/pair.js.map +1 -1
  145. package/dist/cloud/workspace-sync.d.ts +67 -11
  146. package/dist/cloud/workspace-sync.d.ts.map +1 -1
  147. package/dist/cloud/workspace-sync.js +299 -55
  148. package/dist/cloud/workspace-sync.js.map +1 -1
  149. package/dist/cloud/workspace.d.ts +74 -10
  150. package/dist/cloud/workspace.d.ts.map +1 -1
  151. package/dist/cloud/workspace.js +96 -8
  152. package/dist/cloud/workspace.js.map +1 -1
  153. package/dist/hosts/claude-global.js +1 -1
  154. package/dist/hosts/claude-global.js.map +1 -1
  155. package/dist/hosts/codex-hooks.d.ts +6 -0
  156. package/dist/hosts/codex-hooks.d.ts.map +1 -1
  157. package/dist/hosts/codex-hooks.js +89 -16
  158. package/dist/hosts/codex-hooks.js.map +1 -1
  159. package/dist/hosts/codex-trust.d.ts +28 -0
  160. package/dist/hosts/codex-trust.d.ts.map +1 -0
  161. package/dist/hosts/codex-trust.js +280 -0
  162. package/dist/hosts/codex-trust.js.map +1 -0
  163. package/dist/hosts/cursor-hooks.d.ts.map +1 -1
  164. package/dist/hosts/cursor-hooks.js +3 -1
  165. package/dist/hosts/cursor-hooks.js.map +1 -1
  166. package/dist/init/candidates.d.ts +60 -0
  167. package/dist/init/candidates.d.ts.map +1 -0
  168. package/dist/init/candidates.js +202 -0
  169. package/dist/init/candidates.js.map +1 -0
  170. package/dist/init/claude-call.d.ts +51 -0
  171. package/dist/init/claude-call.d.ts.map +1 -0
  172. package/dist/init/claude-call.js +199 -0
  173. package/dist/init/claude-call.js.map +1 -0
  174. package/dist/init/discover-worker.d.ts +18 -0
  175. package/dist/init/discover-worker.d.ts.map +1 -0
  176. package/dist/init/discover-worker.js +111 -0
  177. package/dist/init/discover-worker.js.map +1 -0
  178. package/dist/init/handover.d.ts +16 -0
  179. package/dist/init/handover.d.ts.map +1 -0
  180. package/dist/init/handover.js +92 -0
  181. package/dist/init/handover.js.map +1 -0
  182. package/dist/init/howtos.d.ts +20 -0
  183. package/dist/init/howtos.d.ts.map +1 -0
  184. package/dist/init/howtos.js +90 -0
  185. package/dist/init/howtos.js.map +1 -0
  186. package/dist/init/init-record.d.ts +134 -0
  187. package/dist/init/init-record.d.ts.map +1 -0
  188. package/dist/init/init-record.js +339 -0
  189. package/dist/init/init-record.js.map +1 -0
  190. package/dist/init/install-paths.d.ts +6 -0
  191. package/dist/init/install-paths.d.ts.map +1 -0
  192. package/dist/init/install-paths.js +87 -0
  193. package/dist/init/install-paths.js.map +1 -0
  194. package/dist/init/keep-answer.d.ts +43 -0
  195. package/dist/init/keep-answer.d.ts.map +1 -0
  196. package/dist/init/keep-answer.js +118 -0
  197. package/dist/init/keep-answer.js.map +1 -0
  198. package/dist/init/keep-gate.d.ts +30 -0
  199. package/dist/init/keep-gate.d.ts.map +1 -0
  200. package/dist/init/keep-gate.js +178 -0
  201. package/dist/init/keep-gate.js.map +1 -0
  202. package/dist/init/keep-list.d.ts +67 -0
  203. package/dist/init/keep-list.d.ts.map +1 -0
  204. package/dist/init/keep-list.js +232 -0
  205. package/dist/init/keep-list.js.map +1 -0
  206. package/dist/init/keep.d.ts +52 -0
  207. package/dist/init/keep.d.ts.map +1 -0
  208. package/dist/init/keep.js +393 -0
  209. package/dist/init/keep.js.map +1 -0
  210. package/dist/init/look-back-mine.d.ts +37 -0
  211. package/dist/init/look-back-mine.d.ts.map +1 -0
  212. package/dist/init/look-back-mine.js +215 -0
  213. package/dist/init/look-back-mine.js.map +1 -0
  214. package/dist/init/look-back.d.ts +81 -0
  215. package/dist/init/look-back.d.ts.map +1 -0
  216. package/dist/init/look-back.js +170 -0
  217. package/dist/init/look-back.js.map +1 -0
  218. package/dist/init/miners.d.ts +46 -0
  219. package/dist/init/miners.d.ts.map +1 -0
  220. package/dist/init/miners.js +141 -0
  221. package/dist/init/miners.js.map +1 -0
  222. package/dist/init/name-call.d.ts +37 -0
  223. package/dist/init/name-call.d.ts.map +1 -0
  224. package/dist/init/name-call.js +151 -0
  225. package/dist/init/name-call.js.map +1 -0
  226. package/dist/init/plain-file.d.ts.map +1 -1
  227. package/dist/init/plain-file.js +3 -0
  228. package/dist/init/plain-file.js.map +1 -1
  229. package/dist/init/prefs.d.ts +70 -0
  230. package/dist/init/prefs.d.ts.map +1 -0
  231. package/dist/init/prefs.js +282 -0
  232. package/dist/init/prefs.js.map +1 -0
  233. package/dist/init/relay.d.ts +15 -0
  234. package/dist/init/relay.d.ts.map +1 -0
  235. package/dist/init/relay.js +15 -0
  236. package/dist/init/relay.js.map +1 -0
  237. package/dist/init/replay-runs.d.ts +121 -0
  238. package/dist/init/replay-runs.d.ts.map +1 -0
  239. package/dist/init/replay-runs.js +457 -0
  240. package/dist/init/replay-runs.js.map +1 -0
  241. package/dist/init/replay-tamper.d.ts +18 -0
  242. package/dist/init/replay-tamper.d.ts.map +1 -0
  243. package/dist/init/replay-tamper.js +87 -0
  244. package/dist/init/replay-tamper.js.map +1 -0
  245. package/dist/init/review-screen.d.ts +74 -0
  246. package/dist/init/review-screen.d.ts.map +1 -0
  247. package/dist/init/review-screen.js +258 -0
  248. package/dist/init/review-screen.js.map +1 -0
  249. package/dist/init/review-tty.d.ts +29 -0
  250. package/dist/init/review-tty.d.ts.map +1 -0
  251. package/dist/init/review-tty.js +218 -0
  252. package/dist/init/review-tty.js.map +1 -0
  253. package/dist/init/review.d.ts +12 -0
  254. package/dist/init/review.d.ts.map +1 -0
  255. package/dist/init/review.js +12 -0
  256. package/dist/init/review.js.map +1 -0
  257. package/dist/init/run.d.ts +87 -0
  258. package/dist/init/run.d.ts.map +1 -0
  259. package/dist/init/run.js +347 -0
  260. package/dist/init/run.js.map +1 -0
  261. package/dist/init/sessions.d.ts +63 -0
  262. package/dist/init/sessions.d.ts.map +1 -0
  263. package/dist/init/sessions.js +377 -0
  264. package/dist/init/sessions.js.map +1 -0
  265. package/dist/init/transcript.d.ts +81 -0
  266. package/dist/init/transcript.d.ts.map +1 -0
  267. package/dist/init/transcript.js +216 -0
  268. package/dist/init/transcript.js.map +1 -0
  269. package/dist/init/types.d.ts +139 -0
  270. package/dist/init/types.d.ts.map +1 -0
  271. package/dist/init/types.js +2 -0
  272. package/dist/init/types.js.map +1 -0
  273. package/dist/notes/cold-start.d.ts +5 -213
  274. package/dist/notes/cold-start.d.ts.map +1 -1
  275. package/dist/notes/cold-start.js +5 -654
  276. package/dist/notes/cold-start.js.map +1 -1
  277. package/dist/notes/edit-overlap.d.ts.map +1 -1
  278. package/dist/notes/edit-overlap.js +4 -1
  279. package/dist/notes/edit-overlap.js.map +1 -1
  280. package/dist/notes/notes.d.ts +8 -4
  281. package/dist/notes/notes.d.ts.map +1 -1
  282. package/dist/notes/notes.js +9 -7
  283. package/dist/notes/notes.js.map +1 -1
  284. package/dist/notes/pr-reviews.d.ts +4 -0
  285. package/dist/notes/pr-reviews.d.ts.map +1 -1
  286. package/dist/notes/pr-reviews.js +6 -5
  287. package/dist/notes/pr-reviews.js.map +1 -1
  288. package/dist/notes/repo-trail.d.ts +1 -1
  289. package/dist/notes/repo-trail.d.ts.map +1 -1
  290. package/dist/notes/repo-trail.js +24 -4
  291. package/dist/notes/repo-trail.js.map +1 -1
  292. package/dist/search/grep.d.ts.map +1 -1
  293. package/dist/search/grep.js +4 -2
  294. package/dist/search/grep.js.map +1 -1
  295. package/dist/search/user-regexp.d.ts +26 -0
  296. package/dist/search/user-regexp.d.ts.map +1 -0
  297. package/dist/search/user-regexp.js +150 -0
  298. package/dist/search/user-regexp.js.map +1 -0
  299. package/dist/skills/anchors-cli.d.ts +5 -0
  300. package/dist/skills/anchors-cli.d.ts.map +1 -1
  301. package/dist/skills/anchors-cli.js +7 -2
  302. package/dist/skills/anchors-cli.js.map +1 -1
  303. package/dist/skills/anchors-wide.js +2 -2
  304. package/dist/skills/anchors-wide.js.map +1 -1
  305. package/dist/skills/cli-skills-1b.d.ts +17 -0
  306. package/dist/skills/cli-skills-1b.d.ts.map +1 -0
  307. package/dist/skills/cli-skills-1b.js +166 -0
  308. package/dist/skills/cli-skills-1b.js.map +1 -0
  309. package/dist/skills/cli-skills-2.d.ts +35 -0
  310. package/dist/skills/cli-skills-2.d.ts.map +1 -0
  311. package/dist/skills/cli-skills-2.js +129 -0
  312. package/dist/skills/cli-skills-2.js.map +1 -0
  313. package/dist/skills/cli-skills-report-1b.d.ts +49 -0
  314. package/dist/skills/cli-skills-report-1b.d.ts.map +1 -0
  315. package/dist/skills/cli-skills-report-1b.js +191 -0
  316. package/dist/skills/cli-skills-report-1b.js.map +1 -0
  317. package/dist/skills/cli-skills-report.d.ts +86 -0
  318. package/dist/skills/cli-skills-report.d.ts.map +1 -0
  319. package/dist/skills/cli-skills-report.js +121 -0
  320. package/dist/skills/cli-skills-report.js.map +1 -0
  321. package/dist/skills/cli-skills.d.ts +30 -0
  322. package/dist/skills/cli-skills.d.ts.map +1 -0
  323. package/dist/skills/cli-skills.js +379 -0
  324. package/dist/skills/cli-skills.js.map +1 -0
  325. package/dist/skills/compile-split.d.ts.map +1 -1
  326. package/dist/skills/compile-split.js +18 -0
  327. package/dist/skills/compile-split.js.map +1 -1
  328. package/dist/skills/compile-words.d.ts +4 -1
  329. package/dist/skills/compile-words.d.ts.map +1 -1
  330. package/dist/skills/compile-words.js +68 -8
  331. package/dist/skills/compile-words.js.map +1 -1
  332. package/dist/skills/compile.d.ts +7 -0
  333. package/dist/skills/compile.d.ts.map +1 -1
  334. package/dist/skills/compile.js +17 -0
  335. package/dist/skills/compile.js.map +1 -1
  336. package/dist/skills/credit.d.ts +86 -0
  337. package/dist/skills/credit.d.ts.map +1 -0
  338. package/dist/skills/credit.js +259 -0
  339. package/dist/skills/credit.js.map +1 -0
  340. package/dist/skills/fold-gated.d.ts +3 -0
  341. package/dist/skills/fold-gated.d.ts.map +1 -0
  342. package/dist/skills/fold-gated.js +78 -0
  343. package/dist/skills/fold-gated.js.map +1 -0
  344. package/dist/skills/fold.d.ts +87 -0
  345. package/dist/skills/fold.d.ts.map +1 -0
  346. package/dist/skills/fold.js +348 -0
  347. package/dist/skills/fold.js.map +1 -0
  348. package/dist/skills/follow-learnings.d.ts +128 -0
  349. package/dist/skills/follow-learnings.d.ts.map +1 -0
  350. package/dist/skills/follow-learnings.js +278 -0
  351. package/dist/skills/follow-learnings.js.map +1 -0
  352. package/dist/skills/learning-steps.d.ts +43 -0
  353. package/dist/skills/learning-steps.d.ts.map +1 -0
  354. package/dist/skills/learning-steps.js +294 -0
  355. package/dist/skills/learning-steps.js.map +1 -0
  356. package/dist/skills/lesson-gate.d.ts +25 -0
  357. package/dist/skills/lesson-gate.d.ts.map +1 -0
  358. package/dist/skills/lesson-gate.js +316 -0
  359. package/dist/skills/lesson-gate.js.map +1 -0
  360. package/dist/skills/offer-drift.d.ts +35 -0
  361. package/dist/skills/offer-drift.d.ts.map +1 -0
  362. package/dist/skills/offer-drift.js +98 -0
  363. package/dist/skills/offer-drift.js.map +1 -0
  364. package/dist/skills/offer-lesson.d.ts +31 -0
  365. package/dist/skills/offer-lesson.d.ts.map +1 -0
  366. package/dist/skills/offer-lesson.js +123 -0
  367. package/dist/skills/offer-lesson.js.map +1 -0
  368. package/dist/skills/offer-lines.d.ts +40 -0
  369. package/dist/skills/offer-lines.d.ts.map +1 -0
  370. package/dist/skills/offer-lines.js +80 -0
  371. package/dist/skills/offer-lines.js.map +1 -0
  372. package/dist/skills/offer-moment.d.ts +102 -0
  373. package/dist/skills/offer-moment.d.ts.map +1 -0
  374. package/dist/skills/offer-moment.js +260 -0
  375. package/dist/skills/offer-moment.js.map +1 -0
  376. package/dist/skills/offer-repair.d.ts +36 -0
  377. package/dist/skills/offer-repair.d.ts.map +1 -0
  378. package/dist/skills/offer-repair.js +212 -0
  379. package/dist/skills/offer-repair.js.map +1 -0
  380. package/dist/skills/offer-retire.d.ts +53 -0
  381. package/dist/skills/offer-retire.d.ts.map +1 -0
  382. package/dist/skills/offer-retire.js +149 -0
  383. package/dist/skills/offer-retire.js.map +1 -0
  384. package/dist/skills/offer-update.d.ts +54 -0
  385. package/dist/skills/offer-update.d.ts.map +1 -0
  386. package/dist/skills/offer-update.js +115 -0
  387. package/dist/skills/offer-update.js.map +1 -0
  388. package/dist/skills/offer-words-1b.d.ts +32 -0
  389. package/dist/skills/offer-words-1b.d.ts.map +1 -0
  390. package/dist/skills/offer-words-1b.js +80 -0
  391. package/dist/skills/offer-words-1b.js.map +1 -0
  392. package/dist/skills/offer-words-2.d.ts +123 -0
  393. package/dist/skills/offer-words-2.d.ts.map +1 -0
  394. package/dist/skills/offer-words-2.js +194 -0
  395. package/dist/skills/offer-words-2.js.map +1 -0
  396. package/dist/skills/offer-words.d.ts +65 -0
  397. package/dist/skills/offer-words.d.ts.map +1 -0
  398. package/dist/skills/offer-words.js +205 -0
  399. package/dist/skills/offer-words.js.map +1 -0
  400. package/dist/skills/offers.d.ts +66 -0
  401. package/dist/skills/offers.d.ts.map +1 -0
  402. package/dist/skills/offers.js +284 -0
  403. package/dist/skills/offers.js.map +1 -0
  404. package/dist/skills/runblock.d.ts +2 -0
  405. package/dist/skills/runblock.d.ts.map +1 -1
  406. package/dist/skills/runblock.js +11 -6
  407. package/dist/skills/runblock.js.map +1 -1
  408. package/dist/skills/save-gate.d.ts +64 -0
  409. package/dist/skills/save-gate.d.ts.map +1 -0
  410. package/dist/skills/save-gate.js +354 -0
  411. package/dist/skills/save-gate.js.map +1 -0
  412. package/dist/skills/save-verify.d.ts +59 -0
  413. package/dist/skills/save-verify.d.ts.map +1 -0
  414. package/dist/skills/save-verify.js +390 -0
  415. package/dist/skills/save-verify.js.map +1 -0
  416. package/dist/skills/settings.d.ts +12 -2
  417. package/dist/skills/settings.d.ts.map +1 -1
  418. package/dist/skills/settings.js +24 -2
  419. package/dist/skills/settings.js.map +1 -1
  420. package/dist/skills/skills.d.ts +26 -8
  421. package/dist/skills/skills.d.ts.map +1 -1
  422. package/dist/skills/skills.js +105 -52
  423. package/dist/skills/skills.js.map +1 -1
  424. package/dist/skills/types.d.ts +8 -0
  425. package/dist/skills/types.d.ts.map +1 -1
  426. package/dist/skills/update-gate.d.ts +36 -0
  427. package/dist/skills/update-gate.d.ts.map +1 -0
  428. package/dist/skills/update-gate.js +357 -0
  429. package/dist/skills/update-gate.js.map +1 -0
  430. package/dist/skills/update-plan.d.ts +40 -0
  431. package/dist/skills/update-plan.d.ts.map +1 -0
  432. package/dist/skills/update-plan.js +196 -0
  433. package/dist/skills/update-plan.js.map +1 -0
  434. package/dist/skills/value-line.d.ts +94 -0
  435. package/dist/skills/value-line.d.ts.map +1 -0
  436. package/dist/skills/value-line.js +355 -0
  437. package/dist/skills/value-line.js.map +1 -0
  438. package/dist/telemetry/contract.d.ts +15 -1
  439. package/dist/telemetry/contract.d.ts.map +1 -1
  440. package/dist/telemetry/contract.js +80 -11
  441. package/dist/telemetry/contract.js.map +1 -1
  442. package/dist/telemetry/gate.js +4 -4
  443. package/dist/telemetry/gate.js.map +1 -1
  444. package/dist/telemetry/index.d.ts +1 -1
  445. package/dist/telemetry/index.d.ts.map +1 -1
  446. package/dist/telemetry/index.js +1 -1
  447. package/dist/telemetry/index.js.map +1 -1
  448. package/dist/telemetry/notice.js +5 -5
  449. package/dist/telemetry/notice.js.map +1 -1
  450. package/dist/telemetry/queue.d.ts.map +1 -1
  451. package/dist/telemetry/queue.js +7 -7
  452. package/dist/telemetry/queue.js.map +1 -1
  453. package/dist/telemetry/track.d.ts.map +1 -1
  454. package/dist/telemetry/track.js +4 -3
  455. package/dist/telemetry/track.js.map +1 -1
  456. package/dist/trace/checks.d.ts.map +1 -1
  457. package/dist/trace/checks.js +10 -2
  458. package/dist/trace/checks.js.map +1 -1
  459. package/dist/trace/gate-file.d.ts +1 -1
  460. package/dist/trace/gate-file.d.ts.map +1 -1
  461. package/dist/trace/gate-file.js +3 -3
  462. package/dist/trace/gate-file.js.map +1 -1
  463. package/dist/upkeep-run.d.ts.map +1 -1
  464. package/dist/upkeep-run.js +2 -23
  465. package/dist/upkeep-run.js.map +1 -1
  466. package/dist/upkeep.d.ts.map +1 -1
  467. package/dist/upkeep.js +2 -3
  468. package/dist/upkeep.js.map +1 -1
  469. package/dist/util/private-fs.d.ts +6 -0
  470. package/dist/util/private-fs.d.ts.map +1 -1
  471. package/dist/util/private-fs.js +9 -1
  472. package/dist/util/private-fs.js.map +1 -1
  473. package/dist/util/state.d.ts.map +1 -1
  474. package/dist/util/state.js +17 -3
  475. package/dist/util/state.js.map +1 -1
  476. package/package.json +1 -1
  477. package/dist/skills/found-skill.d.ts +0 -35
  478. package/dist/skills/found-skill.d.ts.map +0 -1
  479. package/dist/skills/found-skill.js +0 -66
  480. package/dist/skills/found-skill.js.map +0 -1
@@ -0,0 +1,86 @@
1
+ /**
2
+ * What `trail skills` prints (design 2.10): each skill with its scope in
3
+ * words, status, uses and last good use; held items with how to keep them;
4
+ * the jobs Trail is counting; the offers line (and the governor line, once);
5
+ * the skills line. `--json` is the same facts as one object. Every line names
6
+ * the command that changes it. Reading only, except the governor line, which
7
+ * records that it was said (offers.ts).
8
+ */
9
+ import type { JobClass } from '../trace/types.js';
10
+ import type { SkillStatus } from './types.js';
11
+ import { type HeldItem } from './store.js';
12
+ import { type ErrorRow, type GuardrailRow, type SkillExtras } from './cli-skills-report-1b.js';
13
+ export interface SkillRow {
14
+ name: string;
15
+ id: string;
16
+ scope: 'personal';
17
+ applies: string | null;
18
+ status: SkillStatus;
19
+ version: string | null;
20
+ uses: number;
21
+ checkedUses: number;
22
+ lastWorked: string | null;
23
+ addedAt: string | null;
24
+ source: {
25
+ commands: number;
26
+ failed: number;
27
+ } | null;
28
+ statusWhy: string | null;
29
+ off: boolean;
30
+ /** Refused at recall now (a step edited by hand that the risk rules refuse): why, in words. Not used while set. */
31
+ refused: string | null;
32
+ }
33
+ /** A skill's row with 1b's facts (2.12). */
34
+ export type SkillRow1b = SkillRow & SkillExtras;
35
+ export interface HeldRow {
36
+ name: string;
37
+ why: HeldItem['why'];
38
+ host: string;
39
+ repo: string;
40
+ at: string;
41
+ shownAt: string | null;
42
+ }
43
+ export interface WatchRow {
44
+ job: JobClass;
45
+ repo: string;
46
+ sessionDays: number;
47
+ need: number;
48
+ }
49
+ export interface SkillsReport {
50
+ skills: SkillRow1b[];
51
+ held: HeldRow[];
52
+ watching: WatchRow[];
53
+ offers: {
54
+ on: boolean;
55
+ offSince: string | null;
56
+ offIn: string[];
57
+ perSession: 1;
58
+ perWeek: 3;
59
+ thisWeek: number;
60
+ kept: number;
61
+ };
62
+ governor: string | null;
63
+ settings: {
64
+ skills: 'on' | 'off';
65
+ onSince: string | null;
66
+ };
67
+ /** 1b (2.12): the guardrails kept, the catalog errors in this repo over 30 days, every lesson that holds here. */
68
+ guardrails: GuardrailRow[];
69
+ errorsHere: ErrorRow[];
70
+ lessons: number;
71
+ /** Phase 2 (4.14): the weekly value line for this repo, on top; null when there is none. */
72
+ value?: string | null;
73
+ }
74
+ /** `Oct 29` for an ISO time or a local `YYYY-MM-DD` day (read as that local day, not UTC midnight). */
75
+ export declare function dayWords(d: string): string;
76
+ /** Where a skill applies, in words: `yours, in webshop` or `yours, in every repo`. */
77
+ export declare function whereWords(applies: string | null): string;
78
+ /** The status part of a skill's line (2.10). */
79
+ export declare function statusWords(r: SkillRow): string;
80
+ /** One held item's line. */
81
+ export declare function heldWords(h: Pick<HeldRow, 'name' | 'why' | 'host'>): string;
82
+ /** The facts `trail skills` prints, `cwd` the folder it runs in. Says the governor line at most once per time it turns on (records it). */
83
+ export declare function skillsReport(env: NodeJS.ProcessEnv, now: Date, cwd?: string): SkillsReport;
84
+ /** The report as the lines 2.10 shows. */
85
+ export declare function reportLines(r: SkillsReport): string[];
86
+ //# sourceMappingURL=cli-skills-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-skills-report.d.ts","sourceRoot":"","sources":["../../src/skills/cli-skills-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import { OFFER_FAMILIES } from '../trace/jobs.js';
2
+ import { watching } from '../trace/pool.js';
3
+ import { flatLine } from '../notes/flatten.js';
4
+ import { monthDay, repoName } from './compile-words.js';
5
+ import { foldOffers, governorLine, readOffers } from './offers.js';
6
+ import { readSettings } from './settings.js';
7
+ import { readSkillsState } from './state.js';
8
+ import { jobCovered, listAllPersonal, listHeld, readSkill } from './store.js';
9
+ import { refusedAtRecall } from './recall.js';
10
+ import { errorLine, errorRows, extrasWords, guardrailLines, guardrailRows, lessonsLine, lessonTotal, placeOf, skillExtras, valueHere, } from './cli-skills-report-1b.js';
11
+ const WEEK_MS = 7 * 86_400_000;
12
+ const WATCH_MAX = 5;
13
+ const HOSTS = { claude: 'Claude Code', cursor: 'Cursor', copilot: 'GitHub Copilot', codex: 'Codex', gemini: 'Gemini CLI' };
14
+ /** `Oct 29` for an ISO time or a local `YYYY-MM-DD` day (read as that local day, not UTC midnight). */
15
+ export function dayWords(d) {
16
+ return monthDay(/^\d{4}-\d{2}-\d{2}$/.test(d) ? `${d}T12:00:00` : d);
17
+ }
18
+ const plural = (n, w) => `${n} ${w}${n === 1 ? '' : 's'}`;
19
+ const one = (t, max = 60) => flatLine(t, max);
20
+ /** Where a skill applies, in words: `yours, in webshop` or `yours, in every repo`. */
21
+ export function whereWords(applies) {
22
+ return !applies || applies.toLowerCase() === 'every repo' ? 'yours, in every repo' : `yours, in ${one(repoName(applies))}`;
23
+ }
24
+ /** The status part of a skill's line (2.10). */
25
+ export function statusWords(r) {
26
+ const v = r.version ? ` v${one(r.version, 8)}` : '';
27
+ let s;
28
+ if (r.refused)
29
+ s = `needs a fix: ${one(r.refused, 120)} · not used until fixed`;
30
+ else if (r.status === 'needs-fix')
31
+ s = `needs a fix: ${one(r.statusWhy ?? 'its steps failed twice', 120)} · not used until fixed`;
32
+ else if (r.status === 'active')
33
+ s = `active${v} · used ${r.uses}, checked ${r.checkedUses}${r.lastWorked ? ` · last worked ${dayWords(r.lastWorked)}` : ''}`;
34
+ else {
35
+ const from = r.source ? ` from a run of ${plural(r.source.commands, 'command')}, ${r.source.failed ? `${r.source.failed} failed` : 'none failed'}` : '';
36
+ s = `candidate${v}${r.addedAt ? ` · saved ${dayWords(r.addedAt)}${from}` : ''}`;
37
+ }
38
+ return r.off ? `${s} · off: turn it on with trail skills on ${one(r.name)}` : s;
39
+ }
40
+ /** One held item's line. */
41
+ export function heldWords(h) {
42
+ const why = h.why === 'host' ? `came from ${HOSTS[h.host] ?? 'another tool'}` : 'started without your yes';
43
+ return `held, not kept: ${one(h.name)} (${why}) · keep it: trail skills keep ${one(h.name)}`;
44
+ }
45
+ function rows(env, now, cwd) {
46
+ // Each file first: reading a needs-fix skill edited by hand puts its state back (4.8), so the state is read after.
47
+ const read = listAllPersonal(env).map((ref) => ({ ref, parsed: readSkill(ref) }));
48
+ const state = readSkillsState(env).skills;
49
+ const off = new Set(readSettings(env).skillsOff);
50
+ const place = placeOf(cwd, env);
51
+ return read.map(({ ref, parsed }) => {
52
+ const st = state[ref.id];
53
+ return {
54
+ name: ref.name, id: ref.id, scope: 'personal', applies: ref.applies, status: (st?.status ?? 'candidate'),
55
+ version: parsed?.meta.version ?? null, uses: st?.uses ?? 0, checkedUses: st?.checkedUses ?? 0, lastWorked: st?.lastWorked ?? null,
56
+ addedAt: st?.addedAt ?? null, source: st?.source ? { commands: st.source.commands, failed: st.source.failed } : null,
57
+ statusWhy: st?.statusWhy ?? null, off: off.has(ref.name), refused: parsed ? refusedAtRecall(parsed) : null,
58
+ ...skillExtras(ref, parsed, st, place, env, now),
59
+ };
60
+ }).filter((r) => r.status !== 'retired');
61
+ }
62
+ /** The facts `trail skills` prints, `cwd` the folder it runs in. Says the governor line at most once per time it turns on (records it). */
63
+ export function skillsReport(env, now, cwd) {
64
+ const s = readSettings(env);
65
+ const records = foldOffers(readOffers(env)).filter((r) => r.event === 'shown' && now.getTime() - Date.parse(r.at) < WEEK_MS && Date.parse(r.at) <= now.getTime());
66
+ const watch = watching(env, now)
67
+ .filter((w) => OFFER_FAMILIES[w.job] && !jobCovered(w.job, { repoKeys: [w.repoKey], checkout: '', env }))
68
+ .sort((a, b) => b.sessionDays - a.sessionDays || a.repoKey.localeCompare(b.repoKey) || a.job.localeCompare(b.job))
69
+ .slice(0, WATCH_MAX)
70
+ .map((w) => ({ job: w.job, repo: w.repoKey, sessionDays: w.sessionDays, need: w.need }));
71
+ const skills = rows(env, now, cwd);
72
+ const place = placeOf(cwd, env);
73
+ return {
74
+ skills,
75
+ held: listHeld(env, now).map((h) => ({ name: h.name, why: h.why, host: h.host, repo: h.repoKey, at: h.at, shownAt: h.shownAt })),
76
+ watching: watch,
77
+ offers: {
78
+ on: s.offers === 'on', offSince: s.offers === 'off' ? s.offersOffAt : null, offIn: s.offRepos.slice(), perSession: 1, perWeek: 3,
79
+ thisWeek: records.length, kept: records.filter((r) => r.answer === 'yes').length,
80
+ },
81
+ governor: s.offers === 'on' ? governorLine(env, now) : null,
82
+ settings: { skills: s.skills, onSince: s.onSince },
83
+ guardrails: guardrailRows(place, env, s.skills === 'on'),
84
+ errorsHere: errorRows(place, env, now),
85
+ lessons: lessonTotal(skills.reduce((n, k) => n + k.lessons, 0), place, env),
86
+ value: valueHere(place, env, now),
87
+ };
88
+ }
89
+ /** The report as the lines 2.10 shows. */
90
+ export function reportLines(r) {
91
+ const out = [];
92
+ if (r.value)
93
+ out.push(r.value);
94
+ if (!r.skills.length)
95
+ out.push('no skills yet');
96
+ const width = Math.max(0, ...r.skills.map((s) => one(s.name).length)) + 3;
97
+ for (const s of r.skills)
98
+ out.push(`${one(s.name).padEnd(width)}${whereWords(s.applies)} · ${statusWords(s)}${extrasWords(s)}`);
99
+ for (const h of r.held)
100
+ out.push(heldWords(h));
101
+ out.push(...guardrailLines(r.guardrails ?? []));
102
+ for (const l of [errorLine(r.errorsHere ?? []), lessonsLine(r.lessons ?? 0)])
103
+ if (l)
104
+ out.push(l);
105
+ if (r.watching.length)
106
+ out.push(`watching: ${r.watching.map((w) => `${w.job} in ${one(repoName(w.repo))}, ${w.sessionDays} of ${w.need} days`).join(' · ')}`);
107
+ const o = r.offers;
108
+ if (!o.on)
109
+ out.push(`offers: off${o.offSince ? ` since ${dayWords(o.offSince)}` : ''} · turn back on: trail skills offers on`);
110
+ else {
111
+ const head = o.offIn.length ? `offers: on, off in ${o.offIn.map((k) => one(repoName(k))).join(', ')}` : 'offers: on';
112
+ const week = o.thisWeek ? `${o.thisWeek} this week, ${o.kept} kept` : 'none this week';
113
+ out.push(`${head} · at most ${o.perSession} per session, ${o.perWeek} a week · ${week} · stop them: trail skills offers off`);
114
+ if (r.governor)
115
+ out.push(r.governor);
116
+ }
117
+ const st = r.settings;
118
+ out.push(st.skills === 'on' ? `skills: on${st.onSince ? ` since ${dayWords(st.onSince)}` : ''} · turn off: trail skills off` : 'skills: off · turn on: trail skills on');
119
+ return out;
120
+ }
121
+ //# sourceMappingURL=cli-skills-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-skills-report.js","sourceRoot":"","sources":["../../src/skills/cli-skills-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { type Command } from 'commander';
2
+ import { type PersonDeps } from './store.js';
3
+ /** Seams for tests; production passes nothing. */
4
+ export interface SkillCliDeps {
5
+ env?: NodeJS.ProcessEnv;
6
+ /** The clock: default `trailNow(env)` (TRAIL_TEST_NOW in a test home only). */
7
+ now?: () => Date;
8
+ cwd?: () => string;
9
+ /** Passed to the real `personAtTerminal` (TTYs, the process table), as g4's tests do. */
10
+ personDeps?: PersonDeps;
11
+ track?: (event: string, props: Record<string, string>) => void;
12
+ out?: (line: string) => void;
13
+ err?: (line: string) => void;
14
+ exit?: (code: number) => void;
15
+ }
16
+ /** `trail skills on` says this, word for word (1.7). */
17
+ export declare const SKILLS_ON_LINES: readonly ["✓ skills on · Trail now counts jobs you ask for on more than one day: job words and dates only, kept on this machine, nothing uploaded.", " When one checks out on its 3rd day, it offers once to keep the commands that worked (at most 1 offer per session, 3 a week).", " See what it counts: trail skills · stop offers: trail skills offers off · all off: trail skills off"];
18
+ export declare const OFFERS_OFF_LINE = "Skill offers are off. Turn them back on: trail skills offers on";
19
+ /** 1b (R59): numbers are init's; `trail keep` keeps them, after the person typed them. */
20
+ export declare const KEEP_NUMBERS_LINE = "trail keep <numbers> keeps items from trail init.";
21
+ /** A person-only command run by an agent (1.7). */
22
+ export declare const personOnly: (command: string) => string;
23
+ /**
24
+ * A SKILL.md as `show` prints it: anyone can edit the file by hand, so no line of it may read as Trail's own
25
+ * (`[trail] ...`) or carry terminal escapes. Indentation stays (it's markdown).
26
+ */
27
+ export declare function shownText(text: string): string;
28
+ /** `trail skills …` and `trail forget <name>` (1.7). */
29
+ export declare function registerSkillCommands(program: Command, deps?: SkillCliDeps): void;
30
+ //# sourceMappingURL=cli-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-skills.d.ts","sourceRoot":"","sources":["../../src/skills/cli-skills.ts"],"names":[],"mappings":"AAaA,OAAO,EAAkC,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AASzE,OAAO,EAAiH,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAW5J,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,yFAAyF;IACzF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IAC/D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,wDAAwD;AACxD,eAAO,MAAM,eAAe,iYAIlB,CAAC;AACX,eAAO,MAAM,eAAe,oEAAoE,CAAC;AACjG,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,sDAAsD,CAAC;AACrF,mDAAmD;AACnD,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,WAA4E,CAAC;AASvH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAiOD,wDAAwD;AACxD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,YAAiB,GAAG,IAAI,CA4ErF"}
@@ -0,0 +1,379 @@
1
+ /**
2
+ * `trail skills` and its subcommands (design 1.7), plus the top-level
3
+ * `trail forget`. Every command that changes something prints one plain line
4
+ * and the command that undoes it. `skills on`, `offers on` and `keep` are the
5
+ * person's: run by an agent (`personAtTerminal` says no), they print who may
6
+ * run them and exit 1. This is the only module that imports the person-only
7
+ * setters of settings.ts (a static test pins it).
8
+ *
9
+ * `add` is g5's CLI half (`cliAdd`): this file only prints what it returns
10
+ * and sends `skill_saved`, because the save gate's import closure may not load
11
+ * telemetry. Telemetry carries closed-set values only, never a name.
12
+ */
13
+ import { homedir } from 'node:os';
14
+ import { Argument, InvalidArgumentError } from 'commander';
15
+ import { repoPlace } from '../notes/home.js';
16
+ import { flatLine } from '../notes/flatten.js';
17
+ import { track as sendEvent } from '../telemetry/track.js';
18
+ import { findPriorSheet, readRunSheet } from '../trace/runs.js';
19
+ import { compileRun, refusalWords } from './compile.js';
20
+ import { draftText, repoName } from './compile-words.js';
21
+ import { cliAdd } from './save-gate.js';
22
+ import { readSettings, setOffers, setSkillOff, setSkills, trailNow } from './settings.js';
23
+ import { forgetSkill, keepHeld, listAllPersonal, listHeld, nameTaken, personAtTerminal, restoreSkill } from './store.js';
24
+ import { readCapped } from './store-fs.js';
25
+ import { heldWords, reportLines, skillsReport, statusWords, whereWords } from './cli-skills-report.js';
26
+ import { extrasWords, fidelityLine } from './cli-skills-report-1b.js';
27
+ import { lessonLine, readLessons } from './lessons.js';
28
+ import { runCheckout } from './run-checkout.js';
29
+ import { forgetLearning, initDraftCommand, lessonCommand } from './cli-skills-1b.js';
30
+ import { noteAgentForget } from './forget-notice.js';
31
+ import { draftFoldText, liftRestoreVersion, restoreVersionCommand, updateCommand, versionsLine } from './cli-skills-2.js';
32
+ import { stepLearnings } from './follow-learnings.js';
33
+ /** `trail skills on` says this, word for word (1.7). */
34
+ export const SKILLS_ON_LINES = [
35
+ '✓ skills on · Trail now counts jobs you ask for on more than one day: job words and dates only, kept on this machine, nothing uploaded.',
36
+ ' When one checks out on its 3rd day, it offers once to keep the commands that worked (at most 1 offer per session, 3 a week).',
37
+ ' See what it counts: trail skills · stop offers: trail skills offers off · all off: trail skills off',
38
+ ];
39
+ export const OFFERS_OFF_LINE = 'Skill offers are off. Turn them back on: trail skills offers on';
40
+ /** 1b (R59): numbers are init's; `trail keep` keeps them, after the person typed them. */
41
+ export const KEEP_NUMBERS_LINE = 'trail keep <numbers> keeps items from trail init.';
42
+ /** A person-only command run by an agent (1.7). */
43
+ export const personOnly = (command) => `Only the person can run this, in their own terminal: trail ${command}`;
44
+ const one = (t, max = 60) => flatLine(t, max);
45
+ /** Every line break a terminal or an agent might honour. */
46
+ const BREAKS = /\r\n|[\n\r\u000b\u000c\u0085\u2028\u2029]/;
47
+ /** Controls but tab (ESC, BEL, C1) and characters nobody sees: they can rewrite a terminal or hide a marker. */
48
+ const UNSEEN = /[\u0000-\u0008\u000e-\u001f\u007f-\u009f]|[\p{Cf}\ufe00-\ufe0f]/gu;
49
+ const MARKER = /^(\s*)(?:\[(?:trail|graft|trail-code)\]\s*)+/i;
50
+ /**
51
+ * A SKILL.md as `show` prints it: anyone can edit the file by hand, so no line of it may read as Trail's own
52
+ * (`[trail] ...`) or carry terminal escapes. Indentation stays (it's markdown).
53
+ */
54
+ export function shownText(text) {
55
+ return text.split(BREAKS).map((l) => l.replace(UNSEEN, '').replace(MARKER, '$1')).join('\n').trimEnd();
56
+ }
57
+ const unknownSkill = (name) => `✗ no skill called ${one(name)} · trail skills lists them`;
58
+ const errText = (e) => `✗ ${one(e instanceof Error ? e.message : String(e), 200).replace(/^trail:\s*/, '')}`;
59
+ function io(d) {
60
+ const env = d.env ?? process.env;
61
+ return {
62
+ env,
63
+ now: d.now ?? (() => trailNow(env)),
64
+ cwd: d.cwd ?? (() => process.cwd()),
65
+ person: () => personAtTerminal(env, d.personDeps ?? {}),
66
+ track: d.track ?? ((e, p) => { sendEvent(e, p); }),
67
+ out: d.out ?? ((l) => console.log(l)),
68
+ err: d.err ?? ((l) => console.error(l)),
69
+ exit: d.exit ?? ((c) => { process.exitCode = c; }),
70
+ };
71
+ }
72
+ /** Runs a command body; a thrown store or settings error (busy, a planted link) prints and exits 1. */
73
+ const guarded = (x, fn) => () => {
74
+ try {
75
+ fn();
76
+ }
77
+ catch (e) {
78
+ x.err(errText(e));
79
+ x.exit(1);
80
+ }
81
+ };
82
+ const fail = (x, line) => {
83
+ x.err(line);
84
+ x.exit(1);
85
+ };
86
+ /** Is the person at the keyboard? Otherwise print who may run `command` and exit 1. */
87
+ function personOr(x, command) {
88
+ if (x.person().ok)
89
+ return true;
90
+ fail(x, personOnly(command));
91
+ return false;
92
+ }
93
+ /** A personal skill by name (any repo), or a name the person turned off. */
94
+ const knownSkill = (name, env) => listAllPersonal(env).some((r) => r.name === name) || readSettings(env).skillsOff.includes(name);
95
+ /** Prints a 1b command's lines (to stdout on 0, stderr on 1) and its exit code. */
96
+ function said(x, r) {
97
+ for (const l of r.lines)
98
+ (r.code === 0 ? x.out : x.err)(l);
99
+ if (r.code !== 0)
100
+ x.exit(r.code);
101
+ }
102
+ function forget(x, name) {
103
+ // 1b: a lesson or learning id, or a kept guardrail's name, before a skill's name (1.7).
104
+ const learning = forgetLearning(name, x.cwd(), x.env);
105
+ if (learning) {
106
+ if (learning.code === 0 && learning.dropped)
107
+ agentForgot(x, learning.dropped);
108
+ return said(x, learning);
109
+ }
110
+ const r = forgetSkill(name, x.env, x.now());
111
+ if (!r.ok)
112
+ return fail(x, unknownSkill(name));
113
+ agentForgot(x, { what: 'skill', name, back: `trail skills restore ${one(name)}` });
114
+ x.out(`✓ ${one(name)} forgotten · bring it back: trail skills restore ${one(name)}`);
115
+ }
116
+ /** D117 (2): an agent's forget (CLAUDECODE, or a claude or pty-wrapper ancestor, as R17) is told to the person at the next Stop. */
117
+ function agentForgot(x, d) {
118
+ try {
119
+ if (x.env.CLAUDECODE === undefined && !x.person().claudeAncestor)
120
+ return;
121
+ }
122
+ catch { /* can't tell: note it, telling the person is the safe side */ }
123
+ noteAgentForget(d, x.env, x.now());
124
+ }
125
+ function list(x, json) {
126
+ const r = skillsReport(x.env, x.now(), x.cwd());
127
+ if (json)
128
+ x.out(JSON.stringify(r, null, 2));
129
+ else
130
+ for (const l of reportLines(r))
131
+ x.out(l);
132
+ // Phase 2 (P27): whether the value line went out, and how; no number from it.
133
+ if (r.value)
134
+ x.track('skill_value', { channel: 'list' });
135
+ }
136
+ function show(x, name) {
137
+ const ref = listAllPersonal(x.env).find((r) => r.name === name);
138
+ if (ref) {
139
+ const text = readCapped(ref.file);
140
+ if (text === null)
141
+ return fail(x, unknownSkill(name));
142
+ const row = skillsReportRow(x, ref.name);
143
+ x.out(shownText(text));
144
+ x.out('');
145
+ x.out(row ? `· ${whereWords(row.applies)} · ${statusWords(row)}${extrasWords(row)}` : `· ${whereWords(ref.applies)}`);
146
+ // Phase 2 (3.6): how its last uses followed it, when the ledger has the counts.
147
+ const fid = fidelityLine(ref.id, x.env);
148
+ if (fid)
149
+ x.out(`· ${fid}`);
150
+ // Phase 2 (3.6): the versions it keeps, and a change waiting beside a hand-edited file.
151
+ const versions = versionsLine(ref, x.env);
152
+ if (versions)
153
+ x.out(`· ${versions}`);
154
+ // 1b (2.12): every lesson kept with it, oldest first.
155
+ for (const l of readLessons(ref.dir))
156
+ x.out(` ${lessonLine(l)}`);
157
+ return;
158
+ }
159
+ const held = listHeld(x.env, x.now()).find((h) => h.name === name);
160
+ const text = held ? readCapped(`${held.dir}/SKILL.md`) : null;
161
+ if (!held || text === null)
162
+ return fail(x, unknownSkill(name));
163
+ x.out(shownText(text));
164
+ x.out('');
165
+ x.out(`· ${heldWords(held)}`);
166
+ }
167
+ function skillsReportRow(x, name) {
168
+ return skillsReport(x.env, x.now(), x.cwd()).skills.find((s) => s.name === name) ?? null;
169
+ }
170
+ /** "show me" (2.1): the run compiled as an offer would keep it, printed. Writes nothing. */
171
+ function draft(x, runId, print) {
172
+ if (!print)
173
+ return fail(x, `✗ use --print: trail skills draft ${one(runId, 40)} --print`);
174
+ // 1b: init's pending skill n, compiled again from its source (R24, R37).
175
+ const init = /^init-(\d{1,2})$/.exec(runId);
176
+ if (init)
177
+ return said(x, initDraftCommand(Number(init[1]), x.cwd(), x.env, x.now()));
178
+ // Phase 2 (4.7): a run whose change to a skill is offered prints that change as a diff.
179
+ const fold = draftFoldText(runId, x.env);
180
+ if (fold)
181
+ return x.out(fold);
182
+ const sheet = readRunSheet(runId, x.env);
183
+ if (!sheet)
184
+ return fail(x, `✗ no run called ${one(runId, 40)} (runs are kept 7 days)`);
185
+ // D93: the run's own checkout, as an offer compiles it (an older sheet: the folder it is shown in, when that is it).
186
+ const place = repoPlace(x.cwd(), x.env);
187
+ const root = runCheckout(sheet, x.env, place.git && place.key === sheet.repoKey ? place.checkout : '');
188
+ const scope = { repoKeys: [sheet.repoKey], checkout: root, env: x.env };
189
+ const opts = {
190
+ repoRoot: root, home: x.env.HOME || homedir(), platform: process.platform,
191
+ prior: findPriorSheet(sheet, x.env), applies: sheet.repoKey, now: x.now(), readSheet: (id) => readRunSheet(id, x.env),
192
+ taken: (n) => nameTaken(n, scope) !== null,
193
+ learnings: stepLearnings({ repoKeys: [sheet.repoKey], checkout: root, env: x.env }),
194
+ };
195
+ // An offer keeps a repeated job; a run with no check (an asked save) is shown the way an ask keeps it.
196
+ let c = compileRun(sheet, { ...opts, moment: 'repeated' });
197
+ if (!c.ok && (c.reason === 'no-check' || c.reason === 'trivial'))
198
+ c = compileRun(sheet, { ...opts, moment: 'asked' });
199
+ if (!c.ok)
200
+ return fail(x, `✗ Trail can't keep that run as a skill: ${refusalWords(c.reason, c.detail)}`);
201
+ x.out(draftText(c.skill, sheet));
202
+ }
203
+ /**
204
+ * 4.9 step 1 for the CLI: `add` takes a name and `--run` only. Commander gives an option a parent knows (`--json` of
205
+ * `trail skills`, a root option) to that parent wherever it is typed, so add refuses any option a parent got from the
206
+ * command line, the same way as an unknown one: an error, nothing saved.
207
+ */
208
+ function onlyRun(cmd) {
209
+ for (let c = cmd.parent; c; c = c.parent) {
210
+ for (const o of c.options) {
211
+ if (c.getOptionValueSource(o.attributeName()) === 'cli')
212
+ cmd.error(`error: unknown option '${o.long ?? o.flags}'`, { exitCode: 1, code: 'commander.unknownOption' });
213
+ }
214
+ }
215
+ }
216
+ function add(x, name, runId) {
217
+ const r = cliAdd(name, runId, x.env, x.now(), x.cwd());
218
+ for (const l of r.lines)
219
+ (r.exit === 0 ? x.out : x.err)(l);
220
+ if (r.saved)
221
+ x.track('skill_saved', { from: r.saved.from, scope: r.saved.scope });
222
+ if (r.changed)
223
+ x.track('skill_changed', { op: r.changed });
224
+ if (r.exit !== 0)
225
+ x.exit(r.exit);
226
+ }
227
+ function keep(x, names) {
228
+ if (names.every((n) => /^\d+$/.test(n)))
229
+ return fail(x, KEEP_NUMBERS_LINE);
230
+ if (names.length !== 1)
231
+ return fail(x, '✗ keep one skill at a time: trail skills keep <name>');
232
+ const name = names[0];
233
+ if (!personOr(x, `skills keep ${one(name)}`))
234
+ return;
235
+ const r = keepHeld(name, x.person(), x.env, x.now());
236
+ if (r.ok) {
237
+ x.out(`✓ kept ${one(name)} as one of your skills · undo: trail forget ${one(name)}`);
238
+ x.track('skill_saved', { from: 'asked', scope: 'personal' });
239
+ return;
240
+ }
241
+ if (r.reason === 'not-a-person')
242
+ return fail(x, personOnly(`skills keep ${one(name)}`));
243
+ if (r.reason === 'name-taken')
244
+ return fail(x, `✗ ${one(name)} is already the name of another skill, so this one can't be kept under it`);
245
+ fail(x, `✗ nothing held called ${one(name)}: a held skill can be kept for 24 hours after Trail shows it · see what's held: trail skills`);
246
+ }
247
+ function restore(x, name) {
248
+ const r = restoreSkill(name, x.env, x.now());
249
+ if (r.ok)
250
+ return x.out(`✓ ${one(name)} is back · forget it again: trail forget ${one(name)}`);
251
+ if (r.reason === 'name-taken')
252
+ return fail(x, `✗ the name ${one(name)} is taken now, so the forgotten one can't come back under it`);
253
+ fail(x, `✗ no forgotten skill called ${one(name)}`);
254
+ }
255
+ function offers(x, state, here) {
256
+ let key = null;
257
+ if (here) {
258
+ const place = repoPlace(x.cwd(), x.env);
259
+ if (!place.git)
260
+ return fail(x, '✗ --here needs a repo: run it inside the repo');
261
+ key = place.key;
262
+ }
263
+ const flag = here ? ' --here' : '';
264
+ const where = key ? ` in ${one(repoName(key))}` : '';
265
+ if (state === 'on') {
266
+ if (!personOr(x, `skills offers on${flag}`))
267
+ return;
268
+ setOffers(true, key, x.env, x.now());
269
+ return x.out(`✓ skill offers on${where} · stop them: trail skills offers off${flag}`);
270
+ }
271
+ setOffers(false, key, x.env, x.now());
272
+ x.out(key ? `Skill offers are off${where}. Turn them back on: trail skills offers on --here` : OFFERS_OFF_LINE);
273
+ x.track('skill_answer', { answer: 'off' });
274
+ }
275
+ function onOff(x, state, name) {
276
+ if (name === undefined) {
277
+ if (state === 'on') {
278
+ if (!personOr(x, 'skills on'))
279
+ return;
280
+ setSkills(true, x.env, x.now());
281
+ for (const l of SKILLS_ON_LINES)
282
+ x.out(l);
283
+ return;
284
+ }
285
+ setSkills(false, x.env, x.now());
286
+ return x.out('✓ skills off: Trail stops counting jobs, offering skills and bringing them back · turn on again: trail skills on');
287
+ }
288
+ if (state === 'on' && !personOr(x, `skills on ${one(name)}`))
289
+ return;
290
+ if (!knownSkill(name, x.env))
291
+ return fail(x, unknownSkill(name));
292
+ setSkillOff(name, state === 'off', x.env);
293
+ x.out(state === 'off'
294
+ ? `✓ ${one(name)} off: it stops reaching the agent · turn it back on: trail skills on ${one(name)}`
295
+ : `✓ ${one(name)} on: it reaches the agent again · turn it off: trail skills off ${one(name)}`);
296
+ }
297
+ /** `trail skills …` and `trail forget <name>` (1.7). */
298
+ export function registerSkillCommands(program, deps = {}) {
299
+ const x = io(deps);
300
+ // Phase 2: `restore --version <n>` reaches the restore, not the CLI's own --version (cli-skills-2.ts).
301
+ let restoreAt;
302
+ const lift = (f) => ((argv, o) => {
303
+ const l = liftRestoreVersion(argv ?? process.argv);
304
+ restoreAt = l.version;
305
+ return f.call(program, l.argv, o);
306
+ });
307
+ program.parse = lift(program.parse.bind(program));
308
+ program.parseAsync = lift(program.parseAsync.bind(program));
309
+ const skills = program
310
+ .command('skills')
311
+ .description("Your skills: the steps that worked, kept on this machine when you say so, brought back when you ask for the same job")
312
+ .option('--json', 'the same facts as one JSON object')
313
+ .action((opts) => guarded(x, () => list(x, !!opts.json))());
314
+ skills.command('show').description('Print a skill (or a held one) and its status').argument('<name>', 'the skill')
315
+ .action((name) => guarded(x, () => show(x, name))());
316
+ skills.command('draft').description("Print what keeping a run would save, or init's item n (init-<n>). Saves nothing").argument('<run-id>', 'the run, or init-<n>')
317
+ .option('--print', 'print it (the only thing draft does)')
318
+ .action((runId, opts) => guarded(x, () => draft(x, runId, !!opts.print))());
319
+ skills.command('add').description('Keep a run as a skill, after the person said yes or asked for it (what was typed decides; no flag does)')
320
+ .argument('<name>', 'the skill name')
321
+ .requiredOption('--run <run-id>', 'the run to keep', (v, prev) => {
322
+ if (prev !== undefined)
323
+ throw new InvalidArgumentError('give --run once.');
324
+ return v;
325
+ })
326
+ .action((name, opts, cmd) => {
327
+ onlyRun(cmd);
328
+ guarded(x, () => add(x, name, opts.run))();
329
+ });
330
+ skills.command('lesson').description('Keep the lesson Trail offered, after the person typed yes to it (what was typed decides; no flag does)')
331
+ .argument('[skill]', 'the skill the lesson rides with (none for a lesson about an error)')
332
+ .requiredOption('--offer <offer-id>', 'the offer the person said yes to', (v, prev) => {
333
+ if (prev !== undefined)
334
+ throw new InvalidArgumentError('give --offer once.');
335
+ return v;
336
+ })
337
+ .action((skill, opts, cmd) => {
338
+ onlyRun(cmd);
339
+ guarded(x, () => said(x, lessonCommand(skill ?? null, opts.offer, x.env, x.now())))();
340
+ });
341
+ skills.command('keep').description("Keep a skill Trail held because nobody said yes. Only you, in your own terminal").argument('<name...>', 'the held skill')
342
+ .action((names) => guarded(x, () => keep(x, names))());
343
+ skills.command('forget').description('Forget a skill (trail skills restore brings it back), a lesson or a learning by its id, or a guardrail').argument('<name>', 'the skill, lesson id, learning id or guardrail')
344
+ .action((name) => guarded(x, () => forget(x, name))());
345
+ skills.command('restore').description('Bring back the skill you forgot last, or with --version <n> an older version of a skill (only you, in your own terminal)')
346
+ .argument('<name>', 'the skill')
347
+ .action((name) => guarded(x, () => {
348
+ if (restoreAt === undefined)
349
+ return restore(x, name);
350
+ const code = restoreVersionCommand(name, restoreAt, x);
351
+ if (code !== 0)
352
+ x.exit(code);
353
+ })());
354
+ skills.command('update').description('Change a skill the way Trail showed, after the person typed yes to it (what was typed decides; no flag does)')
355
+ .argument('<name>', 'the skill')
356
+ .requiredOption('--offer <offer-id>', 'the offer the person said yes to', (v, prev) => {
357
+ if (prev !== undefined)
358
+ throw new InvalidArgumentError('give --offer once.');
359
+ return v;
360
+ })
361
+ .action((name, opts, cmd) => {
362
+ onlyRun(cmd);
363
+ guarded(x, () => {
364
+ const code = updateCommand(name, opts, x);
365
+ if (code !== 0)
366
+ x.exit(code);
367
+ })();
368
+ });
369
+ skills.command('offers').description('Turn skill offers on or off, everywhere or in this repo (--here). Only you turn them on')
370
+ .addArgument(new Argument('<state>', 'on or off').choices(['on', 'off'])).option('--here', 'just this repo')
371
+ .action((state, opts) => guarded(x, () => offers(x, state, !!opts.here))());
372
+ skills.command('on').description('Turn skills on (only you), or one skill back on').argument('[name]', 'one skill')
373
+ .action((name) => guarded(x, () => onOff(x, 'on', name))());
374
+ skills.command('off').description('Turn skills off, or one skill').argument('[name]', 'one skill')
375
+ .action((name) => guarded(x, () => onOff(x, 'off', name))());
376
+ program.command('forget', { hidden: true }).description('Forget one of your skills (trail skills restore brings it back), a lesson or a learning by its id, or a guardrail').argument('<name>', 'the skill, lesson id, learning id or guardrail')
377
+ .action((name) => guarded(x, () => forget(x, name))());
378
+ }
379
+ //# sourceMappingURL=cli-skills.js.map