@nanonets/graft 0.23.0 → 0.24.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 (287) hide show
  1. package/README.md +4 -4
  2. package/dist/ai/crux.d.ts +31 -3
  3. package/dist/ai/crux.d.ts.map +1 -1
  4. package/dist/ai/crux.js +88 -10
  5. package/dist/ai/crux.js.map +1 -1
  6. package/dist/ai/llm/openai.d.ts +101 -0
  7. package/dist/ai/llm/openai.d.ts.map +1 -1
  8. package/dist/ai/llm/openai.js +396 -6
  9. package/dist/ai/llm/openai.js.map +1 -1
  10. package/dist/ai/llm/recover-tool.d.ts +2 -0
  11. package/dist/ai/llm/recover-tool.d.ts.map +1 -1
  12. package/dist/ai/llm/recover-tool.js +1 -1
  13. package/dist/ai/llm/recover-tool.js.map +1 -1
  14. package/dist/ai/synthesize.d.ts.map +1 -1
  15. package/dist/ai/synthesize.js +100 -1
  16. package/dist/ai/synthesize.js.map +1 -1
  17. package/dist/claude/format.d.ts +21 -0
  18. package/dist/claude/format.d.ts.map +1 -1
  19. package/dist/claude/format.js +46 -1
  20. package/dist/claude/format.js.map +1 -1
  21. package/dist/claude/hooks.d.ts +5 -9
  22. package/dist/claude/hooks.d.ts.map +1 -1
  23. package/dist/claude/hooks.js +71 -58
  24. package/dist/claude/hooks.js.map +1 -1
  25. package/dist/claude/init.js +3 -3
  26. package/dist/claude/init.js.map +1 -1
  27. package/dist/claude/note-signals.d.ts +28 -0
  28. package/dist/claude/note-signals.d.ts.map +1 -0
  29. package/dist/claude/note-signals.js +325 -0
  30. package/dist/claude/note-signals.js.map +1 -0
  31. package/dist/claude/shim-template.d.ts.map +1 -1
  32. package/dist/claude/shim-template.js +17 -6
  33. package/dist/claude/shim-template.js.map +1 -1
  34. package/dist/claude/skill-template.d.ts.map +1 -1
  35. package/dist/claude/skill-template.js +49 -18
  36. package/dist/claude/skill-template.js.map +1 -1
  37. package/dist/claude/state.d.ts +4 -3
  38. package/dist/claude/state.d.ts.map +1 -1
  39. package/dist/claude/state.js.map +1 -1
  40. package/dist/claude/sync-run.js +1 -1
  41. package/dist/claude/sync-run.js.map +1 -1
  42. package/dist/cli-picker.d.ts +12 -5
  43. package/dist/cli-picker.d.ts.map +1 -1
  44. package/dist/cli-picker.js +24 -8
  45. package/dist/cli-picker.js.map +1 -1
  46. package/dist/cli.d.ts +2 -0
  47. package/dist/cli.d.ts.map +1 -1
  48. package/dist/cli.js +149 -43
  49. package/dist/cli.js.map +1 -1
  50. package/dist/context/batches.d.ts +29 -0
  51. package/dist/context/batches.d.ts.map +1 -0
  52. package/dist/context/batches.js +130 -0
  53. package/dist/context/batches.js.map +1 -0
  54. package/dist/context/build.d.ts +7 -2
  55. package/dist/context/build.d.ts.map +1 -1
  56. package/dist/context/build.js +84 -50
  57. package/dist/context/build.js.map +1 -1
  58. package/dist/context/node-file.d.ts.map +1 -1
  59. package/dist/context/node-file.js +41 -4
  60. package/dist/context/node-file.js.map +1 -1
  61. package/dist/engine.d.ts +2 -0
  62. package/dist/engine.d.ts.map +1 -1
  63. package/dist/engine.js +1 -0
  64. package/dist/engine.js.map +1 -1
  65. package/dist/graph/cards.d.ts.map +1 -1
  66. package/dist/graph/cards.js +9 -4
  67. package/dist/graph/cards.js.map +1 -1
  68. package/dist/graph/enrich.d.ts.map +1 -1
  69. package/dist/graph/enrich.js +8 -3
  70. package/dist/graph/enrich.js.map +1 -1
  71. package/dist/graph/generic.d.ts.map +1 -1
  72. package/dist/graph/generic.js +207 -6
  73. package/dist/graph/generic.js.map +1 -1
  74. package/dist/graph/lsp/client.d.ts +18 -0
  75. package/dist/graph/lsp/client.d.ts.map +1 -1
  76. package/dist/graph/lsp/client.js +40 -2
  77. package/dist/graph/lsp/client.js.map +1 -1
  78. package/dist/graph/lsp/enrich.d.ts.map +1 -1
  79. package/dist/graph/lsp/enrich.js +9 -1
  80. package/dist/graph/lsp/enrich.js.map +1 -1
  81. package/dist/graph/lsp/registry.d.ts +7 -0
  82. package/dist/graph/lsp/registry.d.ts.map +1 -1
  83. package/dist/graph/lsp/registry.js +27 -2
  84. package/dist/graph/lsp/registry.js.map +1 -1
  85. package/dist/graph/queries/gleam.scm +51 -0
  86. package/dist/graph/resolve.d.ts.map +1 -1
  87. package/dist/graph/resolve.js +65 -3
  88. package/dist/graph/resolve.js.map +1 -1
  89. package/dist/graph/workspace-cli.d.ts +2 -0
  90. package/dist/graph/workspace-cli.d.ts.map +1 -1
  91. package/dist/graph/workspace-cli.js +1 -1
  92. package/dist/graph/workspace-cli.js.map +1 -1
  93. package/dist/init-guard.d.ts +11 -0
  94. package/dist/init-guard.d.ts.map +1 -0
  95. package/dist/init-guard.js +21 -0
  96. package/dist/init-guard.js.map +1 -0
  97. package/dist/mcp/tools.d.ts.map +1 -1
  98. package/dist/mcp/tools.js +2 -1
  99. package/dist/mcp/tools.js.map +1 -1
  100. package/dist/notes/branches.d.ts +7 -1
  101. package/dist/notes/branches.d.ts.map +1 -1
  102. package/dist/notes/branches.js +31 -3
  103. package/dist/notes/branches.js.map +1 -1
  104. package/dist/notes/cold-start.d.ts +12 -2
  105. package/dist/notes/cold-start.d.ts.map +1 -1
  106. package/dist/notes/cold-start.js +46 -5
  107. package/dist/notes/cold-start.js.map +1 -1
  108. package/dist/notes/credit.d.ts +37 -0
  109. package/dist/notes/credit.d.ts.map +1 -0
  110. package/dist/notes/credit.js +78 -0
  111. package/dist/notes/credit.js.map +1 -0
  112. package/dist/notes/find-notes.d.ts +17 -0
  113. package/dist/notes/find-notes.d.ts.map +1 -0
  114. package/dist/notes/find-notes.js +48 -0
  115. package/dist/notes/find-notes.js.map +1 -0
  116. package/dist/notes/flatten.d.ts +31 -0
  117. package/dist/notes/flatten.d.ts.map +1 -0
  118. package/dist/notes/flatten.js +73 -0
  119. package/dist/notes/flatten.js.map +1 -0
  120. package/dist/notes/git-facts.d.ts +7 -1
  121. package/dist/notes/git-facts.d.ts.map +1 -1
  122. package/dist/notes/git-facts.js +12 -2
  123. package/dist/notes/git-facts.js.map +1 -1
  124. package/dist/notes/home.d.ts +24 -6
  125. package/dist/notes/home.d.ts.map +1 -1
  126. package/dist/notes/home.js +82 -15
  127. package/dist/notes/home.js.map +1 -1
  128. package/dist/notes/learning-fields.d.ts +102 -0
  129. package/dist/notes/learning-fields.d.ts.map +1 -0
  130. package/dist/notes/learning-fields.js +214 -0
  131. package/dist/notes/learning-fields.js.map +1 -0
  132. package/dist/notes/memory-notes.d.ts +71 -0
  133. package/dist/notes/memory-notes.d.ts.map +1 -0
  134. package/dist/notes/memory-notes.js +239 -0
  135. package/dist/notes/memory-notes.js.map +1 -0
  136. package/dist/notes/note-gate.d.ts +42 -0
  137. package/dist/notes/note-gate.d.ts.map +1 -0
  138. package/dist/notes/note-gate.js +181 -0
  139. package/dist/notes/note-gate.js.map +1 -0
  140. package/dist/notes/notes.d.ts +29 -77
  141. package/dist/notes/notes.d.ts.map +1 -1
  142. package/dist/notes/notes.js +69 -228
  143. package/dist/notes/notes.js.map +1 -1
  144. package/dist/notes/pr-reviews.d.ts +35 -7
  145. package/dist/notes/pr-reviews.d.ts.map +1 -1
  146. package/dist/notes/pr-reviews.js +156 -46
  147. package/dist/notes/pr-reviews.js.map +1 -1
  148. package/dist/notes/secrets.d.ts +28 -0
  149. package/dist/notes/secrets.d.ts.map +1 -0
  150. package/dist/notes/secrets.js +362 -0
  151. package/dist/notes/secrets.js.map +1 -0
  152. package/dist/notes/session-cost.d.ts +2 -0
  153. package/dist/notes/session-cost.d.ts.map +1 -1
  154. package/dist/notes/session-cost.js +8 -3
  155. package/dist/notes/session-cost.js.map +1 -1
  156. package/dist/notes/targets.d.ts +37 -0
  157. package/dist/notes/targets.d.ts.map +1 -0
  158. package/dist/notes/targets.js +108 -0
  159. package/dist/notes/targets.js.map +1 -0
  160. package/dist/notes/team-check.d.ts +22 -0
  161. package/dist/notes/team-check.d.ts.map +1 -0
  162. package/dist/notes/team-check.js +130 -0
  163. package/dist/notes/team-check.js.map +1 -0
  164. package/dist/notes/trail-home.d.ts +3 -0
  165. package/dist/notes/trail-home.d.ts.map +1 -0
  166. package/dist/notes/trail-home.js +12 -0
  167. package/dist/notes/trail-home.js.map +1 -0
  168. package/dist/search/grep-cli.d.ts +5 -2
  169. package/dist/search/grep-cli.d.ts.map +1 -1
  170. package/dist/search/grep-cli.js +11 -4
  171. package/dist/search/grep-cli.js.map +1 -1
  172. package/dist/search/ignored-code.d.ts +9 -0
  173. package/dist/search/ignored-code.d.ts.map +1 -0
  174. package/dist/search/ignored-code.js +73 -0
  175. package/dist/search/ignored-code.js.map +1 -0
  176. package/dist/skills/answers-prompt.d.ts +13 -0
  177. package/dist/skills/answers-prompt.d.ts.map +1 -0
  178. package/dist/skills/answers-prompt.js +83 -0
  179. package/dist/skills/answers-prompt.js.map +1 -0
  180. package/dist/skills/never-save.d.ts +5 -0
  181. package/dist/skills/never-save.d.ts.map +1 -0
  182. package/dist/skills/never-save.js +158 -0
  183. package/dist/skills/never-save.js.map +1 -0
  184. package/dist/skills/params.d.ts +39 -0
  185. package/dist/skills/params.d.ts.map +1 -0
  186. package/dist/skills/params.js +275 -0
  187. package/dist/skills/params.js.map +1 -0
  188. package/dist/skills/ran-less.d.ts +5 -0
  189. package/dist/skills/ran-less.d.ts.map +1 -0
  190. package/dist/skills/ran-less.js +51 -0
  191. package/dist/skills/ran-less.js.map +1 -0
  192. package/dist/skills/risk-delta.d.ts +32 -0
  193. package/dist/skills/risk-delta.d.ts.map +1 -0
  194. package/dist/skills/risk-delta.js +56 -0
  195. package/dist/skills/risk-delta.js.map +1 -0
  196. package/dist/skills/risk.d.ts +73 -0
  197. package/dist/skills/risk.d.ts.map +1 -0
  198. package/dist/skills/risk.js +396 -0
  199. package/dist/skills/risk.js.map +1 -0
  200. package/dist/skills/types.d.ts +422 -0
  201. package/dist/skills/types.d.ts.map +1 -0
  202. package/dist/skills/types.js +2 -0
  203. package/dist/skills/types.js.map +1 -0
  204. package/dist/telemetry/contract.d.ts.map +1 -1
  205. package/dist/telemetry/contract.js +8 -6
  206. package/dist/telemetry/contract.js.map +1 -1
  207. package/dist/telemetry/notice.d.ts.map +1 -1
  208. package/dist/telemetry/notice.js +3 -1
  209. package/dist/telemetry/notice.js.map +1 -1
  210. package/dist/trace/check-reads.d.ts +36 -0
  211. package/dist/trace/check-reads.d.ts.map +1 -0
  212. package/dist/trace/check-reads.js +57 -0
  213. package/dist/trace/check-reads.js.map +1 -0
  214. package/dist/trace/host.d.ts +40 -0
  215. package/dist/trace/host.d.ts.map +1 -0
  216. package/dist/trace/host.js +84 -0
  217. package/dist/trace/host.js.map +1 -0
  218. package/dist/trace/redact.d.ts +8 -0
  219. package/dist/trace/redact.d.ts.map +1 -0
  220. package/dist/trace/redact.js +63 -0
  221. package/dist/trace/redact.js.map +1 -0
  222. package/dist/trace/seen-cache.d.ts +9 -0
  223. package/dist/trace/seen-cache.d.ts.map +1 -0
  224. package/dist/trace/seen-cache.js +46 -0
  225. package/dist/trace/seen-cache.js.map +1 -0
  226. package/dist/trace/shell-scan.d.ts +52 -0
  227. package/dist/trace/shell-scan.d.ts.map +1 -0
  228. package/dist/trace/shell-scan.js +318 -0
  229. package/dist/trace/shell-scan.js.map +1 -0
  230. package/dist/trace/shell-words.d.ts +91 -0
  231. package/dist/trace/shell-words.d.ts.map +1 -0
  232. package/dist/trace/shell-words.js +558 -0
  233. package/dist/trace/shell-words.js.map +1 -0
  234. package/dist/trace/shell.d.ts +91 -0
  235. package/dist/trace/shell.d.ts.map +1 -0
  236. package/dist/trace/shell.js +435 -0
  237. package/dist/trace/shell.js.map +1 -0
  238. package/dist/trace/state.d.ts +27 -0
  239. package/dist/trace/state.d.ts.map +1 -0
  240. package/dist/trace/state.js +98 -0
  241. package/dist/trace/state.js.map +1 -0
  242. package/dist/trace/tamper-code.d.ts +9 -0
  243. package/dist/trace/tamper-code.d.ts.map +1 -0
  244. package/dist/trace/tamper-code.js +174 -0
  245. package/dist/trace/tamper-code.js.map +1 -0
  246. package/dist/trace/tamper-git.d.ts +12 -0
  247. package/dist/trace/tamper-git.d.ts.map +1 -0
  248. package/dist/trace/tamper-git.js +77 -0
  249. package/dist/trace/tamper-git.js.map +1 -0
  250. package/dist/trace/types.d.ts +477 -0
  251. package/dist/trace/types.d.ts.map +1 -0
  252. package/dist/trace/types.js +12 -0
  253. package/dist/trace/types.js.map +1 -0
  254. package/dist/trace/walls-glob.d.ts +11 -0
  255. package/dist/trace/walls-glob.d.ts.map +1 -0
  256. package/dist/trace/walls-glob.js +264 -0
  257. package/dist/trace/walls-glob.js.map +1 -0
  258. package/dist/trace/walls-quoted.d.ts +25 -0
  259. package/dist/trace/walls-quoted.d.ts.map +1 -0
  260. package/dist/trace/walls-quoted.js +81 -0
  261. package/dist/trace/walls-quoted.js.map +1 -0
  262. package/dist/upkeep.d.ts +1 -1
  263. package/dist/upkeep.d.ts.map +1 -1
  264. package/dist/upkeep.js +4 -1
  265. package/dist/upkeep.js.map +1 -1
  266. package/dist/util/actions-folder.d.ts +2 -0
  267. package/dist/util/actions-folder.d.ts.map +1 -0
  268. package/dist/util/actions-folder.js +9 -0
  269. package/dist/util/actions-folder.js.map +1 -0
  270. package/dist/util/front-matter.d.ts +31 -4
  271. package/dist/util/front-matter.d.ts.map +1 -1
  272. package/dist/util/front-matter.js +95 -3
  273. package/dist/util/front-matter.js.map +1 -1
  274. package/dist/util/private-file.d.ts +14 -0
  275. package/dist/util/private-file.d.ts.map +1 -0
  276. package/dist/util/private-file.js +82 -0
  277. package/dist/util/private-file.js.map +1 -0
  278. package/dist/util/private-fs.d.ts +25 -0
  279. package/dist/util/private-fs.d.ts.map +1 -0
  280. package/dist/util/private-fs.js +253 -0
  281. package/dist/util/private-fs.js.map +1 -0
  282. package/dist/util/state.d.ts.map +1 -1
  283. package/dist/util/state.js +3 -0
  284. package/dist/util/state.js.map +1 -1
  285. package/dist/viewer/app.js +2 -2
  286. package/package.json +5 -5
  287. package/scripts/run-tests.mjs +14 -2
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Never save (design 4.11, spec 10): a command a skill may never hold, so a
3
+ * run with one gives no skill at all (sudo, a download piped into a shell,
4
+ * `rm -rf` on a variable or a home path, a force push to a shared branch, a
5
+ * credential file, destructive SQL off this machine, anything that messages
6
+ * people, Trail itself), and the 4.10 password backstop. Split from risk.ts,
7
+ * whose gated list and agent guard the PreToolUse fast path loads; this file
8
+ * is for the save side only.
9
+ */
10
+ import { isTrailCommand } from '../trace/shell.js';
11
+ import { argsAfter, pushes, unknownDst, word, written } from './risk.js';
12
+ const LOCAL_HOSTS = /^(?:localhost|127\.0\.0\.1|::1|\[::1\])$/i;
13
+ const escapeRe = (t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
14
+ /** Hosts a database command names: `-h x`, `--host=x`, `host=x`, `scheme://user@x:port`. */
15
+ function namedHosts(cmd) {
16
+ const hosts = [];
17
+ for (const m of cmd.matchAll(/(?:^|\s)(?:-h|--host)(?:=|\s+)['"]?([^\s'"/;]+)/g))
18
+ hosts.push(m[1]);
19
+ for (const m of cmd.matchAll(/\bhost=['"]?([^\s'";]+)/gi))
20
+ hosts.push(m[1]);
21
+ for (const m of cmd.matchAll(/\b[a-z][a-z0-9+.-]*:\/\/(?:[^\s/@'"]*@)?(\[[^\]]+\]|[^\s/:'"?]+)/gi))
22
+ hosts.push(m[1]);
23
+ return hosts;
24
+ }
25
+ /** A target `rm -r` or `find -delete` must never get: a variable, a {param}, home, an absolute path, the whole folder. */
26
+ const wildTarget = (t) => t !== '{}' && (/^[$~/]|^\.\.(?:\/|$)/.test(t) || /\$|`|\{[A-Za-z_]\w*\}/.test(t) || /^(?:\.\/?|(?:\.\/)?\*)$/.test(t));
27
+ function rmWild(text) {
28
+ const rms = [...text.matchAll(word('rm'))];
29
+ for (const [i, m] of rms.entries()) {
30
+ let recursive = false;
31
+ let opts = true;
32
+ const targets = [];
33
+ for (const w of argsAfter(text, m.index + m[0].length, rms[i + 1]?.index)) {
34
+ if (opts && w === '--')
35
+ opts = false;
36
+ else if (opts && /^-[a-zA-Z]+$/.test(w))
37
+ recursive ||= /[rR]/.test(w);
38
+ else if (opts && /^--[\w-]+$/.test(w))
39
+ recursive ||= w === '--recursive';
40
+ else
41
+ targets.push(w);
42
+ }
43
+ if (!recursive)
44
+ continue;
45
+ // `xargs rm -rf`: the targets come from elsewhere.
46
+ if (!targets.length ? /\bxargs\b[^;&|\n]*$/.test(text.slice(0, m.index)) : targets.some(wildTarget))
47
+ return true;
48
+ }
49
+ const finds = [...text.matchAll(word('find'))];
50
+ for (const [i, m] of finds.entries()) {
51
+ const w = argsAfter(text, m.index + m[0].length, finds[i + 1]?.index);
52
+ const roots = w.slice(0, Math.max(0, w.findIndex((x) => /^[-(!]/.test(x))));
53
+ const deletes = w.includes('-delete') || w.some((x, i) => /^-(?:exec|execdir|ok|okdir)$/.test(x) && /(?:^|\/)rm$/.test(w[i + 1] ?? ''));
54
+ // `find . -name x -exec rm {} +` is fine; a root the skill can't know is not.
55
+ if (deletes && roots.some((t) => /^[$~/{]/.test(t) || /\$|`/.test(t)))
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ const SHARED = new Set(['main', 'master', 'prod', 'production', 'beta', 'dev', 'develop', 'staging', 'trunk']);
61
+ const forcePushShared = (c) => pushes(c).some((p) => p.force && p.dsts.some((d) => SHARED.has(d.toLowerCase()) || unknownDst(d)));
62
+ const SUDO = /(?:^|[^\w./-])(?:[\w./-]*\/)?(?:sudo|doas|pkexec)(?![\w-])/i;
63
+ const SHELL_WORD = String.raw `(?:sudo\s+(?:-\S+\s+)*)?(?:env\s+(?:\S+=\S*\s+)*)?(?:[\w./-]*\/)?`;
64
+ const DOWNLOAD = [
65
+ new RegExp(String.raw `\b(?:curl|wget)\b[^\n]*?(?<!\|)\|(?!\|)\s*${SHELL_WORD}(?:ba|z|da|k|fi)?sh\b`, 'i'),
66
+ new RegExp(String.raw `\b(?:curl|wget)\b[^\n]*?(?<!\|)\|(?!\|)\s*${SHELL_WORD}(?:python[\d.]*|node|perl|ruby|php)(?:\s+-)?\s*(?=$|[;&|)\n])`, 'i'),
67
+ /(?:\b(?:ba|z|da|k)?sh|\bsource|(?:^|[\s;&|(])\.)\s+<\(\s*(?:curl|wget)\b/i,
68
+ /\b(?:(?:ba|z|da|k)?sh\s+-\w*c|eval)\s+["']?(?:\$\(|`)\s*(?:curl|wget)\b/i,
69
+ ];
70
+ /** `curl -o x.sh URL && sh x.sh`, `wget URL -O s.sh; chmod +x s.sh; ./s.sh`: a download saved to a file, then run. */
71
+ function downloadThenRun(text) {
72
+ for (const m of text.matchAll(/\b(curl|wget)\b([^;&|\n]*)/gi)) {
73
+ const [, tool, args] = m;
74
+ const files = new Set();
75
+ const named = /(?:\s-[a-zA-Z]*o\s*|\s--output[= ]\s*|\s-O\s*(?=[^\s-])|\s--output-document[= ]\s*)['"]?([^\s'";&|]+)/.exec(args)?.[1];
76
+ if (named && named !== '-' && named !== '/dev/null')
77
+ files.add(named);
78
+ // `wget URL` and `curl -O URL` save under the link's own name.
79
+ const remote = /^wget$/i.test(tool) ? !/\s-[a-zA-Z]*O\b|--output-document/.test(args) : /\s-[a-zA-Z]*O\b|--remote-name\b/.test(args);
80
+ if (remote)
81
+ for (const u of args.matchAll(/https?:\/\/\S*\/([^\s/'"?#]+)/g))
82
+ files.add(u[1]);
83
+ const after = text.slice(m.index + m[0].length);
84
+ for (const f of files) {
85
+ const e = escapeRe(f.replace(/^\.\//, '').split('/').pop());
86
+ // Run as a program, or handed to a shell, `source`, `.` or `chmod +x`: at the start of a command.
87
+ const run = new RegExp(String.raw `(?:^|[;&|(\n]|&&|\|\|)\s*(?:(?:(?:ba|z|da|k)?sh|source|\.|chmod\s+\S*x)\s+)?['"]?(?:\.?\.?\/[^\s'"]*\/|\.\/)?${e}['"]?(?=\s|$|[;&|)])`);
88
+ const plainName = new RegExp(String.raw `(?:^|[;&|(\n]|&&|\|\|)\s*(?:(?:ba|z|da|k)?sh|source|\.|chmod\s+\S*x)\s+['"]?${e}['"]?(?=\s|$|[;&|)])`);
89
+ if (plainName.test(after) || (run.test(after) && new RegExp(String.raw `(?:^|[\s;&|(])\.{0,2}\/(?:[^\s'"]*\/)?${e}(?=\s|$|[;&|)'"])`).test(after)))
90
+ return true;
91
+ }
92
+ }
93
+ return false;
94
+ }
95
+ const CREDENTIAL = /(?:\.npmrc|\.netrc|\.aws\/(?:credentials|sso\/cache|cli\/cache)|(?<![\w.])\.ssh\/|\.git-credentials|\.docker\/config\.json|gh\/hosts\.yml|com\.vercel\.cli\/auth\.json|\.config\/gcloud|Library\/Keychains|\.kube\/config|\.pypirc|\.gem\/credentials|\.cargo\/credentials|\.pgpass|\.my\.cnf|credentials\.tfrc\.json|\.terraformrc|\.config\/hub\b|\.azure\/|\.password-store|\.vault-token)/i;
96
+ /**
97
+ * Commands that store a credential they were handed where every later command picks it up. Logging in at
98
+ * the browser (`npm login`, `gh auth login`) needs the person there, holds no secret in the step, and is how
99
+ * a release gets past an expired token: not on this list, but gated (D93, `login`), so it is never run unasked.
100
+ */
101
+ const CREDENTIAL_WRITE = /\bnpm\s+config\s+set\s+\S*_(?:auth|password)|\b(?:docker|podman|helm\s+registry)\s+login\b[^;&|\n]*\s(?:-p|--password(?:-stdin)?)\b|\baws\s+configure\s+set\b|\bgit\s+credential\s+(?:approve|store)\b|\bgit\s+config\b[^;&|\n]*\bcredential\.helper\b|\bsecurity\s+add-(?:generic|internet)-password\b/i;
102
+ /** Commands that print a stored credential. */
103
+ const CREDENTIAL_READ = /\bgh\s+auth\s+token\b|\bgit\s+credential\s+fill\b|\bsecurity\s+(?:find|delete)-(?:generic|internet)-password\b|\bsecurity\s+dump-keychain\b|\bop\s+(?:read|item\s+get)\b|\bgcloud\s+auth\s+print-(?:access|identity)-token\b|\bheroku\s+auth:token\b|\bpass\s+show\b|\bvault\s+(?:read|kv\s+get)\b/i;
104
+ const DESTRUCTIVE_SQL = /\b(?:drop\s+(?:table|database|schema|view|materialized\s+view|index|owned|role|user|function|type|sequence|extension)|truncate(?!\s+-)|delete\s+from|alter\s+table\b[^;]*?\bdrop)\b|\bdropdb\b|\bflush(?:all|db)\b|\bdropDatabase\s*\(|\.drop(?:Collection)?\s*\(\s*\)|\bdeleteMany\s*\(\s*\{\s*\}\s*\)|\bsupabase\s+db\s+reset\b[^;&|\n]*--(?:linked|db-url)|\bprisma\s+(?:migrate\s+reset|db\s+push\b[^;&|\n]*--(?:force-reset|accept-data-loss))|\brails\s+db:(?:drop|reset)\b/i;
105
+ const MESSAGES = /\b(?:sendmail|mail\s+-s|mailx|mutt|msmtp|swaks|twilio)\b|\bgit\s+send-email\b|hooks\.slack\.com|\bslack\s+chat\b|graph\.facebook\.com|discord(?:app)?\.com\/api\/webhooks|api\.telegram\.org\/bot|api\.(?:sendgrid\.com|mailgun\.net|postmarkapp\.com|resend\.com)|\bgh\s+(?:issue\s+(?:create|comment)|pr\s+(?:comment|review))\b/i;
106
+ /** `gh api` that writes: a POST/PATCH/PUT, or fields (`-f`, `-F`, `--input`) without `-X GET`. */
107
+ function ghApiWrite(c) {
108
+ if (!/\bgh\s+api\b/i.test(c))
109
+ return false;
110
+ if (/\bgh\s+api\s+graphql\b/i.test(c))
111
+ return /\bmutation\b[\s\S]*?\b(?:add|create|submit|update)\w*(?:Comment|Review|Issue|Discussion)\w*\b/i.test(c);
112
+ const method = /(?:-X|--method)[\s=]+([A-Z]+)/i.exec(c)?.[1]?.toUpperCase();
113
+ const writes = method ? method !== 'GET' : /(?:^|\s)(?:-f|-F|--field|--raw-field|--input)(?=[\s=])/.test(c);
114
+ return writes && /\/(?:comments|reviews|issues|messages|replies)\b/i.test(c);
115
+ }
116
+ /** Trail run by a wrapper `isTrailCommand` doesn't open: `eval "trail …"`, `xargs trail`, `find -exec trail`. */
117
+ const TRAIL_VIA = /(?:\beval|\bxargs(?:\s+-\S+(?:\s+[^\s-]\S*)?)*|(?<!\S)-(?:exec|execdir|ok|okdir))\s+["']?(?:trail|graft|trail-code)\b/i;
118
+ const NEVER = [
119
+ ['runs sudo', (c) => SUDO.test(c)],
120
+ ['pipes a download into a shell', (c) => DOWNLOAD.some((re) => re.test(c)) || downloadThenRun(c)],
121
+ ['runs rm -rf on a variable or a home path', rmWild],
122
+ ['force-pushes a shared branch', forcePushShared],
123
+ ['touches a credential file', (c) => CREDENTIAL.test(c) || CREDENTIAL_WRITE.test(c) || CREDENTIAL_READ.test(c)],
124
+ ['runs destructive SQL off this machine', (c) => DESTRUCTIVE_SQL.test(c)
125
+ && (namedHosts(c).some((h) => !LOCAL_HOSTS.test(h)) || !/(?:^|[;&|(]\s*)docker\s+exec\b/i.test(c))],
126
+ ['messages people or submits to an outside service', (c) => MESSAGES.test(c) || ghApiWrite(c)],
127
+ ['runs Trail itself', (c) => isTrailCommand(c) || TRAIL_VIA.test(c)],
128
+ ];
129
+ /** Reason a command can never be in a skill (4.11), or null. */
130
+ export function neverSave(cmd) {
131
+ const c = String(cmd ?? '');
132
+ for (const [why, hit] of NEVER) {
133
+ if (!hit(c))
134
+ continue;
135
+ if (why === 'touches a credential file') {
136
+ const writes = CREDENTIAL_WRITE.test(c) || />>?\s*\S*(?:\.npmrc|\.netrc|credentials|\.ssh\/|config\.json|hosts\.yml|auth\.json|\.kube\/config|\.pypirc|\.pgpass)|\b(?:cp|mv|tee|ln)\b|security\s+add-/i.test(c);
137
+ return writes ? 'writes a credential file' : 'reads a credential file';
138
+ }
139
+ return why;
140
+ }
141
+ return null;
142
+ }
143
+ const PASSWORD_AT = [
144
+ /\b(?:mysql|mysqldump|mysqladmin|mariadb|mariadb-dump)\b[^;&|\n]*?\s-p(?=\S)(\S+)/i,
145
+ /\b(?:mysql|mysqldump|mysqladmin|mariadb)\b[^;&|\n]*?\s--password=(\S+)/i,
146
+ /\b(?:docker|podman|nerdctl|buildah|skopeo|oras)\s+login\b[^;&|\n]*?\s(?:-p|--password)(?:=|\s+)(\S+)/i,
147
+ /\bhelm\s+registry\s+login\b[^;&|\n]*?\s(?:-p|--password)(?:=|\s+)(\S+)/i,
148
+ /\bsshpass\s+-p\s*(\S+)/i,
149
+ /\bredis-cli\b[^;&|\n]*?\s(?:-a|--pass)\s+(\S+)/i,
150
+ /\b(?:echo|printf)\s+(?:-n\s+)?(\S+)\s*\|[^;&\n]*--password-stdin\b/i,
151
+ /\b(?:PGPASSWORD|MYSQL_PWD|REDISCLI_AUTH|SSHPASS)=(\S+)/,
152
+ ];
153
+ /** 4.10 backstop: a password written out after a flag that takes one. The fold names most secrets; these it can't tell from a word. */
154
+ export function literalPassword(cmd) {
155
+ const c = String(cmd ?? '');
156
+ return PASSWORD_AT.some((re) => { const v = re.exec(c)?.[1]; return v !== undefined && written(v); });
157
+ }
158
+ //# sourceMappingURL=never-save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"never-save.js","sourceRoot":"","sources":["../../src/skills/never-save.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Parameters in a skill's steps (design 4.5 step 10).
3
+ *
4
+ * A step copied from a run carries last time's values: the version it
5
+ * published, the commit it pushed, the PR it merged, the port the server ran
6
+ * on. Replayed as they are, they would publish the old version again or push
7
+ * an old commit. So values of a known shape become `{name}`, every occurrence
8
+ * of one value under one name, in this order: version, sha, pr, port, branch,
9
+ * date. A sha defaults to `$(git rev-parse HEAD)` (when it is the only one) and a date to today; a port
10
+ * or a branch defaults to the value seen; a version and a PR come from the ask.
11
+ * With the last run of the same job beside this one, a token that differed
12
+ * between the two (the package a test run named) becomes a parameter too.
13
+ *
14
+ * Pure: no files, no clock.
15
+ */
16
+ import type { PromptParams } from '../trace/types.js';
17
+ import type { ParamDef } from './types.js';
18
+ export declare const STABLE_BRANCHES: ReadonlySet<string>;
19
+ /** Finds shape and varied tokens in kept commands, replaces them with {name}, returns defs (4.5 step 10). */
20
+ export declare function findParams(cmds: string[], ctx: {
21
+ prompt: PromptParams;
22
+ prior?: string[] | null;
23
+ check?: string;
24
+ }): {
25
+ cmds: string[];
26
+ check?: string;
27
+ params: ParamDef[];
28
+ };
29
+ /** Unknown {x} left as is. */
30
+ export declare function fillParams(text: string, values: Record<string, string>): string;
31
+ /** Values for a run block: prompt shapes first, then defaults, then last seen (with a note). */
32
+ export declare function resolveParams(defs: ParamDef[], prompt: PromptParams): {
33
+ values: Record<string, string>;
34
+ notes: string[];
35
+ };
36
+ /** 'version, sha=$(git rev-parse HEAD), pkg=workflow'. */
37
+ export declare function paramsToMeta(defs: ParamDef[]): string;
38
+ export declare function metaToParams(s: string | undefined): ParamDef[];
39
+ //# sourceMappingURL=params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/skills/params.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAAmG,CAAC;AAkMpJ,6GAA6G;AAC7G,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;CAAE,CAYzK;AAED,8BAA8B;AAC9B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAE/E;AAED,gGAAgG;AAChG,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAkBzH;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAErD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,EAAE,CAY9D"}
@@ -0,0 +1,275 @@
1
+ import { programOf } from '../trace/shell.js';
2
+ import { secretReason } from '../notes/secrets.js';
3
+ export const STABLE_BRANCHES = new Set(['main', 'master', 'beta', 'prod', 'production', 'dev', 'develop', 'staging', 'trunk']);
4
+ const SHA_TOKEN = /^[0-9a-f]{7,40}$/;
5
+ const isSha = (t) => SHA_TOKEN.test(t) && /\d/.test(t) && /[a-f]/.test(t);
6
+ const escapeRe = (t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
7
+ const NAME = /^[A-Za-z_]\w*$/;
8
+ /** Every match of `re`, as the span of its last group. */
9
+ function groupHits(text, re, keep = () => true) {
10
+ const out = [];
11
+ for (const m of text.matchAll(re)) {
12
+ const v = m[m.length - 1];
13
+ if (v === undefined)
14
+ continue;
15
+ const s = m.index + m[0].length - v.length;
16
+ if (keep(v, s))
17
+ out.push({ s, e: s + v.length, v });
18
+ }
19
+ return out;
20
+ }
21
+ const VERSION = /(?<![\w.])v?(\d+\.\d+\.\d+(?:-[0-9A-Za-z-]+(?:\.(?!tgz\b)[0-9A-Za-z-]+)*)?)(?![\w-]|\.\d)/g;
22
+ const INSTALL = /^\s*(?:[A-Za-z_]\w*=\S*\s+)*(?:npm\s+(?:i|install|add)|pnpm\s+(?:add|i|install)|yarn\s+(?:global\s+)?add|bun\s+add)\b/;
23
+ function versionHits(text) {
24
+ return groupHits(text, VERSION, (_v, s) => {
25
+ const before = text.slice(0, s).replace(/v$/, '');
26
+ if (/(?:^|[^\w-])(?:node|python|go)@$/.test(before) || /\bnvm\s+(?:use|install)\s+$/.test(before))
27
+ return false;
28
+ if (!before.endsWith('@'))
29
+ return true;
30
+ const simple = before.split(/&&|\|\||[;|\n(]/).pop() ?? '';
31
+ return !INSTALL.test(simple);
32
+ });
33
+ }
34
+ function shaHits(text) {
35
+ const out = [];
36
+ const add = (v, s) => { if (isSha(v))
37
+ out.push({ s, e: s + v.length, v }); };
38
+ for (const h of groupHits(text, /(?<![0-9A-Za-z])([0-9a-f]{7,40}):refs\//g))
39
+ add(h.v, h.s);
40
+ for (const h of groupHits(text, /\bgit\s+push\b[^;&|\n]*?\s\+?([0-9a-f]{7,40}):/g))
41
+ add(h.v, h.s);
42
+ for (const h of groupHits(text, /\bcommits\/([0-9a-f]{7,40})(?![0-9A-Za-z])/g))
43
+ add(h.v, h.s);
44
+ for (const m of text.matchAll(/\bmerge-base\s+--is-ancestor\s+(\S+)\s+(\S+)/dg)) {
45
+ add(m[1], m.indices[1][0]);
46
+ add(m[2], m.indices[2][0]);
47
+ }
48
+ const verbs = /\bgit(?:\s+-[Cc]\s+\S+|\s+--[\w-]+=\S+)*\s+(?:checkout|switch|reset|show|revert|cherry-pick|tag|merge|rebase|branch|worktree\s+add|update-ref|format-patch|bisect\s+(?:start|good|bad)|restore)\b([^;&|\n]*)/g;
49
+ for (const m of text.matchAll(verbs)) {
50
+ const base = m.index + m[0].length - m[1].length;
51
+ for (const t of m[1].matchAll(/(?<![0-9A-Za-z])[0-9a-f]{7,40}(?![0-9A-Za-z])/g))
52
+ add(t[0], base + t.index);
53
+ }
54
+ // A full 40-hex commit anywhere (a CI link, an API query) is a commit.
55
+ for (const t of text.matchAll(/(?<![0-9A-Za-z])[0-9a-f]{40}(?![0-9A-Za-z])/g))
56
+ add(t[0], t.index);
57
+ return out.filter((h, i) => out.findIndex((x) => x.s === h.s) === i);
58
+ }
59
+ const PR_CONTEXTS = [/(\bgh\s+pr\s+(?:view|checks|merge|diff|ready|edit|close|checkout|reopen|comment|review|update-branch|lock|unlock)\s+#?)(\d+)\b/g, /(\/pulls?\/)(\d+)\b/g];
60
+ const PORT_CONTEXTS = [
61
+ /(\b(?:localhost|127\.0\.0\.1|0\.0\.0\.0):)(\d{2,5})\b/g,
62
+ /(--port[= ])(\d{2,5})\b/g,
63
+ /(\bPORT=)(\d{2,5})\b/g,
64
+ /(\b(?:next\s+(?:dev|start)|vite(?:\s+preview)?|serve|http-server)\b[^;&|\n]*?\s-p\s?)(\d{2,5})\b/g,
65
+ /(\blsof\b[^;&|\n]*?:)(\d{2,5})\b/g,
66
+ /(\bhttp\.server\s+)(\d{2,5})\b/g,
67
+ ];
68
+ const BRANCH_CONTEXTS = [/(refs\/heads\/)([\w./-]+)/g, /(\bgit\s+(?:checkout|switch)\s+-[bcB]\s+)([\w./-]+)/g, /(\bgit\s+push\s+-u\s+\S+\s+)([\w./-]+)/g];
69
+ const DATE = /\b(20\d\d-\d\d-\d\d)\b/g;
70
+ const contextHits = (text, res, keep) => res.flatMap((re) => groupHits(text, re, keep ? (v) => keep(v) : undefined));
71
+ const SHAPES = [
72
+ // A version the run named elsewhere is the same param in an install pin too (the release, installed to try it).
73
+ { shape: 'version', hits: versionHits, everywhere: (v) => new RegExp(`(?<=@)${escapeRe(v)}(?![\\w-]|\\.\\d)`, 'g') },
74
+ { shape: 'sha', hits: shaHits, everywhere: (v) => new RegExp(`(?<![0-9A-Za-z])${v}(?![0-9A-Za-z])`, 'g'), def: () => '$(git rev-parse HEAD)' },
75
+ { shape: 'pr', hits: (t) => contextHits(t, PR_CONTEXTS) },
76
+ { shape: 'port', hits: (t) => contextHits(t, PORT_CONTEXTS), def: (v) => v },
77
+ {
78
+ shape: 'branch',
79
+ hits: (t) => contextHits(t, BRANCH_CONTEXTS, (v) => !STABLE_BRANCHES.has(v) && !isSha(v) && /[A-Za-z]/.test(v)),
80
+ everywhere: (v) => (/[/_-]/.test(v) ? new RegExp(`(?<![\\w./-])${escapeRe(v)}(?![\\w./-])`, 'g') : null),
81
+ def: (v) => v,
82
+ },
83
+ { shape: 'date', hits: (t) => groupHits(t, DATE), everywhere: (v) => new RegExp(`\\b${escapeRe(v)}\\b`, 'g'), def: () => '$(date +%F)' },
84
+ ];
85
+ const nextName = (base, used) => {
86
+ if (!used.has(base))
87
+ return base;
88
+ for (let n = 2;; n++)
89
+ if (!used.has(`${base}_${n}`))
90
+ return `${base}_${n}`;
91
+ };
92
+ /** Replace spans (no overlaps kept, earliest wins) with their placeholders. */
93
+ function replaceSpans(text, spans) {
94
+ const sorted = [...spans].sort((a, b) => a.s - b.s || b.e - a.e);
95
+ let out = '';
96
+ let at = 0;
97
+ for (const sp of sorted) {
98
+ if (sp.s < at)
99
+ continue;
100
+ out += text.slice(at, sp.s) + sp.to;
101
+ at = sp.e;
102
+ }
103
+ return out + text.slice(at);
104
+ }
105
+ /** One shape over every text: names by first appearance, then every hit (and, where safe, every occurrence) replaced. */
106
+ function applyShape(texts, spec, prompt, used, defs) {
107
+ const hits = texts.map((t) => spec.hits(t).filter((h) => !h.v.includes('{')));
108
+ const values = [];
109
+ for (const list of hits)
110
+ for (const h of [...list].sort((a, b) => a.s - b.s))
111
+ if (!values.includes(h.v))
112
+ values.push(h.v);
113
+ if (!values.length)
114
+ return texts;
115
+ const names = new Map();
116
+ const typed = spec.shape === 'version' ? prompt.version : undefined;
117
+ const order = typed && values.includes(typed) ? [typed, ...values.filter((v) => v !== typed)] : values;
118
+ for (const v of order) {
119
+ const n = nextName(spec.shape, used);
120
+ used.add(n);
121
+ names.set(v, n);
122
+ }
123
+ for (const v of order) {
124
+ const d = { name: names.get(v), shape: spec.shape, seen: [v] };
125
+ // Two different commits can't both be HEAD: then no sha has a default, and the agent fills each from the ask.
126
+ const def = spec.shape === 'sha' && order.length > 1 ? undefined : spec.def?.(v);
127
+ defs.push(def === undefined ? d : { name: d.name, shape: d.shape, default: def, seen: d.seen });
128
+ }
129
+ return texts.map((t, i) => {
130
+ const spans = hits[i].map((h) => ({ s: h.s, e: h.e, to: `{${names.get(h.v)}}` }));
131
+ for (const v of values) {
132
+ const re = spec.everywhere?.(v);
133
+ if (!re)
134
+ continue;
135
+ for (const m of t.matchAll(re))
136
+ spans.push({ s: m.index, e: m.index + m[0].length, to: `{${names.get(v)}}` });
137
+ }
138
+ return replaceSpans(t, spans);
139
+ });
140
+ }
141
+ const SEP = new Set(['/', '=', ':', '@', ',', '.', '-', '_', '"', "'"]);
142
+ const SHAPE_NAMES = new Set(['version', 'sha', 'pr', 'port', 'branch', 'date']);
143
+ const tokensOf = (cmd) => cmd.split(/(\s+)/);
144
+ /** The differing middle of two tokens, cut at separators: `./internal/workflow/...` vs `./internal/quickbooks/...` -> workflow. */
145
+ function middle(a, b) {
146
+ let p = 0;
147
+ while (p < a.length && p < b.length && a[p] === b[p])
148
+ p++;
149
+ while (p > 0 && !SEP.has(a[p - 1]))
150
+ p--;
151
+ let s = 0;
152
+ while (s < a.length - p && s < b.length - p && a[a.length - 1 - s] === b[b.length - 1 - s])
153
+ s++;
154
+ while (s > 0 && !SEP.has(a[a.length - s]))
155
+ s--;
156
+ if (p + s >= a.length || p + s >= b.length)
157
+ return { pre: '', mid: a, post: '', other: b };
158
+ return { pre: a.slice(0, p), mid: a.slice(p, a.length - s), post: a.slice(a.length - s), other: b.slice(p, b.length - s) };
159
+ }
160
+ /** 4.5 step 10, `varied`: align by program and order; a pair that differs in 1 or 2 tokens (not already params) gives params. */
161
+ function applyVaried(cmds, check, prior, used, defs) {
162
+ const swaps = new Map();
163
+ let args = 0;
164
+ let j = 0;
165
+ for (const cmd of cmds) {
166
+ const prog = programOf(cmd);
167
+ let k = j;
168
+ while (k < prior.length && programOf(prior[k]) !== prog)
169
+ k++;
170
+ if (k >= prior.length)
171
+ continue;
172
+ j = k + 1;
173
+ const a = tokensOf(cmd);
174
+ const b = tokensOf(prior[k]);
175
+ if (a.length !== b.length)
176
+ continue;
177
+ const diff = [];
178
+ for (let t = 0; t < a.length; t += 2)
179
+ if (a[t] !== b[t] && !a[t].includes('{') && !b[t].includes('{'))
180
+ diff.push(t);
181
+ if (diff.length < 1 || diff.length > 2)
182
+ continue;
183
+ for (const t of diff) {
184
+ if (swaps.has(a[t]))
185
+ continue;
186
+ // A different flag is a different command, not a value.
187
+ if (/^-/.test(a[t]) && !a[t].includes('='))
188
+ continue;
189
+ // The shell around a word (a subshell's `)`, quotes, a `;`) stays outside the param.
190
+ const wa = /^([("']*)([\s\S]*?)([)"';]*)$/.exec(a[t]);
191
+ const wb = /^([("']*)([\s\S]*?)([)"';]*)$/.exec(b[t]);
192
+ if (wa[1] !== wb[1] || wa[3] !== wb[3])
193
+ continue;
194
+ const m = middle(wa[2], wb[2]);
195
+ const [pre, mid, post, other] = [wa[1] + m.pre, m.mid, m.post + wa[3], m.other];
196
+ if (!mid || /[()`$;|&<>"']/.test(mid) || secretReason(mid) !== null)
197
+ continue;
198
+ const prev = t >= 2 ? a[t - 2] : '';
199
+ const inToken = /^-{1,2}([A-Za-z][\w-]*)=$/.exec(pre)?.[1];
200
+ const flag = !pre.replace(/["']/g, '') && /^-{1,2}[A-Za-z][\w-]*$/.test(prev) ? prev.replace(/^-+/, '') : undefined;
201
+ let base = inToken ?? (/(?:^|\/)(?:internal|packages|apps|services|cmd)\/$/.test(pre) ? 'pkg' : flag);
202
+ base = base?.toLowerCase().replace(/-/g, '_');
203
+ if (!base || !NAME.test(base) || SHAPE_NAMES.has(base))
204
+ base = `arg${++args}`;
205
+ const name = nextName(base, used);
206
+ used.add(name);
207
+ defs.push({ name, shape: 'varied', default: mid, seen: [mid, other] });
208
+ swaps.set(a[t], `${pre}{${name}}${post}`);
209
+ }
210
+ }
211
+ const swap = (text) => tokensOf(text).map((tok, i) => (i % 2 === 0 && swaps.has(tok) ? swaps.get(tok) : tok)).join('');
212
+ return { cmds: cmds.map(swap), check: check === undefined ? undefined : swap(check) };
213
+ }
214
+ /** Finds shape and varied tokens in kept commands, replaces them with {name}, returns defs (4.5 step 10). */
215
+ export function findParams(cmds, ctx) {
216
+ const hasCheck = ctx.check !== undefined;
217
+ let texts = [...cmds.map(String), ...(hasCheck ? [String(ctx.check)] : [])];
218
+ const used = new Set();
219
+ const defs = [];
220
+ for (const spec of SHAPES)
221
+ texts = applyShape(texts, spec, ctx.prompt ?? {}, used, defs);
222
+ let out = { cmds: texts.slice(0, cmds.length), check: hasCheck ? texts[cmds.length] : undefined };
223
+ if (ctx.prior?.length) {
224
+ const prior = findParams(ctx.prior, { prompt: ctx.prompt ?? {} }).cmds;
225
+ out = applyVaried(out.cmds, out.check, prior, used, defs);
226
+ }
227
+ return hasCheck ? { cmds: out.cmds, check: out.check, params: defs } : { cmds: out.cmds, params: defs };
228
+ }
229
+ /** Unknown {x} left as is. */
230
+ export function fillParams(text, values) {
231
+ return String(text ?? '').replace(/\{([A-Za-z_]\w*)\}/g, (m, k) => (Object.hasOwn(values, k) ? values[k] : m));
232
+ }
233
+ /** Values for a run block: prompt shapes first, then defaults, then last seen (with a note). */
234
+ export function resolveParams(defs, prompt) {
235
+ const values = {};
236
+ const notes = [];
237
+ for (const d of defs) {
238
+ const typed = prompt[d.name];
239
+ if (d.shape !== 'varied' && d.name === d.shape && typed) {
240
+ values[d.name] = typed;
241
+ notes.push(`{${d.name}} is ${typed}, from the ask.`);
242
+ }
243
+ else if (d.default !== undefined && d.default.startsWith('$(')) {
244
+ values[d.name] = d.default;
245
+ }
246
+ else {
247
+ const v = d.default ?? d.seen[0];
248
+ if (v === undefined || v === '')
249
+ continue;
250
+ values[d.name] = v;
251
+ notes.push(`{${d.name}} is ${v}, as last time; change it if the ask names another.`);
252
+ }
253
+ }
254
+ return { values, notes };
255
+ }
256
+ /** 'version, sha=$(git rev-parse HEAD), pkg=workflow'. */
257
+ export function paramsToMeta(defs) {
258
+ return defs.map((d) => (d.default === undefined ? d.name : `${d.name}=${d.default}`)).join(', ');
259
+ }
260
+ export function metaToParams(s) {
261
+ if (typeof s !== 'string' || !s.trim())
262
+ return [];
263
+ const out = [];
264
+ for (const part of s.split(/,\s+/)) {
265
+ const eq = part.indexOf('=');
266
+ const name = (eq < 0 ? part : part.slice(0, eq)).trim();
267
+ if (!NAME.test(name) || out.some((d) => d.name === name))
268
+ continue;
269
+ const base = name.replace(/_\d+$/, '');
270
+ const shape = SHAPE_NAMES.has(base) ? base : 'varied';
271
+ out.push(eq < 0 ? { name, shape, seen: [] } : { name, shape, default: part.slice(eq + 1).trim(), seen: [] });
272
+ }
273
+ return out;
274
+ }
275
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","sourceRoot":"","sources":["../../src/skills/params.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Whether `ran` did less than `step`: see the header. Reads only the simple commands running the step's own (program and verb). */
2
+ export declare function doesLess(step: string, ran: string): boolean;
3
+ /** A call that can't be a step of its own for a fold: it hides its failure, or only rehearsed (`--dry-run`, `-n`). */
4
+ export declare function onlyRehearsed(ran: string): boolean;
5
+ //# sourceMappingURL=ran-less.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ran-less.d.ts","sourceRoot":"","sources":["../../src/skills/ran-less.ts"],"names":[],"mappings":"AA4BA,oIAAoI;AACpI,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAY3D;AAED,sHAAsH;AACtH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOlD"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * D138 (2): a call that ran a skill's step but made it do less is not that step for credit: it added a flag that
3
+ * stops the work (`--dry-run`, `-n`, a `-qn` bundle, `--no-...`) the step lacked, or a trailing `; exit 0`,
4
+ * `|| true`, `|| :` (or `|| exit 0`) that hides the step's failure. Output-only `--no-` flags (colour, progress,
5
+ * pager, fund, audit, update notices) change nothing the step does, so they still count. Pure.
6
+ */
7
+ import { simpleCommands } from '../trace/shell.js';
8
+ import { unquote, words } from '../trace/shell-scan.js';
9
+ const LESS = /^(?:--dry-?run|-n|--no-[\w-]+)$/i;
10
+ const OUTPUT_ONLY = /^--no-(?:colou?rs?|progress|pager|fund|audit|update-notifier|emoji|spin(?:ner)?|banner)$/i;
11
+ const HIDES_FAILURE = /(?:;\s*exit\s+0|\|\|\s*(?:true|:|exit\s+0))\s*;?\s*$/;
12
+ /** The do-less flags in one simple command: `--x=y` as `--x`, a short bundle letter by letter. */
13
+ function lessIn(simple) {
14
+ return words(simple).map((w) => unquote(w)).flatMap((w) => {
15
+ const f = /^-[A-Za-z]{2,}$/.test(w) ? [...w.slice(1)].map((c) => `-${c}`) : w.startsWith('-') ? [w.split('=')[0]] : [];
16
+ return f.filter((x) => LESS.test(x) && !OUTPUT_ONLY.test(x));
17
+ });
18
+ }
19
+ /** What a simple command runs: its program and first word that isn't a flag (`npm run`, `git push`), env assignments off. */
20
+ function head(simple) {
21
+ const ws = words(simple).map((w) => unquote(w)).filter((w) => !/^[A-Za-z_]\w*=/.test(w));
22
+ const verb = ws.slice(1).find((w) => !w.startsWith('-'));
23
+ return ws.length ? `${ws[0]} ${verb ?? ''}` : '';
24
+ }
25
+ /** Whether `ran` did less than `step`: see the header. Reads only the simple commands running the step's own (program and verb). */
26
+ export function doesLess(step, ran) {
27
+ try {
28
+ const s = String(step ?? '').trim();
29
+ const r = String(ran ?? '').trim();
30
+ if (HIDES_FAILURE.test(r) && !HIDES_FAILURE.test(s))
31
+ return true;
32
+ const stepParts = simpleCommands(s);
33
+ const progs = new Set(stepParts.map(head).filter(Boolean));
34
+ const had = new Set(stepParts.flatMap(lessIn));
35
+ return simpleCommands(r).filter((x) => progs.has(head(x))).flatMap(lessIn).some((f) => !had.has(f));
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /** A call that can't be a step of its own for a fold: it hides its failure, or only rehearsed (`--dry-run`, `-n`). */
42
+ export function onlyRehearsed(ran) {
43
+ try {
44
+ const r = String(ran ?? '').trim();
45
+ return HIDES_FAILURE.test(r) || simpleCommands(r).flatMap(lessIn).some((f) => !/^--no-/i.test(f));
46
+ }
47
+ catch {
48
+ return false;
49
+ }
50
+ }
51
+ //# sourceMappingURL=ran-less.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ran-less.js","sourceRoot":"","sources":["../../src/skills/ran-less.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * What a fix may not teach (b2 review, D104): the lists a repair's delta is
3
+ * held to, beside 1a's `neverSave` and `gatedKind` (`risk.ts`). A delta, or
4
+ * moment 4's fix command, becomes a lesson an agent reads as "what fixed
5
+ * it", and an agent chose the command, so it may not carry a way around a
6
+ * check: no flag that skips a hook, forces, widens what may run, points at
7
+ * another registry or makes the command do less; no env var that carries a
8
+ * credential, runs code or turns off a check; no step that logs in, changes
9
+ * config for good or turns off a safety check; nothing that names Trail's,
10
+ * the host's or the shell's own files; nothing the reader can't see.
11
+ *
12
+ * Moved here from `trace/repairs.ts` so moment 4 (offer-lesson.ts) reads the
13
+ * same lists instead of a copy (D104). Not in `risk.ts`: that file is at its
14
+ * size limit and on the PreToolUse fast path, which needs none of this.
15
+ */
16
+ import type { FixDelta } from '../trace/types.js';
17
+ export declare const RISKY_FLAG: RegExp;
18
+ export declare const RISKY_ENV: RegExp;
19
+ export declare const RISKY_STEP: RegExp;
20
+ /** Git config set for one command (`git -c core.hooksPath=/dev/null push`). Case-sensitive: `git -C dir` is a directory. */
21
+ export declare const GIT_INLINE_CONFIG: RegExp;
22
+ export declare const OWN_FILES: RegExp;
23
+ export declare const UNSEEN: RegExp;
24
+ /** A delta that can't be a lesson, beyond `neverSave` and `gatedKind` (b2 review). A short-flag bundle (`-fq`) is read letter by letter. */
25
+ export declare function riskyDelta(d: Pick<FixDelta, 'kind' | 'name' | 'text'>): boolean;
26
+ /**
27
+ * Moment 4's fix command (4.14 step 3, D104): the whole command read as an enabling step, and each of its env
28
+ * assignments and flags read as a delta of its own, so `git push --no-verify origin v1.4.3` or `HUSKY=0 git push`
29
+ * never becomes "what fixed it". True: don't use it (the lesson is the phrase alone).
30
+ */
31
+ export declare function riskyCommand(cmd: string): boolean;
32
+ //# sourceMappingURL=risk-delta.d.ts.map