@captain_z/zsk 1.8.4 → 1.8.6

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 (129) hide show
  1. package/dist/bin.js +13 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/commands/check.js +14 -575
  4. package/dist/commands/check.js.map +1 -1
  5. package/dist/commands/config.js +4 -3
  6. package/dist/commands/config.js.map +1 -1
  7. package/dist/commands/demo.d.ts +5 -0
  8. package/dist/commands/demo.js +70 -297
  9. package/dist/commands/demo.js.map +1 -1
  10. package/dist/commands/doctor.js +9 -4
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/gate.d.ts +1 -0
  13. package/dist/commands/gate.js +8 -2
  14. package/dist/commands/gate.js.map +1 -1
  15. package/dist/commands/prepare.js +14 -1
  16. package/dist/commands/prepare.js.map +1 -1
  17. package/dist/commands/project-init.js +31 -8
  18. package/dist/commands/project-init.js.map +1 -1
  19. package/dist/core/config.d.ts +68 -0
  20. package/dist/core/config.js +213 -17
  21. package/dist/core/config.js.map +1 -1
  22. package/dist/core/demo-auth.d.ts +30 -0
  23. package/dist/core/demo-auth.js +213 -0
  24. package/dist/core/demo-auth.js.map +1 -0
  25. package/dist/core/demo-scenarios.d.ts +62 -0
  26. package/dist/core/demo-scenarios.js +276 -0
  27. package/dist/core/demo-scenarios.js.map +1 -0
  28. package/dist/core/demo-sources.d.ts +37 -0
  29. package/dist/core/demo-sources.js +198 -0
  30. package/dist/core/demo-sources.js.map +1 -0
  31. package/dist/core/mcp-registry-discovery.d.ts +16 -0
  32. package/dist/core/mcp-registry-discovery.js +187 -0
  33. package/dist/core/mcp-registry-discovery.js.map +1 -0
  34. package/dist/core/origin-detection.js +1 -1
  35. package/dist/core/origin-detection.js.map +1 -1
  36. package/dist/core/prepare-artifacts.d.ts +16 -0
  37. package/dist/core/prepare-artifacts.js +25 -0
  38. package/dist/core/prepare-artifacts.js.map +1 -0
  39. package/dist/core/prepare-auth-helper.d.ts +8 -0
  40. package/dist/core/prepare-auth-helper.js +32 -0
  41. package/dist/core/prepare-auth-helper.js.map +1 -0
  42. package/dist/core/prepare-lifecycle.d.ts +2 -0
  43. package/dist/core/prepare-lifecycle.js +49 -0
  44. package/dist/core/prepare-lifecycle.js.map +1 -1
  45. package/dist/core/prepare-materialization.d.ts +8 -0
  46. package/dist/core/prepare-materialization.js +26 -0
  47. package/dist/core/prepare-materialization.js.map +1 -0
  48. package/dist/core/prepare-migration.d.ts +6 -0
  49. package/dist/core/prepare-migration.js +57 -0
  50. package/dist/core/prepare-migration.js.map +1 -0
  51. package/dist/core/prepare-reporting.d.ts +5 -0
  52. package/dist/core/prepare-reporting.js +106 -0
  53. package/dist/core/prepare-reporting.js.map +1 -0
  54. package/dist/core/prepare-routing.d.ts +12 -0
  55. package/dist/core/prepare-routing.js +182 -0
  56. package/dist/core/prepare-routing.js.map +1 -0
  57. package/dist/core/prepare-sync.d.ts +11 -22
  58. package/dist/core/prepare-sync.js +811 -260
  59. package/dist/core/prepare-sync.js.map +1 -1
  60. package/dist/core/prepare-utils.d.ts +6 -0
  61. package/dist/core/prepare-utils.js +35 -0
  62. package/dist/core/prepare-utils.js.map +1 -0
  63. package/dist/core/provider-policy.d.ts +26 -0
  64. package/dist/core/provider-policy.js +180 -0
  65. package/dist/core/provider-policy.js.map +1 -0
  66. package/dist/core/provider-readiness.d.ts +39 -0
  67. package/dist/core/provider-readiness.js +78 -0
  68. package/dist/core/provider-readiness.js.map +1 -0
  69. package/dist/core/source-adapter-normalization.d.ts +31 -0
  70. package/dist/core/source-adapter-normalization.js +235 -0
  71. package/dist/core/source-adapter-normalization.js.map +1 -0
  72. package/dist/core/source-snapshot-adapters.d.ts +3 -3
  73. package/dist/core/source-snapshot-adapters.js +2 -24
  74. package/dist/core/source-snapshot-adapters.js.map +1 -1
  75. package/dist/core/staffing-plan.d.ts +1 -0
  76. package/dist/core/staffing-plan.js +61 -3
  77. package/dist/core/staffing-plan.js.map +1 -1
  78. package/dist/core/stage-clarity-verification.js +21 -18
  79. package/dist/core/stage-clarity-verification.js.map +1 -1
  80. package/dist/core/stage-output-quality.d.ts +3 -0
  81. package/dist/core/stage-output-quality.js +122 -0
  82. package/dist/core/stage-output-quality.js.map +1 -0
  83. package/dist/core/stage-quality-contracts.d.ts +19 -0
  84. package/dist/core/stage-quality-contracts.js.map +1 -1
  85. package/dist/core/stage-quality-criteria.js +0 -37
  86. package/dist/core/stage-quality-criteria.js.map +1 -1
  87. package/dist/core/stage-quality-rendering.d.ts +4 -2
  88. package/dist/core/stage-quality-rendering.js +130 -12
  89. package/dist/core/stage-quality-rendering.js.map +1 -1
  90. package/dist/core/stage-quality.js +17 -6
  91. package/dist/core/stage-quality.js.map +1 -1
  92. package/dist/core/template-registry.js +12 -15
  93. package/dist/core/template-registry.js.map +1 -1
  94. package/dist/core/workspace-conformance.d.ts +39 -0
  95. package/dist/core/workspace-conformance.js +603 -0
  96. package/dist/core/workspace-conformance.js.map +1 -0
  97. package/package.json +2 -2
  98. package/schemas/providers.schema.json +74 -0
  99. package/schemas/zsk-config.schema.json +417 -1
  100. package/templates/project-init/.zsk/README.md +57 -0
  101. package/templates/project-init/.zsk/config.yaml +41 -33
  102. package/templates/project-init/.zsk/docs/CONFIG-SCHEMA.md +131 -0
  103. package/templates/project-init/.zsk/docs/PROJECT-CONFIG.md +49 -28
  104. package/templates/project-init/.zsk/docs/README.md +10 -0
  105. package/templates/project-init/.zsk/docs/SECURITY.md +34 -0
  106. package/templates/project-init/.zsk/docs/SYSTEM-SPEC.md +26 -9
  107. package/templates/project-init/.zsk/evidence/README.md +21 -0
  108. package/templates/project-init/.zsk/evidence/prepare/README.md +22 -0
  109. package/templates/project-init/.zsk/issues/README.md +10 -0
  110. package/templates/project-init/.zsk/modules/README.md +19 -0
  111. package/templates/project-init/.zsk/modules/index.md +9 -5
  112. package/templates/project-init/.zsk/raws/README.md +39 -0
  113. package/templates/project-init/.zsk/roles.yaml +36 -105
  114. package/templates/project-init/.zsk/templates/config.examples.yaml +104 -0
  115. package/templates/project-init/.zsk/templates/issue-card.md +23 -0
  116. package/templates/project-init/.zsk/templates/module/README.md +13 -0
  117. package/templates/project-init/.zsk/templates/module/design.md +22 -0
  118. package/templates/project-init/.zsk/templates/module/module.yaml +15 -0
  119. package/templates/project-init/.zsk/templates/module/proposal.md +20 -0
  120. package/templates/project-init/.zsk/templates/module/spec.md +22 -0
  121. package/templates/project-init/.zsk/templates/module/tasks.md +16 -0
  122. package/templates/project-init/.zsk/raws/index.md +0 -34
  123. package/templates/project-init/.zsk/raws/manifest.json +0 -4
  124. package/templates/project-init/.zsk/raws/prepare/backend/index.md +0 -4
  125. package/templates/project-init/.zsk/raws/prepare/design/index.md +0 -21
  126. package/templates/project-init/.zsk/raws/prepare/index.md +0 -37
  127. package/templates/project-init/.zsk/raws/prepare/product/index.md +0 -4
  128. package/templates/project-init/.zsk/raws/prepare/qa/index.md +0 -4
  129. package/templates/project-init/.zsk/raws/prepare/ux/index.md +0 -22
@@ -40,8 +40,9 @@ export async function setup(opts = {}) {
40
40
  console.log(pc.dim(`config: ${result.configFile}`));
41
41
  console.log([
42
42
  "",
43
- "Give your AI assistant the local paths, materialized snapshots, or remote/provider references for SRS, PRD, design assets/sources, API contracts, management-system records, and test cases.",
44
- "The assistant should update .zsk/config.yaml sources under grouped prepare lanes such as sources.prepare.product/backend/design/ux/qa or project-defined lanes, with type, origin, and optional snapshot fields under paths.raws, then run zsk config check or zsk config draft.",
43
+ "Give your AI assistant the stable entry links or local paths for SRS, PRD, design sources, API contracts, management-system feeds, and test cases.",
44
+ "Configure each platform provider once. Keep .zsk/config.yaml focused on durable entry sources, not every discovered child page, node, issue, or file.",
45
+ "For discovered candidates, run zsk prepare draft or zsk prepare plan and review config-draft.yaml plus source-promotion-suggestions.md. Apply selected entries to .zsk/config.yaml only after human confirmation, then run zsk config check.",
45
46
  ].join("\n"));
46
47
  }
47
48
  export async function draft(opts = {}) {
@@ -106,7 +107,7 @@ export async function eject(part, opts = {}) {
106
107
  for (const warning of result.warnings) {
107
108
  console.warn(pc.yellow(`! ${warning.file}: ${warning.message}`));
108
109
  }
109
- const blockingIssues = result.issues.filter((issue) => !(parts.includes("roles") && issue.path === "/customize/roles"));
110
+ const blockingIssues = result.issues.filter((issue) => !(parts.includes("roles") && (issue.path === "/customize/roles" || issue.path === "/staffing/rolePool")));
110
111
  if (blockingIssues.length > 0) {
111
112
  console.error(pc.red("✗ zsk config eject stopped: config check failed"));
112
113
  console.error(formatConfigIssues(blockingIssues));
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,10 @@ export type McpConfigOptions = {
12
12
  target?: string;
13
13
  write?: boolean;
14
14
  };
15
+ export type DemoAuthOptions = DemoOptions & {
16
+ url?: string;
17
+ out?: string;
18
+ };
15
19
  export type DemoRunOptions = DemoOptions & {
16
20
  optimized?: boolean;
17
21
  playwright?: boolean;
@@ -30,3 +34,4 @@ export declare function scenarioRecord(opts?: DemoOptions): Promise<void>;
30
34
  export declare function scenarioPromote(opts?: DemoOptions): Promise<void>;
31
35
  export declare function scenarioGenerate(opts?: ScenarioGenerateOptions): Promise<void>;
32
36
  export declare function mcpConfig(opts?: McpConfigOptions): Promise<void>;
37
+ export declare function auth(opts?: DemoAuthOptions): Promise<void>;
@@ -1,9 +1,13 @@
1
1
  import pc from "picocolors";
2
2
  import { mkdir, readFile, writeFile } from "node:fs/promises";
3
- import { join, resolve } from "node:path";
3
+ import { dirname, join, relative, resolve } from "node:path";
4
4
  import YAML from "yaml";
5
5
  import { resolvePath } from "../core/targets.js";
6
6
  import { checkProjectConfig, findModuleConfigFiles, readProjectConfig, } from "../core/config.js";
7
+ import { renderDemoLoginHelper, resolveDemoAuthConfig, validatePlaywrightAuthState, } from "../core/demo-auth.js";
8
+ import { collectDemoSourceBasis, summarizeText, testCasePathsFromModule, } from "../core/demo-sources.js";
9
+ import { escapeForDoubleQuotedString, inferScenarioName, parseRoleTargets, renderOptimizedSpec, slugify, synthesizeOptimizedDemoCases, synthesizePlaywrightSteps, } from "../core/demo-scenarios.js";
10
+ import { resolvePlaywrightAuthStatePath } from "../core/workspace-conformance.js";
7
11
  import { getWorkspacePath, interpolateModulePath } from "../core/workspace-layout.js";
8
12
  export async function start(opts = {}) {
9
13
  const ctx = await prepare(opts);
@@ -85,7 +89,11 @@ export async function run(opts = {}) {
85
89
  await persistSession(ctx, session);
86
90
  console.log(pc.green(`✓ zsk demo run prepared (${mode})`));
87
91
  if (mode === "optimized") {
88
- console.log(pc.dim("optimized: raw testing inputs -> test-plan.json -> Playwright spec; no MCP or bridge fallback."));
92
+ console.log(pc.dim("optimized: source-backed inputs -> test-plan.json -> Playwright spec; no MCP or bridge fallback."));
93
+ if (ctx.demoAuth.required && session.auth?.status === "missing") {
94
+ console.log(pc.yellow(`! demo auth state missing: ${session.auth.storageState}`));
95
+ console.log(pc.dim(` run once with ZSK_DEMO_LOGIN=1, or run zsk demo auth -m ${ctx.moduleId} and execute the generated helper; set automation.demo.auth.required=false only for public flows.`));
96
+ }
89
97
  }
90
98
  if (mode === "computer-use") {
91
99
  console.log(pc.yellow("! Computer Use is the preferred visual/system observation lane when available; record fallback if the runtime does not provide it."));
@@ -228,6 +236,33 @@ export async function mcpConfig(opts = {}) {
228
236
  }
229
237
  console.log(content);
230
238
  }
239
+ export async function auth(opts = {}) {
240
+ const ctx = await prepare(opts);
241
+ const moduleConfig = await readModuleConfig(ctx.target, ctx.moduleId);
242
+ let statePath;
243
+ try {
244
+ statePath = resolvePlaywrightAuthStatePath(ctx.target, ctx.config, opts.out ?? ctx.demoAuth.storageState);
245
+ }
246
+ catch {
247
+ console.error(pc.red("✗ zsk demo auth stopped: storageState must stay under module or shared Playwright .auth"));
248
+ process.exit(1);
249
+ }
250
+ const scriptPath = join(dirname(statePath), "login.mjs");
251
+ const loginUrl = opts.url ?? ctx.demoAuth.loginUrl ?? moduleConfig.runtime?.url ?? "";
252
+ const script = renderDemoLoginHelper({
253
+ loginUrl,
254
+ storageState: statePath,
255
+ envFiles: ctx.demoAuth.envFiles,
256
+ env: ctx.demoAuth.env,
257
+ selectors: ctx.demoAuth.selectors,
258
+ });
259
+ await mkdir(dirname(statePath), { recursive: true });
260
+ await writeFile(scriptPath, script, "utf8");
261
+ console.log(pc.green("✓ zsk demo auth helper written"));
262
+ console.log(pc.dim(`script: ${relative(ctx.target, scriptPath)}`));
263
+ console.log(pc.dim(`storageState: ${relative(ctx.target, statePath)}`));
264
+ console.log(pc.dim("Run the helper once after installing Playwright, then reuse the stored state in generated demo specs."));
265
+ }
231
266
  async function updateExisting(opts, status, eventType, terminal = false) {
232
267
  const ctx = await prepare(opts);
233
268
  const session = await requireSession(ctx);
@@ -263,6 +298,7 @@ async function prepare(opts) {
263
298
  const scenarioDir = interpolate(demoConfig?.scenarioDir ?? getWorkspacePath(config, "playwrightSpecs", { module: moduleId }), moduleId);
264
299
  const bridgePlan = interpolate(demoConfig?.bridge?.planFile ?? getWorkspacePath(config, "bridgeOperationPlan", { module: moduleId }), moduleId);
265
300
  const bridgeExecution = interpolate(demoConfig?.bridge?.executionFile ?? getWorkspacePath(config, "bridgeExecution", { module: moduleId }), moduleId);
301
+ const demoAuth = resolveDemoAuthConfig(config, moduleId);
266
302
  const sessionRoot = resolve(target, getWorkspacePath(config, "playwrightExecution", { module: moduleId }));
267
303
  await mkdir(sessionRoot, { recursive: true });
268
304
  await mkdir(resolve(target, evidenceDir), { recursive: true });
@@ -277,7 +313,8 @@ async function prepare(opts) {
277
313
  evidenceDirAbs: resolve(target, evidenceDir),
278
314
  scenarioDir,
279
315
  scenarioDirAbs: resolve(target, scenarioDir),
280
- playwrightAuthState: getWorkspacePath(config, "playwrightAuthState", { module: moduleId }),
316
+ playwrightAuthState: demoAuth.storageState,
317
+ demoAuth,
281
318
  defaultMode: normalizeMode(demoConfig?.defaultMode),
282
319
  bridge: {
283
320
  decisionTool: demoConfig?.bridge?.decisionTool ?? (demoConfig?.computerUse?.enabled ? "computer_use" : "playwright_mcp"),
@@ -364,13 +401,11 @@ async function ensureBridgeArtifacts(ctx, session) {
364
401
  }
365
402
  async function ensureOptimizedArtifacts(ctx, session) {
366
403
  const moduleConfig = await readModuleConfig(ctx.target, ctx.moduleId);
367
- const rawInputs = [
368
- ...(moduleConfig.tests?.raw_cases ?? []),
369
- ...((moduleConfig.tests?.raw_cases?.length ?? 0) > 0 ? [] : (moduleConfig.sources?.testing ?? [])),
370
- ];
371
- if (rawInputs.length === 0) {
372
- console.error(pc.red("✗ optimized demo stopped: no raw testing inputs mapped"));
373
- console.error(pc.dim("Add .zsk/raws/prepare/qa/testing cases to .zsk/modules/{module}/module.yaml tests.raw_cases or sources.testing."));
404
+ const sourceBasis = await collectDemoSourceBasis(ctx.target, ctx.config, ctx.moduleId, moduleConfig);
405
+ const rawInputs = testCasePathsFromModule(moduleConfig);
406
+ if (sourceBasis.length === 0) {
407
+ console.error(pc.red("✗ optimized demo stopped: no source-backed demo inputs mapped"));
408
+ console.error(pc.dim("Add module spec/design/tasks docs, .zsk/raws test cases, existing tests, or implementation paths to .zsk/modules/{module}/module.yaml."));
374
409
  process.exit(1);
375
410
  }
376
411
  const testPlanRel = chooseTestPlanPath(moduleConfig, ctx.scenarioDir);
@@ -383,86 +418,12 @@ async function ensureOptimizedArtifacts(ctx, session) {
383
418
  process.exit(1);
384
419
  }
385
420
  session.auth = authValidation;
386
- const cases = [];
387
- for (const rawInput of rawInputs) {
388
- const rawPath = resolve(ctx.target, rawInput);
389
- const content = await readOptional(rawPath);
390
- if (!content.trim()) {
391
- console.error(pc.red(`✗ optimized demo stopped: raw testing input is empty or missing: ${rawInput}`));
392
- process.exit(1);
393
- }
394
- const title = inferScenarioName(content) ?? rawInput.split("/").pop()?.replace(/\.[^.]+$/, "") ?? "generated case";
395
- const fillValue = inferFillValue(content);
396
- const expectedText = inferExpectedText(content, fillValue);
397
- const caseId = slugify(`${ctx.moduleId}-${title}`);
398
- const steps = [
399
- {
400
- id: "step-1",
401
- intent: "Open the demo entry page",
402
- action: "goto",
403
- target: "{{baseUrl}}",
404
- },
405
- {
406
- id: "step-2",
407
- intent: "Perform the primary user input from the raw test case",
408
- action: "fill",
409
- locator: {
410
- strategy: "role",
411
- role: "textbox",
412
- },
413
- value: fillValue,
414
- },
415
- {
416
- id: "step-3",
417
- intent: "Submit or advance the flow",
418
- action: "click",
419
- locator: {
420
- strategy: "role",
421
- role: "button",
422
- },
423
- },
424
- {
425
- id: "step-4",
426
- intent: "Verify the expected visible result",
427
- action: "assert",
428
- locator: {
429
- strategy: "text",
430
- text: expectedText,
431
- },
432
- },
433
- ];
434
- cases.push({
435
- id: caseId,
436
- title,
437
- source: rawInput,
438
- priority: "P0",
439
- preconditions: [
440
- "Raw test case is mapped in module.yaml.",
441
- `If authentication is required, Playwright storageState is prepared under ${ctx.playwrightAuthState} and gitignored.`,
442
- "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.",
443
- ],
444
- uiObservationBoundary: {
445
- role: "observation-only",
446
- allowedOutput: "structured observation with URL, page title, visible targets, role/label hints, auth/session note, and privacy note",
447
- prohibitedOutputs: ["test-plan.json", ".spec.ts"],
448
- },
449
- steps,
450
- assertions: [
451
- {
452
- intent: "Expected result from raw test case is visible",
453
- type: "visible",
454
- locator: {
455
- strategy: "text",
456
- text: expectedText,
457
- },
458
- },
459
- ],
460
- risks: [
461
- "Generated locator names must be refined from Computer Use, Playwright MCP/ARIA/CDP, manual evidence, or supported Browser Use observation before promotion.",
462
- "Do not fall back to Playwright MCP or the hybrid bridge in optimized mode.",
463
- ],
464
- });
465
- }
421
+ const cases = synthesizeOptimizedDemoCases({
422
+ moduleId: ctx.moduleId,
423
+ sourceBasis,
424
+ runtimeUrl: moduleConfig.runtime?.url,
425
+ playwrightAuthState: ctx.playwrightAuthState,
426
+ });
466
427
  await writeJson(resolve(ctx.target, testPlanRel), {
467
428
  version: 1,
468
429
  mode: "optimized",
@@ -473,15 +434,31 @@ async function ensureOptimizedArtifacts(ctx, session) {
473
434
  forbiddenSurfaces: ["playwright_mcp", "hybrid_bridge"],
474
435
  sources: {
475
436
  testing: rawInputs,
437
+ stageDocs: sourceBasis.filter((source) => source.kind === "stage-doc").map((source) => source.path),
438
+ raws: sourceBasis.filter((source) => source.kind === "raw").map((source) => source.path),
439
+ existingTests: sourceBasis.filter((source) => source.kind === "existing-test").map((source) => source.path),
440
+ implementation: sourceBasis.filter((source) => source.kind === "implementation").map((source) => source.path),
476
441
  },
442
+ sourceBasis: sourceBasis.map((source) => ({
443
+ kind: source.kind,
444
+ path: source.path,
445
+ summary: summarizeText(source.content),
446
+ })),
477
447
  auth: {
478
448
  storageState: ctx.playwrightAuthState,
449
+ required: ctx.demoAuth.required,
450
+ loginUrl: ctx.demoAuth.loginUrl,
451
+ envFiles: ctx.demoAuth.envFiles,
452
+ envKeys: ctx.demoAuth.env,
453
+ selectors: ctx.demoAuth.selectors,
479
454
  validation: authValidation,
480
455
  gitignoreRequired: true,
481
456
  runtimeEnv: "ZSK_PLAYWRIGHT_STORAGE_STATE",
482
457
  note: authValidation.status === "valid"
483
458
  ? "Storage state was validated as a reusable Playwright login/session state. It may contain sensitive cookies/localStorage and must not be committed."
484
- : "No reusable storageState file was found. Public demos may proceed; authenticated demos must capture and validate storageState before completion.",
459
+ : ctx.demoAuth.required
460
+ ? "No reusable storageState file was found. Generated specs fail fast by default; run once with ZSK_DEMO_LOGIN=1 or use zsk demo auth, and set automation.demo.auth.required=false only for public flows."
461
+ : "Auth is configured as not required; generated specs run without storageState unless ZSK_DEMO_AUTH overrides it.",
485
462
  },
486
463
  uiObservationHandoff: {
487
464
  requiredBeforePromotion: true,
@@ -504,7 +481,7 @@ async function ensureOptimizedArtifacts(ctx, session) {
504
481
  });
505
482
  const specPath = resolve(ctx.target, specRel);
506
483
  await mkdir(resolve(specPath, ".."), { recursive: true });
507
- await writeFile(specPath, renderOptimizedSpec(ctx.moduleId, cases), "utf8");
484
+ await writeFile(specPath, renderOptimizedSpec(ctx.moduleId, ctx.demoAuth, cases), "utf8");
508
485
  console.log(pc.dim(`test plan: ${testPlanRel}`));
509
486
  console.log(pc.dim(`spec: ${specRel}`));
510
487
  }
@@ -529,108 +506,6 @@ function chooseSpecPath(moduleConfig, scenarioDir, moduleId) {
529
506
  return e2e;
530
507
  return join(e2e ?? scenarioDir, `${moduleId}-generated.spec.ts`);
531
508
  }
532
- function renderOptimizedSpec(moduleId, cases) {
533
- const lines = [
534
- `import { test, expect } from "@playwright/test";`,
535
- ``,
536
- `const storageState = process.env.ZSK_PLAYWRIGHT_STORAGE_STATE;`,
537
- `if (storageState) test.use({ storageState });`,
538
- ``,
539
- `test.describe("${escapeForDoubleQuotedString(moduleId)} optimized demo scenarios", () => {`,
540
- ];
541
- for (const testCase of cases) {
542
- const fill = testCase.steps.find((step) => step.action === "fill");
543
- const click = testCase.steps.find((step) => step.action === "click");
544
- const assertion = testCase.steps.find((step) => step.action === "assert");
545
- lines.push(` test("${escapeForDoubleQuotedString(testCase.title)}", async ({ page }) => {`, ` const baseUrl = process.env.ZSK_DEMO_BASE_URL;`, ` if (!baseUrl) throw new Error("Set ZSK_DEMO_BASE_URL to run this scenario.");`, ` await page.goto(baseUrl);`, ``, ` // Source: ${escapeForLineComment(testCase.source)}`, ` // ZSK_GENERATED_REFINEMENT_REQUIRED: refine locator names from Computer Use, Playwright MCP/ARIA/CDP, manual evidence, or compatible Browser Use before promotion.`);
546
- if (fill?.locator?.role && fill.value) {
547
- lines.push(` await ${renderRoleLocator(fill.locator.role, fill.locator.name)}.fill(${quote(fill.value)});`);
548
- }
549
- if (click?.locator?.role) {
550
- lines.push(` await ${renderRoleLocator(click.locator.role, click.locator.name)}.click();`);
551
- }
552
- if (assertion?.locator?.text) {
553
- lines.push(` await expect(page.getByText(${quote(assertion.locator.text)})).toBeVisible();`);
554
- }
555
- else {
556
- lines.push(` await expect(page).toHaveURL(/.+/);`);
557
- }
558
- lines.push(` });`, ``);
559
- }
560
- lines.push(`});`, ``);
561
- return lines.join("\n");
562
- }
563
- async function validatePlaywrightAuthState(target, storageState, validatedAt) {
564
- const file = resolve(target, storageState);
565
- let parsed;
566
- try {
567
- parsed = JSON.parse(await readFile(file, "utf8"));
568
- }
569
- catch (error) {
570
- const code = typeof error === "object" && error !== null && "code" in error
571
- ? String(error.code)
572
- : "";
573
- if (code === "ENOENT") {
574
- return {
575
- storageState,
576
- status: "missing",
577
- validatedAt,
578
- cookies: 0,
579
- origins: 0,
580
- message: "storageState file does not exist yet",
581
- };
582
- }
583
- return {
584
- storageState,
585
- status: "invalid",
586
- validatedAt,
587
- cookies: 0,
588
- origins: 0,
589
- message: "storageState file is not valid JSON",
590
- };
591
- }
592
- if (!isRecord(parsed)) {
593
- return {
594
- storageState,
595
- status: "invalid",
596
- validatedAt,
597
- cookies: 0,
598
- origins: 0,
599
- message: "storageState JSON must be an object",
600
- };
601
- }
602
- const cookies = Array.isArray(parsed.cookies) ? parsed.cookies.length : -1;
603
- const origins = Array.isArray(parsed.origins) ? parsed.origins.length : -1;
604
- if (cookies < 0 || origins < 0) {
605
- return {
606
- storageState,
607
- status: "invalid",
608
- validatedAt,
609
- cookies: Math.max(cookies, 0),
610
- origins: Math.max(origins, 0),
611
- message: "storageState must include Playwright cookies and origins arrays",
612
- };
613
- }
614
- if (cookies === 0 && origins === 0) {
615
- return {
616
- storageState,
617
- status: "invalid",
618
- validatedAt,
619
- cookies,
620
- origins,
621
- message: "storageState contains no cookies or localStorage origins, so it cannot prove reusable login/session credentials",
622
- };
623
- }
624
- return {
625
- storageState,
626
- status: "valid",
627
- validatedAt,
628
- cookies,
629
- origins,
630
- message: "storageState is parseable and contains reusable session material",
631
- loginBypassEvidence: "Generated Playwright specs can reuse this state through ZSK_PLAYWRIGHT_STORAGE_STATE.",
632
- };
633
- }
634
509
  async function updateWorkflowState(file, moduleId, session) {
635
510
  let state = { version: 1, modules: {} };
636
511
  try {
@@ -687,7 +562,7 @@ function mapWorkflowStatus(status) {
687
562
  }
688
563
  function automationNote(mode) {
689
564
  if (mode === "optimized")
690
- return "Generated test-plan.json and Playwright spec from raw testing inputs.";
565
+ return "Generated source-backed test-plan.json and Playwright spec with auth bootstrap.";
691
566
  if (mode === "playwright")
692
567
  return "Prepared Playwright demo run and scenario preservation paths.";
693
568
  if (mode === "hybrid")
@@ -730,109 +605,7 @@ async function readOptional(file) {
730
605
  return "";
731
606
  }
732
607
  }
733
- function parseRoleTargets(snapshot) {
734
- const targets = [];
735
- const rolePattern = /(?:^|\n)\s*-\s*(button|link|textbox|checkbox|heading|combobox|radio|menuitem)\s+"([^"]+)"/gi;
736
- for (const match of snapshot.matchAll(rolePattern)) {
737
- const role = normalizeRole(match[1] ?? "");
738
- const name = (match[2] ?? "").trim();
739
- if (!role || !name)
740
- continue;
741
- targets.push({ role, name });
742
- }
743
- return targets;
744
- }
745
- function synthesizePlaywrightSteps(targets, testCase) {
746
- const steps = [];
747
- const textbox = targets.find((target) => target.role === "textbox");
748
- const button = targets.find((target) => target.role === "button");
749
- const link = targets.find((target) => target.role === "link");
750
- const checkbox = targets.find((target) => target.role === "checkbox");
751
- const heading = targets.find((target) => target.role === "heading");
752
- const fillValue = inferFillValue(testCase);
753
- steps.push(`// Generated from test case and structured aria/accessibility snapshot.`);
754
- if (textbox) {
755
- steps.push(`await page.getByRole("textbox", { name: ${quote(textbox.name)} }).fill(${quote(fillValue)});`);
756
- }
757
- if (checkbox && shouldCheck(testCase)) {
758
- steps.push(`await page.getByRole("checkbox", { name: ${quote(checkbox.name)} }).check();`);
759
- }
760
- if (button) {
761
- steps.push(`await page.getByRole("button", { name: ${quote(button.name)} }).click();`);
762
- }
763
- else if (link) {
764
- steps.push(`await page.getByRole("link", { name: ${quote(link.name)} }).click();`);
765
- }
766
- if (heading) {
767
- steps.push(`await expect(page.getByRole("heading", { name: ${quote(heading.name)} })).toBeVisible();`);
768
- }
769
- else if (textbox || button || link || checkbox) {
770
- steps.push(`await expect(page).toHaveURL(/.+/);`);
771
- }
772
- else {
773
- steps.push(`// Provide a Playwright accessibility snapshot to synthesize role-first locators.`);
774
- steps.push(`await expect(page).toHaveURL(/.+/);`);
775
- }
776
- return steps;
777
- }
778
- function renderRoleLocator(role, name) {
779
- if (name)
780
- return `page.getByRole(${quote(role)}, { name: ${quote(name)} })`;
781
- return `page.getByRole(${quote(role)}).first()`;
782
- }
783
- function normalizeRole(role) {
784
- if (role === "textbox")
785
- return "textbox";
786
- return role.toLowerCase();
787
- }
788
- function inferFillValue(testCase) {
789
- const quoted = testCase.match(/["“”']([^"“”']{2,80})["“”']/);
790
- if (quoted?.[1])
791
- return quoted[1];
792
- const afterInput = testCase.match(/(?:输入|type|fill|enter)\s*[::]?\s*([^\n,,。]{2,80})/i);
793
- if (afterInput?.[1])
794
- return afterInput[1].trim();
795
- return "demo value";
796
- }
797
- function shouldCheck(testCase) {
798
- return /check|toggle|勾选|选中|切换/i.test(testCase);
799
- }
800
- function inferScenarioName(testCase) {
801
- const heading = testCase.match(/^#\s+(.+)$/m);
802
- if (heading?.[1])
803
- return heading[1];
804
- const title = testCase.match(/(?:title|标题|用例)[::]\s*(.+)/i);
805
- if (title?.[1])
806
- return title[1];
807
- return null;
808
- }
809
- function slugify(value) {
810
- const slug = value
811
- .toLowerCase()
812
- .replace(/[^a-z0-9]+/g, "-")
813
- .replace(/^-+|-+$/g, "");
814
- return slug || "generated-from-test-case";
815
- }
816
- function quote(value) {
817
- return JSON.stringify(value);
818
- }
819
- function escapeForDoubleQuotedString(value) {
820
- return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
821
- }
822
- function escapeForLineComment(value) {
823
- return value.replace(/\*\//g, "* /").replace(/\n/g, " ");
824
- }
825
- function inferExpectedText(testCase, fallback) {
826
- const expected = testCase.match(/(?:expect|should see|visible|断言|期望|显示|可见)\s*[::]?\s*["“”']?([^"“”'\n。]{2,80})/i);
827
- if (expected?.[1])
828
- return expected[1].trim();
829
- const quoted = [...testCase.matchAll(/["“”']([^"“”']{2,80})["“”']/g)].map((match) => match[1]).filter(Boolean);
830
- return quoted.at(-1) ?? fallback;
831
- }
832
608
  function isModuleConfig(value) {
833
609
  return typeof value === "object" && value !== null;
834
610
  }
835
- function isRecord(value) {
836
- return typeof value === "object" && value !== null && !Array.isArray(value);
837
- }
838
611
  //# sourceMappingURL=demo.js.map