@stackwright-pro/mcp 0.2.0-alpha.95 → 0.2.0-alpha.98

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/dist/server.js CHANGED
@@ -2701,7 +2701,8 @@ var MANIFEST_NAME_TO_PHASE = {
2701
2701
  "stackwright-pro-form-wizard-otter": "workflow",
2702
2702
  "stackwright-pro-geo-otter": "geo",
2703
2703
  "stackwright-pro-polish-otter": "polish",
2704
- "stackwright-services-otter": "services"
2704
+ "stackwright-services-otter": "services",
2705
+ "stackwright-pro-qa-otter": "qa"
2705
2706
  };
2706
2707
  function manifestNameToPhase(name) {
2707
2708
  return MANIFEST_NAME_TO_PHASE[name] ?? null;
@@ -2904,6 +2905,7 @@ function loadPipelineGraph() {
2904
2905
  }
2905
2906
 
2906
2907
  // src/tools/pipeline.ts
2908
+ var import_telemetry = require("@stackwright-pro/telemetry");
2907
2909
  var PHASE_ORDER = [
2908
2910
  "designer",
2909
2911
  "theme",
@@ -2918,7 +2920,8 @@ var PHASE_ORDER = [
2918
2920
  "services",
2919
2921
  "pages",
2920
2922
  "dashboard",
2921
- "polish"
2923
+ "polish",
2924
+ "qa"
2922
2925
  ];
2923
2926
  var PHASE_ARTIFACT = {
2924
2927
  designer: "design-language.json",
@@ -2932,7 +2935,8 @@ var PHASE_ARTIFACT = {
2932
2935
  workflow: "workflow-config.json",
2933
2936
  services: "services-config.json",
2934
2937
  polish: "polish-manifest.json",
2935
- geo: "geo-manifest.json"
2938
+ geo: "geo-manifest.json",
2939
+ qa: "qa-findings.json"
2936
2940
  };
2937
2941
  var PHASE_TO_OTTER2 = {
2938
2942
  designer: "stackwright-pro-designer-otter",
@@ -2946,7 +2950,8 @@ var PHASE_TO_OTTER2 = {
2946
2950
  workflow: "stackwright-pro-form-wizard-otter",
2947
2951
  services: "stackwright-services-otter",
2948
2952
  polish: "stackwright-pro-polish-otter",
2949
- geo: "stackwright-pro-geo-otter"
2953
+ geo: "stackwright-pro-geo-otter",
2954
+ qa: "stackwright-pro-qa-otter"
2950
2955
  };
2951
2956
  function isValidPhase2(phase) {
2952
2957
  return PHASE_ORDER.includes(phase);
@@ -3115,6 +3120,28 @@ function handleSetPipelineState(input) {
3115
3120
  }
3116
3121
  }
3117
3122
  writeState(cwd, state);
3123
+ try {
3124
+ const completedPhases = Object.entries(state.phases).filter(([, ps]) => ps.artifactWritten).map(([p]) => p);
3125
+ (0, import_telemetry.emit)(
3126
+ {
3127
+ type: "pipeline_state_change",
3128
+ state: state.status,
3129
+ phases: { ready: [], completed: completedPhases, blocked: [] }
3130
+ },
3131
+ { cwd }
3132
+ );
3133
+ if (input.field === "artifactWritten" && input.value === true && input.phase) {
3134
+ (0, import_telemetry.emit)({ type: "phase_complete", phase: input.phase }, { cwd });
3135
+ }
3136
+ if (input.updates) {
3137
+ for (const update of input.updates) {
3138
+ if (update.field === "artifactWritten" && update.value === true) {
3139
+ (0, import_telemetry.emit)({ type: "phase_complete", phase: update.phase }, { cwd });
3140
+ }
3141
+ }
3142
+ }
3143
+ } catch {
3144
+ }
3118
3145
  return { text: JSON.stringify(state), isError: false };
3119
3146
  } catch (err) {
3120
3147
  return { text: JSON.stringify({ error: true, message: String(err) }), isError: true };
@@ -3490,7 +3517,10 @@ var PHASE_REQUIRED_KEYS = {
3490
3517
  workflow: ["version", "generatedBy"],
3491
3518
  services: ["version", "generatedBy", "flows"],
3492
3519
  polish: ["version", "generatedBy"],
3493
- geo: ["version", "generatedBy", "geoCollections"]
3520
+ geo: ["version", "generatedBy", "geoCollections"],
3521
+ // qa: skipped=true path only needs version+generatedBy+skipped;
3522
+ // skipped=false path also needs summary+findings — Zod validator enforces the conditional.
3523
+ qa: ["version", "generatedBy", "skipped"]
3494
3524
  };
3495
3525
  var PHASE_ARTIFACT_SCHEMA = {
3496
3526
  designer: JSON.stringify(
@@ -3780,9 +3810,44 @@ var PHASE_ARTIFACT_SCHEMA = {
3780
3810
  },
3781
3811
  null,
3782
3812
  2
3813
+ ),
3814
+ qa: JSON.stringify(
3815
+ {
3816
+ version: "1.0",
3817
+ generatedBy: "stackwright-pro-qa-otter",
3818
+ // skipped: true path — when dev server is unreachable at audit time
3819
+ // skipped: false path — full audit completed
3820
+ skipped: false,
3821
+ skipReason: null,
3822
+ wcagLevel: "<AA|AAA>",
3823
+ summary: {
3824
+ routesAudited: 3,
3825
+ serious: 0,
3826
+ moderate: 1,
3827
+ minor: 0
3828
+ },
3829
+ findings: [
3830
+ {
3831
+ id: "qa-001",
3832
+ route: "/dashboard",
3833
+ severity: "<serious|moderate|minor>",
3834
+ category: "<visual|a11y|design-contract|runtime>",
3835
+ finding: "Human-readable description of what was observed",
3836
+ evidence: {
3837
+ screenshot: ".stackwright/qa/screenshots/dashboard-light.png",
3838
+ consoleErrors: [],
3839
+ axeViolations: []
3840
+ },
3841
+ suggested_otters: ["stackwright-pro-theme-otter"],
3842
+ suggested_fix: "Specific, concrete next step the repair otter should take"
3843
+ }
3844
+ ]
3845
+ },
3846
+ null,
3847
+ 2
3783
3848
  )
3784
3849
  };
3785
- function handleValidateArtifact(input) {
3850
+ function _validateArtifactInner(input) {
3786
3851
  const cwd = input._cwd ?? process.cwd();
3787
3852
  const { phase, responseText, artifact: directArtifact } = input;
3788
3853
  if (!isValidPhase2(phase)) {
@@ -3920,6 +3985,40 @@ function handleValidateArtifact(input) {
3920
3985
  };
3921
3986
  }
3922
3987
  return { success: true };
3988
+ },
3989
+ // qa artifact — permissive validator: requires version + generatedBy + skipped.
3990
+ // When skipped=true: skipReason must be a string.
3991
+ // When skipped=false: findings must be an array and summary must be an object.
3992
+ qa: (artifact2) => {
3993
+ const skipped = artifact2["skipped"];
3994
+ if (typeof skipped !== "boolean") {
3995
+ return {
3996
+ success: false,
3997
+ error: { message: '"skipped" must be a boolean (true or false).' }
3998
+ };
3999
+ }
4000
+ if (skipped === true) {
4001
+ if (typeof artifact2["skipReason"] !== "string") {
4002
+ return {
4003
+ success: false,
4004
+ error: { message: 'When skipped=true, "skipReason" must be a string.' }
4005
+ };
4006
+ }
4007
+ return { success: true };
4008
+ }
4009
+ if (!Array.isArray(artifact2["findings"])) {
4010
+ return {
4011
+ success: false,
4012
+ error: { message: 'When skipped=false, "findings" must be an array.' }
4013
+ };
4014
+ }
4015
+ if (typeof artifact2["summary"] !== "object" || artifact2["summary"] === null) {
4016
+ return {
4017
+ success: false,
4018
+ error: { message: 'When skipped=false, "summary" must be an object.' }
4019
+ };
4020
+ }
4021
+ return { success: true };
3923
4022
  }
3924
4023
  };
3925
4024
  const zodValidator = PHASE_ZOD_VALIDATORS[phase];
@@ -3970,6 +4069,32 @@ function handleValidateArtifact(input) {
3970
4069
  return { text: JSON.stringify({ error: true, phase, message }), isError: true };
3971
4070
  }
3972
4071
  }
4072
+ function handleValidateArtifact(input) {
4073
+ const cwd = input._cwd ?? process.cwd();
4074
+ const { phase } = input;
4075
+ (0, import_telemetry.emit)(
4076
+ { type: "tool_call", toolName: "stackwright_pro_validate_artifact", args: { phase }, phase },
4077
+ { cwd }
4078
+ );
4079
+ const result = _validateArtifactInner(input);
4080
+ try {
4081
+ const parsed = JSON.parse(result.text);
4082
+ if (parsed.valid === true && parsed.artifactPath) {
4083
+ (0, import_telemetry.emit)({ type: "file_write", path: parsed.artifactPath, phase }, { cwd });
4084
+ }
4085
+ (0, import_telemetry.emit)(
4086
+ {
4087
+ type: "tool_complete",
4088
+ toolName: "stackwright_pro_validate_artifact",
4089
+ success: parsed.valid === true,
4090
+ phase
4091
+ },
4092
+ { cwd }
4093
+ );
4094
+ } catch {
4095
+ }
4096
+ return result;
4097
+ }
3973
4098
  function registerPipelineTools(server2) {
3974
4099
  const DESC = "Writes state to .stackwright/ \u2014 the filesystem is the state machine.";
3975
4100
  const res = (r) => ({
@@ -4106,12 +4231,70 @@ function registerPipelineTools(server2) {
4106
4231
  return res(handleValidateArtifact({ phase, responseText: responseText ?? "" }));
4107
4232
  }
4108
4233
  );
4234
+ server2.tool(
4235
+ "stackwright_pro_emit_event",
4236
+ `Emit a telemetry event to .stackwright/pipeline-events.ndjson. Foreman calls this at phase boundaries and agent-invoke boundaries. Best-effort: failures are silent and never block. ${DESC}`,
4237
+ {
4238
+ type: import_zod13.z.enum(["phase_start", "phase_complete", "agent_invoke_start", "agent_invoke_complete"]).describe("Event type to emit"),
4239
+ phase: import_zod13.z.string().optional().describe("Current phase name"),
4240
+ targetOtter: import_zod13.z.string().optional().describe("For agent_invoke_* events: which otter is being invoked"),
4241
+ success: import_zod13.z.boolean().optional().describe("For agent_invoke_complete: did the invocation succeed?"),
4242
+ otter: import_zod13.z.string().optional().describe('Which otter is emitting (defaults to "foreman")'),
4243
+ durationSec: import_zod13.z.number().optional().describe("Duration in seconds (for *_complete events)")
4244
+ },
4245
+ async ({ type, phase, targetOtter, success, otter, durationSec }) => {
4246
+ let emitted = false;
4247
+ try {
4248
+ if (type === "phase_start") {
4249
+ if (!phase) {
4250
+ return res({
4251
+ text: JSON.stringify({ emitted: false, reason: "phase required for phase_start" }),
4252
+ isError: false
4253
+ });
4254
+ }
4255
+ emitted = (0, import_telemetry.emit)({ type: "phase_start", phase, otter: otter ?? "foreman" });
4256
+ } else if (type === "phase_complete") {
4257
+ if (!phase) {
4258
+ return res({
4259
+ text: JSON.stringify({ emitted: false, reason: "phase required for phase_complete" }),
4260
+ isError: false
4261
+ });
4262
+ }
4263
+ emitted = (0, import_telemetry.emit)({
4264
+ type: "phase_complete",
4265
+ phase,
4266
+ otter: otter ?? "foreman",
4267
+ ...durationSec != null ? { durationSec } : {}
4268
+ });
4269
+ } else if (type === "agent_invoke_start") {
4270
+ emitted = (0, import_telemetry.emit)({
4271
+ type: "agent_invoke_start",
4272
+ targetOtter: targetOtter ?? "",
4273
+ phase,
4274
+ otter: otter ?? "foreman"
4275
+ });
4276
+ } else if (type === "agent_invoke_complete") {
4277
+ emitted = (0, import_telemetry.emit)({
4278
+ type: "agent_invoke_complete",
4279
+ targetOtter: targetOtter ?? "",
4280
+ success: success ?? true,
4281
+ phase,
4282
+ otter: otter ?? "foreman",
4283
+ ...durationSec != null ? { durationSec } : {}
4284
+ });
4285
+ }
4286
+ } catch {
4287
+ }
4288
+ return res({ text: JSON.stringify({ emitted }), isError: false });
4289
+ }
4290
+ );
4109
4291
  }
4110
4292
 
4111
4293
  // src/tools/safe-write.ts
4112
4294
  var import_zod14 = require("zod");
4113
4295
  var import_fs7 = require("fs");
4114
4296
  var import_path7 = require("path");
4297
+ var import_telemetry2 = require("@stackwright-pro/telemetry");
4115
4298
  var OTTER_WRITE_ALLOWLISTS = {
4116
4299
  "stackwright-pro-designer-otter": [
4117
4300
  { prefix: ".stackwright/artifacts/", suffix: ".json", description: "Design language artifact" }
@@ -4207,6 +4390,25 @@ var OTTER_WRITE_ALLOWLISTS = {
4207
4390
  { prefix: ".stackwright/artifacts/", suffix: ".json", description: "Polish artifact" },
4208
4391
  { prefix: "README.md", suffix: "", description: "Project README rewrite" }
4209
4392
  ],
4393
+ // QA otter writes ONLY to the qa/ directory and the qa-findings artifact.
4394
+ // It never writes .tsx, .ts, .yml, or .json outside these paths.
4395
+ "stackwright-pro-qa-otter": [
4396
+ {
4397
+ prefix: ".stackwright/artifacts/qa-findings.json",
4398
+ suffix: "",
4399
+ description: "QA findings artifact"
4400
+ },
4401
+ {
4402
+ prefix: ".stackwright/qa/",
4403
+ suffix: ".md",
4404
+ description: "QA report markdown"
4405
+ },
4406
+ {
4407
+ prefix: ".stackwright/qa/screenshots/",
4408
+ suffix: ".png",
4409
+ description: "Route screenshots for evidence"
4410
+ }
4411
+ ],
4210
4412
  // domain-expert-otter is a reader/answerer only — it writes via stackwright_pro_save_phase_answers,
4211
4413
  // not via safe_write. Entry required here because the MCP tool availability guard boilerplate
4212
4414
  // in its system prompt mentions stackwright_pro_safe_write (triggering the coherence test).
@@ -4420,7 +4622,7 @@ function validateContent(filePath, content) {
4420
4622
  if (filePath === ".env" || filePath.startsWith(".env")) return validateEnvContent(content);
4421
4623
  return null;
4422
4624
  }
4423
- function handleSafeWrite(input) {
4625
+ function _safeWriteInner(input) {
4424
4626
  const cwd = input._cwd ?? process.cwd();
4425
4627
  const { callerOtter, filePath, content, createDirectories = true } = input;
4426
4628
  const check = checkPathAllowed(callerOtter, filePath);
@@ -4528,6 +4730,31 @@ function handleSafeWrite(input) {
4528
4730
  return { text: JSON.stringify(result), isError: true };
4529
4731
  }
4530
4732
  }
4733
+ function handleSafeWrite(input) {
4734
+ const cwd = input._cwd ?? process.cwd();
4735
+ const { filePath, callerOtter } = input;
4736
+ (0, import_telemetry2.emit)(
4737
+ { type: "tool_call", toolName: "stackwright_pro_safe_write", args: { callerOtter, filePath } },
4738
+ { cwd }
4739
+ );
4740
+ const result = _safeWriteInner(input);
4741
+ try {
4742
+ const parsed = JSON.parse(result.text);
4743
+ if (parsed.success === true && parsed.path) {
4744
+ (0, import_telemetry2.emit)({ type: "file_write", path: parsed.path, bytes: parsed.bytesWritten }, { cwd });
4745
+ }
4746
+ (0, import_telemetry2.emit)(
4747
+ {
4748
+ type: "tool_complete",
4749
+ toolName: "stackwright_pro_safe_write",
4750
+ success: parsed.success === true
4751
+ },
4752
+ { cwd }
4753
+ );
4754
+ } catch {
4755
+ }
4756
+ return result;
4757
+ }
4531
4758
  function registerSafeWriteTools(server2) {
4532
4759
  const DESC = "Controlled file-write chokepoint. Every write from specialist otters goes through this tool with per-otter path allowlists. The LLM cannot write to arbitrary filesystem paths.";
4533
4760
  server2.tool(
@@ -5469,59 +5696,63 @@ var import_path9 = require("path");
5469
5696
  var _checksums = /* @__PURE__ */ new Map([
5470
5697
  [
5471
5698
  "stackwright-pro-api-otter.json",
5472
- "822b35d7a330ed8ac0b42a63b0f70a41885aa9b5ea23cc5b8b998b549da4c05c"
5699
+ "b3ad28c4404af9fb3c2cfce258c707dadd37bc59ac236e1f46d6163cd8d5dc9b"
5473
5700
  ],
5474
5701
  [
5475
5702
  "stackwright-pro-auth-otter.json",
5476
- "d6cd5732667018d99456be77d5955e454da7a0999a0330b5f03a483aa1b9b33f"
5703
+ "1a21d9f23e250f23291124307e5a2a32af5a716566319a3290372dae3d02e637"
5477
5704
  ],
5478
5705
  [
5479
5706
  "stackwright-pro-dashboard-otter.json",
5480
- "e3b82555fcffbd77285bd304828814e9f9f7257130797c9de3785de97527668c"
5707
+ "d9277616db5680ce3d598908fa3a1b0d0f626e33948785a4c64703b85e463b31"
5481
5708
  ],
5482
5709
  [
5483
5710
  "stackwright-pro-data-otter.json",
5484
- "bb66eaab31c6872536dca4d3ff145724a46356946dd0665cc4f0346714d3bacb"
5711
+ "536cba95f32667e81ae4b6335378a095f91095598defff0de00af231ebdbc488"
5485
5712
  ],
5486
5713
  [
5487
5714
  "stackwright-pro-designer-otter.json",
5488
- "b54121c6a2ab5b1ad68c1262c58b2e04e6315feacd6bb8de8e78eb36f2fa6be6"
5715
+ "69a6c09fbb54f971c48eae7fd52faa63cf79be2923e435aca9ff802e8d541d0f"
5489
5716
  ],
5490
5717
  [
5491
5718
  "stackwright-pro-domain-expert-otter.json",
5492
- "1f21b8ff3450bdae29a4d31b31462ba22583995a448af3c11ab0a5071f46bd72"
5719
+ "14d77cade020f44d1b5a2b406e2599501f3466ee90ca4248500a441d419bc59c"
5493
5720
  ],
5494
5721
  [
5495
5722
  "stackwright-pro-foreman-otter.json",
5496
- "abb1cc5e40a8c5ff98057273f43a9e90e2791a15951090cd4d98407c0c3618e3"
5723
+ "4db4639e618cdd008d86c416bbc88bd4b2a7965e4bfcf01ec54b828f04ccb816"
5497
5724
  ],
5498
5725
  [
5499
5726
  "stackwright-pro-form-wizard-otter.json",
5500
- "975ad68e8fb6fe5a10373be278946fa4d9d7ec2238a0b2bd9e4a412e5b1fdd6d"
5727
+ "7f6f94192f26face57dc8b2e22e0a49d23ceeeb356ca4ebde05492f1b25e3c47"
5501
5728
  ],
5502
5729
  [
5503
5730
  "stackwright-pro-geo-otter.json",
5504
- "ac440da786d8c5ab1feddbf861449c3be3a433a04370578e1b2d35bf6ae7a601"
5731
+ "15f2327b69f75a9c772c2acad5a5d6d3daefb7b55a079aca3205ecd4f33ae349"
5505
5732
  ],
5506
5733
  [
5507
5734
  "stackwright-pro-page-otter.json",
5508
- "b70bd6e5d2a40230f7c24ff4a6113585a1614e5b6a215ece2bd47ff053c30f58"
5735
+ "c467c5d03b69d87fb1efa9482674a25e2f63782189db74b65309928d47456176"
5509
5736
  ],
5510
5737
  [
5511
5738
  "stackwright-pro-polish-otter.json",
5512
- "48ef3cf7f29ac6b5e8ab2004d4d41e2fb899e781689178d3905993241c84095a"
5739
+ "1cfea28e121e30181b0a7c8bda0700ffc892a6f919a0ec64996a4cf3f7735b51"
5740
+ ],
5741
+ [
5742
+ "stackwright-pro-qa-otter.json",
5743
+ "822075893bb4f8496f3dca7b0e68eda460a6fbde87480c13c194582eb7744318"
5513
5744
  ],
5514
5745
  [
5515
5746
  "stackwright-pro-scaffold-otter.json",
5516
- "e8662b63bbc9ce38851d94f9656bbebefdb7843d038862adb9fde2c23f9e77c2"
5747
+ "341d74ff2be24893ed174e869dc40c090f82e25e11d412d63519944512c37f15"
5517
5748
  ],
5518
5749
  [
5519
5750
  "stackwright-pro-theme-otter.json",
5520
- "fb62e56642f7f94c50ce173f3e1ce978b3f20ab1567e87403b901d6dd991a7db"
5751
+ "b0eccc1945e30b80a0f9a3209c5428e8e32cd09063bd9b2ef7ecb891343774f2"
5521
5752
  ],
5522
5753
  [
5523
5754
  "stackwright-services-otter.json",
5524
- "0a5dac670482871c718099767b30bf23d8ec57e942bd40a00ce295926d82c6bd"
5755
+ "8997bdd9a6fd3e6e02563578a1649480bc21acf919534ae41f73e70ade7cf500"
5525
5756
  ]
5526
5757
  ]);
5527
5758
  Object.freeze(_checksums);
@@ -5534,6 +5765,7 @@ for (const [name, digest] of CANONICAL_CHECKSUMS) {
5534
5765
  );
5535
5766
  }
5536
5767
  }
5768
+ var CANONICAL_OTTERS = Object.freeze([...CANONICAL_CHECKSUMS.keys()]);
5537
5769
  var MAX_OTTER_BYTES = 1 * 1024 * 1024;
5538
5770
  function computeSha256(data) {
5539
5771
  return (0, import_crypto4.createHash)("sha256").update(data).digest("hex");
@@ -6959,7 +7191,9 @@ var package_default = {
6959
7191
  "@stackwright-pro/cli-data-explorer": "workspace:*",
6960
7192
  "@stackwright-pro/openapi": "workspace:*",
6961
7193
  "@stackwright-pro/pulse": "workspace:*",
7194
+ "@stackwright-pro/telemetry": "workspace:*",
6962
7195
  "@stackwright-pro/types": "workspace:*",
7196
+ "@stackwright/mcp": "0.6.0-alpha.1",
6963
7197
  "@types/js-yaml": "^4.0.9",
6964
7198
  "js-yaml": "^4.2.0",
6965
7199
  zod: "^4.4.3"
@@ -6979,7 +7213,7 @@ var package_default = {
6979
7213
  "test:coverage": "vitest run --coverage"
6980
7214
  },
6981
7215
  name: "@stackwright-pro/mcp",
6982
- version: "0.2.0-alpha.95",
7216
+ version: "0.2.0-alpha.98",
6983
7217
  description: "MCP tools for Stackwright Pro - Data Explorer, Security, ISR, and Dashboard generation",
6984
7218
  license: "SEE LICENSE IN LICENSE",
6985
7219
  main: "./dist/server.js",
@@ -7003,6 +7237,11 @@ var package_default = {
7003
7237
  types: "./dist/tools/type-schemas.d.ts",
7004
7238
  import: "./dist/tools/type-schemas.mjs",
7005
7239
  require: "./dist/tools/type-schemas.js"
7240
+ },
7241
+ "./pipeline-constants": {
7242
+ types: "./dist/pipeline-constants.d.ts",
7243
+ import: "./dist/pipeline-constants.mjs",
7244
+ require: "./dist/pipeline-constants.js"
7006
7245
  }
7007
7246
  },
7008
7247
  files: [
@@ -7014,6 +7253,7 @@ var package_default = {
7014
7253
  };
7015
7254
 
7016
7255
  // src/server.ts
7256
+ var import_register = require("@stackwright/mcp/register");
7017
7257
  var server = new import_mcp.McpServer({
7018
7258
  name: "stackwright-pro",
7019
7259
  version: package_default.version
@@ -7038,6 +7278,29 @@ registerGetSchemaTool(server);
7038
7278
  registerScaffoldCleanupTools(server);
7039
7279
  registerContrastTools(server);
7040
7280
  registerCompileTools(server);
7281
+ (0, import_register.registerContentTypeTools)(server);
7282
+ (0, import_register.registerPageTools)(server);
7283
+ (0, import_register.registerSiteTools)(server);
7284
+ (0, import_register.registerProjectTools)(server);
7285
+ (0, import_register.registerGitOpsTools)(server);
7286
+ (0, import_register.registerBoardTools)(server);
7287
+ (0, import_register.registerCollectionTools)(server);
7288
+ (0, import_register.registerIntegrationTools)(server);
7289
+ (0, import_register.registerComposeTools)(server);
7290
+ (0, import_register.registerRenderTools)(server);
7291
+ (0, import_register.registerA11yTools)(server);
7292
+ process.on("SIGINT", async () => {
7293
+ const forceExit = setTimeout(() => process.exit(1), 3e3);
7294
+ forceExit.unref();
7295
+ await (0, import_register.closeBrowser)();
7296
+ process.exit(0);
7297
+ });
7298
+ process.on("SIGTERM", async () => {
7299
+ const forceExit = setTimeout(() => process.exit(1), 3e3);
7300
+ forceExit.unref();
7301
+ await (0, import_register.closeBrowser)();
7302
+ process.exit(0);
7303
+ });
7041
7304
  async function main() {
7042
7305
  const pipelineGraph = loadPipelineGraph();
7043
7306
  const phasePosition = new Map(PHASE_ORDER.map((p, i) => [p, i]));