pm-ops 2026.10.6 → 2026.10.13

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.
@@ -0,0 +1,77 @@
1
+ import { defaultExec, type CompletenessFetcher } from "./release-completeness.ts";
2
+ import type { VerifierResult } from "./shell-scan.ts";
3
+ /** Process boundary shared by the real adapter and recorded command fixtures. */
4
+ export type RepairExecutor = typeof defaultExec;
5
+ /** Verified registry identity and provenance commit for one immutable version. */
6
+ export interface NpmEvidence {
7
+ /** Registry package name. */
8
+ name: string;
9
+ /** Registry version coordinate. */
10
+ version: string;
11
+ /** Registry gitHead, required to match the signed commit. */
12
+ gitHead: string;
13
+ /** Signed source repository slug. */
14
+ repository: string;
15
+ /** Signed source commit, extracted only after npm verifies the bundle. */
16
+ commit: string;
17
+ }
18
+ /** I/O contract for evidence and conditional writes; deliberately no publish API. */
19
+ export interface RepairClient {
20
+ /** Verify npm provenance and read the coordinate's metadata. */
21
+ npmEvidence(name: string, version: string): NpmEvidence;
22
+ /** Read the actual remote tag's peeled commit, or null on proven absence. */
23
+ remoteTag(root: string, tag: string): string | null;
24
+ /** Read an immutable local commit's object or committed file. */
25
+ git(root: string, args: string[]): string;
26
+ /** Create only an absent remote tag at the attested commit. */
27
+ createTag(slug: string, tag: string, commit: string): void;
28
+ /** Create only a missing release with committed changelog notes. */
29
+ createRelease(slug: string, tag: string, notes: string): void;
30
+ }
31
+ /** The subset of a verified SLSA v1 statement used to bind the source commit. */
32
+ export interface ProvenanceStatement {
33
+ /** Provenance schema discriminator. */
34
+ predicateType: string;
35
+ /** Signed artifacts; repair requires exactly the coordinate's npm tarball. */
36
+ subject?: {
37
+ name?: string;
38
+ digest?: {
39
+ sha512?: string;
40
+ };
41
+ }[];
42
+ /** Signed build definition with source dependencies. */
43
+ predicate: {
44
+ buildDefinition: {
45
+ /** The signed workflow invocation; only the approved release workflow on main may authorize repair. */
46
+ externalParameters?: {
47
+ workflow?: {
48
+ path?: string;
49
+ ref?: string;
50
+ repository?: string;
51
+ };
52
+ };
53
+ resolvedDependencies: {
54
+ uri: string;
55
+ digest: {
56
+ gitCommit: string;
57
+ };
58
+ }[];
59
+ };
60
+ };
61
+ }
62
+ /**
63
+ * Extract a unique source identity from npm's successful signature-audit output.
64
+ * Raw registry metadata or a merely present attestation is never sufficient.
65
+ */
66
+ export declare function evidenceFromAudit(name: string, version: string, gitHead: string, output: string, integrity: string): NpmEvidence;
67
+ /** Build the live adapter. All npm operations download/read; scripts are disabled. */
68
+ export declare function makeRepairClient(exec?: RepairExecutor): RepairClient;
69
+ /** Extract exactly one nonempty version section from an immutable changelog. */
70
+ export declare function committedReleaseNotes(changelog: string, version: string): string;
71
+ /**
72
+ * Preflight all incomplete triples before writing. Never infer absence from a
73
+ * failed read, move an existing tag, overwrite a release, or publish to npm.
74
+ * Re-read remote state before each write and after uncertain write outcomes.
75
+ */
76
+ export declare function repairReleaseCompleteness(root: string, fetcher: CompletenessFetcher, client: RepairClient): VerifierResult;
77
+ //# sourceMappingURL=release-repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-repair.d.ts","sourceRoot":"","sources":["../release-repair.ts"],"names":[],"mappings":"AAQA,OAAO,EACqB,WAAW,EACY,KAAK,mBAAmB,EAC1E,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,OAAO,WAAW,CAAC;AAEhD,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IACxD,6EAA6E;IAC7E,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpD,iEAAiE;IACjE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1C,+DAA+D;IAC/D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,oEAAoE;IACpE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/D;AAED,iFAAiF;AACjF,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,EAAE,CAAC;IAC5D,wDAAwD;IACxD,SAAS,EAAE;QACT,eAAe,EAAE;YACf,uGAAuG;YACvG,kBAAkB,CAAC,EAAE;gBAAE,QAAQ,CAAC,EAAE;oBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;oBAAC,GAAG,CAAC,EAAE,MAAM,CAAC;oBAAC,UAAU,CAAC,EAAE,MAAM,CAAA;iBAAE,CAAA;aAAE,CAAC;YACzF,oBAAoB,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE;oBAAE,SAAS,EAAE,MAAM,CAAA;iBAAE,CAAA;aAAE,EAAE,CAAC;SACxE,CAAC;KACH,CAAC;CACH;AA8BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAkChI;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,cAA4B,GAAG,YAAY,CA4CjF;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAYhF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,YAAY,GAAG,cAAc,CAiE1H"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Conservative recovery of missing release tags and GitHub Releases. npm is
3
+ * read-only: only successfully verified provenance authorizes a repair.
4
+ * @packageDocumentation
5
+ */
6
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
9
+ import { auditReleaseCompleteness, defaultExec, isReleaseTag, npmVersionToTag, repoSlugFromUrl, repositoryUrl, tagToNpmVersion, } from "./release-completeness.js";
10
+ /** The only workflow file whose npm provenance may authorize tag and release repair. */
11
+ const RELEASE_WORKFLOW_PATH = ".github/workflows/release.yml";
12
+ /** The only ref whose release builds may authorize repair. */
13
+ const RELEASE_WORKFLOW_REF = "refs/heads/main";
14
+ /** The package URL npm provenance uses as the subject name; scoped names encode the leading `@`. */
15
+ function npmPurl(name, version) {
16
+ return `pkg:npm/${name.startsWith("@") ? `%40${name.slice(1)}` : name}@${version}`;
17
+ }
18
+ /** Decode a registry `sha512-<base64>` integrity to the hex digest provenance subjects carry; anything else cannot match. */
19
+ function integrityHex(integrity) {
20
+ return integrity.startsWith("sha512-") ? Buffer.from(integrity.slice(7), "base64").toString("hex") : null;
21
+ }
22
+ /**
23
+ * Extract a unique source identity from npm's successful signature-audit output.
24
+ * Raw registry metadata or a merely present attestation is never sufficient.
25
+ */
26
+ export function evidenceFromAudit(name, version, gitHead, output, integrity) {
27
+ const report = JSON.parse(output);
28
+ if (!Array.isArray(report.invalid) || report.invalid.length !== 0 || !Array.isArray(report.verified)) {
29
+ throw new Error("npm signature audit is incomplete or contains invalid evidence");
30
+ }
31
+ const entries = report.verified.filter((entry) => entry.name === name && entry.version === version && entry.registry === "https://registry.npmjs.org/");
32
+ if (entries.length !== 1)
33
+ throw new Error("npm did not verify exactly one matching package coordinate");
34
+ const sources = [];
35
+ for (const attestation of entries[0].attestationBundles) {
36
+ if (attestation.predicateType !== "https://slsa.dev/provenance/v1")
37
+ continue;
38
+ const statement = JSON.parse(Buffer.from(attestation.bundle.dsseEnvelope.payload, "base64").toString("utf8"));
39
+ if (statement.predicateType !== attestation.predicateType)
40
+ throw new Error("provenance schema mismatch");
41
+ // The signed subject must be exactly this coordinate's tarball, not merely an attestation npm accepted.
42
+ if (statement.subject?.length !== 1 || statement.subject[0].name !== npmPurl(name, version)
43
+ || statement.subject[0].digest?.sha512 !== integrityHex(integrity)) {
44
+ throw new Error("provenance subject does not match the package coordinate and tarball digest");
45
+ }
46
+ const workflow = statement.predicate.buildDefinition.externalParameters?.workflow;
47
+ if (workflow?.path !== RELEASE_WORKFLOW_PATH || workflow.ref !== RELEASE_WORKFLOW_REF || typeof workflow.repository !== "string") {
48
+ throw new Error("provenance was not built by the approved release workflow and ref");
49
+ }
50
+ const workflowRepository = repoSlugFromUrl(workflow.repository);
51
+ for (const dependency of statement.predicate.buildDefinition.resolvedDependencies) {
52
+ const repository = repoSlugFromUrl(dependency.uri.replace(/^git\+/, "").split("@")[0]);
53
+ const commit = dependency.digest.gitCommit;
54
+ if (!repository || !/^[a-f0-9]{40}$/.test(commit))
55
+ throw new Error("unrecognized signed source identity");
56
+ if (repository !== workflowRepository)
57
+ throw new Error("signed workflow repository differs from the signed source repository");
58
+ sources.push({ repository, commit });
59
+ }
60
+ }
61
+ if (sources.length !== 1 || !/^[a-f0-9]{40}$/.test(gitHead) || sources[0].commit !== gitHead) {
62
+ throw new Error("npm gitHead does not match unique verified provenance");
63
+ }
64
+ return { name, version, gitHead, ...sources[0] };
65
+ }
66
+ /** Build the live adapter. All npm operations download/read; scripts are disabled. */
67
+ export function makeRepairClient(exec = defaultExec) {
68
+ return {
69
+ /** Verify the exact registry coordinate in a disposable script-disabled install. */
70
+ npmEvidence(name, version) {
71
+ const metadata = JSON.parse(exec("npm", ["view", `${name}@${version}`, "--json", "--prefer-online", "--registry=https://registry.npmjs.org/"], {}));
72
+ if (metadata.name !== name || metadata.version !== version)
73
+ throw new Error("registry coordinate mismatch");
74
+ const scratch = mkdtempSync(join(tmpdir(), "pm-ops-provenance-"));
75
+ try {
76
+ writeFileSync(join(scratch, "package.json"), JSON.stringify({ name: "release-evidence", version: "1.0.0", private: true }));
77
+ exec("npm", ["install", `${name}@${version}`, "--ignore-scripts", "--no-audit", "--no-fund", "--legacy-peer-deps", "--registry=https://registry.npmjs.org/"], { cwd: scratch });
78
+ const output = exec("npm", ["audit", "signatures", "--json", "--include-attestations", "--registry=https://registry.npmjs.org/"], { cwd: scratch });
79
+ return evidenceFromAudit(name, version, metadata.gitHead, output, metadata.dist?.integrity ?? "");
80
+ }
81
+ finally {
82
+ rmSync(scratch, { recursive: true, force: true });
83
+ }
84
+ },
85
+ /** Inspect only the requested remote ref and its annotated-tag peel. */
86
+ remoteTag(root, tag) {
87
+ // Validate at the call site: only release tags ever reach git's argv.
88
+ if (!isReleaseTag(tag))
89
+ throw new Error(`unsupported release coordinate ${tag}`);
90
+ const output = exec("git", ["ls-remote", "--tags", "origin", `refs/tags/${tag}`, `refs/tags/${tag}^{}`], { cwd: root }).trim();
91
+ if (!output)
92
+ return null;
93
+ const refs = output.split("\n").map((line) => line.split(/\s+/));
94
+ if (refs.some(([sha, ref]) => !/^[a-f0-9]{40}$/.test(sha) || (ref !== `refs/tags/${tag}` && ref !== `refs/tags/${tag}^{}`)))
95
+ throw new Error("unreadable remote tag");
96
+ return (refs.find(([, ref]) => ref === `refs/tags/${tag}^{}`) ?? refs[0])[0];
97
+ },
98
+ /** Read commit objects and committed files through the injected git boundary. */
99
+ git(root, args) { return exec("git", args, { cwd: root }).trim(); },
100
+ /** Create an absent remote ref without force-updating existing refs. */
101
+ createTag(slug, tag, commit) {
102
+ exec("gh", ["api", `repos/${slug}/git/refs`, "--method", "POST", "-f", `ref=refs/tags/${tag}`, "-f", `sha=${commit}`], {});
103
+ },
104
+ /** Create a release from verified notes without changing the latest designation. */
105
+ createRelease(slug, tag, notes) {
106
+ const scratch = mkdtempSync(join(tmpdir(), "pm-ops-release-notes-"));
107
+ try {
108
+ const notesFile = join(scratch, "notes.md");
109
+ writeFileSync(notesFile, notes);
110
+ exec("gh", ["release", "create", tag, "--repo", slug, "--verify-tag", "--latest=false", "--title", `${slug.split("/")[1]} ${tag}`, "--notes-file", notesFile], {});
111
+ }
112
+ finally {
113
+ rmSync(scratch, { recursive: true, force: true });
114
+ }
115
+ },
116
+ };
117
+ }
118
+ /** Extract exactly one nonempty version section from an immutable changelog. */
119
+ export function committedReleaseNotes(changelog, version) {
120
+ const sections = changelog.split(/^## /m).slice(1);
121
+ const matches = sections.filter((section) => {
122
+ // A single-character separator keeps the match linear on long runs of spaces.
123
+ const heading = section.split("\n")[0];
124
+ const separator = heading.search(/\s-\s/);
125
+ return (separator === -1 ? heading : heading.slice(0, separator)).trim() === version;
126
+ });
127
+ if (matches.length !== 1)
128
+ throw new Error(`committed changelog must have exactly one section for ${version}`);
129
+ const body = matches[0].split("\n").slice(1).join("\n").trim();
130
+ if (!body)
131
+ throw new Error(`committed changelog section for ${version} is empty`);
132
+ return body + "\n";
133
+ }
134
+ /**
135
+ * Preflight all incomplete triples before writing. Never infer absence from a
136
+ * failed read, move an existing tag, overwrite a release, or publish to npm.
137
+ * Re-read remote state before each write and after uncertain write outcomes.
138
+ */
139
+ export function repairReleaseCompleteness(root, fetcher, client) {
140
+ const notes = [];
141
+ try {
142
+ const manifest = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
143
+ const name = manifest.name;
144
+ const slug = repoSlugFromUrl(fetcher.remoteUrl(root));
145
+ if (!name || !slug || repoSlugFromUrl(repositoryUrl(manifest.repository)) !== slug)
146
+ throw new Error("package and origin repository identity mismatch");
147
+ const tags = fetcher.tags(root).filter(isReleaseTag);
148
+ const versions = fetcher.npmVersions(name);
149
+ const releases = fetcher.githubReleases(slug);
150
+ const candidates = [...new Set([...tags, ...versions.map(npmVersionToTag), ...releases])];
151
+ const plans = [];
152
+ for (const tag of candidates) {
153
+ if (!isReleaseTag(tag))
154
+ throw new Error(`unsupported release coordinate ${tag}`);
155
+ const version = tagToNpmVersion(tag);
156
+ if (!versions.includes(version))
157
+ throw new Error(`${tag} has no published npm version; publishing is never a repair`);
158
+ const remote = client.remoteTag(root, tag);
159
+ const exists = fetcher.githubReleaseForTag(slug, tag);
160
+ if (remote !== null && tags.includes(tag)) {
161
+ const local = client.git(root, ["rev-parse", `refs/tags/${tag}^{commit}`]);
162
+ if (local !== remote)
163
+ throw new Error(`local and remote tag mismatch for ${tag}`);
164
+ }
165
+ if (remote !== null && exists)
166
+ continue;
167
+ const evidence = client.npmEvidence(name, version);
168
+ if (evidence.name !== name || evidence.version !== version || evidence.repository !== slug || !/^[a-f0-9]{40}$/.test(evidence.commit) || evidence.gitHead !== evidence.commit)
169
+ throw new Error(`npm evidence mismatch for ${tag}`);
170
+ if (remote !== null && remote !== evidence.commit)
171
+ throw new Error(`tag and attested gitHead mismatch for ${tag}`);
172
+ if (tags.includes(tag) && client.git(root, ["rev-parse", `refs/tags/${tag}^{commit}`]) !== evidence.commit)
173
+ throw new Error(`local tag and attested gitHead mismatch for ${tag}`);
174
+ const commit = client.git(root, ["rev-parse", `${evidence.commit}^{commit}`]);
175
+ if (commit !== evidence.commit)
176
+ throw new Error(`attested commit unavailable for ${tag}`);
177
+ const committed = JSON.parse(client.git(root, ["show", `${commit}:package.json`]));
178
+ if (committed.name !== name || committed.version !== version || repoSlugFromUrl(repositoryUrl(committed.repository)) !== slug)
179
+ throw new Error(`committed package identity mismatch for ${tag}`);
180
+ const body = committedReleaseNotes(client.git(root, ["show", `${commit}:CHANGELOG.md`]), version);
181
+ plans.push({ tag, commit, notes: body });
182
+ }
183
+ for (const plan of plans) {
184
+ let remote = client.remoteTag(root, plan.tag);
185
+ if (remote === null) {
186
+ // Report a repair only for a create call that succeeded; an accepted pre-existing or lost-response result is named as such.
187
+ let created = true;
188
+ try {
189
+ client.createTag(slug, plan.tag, plan.commit);
190
+ }
191
+ catch (error) {
192
+ created = false;
193
+ if (client.remoteTag(root, plan.tag) !== plan.commit)
194
+ throw error;
195
+ }
196
+ remote = client.remoteTag(root, plan.tag);
197
+ notes.push(created ? `repaired tag ${plan.tag}` : `tag ${plan.tag} confirmed at the planned commit after a failed create call`);
198
+ }
199
+ if (remote !== plan.commit)
200
+ throw new Error(`remote tag changed for ${plan.tag}`);
201
+ if (!fetcher.githubReleaseForTag(slug, plan.tag)) {
202
+ let created = true;
203
+ try {
204
+ client.createRelease(slug, plan.tag, plan.notes);
205
+ }
206
+ catch (error) {
207
+ created = false;
208
+ if (!fetcher.githubReleaseForTag(slug, plan.tag))
209
+ throw error;
210
+ }
211
+ notes.push(created ? `repaired GitHub Release ${plan.tag}` : `GitHub Release ${plan.tag} confirmed present after a failed create call`);
212
+ }
213
+ }
214
+ const finalTags = [...new Set([...tags, ...candidates.filter((tag) => client.remoteTag(root, tag) !== null)])];
215
+ const finalReleases = candidates.filter((tag) => fetcher.githubReleaseForTag(slug, tag));
216
+ const result = auditReleaseCompleteness(finalTags, fetcher.npmVersions(name), finalReleases);
217
+ return { failures: result.failures, notes: [...notes, ...result.notes] };
218
+ }
219
+ catch (error) {
220
+ return { failures: [`release repair refused: ${error instanceof Error ? error.message : String(error)}`], notes };
221
+ }
222
+ }
223
+ //# sourceMappingURL=release-repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-repair.js","sourceRoot":"","sources":["../release-repair.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,8 @@ export interface ShellToken {
45
45
  * different security meaning in command position.
46
46
  */
47
47
  unresolved?: boolean;
48
+ /** True when unresolved expansion can produce multiple arguments despite some quoting. */
49
+ multipleWords?: true;
48
50
  /**
49
51
  * True when the word's FIRST character came from inside quotes.
50
52
  *
@@ -58,6 +60,19 @@ export interface ShellToken {
58
60
  }
59
61
  /** One simple command: the words it would run, in order. */
60
62
  export type ShellCommand = ShellToken[];
63
+ /** A lexical child region, before any parent binding is expanded. */
64
+ interface ShellChildRegion {
65
+ /** First character of the opening delimiter. */
66
+ start: number;
67
+ /** First character after the closing delimiter, or end of truncated input. */
68
+ end: number;
69
+ /** Child source after the backtick escape layer is removed. */
70
+ text: string;
71
+ /** Arithmetic operands contain substitutions but are not shell commands. */
72
+ arithmetic: boolean;
73
+ /** Standalone subshells have no unresolved output word in their parent. */
74
+ subshell?: true;
75
+ }
61
76
  /**
62
77
  * Split shell text into the simple commands it contains.
63
78
  *
@@ -77,6 +92,17 @@ export type ShellCommand = ShellToken[];
77
92
  * @returns Every simple command found, outermost first.
78
93
  */
79
94
  export declare function tokenizeCommands(text: string, depth?: number): ShellCommand[];
95
+ /**
96
+ * Protect lexical child state from parent structural scans and expansion.
97
+ *
98
+ * The shared scanner supplies the exact substitution boundaries. Neutral
99
+ * placeholders preserve outer unresolved words and line indexing. Callers
100
+ * audit each returned child independently; inherited bindings are unproven.
101
+ */
102
+ export declare function isolateShellChildren(text: string, depth?: number, arithmetic?: boolean): {
103
+ parent: string;
104
+ children: ShellChildRegion[];
105
+ };
80
106
  /**
81
107
  * Whether a command's program is reached through a spawning wrapper.
82
108
  *
@@ -177,7 +203,7 @@ export declare function joinContinuations(text: string): string;
177
203
  * other rule in the scanner already tolerates leading whitespace
178
204
  * (`STANDALONE_ASSIGNMENT` opens with `^[ \t]*`, control closers and function
179
205
  * openers are matched against trimmed syntax, a comment starts after any
180
- * separator or whitespace, and `bashArrays` anchors on a word boundary), so
206
+ * separator or whitespace, and `bashArrays` uses a whitespace boundary), so
181
207
  * this function changes nothing else about what the scanner sees.
182
208
  *
183
209
  * Only `run:` blocks are dedented, because `run` is the key GitHub Actions
@@ -194,6 +220,36 @@ export declare function joinContinuations(text: string): string;
194
220
  * @returns The same text with each `run:` block's content dedented.
195
221
  */
196
222
  export declare function dedentRunBlocks(text: string): string;
223
+ /** One supported array declaration with its lexical source extent. */
224
+ interface BashArrayDeclaration {
225
+ /** Assigned array name. */
226
+ name: string;
227
+ /** Literal source operands with whitespace collapsed. */
228
+ value: string;
229
+ /** First character of the assigned name, excluding preceding whitespace. */
230
+ start: number;
231
+ /** First character following the closing parenthesis. */
232
+ end: number;
233
+ }
234
+ /**
235
+ * Enumerate literal declarations with original UTF-16 extents in source order.
236
+ *
237
+ * Candidates start at input start or after ECMAScript whitespace, with an ASCII
238
+ * identifier immediately followed by `=(`. Bare inner parentheses are rejected;
239
+ * quotes and backslash pairs preserve literal source, including substitutions
240
+ * inside quotes. This helper does not filter enclosing comments or shell scopes.
241
+ *
242
+ * Backward tables record the exclusive closing offset (zero means failure) for
243
+ * each suffix entered bare, single-quoted or double-quoted. Every transition
244
+ * uses an already computed later suffix, so malformed candidates never rescan
245
+ * quotes or remaining input. The forward name scan advances monotonically;
246
+ * successful extents do not overlap, so their total projection cost is linear.
247
+ * Time and auxiliary storage are O(text.length), including malformed recovery.
248
+ *
249
+ * @param text - Exact source text; continuations are not joined here.
250
+ * @returns Literal operands with whitespace collapsed and non-overlapping extents.
251
+ */
252
+ export declare function bashArrayDeclarations(text: string): BashArrayDeclaration[];
197
253
  /**
198
254
  * Index bash array assignments so a shared options array can be expanded.
199
255
  *
@@ -478,4 +534,5 @@ export interface VerifierResult {
478
534
  /** Lines describing what was checked, for the operator. */
479
535
  notes: string[];
480
536
  }
537
+ export {};
481
538
  //# sourceMappingURL=shell-scan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-scan.d.ts","sourceRoot":"","sources":["../shell-scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell-scan.d.ts","sourceRoot":"","sources":["../shell-scan.ts"],"names":[],"mappings":"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"}