@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.
- 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.d.ts +21 -0
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +46 -1
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hooks.d.ts +5 -9
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +71 -58
- 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 +17 -6
- 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 +149 -43
- 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/init-guard.d.ts +11 -0
- package/dist/init-guard.d.ts.map +1 -0
- package/dist/init-guard.js +21 -0
- package/dist/init-guard.js.map +1 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +2 -1
- package/dist/mcp/tools.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 +7 -1
- package/dist/notes/git-facts.d.ts.map +1 -1
- package/dist/notes/git-facts.js +12 -2
- 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 -77
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +69 -228
- 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/session-cost.d.ts +2 -0
- package/dist/notes/session-cost.d.ts.map +1 -1
- package/dist/notes/session-cost.js +8 -3
- package/dist/notes/session-cost.js.map +1 -1
- 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/search/grep-cli.d.ts +5 -2
- package/dist/search/grep-cli.d.ts.map +1 -1
- package/dist/search/grep-cli.js +11 -4
- package/dist/search/grep-cli.js.map +1 -1
- package/dist/search/ignored-code.d.ts +9 -0
- package/dist/search/ignored-code.d.ts.map +1 -0
- package/dist/search/ignored-code.js +73 -0
- package/dist/search/ignored-code.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 @@
|
|
|
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":"AAgBA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAEhE,MAAM,CAAC,MAAM,UAAU,GAAG,kYAAkY,CAAC;AAC7Z,MAAM,CAAC,MAAM,SAAS,GAAG,yjBAAyjB,CAAC;AACnlB,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC;IACnC,MAAM,CAAC,GAAG,CAAA,0GAA0G;IACpH,MAAM,CAAC,GAAG,CAAA,iEAAiE;IAC3E,MAAM,CAAC,GAAG,CAAA,2FAA2F,EAAE,MAAM,CAAC,GAAG,CAAA,sCAAsC;IACvJ,MAAM,CAAC,GAAG,CAAA,gDAAgD;IAC1D,MAAM,CAAC,GAAG,CAAA,2GAA2G;IACrH,MAAM,CAAC,GAAG,CAAA,qCAAqC,EAAE,MAAM,CAAC,GAAG,CAAA,mBAAmB;IAC9E,MAAM,CAAC,GAAG,CAAA,uBAAuB,EAAE,MAAM,CAAC,GAAG,CAAA,4DAA4D,EAAE,MAAM,CAAC,GAAG,CAAA,sBAAsB;IAC3I,MAAM,CAAC,GAAG,CAAA,kDAAkD;IAC5D,MAAM,CAAC,GAAG,CAAA,sEAAsE;IAChF,MAAM,CAAC,GAAG,CAAA,gFAAgF;CAC3F,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAClB,4HAA4H;AAC5H,MAAM,CAAC,MAAM,iBAAiB,GAAG,qDAAqD,CAAC;AACvF,MAAM,CAAC,MAAM,SAAS,GAAG,kSAAkS,CAAC;AAC5T,MAAM,CAAC,MAAM,MAAM,GAAG,6BAA6B,CAAC;AAEpD,4IAA4I;AAC5I,MAAM,UAAU,UAAU,CAAC,CAA2C;IACpE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,8BAA8B;IACxH,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACpH,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,qHAAqH;AACrH,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,4BAA4B;IACzE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5G,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;IACpI,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { hookUnrun, quotedTextHit, simpleCommands } from '../trace/shell.js';
|
|
2
|
+
export const MAX_RUN_LINES = 12;
|
|
3
|
+
export const MAX_STEP_CHARS = 300;
|
|
4
|
+
/** The words after a program, to the end of its command (an unquoted-looking `;`, `&`, `|`, `)`, newline or backtick), quotes dropped. */
|
|
5
|
+
/** How far past a program word its arguments are read: a call's own arguments, never the rest of a 2 MB command. */
|
|
6
|
+
const ARGS_MAX = 4096;
|
|
7
|
+
/**
|
|
8
|
+
* The words after `from`, up to the end of that call. `until` is where the next match of the same program starts
|
|
9
|
+
* (callers pass it), so `git push git push …` reads each call once and the whole scan stays linear (g7 review).
|
|
10
|
+
*/
|
|
11
|
+
export function argsAfter(text, from, until = text.length) {
|
|
12
|
+
// `$(git rev-parse HEAD)` is one word to the shell, not the end of the command.
|
|
13
|
+
const rest = text.slice(from, Math.min(until, from + ARGS_MAX)).replace(/\$\([^()]*\)/g, '$X');
|
|
14
|
+
const end = rest.search(/[;&|)\n`]/);
|
|
15
|
+
return (end < 0 ? rest : rest.slice(0, end)).split(/\s+/).map((w) => w.replace(/^['"]+|['"]+$/g, '')).filter(Boolean);
|
|
16
|
+
}
|
|
17
|
+
/** Where a program word starts: not inside another word or path name (`/bin/rm` counts, `git-rm` doesn't). */
|
|
18
|
+
export const word = (name) => new RegExp(String.raw `(?<![\w./-])(?:[\w./-]*\/)?${name}(?=\s|$)`, 'g');
|
|
19
|
+
const PROD = new Set(['main', 'master', 'prod', 'production']);
|
|
20
|
+
const GIT_PUSH = /(?<![\w./-])(?:[\w./-]*\/)?git((?:\s+(?:-C|-c|--git-dir|--work-tree|--namespace)\s+\S+|\s+(?!(?:-C|-c|--git-dir|--work-tree|--namespace)\s)-[\w-]+(?:=\S+)?)*)\s+push(?=\s|$|[;&|)'"])/g;
|
|
21
|
+
export function pushes(text) {
|
|
22
|
+
const out = [];
|
|
23
|
+
const calls = [...text.matchAll(GIT_PUSH)];
|
|
24
|
+
for (const [i, m] of calls.entries()) {
|
|
25
|
+
const words = argsAfter(text, m.index + m[0].length, calls[i + 1]?.index);
|
|
26
|
+
let force = false;
|
|
27
|
+
let all = false;
|
|
28
|
+
let tags = false;
|
|
29
|
+
let flagsDone = false;
|
|
30
|
+
const pos = [];
|
|
31
|
+
for (let i = 0; i < words.length; i++) {
|
|
32
|
+
const w = words[i];
|
|
33
|
+
if (!flagsDone && w === '--')
|
|
34
|
+
flagsDone = true;
|
|
35
|
+
else if (flagsDone || !w.startsWith('-'))
|
|
36
|
+
pos.push(w);
|
|
37
|
+
else if (/^--force(?:-with-lease)?(?:=.*)?$/.test(w) || /^-[a-zA-Z]*f[a-zA-Z]*$/.test(w))
|
|
38
|
+
force = true;
|
|
39
|
+
else if (w === '--mirror')
|
|
40
|
+
force = all = true;
|
|
41
|
+
else if (w === '--all' || w === '--branches')
|
|
42
|
+
all = true;
|
|
43
|
+
else if (w === '--tags')
|
|
44
|
+
tags = true;
|
|
45
|
+
else if (/^(?:-o|--push-option|--repo|--receive-pack|--exec)$/.test(w))
|
|
46
|
+
i++;
|
|
47
|
+
}
|
|
48
|
+
const refspecs = pos.slice(1);
|
|
49
|
+
const dsts = [];
|
|
50
|
+
const srcs = [];
|
|
51
|
+
for (const r of refspecs) {
|
|
52
|
+
if (r.startsWith('+'))
|
|
53
|
+
force = true;
|
|
54
|
+
const x = r.replace(/^\+/, '');
|
|
55
|
+
const colon = x.lastIndexOf(':');
|
|
56
|
+
const src = colon < 0 ? x : x.slice(0, colon);
|
|
57
|
+
const dst = (colon < 0 ? x : x.slice(colon + 1)).replace(/^refs\/heads\//, '');
|
|
58
|
+
srcs.push(src);
|
|
59
|
+
dsts.push(dst === 'HEAD' || dst === '@' ? '<current>' : /[$`{}]/.test(dst) || !dst ? '<unknown>' : dst);
|
|
60
|
+
}
|
|
61
|
+
if (all)
|
|
62
|
+
dsts.push('<all>');
|
|
63
|
+
else if (!refspecs.length && !tags)
|
|
64
|
+
dsts.push('<current>');
|
|
65
|
+
out.push({ force, dsts, srcs });
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
export const unknownDst = (d) => d.startsWith('<');
|
|
70
|
+
const pushProd = (c) => pushes(c).some((p) => p.dsts.some((d) => PROD.has(d.toLowerCase()) || unknownDst(d)));
|
|
71
|
+
/** A value written out in the command, not read from a variable or a {param} (`$PW`, `"${PW:?set PW}"`, `{password}`, `<pw>`). */
|
|
72
|
+
export const written = (v) => {
|
|
73
|
+
const u = v.replace(/^['"]+|['"]+$/g, '');
|
|
74
|
+
return u.length >= 4 && !/^\$|^\{[A-Za-z_]\w*\}$|^<[^>]*>$|^\*+$|^-/.test(u);
|
|
75
|
+
};
|
|
76
|
+
/** The end of a branch name: not more of a name (`main-fix`, `main/x`, `main.old`). */
|
|
77
|
+
const SEP_END = String.raw `(?![\w:-])`;
|
|
78
|
+
/**
|
|
79
|
+
* The gated patterns, built once (they ran on every call: a 2 MB command split into pieces built them per piece). Every
|
|
80
|
+
* span inside a call is bounded, and migrate's flags can't be read two ways, so no command makes them backtrack (g7 review).
|
|
81
|
+
*/
|
|
82
|
+
const PUBLISH_RE = new RegExp(String.raw `\b(?:npm|pnpm|yarn|bun)\b(?:\s+[^\s;&|]+){0,12}?\s+(?:publish|pub)(?![\w:.-])|\b(?:changeset|lerna)\s+publish\b|\bnpx\s+np(?![\w-])|\b(?:poetry|uv|flit|hatch|deno|jsr|vsce|ovsx)\s+publish\b|\bcargo\s+publish\b|\btwine\s+upload\b|\bgem\s+push\b|\b(?:docker|podman)\s+(?:image\s+)?push\b|\bdocker\s+buildx\s+build\b[^;&|\n]{0,300}\s--push\b|\bdotnet\s+nuget\s+push\b|\bpod\s+trunk\s+push\b|\b(?:flutter|dart)\s+pub\s+publish\b|\bmix\s+hex\.publish\b|\bmvn\b[^;&|\n]{0,300}\sdeploy\b|\bgradlew?\b[^;&|\n]{0,300}\spublish\w*\b`, 'i');
|
|
83
|
+
const DEPLOY_RE = new RegExp(String.raw `\bvercel\b[^;&|\n]{0,300}\s--prod\b|\bvercel\s+(?:deploy|promote|rollback)\b|\bvercel\s+alias\s+set\b|\bnetlify(?:-cli)?\s+deploy\b[^;&|\n]{0,300}\s--prod\b|\bfly(?:ctl)?\s+deploy\b|\bkubectl\b[^;&|\n]{0,300}?\s(?:apply|create|replace|patch|delete|scale|set|edit|rollout\s+(?:restart|undo))(?![\w-])|\bhelm\b[^;&|\n]{0,300}?\s(?:upgrade|install|uninstall|rollback|delete)(?![\w-])|\b(?:terraform|tofu)\b(?:\s+-chdir=\S+)?\s+(?:apply|destroy)\b|\bwrangler\b[^;&|\n]{0,300}\s(?:deploy|publish)\b|\bgcloud\b[^;&|\n]{0,300}\sdeploy\b|\b(?:serverless|sls|cdk|sam)\s+deploy\b|\bpulumi\s+up\b|\bfirebase\s+deploy\b|\brailway\s+up\b|\bheroku\s+(?:releases:rollback|container:release)\b|\b(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?deploy(?:[:-]prod(?:uction)?)?${SEP_END}|\bmake\s+deploy(?:-prod(?:uction)?)?${SEP_END}`, 'i');
|
|
84
|
+
const MIGRATE_RE = new RegExp(String.raw `\bprisma\s+(?:migrate\s+deploy|db\s+push)\b|\bsupabase\s+(?:db\s+push|migration\s+up)\b|\bknex\s+migrate:latest\b|\balembic\s+upgrade\b|\bdb:migrate\b|\bmanage\.py\s+migrate\b|\becto\.migrate\b|\bflyway\s+migrate\b|\bliquibase\s+update\b|\bdbmate\s+(?:up|migrate)\b|\bdrizzle-kit\s+(?:push|migrate)\b|\bgoose\b[^;&|\n]{0,300}\sup\b|\batlas\s+migrate\s+apply\b|(?:^|[\s/])migrat\w*(?:\s+-{1,2}\w[\w-]*(?:=\S+|\s+(?!-)(?!(?:up|deploy|apply|run)\b)\S+)?){0,16}\s+(?:up|deploy|apply|run)\b|\b(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:db:)?migrat\w*(?::(?:up|deploy|prod|latest))?${SEP_END}`, 'i');
|
|
85
|
+
/**
|
|
86
|
+
* D93: logging in to a service, wherever it sits in the call (`script -q /dev/null npm login`, `env … npm login`,
|
|
87
|
+
* `npx vercel login`). Flags before npm's command are read only as `--flag` or `--flag=value` (a value after a space
|
|
88
|
+
* would let every word be either, which costs a second on 2 MB of `npm --a `); aws's flags take a value either way,
|
|
89
|
+
* a flag word starting with `-` and a value not. Every span is bounded.
|
|
90
|
+
*/
|
|
91
|
+
const LOGIN_RE = new RegExp([
|
|
92
|
+
String.raw `\b(?:npm|pnpm)(?:\s+-{1,2}[\w-]{1,64}(?:=[^\s;&|]{0,256})?){0,6}\s+(?:login|adduser|add-user)(?![\w:.-])`,
|
|
93
|
+
String.raw `\byarn(?:\s+npm)?\s+login(?![\w:.-])`,
|
|
94
|
+
String.raw `\bgh\s+auth\s+login\b`,
|
|
95
|
+
String.raw `\bvercel\s+login\b`,
|
|
96
|
+
String.raw `\b(?:docker|podman)\s+login\b`,
|
|
97
|
+
String.raw `\baws(?:\s+--[\w-]{1,64}(?:=[^\s;&|]{0,256}|\s+(?!-)[^\s;&|]{1,256})?){0,6}\s+(?:configure(?![\w-])(?!\s+(?:get|list|list-profiles|export-credentials)\b)|sso\s+login\b)`,
|
|
98
|
+
String.raw `\bgcloud\s+auth\s+(?:application-default\s+)?login\b`,
|
|
99
|
+
String.raw `\bfirebase(?:-tools)?\s+login\b`,
|
|
100
|
+
String.raw `\bheroku\s+(?:auth:)?login\b`,
|
|
101
|
+
String.raw `\baz\s+login\b`,
|
|
102
|
+
].join('|'), 'i');
|
|
103
|
+
const GATED = [
|
|
104
|
+
['publish', (c) => PUBLISH_RE.test(c)],
|
|
105
|
+
['push-prod', pushProd],
|
|
106
|
+
['deploy', (c) => DEPLOY_RE.test(c)],
|
|
107
|
+
['merge', (c) => /\bgh\s+pr\s+merge\b|\bglab\s+mr\s+merge\b/i.test(c)
|
|
108
|
+
|| (/\bgh\s+api\b/i.test(c) && /(?:-X|--method)[\s=]+(?:PUT|POST)\b/i.test(c) && /\/pulls\/[^/\s'"]+\/merge\b|\/merges\b/i.test(c))],
|
|
109
|
+
['migrate', (c) => MIGRATE_RE.test(c)],
|
|
110
|
+
['prune', (c) => /\b(?:docker|podman)\s+(?:system|volume|image|container)\s+prune\b|\b(?:docker|podman)\s+volume\s+rm\b/i.test(c)],
|
|
111
|
+
['login', (c) => LOGIN_RE.test(c)],
|
|
112
|
+
];
|
|
113
|
+
/** `--dry-run`, `--dry-run=client`: changes nothing. `--dry-run=false` and kubectl's `--dry-run=none` do. */
|
|
114
|
+
const DRY = /(?:^|\s)--dry-run(?:=(?!(?:false|0|none)\b)\S+)?(?=\s|$|[;&|)])/;
|
|
115
|
+
/** Every gated kind whose pattern appears anywhere in `cmd`, dry run or not: linear, for a command too long to split (3.3). */
|
|
116
|
+
export function gatedAnywhere(cmd) {
|
|
117
|
+
const c = String(cmd ?? '');
|
|
118
|
+
return new Set(GATED.filter(([, hit]) => hit(c)).map(([kind]) => kind));
|
|
119
|
+
}
|
|
120
|
+
export function gatedKind(cmd) {
|
|
121
|
+
const c = String(cmd ?? '');
|
|
122
|
+
// A dry run changes nothing: only the commands without one count.
|
|
123
|
+
const parts = DRY.test(c) ? simpleCommands(c).filter((x) => !DRY.test(x)) : [c];
|
|
124
|
+
for (const p of parts)
|
|
125
|
+
for (const [kind, hit] of GATED)
|
|
126
|
+
if (hit(p))
|
|
127
|
+
return kind;
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const REGISTRY = [
|
|
131
|
+
[/\bcargo\s+publish\b/i, 'crates.io'], [/\btwine\s+upload\b|\b(?:poetry|uv|flit|hatch)\s+publish\b/i, 'PyPI'], [/\bgem\s+push\b/i, 'RubyGems'],
|
|
132
|
+
[/\b(?:docker|podman)\b/i, 'the image registry'], [/\b(?:vsce|ovsx)\s+publish\b/i, 'the extension marketplace'],
|
|
133
|
+
];
|
|
134
|
+
const SHA = /^[0-9a-f]{7,40}$/;
|
|
135
|
+
/** Which service a login step logs in to, for its ask. */
|
|
136
|
+
const LOGIN_TO = [
|
|
137
|
+
[/\b(?:npm|pnpm|yarn)\b/i, 'npm'], [/\bgh\s+auth\b/i, 'GitHub'], [/\bvercel\b/i, 'Vercel'], [/\b(?:docker|podman)\s+login\b/i, 'the image registry'],
|
|
138
|
+
[/\baws\b/i, 'AWS'], [/\bgcloud\b/i, 'Google Cloud'], [/\bfirebase/i, 'Firebase'], [/\bheroku\b/i, 'Heroku'], [/\baz\s+login\b/i, 'Azure'],
|
|
139
|
+
];
|
|
140
|
+
/** D116 item 5: the login a command runs, as the person would type it (flags dropped), and the service; null when none. */
|
|
141
|
+
export function loginOf(cmd) {
|
|
142
|
+
const m = LOGIN_RE.exec(String(cmd ?? ''));
|
|
143
|
+
if (!m)
|
|
144
|
+
return null;
|
|
145
|
+
const login = m[0].replace(/\s+-{1,2}[\w-]+(?:=\S*)?/g, '').replace(/\s+/g, ' ').trim().toLowerCase();
|
|
146
|
+
return { service: LOGIN_TO.find(([re]) => re.test(m[0]))?.[1] ?? 'the service', login };
|
|
147
|
+
}
|
|
148
|
+
/** "publishes 0.22.1 to npm", "moves prod to 4e1c9a2", ... (4.11). */
|
|
149
|
+
export function gatedWhat(kind, cmd, values) {
|
|
150
|
+
// A value worked out when it runs (`$(git rev-parse HEAD)`) reads as a variable.
|
|
151
|
+
const fill = (t) => t.replace(/\{([A-Za-z_]\w*)\}/g, (m, k) => (values[k] === undefined ? m : /[$`]/.test(values[k]) ? '$X' : values[k]));
|
|
152
|
+
const c = fill(String(cmd ?? ''));
|
|
153
|
+
if (kind === 'publish') {
|
|
154
|
+
const where = REGISTRY.find(([re]) => re.test(c))?.[1] ?? 'npm';
|
|
155
|
+
const v = values.version;
|
|
156
|
+
return `publishes ${v && !v.includes('$') ? v : 'a new version'} to ${where}`;
|
|
157
|
+
}
|
|
158
|
+
if (kind === 'push-prod') {
|
|
159
|
+
for (const p of pushes(c)) {
|
|
160
|
+
const i = p.dsts.findIndex((d) => PROD.has(d.toLowerCase()));
|
|
161
|
+
if (i >= 0) {
|
|
162
|
+
const src = p.srcs[i] ?? '';
|
|
163
|
+
const to = SHA.test(src) ? src.slice(0, 7) : !src || /[$`{}]/.test(src) || src === 'HEAD' || src === p.dsts[i] ? 'HEAD' : src;
|
|
164
|
+
return `moves ${p.dsts[i]} to ${to}`;
|
|
165
|
+
}
|
|
166
|
+
if (p.dsts.includes('<all>'))
|
|
167
|
+
return 'pushes every branch';
|
|
168
|
+
if (p.dsts.includes('<current>'))
|
|
169
|
+
return 'pushes the current branch';
|
|
170
|
+
if (p.dsts.includes('<unknown>'))
|
|
171
|
+
return 'pushes to a branch named when it runs';
|
|
172
|
+
}
|
|
173
|
+
// A branch the skill fills in when it runs: not a branch name to show.
|
|
174
|
+
if (c !== String(cmd ?? '') && pushes(String(cmd).replace(/\{[A-Za-z_]\w*\}/g, '$X')).some((p) => p.dsts.includes('<unknown>'))) {
|
|
175
|
+
return 'pushes to a branch named when it runs';
|
|
176
|
+
}
|
|
177
|
+
return 'moves prod';
|
|
178
|
+
}
|
|
179
|
+
if (kind === 'deploy')
|
|
180
|
+
return 'deploys to production';
|
|
181
|
+
if (kind === 'merge') {
|
|
182
|
+
const pr = values.pr ?? /\bmerge\s+#?(\d+)\b|\/pulls\/(\d+)\/merge\b/.exec(c)?.slice(1).find(Boolean);
|
|
183
|
+
return pr && /^\d+$/.test(pr) ? `merges PR #${pr}` : 'merges a PR';
|
|
184
|
+
}
|
|
185
|
+
if (kind === 'migrate')
|
|
186
|
+
return 'runs a database migration';
|
|
187
|
+
if (kind === 'login')
|
|
188
|
+
return `logs in to ${LOGIN_TO.find(([re]) => re.test(c))?.[1] ?? 'a service'}`;
|
|
189
|
+
return 'deletes unused Docker data';
|
|
190
|
+
}
|
|
191
|
+
/** Consecutive steps of one gated kind form one group; one host ask covers a group (3.3). */
|
|
192
|
+
export function gatedGroups(steps) {
|
|
193
|
+
const out = [];
|
|
194
|
+
let prev = null;
|
|
195
|
+
for (const s of steps) {
|
|
196
|
+
if (s.gated && s.gated === prev)
|
|
197
|
+
out[out.length - 1].steps.push(s.n);
|
|
198
|
+
else if (s.gated)
|
|
199
|
+
out.push({ kind: s.gated, steps: [s.n] });
|
|
200
|
+
prev = s.gated;
|
|
201
|
+
}
|
|
202
|
+
return out;
|
|
203
|
+
}
|
|
204
|
+
/** A Trail program word anywhere in the call: named, through a package, an alias or a variable (`t=trail`). */
|
|
205
|
+
const TRAIL_WORD = /(?<![\w./-])(?:trail|graft|trail-code)(?![\w./-])|@trailhq\/trail-code\b|@nanonets\/graft\b|\bbin\/(?:trail|graft)\.js\b/i;
|
|
206
|
+
/**
|
|
207
|
+
* Flags between `skills` and the switch. Bounded, like every quantifier below: the guard reads commands of up to
|
|
208
|
+
* 2 MB on the 5 s PreToolUse budget, after which Claude Code runs the command anyway (g7 review).
|
|
209
|
+
*/
|
|
210
|
+
const FL = String.raw `(?:-[^\s]{1,64}\s+){0,8}`;
|
|
211
|
+
const REASONS = {
|
|
212
|
+
'offers-on': 'Only the person turns skill offers on, in their own terminal: trail skills offers on. Tell the person; don\'t run it for them.',
|
|
213
|
+
'skills-on': 'Only the person turns skills on, in their own terminal: trail skills on. Tell the person; don\'t run it for them.',
|
|
214
|
+
'keep-held': 'Keeping a held skill is the person\'s yes, so only the person runs trail skills keep, in their own terminal. Tell the person; don\'t run it for them.',
|
|
215
|
+
'hook-script': 'Trail\'s hook scripts run only from the host\'s hooks, never by hand. If something about Trail looks wrong, tell the person.',
|
|
216
|
+
'restore-version': 'Only the person brings back an older version of a skill, in their own terminal: trail skills restore {name} --version {n}. Tell the person; don\'t run it for them.',
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* The person-only switches after `skills`, whatever runs them: a Trail binary, a renamed or copied one
|
|
220
|
+
* (`node /tmp/t.js skills on`), an alias or a variable (`T=trail; $T skills on`). Printing them is denied too.
|
|
221
|
+
*/
|
|
222
|
+
const SWITCH = [
|
|
223
|
+
['offers-on', new RegExp(String.raw `\bskills\s+${FL}offers\s+${FL}on\b`, 'i')],
|
|
224
|
+
['skills-on', new RegExp(String.raw `\bskills\s+${FL}on\b`, 'i')],
|
|
225
|
+
['keep-held', new RegExp(String.raw `\bskills\s+${FL}keep\b`, 'i')],
|
|
226
|
+
];
|
|
227
|
+
/** With a Trail word in the call: the switch not written out (`trail skills $x`, `trail skills $(echo on)`). */
|
|
228
|
+
const DYNAMIC_SWITCH = [
|
|
229
|
+
['offers-on', new RegExp(String.raw `\bskills\s+${FL}offers\s+${FL}[$\x60]`, 'i')],
|
|
230
|
+
['skills-on', new RegExp(String.raw `\bskills\s+${FL}[$\x60]`, 'i')],
|
|
231
|
+
];
|
|
232
|
+
/** With a Trail word in the call: the word `skills` not written out (`trail $s on`, `trail $(echo skills) on`). */
|
|
233
|
+
const AFTER = String.raw `\s+${FL}(?:(offers)\s+${FL}on|(on)|(keep))\b`;
|
|
234
|
+
const DYNAMIC_WORD = [
|
|
235
|
+
[/\$\w/, new RegExp(String.raw `\$\w{1,64}${AFTER}`, 'i')],
|
|
236
|
+
[/\$\{/, new RegExp(String.raw `\}${AFTER}`, 'i')],
|
|
237
|
+
[/\$\(/, new RegExp(String.raw `\)${AFTER}`, 'i')],
|
|
238
|
+
[/\x60/, new RegExp(String.raw `\x60${AFTER}`, 'i')],
|
|
239
|
+
];
|
|
240
|
+
/** xargs or parallel supplying the switch from stdin: `skills` ends the call or a placeholder follows it. */
|
|
241
|
+
const XARGS = /\b(?:xargs|parallel)\b/i;
|
|
242
|
+
const XARGS_SKILLS = /\bskills(?:\s+-[^\s]{1,64}){0,8}\s*(?:$|\{\}|%)/i;
|
|
243
|
+
/**
|
|
244
|
+
* P28: `skills restore <name> --version <n>`, read per command (split on `; & | newline`, one pass, so a flag
|
|
245
|
+
* any distance after the verb is found and a 2 MB command stays linear). With a Trail word in the call, also the
|
|
246
|
+
* forms that don't write it out: the flag or the verb from a variable or a substitution, or `skills` itself.
|
|
247
|
+
*/
|
|
248
|
+
const RESTORE_AT = new RegExp(String.raw `\bskills\s+${FL}restore\b`, 'i');
|
|
249
|
+
const RESTORE_SKILLS_DYNAMIC = new RegExp(String.raw `\bskills\s+${FL}[$\x60]`, 'i');
|
|
250
|
+
const RESTORE_WORD_DYNAMIC = new RegExp(String.raw `(?:\$\w{1,64}|[})\x60])\s+${FL}restore\b`, 'i');
|
|
251
|
+
const VERSION_FLAG = /(?<![\w-])--version(?![\w-])/;
|
|
252
|
+
function restoreVersionIn(c, trailWord) {
|
|
253
|
+
if (!/restore|--version/i.test(c))
|
|
254
|
+
return false;
|
|
255
|
+
for (const seg of c.split(/[;&|\n]/)) {
|
|
256
|
+
const m = RESTORE_AT.exec(seg);
|
|
257
|
+
const rest = m ? seg.slice(m.index + m[0].length) : '';
|
|
258
|
+
if (m && VERSION_FLAG.test(rest))
|
|
259
|
+
return true;
|
|
260
|
+
if (!trailWord)
|
|
261
|
+
continue;
|
|
262
|
+
if (m && /[$\x60]/.test(rest))
|
|
263
|
+
return true;
|
|
264
|
+
if (VERSION_FLAG.test(seg) && (RESTORE_SKILLS_DYNAMIC.test(seg) || RESTORE_WORD_DYNAMIC.test(seg)))
|
|
265
|
+
return true;
|
|
266
|
+
}
|
|
267
|
+
return false;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Trail's hook scripts and hook modules: the shims by name or by a glob (`t*-hooks.cjs`, `trail-hook?.cjs`), a
|
|
271
|
+
* helpers path the shell works out (`.claude/helpers/*`, `.claude/helpers/$(ls …)`), and the package's
|
|
272
|
+
* `dist/claude/<module>.js` run or imported by hand.
|
|
273
|
+
*/
|
|
274
|
+
const HOOK_SCRIPT = [
|
|
275
|
+
/\b(?:trail|graft)-hooks?[\w*?[\]-]{0,64}(?:\.cjs\b|\*)/i,
|
|
276
|
+
/hooks?[*?[\]]{0,8}\.cjs\b/i,
|
|
277
|
+
/\.claude\/helpers\/[^\s/]{0,64}[*?[$\x60]/i,
|
|
278
|
+
/(?:@trailhq\/trail-code|@nanonets\/graft|\bdist)\/(?:dist\/)?claude\/[\w-]{1,64}\.js\b/i,
|
|
279
|
+
];
|
|
280
|
+
/** What `shellWords` drops: a line continuation, then any quote or backslash. */
|
|
281
|
+
const UNSAID = /\\\n|["'\\]/g;
|
|
282
|
+
/** The words the shell runs: quotes and backslashes don't change them, and a line continuation joins with nothing. */
|
|
283
|
+
export function shellWords(cmd) {
|
|
284
|
+
const s = String(cmd ?? '');
|
|
285
|
+
// Slices between the few dropped characters; past 4,096 of them, one pass over char codes (two regex
|
|
286
|
+
// replaces cost 20+ ms on 2 MB of `"a" `; a copy of a 2 MB command with a few quotes costs 13).
|
|
287
|
+
let r = '';
|
|
288
|
+
let last = 0;
|
|
289
|
+
let n = 0;
|
|
290
|
+
UNSAID.lastIndex = 0;
|
|
291
|
+
for (let m = UNSAID.exec(s); m; m = UNSAID.exec(s)) {
|
|
292
|
+
r += s.slice(last, m.index);
|
|
293
|
+
last = m.index + m[0].length;
|
|
294
|
+
if (++n > 4096)
|
|
295
|
+
return r + dropUnsaid(s, last);
|
|
296
|
+
}
|
|
297
|
+
return last ? r + s.slice(last) : s;
|
|
298
|
+
}
|
|
299
|
+
function dropUnsaid(s, from) {
|
|
300
|
+
const out = new Uint16Array(s.length - from);
|
|
301
|
+
let k = 0;
|
|
302
|
+
for (let i = from; i < s.length; i++) {
|
|
303
|
+
const c = s.charCodeAt(i);
|
|
304
|
+
if (c === 34 || c === 39)
|
|
305
|
+
continue;
|
|
306
|
+
if (c === 92) {
|
|
307
|
+
if (s.charCodeAt(i + 1) === 10)
|
|
308
|
+
i++;
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
out[k++] = c;
|
|
312
|
+
}
|
|
313
|
+
let r = '';
|
|
314
|
+
for (let i = 0; i < k; i += 8192)
|
|
315
|
+
r += String.fromCharCode.apply(null, out.subarray(i, Math.min(k, i + 8192)));
|
|
316
|
+
return r;
|
|
317
|
+
}
|
|
318
|
+
function hitOf(m) {
|
|
319
|
+
return m[1] ? 'offers-on' : m[2] ? 'skills-on' : 'keep-held';
|
|
320
|
+
}
|
|
321
|
+
/** Past this a command is read whole: any switch denies, wherever it sits (the lexer on 2 MB takes seconds). */
|
|
322
|
+
const TEXT_MAX = 64 * 1024;
|
|
323
|
+
/** The switch written out, as the shell's words read: `skills on`, `skills offers on`, `skills keep`. */
|
|
324
|
+
function staticSwitch(c) {
|
|
325
|
+
if (!/skills/i.test(c))
|
|
326
|
+
return null;
|
|
327
|
+
for (const [hit, re] of SWITCH)
|
|
328
|
+
if (re.test(c))
|
|
329
|
+
return hit;
|
|
330
|
+
return restoreVersionIn(c, false) ? 'restore-version' : null;
|
|
331
|
+
}
|
|
332
|
+
/** The switch or the word `skills` not written out, with a Trail word in the call, and xargs supplying it. */
|
|
333
|
+
function dynamicSwitch(c, trailWord) {
|
|
334
|
+
if (trailWord && restoreVersionIn(c, true))
|
|
335
|
+
return 'restore-version';
|
|
336
|
+
if (trailWord) {
|
|
337
|
+
for (const [hit, re] of DYNAMIC_SWITCH)
|
|
338
|
+
if (re.test(c))
|
|
339
|
+
return hit;
|
|
340
|
+
for (const [has, re] of DYNAMIC_WORD) {
|
|
341
|
+
const m = has.test(c) ? re.exec(c) : null;
|
|
342
|
+
if (m)
|
|
343
|
+
return hitOf(m);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
if (XARGS.test(c)) {
|
|
347
|
+
for (const seg of c.split(/[;&|\n]/))
|
|
348
|
+
if (XARGS.test(seg) && XARGS_SKILLS.test(seg))
|
|
349
|
+
return 'skills-on';
|
|
350
|
+
}
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* D89: a switch found in the text is denied where the shell runs it, not where it is only words: inside quoted
|
|
355
|
+
* arguments of grep, rg, git commit or log, echo or printf not fed to a shell, sed, awk patterns, cat. Over
|
|
356
|
+
* TEXT_MAX, or when no one command carries it, the whole text decides.
|
|
357
|
+
*/
|
|
358
|
+
function runsSwitch(cmd, whole, find) {
|
|
359
|
+
if (cmd.length > TEXT_MAX)
|
|
360
|
+
return whole;
|
|
361
|
+
return quotedTextHit(cmd, (t) => find(shellWords(t)), whole);
|
|
362
|
+
}
|
|
363
|
+
const hookNamed = (t) => (HOOK_SCRIPT.some((re) => re.test(shellWords(t))) ? true : null);
|
|
364
|
+
const namesHook = (t) => hookNamed(t) === true;
|
|
365
|
+
/** fix-lab5: a command only naming a hook script leaves it unrun (shell-words' hookUnrun: a read, a delete, a check, an edit of another file). */
|
|
366
|
+
const leavesHookUnrun = (head, bodies, hitOf) => hookUnrun(head, bodies, hitOf, namesHook);
|
|
367
|
+
/** D116 item 2: the hook script is run, not only read (an argument of grep, sed, cat, a pager, head, git log) or named (fix-lab5). */
|
|
368
|
+
function runsHookScript(raw) {
|
|
369
|
+
if (raw.length > TEXT_MAX)
|
|
370
|
+
return true;
|
|
371
|
+
return quotedTextHit(raw, hookNamed, true, 0, leavesHookUnrun) !== null;
|
|
372
|
+
}
|
|
373
|
+
/** P28's words, with the person's own command when the name and version are written out (else `<name>`, `<n>`). */
|
|
374
|
+
function restoreReason(c) {
|
|
375
|
+
const m = /\bskills\s+restore\s+([a-z0-9][a-z0-9-]{0,63})\s+--version[=\s]([1-9]\d{0,5})(?![\w-])/i.exec(c)
|
|
376
|
+
?? /\bskills\s+restore\s+--version[=\s]([1-9]\d{0,5})\s+([a-z0-9][a-z0-9-]{0,63})(?![\w-])/i.exec(c);
|
|
377
|
+
const [name, n] = m ? (/^\d/.test(m[1]) ? [m[2], m[1]] : [m[1], m[2]]) : ['<name>', '<n>'];
|
|
378
|
+
return REASONS['restore-version'].replace('{name}', name).replace('{n}', n);
|
|
379
|
+
}
|
|
380
|
+
/** 4.11 agent guard: commands only the person may run, and Trail's hook scripts run by hand. Linear in the command. */
|
|
381
|
+
export function agentGuard(cmd) {
|
|
382
|
+
const raw = String(cmd ?? '');
|
|
383
|
+
const c = shellWords(raw);
|
|
384
|
+
const found = (hit) => ({ hit, reason: hit === 'restore-version' ? restoreReason(c) : REASONS[hit] });
|
|
385
|
+
const fixed = staticSwitch(c);
|
|
386
|
+
const ran = fixed && runsSwitch(raw, fixed, staticSwitch);
|
|
387
|
+
if (ran)
|
|
388
|
+
return found(ran);
|
|
389
|
+
if (HOOK_SCRIPT.some((re) => re.test(c)) && runsHookScript(raw))
|
|
390
|
+
return found('hook-script');
|
|
391
|
+
const trailWord = TRAIL_WORD.test(c);
|
|
392
|
+
const dynamic = dynamicSwitch(c, trailWord);
|
|
393
|
+
const ranDynamic = dynamic && runsSwitch(raw, dynamic, (t) => dynamicSwitch(t, trailWord));
|
|
394
|
+
return ranDynamic ? found(ranDynamic) : null;
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk.js","sourceRoot":"","sources":["../../src/skills/risk.ts"],"names":[],"mappings":"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"}
|