@lannguyensi/harness 0.44.0 → 0.45.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/CHANGELOG.md +1213 -0
- package/dist/cli/adopt/derive.d.ts +16 -7
- package/dist/cli/adopt/derive.js +19 -2
- package/dist/cli/adopt/derive.js.map +1 -1
- package/dist/cli/adopt/index.js +18 -3
- package/dist/cli/adopt/index.js.map +1 -1
- package/dist/cli/apply/apply.d.ts +1 -0
- package/dist/cli/apply/apply.js +62 -6
- package/dist/cli/apply/apply.js.map +1 -1
- package/dist/cli/apply/generate-codex-config.js +5 -6
- package/dist/cli/apply/generate-codex-config.js.map +1 -1
- package/dist/cli/apply/generate-opencode-config.d.ts +58 -0
- package/dist/cli/apply/generate-opencode-config.js +210 -0
- package/dist/cli/apply/generate-opencode-config.js.map +1 -0
- package/dist/cli/apply/generate-settings.d.ts +90 -32
- package/dist/cli/apply/generate-settings.js +133 -10
- package/dist/cli/apply/generate-settings.js.map +1 -1
- package/dist/cli/apply/index.d.ts +2 -1
- package/dist/cli/apply/index.js +2 -1
- package/dist/cli/apply/index.js.map +1 -1
- package/dist/cli/approve/stdin-report.d.ts +15 -0
- package/dist/cli/approve/stdin-report.js +1 -1
- package/dist/cli/approve/stdin-report.js.map +1 -1
- package/dist/cli/approve/understanding.d.ts +75 -0
- package/dist/cli/approve/understanding.js +150 -2
- package/dist/cli/approve/understanding.js.map +1 -1
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +3 -2
- package/dist/cli/audit.js.map +1 -1
- package/dist/cli/doctor/claude-mcp.d.ts +19 -1
- package/dist/cli/doctor/claude-mcp.js +36 -10
- package/dist/cli/doctor/claude-mcp.js.map +1 -1
- package/dist/cli/doctor/codex.d.ts +3 -1
- package/dist/cli/doctor/codex.js +6 -9
- package/dist/cli/doctor/codex.js.map +1 -1
- package/dist/cli/doctor/format.js +94 -8
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/index.d.ts +23 -0
- package/dist/cli/doctor/index.js +106 -2
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/opencode.d.ts +24 -0
- package/dist/cli/doctor/opencode.js +107 -0
- package/dist/cli/doctor/opencode.js.map +1 -0
- package/dist/cli/doctor/target-checks.d.ts +11 -0
- package/dist/cli/doctor/target-checks.js +25 -0
- package/dist/cli/doctor/target-checks.js.map +1 -0
- package/dist/cli/doctor/toolchain-parity.d.ts +63 -0
- package/dist/cli/doctor/toolchain-parity.js +154 -0
- package/dist/cli/doctor/toolchain-parity.js.map +1 -0
- package/dist/cli/doctor/types.d.ts +85 -1
- package/dist/cli/doctor/types.js +1 -1
- package/dist/cli/doctor/types.js.map +1 -1
- package/dist/cli/doctor/understanding-mode-env.d.ts +39 -0
- package/dist/cli/doctor/understanding-mode-env.js +83 -0
- package/dist/cli/doctor/understanding-mode-env.js.map +1 -0
- package/dist/cli/dry-run.js +32 -17
- package/dist/cli/dry-run.js.map +1 -1
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +1 -1
- package/dist/cli/explain.js.map +1 -1
- package/dist/cli/index.js +58 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/composer.js +36 -13
- package/dist/cli/init/composer.js.map +1 -1
- package/dist/cli/init/interactive.d.ts +7 -4
- package/dist/cli/init/interactive.js +79 -27
- package/dist/cli/init/interactive.js.map +1 -1
- package/dist/cli/init/profiles.d.ts +2 -2
- package/dist/cli/init/profiles.js +32 -1
- package/dist/cli/init/profiles.js.map +1 -1
- package/dist/cli/init/templates.d.ts +2 -1
- package/dist/cli/init/templates.js +130 -20
- package/dist/cli/init/templates.js.map +1 -1
- package/dist/cli/pack/approve-escape.js +69 -8
- package/dist/cli/pack/approve-escape.js.map +1 -1
- package/dist/cli/pack/hook-branch-protection.js +1 -1
- package/dist/cli/pack/hook-branch-protection.js.map +1 -1
- package/dist/cli/pack/hook-codex-pre-tool-use.js +27 -1
- package/dist/cli/pack/hook-codex-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-post-merge-gate.js +1 -1
- package/dist/cli/pack/hook-post-merge-gate.js.map +1 -1
- package/dist/cli/pack/hook-pre-tool-use.js +91 -4
- package/dist/cli/pack/hook-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/hook-solution-acceptance.js +19 -2
- package/dist/cli/pack/hook-solution-acceptance.js.map +1 -1
- package/dist/cli/pack/understanding-report-schema-hint.d.ts +13 -0
- package/dist/cli/pack/understanding-report-schema-hint.js +52 -3
- package/dist/cli/pack/understanding-report-schema-hint.js.map +1 -1
- package/dist/cli/pause/index.js +1 -1
- package/dist/cli/pause/index.js.map +1 -1
- package/dist/cli/policy/intercept.d.ts +148 -0
- package/dist/cli/policy/intercept.js +379 -48
- package/dist/cli/policy/intercept.js.map +1 -1
- package/dist/cli/session-start/index.d.ts +12 -3
- package/dist/cli/session-start/index.js +67 -11
- package/dist/cli/session-start/index.js.map +1 -1
- package/dist/cli/session-start/stale-base-check.d.ts +71 -0
- package/dist/cli/session-start/stale-base-check.js +379 -0
- package/dist/cli/session-start/stale-base-check.js.map +1 -0
- package/dist/cli/session-start/toolchain-parity.d.ts +142 -8
- package/dist/cli/session-start/toolchain-parity.js +244 -36
- package/dist/cli/session-start/toolchain-parity.js.map +1 -1
- package/dist/cli/smoke/assertions.d.ts +9 -2
- package/dist/cli/smoke/assertions.js +9 -2
- package/dist/cli/smoke/assertions.js.map +1 -1
- package/dist/cli/uninstall/index.js +18 -2
- package/dist/cli/uninstall/index.js.map +1 -1
- package/dist/cli/validate/checks.d.ts +3 -1
- package/dist/cli/validate/checks.js +298 -3
- package/dist/cli/validate/checks.js.map +1 -1
- package/dist/io/claude-mcp.d.ts +122 -1
- package/dist/io/claude-mcp.js +214 -12
- package/dist/io/claude-mcp.js.map +1 -1
- package/dist/io/duration.js.map +1 -0
- package/dist/io/expand-home.js.map +1 -0
- package/dist/io/extract.js.map +1 -0
- package/dist/io/harness-lock.js +1 -1
- package/dist/io/harness-lock.js.map +1 -1
- package/dist/{runtime → io}/ledger-record.d.ts +1 -1
- package/dist/io/ledger-record.js.map +1 -0
- package/dist/policies/index.d.ts +2 -2
- package/dist/policies/index.js +2 -2
- package/dist/policies/index.js.map +1 -1
- package/dist/policies/ledger-client.js +10 -6
- package/dist/policies/ledger-client.js.map +1 -1
- package/dist/policies/producers.js +1 -1
- package/dist/policies/producers.js.map +1 -1
- package/dist/policies/requires.js +2 -2
- package/dist/policies/requires.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection.js +28 -3
- package/dist/policy-packs/builtin/branch-protection.js.map +1 -1
- package/dist/policy-packs/builtin/post-merge-gate.js +45 -9
- package/dist/policy-packs/builtin/post-merge-gate.js.map +1 -1
- package/dist/policy-packs/builtin/solution-acceptance-runtime.d.ts +139 -8
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js +246 -12
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/solution-acceptance.js +17 -3
- package/dist/policy-packs/builtin/solution-acceptance.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.d.ts +25 -0
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js +89 -0
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/index.d.ts +13 -0
- package/dist/policy-packs/builtin/understanding-before-execution/index.js +39 -0
- package/dist/policy-packs/builtin/understanding-before-execution/index.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.d.ts +25 -0
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.js +56 -0
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.d.ts +20 -0
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js +79 -0
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/markers.d.ts +103 -0
- package/dist/policy-packs/builtin/understanding-before-execution/markers.js +203 -0
- package/dist/policy-packs/builtin/understanding-before-execution/markers.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.d.ts +177 -0
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js +309 -0
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.d.ts +106 -0
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js +209 -0
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.d.ts +78 -0
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js +185 -0
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +1 -536
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +9 -1095
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution.d.ts +109 -1
- package/dist/policy-packs/builtin/understanding-before-execution.js +183 -15
- package/dist/policy-packs/builtin/understanding-before-execution.js.map +1 -1
- package/dist/policy-packs/registry.d.ts +11 -0
- package/dist/policy-packs/registry.js +1 -1
- package/dist/policy-packs/registry.js.map +1 -1
- package/dist/policy-packs/runtime.d.ts +1 -1
- package/dist/policy-packs/runtime.js +10 -1
- package/dist/policy-packs/runtime.js.map +1 -1
- package/dist/runtime/agent-facing.js +1 -1
- package/dist/runtime/agent-facing.js.map +1 -1
- package/dist/runtime/bash-match-facts.d.ts +9 -7
- package/dist/runtime/bash-match-facts.js +9 -7
- package/dist/runtime/bash-match-facts.js.map +1 -1
- package/dist/runtime/bash-match-registry.d.ts +75 -38
- package/dist/runtime/bash-match-registry.js +279 -232
- package/dist/runtime/bash-match-registry.js.map +1 -1
- package/dist/runtime/bash-prefix-parse.d.ts +7 -0
- package/dist/runtime/bash-prefix-parse.js +205 -17
- package/dist/runtime/bash-prefix-parse.js.map +1 -1
- package/dist/runtime/command-normalize.d.ts +112 -0
- package/dist/runtime/command-normalize.js +411 -38
- package/dist/runtime/command-normalize.js.map +1 -1
- package/dist/runtime/hermetic-spawn-guard.js +6 -0
- package/dist/runtime/hermetic-spawn-guard.js.map +1 -1
- package/dist/runtime/index.d.ts +2 -2
- package/dist/runtime/index.js +2 -2
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/intercept.d.ts +78 -3
- package/dist/runtime/intercept.js +151 -39
- package/dist/runtime/intercept.js.map +1 -1
- package/dist/runtime/ledger-add.js +1 -1
- package/dist/runtime/ledger-add.js.map +1 -1
- package/dist/runtime/read-only-bash.js +303 -24
- package/dist/runtime/read-only-bash.js.map +1 -1
- package/dist/schema/doctor.d.ts +25 -0
- package/dist/schema/doctor.js +23 -0
- package/dist/schema/doctor.js.map +1 -0
- package/dist/schema/extract.js +1 -1
- package/dist/schema/extract.js.map +1 -1
- package/dist/schema/index.d.ts +76 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/requires.js +2 -2
- package/dist/schema/requires.js.map +1 -1
- package/dist/schema/risk.d.ts +7 -0
- package/dist/schema/risk.js +23 -0
- package/dist/schema/risk.js.map +1 -1
- package/dist/schema/stale-base-check.d.ts +18 -0
- package/dist/schema/stale-base-check.js +37 -0
- package/dist/schema/stale-base-check.js.map +1 -0
- package/dist/schema/toolchain-parity.d.ts +3 -0
- package/dist/schema/toolchain-parity.js +13 -0
- package/dist/schema/toolchain-parity.js.map +1 -1
- package/package.json +3 -2
- package/dist/policies/duration.js.map +0 -1
- package/dist/policies/extract.js.map +0 -1
- package/dist/runtime/expand-home.js.map +0 -1
- package/dist/runtime/ledger-record.js.map +0 -1
- /package/dist/{policies → io}/duration.d.ts +0 -0
- /package/dist/{policies → io}/duration.js +0 -0
- /package/dist/{runtime → io}/expand-home.d.ts +0 -0
- /package/dist/{runtime → io}/expand-home.js +0 -0
- /package/dist/{policies → io}/extract.d.ts +0 -0
- /package/dist/{policies → io}/extract.js +0 -0
- /package/dist/{runtime → io}/ledger-record.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-match-registry.js","sourceRoot":"","sources":["../../src/runtime/bash-match-registry.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,2DAA2D;AAC3D,
|
|
1
|
+
{"version":3,"file":"bash-match-registry.js","sourceRoot":"","sources":["../../src/runtime/bash-match-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,13 @@ export interface BashPrefix {
|
|
|
4
4
|
inlineEnv: Record<string, string>;
|
|
5
5
|
/** Path argument of a leading `cd <path> &&|;`, or null when none. */
|
|
6
6
|
cdTarget: string | null;
|
|
7
|
+
/**
|
|
8
|
+
* Branch argument of a leading `git [-C <path>] (switch|checkout)
|
|
9
|
+
* <branch> &&|;`, or null when none — including when the branch
|
|
10
|
+
* argument is a `-`-prefixed flag/file-restore form or an
|
|
11
|
+
* unresolvable `$VAR` (see module doc, form 3). Task 341e024b.
|
|
12
|
+
*/
|
|
13
|
+
branchTarget: string | null;
|
|
7
14
|
}
|
|
8
15
|
/**
|
|
9
16
|
* Parse leading inline-env and `cd <path>` idioms from a Bash command
|
|
@@ -1,35 +1,71 @@
|
|
|
1
1
|
// Risk Gate resolver input — Bash command-prefix parser.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// resolver when only `process.env` and the hook's starting cwd
|
|
5
|
-
// inspected:
|
|
3
|
+
// Three normal POSIX shell idioms slip past the production environment
|
|
4
|
+
// resolver when only `process.env` and the hook's starting cwd (and, for
|
|
5
|
+
// the branch, its current `.git/HEAD`) are inspected:
|
|
6
6
|
//
|
|
7
7
|
// DATABASE_URL=postgres://prod terraform destroy # inline env
|
|
8
8
|
// cd /repos/prod-infra && terraform destroy # working-dir hop
|
|
9
|
+
// git switch main && rm -rf node_modules && ... # branch hop
|
|
9
10
|
//
|
|
10
11
|
// The hook intercept sees Claude Code's process env and starting cwd, so
|
|
11
|
-
// `env_var_patterns` and `branch_patterns` miss
|
|
12
|
+
// `env_var_patterns` and `branch_patterns` miss all three signals and the
|
|
12
13
|
// gate silently treats a prod mutation as non-prod.
|
|
13
14
|
//
|
|
14
15
|
// This parser extracts the leading idioms from a Bash command string so
|
|
15
16
|
// the resolver layer can merge them into its inputs before
|
|
16
|
-
// `environments.resolvers[]` runs.
|
|
17
|
-
// (kept narrow on purpose, see follow-up scope in the originating
|
|
17
|
+
// `environments.resolvers[]` runs. Three POSIX forms are supported in v1
|
|
18
|
+
// (kept narrow on purpose, see follow-up scope in the originating tasks):
|
|
18
19
|
//
|
|
19
20
|
// 1. Inline env: leading `\w+=value` tokens. Values may be unquoted,
|
|
20
21
|
// single-quoted (literal), or double-quoted (literal, no $
|
|
21
22
|
// interpolation in v1).
|
|
22
23
|
// 2. cd prefix: a single leading `cd <path> [&&|;] ...`. Quoted paths
|
|
23
24
|
// supported. No `pushd`, no subshell `(cd X && ...)`, no `bash -c`.
|
|
25
|
+
// 3. git branch switch: a single leading `git [-C <path>]
|
|
26
|
+
// (switch|checkout) <branch> [&&|;] ...` (task 341e024b). The
|
|
27
|
+
// `<branch>` must be a plain, literal token, unquoted OR quoted
|
|
28
|
+
// (single- or double-quoted, surrounding quotes stripped — same
|
|
29
|
+
// quoted-literal handling `cd`'s path token gets, task 341e024b fix
|
|
30
|
+
// round 1: a quoted `"main"`/`'main'` used to read as the literal
|
|
31
|
+
// 6-character string `"main"` including the quote characters,
|
|
32
|
+
// which never matches a `branch_patterns` entry like `main` and so
|
|
33
|
+
// silently defeated the gate). A `-`-prefixed first argument (`-`,
|
|
34
|
+
// `--`, `-b`, ...; this is how `git checkout -- <path>`'s
|
|
35
|
+
// file-restore form is excluded) or an unquoted `$VAR`/`${VAR}`
|
|
36
|
+
// shell variable is left unresolved (`branchTarget: null`) rather
|
|
37
|
+
// than guessed; a DOUBLE-quoted token whose content contains a `$`
|
|
38
|
+
// is treated the same way (not guessed) since double quotes DO
|
|
39
|
+
// interpolate in real bash and this parser does not evaluate the
|
|
40
|
+
// shell environment — a single-quoted token is always taken
|
|
41
|
+
// literally, since single quotes never interpolate. The optional
|
|
42
|
+
// `-C <path>` is recognized so it does not block the match, but its
|
|
43
|
+
// value is discarded: the ONLY thing this idiom feeds the resolver
|
|
44
|
+
// is the branch name being switched TO (see
|
|
45
|
+
// `src/cli/policy/intercept.ts`'s merge, which is upgrade-only —
|
|
46
|
+
// unlike the `cd` merge below, a resolved branch target here can
|
|
47
|
+
// only push the resolved environment to something MORE dangerous,
|
|
48
|
+
// never less).
|
|
24
49
|
//
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
//
|
|
50
|
+
// LIMIT, stated so a maintainer does not over-trust this idiom's
|
|
51
|
+
// coverage: only the FIRST leading branch switch is captured. A
|
|
52
|
+
// chained `git switch dev && git switch main && rm ...` resolves
|
|
53
|
+
// `branchTarget` as `dev`, never `main` — multi-switch parsing
|
|
54
|
+
// (walking past the first `&&` to find a SECOND switch) is
|
|
55
|
+
// deliberately not built; it would widen the parser's surface
|
|
56
|
+
// toward the false-positive class task dbc6d303 already measured
|
|
57
|
+
// (branch-shaped tokens picked up from further into a command that
|
|
58
|
+
// is not actually a chained branch hop).
|
|
59
|
+
//
|
|
60
|
+
// The clauses may appear in any order relative to each other (`cd /x &&
|
|
61
|
+
// VAR=v cmd`, `VAR=v cd /x && cmd`, `cd /x && git switch main && cmd`,
|
|
62
|
+
// ...); the parser walks up to two passes before giving up.
|
|
28
63
|
//
|
|
29
64
|
// On a syntactically broken prefix (unterminated quote, missing `&&`
|
|
30
|
-
// after `cd <path>`) the parser falls
|
|
31
|
-
// prefix is not consumed, the
|
|
32
|
-
// hook cwd holds. There are no
|
|
65
|
+
// after `cd <path>` / a switch-or-checkout branch) the parser falls
|
|
66
|
+
// through cleanly: the malformed prefix is not consumed, the
|
|
67
|
+
// resolver-side fallback to process env / hook cwd holds. There are no
|
|
68
|
+
// thrown errors from this module.
|
|
33
69
|
//
|
|
34
70
|
// MEASUREMENT RULE (task 47297478): any claim about this parser's
|
|
35
71
|
// CD-TARGET extraction versus another build (lost or gained `cdTarget`
|
|
@@ -38,7 +74,7 @@
|
|
|
38
74
|
// ad-hoc corpora in the b093911d run reported "0 lost" while being
|
|
39
75
|
// structurally unable to report a loss; that tool's self-test rebuilds
|
|
40
76
|
// exactly that failure and demands the gate catch it. The tool does NOT
|
|
41
|
-
// measure `inlineEnv` extraction — claims about
|
|
77
|
+
// measure `inlineEnv` or `branchTarget` extraction — claims about those
|
|
42
78
|
// have no instrument yet and need their own measurement.
|
|
43
79
|
/**
|
|
44
80
|
* Parse leading inline-env and `cd <path>` idioms from a Bash command
|
|
@@ -47,13 +83,17 @@
|
|
|
47
83
|
*/
|
|
48
84
|
export function parseBashPrefix(command) {
|
|
49
85
|
if (typeof command !== "string" || command.length === 0) {
|
|
50
|
-
return { inlineEnv: {}, cdTarget: null };
|
|
86
|
+
return { inlineEnv: {}, cdTarget: null, branchTarget: null };
|
|
51
87
|
}
|
|
52
88
|
const inlineEnv = {};
|
|
53
89
|
let cdTarget = null;
|
|
90
|
+
let branchTarget = null;
|
|
54
91
|
let cursor = 0;
|
|
55
|
-
// Two passes catch `cd /x && VAR=v cmd
|
|
56
|
-
//
|
|
92
|
+
// Two passes catch e.g. `cd /x && VAR=v cmd`, `VAR=v cd /x && cmd`, and
|
|
93
|
+
// `cd /x && git switch main && cmd` (the last resolves fully within a
|
|
94
|
+
// single pass — cd then switch are tried back to back below — the
|
|
95
|
+
// second pass just confirms nothing more is left to consume). A third
|
|
96
|
+
// pass would only fire on a redundant prefix; bail to keep this
|
|
57
97
|
// bounded.
|
|
58
98
|
for (let pass = 0; pass < 2; pass++) {
|
|
59
99
|
const before = cursor;
|
|
@@ -65,10 +105,17 @@ export function parseBashPrefix(command) {
|
|
|
65
105
|
cursor = cd.next;
|
|
66
106
|
}
|
|
67
107
|
}
|
|
108
|
+
if (branchTarget === null) {
|
|
109
|
+
const sw = consumeLeadingGitSwitch(command, cursor);
|
|
110
|
+
if (sw !== null) {
|
|
111
|
+
branchTarget = sw.branch;
|
|
112
|
+
cursor = sw.next;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
68
115
|
if (cursor === before)
|
|
69
116
|
break;
|
|
70
117
|
}
|
|
71
|
-
return { inlineEnv, cdTarget };
|
|
118
|
+
return { inlineEnv, cdTarget, branchTarget };
|
|
72
119
|
}
|
|
73
120
|
const WS = /\s/;
|
|
74
121
|
const VAR_START = /[A-Za-z_]/;
|
|
@@ -192,4 +239,145 @@ function consumeLeadingCd(s, start) {
|
|
|
192
239
|
}
|
|
193
240
|
return null;
|
|
194
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Match a literal keyword at `i` on a word boundary — immediately
|
|
244
|
+
* followed by whitespace or end-of-string, never a partial-word match
|
|
245
|
+
* (`"git"` must not match inside `"github"`, `"switch"` must not match
|
|
246
|
+
* inside `"switching"`). Returns the cursor just past the keyword on
|
|
247
|
+
* success, or null.
|
|
248
|
+
*/
|
|
249
|
+
function matchKeyword(s, i, word) {
|
|
250
|
+
if (s.slice(i, i + word.length) !== word)
|
|
251
|
+
return null;
|
|
252
|
+
const after = i + word.length;
|
|
253
|
+
if (after < s.length && !WS.test(s[after]))
|
|
254
|
+
return null;
|
|
255
|
+
return after;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Skip a single path token (quoted or unquoted) starting at `i`.
|
|
259
|
+
* Returns the cursor just past it, or null on an unterminated quote or
|
|
260
|
+
* an empty token. Deliberately a separate copy of `consumeLeadingCd`'s
|
|
261
|
+
* path-reading rules rather than a shared helper: this function's only
|
|
262
|
+
* caller (`consumeLeadingGitSwitch`'s `-C <path>` skip) discards the
|
|
263
|
+
* value, `consumeLeadingCd`'s does not, and factoring them together was
|
|
264
|
+
* judged not worth the risk to `consumeLeadingCd`'s existing,
|
|
265
|
+
* separately-measured behavior for a value nothing here uses.
|
|
266
|
+
*/
|
|
267
|
+
function skipPathToken(s, i) {
|
|
268
|
+
if (s[i] === "'") {
|
|
269
|
+
const end = s.indexOf("'", i + 1);
|
|
270
|
+
return end < 0 ? null : end + 1;
|
|
271
|
+
}
|
|
272
|
+
if (s[i] === '"') {
|
|
273
|
+
const end = s.indexOf('"', i + 1);
|
|
274
|
+
return end < 0 ? null : end + 1;
|
|
275
|
+
}
|
|
276
|
+
const start = i;
|
|
277
|
+
while (i < s.length && !WS.test(s[i]) && s[i] !== ";" && s[i] !== "&")
|
|
278
|
+
i++;
|
|
279
|
+
return i > start ? i : null;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Consume a single leading `git [-C <path>] (switch|checkout) <branch>
|
|
283
|
+
* [&&|;]` clause (task 341e024b). Returns `{branch, next}` on success,
|
|
284
|
+
* or null when the prefix does not match — including these deliberate
|
|
285
|
+
* exclusions, which return null WITHOUT guessing a branch:
|
|
286
|
+
*
|
|
287
|
+
* - A `-`-prefixed first argument after `switch`/`checkout` (`-`,
|
|
288
|
+
* `--`, `-b`, `-c`, `-C`, `--force`, ...). This specifically covers
|
|
289
|
+
* `git checkout -- <path>` (git's file-restore form — no branch is
|
|
290
|
+
* switched at all) as one case of the general rule "a flag is not a
|
|
291
|
+
* branch name", rather than special-casing `--` alone.
|
|
292
|
+
* - An unquoted `$VAR` / `${VAR}` first argument: a shell variable,
|
|
293
|
+
* not a literal branch name. Resolving it would require evaluating
|
|
294
|
+
* the shell environment, which this parser does not do (see module
|
|
295
|
+
* doc). A DOUBLE-quoted token whose content contains a `$` is
|
|
296
|
+
* excluded the same way (double quotes interpolate in real bash); a
|
|
297
|
+
* single-quoted token is never excluded on this basis (single
|
|
298
|
+
* quotes never interpolate, so its content is always the literal
|
|
299
|
+
* branch name).
|
|
300
|
+
* - A missing trailing `&&` / `;` separator, mirroring
|
|
301
|
+
* `consumeLeadingCd`'s identical rule: `git switch main` alone, with
|
|
302
|
+
* nothing following, has no "rest of command" for the branch
|
|
303
|
+
* candidate to apply to.
|
|
304
|
+
*
|
|
305
|
+
* The branch token itself is read as a single word up to the next
|
|
306
|
+
* whitespace/`;`/`&` (unquoted — this covers slashed names like
|
|
307
|
+
* `task/foo`, `release/1.2`, since branch names cannot contain
|
|
308
|
+
* whitespace), OR, when the token opens with `'` or `"`, as a quoted
|
|
309
|
+
* literal with the surrounding quotes stripped (task 341e024b fix round
|
|
310
|
+
* 1) — mirroring `consumeLeadingCd`'s / `skipPathToken`'s quoted-token
|
|
311
|
+
* handling, since a whitespace-free branch name can still be quoted by
|
|
312
|
+
* the operator (`git switch "main"`), and an unstripped quote character
|
|
313
|
+
* left inside the extracted token would never match a plain
|
|
314
|
+
* `branch_patterns` entry.
|
|
315
|
+
*
|
|
316
|
+
* The optional leading `-C <path>` is recognized so it does not block
|
|
317
|
+
* the match, but its value is discarded — see the module doc's form 3
|
|
318
|
+
* for why only the branch name matters to the caller.
|
|
319
|
+
*/
|
|
320
|
+
function consumeLeadingGitSwitch(s, start) {
|
|
321
|
+
let i = skipWs(s, start);
|
|
322
|
+
const afterGit = matchKeyword(s, i, "git");
|
|
323
|
+
if (afterGit === null)
|
|
324
|
+
return null;
|
|
325
|
+
i = skipWs(s, afterGit);
|
|
326
|
+
const afterDashC = matchKeyword(s, i, "-C");
|
|
327
|
+
if (afterDashC !== null) {
|
|
328
|
+
i = skipWs(s, afterDashC);
|
|
329
|
+
const skipped = skipPathToken(s, i);
|
|
330
|
+
if (skipped === null)
|
|
331
|
+
return null;
|
|
332
|
+
i = skipWs(s, skipped);
|
|
333
|
+
}
|
|
334
|
+
let afterVerb = matchKeyword(s, i, "switch");
|
|
335
|
+
if (afterVerb === null)
|
|
336
|
+
afterVerb = matchKeyword(s, i, "checkout");
|
|
337
|
+
if (afterVerb === null)
|
|
338
|
+
return null;
|
|
339
|
+
i = skipWs(s, afterVerb);
|
|
340
|
+
if (i >= s.length)
|
|
341
|
+
return null;
|
|
342
|
+
// A `-`-prefixed or unquoted `$`-prefixed first argument is not a
|
|
343
|
+
// plain branch name — do not guess (see doc comment above).
|
|
344
|
+
if (s[i] === "-" || s[i] === "$")
|
|
345
|
+
return null;
|
|
346
|
+
let branch;
|
|
347
|
+
if (s[i] === "'" || s[i] === '"') {
|
|
348
|
+
// Quoted branch literal (task 341e024b fix round 1): strip the
|
|
349
|
+
// surrounding quotes, mirroring `consumeLeadingCd`'s path handling.
|
|
350
|
+
// A DOUBLE-quoted token containing `$` is left unresolved (real
|
|
351
|
+
// bash interpolates inside double quotes; this parser does not
|
|
352
|
+
// evaluate the shell environment) — a SINGLE-quoted token is always
|
|
353
|
+
// literal, since single quotes never interpolate.
|
|
354
|
+
const quote = s[i];
|
|
355
|
+
const end = s.indexOf(quote, i + 1);
|
|
356
|
+
if (end < 0)
|
|
357
|
+
return null;
|
|
358
|
+
const content = s.slice(i + 1, end);
|
|
359
|
+
if (quote === '"' && content.includes("$"))
|
|
360
|
+
return null;
|
|
361
|
+
if (content.length === 0)
|
|
362
|
+
return null;
|
|
363
|
+
branch = content;
|
|
364
|
+
i = end + 1;
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
const branchStart = i;
|
|
368
|
+
while (i < s.length && !WS.test(s[i]) && s[i] !== ";" && s[i] !== "&")
|
|
369
|
+
i++;
|
|
370
|
+
branch = s.slice(branchStart, i);
|
|
371
|
+
if (branch.length === 0)
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
i = skipWs(s, i);
|
|
375
|
+
if (s[i] === "&" && s[i + 1] === "&") {
|
|
376
|
+
return { branch, next: i + 2 };
|
|
377
|
+
}
|
|
378
|
+
if (s[i] === ";") {
|
|
379
|
+
return { branch, next: i + 1 };
|
|
380
|
+
}
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
195
383
|
//# sourceMappingURL=bash-prefix-parse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bash-prefix-parse.js","sourceRoot":"","sources":["../../src/runtime/bash-prefix-parse.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"bash-prefix-parse.js","sourceRoot":"","sources":["../../src/runtime/bash-prefix-parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -403,3 +403,115 @@ export interface AmpAwareNormalizedCommand {
|
|
|
403
403
|
* common (already-matched) path.
|
|
404
404
|
*/
|
|
405
405
|
export declare function normalizeCommandAmpAware(command: string): AmpAwareNormalizedCommand;
|
|
406
|
+
/**
|
|
407
|
+
* Return type of `normalizeCommandQuoteAware` — same shape and same
|
|
408
|
+
* reasoning as `AmpAwareNormalizedCommand` above: no `targetDir`/
|
|
409
|
+
* `targetBase`, so no consumer can read one extracted under quote-aware
|
|
410
|
+
* segmentation by mistake. Unlike the amp-aware pass, THIS alphabet is
|
|
411
|
+
* exactly `BOUNDARY_RE`'s own (no new boundary characters, only new
|
|
412
|
+
* quote-tracking around the existing ones), so the reason for omitting
|
|
413
|
+
* these fields is different: `computeSegmentTarget` / `classifyCdSegment`
|
|
414
|
+
* / `canonicalizeSegment` all assume `tokenizeWithOffsets`'s whitespace
|
|
415
|
+
* tokenisation lines up with the segment boundaries `findNextBoundary`
|
|
416
|
+
* produces, which is still true for the boundary ALPHABET itself but is
|
|
417
|
+
* now also entangled with `consumeAssignment`'s OWN, separate quote
|
|
418
|
+
* tracking (per-token, inside one segment) once segments can be wider and
|
|
419
|
+
* carry an unbalanced quote at their edges in new ways this task's own
|
|
420
|
+
* corpus does not exhaustively characterise for `targetDir` purposes —
|
|
421
|
+
* left unexplored rather than guessed at, mirroring the amp-aware pass's
|
|
422
|
+
* own "not this task's job" scoping.
|
|
423
|
+
*/
|
|
424
|
+
export interface QuoteAwareNormalizedCommand {
|
|
425
|
+
/** Same contract as `NormalizedCommand.normalized`, under quote-aware segmentation. */
|
|
426
|
+
normalized: string;
|
|
427
|
+
/** Same contract as `NormalizedCommand.truncated`. */
|
|
428
|
+
truncated: boolean;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Quote-aware THIRD normalisation pass (task cf3dff51). Segments the
|
|
432
|
+
* command under `BOUNDARY_RE`'s own alphabet — same characters as the
|
|
433
|
+
* primary pass, no widening — but tracks single/double-quote state while
|
|
434
|
+
* scanning (`findNextBoundaryQuoteAware` below) so a boundary character
|
|
435
|
+
* sitting INSIDE a quoted assignment value is no longer treated as a real
|
|
436
|
+
* segment split. Closes the gap the module header's "DELIBERATELY NOT
|
|
437
|
+
* SUPPORTED" list and `BOUNDARY_RE`'s own comment both name: `VAR='a; b'
|
|
438
|
+
* git push` (task 13e55484's pinned residual) — `BOUNDARY_RE` used to cut
|
|
439
|
+
* the segment at the `;`, landing squarely between the two halves of one
|
|
440
|
+
* quoted value, so neither resulting piece carried a recognisable
|
|
441
|
+
* invocation and `consumeAssignment`'s own multi-token quote continuation
|
|
442
|
+
* (built for exactly this shape) never got the chance to run: it operates
|
|
443
|
+
* AFTER segmentation, on tokens WITHIN one segment, and the quoted value
|
|
444
|
+
* was never in one segment to begin with. Once quote-aware segmentation
|
|
445
|
+
* keeps the value whole, `consumeAssignment` needs no changes at all — it
|
|
446
|
+
* already reconstructs a multi-token quoted value correctly; this pass
|
|
447
|
+
* only fixes what gets handed to it as ONE segment in the first place.
|
|
448
|
+
*
|
|
449
|
+
* BUILT AS A NEW, INDEPENDENT PASS RATHER THAN AN IN-PLACE EDIT OF
|
|
450
|
+
* `BOUNDARY_RE` / `segmentAndCanonicalize` — this is the module header's
|
|
451
|
+
* HALT CRITERION, restated here at the point it governs: quote-aware
|
|
452
|
+
* segmentation can MERGE a segment the primary pass currently splits, and
|
|
453
|
+
* that merge cuts in BOTH directions — it can turn a previously-missed
|
|
454
|
+
* bypass into a match (the fix), but it can just as easily turn a
|
|
455
|
+
* previously-accepted, ALREADY-WIRED over-block into a miss (a
|
|
456
|
+
* regression). Measured, not hypothetical: `tests/runtime/command-
|
|
457
|
+
* normalize.test.ts`'s "accepted over-block: a quoted assignment inside
|
|
458
|
+
* TEXT after a boundary char now matches" pin — `echo "a; VAR='x y' git
|
|
459
|
+
* push"` — matches via `normalizeCommand` TODAY only because `BOUNDARY_RE`
|
|
460
|
+
* splits it at the `;`, landing `VAR='x y' git push` at a segment start
|
|
461
|
+
* where the assignment continuation turns it into a match. An in-place
|
|
462
|
+
* quote-aware edit of THAT pass would un-split it back into the outer
|
|
463
|
+
* `echo "..."` segment — not itself a recognised invocation — and flip
|
|
464
|
+
* that pin to a lost match, in violation of the raw-OR-normalised-OR-amp-
|
|
465
|
+
* aware-OR-(this) never-lose-a-match discipline every other pass in this
|
|
466
|
+
* module already honours. Building this as a SEPARATE pass instead means
|
|
467
|
+
* `normalizeCommand`'s own segmentation, and every test resting on it —
|
|
468
|
+
* including that exact one — is untouched by this task; see this file's
|
|
469
|
+
* own test suite for the differential proof (every case the first three
|
|
470
|
+
* arms already matched still matches, by construction, because none of
|
|
471
|
+
* those three arms' code changed at all).
|
|
472
|
+
*
|
|
473
|
+
* WIRED to `policyMatchesEvent` (`src/runtime/intercept.ts`) as its
|
|
474
|
+
* FOURTH arm — same shape as `normalizeCommandAmpAware`'s own third-arm
|
|
475
|
+
* wiring (task aabbad63): consulted only after the raw command,
|
|
476
|
+
* `normalizedCommand`, and the amp-aware pass have all missed, via a
|
|
477
|
+
* memoised thunk (`InterceptOptions.quoteNormalizedCommandThunk`,
|
|
478
|
+
* `src/cli/policy/intercept.ts`'s `quoteNormalizedCommandThunk`) so the
|
|
479
|
+
* segmentation cost is paid at most once per event, on the common
|
|
480
|
+
* (already-matched) path it costs nothing at all. Wiring landed in a
|
|
481
|
+
* SECOND round of this task, after the orchestrator extended the first
|
|
482
|
+
* round's file scope specifically for this one wiring point — the first
|
|
483
|
+
* round shipped this function fully built and tested but genuinely
|
|
484
|
+
* unwired (an inert security fix, called out explicitly as the wrong
|
|
485
|
+
* shipped state in that round's own report) — `src/cli/dry-run.ts`'s own,
|
|
486
|
+
* independently-copied matcher was deliberately NOT extended in the same
|
|
487
|
+
* round (out of the extended scope too) and stayed a named residual until
|
|
488
|
+
* task f561e44c closed it by adding the same fourth OR-arm there too — see
|
|
489
|
+
* that file's own comment.
|
|
490
|
+
*
|
|
491
|
+
* THIS PASS'S OWN OVER-BLOCK SURFACE is measured and named in the test
|
|
492
|
+
* file rather than assumed — and the measurement CORRECTS an earlier,
|
|
493
|
+
* pre-measurement guess that used to sit in this comment: it does NOT
|
|
494
|
+
* reproduce the `echo "a; VAR='x y' git push"` accepted over-block named
|
|
495
|
+
* above. Quote-aware merging keeps that whole `echo "..."` segment
|
|
496
|
+
* together, starting with the unrecognised head token `echo`, so this
|
|
497
|
+
* function's output for it is byte-identical to the raw input
|
|
498
|
+
* (`normalizeCommand`'s OWN, separate, unchanged-by-this-task match for
|
|
499
|
+
* that same string is unaffected either way). Measured against a broader
|
|
500
|
+
* adversarial probe, both at this function's own level and again at
|
|
501
|
+
* `policyMatchesEvent`'s wired level (a bash-shim-verified corpus of
|
|
502
|
+
* chained/prefixed/subshell-wrapped genuine invocations plus candidate
|
|
503
|
+
* over-block shapes — entirely quoted `echo`/`printf` arguments that only
|
|
504
|
+
* PRINT the spelling): every additional match this pass adds beyond raw /
|
|
505
|
+
* `normalizeCommand` / `normalizeCommandAmpAware` is a TRUE positive (a
|
|
506
|
+
* real invocation bash would actually execute); no NEW over-block class
|
|
507
|
+
* distinct from `consumeAssignment`'s own, already-reviewed precision
|
|
508
|
+
* limits was found. This function shares `canonicalizeSegment` /
|
|
509
|
+
* `consumeAssignment` completely unchanged with the other passes — only
|
|
510
|
+
* the segmentation boundary decision differs — which is also the
|
|
511
|
+
* structural reason a longer (merged) segment can only REVEAL a match
|
|
512
|
+
* those functions would already accept from a shorter view, never
|
|
513
|
+
* fabricate a new kind of one; see the module header's cf3dff51 UPDATE
|
|
514
|
+
* paragraph for the fuller statement of this reasoning and its
|
|
515
|
+
* "not a formal proof" caveat.
|
|
516
|
+
*/
|
|
517
|
+
export declare function normalizeCommandQuoteAware(command: string): QuoteAwareNormalizedCommand;
|