swallowkit 2.0.0-alpha.5 → 2.0.0-alpha.7

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 (64) hide show
  1. package/dist/cli/commands/provision.d.ts +4 -1
  2. package/dist/cli/commands/provision.d.ts.map +1 -1
  3. package/dist/cli/commands/provision.js +233 -69
  4. package/dist/cli/commands/provision.js.map +1 -1
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +14 -1
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/core/operations/provision-deployment.d.ts +45 -0
  9. package/dist/core/operations/provision-deployment.d.ts.map +1 -0
  10. package/dist/core/operations/provision-deployment.js +151 -0
  11. package/dist/core/operations/provision-deployment.js.map +1 -0
  12. package/dist/core/operations/provision-operations.d.ts +39 -5
  13. package/dist/core/operations/provision-operations.d.ts.map +1 -1
  14. package/dist/core/operations/provision-operations.js +609 -103
  15. package/dist/core/operations/provision-operations.js.map +1 -1
  16. package/dist/core/project/capabilities.d.ts +8 -0
  17. package/dist/core/project/capabilities.d.ts.map +1 -1
  18. package/dist/core/project/capabilities.js +11 -3
  19. package/dist/core/project/capabilities.js.map +1 -1
  20. package/dist/core/project/state.d.ts +7 -0
  21. package/dist/core/project/state.d.ts.map +1 -1
  22. package/dist/core/project/state.js +86 -0
  23. package/dist/core/project/state.js.map +1 -1
  24. package/dist/core/project/workflows.d.ts.map +1 -1
  25. package/dist/core/project/workflows.js +30 -2
  26. package/dist/core/project/workflows.js.map +1 -1
  27. package/dist/machine/index.d.ts.map +1 -1
  28. package/dist/machine/index.js +17 -11
  29. package/dist/machine/index.js.map +1 -1
  30. package/dist/mcp/index.d.ts +2 -2
  31. package/dist/mcp/index.d.ts.map +1 -1
  32. package/dist/mcp/index.js +58 -12
  33. package/dist/mcp/index.js.map +1 -1
  34. package/dist/utils/azure-cli.d.ts +16 -4
  35. package/dist/utils/azure-cli.d.ts.map +1 -1
  36. package/dist/utils/azure-cli.js +166 -4
  37. package/dist/utils/azure-cli.js.map +1 -1
  38. package/dist/utils/azure-diagnostics.d.ts +16 -0
  39. package/dist/utils/azure-diagnostics.d.ts.map +1 -0
  40. package/dist/utils/azure-diagnostics.js +68 -0
  41. package/dist/utils/azure-diagnostics.js.map +1 -0
  42. package/package.json +1 -1
  43. package/src/__tests__/agent-instructions.test.ts +5 -0
  44. package/src/__tests__/agent-loop-phase34.test.ts +19 -8
  45. package/src/__tests__/azure-cli.test.ts +5 -2
  46. package/src/__tests__/fixtures/az wrapper.cmd +2 -0
  47. package/src/__tests__/fixtures/azure-cli.cjs +138 -0
  48. package/src/__tests__/fixtures/provision-runner.cjs +28 -0
  49. package/src/__tests__/mcp.test.ts +56 -0
  50. package/src/__tests__/provision-runtime.test.ts +636 -0
  51. package/src/cli/commands/provision.ts +243 -70
  52. package/src/cli/index.ts +12 -2
  53. package/src/core/operations/provision-deployment.ts +167 -0
  54. package/src/core/operations/provision-operations.ts +597 -145
  55. package/src/core/project/agent-templates/AGENTS.md +22 -0
  56. package/src/core/project/agent-templates/CLAUDE.md +7 -0
  57. package/src/core/project/agent-templates/copilot-instructions.md +8 -0
  58. package/src/core/project/capabilities.ts +19 -3
  59. package/src/core/project/state.ts +70 -0
  60. package/src/core/project/workflows.ts +30 -2
  61. package/src/machine/index.ts +20 -14
  62. package/src/mcp/index.ts +50 -15
  63. package/src/utils/azure-cli.ts +167 -6
  64. package/src/utils/azure-diagnostics.ts +75 -0
@@ -1 +1 @@
1
- {"version":3,"file":"azure-cli.js","sourceRoot":"","sources":["../../src/utils/azure-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"azure-cli.js","sourceRoot":"","sources":["../../src/utils/azure-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { AzCliResult } from "./azure-cli";
2
+ export declare function redactAzureText(text: string, secretValues?: readonly string[]): string;
3
+ export interface AzureCliDiagnostic {
4
+ phase: string;
5
+ exitCode: number | null;
6
+ signal: NodeJS.Signals | null;
7
+ elapsedMs: number;
8
+ failureKind?: AzCliResult["failureKind"];
9
+ errorCode?: string;
10
+ stdout: string;
11
+ stderr: string;
12
+ outputTruncated: boolean;
13
+ }
14
+ export declare function azureCliDiagnostic(result: AzCliResult, phase: string, secretValues?: readonly string[]): AzureCliDiagnostic;
15
+ export declare function formatAzureDiagnostic(diagnostic: AzureCliDiagnostic): string;
16
+ //# sourceMappingURL=azure-diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-diagnostics.d.ts","sourceRoot":"","sources":["../../src/utils/azure-diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAyB1F;AAWD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,SAAS,MAAM,EAAO,GAAG,kBAAkB,CAc/H;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,CAM5E"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.redactAzureText = redactAzureText;
4
+ exports.azureCliDiagnostic = azureCliDiagnostic;
5
+ exports.formatAzureDiagnostic = formatAzureDiagnostic;
6
+ const SENSITIVE_KEY = /outputs|parameters|password|secret|token|authorization|connection.?string|accountkey|api.?key|functions?.?key|client.?secret|access.?key|primary.?key|secondary.?key/i;
7
+ function redactAzureText(text, secretValues = []) {
8
+ const redactValues = (value) => {
9
+ for (const secret of secretValues) {
10
+ if (secret)
11
+ value = value.split(secret).join("[REDACTED]").split(JSON.stringify(secret).slice(1, -1)).join("[REDACTED]");
12
+ }
13
+ return value;
14
+ };
15
+ text = redactValues(text);
16
+ let value = text;
17
+ try {
18
+ const redact = (entry) => {
19
+ if (typeof entry === "string")
20
+ return redactPlainText(redactValues(entry));
21
+ if (Array.isArray(entry))
22
+ return entry.map(redact);
23
+ if (entry && typeof entry === "object") {
24
+ return Object.fromEntries(Object.entries(entry).map(([key, item]) => [key, SENSITIVE_KEY.test(key) ? "[REDACTED]" : redact(item)]));
25
+ }
26
+ return entry;
27
+ };
28
+ value = JSON.stringify(redact(JSON.parse(text)));
29
+ }
30
+ catch {
31
+ // An incomplete deployment payload cannot be safely projected/redacted.
32
+ if (/"(?:outputs|parameters)"\s*:/i.test(text))
33
+ return "[Azure payload omitted: may contain secrets]";
34
+ value = redactPlainText(text);
35
+ }
36
+ return value;
37
+ }
38
+ function redactPlainText(text) {
39
+ return text
40
+ .replace(/\bBearer\s+[^\s"',;]+/gi, "Bearer [REDACTED]")
41
+ .replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g, "[REDACTED]")
42
+ .replace(/(?:AccountEndpoint|DefaultEndpointsProtocol)=[^\r\n"']+/gi, "[connection string REDACTED]")
43
+ .replace(/((?:api[-_ ]?key|functions?[-_ ]?key|accountkey|password|client[-_ ]?secret|secret|token|access[-_ ]?key|primary[-_ ]?key|secondary[-_ ]?key|authorization)\s*["']?\s*[:=]\s*)(?:"[^"]*"|'[^']*'|[^\s,;}\]]+)/gi, "$1[REDACTED]")
44
+ .replace(/([?&](?:code|sig|token|key|secret|password)=)[^&\s"'<>]+/gi, "$1[REDACTED]");
45
+ }
46
+ function azureCliDiagnostic(result, phase, secretValues = []) {
47
+ const stdout = result.stdoutTruncated ? "[stdout omitted: capture limit reached]" : redactAzureText(result.stdout, secretValues);
48
+ const stderr = result.stderrTruncated ? "[stderr omitted: capture limit reached]" : redactAzureText(result.stderr, secretValues);
49
+ return {
50
+ phase,
51
+ exitCode: result.status,
52
+ signal: result.signal ?? null,
53
+ elapsedMs: result.elapsedMs,
54
+ ...(result.failureKind ? { failureKind: result.failureKind } : {}),
55
+ ...(result.errorCode ? { errorCode: result.errorCode } : {}),
56
+ stdout: stdout.slice(0, 4000),
57
+ stderr: stderr.slice(0, 4000),
58
+ outputTruncated: result.stdoutTruncated || result.stderrTruncated || stdout.length > 4000 || stderr.length > 4000,
59
+ };
60
+ }
61
+ function formatAzureDiagnostic(diagnostic) {
62
+ return [
63
+ `az ${diagnostic.phase}: exit=${diagnostic.exitCode ?? "unknown"}, signal=${diagnostic.signal ?? "none"}, kind=${diagnostic.failureKind ?? "none"}, elapsed=${diagnostic.elapsedMs}ms${diagnostic.errorCode ? `, error=${diagnostic.errorCode}` : ""}${diagnostic.outputTruncated ? ", output omitted/truncated" : ""}`,
64
+ ...(diagnostic.stdout ? [`stdout: ${diagnostic.stdout}`] : []),
65
+ ...(diagnostic.stderr ? [`stderr: ${diagnostic.stderr}`] : []),
66
+ ].join("\n");
67
+ }
68
+ //# sourceMappingURL=azure-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-diagnostics.js","sourceRoot":"","sources":["../../src/utils/azure-diagnostics.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swallowkit",
3
- "version": "2.0.0-alpha.5",
3
+ "version": "2.0.0-alpha.7",
4
4
  "description": "Type-safe schema-driven development toolkit for Next.js and React applications on Azure",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -57,6 +57,10 @@ describe("coding-agent instruction contract", () => {
57
57
  expect(agentsMd).toContain("Verification Is a Completion Gate");
58
58
  expect(agentsMd).toContain("semantic code review answers different questions");
59
59
  expect(agentsMd).toContain("When the status is `requires-human`, stop");
60
+ expect(agentsMd).toContain("machine inspect provision --plan <runId> --wait-seconds 300");
61
+ expect(agentsMd).toContain("outcome: \"succeeded\"");
62
+ expect(agentsMd).toContain("Never re-submit Bicep");
63
+ expect(agentsMd).toContain("must not switch to normal CLI to bypass it");
60
64
  expect(agentsMd).toContain("never bypass its\napproval gate");
61
65
  });
62
66
 
@@ -88,6 +92,7 @@ describe("coding-agent instruction contract", () => {
88
92
  expect(adapter).toContain("planning");
89
93
  expect(adapter).toContain("Never hand-edit deterministic SwallowKit-managed artifacts");
90
94
  expect(adapter).toContain("SwallowKit verification");
95
+ expect(adapter).toContain("approval");
91
96
  }
92
97
  });
93
98
 
@@ -18,6 +18,7 @@ import { loadCustomVerifyChecks, compactVerifyResult, runVerify, VerifyResult }
18
18
  import { buildAgentSkills, buildWorkflowDocs, writeAgentSkills, writeWorkflowDocs } from "../core/project/workflows";
19
19
  import { applyProvisionOperation, planProvisionOperation } from "../core/operations/provision-operations";
20
20
  import { resetAzCliInvocationCache, setAzCliInvocationForTesting } from "../utils/azure-cli";
21
+ import * as azureCli from "../utils/azure-cli";
21
22
  import { createCustomMigration, initializeLegacyMigrations } from "../core/operations/migration-generator";
22
23
  import { createMigrationManifest, encodeMigrationState, getMigrationTagKey, saveMigrationManifest } from "../core/project/migrations";
23
24
 
@@ -129,6 +130,7 @@ describe("agent loop phase 3/4", () => {
129
130
  (childProcess.spawnSync as unknown as any).mockReturnValue({ status: 1, stdout: "", stderr: "" });
130
131
  // Platform-independent az invocation; the Windows wrapper resolution is covered in azure-cli.test.ts.
131
132
  setAzCliInvocationForTesting({ command: "az", prefixArgs: [], source: "az" });
133
+ jest.spyOn(azureCli, "runAzCliAsync").mockImplementation(async (args) => azureCli.runAzCli(args));
132
134
  });
133
135
 
134
136
  afterEach(() => {
@@ -136,6 +138,7 @@ describe("agent loop phase 3/4", () => {
136
138
  process.chdir(originalCwd);
137
139
  fs.rmSync(tempDir, { recursive: true, force: true });
138
140
  jest.clearAllMocks();
141
+ jest.restoreAllMocks();
139
142
  });
140
143
 
141
144
  it("returns the responsibility boundary contract via inspect boundaries", async () => {
@@ -317,11 +320,11 @@ describe("agent loop phase 3/4", () => {
317
320
  (childProcess.spawnSync as unknown as any).mockImplementation((_file: string, args: string[]) => {
318
321
  if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
319
322
  if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
320
- if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/test/resourceGroups/rg-sample", tags: {} }), stderr: "" };
323
+ if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: {} }), stderr: "" };
321
324
  return { status: 1, stdout: "", stderr: "unexpected" };
322
325
  });
323
326
 
324
- const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia" });
327
+ const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia", subscription: "11111111-1111-1111-1111-111111111111" });
325
328
 
326
329
  expect(plan.mode).toBe("adoption-required");
327
330
  expect(plan.commands).toEqual([]);
@@ -336,7 +339,7 @@ describe("agent loop phase 3/4", () => {
336
339
  (childProcess.spawnSync as unknown as any).mockImplementation((_file: string, args: string[]) => {
337
340
  if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
338
341
  if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
339
- if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/test/resourceGroups/rg-sample", tags: {} }), stderr: "" };
342
+ if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: {} }), stderr: "" };
340
343
  if (args[0] === "deployment" && args[2] === "what-if") {
341
344
  return { status: 0, stdout: JSON.stringify({ changes: [{ changeType: "Modify", resourceId: "/functions/sample" }] }), stderr: "" };
342
345
  }
@@ -350,6 +353,7 @@ describe("agent loop phase 3/4", () => {
350
353
  adoptExisting: true,
351
354
  baseline: 0,
352
355
  whatIf: true,
356
+ subscription: "11111111-1111-1111-1111-111111111111",
353
357
  });
354
358
 
355
359
  expect(plan.mode).toBe("adopt");
@@ -367,7 +371,7 @@ describe("agent loop phase 3/4", () => {
367
371
  (childProcess.spawnSync as unknown as any).mockImplementation((_file: string, args: string[]) => {
368
372
  if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
369
373
  if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
370
- if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/test/resourceGroups/rg-sample", tags: {} }), stderr: "" };
374
+ if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: {} }), stderr: "" };
371
375
  if (args[0] === "deployment" && args[2] === "what-if") return { status: 0, stdout: JSON.stringify({ changes: [] }), stderr: "" };
372
376
  return { status: 1, stdout: "", stderr: "unexpected" };
373
377
  });
@@ -377,6 +381,7 @@ describe("agent loop phase 3/4", () => {
377
381
  location: "japaneast",
378
382
  swaLocation: "eastasia",
379
383
  reconcile: true,
384
+ subscription: "11111111-1111-1111-1111-111111111111",
380
385
  });
381
386
 
382
387
  expect(plan.mode).toBe("reconcile");
@@ -398,12 +403,12 @@ describe("agent loop phase 3/4", () => {
398
403
  if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
399
404
  if (args[0] === "group" && args[1] === "show") {
400
405
  const tagKey = getMigrationTagKey(manifest.projectId);
401
- return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/test/resourceGroups/rg-sample", tags: { [tagKey]: tagValue } }), stderr: "" };
406
+ return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: { [tagKey]: tagValue } }), stderr: "" };
402
407
  }
403
408
  return { status: 1, stdout: "", stderr: "unexpected" };
404
409
  });
405
410
 
406
- const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia" });
411
+ const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia", subscription: "11111111-1111-1111-1111-111111111111" });
407
412
 
408
413
  expect(plan.mode).toBe("migrate");
409
414
  expect(plan.pendingMigrations.map((migration) => migration.version)).toEqual([1]);
@@ -424,7 +429,13 @@ describe("agent loop phase 3/4", () => {
424
429
  (childProcess.spawnSync as unknown as any).mockImplementation((_file: string, args: string[]) => {
425
430
  if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
426
431
  if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: "true\n", stderr: "" };
427
- if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/test/resourceGroups/rg-sample", tags: { [tagKey]: tagValue } }), stderr: "" };
432
+ if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample", tags: { [tagKey]: tagValue } }), stderr: "" };
433
+ if (args[0] === "deployment" && args[2] === "show") {
434
+ const name = args[args.indexOf("--name") + 1];
435
+ return deployedTemplates.length === 0
436
+ ? { status: 1, stdout: "", stderr: "DeploymentNotFound" }
437
+ : { status: 0, stdout: JSON.stringify({ id: `/subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-sample/providers/Microsoft.Resources/deployments/${name}`, state: "Succeeded", correlationId: "fixture-correlation" }), stderr: "" };
438
+ }
428
439
  if (args[0] === "deployment" && args[2] === "create") {
429
440
  deployedTemplates.push(args[args.indexOf("--template-file") + 1]);
430
441
  return { status: 0, stdout: JSON.stringify({ properties: { outputs: {} } }), stderr: "" };
@@ -436,7 +447,7 @@ describe("agent loop phase 3/4", () => {
436
447
  return { status: 1, stdout: "", stderr: `unexpected: ${args.join(" ")}` };
437
448
  });
438
449
 
439
- const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia" });
450
+ const plan = await planProvisionOperation({ resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia", subscription: "11111111-1111-1111-1111-111111111111" });
440
451
  const result = await applyProvisionOperation({ planId: plan.planId, approve: true });
441
452
 
442
453
  expect(result.executedCommands).toHaveLength(2);
@@ -2,6 +2,7 @@ import * as childProcess from "child_process";
2
2
  import * as fs from "fs";
3
3
  import * as os from "os";
4
4
  import * as path from "path";
5
+ import * as azureCli from "../utils/azure-cli";
5
6
  import {
6
7
  buildBatchCommandLine,
7
8
  checkAzCliAvailability,
@@ -118,6 +119,7 @@ describe("provision planning with Azure CLI state", () => {
118
119
  saveMigrationManifest(createMigrationManifest(project, { projectId: "project" }), project);
119
120
  process.chdir(project);
120
121
  setAzCliInvocationForTesting({ command: "az", prefixArgs: [], source: "az" });
122
+ jest.spyOn(azureCli, "runAzCliAsync").mockImplementation(async (args) => runAzCli(args));
121
123
  });
122
124
  afterEach(() => {
123
125
  process.chdir(originalCwd);
@@ -125,9 +127,10 @@ describe("provision planning with Azure CLI state", () => {
125
127
  spawnSyncMock.mockReset();
126
128
  spawnSyncMock.mockImplementation(jest.requireActual<typeof import("child_process")>("child_process").spawnSync);
127
129
  fs.rmSync(project, { recursive: true, force: true });
130
+ jest.restoreAllMocks();
128
131
  });
129
132
 
130
- const options = { resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia" };
133
+ const options = { resourceGroup: "rg-sample", location: "japaneast", swaLocation: "eastasia", subscription: "11111111-1111-1111-1111-111111111111" };
131
134
 
132
135
  it("reads Azure state through the resolved CLI and plans a bootstrap", async () => {
133
136
  spawnSyncMock.mockImplementation((_command: string, args: string[]) => {
@@ -150,7 +153,7 @@ describe("provision planning with Azure CLI state", () => {
150
153
  spawnSyncMock.mockImplementation((_command: string, args: string[]) => {
151
154
  if (args[0] === "--version") return { status: 0, stdout: "azure-cli", stderr: "" };
152
155
  if (args[0] === "group" && args[1] === "exists") return { status: 0, stdout: `${groupExists}\n`, stderr: "" };
153
- if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: "/subscriptions/test/resourceGroups/rg-sample", tags: {} }), stderr: "" };
156
+ if (args[0] === "group" && args[1] === "show") return { status: 0, stdout: JSON.stringify({ id: `/subscriptions/${options.subscription}/resourceGroups/rg-sample`, tags: {} }), stderr: "" };
154
157
  return { status: 1, stdout: "", stderr: `unexpected ${args.join(" ")}` };
155
158
  });
156
159
  const preview = await planProvisionOperation(options, { persist: false });
@@ -0,0 +1,2 @@
1
+ @echo off
2
+ "%SWALLOWKIT_FIXTURE_NODE%" "%~dp0azure-cli.cjs" %*
@@ -0,0 +1,138 @@
1
+ const fs = require("node:fs");
2
+ const args = process.argv.slice(2);
3
+ const emit = (value) => process.stdout.write(JSON.stringify(value));
4
+
5
+ if (args[0] === "process") {
6
+ const mode = args[1];
7
+ if (mode === "warning" || mode === "slow") {
8
+ console.error("WARNING: fixture Bicep warning");
9
+ if (mode === "slow") setTimeout(() => emit({ done: true }), Number(args[2] ?? 600));
10
+ } else if (mode === "flood") {
11
+ process.stdout.write("x".repeat(2 * 1024 * 1024));
12
+ process.stderr.write("y".repeat(2 * 1024 * 1024));
13
+ } else if (mode === "communication") {
14
+ console.error("ConnectionResetError: fixture communication interrupted");
15
+ process.exitCode = 1;
16
+ } else if (mode === "nonzero") {
17
+ console.error("ERROR: fixture az failure");
18
+ process.exitCode = 7;
19
+ } else if (mode === "echo") {
20
+ emit(args.slice(2));
21
+ } else if (mode === "terminate") {
22
+ process.kill(process.pid, "SIGTERM");
23
+ }
24
+ return;
25
+ }
26
+
27
+ const file = process.env.SWALLOWKIT_AZ_FIXTURE_STATE;
28
+ if (!file) throw new Error("This fixture requires its isolated state file; it never invokes Azure.");
29
+ const state = JSON.parse(fs.readFileSync(file, "utf8"));
30
+ state.calls.push(args);
31
+ const save = () => {
32
+ const temporary = `${file}.tmp-${process.pid}`;
33
+ fs.writeFileSync(temporary, JSON.stringify(state));
34
+ fs.renameSync(temporary, file);
35
+ };
36
+ const value = (flag) => args[args.indexOf(flag) + 1];
37
+ const subscription = state.subscription;
38
+ const resourceGroup = state.resourceGroup;
39
+ const groupId = `/subscriptions/${subscription}/resourceGroups/${resourceGroup}`;
40
+ save();
41
+
42
+ if (args[0] === "--version") {
43
+ process.stdout.write("azure-cli fixture");
44
+ } else if (args[0] === "account" && args[1] === "show") {
45
+ process.stdout.write(subscription);
46
+ } else if (args[0] === "bicep" && args[1] === "build") {
47
+ emit(state.template);
48
+ } else if (args[0] === "group" && args[1] === "exists") {
49
+ process.stdout.write(String(state.groupExists));
50
+ } else if (args[0] === "group" && args[1] === "show") {
51
+ emit({ id: groupId, tags: state.tags });
52
+ } else if (args[0] === "group" && args[1] === "create") {
53
+ state.groupExists = true;
54
+ state.groupCreates++;
55
+ save();
56
+ emit(groupId);
57
+ } else if ((args[0] === "tag" && args[1] === "update") || (args[0] === "group" && args[1] === "update")) {
58
+ state.tagAttempts++;
59
+ const assignment = value(args[0] === "tag" ? "--tags" : "--set").replace(/^tags\./, "");
60
+ const index = assignment.indexOf("=");
61
+ const apply = () => { state.tags[assignment.slice(0, index)] = assignment.slice(index + 1); };
62
+ if (state.failTags > 0) {
63
+ state.failTags--;
64
+ if (state.applyTagBeforeFailure) apply();
65
+ save();
66
+ console.error("ERROR: fixture tag update failed");
67
+ process.exitCode = 9;
68
+ } else {
69
+ apply();
70
+ save();
71
+ }
72
+ } else if (args[0] === "deployment" && args[1] === "operation") {
73
+ emit(state.operations ?? []);
74
+ } else if (args[0] === "deployment" && args[2] === "export") {
75
+ emit(state.remoteTemplate ?? state.template);
76
+ } else if (args[0] === "deployment" && args[2] === "what-if") {
77
+ emit({ changes: [] });
78
+ } else if (args[0] === "deployment" && args[2] === "create") {
79
+ const name = value("--name");
80
+ state.deploymentCreates++;
81
+ state.deployments[name] = {
82
+ correlationId: `fixture-correlation-${state.deploymentCreates}`,
83
+ templateHash: "fixture-template-hash",
84
+ };
85
+ save();
86
+ if (state.warning) console.error("WARNING: The configuration value of bicep.use_binary_from_path has been set to 'false'.");
87
+ if (state.submitStderr) console.error(state.submitStderr);
88
+ if (state.submitMode === "communication") {
89
+ console.error("ConnectionResetError: fixture connection closed after acceptance");
90
+ process.exitCode = 1;
91
+ } else if (state.submitMode === "nonzero") {
92
+ console.error("ERROR: fixture submit exited nonzero");
93
+ process.exitCode = 7;
94
+ } else if (state.submitMode === "flood") {
95
+ process.stdout.write(JSON.stringify({ properties: { outputs: { apiKey: { value: "fixture-secret-do-not-print" } } } }));
96
+ process.stdout.write("x".repeat(2 * 1024 * 1024));
97
+ process.stderr.write("y".repeat(2 * 1024 * 1024));
98
+ } else if (state.submitMode === "slow") {
99
+ setTimeout(() => emit({ accepted: true }), state.submitDelay ?? 2000);
100
+ } else {
101
+ emit({ accepted: true });
102
+ }
103
+ } else if (args[0] === "deployment" && args[2] === "show") {
104
+ const name = value("--name");
105
+ const deployment = state.deployments[name];
106
+ if (!deployment || state.queryMode === "not-found") {
107
+ console.error("ERROR: (DeploymentNotFound) fixture deployment is not visible");
108
+ process.exitCode = 3;
109
+ } else if (state.queryMode === "communication") {
110
+ console.error("ConnectionResetError: fixture status query interrupted");
111
+ process.exitCode = 1;
112
+ } else if (state.queryMode === "invalid") {
113
+ process.stdout.write("{invalid JSON");
114
+ } else if (value("--query") === "properties.parameters") {
115
+ emit(state.parameters);
116
+ } else if (value("--query").includes("properties.outputs.")) {
117
+ if (state.outputQueryFails) {
118
+ console.error("ERROR: resource output query failed");
119
+ process.exitCode = 1;
120
+ } else {
121
+ const outputs = state.outputs ?? {};
122
+ emit(Object.fromEntries(["staticWebAppName", "staticWebAppUrl", "functionsAppName", "functionsAppUrl", "cosmosDbAccountName", "cosmosDatabaseName"].map(key => [key, outputs[key] ?? null])));
123
+ }
124
+ } else {
125
+ const states = state.states ?? ["Succeeded"];
126
+ const provisioningState = states.length > 1 ? states.shift() : states[0];
127
+ save();
128
+ emit({
129
+ id: `${groupId}/providers/Microsoft.Resources/deployments/${name}`,
130
+ name, state: provisioningState,
131
+ correlationId: deployment.correlationId, templateHash: deployment.templateHash,
132
+ error: state.error ?? null,
133
+ });
134
+ }
135
+ } else {
136
+ console.error("ERROR: fixture does not support this command");
137
+ process.exitCode = 4;
138
+ }
@@ -0,0 +1,28 @@
1
+ const fs = require("node:fs");
2
+ const path = require("node:path");
3
+ const ts = require("typescript");
4
+ const root = path.resolve(__dirname, "..", "..", "..");
5
+ require.extensions[".ts"] = (module, file) => {
6
+ module._compile(ts.transpileModule(fs.readFileSync(file, "utf8"), {
7
+ compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020, esModuleInterop: true },
8
+ fileName: file,
9
+ }).outputText, file);
10
+ };
11
+ const azure = require(path.join(root, "src", "utils", "azure-cli.ts"));
12
+ azure.setAzCliInvocationForTesting({
13
+ command: process.execPath,
14
+ prefixArgs: [path.join(__dirname, "azure-cli.cjs")],
15
+ source: "isolated fixture",
16
+ });
17
+ const provision = require(path.join(root, "src", "core", "operations", "provision-operations.ts"));
18
+ const state = JSON.parse(fs.readFileSync(process.env.SWALLOWKIT_AZ_FIXTURE_STATE, "utf8"));
19
+ void (async () => {
20
+ const plan = await provision.planProvisionOperation({
21
+ resourceGroup: state.resourceGroup, location: "japaneast", swaLocation: "eastasia",
22
+ });
23
+ const result = await provision.executeProvisionPlan(plan, { approve: true });
24
+ console.log(JSON.stringify(result));
25
+ })().catch((error) => {
26
+ console.error(error.message);
27
+ process.exitCode = 1;
28
+ });
@@ -8,6 +8,62 @@ const builtMcpEntrypoint = path.resolve(__dirname, "..", "..", "dist", "mcp", "i
8
8
  const itWhenBuiltEntrypointExists = fs.existsSync(builtMcpEntrypoint) ? it : it.skip;
9
9
 
10
10
  describe("SwallowKit MCP tool definitions", () => {
11
+ it.each([
12
+ { status: "in-progress", outcome: "in-progress", state: "Running" },
13
+ { status: "blocked", outcome: "partial", state: "Succeeded" },
14
+ ])("does not promote $outcome provisioning to complete", async ({ status, outcome, state }) => {
15
+ const nextActions = [{ command: "swallowkit machine inspect provision --plan 123456789abc", description: "Read original state." }];
16
+ const runner = jest.fn(async () => ({
17
+ stdout: JSON.stringify({ ok: true, command: "apply-provision", status, nextActions, data: { outcome, deployment: { state } } }),
18
+ stderr: "", exitCode: 0,
19
+ }));
20
+ const tool = buildSwallowKitToolDefinitions(runner).find(candidate => candidate.name === "swallowkit_apply_provision")!;
21
+ const result = await tool.handler({ planId: "123456789abc", approve: true, waitSeconds: 0 });
22
+ expect(runner).toHaveBeenCalledWith(["apply", "provision", "--plan", "123456789abc", "--approve", "--wait-seconds", "0"]);
23
+ expect(JSON.parse(result.content[0].text)).toMatchObject({ status, outcome, deployment: { state }, nextActions });
24
+ });
25
+
26
+ it.each([
27
+ { status: "requires-human", code: "approval-required" },
28
+ { status: "failed", code: "azure-deployment-failed" },
29
+ ])("preserves $code and recovery actions", async ({ status, code }) => {
30
+ const nextActions = [{ command: "swallowkit machine apply provision --plan 123456789abc --approve", description: "Obtain human approval." }];
31
+ const runner = jest.fn(async () => ({
32
+ stdout: JSON.stringify({ ok: false, command: "apply-provision", status, error: { code, message: "Fixture error." }, nextActions }),
33
+ stderr: "", exitCode: 1,
34
+ }));
35
+ const tool = buildSwallowKitToolDefinitions(runner).find(candidate => candidate.name === "swallowkit_apply_provision")!;
36
+ const result = await tool.handler({ planId: "123456789abc" });
37
+ expect(runner).toHaveBeenCalledWith(["apply", "provision", "--plan", "123456789abc"]);
38
+ expect(result.isError).toBe(true);
39
+ expect(JSON.parse(result.content[0].text)).toMatchObject({ status, error: { code }, nextActions });
40
+ });
41
+
42
+ it.each(["swallowkit_apply_provision", "swallowkit_inspect_provision"])("forwards cancellation and preserves an unknown outcome for %s", async name => {
43
+ const controller = new AbortController();
44
+ const runner = jest.fn(async (_args: string[], signal?: AbortSignal) => {
45
+ expect(signal).toBe(controller.signal);
46
+ controller.abort();
47
+ return { stdout: "", stderr: "", exitCode: 143 };
48
+ });
49
+ const tool = buildSwallowKitToolDefinitions(runner).find(candidate => candidate.name === name)!;
50
+ const result = await tool.handler({ planId: "123456789abc", approve: true }, controller.signal);
51
+ expect(result.isError).toBe(true);
52
+ expect(JSON.parse(result.content[0].text)).toMatchObject({
53
+ status: "blocked", error: { code: "provision-interrupted", details: { outcome: "unknown", localFailure: "cancelled" } },
54
+ nextActions: expect.arrayContaining([expect.objectContaining({ command: "swallowkit machine inspect provision --plan 123456789abc" })]),
55
+ });
56
+ });
57
+
58
+ it("does not launch provision after the MCP request was already cancelled", async () => {
59
+ const controller = new AbortController();
60
+ controller.abort();
61
+ const runner = jest.fn(async () => ({ stdout: "", stderr: "", exitCode: 1 }));
62
+ const tool = buildSwallowKitToolDefinitions(runner).find(candidate => candidate.name === "swallowkit_apply_provision")!;
63
+ expect((await tool.handler({ planId: "123456789abc", approve: true }, controller.signal)).isError).toBe(true);
64
+ expect(runner).not.toHaveBeenCalled();
65
+ });
66
+
11
67
  it("preserves blocked auth prerequisites and nextActions as structured MCP errors", async () => {
12
68
  const nextActions = [{ command: "swallowkit machine plan auth --provider swa", description: "Configure auth first." }];
13
69
  const runner = jest.fn(async () => ({