@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,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading a shell command the way the shell does, without running anything.
|
|
3
|
+
*
|
|
4
|
+
* Agents write commit messages in `"$(cat <<'EOF' ... EOF)"`, wrap commands
|
|
5
|
+
* in `(cd x && ...)`, poll in `for` loops and pipe everything through
|
|
6
|
+
* `| tail`. A plain split on `;` or `|` turns a word inside a quote, a
|
|
7
|
+
* substitution or a heredoc body into a "step", so this reads top-level
|
|
8
|
+
* segments only: quotes, `$'…'`, `$(…)`, backticks, `(…)` subshells, `{…}`
|
|
9
|
+
* groups, `[[…]]`, loops and ifs are opaque, and a heredoc body belongs to the
|
|
10
|
+
* segment whose line opened it.
|
|
11
|
+
*
|
|
12
|
+
* The PreToolUse fast path loads this file: its imports are the lexer,
|
|
13
|
+
* `shell-scan.ts`, and the program-word layer on it, `shell-words.ts`; the
|
|
14
|
+
* lexer imports nothing.
|
|
15
|
+
*
|
|
16
|
+
* Every reader here is linear in the command's length (a skill's step is
|
|
17
|
+
* matched against each command the agent runs, in the PreToolUse hook) and
|
|
18
|
+
* reads nesting only to a fixed depth.
|
|
19
|
+
*/
|
|
20
|
+
import type { CallKind } from './types.js';
|
|
21
|
+
import { PLUMBING, RUNNERS, bareCommand, heredocInterpreter, hookUnrun, inlineScript, quotedTextHit, readsFiles, scriptKind, simpleCommands } from './shell-words.js';
|
|
22
|
+
export { PLUMBING, RUNNERS, bareCommand, heredocInterpreter, hookUnrun, inlineScript, quotedTextHit, readsFiles, scriptKind, simpleCommands };
|
|
23
|
+
export interface Segment {
|
|
24
|
+
text: string;
|
|
25
|
+
sep: '&&' | '||' | ';' | '|' | '&' | '';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Top-level segments. Opaque: '…', "…", $'…', $(…), `…`, a (…) subshell, a {…} group, and a heredoc
|
|
29
|
+
* body (the lines after `<<[-~]?\s*['"]?WORD['"]?` up to the line that is exactly WORD), which belongs to
|
|
30
|
+
* the segment whose line opened it. Each segment keeps the separator after it; a trailing `&` gives '&'.
|
|
31
|
+
*/
|
|
32
|
+
export declare function splitTop(cmd: string): Segment[];
|
|
33
|
+
/** Any heredoc, or a newline outside quotes and heredoc bodies (a `\`-continued line is not one). */
|
|
34
|
+
export declare function isMultiLine(cmd: string): boolean;
|
|
35
|
+
/** `A=1 B=2 cmd` -> { env: ['A=1','B=2'], rest: 'cmd' }. */
|
|
36
|
+
export declare function envPrefix(cmd: string): {
|
|
37
|
+
env: string[];
|
|
38
|
+
rest: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Every leading `cd X &&` / `cd X;` segment in order (`cd X || exit 1` on its own line is one too), and
|
|
42
|
+
* `(cd X && rest)` when the subshell is the whole command.
|
|
43
|
+
*/
|
|
44
|
+
export declare function leadingCds(cmd: string, depth?: number): {
|
|
45
|
+
cds: string[];
|
|
46
|
+
rest: string;
|
|
47
|
+
};
|
|
48
|
+
/** Drops a leading `sleep N;` / `sleep N &&`. A sleep inside a subshell or pipe stays. */
|
|
49
|
+
export declare function stripLeadingSleep(cmd: string): string;
|
|
50
|
+
/** Drops a leading `timeout N ` / `gtimeout N ` (also right after env prefixes). */
|
|
51
|
+
export declare function stripTimeout(cmd: string): string;
|
|
52
|
+
/** Drops trailing `| tail…`, `| head…`, `| less`, `| more`, `| cat` segments and the `2>&1` that fed them. */
|
|
53
|
+
export declare function stripOutputFilters(cmd: string): string;
|
|
54
|
+
/** Drops a last segment that is only `echo …` or `printf …` after `&&`, `;` or `||`. */
|
|
55
|
+
export declare function stripTrailingEcho(cmd: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* The first segment's program after env prefixes, leading cds, `time`, `nice`, `command`, and a
|
|
58
|
+
* `script -q /dev/null` wrapper; two words for RUNNERS (`git push`, `gh pr`, `npm run`, `npx vitest`).
|
|
59
|
+
* Never a word from inside quotes or a heredoc body.
|
|
60
|
+
*/
|
|
61
|
+
export declare function programOf(cmd: string): string | null;
|
|
62
|
+
/** Read-only exploration (4.1 kinds). */
|
|
63
|
+
export declare function isLookOnly(cmd: string): boolean;
|
|
64
|
+
/** Changes the work itself rather than running the job (4.1 kinds). */
|
|
65
|
+
export declare function isWork(cmd: string): boolean;
|
|
66
|
+
/** plumbing, work, look or step from the command alone (4.1; the fold also counts read-only check families as look). */
|
|
67
|
+
export declare function commandKind(cmd: string): CallKind;
|
|
68
|
+
/**
|
|
69
|
+
* Any part of the command runs Trail: trail, graft, npx @trailhq/trail-code, npx @nanonets/graft,
|
|
70
|
+
* node …/dist/bin/(trail|graft).js. For "a skill never runs Trail" (4.11). The fold's "Trail's own
|
|
71
|
+
* command, ignored" (4.1) is `onlyTrail`: `trail x; rm ~/.trail/y` runs Trail and is not only Trail.
|
|
72
|
+
*/
|
|
73
|
+
export declare function isTrailCommand(cmd: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* The whole command is Trail's own (4.1 "ignored entirely", and the tamper check's exemption): it runs
|
|
76
|
+
* Trail, and everything else in it only reads or sets up the shell. Not when any part writes a file
|
|
77
|
+
* (a redirect, cp, tee), runs code inside a word (`$( )`, backticks), runs another program, or changes
|
|
78
|
+
* which `trail` runs (PATH, an alias, a function, a path to a `trail`).
|
|
79
|
+
*/
|
|
80
|
+
export declare function onlyTrail(cmd: string): boolean;
|
|
81
|
+
/** For comparisons: output filters, trailing echo, leading cds, leading sleep and timeout stripped; quotes removed; spaces collapsed. */
|
|
82
|
+
export declare function normalizeCommand(cmd: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* A step matches a command that ran when, after normalizeCommand on both, the step (params filled from
|
|
85
|
+
* `values` where known, other {params} as \S+) matches at the start of the ran command or right after a
|
|
86
|
+
* top-level `&& ` or `; `. Env prefixes are compared too, unless `ignoreEnv`.
|
|
87
|
+
*/
|
|
88
|
+
export declare function stepMatches(step: string, ran: string, values?: Record<string, string>, ignoreEnv?: boolean): boolean;
|
|
89
|
+
/** Absolute path tokens: under repoRoot become repo-relative (`./x` or `x`); under home become `$HOME/…`; `~/` becomes `$HOME/`. */
|
|
90
|
+
export declare function relativizePaths(cmd: string, repoRoot: string, home: string): string;
|
|
91
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/trace/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EACM,QAAQ,EAAE,OAAO,EAA6B,WAAW,EAAc,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAC7H,aAAa,EAAE,UAAU,EAAE,UAAU,EAA0B,cAAc,EAC9E,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;AAE9I,MAAM,WAAW,OAAO;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAA;CAAE;AAElF;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAG/C;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGhD;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAUtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA+BlF;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWrD;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED,8GAA8G;AAC9G,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAatD;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASrD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIpD;AAmFD,yCAAyC;AACzC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED,uEAAuE;AACvE,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3C;AAED,wHAAwH;AACxH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAEjD;AA8BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGnD;AAyCD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE9C;AAcD,yIAAyI;AACzI,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAID;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAAE,SAAS,UAAQ,GAAG,OAAO,CAyBtH;AAED,oIAAoI;AACpI,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CASnF"}
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { ASSIGN, OPEN_KW, base, cut, pieceText, scan, unquote, words } from './shell-scan.js';
|
|
2
|
+
import { MAX_DEPTH, PLUMBING, RUNNERS, VALUE_FLAGS, afterTimeout, bareCommand, groupInner, heredocInterpreter, hookUnrun, inlineScript, programOfText, programWords, quotedTextHit, readsFiles, scriptKind, shellOnly, shellScript, simpleCommands, stripKeywords, writesFile, } from './shell-words.js';
|
|
3
|
+
export { PLUMBING, RUNNERS, bareCommand, heredocInterpreter, hookUnrun, inlineScript, quotedTextHit, readsFiles, scriptKind, simpleCommands };
|
|
4
|
+
/**
|
|
5
|
+
* Top-level segments. Opaque: '…', "…", $'…', $(…), `…`, a (…) subshell, a {…} group, and a heredoc
|
|
6
|
+
* body (the lines after `<<[-~]?\s*['"]?WORD['"]?` up to the line that is exactly WORD), which belongs to
|
|
7
|
+
* the segment whose line opened it. Each segment keeps the separator after it; a trailing `&` gives '&'.
|
|
8
|
+
*/
|
|
9
|
+
export function splitTop(cmd) {
|
|
10
|
+
const s = String(cmd ?? '');
|
|
11
|
+
return scan(s).segs.map((p) => ({ text: pieceText(s, p), sep: p.sep }));
|
|
12
|
+
}
|
|
13
|
+
/** Any heredoc, or a newline outside quotes and heredoc bodies (a `\`-continued line is not one). */
|
|
14
|
+
export function isMultiLine(cmd) {
|
|
15
|
+
const r = scan(String(cmd ?? ''));
|
|
16
|
+
return r.heredoc || r.newline;
|
|
17
|
+
}
|
|
18
|
+
/** `A=1 B=2 cmd` -> { env: ['A=1','B=2'], rest: 'cmd' }. */
|
|
19
|
+
export function envPrefix(cmd) {
|
|
20
|
+
const s = String(cmd ?? '').trimStart();
|
|
21
|
+
const env = [];
|
|
22
|
+
let at = 0;
|
|
23
|
+
for (const w of words(s)) {
|
|
24
|
+
if (!ASSIGN.test(w))
|
|
25
|
+
break;
|
|
26
|
+
env.push(w);
|
|
27
|
+
at = s.indexOf(w, at) + w.length;
|
|
28
|
+
}
|
|
29
|
+
return { env, rest: env.length ? s.slice(at).trim() : s.trim() };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Every leading `cd X &&` / `cd X;` segment in order (`cd X || exit 1` on its own line is one too), and
|
|
33
|
+
* `(cd X && rest)` when the subshell is the whole command.
|
|
34
|
+
*/
|
|
35
|
+
export function leadingCds(cmd, depth = 0) {
|
|
36
|
+
const s = String(cmd ?? '').trim();
|
|
37
|
+
const { segs } = scan(s);
|
|
38
|
+
const cds = [];
|
|
39
|
+
let k = 0;
|
|
40
|
+
for (; k < segs.length; k++) {
|
|
41
|
+
const p = segs[k];
|
|
42
|
+
const w = words(s.slice(p.start, p.end));
|
|
43
|
+
if (w[0] !== 'cd' || w.length > 2 || p.bodies.length)
|
|
44
|
+
break;
|
|
45
|
+
let end = k;
|
|
46
|
+
if (p.sep === '||') {
|
|
47
|
+
const q = segs[k + 1];
|
|
48
|
+
const e = q ? words(s.slice(q.start, q.end)) : [];
|
|
49
|
+
if (!q || q.bodies.length || q.group || !/^(?:exit|return)$/.test(e[0] ?? '') || e.length > 2)
|
|
50
|
+
break;
|
|
51
|
+
end = k + 1;
|
|
52
|
+
}
|
|
53
|
+
const sep = segs[end].sep;
|
|
54
|
+
if (end < segs.length - 1 && sep !== '&&' && sep !== ';')
|
|
55
|
+
break;
|
|
56
|
+
if (end === segs.length - 1 && sep !== '')
|
|
57
|
+
break;
|
|
58
|
+
cds.push(w[1] === undefined ? '~' : unquote(w[1]));
|
|
59
|
+
k = end;
|
|
60
|
+
}
|
|
61
|
+
if (k === segs.length && k > 0)
|
|
62
|
+
return { cds, rest: '' };
|
|
63
|
+
const rest = k ? s.slice(segs[k].start).trim() : s;
|
|
64
|
+
const only = scan(rest).segs;
|
|
65
|
+
const g = only.length === 1 ? only[0].group : null;
|
|
66
|
+
if (g && rest[g.open] === '(' && g.close === rest.length - 1 && depth < MAX_DEPTH && /^\s*cd\b/.test(rest.slice(g.open + 1))) {
|
|
67
|
+
const inner = leadingCds(rest.slice(g.open + 1, g.close), depth + 1);
|
|
68
|
+
if (inner.cds.length)
|
|
69
|
+
return { cds: [...cds, ...inner.cds], rest: inner.rest };
|
|
70
|
+
}
|
|
71
|
+
return { cds, rest };
|
|
72
|
+
}
|
|
73
|
+
/** Drops a leading `sleep N;` / `sleep N &&`. A sleep inside a subshell or pipe stays. */
|
|
74
|
+
export function stripLeadingSleep(cmd) {
|
|
75
|
+
const s = String(cmd ?? '').trim();
|
|
76
|
+
const { segs } = scan(s);
|
|
77
|
+
let k = 0;
|
|
78
|
+
for (; k < segs.length - 1; k++) {
|
|
79
|
+
const p = segs[k];
|
|
80
|
+
if (p.sep !== ';' && p.sep !== '&&')
|
|
81
|
+
break;
|
|
82
|
+
const w = words(s.slice(p.start, p.end));
|
|
83
|
+
if (w[0] !== 'sleep' || w.length !== 2)
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
return k ? s.slice(segs[k].start).trim() : s;
|
|
87
|
+
}
|
|
88
|
+
/** Drops a leading `timeout N ` / `gtimeout N ` (also right after env prefixes). */
|
|
89
|
+
export function stripTimeout(cmd) {
|
|
90
|
+
const s = String(cmd ?? '').trim();
|
|
91
|
+
const { env, rest } = envPrefix(s);
|
|
92
|
+
const w = words(rest);
|
|
93
|
+
const after = afterTimeout(w);
|
|
94
|
+
if (!after?.length)
|
|
95
|
+
return s;
|
|
96
|
+
// Cut the original text where the command after the duration starts, so its spacing and quotes stay as typed.
|
|
97
|
+
let at = 0;
|
|
98
|
+
for (const word of w.slice(0, w.length - after.length))
|
|
99
|
+
at = rest.indexOf(word, at) + word.length;
|
|
100
|
+
return [...env, rest.slice(at).trim()].join(' ').trim();
|
|
101
|
+
}
|
|
102
|
+
/** Drops trailing `| tail…`, `| head…`, `| less`, `| more`, `| cat` segments and the `2>&1` that fed them. */
|
|
103
|
+
export function stripOutputFilters(cmd) {
|
|
104
|
+
let s = String(cmd ?? '').trim();
|
|
105
|
+
for (;;) {
|
|
106
|
+
const { segs, keep } = scan(s);
|
|
107
|
+
let k = segs.length;
|
|
108
|
+
while (k > 1 && segs[k - 2].sep === '|' && /^(?:tail|head|less|more|cat)$/.test(words(s.slice(segs[k - 1].start, segs[k - 1].end))[0] ?? ''))
|
|
109
|
+
k--;
|
|
110
|
+
if (k === segs.length)
|
|
111
|
+
return s;
|
|
112
|
+
const prev = segs[k - 1];
|
|
113
|
+
const head = s.slice(prev.start, prev.end);
|
|
114
|
+
const redirect = /\s*2>&1\s*$/.exec(head);
|
|
115
|
+
const from = redirect ? prev.start + redirect.index : prev.end;
|
|
116
|
+
s = cut(s, [[from, segs[segs.length - 1].end]], keep);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Drops a last segment that is only `echo …` or `printf …` after `&&`, `;` or `||`. */
|
|
120
|
+
export function stripTrailingEcho(cmd) {
|
|
121
|
+
const s = String(cmd ?? '').trim();
|
|
122
|
+
const { segs, keep } = scan(s);
|
|
123
|
+
if (segs.length < 2)
|
|
124
|
+
return s;
|
|
125
|
+
const prev = segs[segs.length - 2];
|
|
126
|
+
const last = segs[segs.length - 1];
|
|
127
|
+
if (prev.sep !== '&&' && prev.sep !== ';' && prev.sep !== '||')
|
|
128
|
+
return s;
|
|
129
|
+
if (!/^(?:echo|printf)$/.test(words(s.slice(last.start, last.end))[0] ?? '') || last.bodies.length)
|
|
130
|
+
return s;
|
|
131
|
+
return cut(s, [[prev.end, last.end]], keep);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The first segment's program after env prefixes, leading cds, `time`, `nice`, `command`, and a
|
|
135
|
+
* `script -q /dev/null` wrapper; two words for RUNNERS (`git push`, `gh pr`, `npm run`, `npx vitest`).
|
|
136
|
+
* Never a word from inside quotes or a heredoc body.
|
|
137
|
+
*/
|
|
138
|
+
export function programOf(cmd) {
|
|
139
|
+
const s = String(cmd ?? '').trim();
|
|
140
|
+
if (!s)
|
|
141
|
+
return null;
|
|
142
|
+
return programOfText(leadingCds(s).rest || s).prog;
|
|
143
|
+
}
|
|
144
|
+
/** `find` actions that change files or run commands: such a find is not a look. */
|
|
145
|
+
const FIND_ACTS = /^-(?:delete|exec|execdir|ok|okdir|fprint0?|fprintf|fls)$/;
|
|
146
|
+
/**
|
|
147
|
+
* Commands that only report on the machine, reshape text, read an API or print a version or help: they
|
|
148
|
+
* run, but change nothing, so they are looks (on the program words, wrappers gone; a file redirect still
|
|
149
|
+
* makes them work).
|
|
150
|
+
*/
|
|
151
|
+
const INFO = /^(?:date|uname|hostname|sw_vers|whoami|id|uptime|nproc|ps|pgrep|lsof|vm_stat|printenv|sysctl|seq|tr|sort(?![^|;&]*\s-\w*o)|uniq|cut|awk|column|paste|comm|nl|diff|cmp|basename|dirname|realpath|readlink|od|xxd|strings|xargs echo|git (?:rev-list|for-each-ref|name-rev|ls-tree)|docker (?:ps|images|inspect|logs|version|context (?:ls|inspect|show))|colima (?:status|list|ls)|kubectl (?:get|describe|logs)|npm config get|git config --get|brew (?:list|info)|open(?!\s+-[aAbe]\b)|gh (?:repo|release) (?:list|view)|gh api(?![^|;&]*\s(?:-X|--method|-f|-F|--field|--raw-field|--input)\b))(?:\s|$)|^(?:npx(?:\s+-[\w-]+)*\s+)?[\w.@/+-]+(?: [\w-]+)? (?:--version|-v|-V|version|--help|-h|help)(?:\s+\d?>>?&?\s*[^\s&>]\S*)*$/;
|
|
152
|
+
/**
|
|
153
|
+
* A segment's kind on its own: plumbing, work, look or step. A top-level redirect into a file turns
|
|
154
|
+
* a look or plumbing segment into work: `grep x a > ~/.trail/y` writes a file, and the tamper check
|
|
155
|
+
* (4.1) trusts that a look only reads.
|
|
156
|
+
*/
|
|
157
|
+
function segKind(s, p, depth) {
|
|
158
|
+
if (p.group)
|
|
159
|
+
return kindOf(groupInner(s, p), depth + 1);
|
|
160
|
+
const head = s.slice(p.start, p.end);
|
|
161
|
+
// D51, D58 e: an interpreter's heredoc program is read for what it does; it is never a step.
|
|
162
|
+
const prog = p.bodies.length ? heredocInterpreter(programWords(head)) : null;
|
|
163
|
+
if (prog)
|
|
164
|
+
return scriptKind(p.bodies.map(([a, b]) => s.slice(a, b)).join('\n'), prog) === 'look' && !writesFile(head) ? 'look' : 'work';
|
|
165
|
+
const k = readKind(head, depth);
|
|
166
|
+
return (k === 'look' || k === 'plumbing') && writesFile(head) ? 'work' : k;
|
|
167
|
+
}
|
|
168
|
+
function readKind(head, depth) {
|
|
169
|
+
const w = programWords(head);
|
|
170
|
+
const prog = base(w[0] ?? '');
|
|
171
|
+
if (OPEN_KW.has(w[0] ?? '')) {
|
|
172
|
+
const inner = stripKeywords(head);
|
|
173
|
+
if (inner !== head)
|
|
174
|
+
return kindOf(inner, depth + 1);
|
|
175
|
+
}
|
|
176
|
+
if (!w.length || shellOnly(prog))
|
|
177
|
+
return 'plumbing';
|
|
178
|
+
if (INFO.test(w.join(' ').replace(/^docker(?:\s+(?:--context|-c|--host|-H)[ =]\S+)+/, 'docker')))
|
|
179
|
+
return 'look';
|
|
180
|
+
const sub = w.slice(1).filter((a) => !a.startsWith('-'));
|
|
181
|
+
const flags = w.slice(1).filter((a) => a.startsWith('-'));
|
|
182
|
+
if (prog === 'git') {
|
|
183
|
+
const g = w.slice(1).filter((a, i, all) => !a.startsWith('-') && !VALUE_FLAGS.git.has(all[i - 1] ?? ''));
|
|
184
|
+
const verb = g[0];
|
|
185
|
+
if ((verb === 'worktree' || verb === 'stash') && /^(?:list|show)$/.test(g[1] ?? ''))
|
|
186
|
+
return 'look';
|
|
187
|
+
if (verb === 'tag' && (g.length === 1 || flags.some((f) => /^(?:-l|--list|--contains|--points-at)$/.test(f))))
|
|
188
|
+
return 'look';
|
|
189
|
+
if (verb && /^(?:add|commit|stash|restore|rm|mv|apply|am)$/.test(verb))
|
|
190
|
+
return 'work';
|
|
191
|
+
if (verb === 'checkout' && w.includes('--'))
|
|
192
|
+
return 'work';
|
|
193
|
+
if (verb && /^(?:status|log|diff|show|ls-files|blame|describe|reflog|shortlog)$/.test(verb))
|
|
194
|
+
return flags.some((f) => /^--output\b/.test(f)) ? 'step' : 'look';
|
|
195
|
+
if (verb === 'rev-parse' && !w.includes('--verify'))
|
|
196
|
+
return 'look';
|
|
197
|
+
if (verb === 'remote' && g.length === 1)
|
|
198
|
+
return 'look';
|
|
199
|
+
if (verb === 'branch' && g.length === 1 && !flags.some((f) => /^-(?:[dDmMcCfu]|-delete|-move|-copy|-force|-set-upstream-to|-unset-upstream|-edit-description)/.test(f)))
|
|
200
|
+
return 'look';
|
|
201
|
+
return 'step';
|
|
202
|
+
}
|
|
203
|
+
if (prog === 'gh') {
|
|
204
|
+
if (/^(?:pr (?:view|list|diff)|run list|issue (?:view|list)|repo view)$/.test(sub.slice(0, 2).join(' ')))
|
|
205
|
+
return 'look';
|
|
206
|
+
return 'step';
|
|
207
|
+
}
|
|
208
|
+
if (prog === 'npm' && sub[0] === 'ls')
|
|
209
|
+
return 'look';
|
|
210
|
+
if (prog === 'perl' && flags.some((f) => /^-\w*i/.test(f)))
|
|
211
|
+
return 'work';
|
|
212
|
+
// D51, D58 e: `node -e`, `python3 -c`: a step only when it is one line that starts a program.
|
|
213
|
+
const code = inlineScript(w);
|
|
214
|
+
if (code !== null)
|
|
215
|
+
return scriptKind(code, prog);
|
|
216
|
+
if (prog === 'sed')
|
|
217
|
+
return flags.some((f) => /^-[a-zA-Z]*i/.test(f) || f === '--in-place') ? 'work' : flags.includes('-n') ? 'look' : 'step';
|
|
218
|
+
if (prog === 'perl')
|
|
219
|
+
return flags.some((f) => /^-\w*i/.test(f)) ? 'work' : 'step';
|
|
220
|
+
if (prog === 'rm')
|
|
221
|
+
return flags.some((f) => /^-\w*[rR]|^--recursive/.test(f)) ? 'step' : 'work';
|
|
222
|
+
if (prog === 'tee')
|
|
223
|
+
return sub.length ? 'work' : 'plumbing';
|
|
224
|
+
if (/^(?:patch|mkdir|touch|cp|mv|chmod|ln)$/.test(prog))
|
|
225
|
+
return 'work';
|
|
226
|
+
if (prog === 'command')
|
|
227
|
+
return w[1] === '-v' || w[1] === '-V' ? 'look' : 'step';
|
|
228
|
+
if (prog === 'find' && w.some((a) => FIND_ACTS.test(a)))
|
|
229
|
+
return 'step';
|
|
230
|
+
if (prog === 'tree' && flags.some((f) => /^-o/.test(f)))
|
|
231
|
+
return 'step';
|
|
232
|
+
if (/^(?:ls|cat|head|tail|grep|egrep|rg|find|wc|pwd|which|less|more|tree|stat|file|du|df|jq|test|\[)$/.test(prog))
|
|
233
|
+
return 'look';
|
|
234
|
+
return 'step';
|
|
235
|
+
}
|
|
236
|
+
/** What a whole command is: plumbing when every segment is; work when it only edits or commits; look when it only reads. */
|
|
237
|
+
function kindOf(cmd, depth = 0) {
|
|
238
|
+
if (depth > MAX_DEPTH)
|
|
239
|
+
return 'step';
|
|
240
|
+
const s = String(cmd ?? '');
|
|
241
|
+
const { segs } = scan(s);
|
|
242
|
+
const kinds = segs.map((p) => segKind(s, p, depth));
|
|
243
|
+
if (kinds.every((k) => k === 'plumbing'))
|
|
244
|
+
return 'plumbing';
|
|
245
|
+
if (kinds.includes('step'))
|
|
246
|
+
return 'step';
|
|
247
|
+
return kinds.includes('work') ? 'work' : 'look';
|
|
248
|
+
}
|
|
249
|
+
/** Read-only exploration (4.1 kinds). */
|
|
250
|
+
export function isLookOnly(cmd) {
|
|
251
|
+
const k = kindOf(cmd);
|
|
252
|
+
return k === 'look' || k === 'plumbing';
|
|
253
|
+
}
|
|
254
|
+
/** Changes the work itself rather than running the job (4.1 kinds). */
|
|
255
|
+
export function isWork(cmd) {
|
|
256
|
+
return kindOf(cmd) === 'work';
|
|
257
|
+
}
|
|
258
|
+
/** plumbing, work, look or step from the command alone (4.1; the fold also counts read-only check families as look). */
|
|
259
|
+
export function commandKind(cmd) {
|
|
260
|
+
return kindOf(cmd);
|
|
261
|
+
}
|
|
262
|
+
const TRAIL_BIN = /^(?:trail|graft|trail-code)$/;
|
|
263
|
+
const TRAIL_PKG = /^(?:@trailhq\/trail-code|@nanonets\/graft|trail-code)(?:@\S*)?$/;
|
|
264
|
+
const TRAIL_SCRIPT = /(?:^|\/)dist\/bin\/(?:trail|graft)\.js$|(?:^|\/)(?:trail|graft)-hooks\.cjs$/;
|
|
265
|
+
/** Trail's own program in one simple command (not through `sh -c`). `bare`: only `trail`/`graft` found on PATH, not a path to one. */
|
|
266
|
+
function trailProgram(w, bare) {
|
|
267
|
+
const p = w[0];
|
|
268
|
+
if (!p)
|
|
269
|
+
return false;
|
|
270
|
+
if (bare ? TRAIL_BIN.test(p) : TRAIL_BIN.test(base(p)) || TRAIL_SCRIPT.test(p))
|
|
271
|
+
return true;
|
|
272
|
+
const args = w.slice(1).filter((a) => !a.startsWith('-'));
|
|
273
|
+
if (p === 'npx' || p === 'bunx' || p === 'pnpx')
|
|
274
|
+
return TRAIL_PKG.test(args[0] ?? '');
|
|
275
|
+
if ((p === 'pnpm' || p === 'yarn') && args[0] === 'dlx')
|
|
276
|
+
return TRAIL_PKG.test(args[1] ?? '');
|
|
277
|
+
if (p === 'npm' && args[0] === 'exec')
|
|
278
|
+
return TRAIL_PKG.test(args[1] ?? '');
|
|
279
|
+
if (base(p) === 'node')
|
|
280
|
+
return TRAIL_SCRIPT.test(args[0] ?? '');
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
function trailSegment(text, depth) {
|
|
284
|
+
const raw = programWords(text);
|
|
285
|
+
const script = shellScript(raw);
|
|
286
|
+
return script !== null ? isTrailAt(script, depth + 1) : trailProgram(raw.map(unquote), false);
|
|
287
|
+
}
|
|
288
|
+
function isTrailAt(s, depth) {
|
|
289
|
+
if (depth > MAX_DEPTH)
|
|
290
|
+
return false;
|
|
291
|
+
return scan(s, false).segs.some((p) => (p.group ? isTrailAt(groupInner(s, p), depth + 1) : trailSegment(s.slice(p.start, p.end), depth)));
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Any part of the command runs Trail: trail, graft, npx @trailhq/trail-code, npx @nanonets/graft,
|
|
295
|
+
* node …/dist/bin/(trail|graft).js. For "a skill never runs Trail" (4.11). The fold's "Trail's own
|
|
296
|
+
* command, ignored" (4.1) is `onlyTrail`: `trail x; rm ~/.trail/y` runs Trail and is not only Trail.
|
|
297
|
+
*/
|
|
298
|
+
export function isTrailCommand(cmd) {
|
|
299
|
+
const s = String(cmd ?? '');
|
|
300
|
+
return isTrailAt(s, 0) || TRAIL_INSIDE.test(s);
|
|
301
|
+
}
|
|
302
|
+
/** Trail run inside a word: `$(trail …)`, `<(trail …)`. Not backticks: `graft` in backticks is far more often a quoted word in a commit message. */
|
|
303
|
+
const TRAIL_INSIDE = /(?:\$\(|[<>]\()\s*(?:trail|graft|trail-code|npx\s+(?:@trailhq\/trail-code|@nanonets\/graft))\b/;
|
|
304
|
+
/** Code that runs inside a word: `$( )`, backticks, `<( )`, `>( )`, outside single quotes (and anywhere in a command with a heredoc). */
|
|
305
|
+
function runsInside(s) {
|
|
306
|
+
let dq = false;
|
|
307
|
+
for (let i = 0; i < s.length; i++) {
|
|
308
|
+
const c = s[i];
|
|
309
|
+
if (c === '\\') {
|
|
310
|
+
i++;
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (c === '`' || (c === '$' && s[i + 1] === '('))
|
|
314
|
+
return true;
|
|
315
|
+
if (dq) {
|
|
316
|
+
if (c === '"')
|
|
317
|
+
dq = false;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
if (c === '"')
|
|
321
|
+
dq = true;
|
|
322
|
+
else if (c === "'") {
|
|
323
|
+
if (s[i - 1] === '$')
|
|
324
|
+
while (i + 1 < s.length && s[i + 1] !== "'")
|
|
325
|
+
i += s[i + 1] === '\\' ? 2 : 1;
|
|
326
|
+
else
|
|
327
|
+
while (i + 1 < s.length && s[i + 1] !== "'")
|
|
328
|
+
i++;
|
|
329
|
+
i++;
|
|
330
|
+
}
|
|
331
|
+
else if ((c === '<' || c === '>') && s[i + 1] === '(')
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
return scan(s).heredoc && /`|\$\(/.test(s);
|
|
335
|
+
}
|
|
336
|
+
/** Lines that change what a later `trail` runs: PATH, an alias, a function. */
|
|
337
|
+
const REDEFINES = /\bPATH\+?=|^(?:alias|unalias|hash|function)$|^[\w.-]+\(\)/;
|
|
338
|
+
function onlyTrailAt(s, depth) {
|
|
339
|
+
if (depth > MAX_DEPTH || !s.trim() || runsInside(s))
|
|
340
|
+
return false;
|
|
341
|
+
let trail = false;
|
|
342
|
+
for (const simple of simpleCommands(s)) {
|
|
343
|
+
if (writesFile(simple) || words(simple).some((x) => REDEFINES.test(x)))
|
|
344
|
+
return false;
|
|
345
|
+
const raw = programWords(simple);
|
|
346
|
+
const script = shellScript(raw);
|
|
347
|
+
if (script !== null) {
|
|
348
|
+
if (!onlyTrailAt(script, depth + 1))
|
|
349
|
+
return false;
|
|
350
|
+
trail = true;
|
|
351
|
+
}
|
|
352
|
+
else if (trailProgram(raw.map(unquote), true))
|
|
353
|
+
trail = true;
|
|
354
|
+
else if (!['look', 'plumbing'].includes(kindOf(simple, depth + 1)))
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
return trail;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* The whole command is Trail's own (4.1 "ignored entirely", and the tamper check's exemption): it runs
|
|
361
|
+
* Trail, and everything else in it only reads or sets up the shell. Not when any part writes a file
|
|
362
|
+
* (a redirect, cp, tee), runs code inside a word (`$( )`, backticks), runs another program, or changes
|
|
363
|
+
* which `trail` runs (PATH, an alias, a function, a path to a `trail`).
|
|
364
|
+
*/
|
|
365
|
+
export function onlyTrail(cmd) {
|
|
366
|
+
return onlyTrailAt(String(cmd ?? ''), 0);
|
|
367
|
+
}
|
|
368
|
+
/** The strips, repeated until nothing changes. */
|
|
369
|
+
function stripped(cmd) {
|
|
370
|
+
let s = String(cmd ?? '').trim();
|
|
371
|
+
for (let n = 0; n < 20; n++) {
|
|
372
|
+
const next = stripTimeout(stripLeadingSleep(leadingCds(stripTrailingEcho(stripOutputFilters(s))).rest));
|
|
373
|
+
if (next === s)
|
|
374
|
+
break;
|
|
375
|
+
s = next;
|
|
376
|
+
}
|
|
377
|
+
return s;
|
|
378
|
+
}
|
|
379
|
+
const flatten = (s) => s.replace(/['"]/g, '').replace(/\s+/g, ' ').trim();
|
|
380
|
+
/** For comparisons: output filters, trailing echo, leading cds, leading sleep and timeout stripped; quotes removed; spaces collapsed. */
|
|
381
|
+
export function normalizeCommand(cmd) {
|
|
382
|
+
return flatten(stripped(cmd));
|
|
383
|
+
}
|
|
384
|
+
const escapeRe = (t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
385
|
+
/**
|
|
386
|
+
* A step matches a command that ran when, after normalizeCommand on both, the step (params filled from
|
|
387
|
+
* `values` where known, other {params} as \S+) matches at the start of the ran command or right after a
|
|
388
|
+
* top-level `&& ` or `; `. Env prefixes are compared too, unless `ignoreEnv`.
|
|
389
|
+
*/
|
|
390
|
+
export function stepMatches(step, ran, values = {}, ignoreEnv = false) {
|
|
391
|
+
const core = stripped(step);
|
|
392
|
+
let want = flatten(core);
|
|
393
|
+
if (ignoreEnv)
|
|
394
|
+
want = envPrefix(want).rest;
|
|
395
|
+
if (!want)
|
|
396
|
+
return false;
|
|
397
|
+
// An unknown {param} is one token, never an operator: `{b}` can't swallow `&&`.
|
|
398
|
+
const re = new RegExp(`^${want.split(/(\{[A-Za-z_][\w]*\})/).map((part) => {
|
|
399
|
+
const name = /^\{([A-Za-z_]\w*)\}$/.exec(part)?.[1];
|
|
400
|
+
if (!name)
|
|
401
|
+
return escapeRe(part);
|
|
402
|
+
const v = values[name];
|
|
403
|
+
return v === undefined ? '[^\\s;&|<>]+' : escapeRe(flatten(v));
|
|
404
|
+
}).join('')}(?=$|[\\s;&|])`);
|
|
405
|
+
// The step spans `width` top-level segments, so a match from segment k reads only k..k+width-1:
|
|
406
|
+
// linear in the command, where re-reading every tail was quadratic (a 7 KB script took 8 s).
|
|
407
|
+
const width = Math.max(1, scan(core).segs.length);
|
|
408
|
+
const s = stripped(ran);
|
|
409
|
+
const { segs } = scan(s);
|
|
410
|
+
for (let k = 0; k < segs.length; k++) {
|
|
411
|
+
if (k > 0 && segs[k - 1].sep !== '&&' && segs[k - 1].sep !== ';')
|
|
412
|
+
continue;
|
|
413
|
+
const last = segs[Math.min(k + width, segs.length) - 1];
|
|
414
|
+
let tail = flatten(stripTimeout(stripLeadingSleep(leadingCds(s.slice(segs[k].start, last.end)).rest)));
|
|
415
|
+
if (ignoreEnv)
|
|
416
|
+
tail = envPrefix(tail).rest;
|
|
417
|
+
if (re.test(tail))
|
|
418
|
+
return true;
|
|
419
|
+
}
|
|
420
|
+
return false;
|
|
421
|
+
}
|
|
422
|
+
/** Absolute path tokens: under repoRoot become repo-relative (`./x` or `x`); under home become `$HOME/…`; `~/` becomes `$HOME/`. */
|
|
423
|
+
export function relativizePaths(cmd, repoRoot, home) {
|
|
424
|
+
const before = String.raw `(^|[\s'"=:(,]|(?<=:)//)`;
|
|
425
|
+
const after = String.raw `(?=$|[/\s'"),;:&|])`;
|
|
426
|
+
let s = String(cmd ?? '');
|
|
427
|
+
const root = repoRoot.replace(/\/+$/, '');
|
|
428
|
+
const h = home.replace(/\/+$/, '');
|
|
429
|
+
if (root)
|
|
430
|
+
s = s.replace(new RegExp(`${before}${escapeRe(root)}${after}(/?)`, 'g'), (_m, pre, slash) => `${pre}.${slash}`);
|
|
431
|
+
if (h)
|
|
432
|
+
s = s.replace(new RegExp(`${before}${escapeRe(h)}${after}`, 'g'), (_m, pre) => `${pre}$HOME`);
|
|
433
|
+
return s.replace(/(^|[\s'"=:(,])~(?=\/|$|\s)/g, '$1$HOME');
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/trace/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A folder only its owner can open, made if missing and tightened if it was
|
|
3
|
+
* looser. A link is left as it is: a chmod would follow it and tighten what
|
|
4
|
+
* it points to, which may be a folder that isn't Trail's (a person's dotfiles
|
|
5
|
+
* can link the Trail home; skills/own-folder.ts refuses links in place of
|
|
6
|
+
* Trail's own folders before anything is written). The mode is set through a
|
|
7
|
+
* descriptor that refuses a link, so one swapped in after the check isn't
|
|
8
|
+
* followed either.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ensurePrivateDir(dir: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* JSON only its owner can read, written whole or not at all. Folders it has
|
|
13
|
+
* to make are made private; a folder that already exists is left as it is
|
|
14
|
+
* (a cursor kept beside a caller's own files must not lock them away).
|
|
15
|
+
*/
|
|
16
|
+
export declare function writePrivateJson(path: string, value: unknown): void;
|
|
17
|
+
/** `~/.trail/sessions/<id>.json`; the folder exists (0700) once this returns, when it can be made. */
|
|
18
|
+
export declare function sessionStatePath(sessionId: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* `~/.trail/sessions/<id>.hooks.json`: where the turn-end hooks keep their
|
|
21
|
+
* own transcript cursor and what they carry between reads (the reply in
|
|
22
|
+
* progress, the responses already billed). Apart from `<id>.json`, whose
|
|
23
|
+
* cursor belongs to the skills catch-up, so neither reader moves the
|
|
24
|
+
* other's offset.
|
|
25
|
+
*/
|
|
26
|
+
export declare function hookCursorPath(sessionId: string): string;
|
|
27
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/trace/state.ts"],"names":[],"mappings":"AAiBA;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAwBlD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGnE;AAYD,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD"}
|