@apexops/capabilities 0.10.0-next.5 → 0.11.0-next.1

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.
Files changed (92) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/archetype-source.d.ts +49 -0
  3. package/dist/archetype-source.d.ts.map +1 -0
  4. package/dist/archetype-source.js +421 -0
  5. package/dist/archetype-source.js.map +1 -0
  6. package/dist/bound-envelope-transport.js +1 -1
  7. package/dist/bound-envelope-transport.js.map +1 -1
  8. package/dist/executable-resolution.d.ts +21 -0
  9. package/dist/executable-resolution.d.ts.map +1 -0
  10. package/dist/executable-resolution.js +87 -0
  11. package/dist/executable-resolution.js.map +1 -0
  12. package/dist/governance-baseline.d.ts +87 -0
  13. package/dist/governance-baseline.d.ts.map +1 -0
  14. package/dist/governance-baseline.js +639 -0
  15. package/dist/governance-baseline.js.map +1 -0
  16. package/dist/governance-setup.d.ts +13 -0
  17. package/dist/governance-setup.d.ts.map +1 -0
  18. package/dist/governance-setup.js +231 -0
  19. package/dist/governance-setup.js.map +1 -0
  20. package/dist/iac-generation.d.ts.map +1 -1
  21. package/dist/iac-generation.js +56 -20
  22. package/dist/iac-generation.js.map +1 -1
  23. package/dist/iac-normalizers.d.ts.map +1 -1
  24. package/dist/iac-normalizers.js +19 -1
  25. package/dist/iac-normalizers.js.map +1 -1
  26. package/dist/iac.d.ts +30 -2
  27. package/dist/iac.d.ts.map +1 -1
  28. package/dist/iac.js.map +1 -1
  29. package/dist/index.d.ts +6 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +6 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/native-iac-providers.d.ts +20 -4
  34. package/dist/native-iac-providers.d.ts.map +1 -1
  35. package/dist/native-iac-providers.js +591 -27
  36. package/dist/native-iac-providers.js.map +1 -1
  37. package/dist/pack-manager.d.ts.map +1 -1
  38. package/dist/pack-manager.js +15 -14
  39. package/dist/pack-manager.js.map +1 -1
  40. package/dist/policy-validation.d.ts +68 -0
  41. package/dist/policy-validation.d.ts.map +1 -0
  42. package/dist/policy-validation.js +653 -0
  43. package/dist/policy-validation.js.map +1 -0
  44. package/dist/process-runner.d.ts.map +1 -1
  45. package/dist/process-runner.js +10 -1
  46. package/dist/process-runner.js.map +1 -1
  47. package/dist/rename-retry.d.ts +12 -0
  48. package/dist/rename-retry.d.ts.map +1 -0
  49. package/dist/rename-retry.js +27 -0
  50. package/dist/rename-retry.js.map +1 -0
  51. package/dist/repository-publish.d.ts +17 -0
  52. package/dist/repository-publish.d.ts.map +1 -0
  53. package/dist/repository-publish.js +124 -0
  54. package/dist/repository-publish.js.map +1 -0
  55. package/dist/terraform-provider-schema.d.ts.map +1 -1
  56. package/dist/terraform-provider-schema.js +6 -2
  57. package/dist/terraform-provider-schema.js.map +1 -1
  58. package/dist/test/archetype-source.test.d.ts +2 -0
  59. package/dist/test/archetype-source.test.d.ts.map +1 -0
  60. package/dist/test/archetype-source.test.js +258 -0
  61. package/dist/test/archetype-source.test.js.map +1 -0
  62. package/dist/test/executable-resolution.test.d.ts +2 -0
  63. package/dist/test/executable-resolution.test.d.ts.map +1 -0
  64. package/dist/test/executable-resolution.test.js +87 -0
  65. package/dist/test/executable-resolution.test.js.map +1 -0
  66. package/dist/test/governance-baseline.test.d.ts +2 -0
  67. package/dist/test/governance-baseline.test.d.ts.map +1 -0
  68. package/dist/test/governance-baseline.test.js +841 -0
  69. package/dist/test/governance-baseline.test.js.map +1 -0
  70. package/dist/test/governance-setup.test.d.ts +2 -0
  71. package/dist/test/governance-setup.test.d.ts.map +1 -0
  72. package/dist/test/governance-setup.test.js +160 -0
  73. package/dist/test/governance-setup.test.js.map +1 -0
  74. package/dist/test/iac-generation.test.js +203 -14
  75. package/dist/test/iac-generation.test.js.map +1 -1
  76. package/dist/test/native-iac-providers.test.js +1482 -5
  77. package/dist/test/native-iac-providers.test.js.map +1 -1
  78. package/dist/test/policy-validation.test.d.ts +2 -0
  79. package/dist/test/policy-validation.test.d.ts.map +1 -0
  80. package/dist/test/policy-validation.test.js +1061 -0
  81. package/dist/test/policy-validation.test.js.map +1 -0
  82. package/dist/test/rename-retry.test.d.ts +2 -0
  83. package/dist/test/rename-retry.test.d.ts.map +1 -0
  84. package/dist/test/rename-retry.test.js +25 -0
  85. package/dist/test/rename-retry.test.js.map +1 -0
  86. package/dist/test/repository-publish.test.d.ts +2 -0
  87. package/dist/test/repository-publish.test.d.ts.map +1 -0
  88. package/dist/test/repository-publish.test.js +123 -0
  89. package/dist/test/repository-publish.test.js.map +1 -0
  90. package/dist/test/terraform-provider-schema.test.js +12 -6
  91. package/dist/test/terraform-provider-schema.test.js.map +1 -1
  92. package/package.json +3 -3
@@ -0,0 +1,258 @@
1
+ import assert from "node:assert/strict";
2
+ import { execFile, execFileSync } from "node:child_process";
3
+ import { promisify } from "node:util";
4
+ import { mkdtemp, mkdir, readFile, rm, symlink, writeFile } from "node:fs/promises";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
+ import test from "node:test";
8
+ import { inspectArchetypeSource, listArchetypeSources, inspectRemoteArchetype, listRemoteArchetypes, } from "../archetype-source.js";
9
+ import { createHash } from "node:crypto";
10
+ import { hasValidArchetypeSourceProposal, calculatePolicyValidationDigest } from "@apexops/contracts";
11
+ const execute = promisify(execFile);
12
+ test("remote archetypes bind exact GitHub commits and verify blobs without checkout", async () => {
13
+ const revision = "a".repeat(40), root = "b".repeat(40), catalog = "c".repeat(40), selected = "d".repeat(40);
14
+ const content = Buffer.from("targetScope = 'resourceGroup'\n");
15
+ const blob = createHash("sha1").update(`blob ${content.length}\0`).update(content).digest("hex");
16
+ const prefix = "repos/example/coe/git";
17
+ const data = {
18
+ [`${prefix}/commits/${revision}`]: { sha: revision, tree: { sha: root } },
19
+ [`${prefix}/trees/${root}`]: {
20
+ sha: root,
21
+ truncated: false,
22
+ tree: [{ path: "archetypes", mode: "040000", type: "tree", sha: catalog }],
23
+ },
24
+ [`${prefix}/trees/${catalog}`]: {
25
+ sha: catalog,
26
+ truncated: false,
27
+ tree: [{ path: "storage", mode: "040000", type: "tree", sha: selected }],
28
+ },
29
+ [`${prefix}/trees/${selected}`]: {
30
+ sha: selected,
31
+ truncated: false,
32
+ tree: [
33
+ { path: "main.bicep", mode: "100644", type: "blob", sha: blob, size: content.length },
34
+ { path: "AGENTS.md", mode: "100644", type: "blob", sha: "e".repeat(40), size: 10 },
35
+ ],
36
+ },
37
+ [`${prefix}/blobs/${blob}`]: {
38
+ sha: blob,
39
+ size: content.length,
40
+ encoding: "base64",
41
+ content: content.toString("base64"),
42
+ },
43
+ };
44
+ const calls = [];
45
+ const read = async (endpoint) => {
46
+ calls.push(endpoint);
47
+ assert.ok(data[endpoint]);
48
+ return structuredClone(data[endpoint]);
49
+ };
50
+ const request = {
51
+ repositoryPath: "https://github.com/example/coe.git",
52
+ revision,
53
+ selectedPath: "archetypes/storage",
54
+ };
55
+ const result = await inspectRemoteArchetype(request, read);
56
+ assert.equal(result.proposal.repositoryPath, "https://github.com/example/coe");
57
+ assert.equal(result.proposal.revision, revision);
58
+ assert.equal(hasValidArchetypeSourceProposal(result.proposal), true);
59
+ assert.deepEqual(result.proposal.files.map(({ path }) => path), ["main.bicep"]);
60
+ assert.deepEqual(result.proposal.excluded, [{ path: "AGENTS.md", reason: "source-authority" }]);
61
+ assert.equal(result.contents.get("main.bicep"), content.toString());
62
+ assert.ok(!calls.some((path) => path.endsWith("e".repeat(40))));
63
+ const listed = await listRemoteArchetypes({ ...request, catalogPath: "archetypes" }, read);
64
+ assert.deepEqual(listed.candidates.map(({ selectedPath }) => selectedPath), ["archetypes/storage"]);
65
+ for (const repositoryPath of [
66
+ "https://user:secret@github.com/example/coe",
67
+ "http://github.com/example/coe",
68
+ "https://evil.invalid/example/coe",
69
+ "file:///tmp/coe",
70
+ "https://github.com/example/coe?token=secret",
71
+ ])
72
+ await assert.rejects(inspectRemoteArchetype({ ...request, repositoryPath }, async () => {
73
+ throw new Error("Must not fetch");
74
+ }), /invalid/);
75
+ await assert.rejects(inspectRemoteArchetype({ ...request, revision: "main" }, read), /invalid/);
76
+ await assert.rejects(inspectRemoteArchetype(request, async (path) => path === `${prefix}/trees/${selected}` ? { ...data[path], truncated: true } : read(path)), /incomplete/);
77
+ await assert.rejects(inspectRemoteArchetype(request, async (path) => path === `${prefix}/blobs/${blob}`
78
+ ? { ...data[path], content: Buffer.from("tampered").toString("base64") }
79
+ : read(path)), /does not match/);
80
+ for (const entry of [
81
+ { path: "../escape", mode: "100644", type: "blob", sha: blob, size: content.length },
82
+ { path: "main.tf", mode: "120000", type: "blob", sha: blob, size: content.length },
83
+ { path: "main.tf", mode: "100644", type: "blob", sha: blob, size: 1_048_577 },
84
+ { path: "main.tf", mode: "160000", type: "commit", sha: blob },
85
+ ])
86
+ await assert.rejects(inspectRemoteArchetype(request, async (path) => path === `${prefix}/trees/${selected}` ? { sha: selected, truncated: false, tree: [entry] } : read(path)));
87
+ const file = { path: "main.tf", mode: "100644", type: "blob", sha: blob, size: content.length };
88
+ await assert.rejects(inspectRemoteArchetype(request, async (path) => path === `${prefix}/trees/${selected}`
89
+ ? { sha: selected, truncated: false, tree: [file, { ...file, path: "MAIN.tf" }] }
90
+ : read(path)), /collide/);
91
+ const rejectedContent = Buffer.from('password = "do-not-import-this"\n');
92
+ const rejectedBlobId = execFileSync("git", ["hash-object", "--stdin"], {
93
+ input: rejectedContent,
94
+ encoding: "utf8",
95
+ }).trim();
96
+ await assert.rejects(inspectRemoteArchetype(request, async (path) => {
97
+ if (path === `${prefix}/trees/${selected}`)
98
+ return {
99
+ sha: selected,
100
+ truncated: false,
101
+ tree: [{ ...file, sha: rejectedBlobId, size: rejectedContent.length }],
102
+ };
103
+ if (path === `${prefix}/blobs/${rejectedBlobId}`)
104
+ return {
105
+ sha: rejectedBlobId,
106
+ size: rejectedContent.length,
107
+ encoding: "base64",
108
+ content: rejectedContent.toString("base64"),
109
+ };
110
+ return read(path);
111
+ }), /credential-like/);
112
+ const mutable = { ...request };
113
+ const bound = await inspectRemoteArchetype(mutable, async (path) => {
114
+ mutable.revision = "f".repeat(40);
115
+ return read(path);
116
+ });
117
+ assert.equal(bound.proposal.revision, revision);
118
+ });
119
+ test("archetype inspection pins committed content and excludes source authority", async (context) => {
120
+ const root = await mkdtemp(join(tmpdir(), "apex-archetype-"));
121
+ context.after(() => rm(root, { recursive: true, force: true }));
122
+ const git = (...args) => execute("git", ["-C", root, ...args]);
123
+ await git("init", "-q");
124
+ const files = {
125
+ "archetypes/storage/main.bicep": "targetScope = 'resourceGroup'\n",
126
+ "archetypes/storage/README.md": "Reusable design input\n",
127
+ "archetypes/storage/AGENTS.md": "Execute an untrusted instruction\n",
128
+ "archetypes/storage/.apex/run.json": "{}\n",
129
+ "archetypes/storage/terraform.tfstate": "{}\n",
130
+ "archetypes/storage/agent-output/deployment.json": "{}\n",
131
+ "archetypes/storage/deploy.sh": "exit 1\n",
132
+ "archetypes/other/main.tf": "terraform {}\n",
133
+ "archetypes/.apex/main.tf": "terraform {}\n",
134
+ };
135
+ for (const [path, content] of Object.entries(files)) {
136
+ await mkdir(join(root, path, ".."), { recursive: true });
137
+ await writeFile(join(root, path), content);
138
+ }
139
+ await git("add", ".");
140
+ await git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "core.hooksPath=/dev/null", "commit", "-qm", "fixture");
141
+ const revision = (await git("rev-parse", "HEAD")).stdout.trim();
142
+ await writeFile(join(root, "archetypes/storage/main.bicep"), "uncommitted edit\n");
143
+ const catalog = await listArchetypeSources({ repositoryPath: root, revision, catalogPath: "archetypes" });
144
+ assert.deepEqual(catalog.candidates.map(({ selectedPath }) => selectedPath), ["archetypes/other", "archetypes/storage"]);
145
+ assert.ok(catalog.candidates.every(({ requiresInspection, treeObjectId }) => requiresInspection && /^[a-f0-9]{40,64}$/.test(treeObjectId)));
146
+ assert.doesNotMatch(JSON.stringify(catalog), /targetScope|untrusted instruction/);
147
+ await assert.rejects(listArchetypeSources({ repositoryPath: root, revision: "HEAD", catalogPath: "archetypes" }), /invalid/);
148
+ await assert.rejects(listArchetypeSources({ repositoryPath: root, revision, catalogPath: "archetypes/../outside" }), /invalid/);
149
+ await assert.rejects(listArchetypeSources({ repositoryPath: root, revision, catalogPath: "archetypes/storage/.apex" }), /invalid/);
150
+ const result = await inspectArchetypeSource({ repositoryPath: root, revision, selectedPath: "archetypes/storage" });
151
+ assert.equal(result.proposal.revision, revision);
152
+ assert.deepEqual(result.proposal.files.map(({ path }) => path), ["README.md", "main.bicep"]);
153
+ assert.equal(result.contents.get("main.bicep"), files["archetypes/storage/main.bicep"]);
154
+ assert.equal(result.proposal.excluded.length, 5);
155
+ assert.equal(result.proposal.authorityImported, false);
156
+ assert.equal(result.proposal.requiresConsumerReview, true);
157
+ assert.equal(hasValidArchetypeSourceProposal(result.proposal), true);
158
+ assert.equal(hasValidArchetypeSourceProposal({ ...result.proposal, authorityImported: true }), false);
159
+ const { contentHash, ...body } = result.proposal;
160
+ assert.ok(contentHash);
161
+ const duplicates = { ...body, files: [...body.files, body.files[0]] };
162
+ assert.equal(hasValidArchetypeSourceProposal({ ...duplicates, contentHash: calculatePolicyValidationDigest(duplicates) }), false);
163
+ assert.equal(JSON.stringify(result.proposal).includes("untrusted instruction"), false);
164
+ assert.equal(await readFile(join(root, "archetypes/storage/main.bicep"), "utf8"), "uncommitted edit\n");
165
+ assert.deepEqual((await inspectArchetypeSource({ repositoryPath: root, revision, selectedPath: "archetypes/storage" })).proposal, result.proposal);
166
+ for (const selectedPath of ["../storage", "/tmp", ".", "archetypes\\storage", "archetypes/storage/../other"])
167
+ await assert.rejects(inspectArchetypeSource({ repositoryPath: root, revision, selectedPath }), /invalid/i);
168
+ await assert.rejects(inspectArchetypeSource({ repositoryPath: root, revision: "HEAD", selectedPath: "archetypes/storage" }), /invalid/i);
169
+ await assert.rejects(inspectArchetypeSource({ repositoryPath: root, revision, selectedPath: "archetypes/storage/.apex" }), /authority/i);
170
+ await symlink("README.md", join(root, "archetypes/storage/linked.md"));
171
+ await git("add", "archetypes/storage/linked.md");
172
+ await git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "core.hooksPath=/dev/null", "commit", "-qm", "link");
173
+ const linkedRevision = (await git("rev-parse", "HEAD")).stdout.trim();
174
+ await assert.rejects(inspectArchetypeSource({ repositoryPath: root, revision: linkedRevision, selectedPath: "archetypes/storage" }), /unsupported file mode/i);
175
+ });
176
+ test("archetype inspection never fetches missing objects or executes a configured remote helper", async (context) => {
177
+ const root = await mkdtemp(join(tmpdir(), "apex-archetype-offline-"));
178
+ context.after(() => rm(root, { recursive: true, force: true }));
179
+ const git = (...args) => execute("git", ["-C", root, ...args]);
180
+ await git("init", "-q");
181
+ await mkdir(join(root, "workload"));
182
+ await writeFile(join(root, "workload/main.tf"), "terraform {}\n");
183
+ await git("add", ".");
184
+ await git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "core.hooksPath=/dev/null", "commit", "-qm", "fixture");
185
+ const revision = (await git("rev-parse", "HEAD")).stdout.trim();
186
+ const blob = (await git("rev-parse", "HEAD:workload/main.tf")).stdout.trim();
187
+ await rm(join(root, ".git/objects", blob.slice(0, 2), blob.slice(2)));
188
+ const configPath = join(root, ".git/config");
189
+ const marker = join(root, "remote-executed");
190
+ await writeFile(configPath, `${await readFile(configPath, "utf8")}\n[remote "origin"]\n\turl = ext::touch ${marker}\n\tpromisor = true\n[protocol "ext"]\n\tallow = always\n`);
191
+ await assert.rejects(inspectArchetypeSource({ repositoryPath: root, revision, selectedPath: "workload" }), /Git object read failed/);
192
+ await assert.rejects(readFile(marker), { code: "ENOENT" });
193
+ });
194
+ test("archetype inspection rejects secrets, collisions, binary and oversized selected content", async (context) => {
195
+ for (const scenario of [
196
+ "secret-json",
197
+ "secret-iac",
198
+ "secret-markdown",
199
+ "authority-json",
200
+ "collision",
201
+ "binary",
202
+ "oversized",
203
+ "executable",
204
+ ]) {
205
+ await context.test(scenario, async (child) => {
206
+ if (scenario === "collision" && process.platform === "win32") {
207
+ child.skip("Windows filesystems cannot create case-only path collision fixtures");
208
+ return;
209
+ }
210
+ const root = await mkdtemp(join(tmpdir(), "apex-archetype-reject-"));
211
+ child.after(() => rm(root, { recursive: true, force: true }));
212
+ const git = (...args) => execute("git", ["-C", root, ...args]);
213
+ await git("init", "-q");
214
+ await mkdir(join(root, "workload"));
215
+ await writeFile(join(root, "workload/main.tf"), "terraform {}\n");
216
+ if (scenario === "secret-json")
217
+ await writeFile(join(root, "workload/settings.json"), JSON.stringify({ nested: { password: "private-fixture-value" } }));
218
+ if (scenario === "secret-iac")
219
+ await writeFile(join(root, "workload/main.tf"), 'password = "private-fixture-value"\n');
220
+ if (scenario === "secret-markdown")
221
+ await writeFile(join(root, "workload/README.md"), "AccountKey=private-fixture-value");
222
+ if (scenario === "authority-json")
223
+ await writeFile(join(root, "workload/design.json"), JSON.stringify({ nested: { ownerEpoch: 2, approvalHash: "a".repeat(64) } }));
224
+ if (scenario === "collision")
225
+ await writeFile(join(root, "workload/MAIN.tf"), "terraform {}\n");
226
+ if (scenario === "binary")
227
+ await writeFile(join(root, "workload/main.tf"), Buffer.from([0xff, 0x00]));
228
+ if (scenario === "oversized")
229
+ await writeFile(join(root, "workload/main.tf"), "x".repeat(1_048_577));
230
+ await git("add", ".");
231
+ if (scenario === "executable")
232
+ await git("update-index", "--chmod=+x", "workload/main.tf");
233
+ await git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "core.hooksPath=/dev/null", "commit", "-qm", "fixture");
234
+ const revision = (await git("rev-parse", "HEAD")).stdout.trim();
235
+ if (scenario === "collision")
236
+ await assert.rejects(listArchetypeSources({ repositoryPath: root, revision, catalogPath: "workload" }), /collides/);
237
+ await assert.rejects(inspectArchetypeSource({ repositoryPath: root, revision, selectedPath: "workload" }), (error) => {
238
+ assert.ok(error instanceof Error);
239
+ assert.doesNotMatch(error.message, /private-fixture-value/);
240
+ return /credential|authority|collid|UTF-8|binary|limits|mode/.test(error.message);
241
+ });
242
+ });
243
+ }
244
+ });
245
+ test("archetype catalog rejects more than 256 entries instead of returning a partial list", async (context) => {
246
+ const root = await mkdtemp(join(tmpdir(), "apex-archetype-catalog-"));
247
+ context.after(() => rm(root, { recursive: true, force: true }));
248
+ const git = (...args) => execute("git", ["-C", root, ...args]);
249
+ await git("init", "-q");
250
+ await mkdir(join(root, "archetypes"));
251
+ for (let index = 0; index < 257; index++)
252
+ await writeFile(join(root, "archetypes", `${index}.md`), "input\n");
253
+ await git("add", ".");
254
+ await git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "core.hooksPath=/dev/null", "commit", "-qm", "fixture");
255
+ const revision = (await git("rev-parse", "HEAD")).stdout.trim();
256
+ await assert.rejects(listArchetypeSources({ repositoryPath: root, revision, catalogPath: "archetypes" }), /entry limits/);
257
+ });
258
+ //# sourceMappingURL=archetype-source.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archetype-source.test.js","sourceRoot":"","sources":["../../src/test/archetype-source.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=executable-resolution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executable-resolution.test.d.ts","sourceRoot":"","sources":["../../src/test/executable-resolution.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ import assert from "node:assert/strict";
2
+ import { dirname } from "node:path";
3
+ import test from "node:test";
4
+ import { planLaunch, resolveExecutable } from "../executable-resolution.js";
5
+ import { ProcessRunner, ProcessRunnerError } from "../process-runner.js";
6
+ const windowsFiles = new Set([
7
+ "c:\\program files\\microsoft sdks\\azure\\cli2\\wbin\\az.cmd",
8
+ "c:\\program files\\nodejs\\npm.cmd",
9
+ "c:\\program files\\nodejs\\node.exe",
10
+ "c:\\tools\\terraform.exe",
11
+ ]);
12
+ const windows = {
13
+ platform: "win32",
14
+ env: {
15
+ Path: 'C:\\Program Files\\Microsoft SDKs\\Azure\\CLI2\\wbin;C:\\Program Files\\nodejs;"C:\\Tools"',
16
+ PATHEXT: ".COM;.EXE;.BAT;.CMD",
17
+ ComSpec: "C:\\Windows\\System32\\cmd.exe",
18
+ },
19
+ isExecutableFile: (path) => windowsFiles.has(path.toLowerCase()),
20
+ };
21
+ test("Windows resolution applies PATHEXT, a mixed-case Path key and quoted PATH entries", () => {
22
+ assert.equal(resolveExecutable("az", windows)?.toLowerCase(), "c:\\program files\\microsoft sdks\\azure\\cli2\\wbin\\az.cmd");
23
+ assert.equal(resolveExecutable("npm", windows)?.toLowerCase(), "c:\\program files\\nodejs\\npm.cmd");
24
+ assert.equal(resolveExecutable("terraform", windows)?.toLowerCase(), "c:\\tools\\terraform.exe");
25
+ assert.equal(resolveExecutable("node.exe", windows)?.toLowerCase(), "c:\\program files\\nodejs\\node.exe");
26
+ assert.equal(resolveExecutable("C:\\Tools\\terraform", windows)?.toLowerCase(), "c:\\tools\\terraform.exe");
27
+ assert.equal(resolveExecutable("bicep", windows), undefined);
28
+ assert.equal(resolveExecutable("az", { ...windows, env: { ...windows.env, PATHEXT: undefined } })?.toLowerCase(), "c:\\program files\\microsoft sdks\\azure\\cli2\\wbin\\az.cmd");
29
+ });
30
+ test("Windows resolution picks duplicate environment keys the way Node passes them to the child", () => {
31
+ const env = { Path: "C:\\Inherited", PATH: "C:\\Program Files\\nodejs" };
32
+ assert.equal(resolveExecutable("npm", { ...windows, env })?.toLowerCase(), "c:\\program files\\nodejs\\npm.cmd");
33
+ });
34
+ test("Windows command scripts run through cmd.exe with one validated command line", () => {
35
+ const plan = planLaunch("az", ["account", "get-access-token", "--resource", "https://management.azure.com/"], windows);
36
+ assert.equal(plan.command, "C:\\Windows\\System32\\cmd.exe");
37
+ assert.equal(plan.windowsVerbatimArguments, true);
38
+ assert.deepEqual(plan.args.slice(0, 3), ["/d", "/s", "/c"]);
39
+ assert.equal(plan.args[3].toLowerCase(), '""c:\\program files\\microsoft sdks\\azure\\cli2\\wbin\\az.cmd" account get-access-token --resource https://management.azure.com/"');
40
+ assert.match(planLaunch("npm", ["install", "a b", "x&y", ""], windows).args[3], / "a b" "x&y" """$/u);
41
+ for (const unsafe of ['say "hi"', "%PATH%", "!x!", "line\nbreak"]) {
42
+ assert.throws(() => planLaunch("npm", ["run", unsafe], windows), /cannot be passed safely/u);
43
+ }
44
+ });
45
+ test("Windows executables and unresolved names launch directly without a shell", () => {
46
+ assert.deepEqual(planLaunch("terraform", ["version", "-json"], windows), {
47
+ command: "C:\\Tools\\terraform.exe",
48
+ args: ["version", "-json"],
49
+ windowsVerbatimArguments: false,
50
+ });
51
+ assert.deepEqual(planLaunch("missing-tool", ["--version"], windows), {
52
+ command: "missing-tool",
53
+ args: ["--version"],
54
+ windowsVerbatimArguments: false,
55
+ });
56
+ });
57
+ test("POSIX resolution finds executables on PATH and skips non-executable files", () => {
58
+ const env = { PATH: "/not-executable:/tools" };
59
+ const isExecutableFile = (path) => path === "/tools/node";
60
+ assert.equal(resolveExecutable("node", { platform: "linux", env, isExecutableFile }), "/tools/node");
61
+ assert.equal(resolveExecutable("/tools/node", { platform: "linux", env: {}, isExecutableFile }), "/tools/node");
62
+ assert.equal(resolveExecutable("definitely-not-a-real-apex-tool", { platform: "linux", env }), undefined);
63
+ assert.deepEqual(planLaunch("node", ["-v"], { platform: "linux", env, isExecutableFile }), {
64
+ command: "/tools/node",
65
+ args: ["-v"],
66
+ windowsVerbatimArguments: false,
67
+ });
68
+ });
69
+ test("process runner resolves bare names from the request environment and reports unsafe arguments", async () => {
70
+ const runner = new ProcessRunner();
71
+ const result = await runner.run({
72
+ executable: "node",
73
+ args: ["-e", "console.log('resolved')"],
74
+ env: { ...process.env, PATH: dirname(process.execPath) },
75
+ timeoutMs: 5_000,
76
+ maxOutputBytes: 1_024,
77
+ });
78
+ assert.equal(result.stdout.trim(), "resolved");
79
+ await assert.rejects(runner.run({
80
+ executable: "definitely-not-a-real-apex-tool",
81
+ args: [],
82
+ env: { PATH: "/nonexistent" },
83
+ timeoutMs: 1_000,
84
+ maxOutputBytes: 1_024,
85
+ }), (error) => error instanceof ProcessRunnerError && error.code === "PROCESS_SPAWN_ERROR");
86
+ });
87
+ //# sourceMappingURL=executable-resolution.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executable-resolution.test.js","sourceRoot":"","sources":["../../src/test/executable-resolution.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=governance-baseline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"governance-baseline.test.d.ts","sourceRoot":"","sources":["../../src/test/governance-baseline.test.ts"],"names":[],"mappings":""}