@captain_z/zsk 1.6.1 → 1.8.1

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 (87) hide show
  1. package/README.md +24 -32
  2. package/dist/bin.js +22 -15
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/check.d.ts +1 -0
  5. package/dist/commands/check.js +209 -12
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/config.js +1 -1
  8. package/dist/commands/config.js.map +1 -1
  9. package/dist/commands/demo.d.ts +1 -0
  10. package/dist/commands/demo.js +341 -36
  11. package/dist/commands/demo.js.map +1 -1
  12. package/dist/commands/doctor.d.ts +4 -0
  13. package/dist/commands/doctor.js +102 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/issue.d.ts +2 -1
  16. package/dist/commands/issue.js +75 -30
  17. package/dist/commands/issue.js.map +1 -1
  18. package/dist/commands/module.js +42 -27
  19. package/dist/commands/module.js.map +1 -1
  20. package/dist/commands/prep.js +100 -6
  21. package/dist/commands/prep.js.map +1 -1
  22. package/dist/commands/project-init.js +63 -11
  23. package/dist/commands/project-init.js.map +1 -1
  24. package/dist/core/config.d.ts +14 -2
  25. package/dist/core/config.js +91 -12
  26. package/dist/core/config.js.map +1 -1
  27. package/dist/core/raw-manifest.d.ts +10 -0
  28. package/dist/core/raw-manifest.js +48 -1
  29. package/dist/core/raw-manifest.js.map +1 -1
  30. package/dist/core/scaffolder.js +5 -2
  31. package/dist/core/scaffolder.js.map +1 -1
  32. package/dist/core/workspace-layout.d.ts +53 -0
  33. package/dist/core/workspace-layout.js +108 -0
  34. package/dist/core/workspace-layout.js.map +1 -0
  35. package/package.json +2 -2
  36. package/schemas/zsk-config.schema.json +141 -11
  37. package/templates/issue/default/issue.md +9 -5
  38. package/templates/module/frontend-module/design.md +22 -0
  39. package/templates/module/frontend-module/module.yaml +4 -3
  40. package/templates/module/frontend-module/proposal.md +26 -1
  41. package/templates/module/frontend-module/spec.md +13 -0
  42. package/templates/module/frontend-module/tasks.md +15 -2
  43. package/templates/project-init/.zsk/config.yaml +41 -29
  44. package/templates/project-init/.zsk/docs/PROJECT-CONFIG.md +62 -0
  45. package/templates/project-init/.zsk/docs/SYSTEM-SPEC.md +59 -0
  46. package/templates/project-init/.zsk/modules/index.md +7 -0
  47. package/templates/project-init/.zsk/raws/backend/index.md +3 -0
  48. package/templates/project-init/.zsk/raws/index.md +7 -0
  49. package/templates/project-init/.zsk/raws/jira/index.md +3 -0
  50. package/templates/project-init/.zsk/raws/manual/index.md +3 -0
  51. package/templates/project-init/.zsk/raws/product/index.md +3 -0
  52. package/templates/project-init/.zsk/raws/qa/index.md +3 -0
  53. package/templates/project-init/.zsk/raws/ue/index.md +3 -0
  54. package/templates/module/frontend-module/acceptance.md +0 -18
  55. package/templates/module/frontend-module/archive.md +0 -17
  56. package/templates/module/frontend-module/commit.md +0 -15
  57. package/templates/module/frontend-module/demo-outline.md +0 -59
  58. package/templates/module/frontend-module/demo-report.md +0 -23
  59. package/templates/module/frontend-module/deploy.md +0 -18
  60. package/templates/module/frontend-module/ready.md +0 -12
  61. package/templates/module/frontend-module/review.md +0 -12
  62. package/templates/module/frontend-module/scenarios/index.md +0 -21
  63. package/templates/module/frontend-module/scenarios/p0-happy-path.spec.ts +0 -13
  64. package/templates/module/frontend-module/smoke.md +0 -21
  65. package/templates/module/frontend-module/verification.md +0 -6
  66. package/templates/module/frontend-module/verify.md +0 -12
  67. package/templates/project-init/.issues/README.md +0 -57
  68. package/templates/project-init/.issues/_taxonomy.md +0 -35
  69. package/templates/project-init/.issues/index.md +0 -7
  70. package/templates/project-init/.raws/README.md +0 -27
  71. package/templates/project-init/.raws/api-contracts/index.md +0 -22
  72. package/templates/project-init/.raws/backend-repositories/index.md +0 -12
  73. package/templates/project-init/.raws/design-assets/index.md +0 -25
  74. package/templates/project-init/.raws/design-sources/index.md +0 -24
  75. package/templates/project-init/.raws/index.md +0 -56
  76. package/templates/project-init/.raws/issues/index.md +0 -4
  77. package/templates/project-init/.raws/requirements/index.md +0 -23
  78. package/templates/project-init/.raws/testing/index.md +0 -22
  79. package/templates/project-init/.zsk/checkpoints/index.md +0 -4
  80. package/templates/project-init/.zsk/learning/index.md +0 -14
  81. package/templates/project-init/.zsk/learning/proposals/.gitkeep +0 -1
  82. package/templates/project-init/.zsk/resource-manifest.json +0 -55
  83. package/templates/project-init/.zsk/workflow-state.json +0 -6
  84. package/templates/project-init/docs/SYSTEM-SPEC.md +0 -53
  85. package/templates/project-init/docs/_module-index.md +0 -15
  86. package/templates/project-init/project-config.md +0 -154
  87. /package/templates/project-init/{.raws → .zsk/raws}/manifest.json +0 -0
@@ -1,6 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { readFile, writeFile, mkdir, stat } from "node:fs/promises";
3
- import { dirname, isAbsolute, resolve } from "node:path";
3
+ import { dirname, isAbsolute, relative, resolve } from "node:path";
4
4
  export async function updateRawManifest(file, records) {
5
5
  await mkdir(dirname(file), { recursive: true });
6
6
  const manifest = {
@@ -9,6 +9,24 @@ export async function updateRawManifest(file, records) {
9
9
  };
10
10
  await writeFile(file, `${JSON.stringify(manifest, null, 2)}\n`, "utf8");
11
11
  }
12
+ export async function updateRawIndex(file, records) {
13
+ await mkdir(dirname(file), { recursive: true });
14
+ const rows = records.map((record) => {
15
+ const target = record.snapshot ?? record.output ?? record.sourcePath ?? describeOrigin(record.origin) ?? "";
16
+ return `| ${record.provider} | ${record.type} | ${record.status ?? record.method} | ${target} |`;
17
+ });
18
+ const content = [
19
+ "# Raw Source Index",
20
+ "",
21
+ "Immutable fact sources for this project. Generated by `zsk prep`.",
22
+ "",
23
+ "| Provider | Type | Status | Snapshot / Origin |",
24
+ "| --- | --- | --- | --- |",
25
+ rows.length > 0 ? rows.join("\n") : "| | | | |",
26
+ "",
27
+ ].join("\n");
28
+ await writeFile(file, content, "utf8");
29
+ }
12
30
  export async function describeResource(root, provider, source) {
13
31
  const ref = source.snapshot ?? source.path ?? source.output ?? source.origin?.path;
14
32
  const fullPath = ref ? resolvePath(root, ref) : null;
@@ -20,6 +38,7 @@ export async function describeResource(root, provider, source) {
20
38
  origin: source.origin,
21
39
  snapshot: source.snapshot,
22
40
  output: source.output,
41
+ status: "configured",
23
42
  exists: Boolean(info),
24
43
  size: info?.size ?? null,
25
44
  hash: info && info.isFile ? await sha256(fullPath) : null,
@@ -27,6 +46,28 @@ export async function describeResource(root, provider, source) {
27
46
  method: toMethod(source),
28
47
  };
29
48
  }
49
+ export async function describeDiscoveredResource(root, provider, type, path, status, note) {
50
+ const fullPath = resolvePath(root, path);
51
+ const info = await safeStat(fullPath);
52
+ return {
53
+ provider,
54
+ type,
55
+ originKind: "local",
56
+ origin: { kind: "local", path },
57
+ sourcePath: path,
58
+ status,
59
+ exists: Boolean(info),
60
+ size: info?.size ?? null,
61
+ hash: info && info.isFile ? await sha256(fullPath) : null,
62
+ syncedAt: new Date().toISOString(),
63
+ method: "local",
64
+ note,
65
+ };
66
+ }
67
+ export function projectRelative(root, path) {
68
+ const rel = relative(root, path);
69
+ return rel === "" || rel.startsWith("..") ? path : rel;
70
+ }
30
71
  function toMethod(source) {
31
72
  if (source.kind === "script")
32
73
  return "script";
@@ -58,4 +99,10 @@ async function sha256(path) {
58
99
  function resolvePath(root, value) {
59
100
  return isAbsolute(value) ? value : resolve(root, value);
60
101
  }
102
+ function describeOrigin(origin) {
103
+ if (!origin || typeof origin !== "object")
104
+ return null;
105
+ const value = origin;
106
+ return value.path ?? value.url ?? value.repository ?? value.note ?? null;
107
+ }
61
108
  //# sourceMappingURL=raw-manifest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"raw-manifest.js","sourceRoot":"","sources":["../../src/core/raw-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raw-manifest.js","sourceRoot":"","sources":["../../src/core/raw-manifest.ts"],"names":[],"mappings":"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"}
@@ -40,14 +40,16 @@ export async function scaffoldTemplate(templateSubpath, target, opts = {}) {
40
40
  }
41
41
  async function copyRecursive(src, dst, overwrite, result, variables) {
42
42
  const entries = await readdir(src, { withFileTypes: true });
43
- await mkdir(dst, { recursive: true });
43
+ let hasTemplateFile = false;
44
44
  for (const e of entries) {
45
45
  const srcPath = join(src, e.name);
46
46
  const dstPath = join(dst, applyTemplateVariables(e.name, variables));
47
47
  if (e.isDirectory()) {
48
- await copyRecursive(srcPath, dstPath, overwrite, result, variables);
48
+ hasTemplateFile = (await copyRecursive(srcPath, dstPath, overwrite, result, variables)) || hasTemplateFile;
49
49
  }
50
50
  else {
51
+ hasTemplateFile = true;
52
+ await mkdir(dst, { recursive: true });
51
53
  if (!overwrite && (await fileExists(dstPath))) {
52
54
  result.skipped.push(dstPath);
53
55
  continue;
@@ -57,6 +59,7 @@ async function copyRecursive(src, dst, overwrite, result, variables) {
57
59
  result.written.push(dstPath);
58
60
  }
59
61
  }
62
+ return hasTemplateFile;
60
63
  }
61
64
  function applyTemplateVariables(value, variables) {
62
65
  let next = value;
@@ -1 +1 @@
1
- {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/core/scaffolder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../../src/core/scaffolder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export declare const WORKSPACE_LAYOUT_VERSION = 2;
2
+ export declare const DEFAULT_WORKSPACE_PATHS: {
3
+ readonly docs: ".zsk/docs";
4
+ readonly modules: ".zsk/modules";
5
+ readonly raws: ".zsk/raws";
6
+ readonly resources: ".zsk/resources";
7
+ readonly issues: ".zsk/issues";
8
+ readonly evidence: ".zsk/evidence";
9
+ readonly playwright: ".zsk/playwright";
10
+ };
11
+ export type WorkspaceLayoutConfig = {
12
+ paths?: {
13
+ docs?: string;
14
+ modules?: string;
15
+ resources?: string;
16
+ issues?: string;
17
+ evidence?: string;
18
+ playwright?: string;
19
+ plans?: string;
20
+ raws?: string;
21
+ };
22
+ modules?: {
23
+ index?: string;
24
+ root?: string;
25
+ };
26
+ automation?: {
27
+ demo?: {
28
+ evidenceDir?: string;
29
+ scenarioDir?: string;
30
+ bridge?: {
31
+ planFile?: string;
32
+ executionFile?: string;
33
+ };
34
+ };
35
+ };
36
+ };
37
+ export type WorkspaceLayout = {
38
+ version: number;
39
+ docsRoot: string;
40
+ modulesRoot: string;
41
+ resourcesRoot: string;
42
+ issuesRoot: string;
43
+ evidenceRoot: string;
44
+ playwrightRoot: string;
45
+ };
46
+ export type WorkspacePathKind = "config" | "workflowState" | "mcpPlaywrightConfig" | "docsRoot" | "projectConfig" | "systemSpec" | "modulesRoot" | "moduleIndex" | "moduleRoot" | "moduleConfig" | "moduleRuns" | "resourcesRoot" | "resourcesTesting" | "resourcesManifest" | "rawsRoot" | "rawsTesting" | "rawsManifest" | "issuesRoot" | "moduleIssues" | "evidenceRoot" | "moduleEvidence" | "demoEvidence" | "playwrightRoot" | "modulePlaywright" | "playwrightSpecs" | "playwrightTestPlans" | "playwrightAuth" | "playwrightAuthState" | "playwrightResults" | "playwrightReport" | "playwrightExecution" | "demoSessionCurrent" | "bridgeOperationPlan" | "bridgeExecution";
47
+ export type WorkspacePathOptions = {
48
+ module?: string;
49
+ };
50
+ export declare function resolveWorkspaceLayout(config?: WorkspaceLayoutConfig): WorkspaceLayout;
51
+ export declare function getWorkspacePath(config: WorkspaceLayoutConfig, kind: WorkspacePathKind, options?: WorkspacePathOptions): string;
52
+ export declare function resolveWorkspacePath(root: string, config: WorkspaceLayoutConfig, kind: WorkspacePathKind, options?: WorkspacePathOptions): string;
53
+ export declare function interpolateModulePath(value: string, moduleId: string): string;
@@ -0,0 +1,108 @@
1
+ import { isAbsolute, join, resolve } from "node:path";
2
+ export const WORKSPACE_LAYOUT_VERSION = 2;
3
+ export const DEFAULT_WORKSPACE_PATHS = {
4
+ docs: ".zsk/docs",
5
+ modules: ".zsk/modules",
6
+ raws: ".zsk/raws",
7
+ resources: ".zsk/resources",
8
+ issues: ".zsk/issues",
9
+ evidence: ".zsk/evidence",
10
+ playwright: ".zsk/playwright",
11
+ };
12
+ export function resolveWorkspaceLayout(config = {}) {
13
+ const paths = config.paths ?? {};
14
+ const rawsRoot = paths.raws ?? paths.resources ?? DEFAULT_WORKSPACE_PATHS.raws;
15
+ return {
16
+ version: WORKSPACE_LAYOUT_VERSION,
17
+ docsRoot: paths.docs ?? DEFAULT_WORKSPACE_PATHS.docs,
18
+ modulesRoot: paths.modules ?? config.modules?.root ?? DEFAULT_WORKSPACE_PATHS.modules,
19
+ resourcesRoot: rawsRoot,
20
+ issuesRoot: paths.issues ?? DEFAULT_WORKSPACE_PATHS.issues,
21
+ evidenceRoot: paths.evidence ?? DEFAULT_WORKSPACE_PATHS.evidence,
22
+ playwrightRoot: paths.playwright ?? DEFAULT_WORKSPACE_PATHS.playwright,
23
+ };
24
+ }
25
+ export function getWorkspacePath(config, kind, options = {}) {
26
+ const layout = resolveWorkspaceLayout(config);
27
+ const moduleId = options.module;
28
+ switch (kind) {
29
+ case "config":
30
+ return join(".zsk", "config.yaml");
31
+ case "workflowState":
32
+ return join(".zsk", "workflow-state.json");
33
+ case "mcpPlaywrightConfig":
34
+ return join(".zsk", "mcp", "playwright.json");
35
+ case "docsRoot":
36
+ return layout.docsRoot;
37
+ case "projectConfig":
38
+ return join(layout.docsRoot, "PROJECT-CONFIG.md");
39
+ case "systemSpec":
40
+ return join(layout.docsRoot, "SYSTEM-SPEC.md");
41
+ case "modulesRoot":
42
+ return layout.modulesRoot;
43
+ case "moduleIndex":
44
+ return config.modules?.index ?? join(layout.modulesRoot, "_module-index.md");
45
+ case "moduleRoot":
46
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId));
47
+ case "moduleConfig":
48
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "module.yaml");
49
+ case "moduleRuns":
50
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "runs");
51
+ case "rawsRoot":
52
+ case "resourcesRoot":
53
+ return layout.resourcesRoot;
54
+ case "rawsTesting":
55
+ case "resourcesTesting":
56
+ return join(layout.resourcesRoot, "qa", "testing");
57
+ case "rawsManifest":
58
+ case "resourcesManifest":
59
+ return join(layout.resourcesRoot, "manifest.json");
60
+ case "issuesRoot":
61
+ return layout.issuesRoot;
62
+ case "moduleIssues":
63
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_issues");
64
+ case "evidenceRoot":
65
+ return layout.evidenceRoot;
66
+ case "moduleEvidence":
67
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_evidence");
68
+ case "demoEvidence":
69
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_evidence", "demo");
70
+ case "playwrightRoot":
71
+ return layout.playwrightRoot;
72
+ case "modulePlaywright":
73
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright");
74
+ case "playwrightSpecs":
75
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "specs");
76
+ case "playwrightTestPlans":
77
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "test-plans");
78
+ case "playwrightAuth":
79
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", ".auth");
80
+ case "playwrightAuthState":
81
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", ".auth", "user.json");
82
+ case "playwrightResults":
83
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "results");
84
+ case "playwrightReport":
85
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "report");
86
+ case "playwrightExecution":
87
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "execution");
88
+ case "demoSessionCurrent":
89
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "execution", "current.json");
90
+ case "bridgeOperationPlan":
91
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "execution", "operation-plan.json");
92
+ case "bridgeExecution":
93
+ return join(layout.modulesRoot, requireModuleId(kind, moduleId), "_playwright", "execution", "playwright-execution.json");
94
+ }
95
+ }
96
+ export function resolveWorkspacePath(root, config, kind, options = {}) {
97
+ const workspacePath = getWorkspacePath(config, kind, options);
98
+ return isAbsolute(workspacePath) ? workspacePath : resolve(root, workspacePath);
99
+ }
100
+ export function interpolateModulePath(value, moduleId) {
101
+ return value.split("{module}").join(moduleId);
102
+ }
103
+ function requireModuleId(kind, moduleId) {
104
+ if (moduleId)
105
+ return moduleId;
106
+ throw new Error(`${kind} requires a module id`);
107
+ }
108
+ //# sourceMappingURL=workspace-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-layout.js","sourceRoot":"","sources":["../../src/core/workspace-layout.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@captain_z/zsk",
3
- "version": "1.6.1",
3
+ "version": "1.8.1",
4
4
  "description": "ZNorth Standard Kit — CLI installer for zsk skill bundles (npx @captain_z/zsk add)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -20,7 +20,7 @@
20
20
  "commander": "^12.1.0",
21
21
  "picocolors": "^1.1.1",
22
22
  "yaml": "^2.7.0",
23
- "@captain_z/zsk-skills": "1.6.1"
23
+ "@captain_z/zsk-skills": "1.8.1"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^22.10.0",
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://unpkg.com/@captain_z/zsk/schemas/zsk-config.schema.json",
4
4
  "title": "ZSK Project Config",
5
- "description": "Project-level configuration for ZSK resource origins, workspace paths, tools, and module index locations.",
5
+ "description": "Project-level configuration for ZSK raw source origins, workspace paths, tools, and module index locations.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": ["project", "paths", "sources", "tools", "modules"],
@@ -28,28 +28,55 @@
28
28
  }
29
29
  }
30
30
  },
31
+ "layoutVersion": {
32
+ "description": "Workspace layout version. Version 2 keeps all zsk-managed outputs under .zsk/ by default and prefers paths.raws for fact sources.",
33
+ "type": "integer",
34
+ "minimum": 2
35
+ },
31
36
  "paths": {
32
37
  "description": "Top-level project knowledge workspace paths.",
33
38
  "type": "object",
34
39
  "additionalProperties": false,
35
- "required": ["raws", "docs", "issues"],
40
+ "required": ["docs", "modules", "issues", "evidence", "playwright"],
41
+ "anyOf": [
42
+ {
43
+ "required": ["raws"]
44
+ },
45
+ {
46
+ "required": ["resources"]
47
+ }
48
+ ],
36
49
  "properties": {
37
- "raws": {
50
+ "docs": {
38
51
  "$ref": "#/$defs/pathRef"
39
52
  },
40
- "docs": {
53
+ "modules": {
54
+ "$ref": "#/$defs/pathRef"
55
+ },
56
+ "resources": {
57
+ "description": "Deprecated compatibility alias for paths.raws.",
58
+ "$ref": "#/$defs/pathRef"
59
+ },
60
+ "raws": {
61
+ "description": "Preferred immutable raw fact-source root.",
41
62
  "$ref": "#/$defs/pathRef"
42
63
  },
43
64
  "issues": {
44
65
  "$ref": "#/$defs/pathRef"
45
66
  },
67
+ "evidence": {
68
+ "$ref": "#/$defs/pathRef"
69
+ },
70
+ "playwright": {
71
+ "$ref": "#/$defs/pathRef"
72
+ },
46
73
  "metadata": {
47
74
  "$ref": "#/$defs/metadata"
48
75
  }
49
76
  }
50
77
  },
51
78
  "sources": {
52
- "description": "Project-level resource origins. May be empty after init and filled by AI or zsk config setup.",
79
+ "description": "Project-level raw source origins. May be empty after init and filled by AI or zsk config setup.",
53
80
  "type": "object",
54
81
  "additionalProperties": {
55
82
  "$ref": "#/$defs/sourceRef"
@@ -75,7 +102,7 @@
75
102
  "uniqueItems": true
76
103
  },
77
104
  "design": {
78
- "description": "Preferred tools for design and Figma resource capture.",
105
+ "description": "Preferred tools for design source and asset capture.",
79
106
  "type": "array",
80
107
  "items": {
81
108
  "$ref": "#/$defs/toolName"
@@ -121,7 +148,7 @@
121
148
  "properties": {
122
149
  "defaultMode": {
123
150
  "type": "string",
124
- "enum": ["manual", "script", "playwright", "computer-use", "hybrid"]
151
+ "enum": ["manual", "script", "optimized", "playwright", "computer-use", "hybrid"]
125
152
  },
126
153
  "baseUrl": {
127
154
  "type": "string",
@@ -204,7 +231,7 @@
204
231
  }
205
232
  },
206
233
  "sync": {
207
- "description": "Optional deterministic or AI-assisted raw resource sync configuration.",
234
+ "description": "Optional deterministic or AI-assisted raw source sync configuration.",
208
235
  "type": "object",
209
236
  "additionalProperties": {
210
237
  "$ref": "#/$defs/syncRef"
@@ -247,12 +274,12 @@
247
274
  }
248
275
  },
249
276
  "sourceType": {
250
- "description": "Resource role.",
277
+ "description": "Raw source role.",
251
278
  "type": "string",
252
279
  "enum": ["srs", "prd", "design", "api_contract", "backend_repo", "test_case", "design_asset", "vendor_doc", "manual"]
253
280
  },
254
281
  "sourceRef": {
255
- "description": "Resource source reference.",
282
+ "description": "Raw source reference.",
256
283
  "type": "object",
257
284
  "additionalProperties": false,
258
285
  "required": ["type", "origin"],
@@ -289,9 +316,18 @@
289
316
  {
290
317
  "$ref": "#/$defs/modaoOrigin"
291
318
  },
319
+ {
320
+ "$ref": "#/$defs/designOrigin"
321
+ },
292
322
  {
293
323
  "$ref": "#/$defs/openapiOrigin"
294
324
  },
325
+ {
326
+ "$ref": "#/$defs/jiraOrigin"
327
+ },
328
+ {
329
+ "$ref": "#/$defs/srsOrigin"
330
+ },
295
331
  {
296
332
  "$ref": "#/$defs/manualOrigin"
297
333
  }
@@ -339,7 +375,7 @@
339
375
  "properties": {
340
376
  "kind": {
341
377
  "type": "string",
342
- "const": "git"
378
+ "enum": ["git", "git-submodule"]
343
379
  },
344
380
  "repository": {
345
381
  "type": "string",
@@ -401,6 +437,35 @@
401
437
  }
402
438
  }
403
439
  },
440
+ "designOrigin": {
441
+ "type": "object",
442
+ "additionalProperties": false,
443
+ "required": ["kind", "provider"],
444
+ "properties": {
445
+ "kind": {
446
+ "type": "string",
447
+ "const": "design"
448
+ },
449
+ "provider": {
450
+ "type": "string",
451
+ "minLength": 1
452
+ },
453
+ "url": {
454
+ "type": "string",
455
+ "minLength": 1
456
+ },
457
+ "path": {
458
+ "$ref": "#/$defs/pathRef"
459
+ },
460
+ "id": {
461
+ "type": "string",
462
+ "minLength": 1
463
+ },
464
+ "metadata": {
465
+ "$ref": "#/$defs/metadata"
466
+ }
467
+ }
468
+ },
404
469
  "openapiOrigin": {
405
470
  "type": "object",
406
471
  "additionalProperties": false,
@@ -430,6 +495,71 @@
430
495
  }
431
496
  ]
432
497
  },
498
+ "jiraOrigin": {
499
+ "type": "object",
500
+ "additionalProperties": false,
501
+ "required": ["kind"],
502
+ "properties": {
503
+ "kind": {
504
+ "type": "string",
505
+ "const": "jira"
506
+ },
507
+ "url": {
508
+ "type": "string",
509
+ "minLength": 1
510
+ },
511
+ "path": {
512
+ "$ref": "#/$defs/pathRef"
513
+ },
514
+ "jql": {
515
+ "type": "string",
516
+ "minLength": 1
517
+ },
518
+ "metadata": {
519
+ "$ref": "#/$defs/metadata"
520
+ }
521
+ },
522
+ "anyOf": [
523
+ {
524
+ "required": ["url"]
525
+ },
526
+ {
527
+ "required": ["path"]
528
+ },
529
+ {
530
+ "required": ["jql"]
531
+ }
532
+ ]
533
+ },
534
+ "srsOrigin": {
535
+ "type": "object",
536
+ "additionalProperties": false,
537
+ "required": ["kind"],
538
+ "properties": {
539
+ "kind": {
540
+ "type": "string",
541
+ "const": "srs"
542
+ },
543
+ "url": {
544
+ "type": "string",
545
+ "minLength": 1
546
+ },
547
+ "path": {
548
+ "$ref": "#/$defs/pathRef"
549
+ },
550
+ "metadata": {
551
+ "$ref": "#/$defs/metadata"
552
+ }
553
+ },
554
+ "anyOf": [
555
+ {
556
+ "required": ["url"]
557
+ },
558
+ {
559
+ "required": ["path"]
560
+ }
561
+ ]
562
+ },
433
563
  "manualOrigin": {
434
564
  "type": "object",
435
565
  "additionalProperties": false,
@@ -4,6 +4,10 @@
4
4
 
5
5
  __ISSUE_TYPE__
6
6
 
7
+ ## 作用域
8
+
9
+ __ISSUE_SCOPE__
10
+
7
11
  ## 问题级别
8
12
 
9
13
  __SEVERITY__
@@ -62,11 +66,11 @@ __SEVERITY__
62
66
  ## Documentation Feedback
63
67
 
64
68
  - 需要反哺的文档:
65
- - [ ] `docs/{module}/spec.md`
66
- - [ ] `docs/{module}/design.md`
67
- - [ ] `docs/{module}/tasks.md`
68
- - [ ] `docs/SYSTEM-SPEC.md`
69
- - [ ] `.zsk/learning/proposals`
69
+ - [ ] `.zsk/modules/{module}/spec.md`
70
+ - [ ] `.zsk/modules/{module}/design.md`
71
+ - [ ] `.zsk/modules/{module}/tasks.md`
72
+ - [ ] `.zsk/docs/SYSTEM-SPEC.md`
73
+ - [ ] `.zsk/raws`
70
74
  - 更新内容或 no-update rationale:
71
75
  - 反哺时机:修复通过 verify 且经用户/产品确认后执行
72
76
 
@@ -1,5 +1,26 @@
1
1
  # __MODULE_NAME__ Design
2
2
 
3
+ ## Implementation Map
4
+
5
+ | Requirement / AC | Surface | Files / Modules | Interface / State / Data Flow | Risk |
6
+ | --- | --- | --- | --- | --- |
7
+ | FR-001 / AC-001 | | | | |
8
+
9
+ ## Decisions
10
+
11
+ | Decision | Alternatives Rejected | Rationale / Evidence | Rollback / Migration Note |
12
+ | --- | --- | --- | --- |
13
+ | | | | |
14
+
15
+ ## States And Failure Modes
16
+
17
+ | State | User/System Observable Behavior | Test / Demo Evidence |
18
+ | --- | --- | --- |
19
+ | loading | | |
20
+ | empty | | |
21
+ | error | | |
22
+ | permission | | |
23
+
3
24
  ## Playwright Locator And State Strategy
4
25
 
5
26
  | Scenario | Page / Route | Preferred Locator Strategy | State Coverage | API / Mock | Auth / Storage | Evidence |
@@ -11,6 +32,7 @@ Guidelines:
11
32
  - Prefer user-facing locators: `getByRole`, `getByLabel`, `getByPlaceholder`, `getByTestId`.
12
33
  - Add implementation tasks for missing accessible names, labels, or stable test ids.
13
34
  - Define auth/storage reuse before demo so Playwright can run repeatably.
35
+ - Route unclear behavior back to spec instead of redesigning requirements here.
14
36
 
15
37
  ## Documentation Feedback
16
38
 
@@ -9,19 +9,20 @@ sources: {}
9
9
  runtime:
10
10
  url: http://localhost:3000
11
11
  tools:
12
- - playwright_mcp
12
+ - playwright_cli
13
13
  - playwright
14
14
  - computer_use
15
15
  - browser_use
16
16
 
17
17
  tests:
18
18
  raw_cases: []
19
- derived_cases: []
19
+ derived_cases:
20
+ - __PLAYWRIGHT_TEST_PLANS__/test-plan.json
20
21
  automated:
21
22
  unit: []
22
23
  integration: []
23
24
  e2e:
24
- - __DOCS_OUTPUT__/scenarios
25
+ - __PLAYWRIGHT_SPECS__
25
26
  tdd_required: true
26
27
 
27
28
  outputs: