@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,278 @@
1
+ /**
2
+ * Learnings and skills, said once and never against each other (part 7).
3
+ *
4
+ * A person's live preferences, decisions and guardrails are read for what
5
+ * they say about commands (learning-steps.ts, no model), then:
6
+ *
7
+ * - at a skill's save or offer, the steps follow them: a step a learning
8
+ * forbids is written its way when Trail can do that safely, else left
9
+ * out, and the offer names either in one plain line (`followAtSave`);
10
+ * - at recall, a learning that only repeats a step is said once, in the run
11
+ * block, and the prompt's learnings lines leave it out; one that goes
12
+ * against a step wins, and the block marks the step (`recallMarks`,
13
+ * `markLines`). The update offer then proposes the change, with its usual
14
+ * consent (fold.ts, why `preference`).
15
+ *
16
+ * Retired, replaced and held learnings never count (`liveLearnings`), nor
17
+ * one on a teammate's unmerged branch, nor a lesson. Reading fails open:
18
+ * no learnings, nothing changes.
19
+ */
20
+ import { readNotesIn } from '../notes/notes.js';
21
+ import { everyRepoLearnings } from '../notes/every-repo.js';
22
+ import { EVERY_REPO, learningFileName, liveLearnings } from '../notes/learning-fields.js';
23
+ import { repoNotesDir } from '../notes/repo-notes-dir.js';
24
+ import { learningsDir } from '../notes/repo-trail.js';
25
+ import { flatLine } from '../notes/flatten.js';
26
+ import { gatedKind } from './risk.js';
27
+ import { neverSave } from './never-save.js';
28
+ import { matchSteps, rulesOf } from './learning-steps.js';
29
+ export const QUOTE_MAX = 160;
30
+ const MARKS_MAX = 3;
31
+ /** The words the person and the agent read. No em dashes; never notes, rules or the like (the words test reads these). */
32
+ export const FOLLOW_COPY = {
33
+ savedOne: 'Step {n} runs {next} rather than this run\'s {old}, as {whose} "{quote}" says.',
34
+ savedMany: 'Steps {list} follow {whose} "{quote}" rather than this run\'s commands.',
35
+ leftOne: 'Trail left out {old}: it goes against {whose} "{quote}", and Trail can\'t change it safely.',
36
+ leftMany: 'Trail left out {k} steps: they go against {whose} "{quote}", and Trail can\'t change them safely.',
37
+ refuse: 'goes against {whose} "{quote}", and it is the check',
38
+ short: 'Some steps follow your learnings rather than this run; say show me to see them.',
39
+ counts: 'To follow your learnings, Trail {did}; say show me to see them.',
40
+ stepFixed: ' ({whose_s} way; the skill has {old})',
41
+ stepAgainst: ' (against {whose}: see below)',
42
+ wins: '{Whose} wins over the skill: "{quote}". {Steps} {are} written its way; run {them} as shown.',
43
+ against: '{Whose} "{quote}" goes against {steps}: leave {it} out, do that part its way, and tell the person.',
44
+ follows: '{Steps} {follow} {whose}: "{quote}".',
45
+ };
46
+ const fill = (t, v) => t.replace(/\{(\w+)\}/g, (m, k) => (v[k] === undefined ? m : String(v[k])));
47
+ const cap = (t) => t.charAt(0).toUpperCase() + t.slice(1);
48
+ const quoteText = (l) => l.quote.replace(/"/g, "'");
49
+ /** A command as a line shows it: one line, at most 60 characters, its single quotes made double, in single quotes. */
50
+ export const cmdWords = (cmd) => `'${flatLine(String(cmd ?? '').replace(/'/g, '"'), 60)}'`;
51
+ const listWords = (ns) => (ns.length < 2 ? ns.join('') : `${ns.slice(0, -1).join(', ')} and ${ns[ns.length - 1]}`);
52
+ const OWNER = { personal: 'your', repo: "this repo's", team: "your team's" };
53
+ /** 'your preference', "this repo's decision", "your team's learning". */
54
+ export function whose(l) {
55
+ return `${OWNER[l.scope] ?? 'your'} ${l.kind && l.kind !== 'lesson' ? l.kind : 'learning'}`;
56
+ }
57
+ /* ------------------------------------------------------------ reading */
58
+ /** The lines a learning's commands are read from: its title and body, headings and the tried-and-ruled-out part left out. */
59
+ function linesOf(n) {
60
+ const out = [];
61
+ let skip = false;
62
+ for (const raw of [n.title, ...String(n.body ?? '').split('\n')]) {
63
+ const l = flatLine(raw, 4000);
64
+ const h = /^#{1,6}\s+(.*)$/.exec(l);
65
+ if (h) {
66
+ skip = /tried|ruled out/i.test(h[1]);
67
+ continue;
68
+ }
69
+ if (l && !skip && !out.includes(l))
70
+ out.push(l);
71
+ }
72
+ return out;
73
+ }
74
+ /** What one learning says about commands; null when it says nothing a step could repeat or go against. */
75
+ export function stepLearningOf(n) {
76
+ if (n.kind === 'lesson')
77
+ return null;
78
+ const lines = linesOf(n);
79
+ const read = rulesOf(lines.join('\n'));
80
+ if (!read.rules.length)
81
+ return null;
82
+ const only = lines.length === 1 ? lines[0] : null;
83
+ const quote = flatLine(only ?? n.title, QUOTE_MAX);
84
+ return { id: n.id, file: n.path ? learningFileName(n.path) : '', kind: n.kind ?? null, scope: n.scope ?? 'repo', quote, whole: read.whole && only !== null && quote === only, rules: read.rules };
85
+ }
86
+ /** The file names of the learnings a session has shown already (its `injectedNotes`: paths, or a title for one with none). */
87
+ export function shownFiles(injected) {
88
+ return new Set((injected ?? []).map((p) => learningFileName(p)).filter(Boolean));
89
+ }
90
+ /** The live learnings that say something about commands, for a run in `where`. [] on any read failure. */
91
+ export function stepLearnings(where) {
92
+ const notes = [];
93
+ const add = (f) => {
94
+ try {
95
+ notes.push(...f());
96
+ }
97
+ catch { /* none from there this time */ }
98
+ };
99
+ add(() => everyRepoLearnings(where.env));
100
+ for (const key of [...new Set(where.repoKeys.filter(Boolean))]) {
101
+ const k = key.toLowerCase();
102
+ add(() => readNotesIn(repoNotesDir(key, where.env), '', '', 'personal').filter((n) => !n.applies || n.applies === EVERY_REPO || n.applies === k));
103
+ }
104
+ if (where.checkout)
105
+ add(() => readNotesIn(learningsDir(where.checkout), where.checkout, where.checkout, 'repo'));
106
+ try {
107
+ const seen = new Set();
108
+ const unique = notes.filter((n) => !seen.has(n.id) && (seen.add(n.id), true));
109
+ return liveLearnings(unique).flatMap((n) => stepLearningOf(n) ?? []);
110
+ }
111
+ catch {
112
+ return [];
113
+ }
114
+ }
115
+ /**
116
+ * The learning's words only repeat what the steps do: every sentence read, at least one step repeats it, none goes
117
+ * against it. What init folds into a skill as a lesson (part 7).
118
+ */
119
+ export function onlyRepeats(text, steps) {
120
+ const l = stepLearningOf({ id: 'l-000000', kind: 'preference', scope: 'personal', title: text, body: text });
121
+ if (!l || !l.whole)
122
+ return false;
123
+ const v = matchSteps(l.rules, steps);
124
+ return v.repeats.length > 0 && v.contradicts.length === 0;
125
+ }
126
+ /** A fix the save or the block may use: a step that can be undone stays one, and nothing the risk rules refuse. */
127
+ const safeFix = (fix, gated) => (fix && !gated && !gatedKind(fix) && !neverSave(fix) ? fix : null);
128
+ /** The first learning that goes against each step, and the step its way when that is safe. */
129
+ function against(cmds, gated, ls) {
130
+ const out = new Map();
131
+ for (const l of ls) {
132
+ for (const c of matchSteps(l.rules, cmds).contradicts)
133
+ if (!out.has(c.step))
134
+ out.set(c.step, { l, fix: safeFix(c.fix, gated[c.step - 1] ?? true) });
135
+ }
136
+ return out;
137
+ }
138
+ /** The steps as a save keeps them: each one a learning goes against written its way, or left out, and the line that says so. */
139
+ export function followAtSave(items, ls) {
140
+ const same = { keep: items.map((it, i) => ({ i, cmd: it.cmd })), line: '', refuse: null };
141
+ if (!ls.length || !items.length)
142
+ return same;
143
+ const hit = against(items.map((it) => it.cmd), items.map((it) => it.gated), ls);
144
+ if (!hit.size)
145
+ return same;
146
+ const keep = [];
147
+ const fixed = new Map();
148
+ const left = new Map();
149
+ for (const [i, it] of items.entries()) {
150
+ const h = hit.get(i + 1);
151
+ if (!h) {
152
+ keep.push({ i, cmd: it.cmd });
153
+ }
154
+ else if (h.fix) {
155
+ keep.push({ i, cmd: h.fix });
156
+ fixed.set(h.l, [...(fixed.get(h.l) ?? []), { n: keep.length, old: it.cmd, next: h.fix }]);
157
+ }
158
+ else if (it.isCheck) {
159
+ return { ...same, refuse: fill(FOLLOW_COPY.refuse, { whose: whose(h.l), quote: flatLine(quoteText(h.l), 80) }) };
160
+ }
161
+ else {
162
+ left.set(h.l, [...(left.get(h.l) ?? []), it.cmd]);
163
+ }
164
+ }
165
+ const said = [];
166
+ for (const [l, fs] of fixed) {
167
+ const v = { whose: whose(l), quote: flatLine(quoteText(l), 80) };
168
+ said.push(fs.length === 1 ? fill(FOLLOW_COPY.savedOne, { ...v, n: fs[0].n, next: cmdWords(fs[0].next), old: cmdWords(fs[0].old) })
169
+ : fill(FOLLOW_COPY.savedMany, { ...v, list: listWords(fs.map((f) => f.n)) }));
170
+ }
171
+ for (const [l, olds] of left) {
172
+ const v = { whose: whose(l), quote: flatLine(quoteText(l), 80) };
173
+ said.push(olds.length === 1 ? fill(FOLLOW_COPY.leftOne, { ...v, old: cmdWords(olds[0]) }) : fill(FOLLOW_COPY.leftMany, { ...v, k: olds.length }));
174
+ }
175
+ const all = said.join(' ');
176
+ const changed = [...fixed.values()].reduce((n, fs) => n + fs.length, 0);
177
+ const dropped = [...left.values()].reduce((n, olds) => n + olds.length, 0);
178
+ const n = (k) => (k === 1 ? '1 step' : `${k} steps`);
179
+ const did = [changed ? `changed ${n(changed)}` : '', dropped ? `left out ${n(dropped)}` : ''].filter(Boolean).join(' and ');
180
+ const counts = fill(FOLLOW_COPY.counts, { did });
181
+ return { keep, line: flatLine(all.length <= LINE_ROOM ? all : counts, 400), refuse: null };
182
+ }
183
+ /** Room an offer's line 1 leaves for the follow line (offer lines are at most 400 characters). */
184
+ const LINE_ROOM = 240;
185
+ const OFFER_LINE_MAX = 400;
186
+ /** An offer's 2 lines with the follow line at the end of line 1 (a shorter one when both don't fit). */
187
+ export function withFollowLine(lines, followed) {
188
+ if (!followed)
189
+ return lines;
190
+ const both = `${lines[0]} ${followed}`;
191
+ return [both.length <= OFFER_LINE_MAX ? both : flatLine(`${lines[0]} ${FOLLOW_COPY.short}`, OFFER_LINE_MAX), lines[1]];
192
+ }
193
+ /**
194
+ * What the live learnings say of a skill's steps, at most 3 learnings. A learning that goes against a step wins over
195
+ * one that repeats it. A repeat is said only for a preference or decision (or a plain learning) the line can quote in
196
+ * full, so leaving it out of the prompt's learnings lines loses nothing, and only once a session: one the session showed
197
+ * already (`shown`, file names: on a file the agent opened, or with an earlier prompt) is not said again. A learning
198
+ * that goes against a step is always marked, since the step is shown its way.
199
+ */
200
+ export function recallMarks(steps, ls, shown = new Set()) {
201
+ if (!ls.length || !steps.length)
202
+ return [];
203
+ const cmds = steps.map((s) => s.cmd);
204
+ const hit = against(cmds, steps.map((s) => !!s.gated), ls);
205
+ const out = [];
206
+ for (const l of ls) {
207
+ const mine = [...hit].filter(([, h]) => h.l === l).map(([n]) => n);
208
+ if (mine.length) {
209
+ out.push({ l, against: true, steps: mine, fixes: new Map(mine.map((n) => [n, hit.get(n).fix])) });
210
+ continue;
211
+ }
212
+ if (!l.whole || (l.kind !== null && l.kind !== 'preference' && l.kind !== 'decision'))
213
+ continue;
214
+ // Shown this session already (on a file the agent opened, or with an earlier prompt): not said again here.
215
+ if (l.file && shown.has(l.file))
216
+ continue;
217
+ const reps = matchSteps(l.rules, cmds).repeats.filter((n) => !hit.has(n));
218
+ if (reps.length)
219
+ out.push({ l, against: false, steps: reps, fixes: new Map() });
220
+ }
221
+ return out.slice(0, MARKS_MAX);
222
+ }
223
+ /** The step texts and check as the block shows them: each fix in place of its step (and of the check it is). */
224
+ export function withFixes(skill, marks) {
225
+ const fixes = new Map();
226
+ for (const m of marks)
227
+ for (const [n, f] of m.fixes)
228
+ if (f)
229
+ fixes.set(n, f);
230
+ if (!fixes.size)
231
+ return skill;
232
+ let check = skill.check;
233
+ const steps = skill.steps.map((s) => {
234
+ const f = fixes.get(s.n);
235
+ if (!f)
236
+ return s;
237
+ if (check !== null && check === s.cmd)
238
+ check = f;
239
+ return { ...s, cmd: f };
240
+ });
241
+ return { ...skill, steps, check };
242
+ }
243
+ /** What a marked step's line ends with in the block (`n` is the step, `old` the skill's own command, filled). */
244
+ export function stepNote(marks, n, old) {
245
+ const m = marks.find((x) => x.against && x.steps.includes(n));
246
+ if (!m)
247
+ return '';
248
+ return m.fixes.get(n) ? fill(FOLLOW_COPY.stepFixed, { whose_s: `${whose(m.l)}'s`, old: flatLine(old, 120) }) : fill(FOLLOW_COPY.stepAgainst, { whose: whose(m.l) });
249
+ }
250
+ /** The lines after a block's steps, one per learning, each quoting it once. */
251
+ export function markLines(marks) {
252
+ return marks.map((m) => {
253
+ const one = m.steps.length === 1;
254
+ const steps = `${one ? 'step' : 'steps'} ${listWords(m.steps)}`;
255
+ const v = { whose: whose(m.l), Whose: cap(whose(m.l)), quote: quoteText(m.l), steps, Steps: cap(steps) };
256
+ if (!m.against)
257
+ return fill(FOLLOW_COPY.follows, { ...v, follow: one ? 'follows' : 'follow' });
258
+ const fixed = m.steps.filter((n) => m.fixes.get(n));
259
+ const out = m.steps.filter((n) => !m.fixes.get(n));
260
+ const parts = [];
261
+ if (fixed.length) {
262
+ const s = `${fixed.length === 1 ? 'Step' : 'Steps'} ${listWords(fixed)}`;
263
+ parts.push(fill(FOLLOW_COPY.wins, { ...v, Steps: s, are: fixed.length === 1 ? 'is' : 'are', them: fixed.length === 1 ? 'it' : 'them' }));
264
+ }
265
+ if (out.length) {
266
+ const s = `${out.length === 1 ? 'step' : 'steps'} ${listWords(out)}`;
267
+ parts.push(fill(FOLLOW_COPY.against, { ...v, steps: s, it: out.length === 1 ? 'it' : 'them' }));
268
+ }
269
+ // Both kinds from one learning: its words once, in the first sentence.
270
+ return parts.length === 2 ? `${parts[0]} ${parts[1].replace(/^.+? goes against /, 'It goes against ')}` : parts[0];
271
+ });
272
+ }
273
+ /** The ids of the learnings a block says (its lines are in the block as it went out). */
274
+ export function saidIn(block, marks) {
275
+ const lines = markLines(marks);
276
+ return marks.filter((_, k) => block.includes(lines[k])).map((m) => m.l.id);
277
+ }
278
+ //# sourceMappingURL=follow-learnings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-learnings.js","sourceRoot":"","sources":["../../src/skills/follow-learnings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ export interface Cmd {
2
+ prog: string;
3
+ args: string[];
4
+ }
5
+ export type StepRule = {
6
+ t: 'swap';
7
+ use: Cmd;
8
+ not: Cmd;
9
+ } | {
10
+ t: 'never';
11
+ cmd: Cmd;
12
+ } | {
13
+ t: 'never-edit';
14
+ file: string;
15
+ } | {
16
+ t: 'always';
17
+ cmd: Cmd;
18
+ } | {
19
+ t: 'before';
20
+ first: Cmd;
21
+ then: Cmd;
22
+ };
23
+ /** `whole`: every sentence of the text read as rules, so a line that quotes it in full leaves nothing out. */
24
+ export interface ReadRules {
25
+ rules: StepRule[];
26
+ whole: boolean;
27
+ }
28
+ export interface StepVerdict {
29
+ repeats: number[];
30
+ /** `fix`: the step's command the learning's way (its folder kept), or null when Trail can't write it safely. */
31
+ contradicts: Array<{
32
+ step: number;
33
+ fix: string | null;
34
+ }>;
35
+ }
36
+ /** The rules a learning's text says, and whether every sentence of it was read. */
37
+ export declare function rulesOf(text: string): ReadRules;
38
+ /**
39
+ * Each rule against the steps (step `n` is `steps[n - 1]`, with its {params}). A step that does what a rule forbids
40
+ * is a contradiction, whatever another rule says of it; one that does what a rule says, a repeat.
41
+ */
42
+ export declare function matchSteps(rules: StepRule[], steps: string[]): StepVerdict;
43
+ //# sourceMappingURL=learning-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-steps.d.ts","sourceRoot":"","sources":["../../src/skills/learning-steps.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,GAAG;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE;AACrD,MAAM,MAAM,QAAQ,GAChB;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GACjC;IAAE,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GACxB;IAAE,CAAC,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,CAAC,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,GAAG,CAAA;CAAE,GACzB;IAAE,CAAC,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAAC;AAE3C,8GAA8G;AAC9G,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE;AAEhE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gHAAgH;IAChH,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC1D;AA0HD,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAkB/C;AAgFD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CA6B1E"}
@@ -0,0 +1,294 @@
1
+ /**
2
+ * What a learning says about the commands a skill runs, read without a model:
3
+ * the tool and command preferences a person writes ("use pnpm, not npm",
4
+ * "never run npx prisma db push", "always run make lint before git push",
5
+ * "don't edit _schema.py by hand, run scripts/gen_schema.py"), matched
6
+ * against a step's program and arguments.
7
+ *
8
+ * Precision over recall. A clause counts only when it has one of a few fixed
9
+ * shapes and each command in it is a command for sure: in backticks, or
10
+ * starting with a program Trail knows or a script path, with nothing but
11
+ * arguments after it ("always run the tests" names no command, so it says
12
+ * nothing). Whatever doesn't parse says nothing.
13
+ *
14
+ * Out: repeats (the learning says what a step does) and contradicts (a step
15
+ * does what the learning forbids, or uses the tool it replaces), with the
16
+ * step's command the learning's way when Trail can write it safely (a swap
17
+ * between npm, pnpm, yarn and bun it knows, or a whole command for a whole
18
+ * command), else null. Pure: no disk, no clock.
19
+ */
20
+ import { bareCommand, simpleCommands } from '../trace/shell.js';
21
+ /** Programs a command phrase may start with when it is not in backticks. */
22
+ const KNOWN = new Set(`npm npx pnpm pnpx yarn bun bunx deno node tsx ts-node python python3 pip pip3 pipx uv poetry pytest tox nox make cmake
23
+ cargo rustc go gradle gradlew mvn ant git gh docker podman kubectl helm terraform tofu ansible rg grep sed awk jq curl wget brew ruby bundle
24
+ rake rails gem php composer dotnet swift xcodebuild jest vitest mocha playwright tsc eslint prettier biome ruff black flake8 mypy pylint isort
25
+ pre-commit nx turbo lerna vite webpack next prisma alembic flask uvicorn gunicorn psql mysql sqlite3 aws gcloud az vercel netlify fly flyctl
26
+ heroku firebase wrangler supabase just task`.split(/\s+/));
27
+ /** Words that end a command phrase: English, never an argument. */
28
+ const STOP = new Set(`a an the to for when before after instead rather than not over by hand it them this that here there in on with so
29
+ because if unless first always never every time please then and or anymore again locally directly manually yourself any my your our their
30
+ of is are be was were tests test-suite suite`.split(/\s+/));
31
+ const SCRIPT = /^(?:\.{0,2}\/)?(?:[\w.-]+\/)+[\w.-]+$|^[\w-][\w.-]*\.(?:py|sh|bash|js|mjs|cjs|ts|rb|pl)$/;
32
+ const FILE = /^(?:\.{0,2}\/)?(?:[\w.-]+\/)*[\w-][\w.-]*\.[A-Za-z0-9]{1,8}$|^(?:\.{0,2}\/)?(?:[\w.-]+\/)+[\w.-]+$/;
33
+ const ARG = /^[\w@./:=+,%{}-]+$/;
34
+ const INTERPRETERS = new Set(['python', 'python3', 'node', 'bash', 'sh', 'zsh', 'ruby', 'perl', 'tsx', 'ts-node']);
35
+ const EDITORS = new Set(['vim', 'vi', 'nvim', 'nano', 'emacs', 'code', 'ed']);
36
+ const PMS = new Set(['npm', 'pnpm', 'yarn', 'bun']);
37
+ const MAX_SENTENCE = 240;
38
+ const MAX_TEXT = 2000;
39
+ const BT = '\u0001';
40
+ const P = '(.+?)';
41
+ const RUN = String.raw `(?:use|run|call)`;
42
+ const NOT = String.raw `(?:don'?t|do not|never|avoid)`;
43
+ const EDIT = String.raw `(?:hand[- ]?edit|edit|modify|change|touch|write to)`;
44
+ const BY_HAND = String.raw `(?:\s+(?:by hand|manually|directly|yourself))?`;
45
+ const TAIL = String.raw `(?:\s+(?:here|in this repo|anymore|any more|again|instead|first|always|every time))*`;
46
+ const re = (s) => new RegExp(`^${s}$`, 'i');
47
+ /** One phrase as a command, or null when any word of it isn't one. Backticked text (`\u0001n\u0001`) is the person's own command. */
48
+ function cmdOf(phrase, ticks) {
49
+ const p = phrase.trim().replace(/^["']|["']$/g, '').trim();
50
+ const tick = new RegExp(`^${BT}(\\d+)${BT}$`).exec(p);
51
+ const words = (tick ? ticks[Number(tick[1])] ?? '' : p).trim().split(/\s+/).filter(Boolean);
52
+ if (!words.length || words.length > 8)
53
+ return null;
54
+ const [prog, ...args] = words;
55
+ const known = KNOWN.has(prog) || SCRIPT.test(prog);
56
+ if (!(tick ? ARG.test(prog) : known))
57
+ return null;
58
+ if (!args.every((a) => ARG.test(a) && (tick || !STOP.has(a.toLowerCase()))))
59
+ return null;
60
+ return { prog: plainPath(prog), args };
61
+ }
62
+ function fileOf(phrase, ticks) {
63
+ const p = phrase.trim().replace(/^["']|["']$/g, '').trim();
64
+ const tick = new RegExp(`^${BT}(\\d+)${BT}$`).exec(p);
65
+ const f = (tick ? ticks[Number(tick[1])] ?? '' : p).trim();
66
+ return FILE.test(f) ? plainPath(f) : null;
67
+ }
68
+ const plainPath = (p) => p.replace(/^\.\//, '');
69
+ const both = (a, b) => (a && b ? [a, b] : null);
70
+ /** Shapes a whole sentence can have (the ones with a comma of their own come first). */
71
+ const SENTENCE = [
72
+ // "use pnpm, not npm", "run make test instead of pytest", "prefer rg over grep"
73
+ { re: re(String.raw `(?:always\s+)?(?:use|run|prefer)\s+${P}\s*,?\s+(?:not|never|and not|instead of|rather than|over)\s+(?:using\s+|running\s+)?${P}${TAIL}`),
74
+ make: (m, t) => {
75
+ const f = /^(?:hand[- ]?)?(?:editing|changing|modifying|touching)\s+(.+?)(?:\s+(?:by hand|manually|directly))?$/i.exec(m[2]);
76
+ if (f) {
77
+ const c = cmdOf(m[1], t);
78
+ const file = fileOf(f[1], t);
79
+ return c && file ? [{ t: 'always', cmd: c }, { t: 'never-edit', file }] : null;
80
+ }
81
+ const p = both(cmdOf(m[1], t), cmdOf(m[2], t));
82
+ return p ? [{ t: 'swap', use: p[0], not: p[1] }] : null;
83
+ } },
84
+ { re: re(String.raw `prefer\s+${P}\s+to\s+${P}`), make: (m, t) => {
85
+ const p = both(cmdOf(m[1], t), cmdOf(m[2], t));
86
+ return p ? [{ t: 'swap', use: p[0], not: p[1] }] : null;
87
+ } },
88
+ // "don't use npm, use pnpm"
89
+ { re: re(String.raw `${NOT}\s+(?:use|run)\s+${P}\s*[,;:]?\s+(?:but\s+)?(?:use|run)\s+${P}${TAIL}`), make: (m, t) => {
90
+ const p = both(cmdOf(m[2], t), cmdOf(m[1], t));
91
+ return p ? [{ t: 'swap', use: p[0], not: p[1] }] : null;
92
+ } },
93
+ // "don't edit _schema.py by hand, run scripts/gen_schema.py"
94
+ { re: re(String.raw `${NOT}\s+${EDIT}\s+${P}${BY_HAND}\s*[,;:]?\s+(?:but\s+|instead\s+)*${RUN}\s+${P}${TAIL}`), make: (m, t) => {
95
+ const file = fileOf(m[1], t);
96
+ const c = cmdOf(m[2], t);
97
+ return file && c ? [{ t: 'never-edit', file }, { t: 'always', cmd: c }] : null;
98
+ } },
99
+ // "always run make lint before git push", "run lint before pushing"
100
+ { re: re(String.raw `(?:always\s+)?run\s+${P}\s+(?:before|ahead of|prior to)\s+(?:you\s+)?(?:run\s+|running\s+)?${P}`), make: (m, t) => {
101
+ const p = both(cmdOf(m[1], t), cmdOf(m[2], t));
102
+ return p ? [{ t: 'before', first: p[0], then: p[1] }] : null;
103
+ } },
104
+ // "before git push, always run make lint"
105
+ { re: re(String.raw `before\s+(?:you\s+)?(?:run\s+|running\s+)?${P}\s*,?\s+(?:always\s+)?run\s+${P}(?:\s+first)?`), make: (m, t) => {
106
+ const p = both(cmdOf(m[2], t), cmdOf(m[1], t));
107
+ return p ? [{ t: 'before', first: p[0], then: p[1] }] : null;
108
+ } },
109
+ ];
110
+ /** Shapes one clause can have once a sentence is cut at its commas. */
111
+ const CLAUSE = [
112
+ { re: re(String.raw `${NOT}\s+(?:ever\s+)?(?:use|run|using|running|call)\s+${P}${TAIL}`), make: (m, t) => {
113
+ const c = cmdOf(m[1], t);
114
+ return c ? [{ t: 'never', cmd: c }] : null;
115
+ } },
116
+ { re: re(String.raw `${NOT}\s+${EDIT}\s+${P}${BY_HAND}`), make: (m, t) => {
117
+ const file = fileOf(m[1], t);
118
+ return file ? [{ t: 'never-edit', file }] : null;
119
+ } },
120
+ { re: re(String.raw `(?:always\s+)?${RUN}\s+${P}${TAIL}`), make: (m, t) => {
121
+ const c = cmdOf(m[1], t);
122
+ return c ? [{ t: 'always', cmd: c }] : null;
123
+ } },
124
+ ];
125
+ function shaped(s, shapes, ticks) {
126
+ for (const sh of shapes) {
127
+ const m = sh.re.exec(s);
128
+ if (!m)
129
+ continue;
130
+ const r = sh.make(m, ticks);
131
+ if (r)
132
+ return r;
133
+ }
134
+ return null;
135
+ }
136
+ /** The rules a learning's text says, and whether every sentence of it was read. */
137
+ export function rulesOf(text) {
138
+ const ticks = [];
139
+ const raw = String(text ?? '').slice(0, MAX_TEXT).replace(/[‘’]/g, "'").replace(/[“”]/g, '"')
140
+ .replace(/`([^`\n]{1,200})`/g, (_, c) => `${BT}${ticks.push(c) - 1}${BT}`);
141
+ const sentences = raw.split(/\n+|(?<=[.!?;])\s+/)
142
+ .map((s) => s.replace(/^\s*(?:[-*·]|\d+[.)])\s+/, '').replace(/^please,?\s+/, '').replace(/[\s.!;:]+$/, '').trim()).filter(Boolean);
143
+ const rules = [];
144
+ let whole = sentences.length > 0;
145
+ for (const s of sentences) {
146
+ if (s.length > MAX_SENTENCE) {
147
+ whole = false;
148
+ continue;
149
+ }
150
+ const one = shaped(s, SENTENCE, ticks);
151
+ if (one) {
152
+ rules.push(...one);
153
+ continue;
154
+ }
155
+ const parts = s.split(/\s*,\s*|\s+and then\s+|\s+then\s+/).filter(Boolean);
156
+ const read = parts.map((c) => shaped(c, CLAUSE, ticks));
157
+ if (read.some((r) => r === null))
158
+ whole = false;
159
+ for (const r of read)
160
+ if (r)
161
+ rules.push(...r);
162
+ }
163
+ return { rules, whole: whole && rules.length > 0 };
164
+ }
165
+ /** A step's folder (`(cd api && ...)`) and the rest. */
166
+ function inFolder(cmd) {
167
+ const m = /^\(cd (\S+) && (.*)\)$/.exec(cmd.trim());
168
+ return m ? { dir: m[1], core: m[2] } : { dir: null, core: cmd.trim() };
169
+ }
170
+ function simplesOf(cmd) {
171
+ return simpleCommands(inFolder(cmd).core).flatMap((text) => {
172
+ const words = bareCommand(text).split(/\s+/).filter(Boolean).map((w) => w.replace(/^(["'])(.*)\1$/, '$2'));
173
+ if (!words.length || words[0] === 'cd')
174
+ return [];
175
+ const [prog, ...args] = words;
176
+ const out = [{ prog: plainPath(prog), args, text }];
177
+ // `python scripts/gen.py` is also the script run on its own.
178
+ const at = args.findIndex((a) => !a.startsWith('-'));
179
+ if (INTERPRETERS.has(prog) && at >= 0 && SCRIPT.test(args[at]))
180
+ out.push({ prog: plainPath(args[at]), args: args.slice(at + 1), text });
181
+ return out;
182
+ });
183
+ }
184
+ const samePath = (a, b) => a === b || (b.includes('/') && b.endsWith(`/${a}`)) || (a.includes('/') && a.endsWith(`/${b}`));
185
+ const positional = (args) => args.filter((a) => !a.startsWith('-'));
186
+ const flags = (args) => args.filter((a) => a.startsWith('-'));
187
+ /** The simple command runs `c`: the same program, `c`'s arguments first in the same order, and every flag `c` names. */
188
+ function runs(s, c) {
189
+ if (!(s.prog === c.prog || ((SCRIPT.test(s.prog) || SCRIPT.test(c.prog)) && samePath(s.prog, c.prog))))
190
+ return false;
191
+ const want = positional(c.args);
192
+ const have = positional(s.args);
193
+ return want.every((w, i) => have[i] === w) && flags(c.args).every((f) => s.args.includes(f));
194
+ }
195
+ /** The simple command writes `file`: an in-place edit, an editor, a copy or move onto it, or a redirect into it. */
196
+ function edits(s, file) {
197
+ const hits = (a) => samePath(plainPath(a), file);
198
+ if ((s.prog === 'sed' || s.prog === 'perl') && s.args.some((a) => /^-[a-zA-Z]*i/.test(a)))
199
+ return s.args.some(hits);
200
+ if (EDITORS.has(s.prog))
201
+ return s.args.some(hits);
202
+ if (['cp', 'mv', 'install', 'tee'].includes(s.prog))
203
+ return s.args.length > 0 && hits(s.args[s.args.length - 1]);
204
+ return [...s.text.matchAll(/(?:^|[^<>&\d])\d?>>?\|?\s*([^\s&|;<>]+)/g)].some((m) => hits(m[1]));
205
+ }
206
+ const anyRuns = (cmd, c) => simplesOf(cmd).some((s) => runs(s, c));
207
+ /** `npm test` as pnpm, yarn or bun runs it; null for anything else (a flag, a sub-command Trail doesn't know the twin of). */
208
+ function pmTwin(args, to) {
209
+ const [sub, ...rest] = args;
210
+ // `bun test` is bun's own test runner, not the package's script: bun runs the script with `bun run test`.
211
+ if ((sub === 'test' || sub === 'start') && rest.length === 0)
212
+ return to === 'bun' ? ['run', sub] : [sub];
213
+ if (sub === 'run' && rest.length >= 1 && /^[\w:.-]+$/.test(rest[0]) && rest.slice(1).every((a) => ARG.test(a)))
214
+ return ['run', ...rest];
215
+ if ((sub === 'install' || sub === 'i') && rest.length === 0)
216
+ return ['install'];
217
+ // yarn's flag for a locked install changed between versions: no twin.
218
+ if (sub === 'ci' && rest.length === 0)
219
+ return to === 'npm' ? ['ci'] : to === 'yarn' ? null : ['install', '--frozen-lockfile'];
220
+ return null;
221
+ }
222
+ /** The step the swap's way, or null when Trail can't write it safely: one simple command, nothing piped or chained. */
223
+ function swapFix(cmd, use, not) {
224
+ const { dir, core } = inFolder(cmd);
225
+ // Nothing piped, chained, redirected or substituted, and no env prefix or wrapper: the words are the whole command.
226
+ if (simpleCommands(core).length !== 1 || /[<>`$|&;]/.test(core.replace(/\{\w+\}/g, '')))
227
+ return null;
228
+ if (core.replace(/\s+/g, ' ').trim() !== bareCommand(core))
229
+ return null;
230
+ const s = simplesOf(core)[0];
231
+ if (!s)
232
+ return null;
233
+ let next = null;
234
+ if (!use.args.length && !not.args.length && PMS.has(use.prog) && PMS.has(not.prog) && s.prog === not.prog) {
235
+ const twin = pmTwin(s.args, use.prog);
236
+ next = twin ? [use.prog, ...twin] : null;
237
+ }
238
+ else if (s.prog === not.prog && s.args.join(' ') === not.args.join(' ') && (use.args.length || not.args.length)) {
239
+ next = [use.prog, ...use.args];
240
+ }
241
+ if (!next)
242
+ return null;
243
+ const text = next.join(' ');
244
+ return dir ? `(cd ${dir} && ${text})` : text;
245
+ }
246
+ /**
247
+ * Each rule against the steps (step `n` is `steps[n - 1]`, with its {params}). A step that does what a rule forbids
248
+ * is a contradiction, whatever another rule says of it; one that does what a rule says, a repeat.
249
+ */
250
+ export function matchSteps(rules, steps) {
251
+ const repeats = new Set();
252
+ const against = new Map();
253
+ // Two rules that would write one step two ways write it neither way.
254
+ const contradict = (n, fix) => {
255
+ if (!against.has(n))
256
+ against.set(n, fix);
257
+ else if (against.get(n) !== fix)
258
+ against.set(n, null);
259
+ };
260
+ for (const r of rules) {
261
+ steps.forEach((cmd, i) => {
262
+ const n = i + 1;
263
+ if (r.t === 'swap') {
264
+ if (anyRuns(cmd, r.not))
265
+ contradict(n, swapFix(cmd, r.use, r.not));
266
+ else if (anyRuns(cmd, r.use))
267
+ repeats.add(n);
268
+ }
269
+ else if (r.t === 'never') {
270
+ if (anyRuns(cmd, r.cmd))
271
+ contradict(n, null);
272
+ }
273
+ else if (r.t === 'never-edit') {
274
+ if (simplesOf(cmd).some((s) => edits(s, r.file)))
275
+ contradict(n, null);
276
+ }
277
+ else if (r.t === 'always') {
278
+ if (anyRuns(cmd, r.cmd))
279
+ repeats.add(n);
280
+ }
281
+ else if (anyRuns(cmd, r.then)) {
282
+ const first = steps.findIndex((x, j) => j < i && anyRuns(x, r.first));
283
+ if (first >= 0)
284
+ repeats.add(first + 1);
285
+ else if (!anyRuns(cmd, r.first))
286
+ contradict(n, null);
287
+ }
288
+ });
289
+ }
290
+ for (const n of against.keys())
291
+ repeats.delete(n);
292
+ return { repeats: [...repeats].sort((a, b) => a - b), contradicts: [...against].sort((a, b) => a[0] - b[0]).map(([step, fix]) => ({ step, fix })) };
293
+ }
294
+ //# sourceMappingURL=learning-steps.js.map