@nanonets/graft 0.23.1 → 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.
- package/README.md +4 -4
- package/dist/ai/crux.d.ts +31 -3
- package/dist/ai/crux.d.ts.map +1 -1
- package/dist/ai/crux.js +88 -10
- package/dist/ai/crux.js.map +1 -1
- package/dist/ai/llm/openai.d.ts +101 -0
- package/dist/ai/llm/openai.d.ts.map +1 -1
- package/dist/ai/llm/openai.js +396 -6
- package/dist/ai/llm/openai.js.map +1 -1
- package/dist/ai/llm/recover-tool.d.ts +2 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -1
- package/dist/ai/llm/recover-tool.js +1 -1
- package/dist/ai/llm/recover-tool.js.map +1 -1
- package/dist/ai/synthesize.d.ts.map +1 -1
- package/dist/ai/synthesize.js +100 -1
- package/dist/ai/synthesize.js.map +1 -1
- package/dist/claude/format.js +1 -1
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hooks.d.ts +0 -18
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +24 -77
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.js +3 -3
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/note-signals.d.ts +28 -0
- package/dist/claude/note-signals.d.ts.map +1 -0
- package/dist/claude/note-signals.js +325 -0
- package/dist/claude/note-signals.js.map +1 -0
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +10 -4
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +49 -18
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/state.d.ts +4 -3
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/sync-run.js +1 -1
- package/dist/claude/sync-run.js.map +1 -1
- package/dist/cli-picker.d.ts +12 -5
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +24 -8
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +131 -38
- package/dist/cli.js.map +1 -1
- package/dist/context/batches.d.ts +29 -0
- package/dist/context/batches.d.ts.map +1 -0
- package/dist/context/batches.js +130 -0
- package/dist/context/batches.js.map +1 -0
- package/dist/context/build.d.ts +7 -2
- package/dist/context/build.d.ts.map +1 -1
- package/dist/context/build.js +84 -50
- package/dist/context/build.js.map +1 -1
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +41 -4
- package/dist/context/node-file.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/graph/cards.d.ts.map +1 -1
- package/dist/graph/cards.js +9 -4
- package/dist/graph/cards.js.map +1 -1
- package/dist/graph/enrich.d.ts.map +1 -1
- package/dist/graph/enrich.js +8 -3
- package/dist/graph/enrich.js.map +1 -1
- package/dist/graph/generic.d.ts.map +1 -1
- package/dist/graph/generic.js +207 -6
- package/dist/graph/generic.js.map +1 -1
- package/dist/graph/lsp/client.d.ts +18 -0
- package/dist/graph/lsp/client.d.ts.map +1 -1
- package/dist/graph/lsp/client.js +40 -2
- package/dist/graph/lsp/client.js.map +1 -1
- package/dist/graph/lsp/enrich.d.ts.map +1 -1
- package/dist/graph/lsp/enrich.js +9 -1
- package/dist/graph/lsp/enrich.js.map +1 -1
- package/dist/graph/lsp/registry.d.ts +7 -0
- package/dist/graph/lsp/registry.d.ts.map +1 -1
- package/dist/graph/lsp/registry.js +27 -2
- package/dist/graph/lsp/registry.js.map +1 -1
- package/dist/graph/queries/gleam.scm +51 -0
- package/dist/graph/resolve.d.ts.map +1 -1
- package/dist/graph/resolve.js +65 -3
- package/dist/graph/resolve.js.map +1 -1
- package/dist/graph/workspace-cli.d.ts +2 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -1
- package/dist/graph/workspace-cli.js +1 -1
- package/dist/graph/workspace-cli.js.map +1 -1
- package/dist/notes/branches.d.ts +7 -1
- package/dist/notes/branches.d.ts.map +1 -1
- package/dist/notes/branches.js +31 -3
- package/dist/notes/branches.js.map +1 -1
- package/dist/notes/cold-start.d.ts +12 -2
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +46 -5
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/credit.d.ts +37 -0
- package/dist/notes/credit.d.ts.map +1 -0
- package/dist/notes/credit.js +78 -0
- package/dist/notes/credit.js.map +1 -0
- package/dist/notes/find-notes.d.ts +17 -0
- package/dist/notes/find-notes.d.ts.map +1 -0
- package/dist/notes/find-notes.js +48 -0
- package/dist/notes/find-notes.js.map +1 -0
- package/dist/notes/flatten.d.ts +31 -0
- package/dist/notes/flatten.d.ts.map +1 -0
- package/dist/notes/flatten.js +73 -0
- package/dist/notes/flatten.js.map +1 -0
- package/dist/notes/git-facts.d.ts +2 -0
- package/dist/notes/git-facts.d.ts.map +1 -1
- package/dist/notes/git-facts.js +6 -0
- package/dist/notes/git-facts.js.map +1 -1
- package/dist/notes/home.d.ts +24 -6
- package/dist/notes/home.d.ts.map +1 -1
- package/dist/notes/home.js +82 -15
- package/dist/notes/home.js.map +1 -1
- package/dist/notes/learning-fields.d.ts +102 -0
- package/dist/notes/learning-fields.d.ts.map +1 -0
- package/dist/notes/learning-fields.js +214 -0
- package/dist/notes/learning-fields.js.map +1 -0
- package/dist/notes/memory-notes.d.ts +71 -0
- package/dist/notes/memory-notes.d.ts.map +1 -0
- package/dist/notes/memory-notes.js +239 -0
- package/dist/notes/memory-notes.js.map +1 -0
- package/dist/notes/note-gate.d.ts +42 -0
- package/dist/notes/note-gate.d.ts.map +1 -0
- package/dist/notes/note-gate.js +181 -0
- package/dist/notes/note-gate.js.map +1 -0
- package/dist/notes/notes.d.ts +29 -85
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +69 -254
- package/dist/notes/notes.js.map +1 -1
- package/dist/notes/pr-reviews.d.ts +35 -7
- package/dist/notes/pr-reviews.d.ts.map +1 -1
- package/dist/notes/pr-reviews.js +156 -46
- package/dist/notes/pr-reviews.js.map +1 -1
- package/dist/notes/secrets.d.ts +28 -0
- package/dist/notes/secrets.d.ts.map +1 -0
- package/dist/notes/secrets.js +362 -0
- package/dist/notes/secrets.js.map +1 -0
- package/dist/notes/targets.d.ts +37 -0
- package/dist/notes/targets.d.ts.map +1 -0
- package/dist/notes/targets.js +108 -0
- package/dist/notes/targets.js.map +1 -0
- package/dist/notes/team-check.d.ts +22 -0
- package/dist/notes/team-check.d.ts.map +1 -0
- package/dist/notes/team-check.js +130 -0
- package/dist/notes/team-check.js.map +1 -0
- package/dist/notes/trail-home.d.ts +3 -0
- package/dist/notes/trail-home.d.ts.map +1 -0
- package/dist/notes/trail-home.js +12 -0
- package/dist/notes/trail-home.js.map +1 -0
- package/dist/skills/answers-prompt.d.ts +13 -0
- package/dist/skills/answers-prompt.d.ts.map +1 -0
- package/dist/skills/answers-prompt.js +83 -0
- package/dist/skills/answers-prompt.js.map +1 -0
- package/dist/skills/never-save.d.ts +5 -0
- package/dist/skills/never-save.d.ts.map +1 -0
- package/dist/skills/never-save.js +158 -0
- package/dist/skills/never-save.js.map +1 -0
- package/dist/skills/params.d.ts +39 -0
- package/dist/skills/params.d.ts.map +1 -0
- package/dist/skills/params.js +275 -0
- package/dist/skills/params.js.map +1 -0
- package/dist/skills/ran-less.d.ts +5 -0
- package/dist/skills/ran-less.d.ts.map +1 -0
- package/dist/skills/ran-less.js +51 -0
- package/dist/skills/ran-less.js.map +1 -0
- package/dist/skills/risk-delta.d.ts +32 -0
- package/dist/skills/risk-delta.d.ts.map +1 -0
- package/dist/skills/risk-delta.js +56 -0
- package/dist/skills/risk-delta.js.map +1 -0
- package/dist/skills/risk.d.ts +73 -0
- package/dist/skills/risk.d.ts.map +1 -0
- package/dist/skills/risk.js +396 -0
- package/dist/skills/risk.js.map +1 -0
- package/dist/skills/types.d.ts +422 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +8 -6
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/notice.d.ts.map +1 -1
- package/dist/telemetry/notice.js +3 -1
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/trace/check-reads.d.ts +36 -0
- package/dist/trace/check-reads.d.ts.map +1 -0
- package/dist/trace/check-reads.js +57 -0
- package/dist/trace/check-reads.js.map +1 -0
- package/dist/trace/host.d.ts +40 -0
- package/dist/trace/host.d.ts.map +1 -0
- package/dist/trace/host.js +84 -0
- package/dist/trace/host.js.map +1 -0
- package/dist/trace/redact.d.ts +8 -0
- package/dist/trace/redact.d.ts.map +1 -0
- package/dist/trace/redact.js +63 -0
- package/dist/trace/redact.js.map +1 -0
- package/dist/trace/seen-cache.d.ts +9 -0
- package/dist/trace/seen-cache.d.ts.map +1 -0
- package/dist/trace/seen-cache.js +46 -0
- package/dist/trace/seen-cache.js.map +1 -0
- package/dist/trace/shell-scan.d.ts +52 -0
- package/dist/trace/shell-scan.d.ts.map +1 -0
- package/dist/trace/shell-scan.js +318 -0
- package/dist/trace/shell-scan.js.map +1 -0
- package/dist/trace/shell-words.d.ts +91 -0
- package/dist/trace/shell-words.d.ts.map +1 -0
- package/dist/trace/shell-words.js +558 -0
- package/dist/trace/shell-words.js.map +1 -0
- package/dist/trace/shell.d.ts +91 -0
- package/dist/trace/shell.d.ts.map +1 -0
- package/dist/trace/shell.js +435 -0
- package/dist/trace/shell.js.map +1 -0
- package/dist/trace/state.d.ts +27 -0
- package/dist/trace/state.d.ts.map +1 -0
- package/dist/trace/state.js +98 -0
- package/dist/trace/state.js.map +1 -0
- package/dist/trace/tamper-code.d.ts +9 -0
- package/dist/trace/tamper-code.d.ts.map +1 -0
- package/dist/trace/tamper-code.js +174 -0
- package/dist/trace/tamper-code.js.map +1 -0
- package/dist/trace/tamper-git.d.ts +12 -0
- package/dist/trace/tamper-git.d.ts.map +1 -0
- package/dist/trace/tamper-git.js +77 -0
- package/dist/trace/tamper-git.js.map +1 -0
- package/dist/trace/types.d.ts +477 -0
- package/dist/trace/types.d.ts.map +1 -0
- package/dist/trace/types.js +12 -0
- package/dist/trace/types.js.map +1 -0
- package/dist/trace/walls-glob.d.ts +11 -0
- package/dist/trace/walls-glob.d.ts.map +1 -0
- package/dist/trace/walls-glob.js +264 -0
- package/dist/trace/walls-glob.js.map +1 -0
- package/dist/trace/walls-quoted.d.ts +25 -0
- package/dist/trace/walls-quoted.d.ts.map +1 -0
- package/dist/trace/walls-quoted.js +81 -0
- package/dist/trace/walls-quoted.js.map +1 -0
- package/dist/upkeep.d.ts +1 -1
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +4 -1
- package/dist/upkeep.js.map +1 -1
- package/dist/util/actions-folder.d.ts +2 -0
- package/dist/util/actions-folder.d.ts.map +1 -0
- package/dist/util/actions-folder.js +9 -0
- package/dist/util/actions-folder.js.map +1 -0
- package/dist/util/front-matter.d.ts +31 -4
- package/dist/util/front-matter.d.ts.map +1 -1
- package/dist/util/front-matter.js +95 -3
- package/dist/util/front-matter.js.map +1 -1
- package/dist/util/private-file.d.ts +14 -0
- package/dist/util/private-file.d.ts.map +1 -0
- package/dist/util/private-file.js +82 -0
- package/dist/util/private-file.js.map +1 -0
- package/dist/util/private-fs.d.ts +25 -0
- package/dist/util/private-fs.d.ts.map +1 -0
- package/dist/util/private-fs.js +253 -0
- package/dist/util/private-fs.js.map +1 -0
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +3 -0
- package/dist/util/state.js.map +1 -1
- package/dist/viewer/app.js +2 -2
- package/package.json +5 -5
- package/scripts/run-tests.mjs +14 -2
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-delta.d.ts","sourceRoot":"","sources":["../../src/skills/risk-delta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,eAAO,MAAM,UAAU,QAAqY,CAAC;AAC7Z,eAAO,MAAM,SAAS,QAA4jB,CAAC;AACnlB,eAAO,MAAM,UAAU,QAWN,CAAC;AAClB,4HAA4H;AAC5H,eAAO,MAAM,iBAAiB,QAAwD,CAAC;AACvF,eAAO,MAAM,SAAS,QAAqS,CAAC;AAC5T,eAAO,MAAM,MAAM,QAAgC,CAAC;AAEpD,4IAA4I;AAC5I,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAM/E;AAKD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWjD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ASSIGN, unquote, words } from '../trace/shell-scan.js';
|
|
2
|
+
export const RISKY_FLAG = /^(?:--no-verify|--no-gpg-sign|--no-sign|-n|-f|--force(?:-[\w-]+)?|--dangerously[\w-]*|--permission-mode|--allow(?:ed)?-?tools|--privileged|--cap-add|--security-opt|--registry|--index-url|--extra-index-url|--trusted-host|--otp|--insecure|-k|--no-check-certificate|--unsafe-perm|--allow-root|--dry-run|--help|-h|--version|-v|-short|--pass-?with-?no-?tests|--skip[\w-]*|--ignore[\w-]*)$/i;
|
|
3
|
+
export const RISKY_ENV = /^(?:PATH|HOME|SHELL|IFS|ENV|BASH_ENV|ZDOTDIR|PROMPT_COMMAND|EDITOR|VISUAL|PAGER|BROWSER|NODE_OPTIONS|NODE_PATH|PYTHONPATH|PYTHONSTARTUP|PYTHONHTTPSVERIFY|PERL5OPT|PERL5LIB|RUBYOPT|RUBYLIB|JAVA_TOOL_OPTIONS|_JAVA_OPTIONS|HUSKY|SKIP|NODE_TLS_REJECT_UNAUTHORIZED|NODE_EXTRA_CA_CERTS|SSL_CERT_FILE|SSL_CERT_DIR|REQUESTS_CA_BUNDLE|CURL_CA_BUNDLE|CLAUDECODE)$|^(?:LD_|DYLD_|XDG_|GIT_|SSH_|TRAIL_|GRAFT_|CLAUDE_|ANTHROPIC_|PRE_COMMIT|NPM_CONFIG_)|(?:^|_)(?:TOKEN|SECRET|PASS|PASSWORD|PASSWD|PASSPHRASE|API_?KEY|KEY|AUTH\w*|CREDENTIALS?|OTP|PRIVATE\w*|COOKIE|SESSION)(?:_|$)/i;
|
|
4
|
+
export const RISKY_STEP = new RegExp([
|
|
5
|
+
String.raw `\bgit\s+config\b[^;&|\n]{0,400}?(?:--global|--system|core\.hooksPath|safe\.directory|credential|\burl\.)`,
|
|
6
|
+
String.raw `\bgh\s+auth\s+(?:login|logout|refresh|setup-git|token|switch)\b`,
|
|
7
|
+
String.raw `\b(?:npm|pnpm|yarn)\b[^;&|\n]{0,200}?\s(?:login|logout|adduser|add-user|token)(?![\w:.-])`, String.raw `\b(?:npm|pnpm|yarn)\s+config\s+set\b`,
|
|
8
|
+
String.raw `\bclaude\s+(?:setup-token|login|logout|auth)\b`,
|
|
9
|
+
String.raw `\b(?:docker|podman|helm|vercel|netlify|fly(?:ctl)?|heroku|firebase|wrangler|az)\s+(?:registry\s+)?login\b`,
|
|
10
|
+
String.raw `\baws\s+(?:configure|sso\s+login)\b`, String.raw `\bgcloud\s+auth\b`,
|
|
11
|
+
String.raw `\bxattr\s+-[a-z]*[dc]`, String.raw `\b(?:spctl|csrutil|systemsetup|dscl|nvram|crontab|chown)\b`, String.raw `\bdefaults\s+write\b`,
|
|
12
|
+
String.raw `\blaunchctl\s+(?:load|bootstrap|enable|submit)\b`,
|
|
13
|
+
String.raw `(?:^|[\s;&|(='"])(?:/tmp/|/private/tmp/|/var/folders/|\$\{?TMPDIR\b)`,
|
|
14
|
+
String.raw `\bchmod\b[^;&|\n]{0,200}?(?:\s0?[0-7]{2}[2367](?=\s|$)|[\s,][ao]*\+[rwxXst]*w)`,
|
|
15
|
+
].join('|'), 'i');
|
|
16
|
+
/** Git config set for one command (`git -c core.hooksPath=/dev/null push`). Case-sensitive: `git -C dir` is a directory. */
|
|
17
|
+
export const GIT_INLINE_CONFIG = /\bgit\b[^;&|\n]{0,200}?\s(?:-c\s*\S|--config-env\b)/;
|
|
18
|
+
export const OWN_FILES = /(?:^|[\s='":@/])\.(?:trail|claude(?:\.json)?|codex|cursor|gemini|agents|mcp\.json|zshrc|zshenv|zprofile|zlogin|bashrc|bash_profile|bash_login|profile|gitconfig|ssh|npmrc|netrc|config\/(?:fish|gh|git))(?![\w-])|(?:^|[\s='":])\/etc\/|\b(?:CLAUDE|AGENTS|GEMINI)\.md\b|Library\/LaunchAgents\b/;
|
|
19
|
+
export const UNSEEN = /[\p{Cc}\p{Cf}\u2028\u2029]/u;
|
|
20
|
+
/** A delta that can't be a lesson, beyond `neverSave` and `gatedKind` (b2 review). A short-flag bundle (`-fq`) is read letter by letter. */
|
|
21
|
+
export function riskyDelta(d) {
|
|
22
|
+
if (UNSEEN.test(d.text) || OWN_FILES.test(d.text))
|
|
23
|
+
return true;
|
|
24
|
+
if ((d.kind === 'flag' || d.kind === 'env') && /\$\(|`|[<>]\(/.test(d.text))
|
|
25
|
+
return true; // a value that runs a command
|
|
26
|
+
if (d.kind === 'flag')
|
|
27
|
+
return RISKY_FLAG.test(d.name) || (/^-[a-z]{2,4}$/i.test(d.name) && /[nfkhv]/i.test(d.name));
|
|
28
|
+
if (d.kind === 'env')
|
|
29
|
+
return RISKY_ENV.test(d.name);
|
|
30
|
+
return d.kind === 'enable-step' && (RISKY_STEP.test(d.text) || GIT_INLINE_CONFIG.test(d.text));
|
|
31
|
+
}
|
|
32
|
+
/** Past this a command is not read word by word: it is not a lesson's fix anyway (4.14 step 3 keeps 300 at most). */
|
|
33
|
+
const WORDS_MAX = 4096;
|
|
34
|
+
/**
|
|
35
|
+
* Moment 4's fix command (4.14 step 3, D104): the whole command read as an enabling step, and each of its env
|
|
36
|
+
* assignments and flags read as a delta of its own, so `git push --no-verify origin v1.4.3` or `HUSKY=0 git push`
|
|
37
|
+
* never becomes "what fixed it". True: don't use it (the lesson is the phrase alone).
|
|
38
|
+
*/
|
|
39
|
+
export function riskyCommand(cmd) {
|
|
40
|
+
const text = String(cmd ?? '');
|
|
41
|
+
if (!text.trim() || text.length > WORDS_MAX)
|
|
42
|
+
return true;
|
|
43
|
+
if (riskyDelta({ kind: 'enable-step', name: '', text }))
|
|
44
|
+
return true;
|
|
45
|
+
if (/\$\(|`|[<>]\(/.test(text))
|
|
46
|
+
return true; // runs a command of its own
|
|
47
|
+
for (const raw of words(text)) {
|
|
48
|
+
const w = unquote(raw);
|
|
49
|
+
if (ASSIGN.test(raw) && riskyDelta({ kind: 'env', name: w.slice(0, w.indexOf('=')), text: w }))
|
|
50
|
+
return true;
|
|
51
|
+
if (w.length > 1 && w.startsWith('-') && w !== '--' && riskyDelta({ kind: 'flag', name: w.split('=')[0], text: w }))
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=risk-delta.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-delta.js","sourceRoot":"","sources":["../../src/skills/risk-delta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The risk lists (design 4.11, spec 10).
|
|
3
|
+
*
|
|
4
|
+
* Never save (never-save.ts, kept off the PreToolUse fast path): a command a
|
|
5
|
+
* skill may never hold, so a run with one gives no skill at all.
|
|
6
|
+
*
|
|
7
|
+
* Gated: a step that can't be undone (publish, push to prod or main, deploy,
|
|
8
|
+
* `gh pr merge`, migrations, `docker system prune`) or that logs in to a
|
|
9
|
+
* service (D93: `npm login`, `gh auth login`, `aws sso login`, ...). It stays
|
|
10
|
+
* in the skill, marked, and Claude Code asks the person right before it runs.
|
|
11
|
+
*
|
|
12
|
+
* The agent guard: commands only the person may run (turn skills or offers
|
|
13
|
+
* on, keep a held skill) and Trail's hook scripts run by hand, which would
|
|
14
|
+
* forge a hook payload. Turning things off is open to anyone.
|
|
15
|
+
*
|
|
16
|
+
* Agents wrap commands (`bash -c`, `env`, `xargs`, `find -exec`, `eval`,
|
|
17
|
+
* `{ }`, `if`, `for`), put flags anywhere (`git push origin main --force`,
|
|
18
|
+
* `npm --registry x publish`) and leave the branch implicit (`git push`), so
|
|
19
|
+
* the lists read the whole text, quotes included, and a target the skill
|
|
20
|
+
* can't know (a variable, a {param}, the current branch) counts as the risky
|
|
21
|
+
* one.
|
|
22
|
+
*
|
|
23
|
+
* The PreToolUse fast path imports this file: besides types it loads only
|
|
24
|
+
* `shell.ts`, which loads only its lexer.
|
|
25
|
+
*/
|
|
26
|
+
import type { GatedKind } from '../trace/types.js';
|
|
27
|
+
export declare const MAX_RUN_LINES = 12;
|
|
28
|
+
export declare const MAX_STEP_CHARS = 300;
|
|
29
|
+
/**
|
|
30
|
+
* The words after `from`, up to the end of that call. `until` is where the next match of the same program starts
|
|
31
|
+
* (callers pass it), so `git push git push …` reads each call once and the whole scan stays linear (g7 review).
|
|
32
|
+
*/
|
|
33
|
+
export declare function argsAfter(text: string, from: number, until?: number): string[];
|
|
34
|
+
/** Where a program word starts: not inside another word or path name (`/bin/rm` counts, `git-rm` doesn't). */
|
|
35
|
+
export declare const word: (name: string) => RegExp;
|
|
36
|
+
/** One `git push`: forced or not, where it went (`<current>` for the checked-out branch, `<unknown>` for a variable or {param}, `<all>`), and from what. */
|
|
37
|
+
export interface Push {
|
|
38
|
+
force: boolean;
|
|
39
|
+
dsts: string[];
|
|
40
|
+
srcs: string[];
|
|
41
|
+
}
|
|
42
|
+
export declare function pushes(text: string): Push[];
|
|
43
|
+
export declare const unknownDst: (d: string) => boolean;
|
|
44
|
+
/** A value written out in the command, not read from a variable or a {param} (`$PW`, `"${PW:?set PW}"`, `{password}`, `<pw>`). */
|
|
45
|
+
export declare const written: (v: string) => boolean;
|
|
46
|
+
/** Every gated kind whose pattern appears anywhere in `cmd`, dry run or not: linear, for a command too long to split (3.3). */
|
|
47
|
+
export declare function gatedAnywhere(cmd: string): Set<GatedKind>;
|
|
48
|
+
export declare function gatedKind(cmd: string): GatedKind | null;
|
|
49
|
+
/** D116 item 5: the login a command runs, as the person would type it (flags dropped), and the service; null when none. */
|
|
50
|
+
export declare function loginOf(cmd: string): {
|
|
51
|
+
service: string;
|
|
52
|
+
login: string;
|
|
53
|
+
} | null;
|
|
54
|
+
/** "publishes 0.22.1 to npm", "moves prod to 4e1c9a2", ... (4.11). */
|
|
55
|
+
export declare function gatedWhat(kind: GatedKind, cmd: string, values: Record<string, string>): string;
|
|
56
|
+
/** Consecutive steps of one gated kind form one group; one host ask covers a group (3.3). */
|
|
57
|
+
export declare function gatedGroups(steps: Array<{
|
|
58
|
+
n: number;
|
|
59
|
+
gated: GatedKind | null;
|
|
60
|
+
}>): Array<{
|
|
61
|
+
kind: GatedKind;
|
|
62
|
+
steps: number[];
|
|
63
|
+
}>;
|
|
64
|
+
/** Phase 2 (P28): `restore-version`, an older version of a skill brought back. */
|
|
65
|
+
export type GuardHit = 'skills-on' | 'offers-on' | 'keep-held' | 'hook-script' | 'restore-version';
|
|
66
|
+
/** The words the shell runs: quotes and backslashes don't change them, and a line continuation joins with nothing. */
|
|
67
|
+
export declare function shellWords(cmd: string): string;
|
|
68
|
+
/** 4.11 agent guard: commands only the person may run, and Trail's hook scripts run by hand. Linear in the command. */
|
|
69
|
+
export declare function agentGuard(cmd: string): {
|
|
70
|
+
hit: GuardHit;
|
|
71
|
+
reason: string;
|
|
72
|
+
} | null;
|
|
73
|
+
//# sourceMappingURL=risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.d.ts","sourceRoot":"","sources":["../../src/skills/risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,cAAc,MAAM,CAAC;AAMlC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAc,GAAG,MAAM,EAAE,CAKnF;AACD,8GAA8G;AAC9G,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,WAA4E,CAAC;AAK9G,4JAA4J;AAC5J,MAAM,WAAW,IAAI;IAAG,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE;AAExE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,CAqC3C;AACD,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,YAAsB,CAAC;AAG3D,kIAAkI;AAClI,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,YAGhC,CAAC;AA2CF,+HAA+H;AAC/H,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAGzD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMvD;AAaD,2HAA2H;AAC3H,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAK9E;AAED,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAmC9F;AAED,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAS7H;AAED,kFAAkF;AAClF,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,iBAAiB,CAAC;AA8EnG,sHAAsH;AACtH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAc9C;AA+ED,uHAAuH;AACvH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAYhF"}
|