@captain_z/zsk 1.8.3 → 1.8.5

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 (143) hide show
  1. package/dist/bin.js +13 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/commands/add-flow.d.ts +3 -7
  4. package/dist/commands/add-flow.js +7 -59
  5. package/dist/commands/add-flow.js.map +1 -1
  6. package/dist/commands/add.js +25 -104
  7. package/dist/commands/add.js.map +1 -1
  8. package/dist/commands/check.js +14 -575
  9. package/dist/commands/check.js.map +1 -1
  10. package/dist/commands/config.js +1 -1
  11. package/dist/commands/config.js.map +1 -1
  12. package/dist/commands/demo.d.ts +5 -0
  13. package/dist/commands/demo.js +70 -297
  14. package/dist/commands/demo.js.map +1 -1
  15. package/dist/commands/doctor.js +9 -4
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/gate.d.ts +1 -0
  18. package/dist/commands/gate.js +8 -2
  19. package/dist/commands/gate.js.map +1 -1
  20. package/dist/commands/prepare.js +7 -1
  21. package/dist/commands/prepare.js.map +1 -1
  22. package/dist/commands/project-init.js +30 -8
  23. package/dist/commands/project-init.js.map +1 -1
  24. package/dist/core/config.d.ts +68 -0
  25. package/dist/core/config.js +198 -15
  26. package/dist/core/config.js.map +1 -1
  27. package/dist/core/demo-auth.d.ts +30 -0
  28. package/dist/core/demo-auth.js +213 -0
  29. package/dist/core/demo-auth.js.map +1 -0
  30. package/dist/core/demo-scenarios.d.ts +62 -0
  31. package/dist/core/demo-scenarios.js +276 -0
  32. package/dist/core/demo-scenarios.js.map +1 -0
  33. package/dist/core/demo-sources.d.ts +37 -0
  34. package/dist/core/demo-sources.js +198 -0
  35. package/dist/core/demo-sources.js.map +1 -0
  36. package/dist/core/mcp-registry-discovery.d.ts +16 -0
  37. package/dist/core/mcp-registry-discovery.js +187 -0
  38. package/dist/core/mcp-registry-discovery.js.map +1 -0
  39. package/dist/core/origin-detection.js +1 -1
  40. package/dist/core/origin-detection.js.map +1 -1
  41. package/dist/core/prepare-artifacts.d.ts +16 -0
  42. package/dist/core/prepare-artifacts.js +25 -0
  43. package/dist/core/prepare-artifacts.js.map +1 -0
  44. package/dist/core/prepare-auth-helper.d.ts +8 -0
  45. package/dist/core/prepare-auth-helper.js +32 -0
  46. package/dist/core/prepare-auth-helper.js.map +1 -0
  47. package/dist/core/prepare-materialization.d.ts +8 -0
  48. package/dist/core/prepare-materialization.js +26 -0
  49. package/dist/core/prepare-materialization.js.map +1 -0
  50. package/dist/core/prepare-migration.d.ts +6 -0
  51. package/dist/core/prepare-migration.js +57 -0
  52. package/dist/core/prepare-migration.js.map +1 -0
  53. package/dist/core/prepare-reporting.d.ts +5 -0
  54. package/dist/core/prepare-reporting.js +106 -0
  55. package/dist/core/prepare-reporting.js.map +1 -0
  56. package/dist/core/prepare-routing.d.ts +12 -0
  57. package/dist/core/prepare-routing.js +182 -0
  58. package/dist/core/prepare-routing.js.map +1 -0
  59. package/dist/core/prepare-sync.d.ts +13 -53
  60. package/dist/core/prepare-sync.js +878 -359
  61. package/dist/core/prepare-sync.js.map +1 -1
  62. package/dist/core/prepare-utils.d.ts +6 -0
  63. package/dist/core/prepare-utils.js +35 -0
  64. package/dist/core/prepare-utils.js.map +1 -0
  65. package/dist/core/profile-bundle-installation.d.ts +55 -0
  66. package/dist/core/profile-bundle-installation.js +170 -0
  67. package/dist/core/profile-bundle-installation.js.map +1 -0
  68. package/dist/core/provider-policy.d.ts +26 -0
  69. package/dist/core/provider-policy.js +180 -0
  70. package/dist/core/provider-policy.js.map +1 -0
  71. package/dist/core/provider-readiness.d.ts +39 -0
  72. package/dist/core/provider-readiness.js +78 -0
  73. package/dist/core/provider-readiness.js.map +1 -0
  74. package/dist/core/source-adapter-normalization.d.ts +31 -0
  75. package/dist/core/source-adapter-normalization.js +235 -0
  76. package/dist/core/source-adapter-normalization.js.map +1 -0
  77. package/dist/core/source-snapshot-adapters.d.ts +59 -0
  78. package/dist/core/source-snapshot-adapters.js +60 -0
  79. package/dist/core/source-snapshot-adapters.js.map +1 -0
  80. package/dist/core/staffing-plan.d.ts +1 -0
  81. package/dist/core/staffing-plan.js +113 -21
  82. package/dist/core/staffing-plan.js.map +1 -1
  83. package/dist/core/stage-clarity-verification.d.ts +31 -0
  84. package/dist/core/stage-clarity-verification.js +316 -0
  85. package/dist/core/stage-clarity-verification.js.map +1 -0
  86. package/dist/core/stage-output-quality.d.ts +3 -0
  87. package/dist/core/stage-output-quality.js +122 -0
  88. package/dist/core/stage-output-quality.js.map +1 -0
  89. package/dist/core/stage-quality-artifacts.d.ts +15 -0
  90. package/dist/core/stage-quality-artifacts.js +421 -0
  91. package/dist/core/stage-quality-artifacts.js.map +1 -0
  92. package/dist/core/stage-quality-contracts.d.ts +105 -0
  93. package/dist/core/stage-quality-contracts.js +2 -0
  94. package/dist/core/stage-quality-contracts.js.map +1 -0
  95. package/dist/core/stage-quality-criteria.d.ts +9 -0
  96. package/dist/core/stage-quality-criteria.js +286 -0
  97. package/dist/core/stage-quality-criteria.js.map +1 -0
  98. package/dist/core/stage-quality-rendering.d.ts +15 -0
  99. package/dist/core/stage-quality-rendering.js +240 -0
  100. package/dist/core/stage-quality-rendering.js.map +1 -0
  101. package/dist/core/stage-quality.d.ts +4 -59
  102. package/dist/core/stage-quality.js +54 -795
  103. package/dist/core/stage-quality.js.map +1 -1
  104. package/dist/core/template-registry.js +12 -15
  105. package/dist/core/template-registry.js.map +1 -1
  106. package/dist/core/workspace-conformance.d.ts +39 -0
  107. package/dist/core/workspace-conformance.js +603 -0
  108. package/dist/core/workspace-conformance.js.map +1 -0
  109. package/package.json +2 -2
  110. package/schemas/providers.schema.json +74 -0
  111. package/schemas/zsk-config.schema.json +417 -1
  112. package/templates/module/frontend-module/design.md +10 -0
  113. package/templates/module/frontend-module/proposal.md +8 -0
  114. package/templates/module/frontend-module/spec.md +7 -0
  115. package/templates/project-init/.zsk/README.md +48 -0
  116. package/templates/project-init/.zsk/config.yaml +37 -0
  117. package/templates/project-init/.zsk/docs/CONFIG-SCHEMA.md +127 -0
  118. package/templates/project-init/.zsk/docs/PROJECT-CONFIG.md +53 -5
  119. package/templates/project-init/.zsk/docs/README.md +10 -0
  120. package/templates/project-init/.zsk/docs/SECURITY.md +34 -0
  121. package/templates/project-init/.zsk/docs/SYSTEM-SPEC.md +39 -7
  122. package/templates/project-init/.zsk/evidence/README.md +15 -0
  123. package/templates/project-init/.zsk/issues/README.md +10 -0
  124. package/templates/project-init/.zsk/modules/README.md +19 -0
  125. package/templates/project-init/.zsk/modules/index.md +9 -5
  126. package/templates/project-init/.zsk/raws/README.md +34 -0
  127. package/templates/project-init/.zsk/roles.yaml +36 -105
  128. package/templates/project-init/.zsk/templates/config.examples.yaml +83 -0
  129. package/templates/project-init/.zsk/templates/issue-card.md +23 -0
  130. package/templates/project-init/.zsk/templates/module/README.md +13 -0
  131. package/templates/project-init/.zsk/templates/module/design.md +22 -0
  132. package/templates/project-init/.zsk/templates/module/module.yaml +15 -0
  133. package/templates/project-init/.zsk/templates/module/proposal.md +20 -0
  134. package/templates/project-init/.zsk/templates/module/spec.md +22 -0
  135. package/templates/project-init/.zsk/templates/module/tasks.md +16 -0
  136. package/templates/project-init/.zsk/raws/index.md +0 -18
  137. package/templates/project-init/.zsk/raws/manifest.json +0 -4
  138. package/templates/project-init/.zsk/raws/prepare/backend/index.md +0 -4
  139. package/templates/project-init/.zsk/raws/prepare/design/index.md +0 -3
  140. package/templates/project-init/.zsk/raws/prepare/index.md +0 -4
  141. package/templates/project-init/.zsk/raws/prepare/product/index.md +0 -4
  142. package/templates/project-init/.zsk/raws/prepare/qa/index.md +0 -4
  143. package/templates/project-init/.zsk/raws/prepare/ux/index.md +0 -3
@@ -0,0 +1,62 @@
1
+ import { type ResolvedDemoAuthConfig } from "./demo-auth.js";
2
+ import { type DemoSourceDoc } from "./demo-sources.js";
3
+ export type OptimizedPlanStep = {
4
+ id: string;
5
+ intent: string;
6
+ action: "goto" | "fill" | "click" | "assert";
7
+ target?: string;
8
+ locator?: {
9
+ strategy: "role" | "text";
10
+ role?: string;
11
+ name?: string;
12
+ text?: string;
13
+ };
14
+ value?: string;
15
+ };
16
+ export type OptimizedDemoCase = {
17
+ id: string;
18
+ title: string;
19
+ source: string;
20
+ sourceKind: string;
21
+ sourceBasis: string[];
22
+ priority: "P0";
23
+ preconditions: string[];
24
+ uiObservationBoundary: {
25
+ role: "observation-only";
26
+ allowedOutput: string;
27
+ prohibitedOutputs: string[];
28
+ };
29
+ steps: OptimizedPlanStep[];
30
+ assertions: Array<{
31
+ intent: string;
32
+ type: "visible";
33
+ locator: {
34
+ strategy: "text";
35
+ text: string;
36
+ };
37
+ }>;
38
+ risks: string[];
39
+ };
40
+ type RoleTarget = {
41
+ role: string;
42
+ name: string;
43
+ };
44
+ export declare function synthesizeOptimizedDemoCases(params: {
45
+ moduleId: string;
46
+ sourceBasis: DemoSourceDoc[];
47
+ runtimeUrl?: string;
48
+ playwrightAuthState: string;
49
+ }): OptimizedDemoCase[];
50
+ export declare function renderOptimizedSpec(moduleId: string, demoAuth: ResolvedDemoAuthConfig, cases: Array<{
51
+ title: string;
52
+ source: string;
53
+ sourceBasis?: string[];
54
+ steps: OptimizedPlanStep[];
55
+ }>): string;
56
+ export declare function parseRoleTargets(snapshot: string): RoleTarget[];
57
+ export declare function synthesizePlaywrightSteps(targets: RoleTarget[], testCase: string): string[];
58
+ export declare function inferFillValue(testCase: string): string;
59
+ export declare function inferScenarioName(testCase: string): string | null;
60
+ export declare function slugify(value: string): string;
61
+ export declare function escapeForDoubleQuotedString(value: string): string;
62
+ export {};
@@ -0,0 +1,276 @@
1
+ import { basename } from "node:path";
2
+ import { demoAuthRuntimeLines, } from "./demo-auth.js";
3
+ import { inferRouteHint, selectDemoCaseSources, summarizeCaseSourceBasis, } from "./demo-sources.js";
4
+ export function synthesizeOptimizedDemoCases(params) {
5
+ const cases = [];
6
+ const caseSources = selectDemoCaseSources(params.sourceBasis);
7
+ for (const sourceDoc of caseSources) {
8
+ const content = sourceDoc.content;
9
+ const joinedSourceText = [content, ...params.sourceBasis.map((source) => source.content)].join("\n\n");
10
+ const title = inferScenarioName(content) ?? basename(sourceDoc.path).replace(/\.[^.]+$/, "") ?? "generated case";
11
+ const fillValue = inferFillValue(joinedSourceText);
12
+ const expectedText = inferExpectedText(joinedSourceText, fillValue);
13
+ const caseId = slugify(`${params.moduleId}-${title}`);
14
+ const routeHint = inferRouteHint(joinedSourceText, params.runtimeUrl);
15
+ const steps = [
16
+ {
17
+ id: "step-1",
18
+ intent: "Open the demo entry page",
19
+ action: "goto",
20
+ target: routeHint ?? "{{baseUrl}}",
21
+ },
22
+ {
23
+ id: "step-2",
24
+ intent: "Perform the primary user input from the source-backed scenario",
25
+ action: "fill",
26
+ locator: {
27
+ strategy: "role",
28
+ role: "textbox",
29
+ },
30
+ value: fillValue,
31
+ },
32
+ {
33
+ id: "step-3",
34
+ intent: "Submit or advance the flow",
35
+ action: "click",
36
+ locator: {
37
+ strategy: "role",
38
+ role: "button",
39
+ },
40
+ },
41
+ {
42
+ id: "step-4",
43
+ intent: "Verify the expected visible result",
44
+ action: "assert",
45
+ locator: {
46
+ strategy: "text",
47
+ text: expectedText,
48
+ },
49
+ },
50
+ ];
51
+ cases.push({
52
+ id: caseId,
53
+ title,
54
+ source: sourceDoc.path,
55
+ sourceKind: sourceDoc.kind,
56
+ sourceBasis: summarizeCaseSourceBasis(sourceDoc, params.sourceBasis),
57
+ priority: "P0",
58
+ preconditions: [
59
+ "Scenario is grounded in module design/spec/tasks, raw sources, existing tests, or implementation mapping.",
60
+ `If authentication is required, Playwright storageState is prepared under ${params.playwrightAuthState} and gitignored.`,
61
+ "Computer Use observation is preferred for visual/current-page refinement when available; otherwise use Playwright MCP/ARIA/CDP, manual evidence, or Browser Use only in runtimes that support it.",
62
+ ],
63
+ uiObservationBoundary: {
64
+ role: "observation-only",
65
+ allowedOutput: "structured observation with URL, page title, visible targets, role/label hints, auth/session note, and privacy note",
66
+ prohibitedOutputs: ["test-plan.json", ".spec.ts"],
67
+ },
68
+ steps,
69
+ assertions: [
70
+ {
71
+ intent: "Expected result from raw test case is visible",
72
+ type: "visible",
73
+ locator: {
74
+ strategy: "text",
75
+ text: expectedText,
76
+ },
77
+ },
78
+ ],
79
+ risks: [
80
+ "Generated locator names must be refined from Computer Use, Playwright MCP/ARIA/CDP, manual evidence, or supported Browser Use observation before promotion.",
81
+ "Do not fall back to Playwright MCP or the hybrid bridge in optimized mode.",
82
+ ],
83
+ });
84
+ }
85
+ return cases;
86
+ }
87
+ export function renderOptimizedSpec(moduleId, demoAuth, cases) {
88
+ const lines = [
89
+ `import { test, expect } from "@playwright/test";`,
90
+ `import { existsSync, mkdirSync, readFileSync } from "node:fs";`,
91
+ `import { dirname, resolve } from "node:path";`,
92
+ `import { homedir } from "node:os";`,
93
+ ``,
94
+ `const envFiles = ${JSON.stringify(demoAuth.envFiles)};`,
95
+ `const authEnv = ${JSON.stringify(demoAuth.env)};`,
96
+ `const authSelectors = ${JSON.stringify(demoAuth.selectors)};`,
97
+ `const storageStatePath = resolve(process.cwd(), process.env.ZSK_PLAYWRIGHT_STORAGE_STATE ?? ${quote(demoAuth.storageState)});`,
98
+ `const authMode = process.env.ZSK_DEMO_AUTH ?? ${quote(demoAuth.required ? "required" : "none")};`,
99
+ `const loginEnabled = ["1", "true", "yes"].includes((process.env.ZSK_DEMO_LOGIN ?? "").toLowerCase());`,
100
+ `const configuredLoginUrl = ${quote(demoAuth.loginUrl ?? "")};`,
101
+ `const loginUrl = process.env.ZSK_DEMO_LOGIN_URL ?? (configuredLoginUrl || process.env.ZSK_DEMO_BASE_URL);`,
102
+ ``,
103
+ ...demoAuthRuntimeLines(),
104
+ ``,
105
+ `test.describe.configure({ mode: "serial" });`,
106
+ ``,
107
+ `async function ensureDemoAuthState(browser) {`,
108
+ ` if (authMode === "none" || existsSync(storageStatePath)) return;`,
109
+ ` if (!loginEnabled) {`,
110
+ ` throw new Error([`,
111
+ ` \`Missing demo auth storageState: ${"${storageStatePath}"}\`,`,
112
+ ` "Run once with ZSK_DEMO_LOGIN=1 and --headed/PWDEBUG=1 to login and save state.",`,
113
+ ` "Set ZSK_DEMO_AUTH=none only for public flows that do not require login.",`,
114
+ ` ].join("\\n"));`,
115
+ ` }`,
116
+ ` if (!loginUrl) throw new Error("Set ZSK_DEMO_LOGIN_URL or ZSK_DEMO_BASE_URL before first login.");`,
117
+ ` loadConfiguredEnvFiles();`,
118
+ ` const context = await browser.newContext();`,
119
+ ` const page = await context.newPage();`,
120
+ ` await page.goto(loginUrl);`,
121
+ ` await fillConfiguredLogin(page);`,
122
+ ` await page.pause();`,
123
+ ` mkdirSync(dirname(storageStatePath), { recursive: true });`,
124
+ ` await context.storageState({ path: storageStatePath });`,
125
+ ` await context.close();`,
126
+ `}`,
127
+ ``,
128
+ `async function newDemoPage(browser) {`,
129
+ ` await ensureDemoAuthState(browser);`,
130
+ ` const context = await browser.newContext(authMode === "none" ? {} : { storageState: storageStatePath });`,
131
+ ` const page = await context.newPage();`,
132
+ ` return { context, page };`,
133
+ `}`,
134
+ ``,
135
+ `async function assertNotBlockedByLogin(page) {`,
136
+ ` await page.waitForLoadState("domcontentloaded").catch(() => undefined);`,
137
+ ` const urlLooksLogin = /login|signin|sign-in|auth|sso/i.test(page.url());`,
138
+ ` const passwordVisible = await page.locator("input[type='password']").first().isVisible({ timeout: 500 }).catch(() => false);`,
139
+ ` const loginTextVisible = await page.getByText(/登录|登陆|login|sign in|sign-in/i).first().isVisible({ timeout: 500 }).catch(() => false);`,
140
+ ` if (!urlLooksLogin && !passwordVisible) return;`,
141
+ ` throw new Error([`,
142
+ ` "Demo scenario was blocked by a login page before business assertions.",`,
143
+ ` \`Refresh ${"${storageStatePath}"} by running with ZSK_DEMO_LOGIN=1, or run zsk demo auth and execute the generated login helper.\`,`,
144
+ ` loginTextVisible ? "Login text was visible on the page." : "Password field or login URL was detected.",`,
145
+ ` ].join("\\n"));`,
146
+ `}`,
147
+ ``,
148
+ `test.describe("${escapeForDoubleQuotedString(moduleId)} optimized demo scenarios", () => {`,
149
+ ];
150
+ for (const testCase of cases) {
151
+ const goto = testCase.steps.find((step) => step.action === "goto");
152
+ const fill = testCase.steps.find((step) => step.action === "fill");
153
+ const click = testCase.steps.find((step) => step.action === "click");
154
+ const assertion = testCase.steps.find((step) => step.action === "assert");
155
+ lines.push(` test("${escapeForDoubleQuotedString(testCase.title)}", async ({ browser }) => {`, ` const baseUrl = process.env.ZSK_DEMO_BASE_URL;`, ` if (!baseUrl) throw new Error("Set ZSK_DEMO_BASE_URL to run this scenario.");`, ` const { context, page } = await newDemoPage(browser);`, ` try {`, goto?.target && goto.target !== "{{baseUrl}}"
156
+ ? ` await page.goto(new URL(${quote(goto.target)}, baseUrl).toString());`
157
+ : ` await page.goto(baseUrl);`, ` await assertNotBlockedByLogin(page);`, ``, ` // Source: ${escapeForLineComment(testCase.source)}`, ...(testCase.sourceBasis ?? [])
158
+ .slice(0, 5)
159
+ .map((source) => ` // Basis: ${escapeForLineComment(source)}`), ` // ZSK_GENERATED_REFINEMENT_REQUIRED: refine locator names from Computer Use, Playwright MCP/ARIA/CDP, manual evidence, or compatible Browser Use before promotion.`);
160
+ if (fill?.locator?.role && fill.value) {
161
+ lines.push(` await ${renderRoleLocator(fill.locator.role, fill.locator.name)}.fill(${quote(fill.value)});`);
162
+ }
163
+ if (click?.locator?.role) {
164
+ lines.push(` await ${renderRoleLocator(click.locator.role, click.locator.name)}.click();`);
165
+ }
166
+ if (assertion?.locator?.text) {
167
+ lines.push(` await expect(page.getByText(${quote(assertion.locator.text)})).toBeVisible();`);
168
+ }
169
+ else {
170
+ lines.push(` await expect(page).toHaveURL(/.+/);`);
171
+ }
172
+ lines.push(` } finally {`, ` await context.close();`, ` }`, ` });`, ``);
173
+ }
174
+ lines.push(`});`, ``);
175
+ return lines.join("\n");
176
+ }
177
+ export function parseRoleTargets(snapshot) {
178
+ const targets = [];
179
+ const rolePattern = /(?:^|\n)\s*-\s*(button|link|textbox|checkbox|heading|combobox|radio|menuitem)\s+"([^"]+)"/gi;
180
+ for (const match of snapshot.matchAll(rolePattern)) {
181
+ const role = normalizeRole(match[1] ?? "");
182
+ const name = (match[2] ?? "").trim();
183
+ if (!role || !name)
184
+ continue;
185
+ targets.push({ role, name });
186
+ }
187
+ return targets;
188
+ }
189
+ export function synthesizePlaywrightSteps(targets, testCase) {
190
+ const steps = [];
191
+ const textbox = targets.find((target) => target.role === "textbox");
192
+ const button = targets.find((target) => target.role === "button");
193
+ const link = targets.find((target) => target.role === "link");
194
+ const checkbox = targets.find((target) => target.role === "checkbox");
195
+ const heading = targets.find((target) => target.role === "heading");
196
+ const fillValue = inferFillValue(testCase);
197
+ steps.push(`// Generated from test case and structured aria/accessibility snapshot.`);
198
+ if (textbox) {
199
+ steps.push(`await page.getByRole("textbox", { name: ${quote(textbox.name)} }).fill(${quote(fillValue)});`);
200
+ }
201
+ if (checkbox && shouldCheck(testCase)) {
202
+ steps.push(`await page.getByRole("checkbox", { name: ${quote(checkbox.name)} }).check();`);
203
+ }
204
+ if (button) {
205
+ steps.push(`await page.getByRole("button", { name: ${quote(button.name)} }).click();`);
206
+ }
207
+ else if (link) {
208
+ steps.push(`await page.getByRole("link", { name: ${quote(link.name)} }).click();`);
209
+ }
210
+ if (heading) {
211
+ steps.push(`await expect(page.getByRole("heading", { name: ${quote(heading.name)} })).toBeVisible();`);
212
+ }
213
+ else if (textbox || button || link || checkbox) {
214
+ steps.push(`await expect(page).toHaveURL(/.+/);`);
215
+ }
216
+ else {
217
+ steps.push(`// Provide a Playwright accessibility snapshot to synthesize role-first locators.`);
218
+ steps.push(`await expect(page).toHaveURL(/.+/);`);
219
+ }
220
+ return steps;
221
+ }
222
+ export function inferFillValue(testCase) {
223
+ const quoted = testCase.match(/["“”']([^"“”']{2,80})["“”']/);
224
+ if (quoted?.[1])
225
+ return quoted[1];
226
+ const afterInput = testCase.match(/(?:输入|type|fill|enter)\s*[::]?\s*([^\n,,。]{2,80})/i);
227
+ if (afterInput?.[1])
228
+ return afterInput[1].trim();
229
+ return "demo value";
230
+ }
231
+ export function inferScenarioName(testCase) {
232
+ const heading = testCase.match(/^#\s+(.+)$/m);
233
+ if (heading?.[1])
234
+ return heading[1];
235
+ const title = testCase.match(/(?:title|标题|用例)[::]\s*(.+)/i);
236
+ if (title?.[1])
237
+ return title[1];
238
+ return null;
239
+ }
240
+ export function slugify(value) {
241
+ const slug = value
242
+ .toLowerCase()
243
+ .replace(/[^a-z0-9]+/g, "-")
244
+ .replace(/^-+|-+$/g, "");
245
+ return slug || "generated-from-test-case";
246
+ }
247
+ export function escapeForDoubleQuotedString(value) {
248
+ return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
249
+ }
250
+ function renderRoleLocator(role, name) {
251
+ if (name)
252
+ return `page.getByRole(${quote(role)}, { name: ${quote(name)} })`;
253
+ return `page.getByRole(${quote(role)}).first()`;
254
+ }
255
+ function normalizeRole(role) {
256
+ if (role === "textbox")
257
+ return "textbox";
258
+ return role.toLowerCase();
259
+ }
260
+ function shouldCheck(testCase) {
261
+ return /check|toggle|勾选|选中|切换/i.test(testCase);
262
+ }
263
+ function quote(value) {
264
+ return JSON.stringify(value);
265
+ }
266
+ function escapeForLineComment(value) {
267
+ return value.replace(/\*\//g, "* /").replace(/\n/g, " ");
268
+ }
269
+ function inferExpectedText(testCase, fallback) {
270
+ const expected = testCase.match(/(?:expect|should see|visible|断言|期望|显示|可见)\s*[::]?\s*["“”']?([^"“”'\n。]{2,80})/i);
271
+ if (expected?.[1])
272
+ return expected[1].trim();
273
+ const quoted = [...testCase.matchAll(/["“”']([^"“”']{2,80})["“”']/g)].map((match) => match[1]).filter(Boolean);
274
+ return quoted.at(-1) ?? fallback;
275
+ }
276
+ //# sourceMappingURL=demo-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-scenarios.js","sourceRoot":"","sources":["../../src/core/demo-scenarios.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { ProjectConfig } from "./config.js";
2
+ export type ModuleConfig = {
3
+ module?: {
4
+ id?: string;
5
+ };
6
+ sources?: Record<string, ModuleSourceValue | undefined>;
7
+ runtime?: {
8
+ url?: string;
9
+ };
10
+ tests?: {
11
+ raw_cases?: string[];
12
+ derived_cases?: string[];
13
+ automated?: {
14
+ unit?: string[];
15
+ integration?: string[];
16
+ e2e?: string[];
17
+ };
18
+ };
19
+ };
20
+ export type ModuleSourceValue = string[] | {
21
+ source?: string;
22
+ path?: string;
23
+ paths?: string[];
24
+ sections?: string[];
25
+ };
26
+ export type DemoSourceKind = "stage-doc" | "raw" | "test-case" | "existing-test" | "implementation";
27
+ export type DemoSourceDoc = {
28
+ kind: DemoSourceKind;
29
+ path: string;
30
+ content: string;
31
+ };
32
+ export declare function collectDemoSourceBasis(target: string, config: ProjectConfig, moduleId: string, moduleConfig: ModuleConfig): Promise<DemoSourceDoc[]>;
33
+ export declare function testCasePathsFromModule(moduleConfig: ModuleConfig): string[];
34
+ export declare function selectDemoCaseSources(sourceBasis: DemoSourceDoc[]): DemoSourceDoc[];
35
+ export declare function summarizeCaseSourceBasis(primary: DemoSourceDoc, sourceBasis: DemoSourceDoc[]): string[];
36
+ export declare function summarizeText(content: string): string;
37
+ export declare function inferRouteHint(content: string, runtimeUrl: string | undefined): string | undefined;
@@ -0,0 +1,198 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import { join, relative, resolve } from "node:path";
3
+ import { getWorkspacePath } from "./workspace-layout.js";
4
+ export async function collectDemoSourceBasis(target, config, moduleId, moduleConfig) {
5
+ const docs = [];
6
+ const moduleRoot = resolve(target, getWorkspacePath(config, "moduleRoot", { module: moduleId }));
7
+ for (const name of ["proposal.md", "spec.md", "design.md", "tasks.md", "CONTEXT.md"]) {
8
+ const doc = await readDemoSourcePath(target, relative(target, join(moduleRoot, name)), "stage-doc");
9
+ if (doc)
10
+ docs.push(doc);
11
+ }
12
+ for (const path of testCasePathsFromModule(moduleConfig)) {
13
+ const doc = await readDemoSourcePath(target, path, "test-case");
14
+ if (doc)
15
+ docs.push(doc);
16
+ }
17
+ for (const path of automatedTestPathsFromModule(moduleConfig)) {
18
+ const doc = await readDemoSourcePath(target, path, "existing-test");
19
+ if (doc)
20
+ docs.push(doc);
21
+ }
22
+ for (const [sourceKey, value] of Object.entries(moduleConfig.sources ?? {})) {
23
+ for (const path of pathsFromModuleSourceValue(value)) {
24
+ const doc = await readDemoSourcePath(target, path, classifyModuleSource(sourceKey, path));
25
+ if (doc)
26
+ docs.push(doc);
27
+ }
28
+ }
29
+ return uniqueSourceDocs(docs);
30
+ }
31
+ export function testCasePathsFromModule(moduleConfig) {
32
+ return uniqueStrings([
33
+ ...(moduleConfig.tests?.raw_cases ?? []),
34
+ ...pathsFromNamedModuleSources(moduleConfig, ["testing", "test", "tests", "test_cases", "qa"]),
35
+ ]);
36
+ }
37
+ export function selectDemoCaseSources(sourceBasis) {
38
+ const testSources = sourceBasis.filter((source) => source.kind === "test-case");
39
+ if (testSources.length > 0)
40
+ return testSources.slice(0, 12);
41
+ const existingTests = sourceBasis.filter((source) => source.kind === "existing-test");
42
+ if (existingTests.length > 0)
43
+ return existingTests.slice(0, 8);
44
+ const stageDocs = sourceBasis.filter((source) => source.kind === "stage-doc" && /(?:spec|design|tasks)\.md$/i.test(source.path));
45
+ if (stageDocs.length > 0)
46
+ return stageDocs.slice(0, 3);
47
+ const rawSources = sourceBasis.filter((source) => source.kind === "raw");
48
+ if (rawSources.length > 0)
49
+ return rawSources.slice(0, 3);
50
+ return sourceBasis.slice(0, 1);
51
+ }
52
+ export function summarizeCaseSourceBasis(primary, sourceBasis) {
53
+ return uniqueStrings([
54
+ `${primary.kind}: ${primary.path}`,
55
+ ...sourceBasis
56
+ .filter((source) => source.path !== primary.path)
57
+ .slice(0, 6)
58
+ .map((source) => `${source.kind}: ${source.path}`),
59
+ ]);
60
+ }
61
+ export function summarizeText(content) {
62
+ const text = content
63
+ .split("\n")
64
+ .map((line) => line.trim())
65
+ .filter(Boolean)
66
+ .find((line) => !line.startsWith("#") && !line.startsWith("-")) ?? content.trim();
67
+ return truncate(text.replace(/\s+/g, " "), 180);
68
+ }
69
+ export function inferRouteHint(content, runtimeUrl) {
70
+ if (runtimeUrl?.trim())
71
+ return runtimeUrl.trim();
72
+ const route = content.match(/(?:route|url|path|页面|路由|入口)[::]\s*`?((?:https?:\/\/|\/)[^\s`,,。)]+)/i);
73
+ return route?.[1]?.trim();
74
+ }
75
+ function automatedTestPathsFromModule(moduleConfig) {
76
+ return uniqueStrings([
77
+ ...(moduleConfig.tests?.derived_cases ?? []),
78
+ ...(moduleConfig.tests?.automated?.unit ?? []),
79
+ ...(moduleConfig.tests?.automated?.integration ?? []),
80
+ ...(moduleConfig.tests?.automated?.e2e ?? []),
81
+ ]);
82
+ }
83
+ function pathsFromNamedModuleSources(moduleConfig, names) {
84
+ const expected = new Set(names);
85
+ return Object.entries(moduleConfig.sources ?? {})
86
+ .filter(([key]) => expected.has(key.replace(/[-_]/g, "_")))
87
+ .flatMap(([, value]) => pathsFromModuleSourceValue(value));
88
+ }
89
+ function pathsFromModuleSourceValue(value) {
90
+ if (Array.isArray(value))
91
+ return value.filter(isNonEmptyString);
92
+ if (!value || typeof value !== "object")
93
+ return [];
94
+ return uniqueStrings([
95
+ typeof value.path === "string" ? value.path : undefined,
96
+ ...(Array.isArray(value.paths) ? value.paths : []),
97
+ ].filter(isNonEmptyString));
98
+ }
99
+ async function readDemoSourcePath(target, path, kind) {
100
+ if (!path || /[*?[\]{}]/.test(path))
101
+ return null;
102
+ const abs = resolve(target, path);
103
+ const info = await safeStat(abs);
104
+ if (!info)
105
+ return null;
106
+ const rel = relative(target, abs) || path;
107
+ if (info.isFile) {
108
+ const content = truncate(await readOptional(abs), 12_000);
109
+ if (!content.trim())
110
+ return null;
111
+ return { kind, path: rel, content };
112
+ }
113
+ if (!info.isDirectory)
114
+ return null;
115
+ const entries = await safeReadDir(abs);
116
+ const visible = entries
117
+ .filter((entry) => !entry.name.startsWith("."))
118
+ .sort((a, b) => a.name.localeCompare(b.name));
119
+ const files = visible.filter((entry) => entry.isFile()).slice(0, 24);
120
+ const snippets = [];
121
+ for (const entry of files.filter((file) => isReadableDemoSourceFile(file.name)).slice(0, kind === "implementation" ? 6 : 10)) {
122
+ const filePath = join(abs, entry.name);
123
+ const body = truncate(await readOptional(filePath), kind === "implementation" ? 2_000 : 4_000);
124
+ if (body.trim())
125
+ snippets.push(`## ${relative(target, filePath)}\n\n${body.trim()}`);
126
+ }
127
+ const content = [
128
+ `Directory: ${rel}`,
129
+ "",
130
+ "Files:",
131
+ ...visible.slice(0, 40).map((entry) => `- ${entry.name}${entry.isDirectory() ? "/" : ""}`),
132
+ "",
133
+ ...snippets,
134
+ ].join("\n");
135
+ return { kind, path: rel, content: truncate(content, 12_000) };
136
+ }
137
+ function classifyModuleSource(sourceKey, path) {
138
+ const key = `${sourceKey} ${path}`.toLowerCase();
139
+ if (/test|case|qa|spec\.|e2e|playwright|vitest|jest/.test(key))
140
+ return "test-case";
141
+ if (/code|implementation|repo|repository|src\/|app\/|components?\/|pages?\//.test(key))
142
+ return "implementation";
143
+ if (/raw|srs|prd|requirement|design|figma|issue|research|customer/.test(key))
144
+ return "raw";
145
+ return "raw";
146
+ }
147
+ async function readOptional(file) {
148
+ try {
149
+ return await readFile(file, "utf8");
150
+ }
151
+ catch {
152
+ return "";
153
+ }
154
+ }
155
+ async function safeStat(path) {
156
+ try {
157
+ const info = await stat(path);
158
+ return { isFile: info.isFile(), isDirectory: info.isDirectory() };
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ async function safeReadDir(path) {
165
+ try {
166
+ return await readdir(path, { withFileTypes: true });
167
+ }
168
+ catch {
169
+ return [];
170
+ }
171
+ }
172
+ function isReadableDemoSourceFile(name) {
173
+ return /\.(md|mdx|txt|yaml|yml|json|ts|tsx|js|jsx|vue|svelte|html)$/i.test(name);
174
+ }
175
+ function isNonEmptyString(value) {
176
+ return typeof value === "string" && value.trim().length > 0;
177
+ }
178
+ function uniqueStrings(values) {
179
+ return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean)));
180
+ }
181
+ function uniqueSourceDocs(values) {
182
+ const seen = new Set();
183
+ const docs = [];
184
+ for (const value of values) {
185
+ const key = value.path;
186
+ if (seen.has(key))
187
+ continue;
188
+ seen.add(key);
189
+ docs.push(value);
190
+ }
191
+ return docs;
192
+ }
193
+ function truncate(value, max) {
194
+ if (value.length <= max)
195
+ return value;
196
+ return `${value.slice(0, max - 24).trimEnd()}\n...[truncated by zsk]`;
197
+ }
198
+ //# sourceMappingURL=demo-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo-sources.js","sourceRoot":"","sources":["../../src/core/demo-sources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAsCzD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,MAAqB,EACrB,QAAgB,EAChB,YAA0B;IAE1B,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACjG,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;QACrF,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACpG,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,uBAAuB,CAAC,YAAY,CAAC,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAChE,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,4BAA4B,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QACpE,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5E,KAAK,MAAM,IAAI,IAAI,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1F,IAAI,GAAG;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,YAA0B;IAChE,OAAO,aAAa,CAAC;QACnB,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;QACxC,GAAG,2BAA2B,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;KAC/F,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAA4B;IAChE,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IAChF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IACtF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9C,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAC/E,CAAC;IACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACzE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAsB,EAAE,WAA4B;IAC3F,OAAO,aAAa,CAAC;QACnB,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE;QAClC,GAAG,WAAW;aACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;aAChD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;KACrD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,IAAI,GAAG,OAAO;SACjB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACpF,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,UAA8B;IAC5E,IAAI,UAAU,EAAE,IAAI,EAAE;QAAE,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IACpG,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,4BAA4B,CAAC,YAA0B;IAC9D,OAAO,aAAa,CAAC;QACnB,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,aAAa,IAAI,EAAE,CAAC;QAC5C,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;QAC9C,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC;QACrD,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,2BAA2B,CAAC,YAA0B,EAAE,KAAe;IAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;SAC9C,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;SAC1D,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAoC;IACtE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACnD,OAAO,aAAa,CAAC;QACnB,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACvD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,IAAY,EACZ,IAAoB;IAEpB,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACtC,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,OAAO;SACpB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7H,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/F,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,OAAO,GAAG;QACd,cAAc,GAAG,EAAE;QACnB,EAAE;QACF,QAAQ;QACR,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1F,EAAE;QACF,GAAG,QAAQ;KACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB,EAAE,IAAY;IAC3D,MAAM,GAAG,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,gDAAgD,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IACnF,IAAI,wEAAwE,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAChH,IAAI,8DAA8D,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY;IAC5C,OAAO,8DAA8D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,aAAa,CAAC,MAAgB;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuB;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,yBAAyB,CAAC;AACxE,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type McpRegistryRegistration = {
2
+ name: string;
3
+ host: "workspace" | "vscode";
4
+ scope: "workspace" | "user";
5
+ configPath: string;
6
+ transport?: "stdio" | "http" | "sse";
7
+ commandLabel?: string;
8
+ url?: string;
9
+ envKeys: string[];
10
+ staticTools?: string[];
11
+ };
12
+ export type McpRegistryDiscovery = {
13
+ registrations: McpRegistryRegistration[];
14
+ warnings: string[];
15
+ };
16
+ export declare function discoverMcpRegistries(target: string): Promise<McpRegistryDiscovery>;