@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/integrity.d.mts +2 -1
- package/dist/integrity.d.ts +2 -1
- package/dist/integrity.js +21 -14
- package/dist/integrity.js.map +1 -1
- package/dist/integrity.mjs +20 -14
- package/dist/integrity.mjs.map +1 -1
- package/dist/pipeline-constants.d.mts +30 -0
- package/dist/pipeline-constants.d.ts +30 -0
- package/dist/pipeline-constants.js +445 -0
- package/dist/pipeline-constants.js.map +1 -0
- package/dist/pipeline-constants.mjs +429 -0
- package/dist/pipeline-constants.mjs.map +1 -0
- package/dist/server.js +285 -22
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +298 -22
- package/dist/server.mjs.map +1 -1
- package/package.json +10 -3
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
|
|
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
|
|
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
|
-
"
|
|
5699
|
+
"b3ad28c4404af9fb3c2cfce258c707dadd37bc59ac236e1f46d6163cd8d5dc9b"
|
|
5473
5700
|
],
|
|
5474
5701
|
[
|
|
5475
5702
|
"stackwright-pro-auth-otter.json",
|
|
5476
|
-
"
|
|
5703
|
+
"1a21d9f23e250f23291124307e5a2a32af5a716566319a3290372dae3d02e637"
|
|
5477
5704
|
],
|
|
5478
5705
|
[
|
|
5479
5706
|
"stackwright-pro-dashboard-otter.json",
|
|
5480
|
-
"
|
|
5707
|
+
"d9277616db5680ce3d598908fa3a1b0d0f626e33948785a4c64703b85e463b31"
|
|
5481
5708
|
],
|
|
5482
5709
|
[
|
|
5483
5710
|
"stackwright-pro-data-otter.json",
|
|
5484
|
-
"
|
|
5711
|
+
"536cba95f32667e81ae4b6335378a095f91095598defff0de00af231ebdbc488"
|
|
5485
5712
|
],
|
|
5486
5713
|
[
|
|
5487
5714
|
"stackwright-pro-designer-otter.json",
|
|
5488
|
-
"
|
|
5715
|
+
"69a6c09fbb54f971c48eae7fd52faa63cf79be2923e435aca9ff802e8d541d0f"
|
|
5489
5716
|
],
|
|
5490
5717
|
[
|
|
5491
5718
|
"stackwright-pro-domain-expert-otter.json",
|
|
5492
|
-
"
|
|
5719
|
+
"14d77cade020f44d1b5a2b406e2599501f3466ee90ca4248500a441d419bc59c"
|
|
5493
5720
|
],
|
|
5494
5721
|
[
|
|
5495
5722
|
"stackwright-pro-foreman-otter.json",
|
|
5496
|
-
"
|
|
5723
|
+
"4db4639e618cdd008d86c416bbc88bd4b2a7965e4bfcf01ec54b828f04ccb816"
|
|
5497
5724
|
],
|
|
5498
5725
|
[
|
|
5499
5726
|
"stackwright-pro-form-wizard-otter.json",
|
|
5500
|
-
"
|
|
5727
|
+
"7f6f94192f26face57dc8b2e22e0a49d23ceeeb356ca4ebde05492f1b25e3c47"
|
|
5501
5728
|
],
|
|
5502
5729
|
[
|
|
5503
5730
|
"stackwright-pro-geo-otter.json",
|
|
5504
|
-
"
|
|
5731
|
+
"15f2327b69f75a9c772c2acad5a5d6d3daefb7b55a079aca3205ecd4f33ae349"
|
|
5505
5732
|
],
|
|
5506
5733
|
[
|
|
5507
5734
|
"stackwright-pro-page-otter.json",
|
|
5508
|
-
"
|
|
5735
|
+
"c467c5d03b69d87fb1efa9482674a25e2f63782189db74b65309928d47456176"
|
|
5509
5736
|
],
|
|
5510
5737
|
[
|
|
5511
5738
|
"stackwright-pro-polish-otter.json",
|
|
5512
|
-
"
|
|
5739
|
+
"1cfea28e121e30181b0a7c8bda0700ffc892a6f919a0ec64996a4cf3f7735b51"
|
|
5740
|
+
],
|
|
5741
|
+
[
|
|
5742
|
+
"stackwright-pro-qa-otter.json",
|
|
5743
|
+
"822075893bb4f8496f3dca7b0e68eda460a6fbde87480c13c194582eb7744318"
|
|
5513
5744
|
],
|
|
5514
5745
|
[
|
|
5515
5746
|
"stackwright-pro-scaffold-otter.json",
|
|
5516
|
-
"
|
|
5747
|
+
"341d74ff2be24893ed174e869dc40c090f82e25e11d412d63519944512c37f15"
|
|
5517
5748
|
],
|
|
5518
5749
|
[
|
|
5519
5750
|
"stackwright-pro-theme-otter.json",
|
|
5520
|
-
"
|
|
5751
|
+
"b0eccc1945e30b80a0f9a3209c5428e8e32cd09063bd9b2ef7ecb891343774f2"
|
|
5521
5752
|
],
|
|
5522
5753
|
[
|
|
5523
5754
|
"stackwright-services-otter.json",
|
|
5524
|
-
"
|
|
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.
|
|
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]));
|