@captain_z/zsk 1.4.3 → 1.5.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 (67) hide show
  1. package/README.md +21 -10
  2. package/dist/bin.js +174 -1
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/add-flow.js +3 -8
  5. package/dist/commands/add-flow.js.map +1 -1
  6. package/dist/commands/add.d.ts +1 -0
  7. package/dist/commands/add.js +22 -6
  8. package/dist/commands/add.js.map +1 -1
  9. package/dist/commands/check.js +10 -2
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/demo.d.ts +31 -0
  12. package/dist/commands/demo.js +533 -0
  13. package/dist/commands/demo.js.map +1 -0
  14. package/dist/commands/issue.d.ts +8 -0
  15. package/dist/commands/issue.js +170 -6
  16. package/dist/commands/issue.js.map +1 -1
  17. package/dist/commands/module.js +23 -2
  18. package/dist/commands/module.js.map +1 -1
  19. package/dist/commands/project-init.js +1 -0
  20. package/dist/commands/project-init.js.map +1 -1
  21. package/dist/commands/remove.js +1 -1
  22. package/dist/commands/remove.js.map +1 -1
  23. package/dist/core/config.d.ts +14 -0
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/installer.d.ts +5 -0
  26. package/dist/core/installer.js +50 -6
  27. package/dist/core/installer.js.map +1 -1
  28. package/dist/core/skills.d.ts +3 -4
  29. package/dist/core/skills.js +34 -43
  30. package/dist/core/skills.js.map +1 -1
  31. package/dist/core/targets.js +1 -1
  32. package/dist/core/targets.js.map +1 -1
  33. package/package.json +2 -2
  34. package/schemas/module.schema.json +1 -1
  35. package/schemas/zsk-config.schema.json +122 -2
  36. package/templates/issue/default/issue.md +35 -2
  37. package/templates/module/frontend-module/acceptance.md +18 -0
  38. package/templates/module/frontend-module/archive.md +17 -0
  39. package/templates/module/frontend-module/commit.md +15 -0
  40. package/templates/module/frontend-module/demo-outline.md +59 -0
  41. package/templates/module/frontend-module/demo-report.md +23 -0
  42. package/templates/module/frontend-module/deploy.md +18 -0
  43. package/templates/module/frontend-module/design.md +12 -0
  44. package/templates/module/frontend-module/module.yaml +4 -1
  45. package/templates/module/frontend-module/proposal.md +7 -0
  46. package/templates/module/frontend-module/ready.md +12 -0
  47. package/templates/module/frontend-module/review.md +12 -0
  48. package/templates/module/frontend-module/scenarios/index.md +13 -0
  49. package/templates/module/frontend-module/scenarios/p0-happy-path.spec.ts +13 -0
  50. package/templates/module/frontend-module/smoke.md +21 -0
  51. package/templates/module/frontend-module/spec.md +14 -0
  52. package/templates/module/frontend-module/tasks.md +13 -0
  53. package/templates/module/frontend-module/verify.md +12 -0
  54. package/templates/project-init/.issues/README.md +17 -1
  55. package/templates/project-init/.issues/_taxonomy.md +35 -0
  56. package/templates/project-init/.issues/index.md +7 -0
  57. package/templates/project-init/.raws/README.md +2 -1
  58. package/templates/project-init/.raws/backend-repositories/index.md +12 -0
  59. package/templates/project-init/.raws/index.md +3 -0
  60. package/templates/project-init/.raws/issues/index.md +4 -0
  61. package/templates/project-init/.zsk/checkpoints/index.md +4 -0
  62. package/templates/project-init/.zsk/config.yaml +56 -1
  63. package/templates/project-init/.zsk/learning/index.md +14 -0
  64. package/templates/project-init/.zsk/learning/proposals/.gitkeep +1 -0
  65. package/templates/project-init/.zsk/resource-manifest.json +55 -0
  66. package/templates/project-init/.zsk/workflow-state.json +6 -0
  67. package/templates/project-init/project-config.md +5 -3
@@ -1,4 +1,4 @@
1
- declare const DOMAINS: readonly ["sdlc", "frontend", "quality", "design-handoff", "system", "meta"];
1
+ declare const DOMAINS: readonly ["core"];
2
2
  export type Domain = (typeof DOMAINS)[number];
3
3
  export type Skill = {
4
4
  name: string;
@@ -9,9 +9,8 @@ export type Skill = {
9
9
  export declare function resolveSkillsRoot(): Promise<string>;
10
10
  export declare function loadSkill(skillName: string): Promise<Skill>;
11
11
  /**
12
- * Enumerate every installable skill by walking the skills root directly.
13
- * Returns names in `zsk:<slug>` form, sorted by domain then slug, so UI
14
- * groupings are stable across runs.
12
+ * Enumerate every installable core skill by walking the skills root directly.
13
+ * Returns names in `zsk:<slug>` form, sorted by slug.
15
14
  */
16
15
  export declare function enumerateSkills(): Promise<Skill[]>;
17
16
  export { DOMAINS };
@@ -1,19 +1,12 @@
1
- // Skill resolution: zsk:<slug> → filesystem SKILL.md path + domain metadata.
1
+ // Skill resolution: zsk:<slug> → filesystem SKILL.md path + install metadata.
2
2
  //
3
3
  // Dev (monorepo): resolves via ../../../../capabilities/skills/
4
- // Production: resolves via @captain_z/zsk-skills/skills/
4
+ // Production: resolves via @captain_z/zsk-skills package root
5
5
  import { access, readdir } from "node:fs/promises";
6
6
  import { dirname, resolve } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
8
  import { createRequire } from "node:module";
9
- const DOMAINS = [
10
- "sdlc",
11
- "frontend",
12
- "quality",
13
- "design-handoff",
14
- "system",
15
- "meta",
16
- ];
9
+ const DOMAINS = ["core"];
17
10
  let skillsRootCache = null;
18
11
  export async function resolveSkillsRoot() {
19
12
  if (skillsRootCache)
@@ -29,7 +22,7 @@ export async function resolveSkillsRoot() {
29
22
  catch {
30
23
  // fall through
31
24
  }
32
- // Production: @captain_z/zsk-skills package (flat layout, no /skills/ wrapper)
25
+ // Production: @captain_z/zsk-skills package ships skill dirs at package root.
33
26
  const require = createRequire(import.meta.url);
34
27
  const pkgPath = require.resolve("@captain_z/zsk-skills/package.json");
35
28
  const skillsDir = dirname(pkgPath);
@@ -39,50 +32,48 @@ export async function resolveSkillsRoot() {
39
32
  export async function loadSkill(skillName) {
40
33
  const slug = skillName.replace(/^zsk:/, "");
41
34
  const root = await resolveSkillsRoot();
42
- for (const domain of DOMAINS) {
43
- const file = resolve(root, domain, slug, "SKILL.md");
44
- try {
45
- await access(file);
46
- return { name: skillName, domain, slug, file };
47
- }
48
- catch {
49
- // try next domain
50
- }
35
+ const file = resolve(root, slug, "SKILL.md");
36
+ try {
37
+ await access(file);
38
+ return { name: skillName, domain: "core", slug, file };
51
39
  }
52
- throw new Error(`Skill not found in any domain: ${skillName}`);
40
+ catch {
41
+ // fall through
42
+ }
43
+ throw new Error(`Core skill not found: ${skillName}`);
53
44
  }
54
45
  /**
55
- * Enumerate every installable skill by walking the skills root directly.
56
- * Returns names in `zsk:<slug>` form, sorted by domain then slug, so UI
57
- * groupings are stable across runs.
46
+ * Enumerate every installable core skill by walking the skills root directly.
47
+ * Returns names in `zsk:<slug>` form, sorted by slug.
58
48
  */
59
49
  export async function enumerateSkills() {
60
50
  const root = await resolveSkillsRoot();
61
51
  const out = [];
62
- for (const domain of DOMAINS) {
63
- const domainDir = resolve(root, domain);
64
- let entries;
52
+ const seen = new Set();
53
+ let entries;
54
+ try {
55
+ entries = await readdir(root, { withFileTypes: true });
56
+ }
57
+ catch {
58
+ entries = [];
59
+ }
60
+ for (const e of entries) {
61
+ if (!e.isDirectory())
62
+ continue;
63
+ const file = resolve(root, e.name, "SKILL.md");
65
64
  try {
66
- entries = await readdir(domainDir, { withFileTypes: true });
65
+ await access(file);
67
66
  }
68
67
  catch {
69
- continue; // domain dir may not exist in partial installs
70
- }
71
- for (const e of entries) {
72
- if (!e.isDirectory())
73
- continue;
74
- const file = resolve(domainDir, e.name, "SKILL.md");
75
- try {
76
- await access(file);
77
- }
78
- catch {
79
- continue; // directory without SKILL.md → not a skill
80
- }
81
- out.push({ name: `zsk:${e.name}`, domain, slug: e.name, file });
68
+ continue; // directory without SKILL.md not a skill
82
69
  }
70
+ const name = `zsk:${e.name}`;
71
+ if (seen.has(name))
72
+ continue;
73
+ seen.add(name);
74
+ out.push({ name, domain: "core", slug: e.name, file });
83
75
  }
84
- out.sort((a, b) => DOMAINS.indexOf(a.domain) - DOMAINS.indexOf(b.domain) ||
85
- a.slug.localeCompare(b.slug));
76
+ out.sort((a, b) => a.slug.localeCompare(b.slug));
86
77
  return out;
87
78
  }
88
79
  export { DOMAINS };
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ export const TARGET_OPTIONS = [
18
18
  {
19
19
  kind: "claude-plugin",
20
20
  label: "./.claude-plugin/",
21
- hint: "Claude 插件形态(生成 manifest.json",
21
+ hint: "Claude 插件形态(生成 plugin.json + commands/ + skills/)",
22
22
  resolve: () => resolve(process.cwd(), ".claude-plugin"),
23
23
  },
24
24
  {
@@ -1 +1 @@
1
- {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/core/targets.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,0DAA0D;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiBhD,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC;KACpD;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;KACxD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,+BAA+B;QACrC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;KACxD;IACD;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC;KACnD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC;KACvD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;KAClB;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/core/targets.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,0DAA0D;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAiBhD,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC;KACpD;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;KACxD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,mBAAmB;QAC1B,IAAI,EAAE,mDAAmD;QACzD,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC;KACxD;IACD;QACE,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC;KACnD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC;KACvD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;KAClB;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@captain_z/zsk",
3
- "version": "1.4.3",
3
+ "version": "1.5.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.4.3"
23
+ "@captain_z/zsk-skills": "1.5.1"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^22.10.0",
@@ -201,7 +201,7 @@
201
201
  "toolName": {
202
202
  "description": "Known runtime/design verification tool.",
203
203
  "type": "string",
204
- "enum": ["computer_use", "browser_use", "figma_mcp", "script", "manual", "skill"]
204
+ "enum": ["computer_use", "browser_use", "playwright", "playwright_cli", "playwright_mcp", "figma_mcp", "script", "manual", "skill"]
205
205
  },
206
206
  "metadata": {
207
207
  "description": "Explicit extension point for project-specific metadata.",
@@ -104,6 +104,105 @@
104
104
  }
105
105
  }
106
106
  },
107
+ "automation": {
108
+ "description": "Harness automation defaults for workflow stages.",
109
+ "type": "object",
110
+ "additionalProperties": false,
111
+ "properties": {
112
+ "smoke": {
113
+ "$ref": "#/$defs/commandStage"
114
+ },
115
+ "deploy": {
116
+ "$ref": "#/$defs/commandStage"
117
+ },
118
+ "demo": {
119
+ "type": "object",
120
+ "additionalProperties": false,
121
+ "properties": {
122
+ "defaultMode": {
123
+ "type": "string",
124
+ "enum": ["manual", "script", "playwright", "computer-use", "hybrid"]
125
+ },
126
+ "baseUrl": {
127
+ "type": "string",
128
+ "minLength": 1
129
+ },
130
+ "command": {
131
+ "type": "string",
132
+ "minLength": 1
133
+ },
134
+ "evidenceDir": {
135
+ "$ref": "#/$defs/pathRef"
136
+ },
137
+ "scenarioDir": {
138
+ "$ref": "#/$defs/pathRef"
139
+ },
140
+ "playwright": {
141
+ "type": "object",
142
+ "additionalProperties": false,
143
+ "properties": {
144
+ "config": {
145
+ "$ref": "#/$defs/pathRef"
146
+ },
147
+ "project": {
148
+ "type": "string",
149
+ "minLength": 1
150
+ },
151
+ "cli": {
152
+ "type": "string",
153
+ "minLength": 1
154
+ }
155
+ }
156
+ },
157
+ "computerUse": {
158
+ "type": "object",
159
+ "additionalProperties": false,
160
+ "properties": {
161
+ "enabled": {
162
+ "type": "boolean"
163
+ },
164
+ "role": {
165
+ "type": "string",
166
+ "const": "understand-and-decide"
167
+ }
168
+ }
169
+ },
170
+ "bridge": {
171
+ "type": "object",
172
+ "additionalProperties": false,
173
+ "properties": {
174
+ "enabled": {
175
+ "type": "boolean"
176
+ },
177
+ "decisionTool": {
178
+ "type": "string",
179
+ "enum": ["browser_use", "computer_use", "playwright_mcp"]
180
+ },
181
+ "executionTool": {
182
+ "type": "string",
183
+ "enum": ["playwright"]
184
+ },
185
+ "planFile": {
186
+ "$ref": "#/$defs/pathRef"
187
+ },
188
+ "executionFile": {
189
+ "$ref": "#/$defs/pathRef"
190
+ }
191
+ }
192
+ },
193
+ "metadata": {
194
+ "$ref": "#/$defs/metadata"
195
+ }
196
+ }
197
+ },
198
+ "verify": {
199
+ "$ref": "#/$defs/commandStage"
200
+ },
201
+ "metadata": {
202
+ "$ref": "#/$defs/metadata"
203
+ }
204
+ }
205
+ },
107
206
  "sync": {
108
207
  "description": "Optional deterministic or AI-assisted raw resource sync configuration.",
109
208
  "type": "object",
@@ -124,12 +223,33 @@
124
223
  "toolName": {
125
224
  "description": "Known tool or capability name.",
126
225
  "type": "string",
127
- "enum": ["computer_use", "browser_use", "figma_mcp", "script", "manual", "skill"]
226
+ "enum": ["computer_use", "browser_use", "playwright", "playwright_cli", "playwright_mcp", "figma_mcp", "script", "manual", "skill"]
227
+ },
228
+ "commandStage": {
229
+ "description": "Automation command list for a workflow stage.",
230
+ "type": "object",
231
+ "additionalProperties": false,
232
+ "properties": {
233
+ "command": {
234
+ "type": "string",
235
+ "minLength": 1
236
+ },
237
+ "commands": {
238
+ "type": "array",
239
+ "items": {
240
+ "type": "string",
241
+ "minLength": 1
242
+ }
243
+ },
244
+ "metadata": {
245
+ "$ref": "#/$defs/metadata"
246
+ }
247
+ }
128
248
  },
129
249
  "sourceType": {
130
250
  "description": "Resource role.",
131
251
  "type": "string",
132
- "enum": ["srs", "prd", "design", "api_contract", "test_case", "design_asset", "vendor_doc", "manual"]
252
+ "enum": ["srs", "prd", "design", "api_contract", "backend_repo", "test_case", "design_asset", "vendor_doc", "manual"]
133
253
  },
134
254
  "sourceRef": {
135
255
  "description": "Resource source reference.",
@@ -1,9 +1,19 @@
1
1
  # __ISSUE_ID__-__ISSUE_SLUG__
2
2
 
3
+ ## 问题类型
4
+
5
+ __ISSUE_TYPE__
6
+
3
7
  ## 问题级别
4
8
 
5
9
  __SEVERITY__
6
10
 
11
+ ## 严重性理由
12
+
13
+ - 用户/业务影响:
14
+ - 阻塞范围:
15
+ - 是否有 workaround:
16
+
7
17
  ## 模块
8
18
 
9
19
  `__MODULE_ID__`
@@ -22,7 +32,7 @@ __SEVERITY__
22
32
 
23
33
  1.
24
34
 
25
- ## 实际结果
35
+ ## 实际结果(当前现状)
26
36
 
27
37
 
28
38
  ## 预期结果
@@ -36,10 +46,33 @@ __SEVERITY__
36
46
  ## 影响范围
37
47
 
38
48
 
39
- ## 初步定位
49
+ ## 根因分析
50
+
51
+ - 初步根因:
52
+ - 置信度:
53
+ - 受影响代码/配置/资源:
54
+ - 排除过的原因:
55
+
56
+ ## 修复路线
57
+
58
+ - 路由:Coding / Spec 更新 / Design 更新 / 测试数据 / 环境 / 无效问题
59
+ - Owner:
60
+ - 回归保护:测试 / 场景 / lint / checklist / 豁免
61
+
62
+ ## Documentation Feedback
63
+
64
+ - 需要反哺的文档:
65
+ - [ ] `docs/{module}/spec.md`
66
+ - [ ] `docs/{module}/design.md`
67
+ - [ ] `docs/{module}/tasks.md`
68
+ - [ ] `docs/SYSTEM-SPEC.md`
69
+ - [ ] `.zsk/learning/proposals`
70
+ - 更新内容或 no-update rationale:
71
+ - 反哺时机:修复通过 verify 且经用户/产品确认后执行
40
72
 
41
73
 
42
74
  ## 状态
43
75
 
44
76
  - 状态:Open
45
77
  - 复测:
78
+ - 确认时间:
@@ -0,0 +1,18 @@
1
+ # __MODULE_NAME__ Acceptance
2
+
3
+ ## Verdict
4
+
5
+ - Result: NOT_STARTED
6
+ - Accepted by:
7
+ - Date:
8
+
9
+ ## Evidence Summary
10
+
11
+ | Source | Conclusion | Link |
12
+ | --- | --- | --- |
13
+
14
+ ## Documentation Feedback
15
+
16
+ - No-update rationale:
17
+ - Created from the ZSK module template; no acceptance has been performed yet.
18
+
@@ -0,0 +1,17 @@
1
+ # __MODULE_NAME__ Archive
2
+
3
+ ## Closure
4
+
5
+ | Item | Link |
6
+ | --- | --- |
7
+
8
+ ## Learning Proposals
9
+
10
+ | Finding | Target | Evidence |
11
+ | --- | --- | --- |
12
+
13
+ ## Documentation Feedback
14
+
15
+ - No-update rationale:
16
+ - Created from the ZSK module template; archive has not run yet.
17
+
@@ -0,0 +1,15 @@
1
+ # __MODULE_NAME__ Commit
2
+
3
+ ## Commit Evidence
4
+
5
+ | Item | Evidence |
6
+ | --- | --- |
7
+ | Review gate | |
8
+ | Smoke gate | |
9
+ | Commit | |
10
+
11
+ ## Documentation Feedback
12
+
13
+ - No-update rationale:
14
+ - Created from the ZSK module template; no commit evidence has been captured yet.
15
+
@@ -0,0 +1,59 @@
1
+ # __MODULE_NAME__ Demo Outline
2
+
3
+ ## Demo Flow
4
+
5
+ Use this section as the speaking order. The audience should be able to follow the demo from top to bottom without reading any appendix.
6
+
7
+ | Step | Show | Function / Business Point | Scenario | Source Alignment | Playwright Case | Presenter Line | Expected Visible Result | Next |
8
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- |
9
+ | 1 | Starting state and primary goal | | | PRD/SRS + Spec + Task + Test | `scenarios/<case>.spec.ts` | | | 2 |
10
+ | 2 | Core happy path / main value | | | PRD/SRS + Spec + Task + Test | `scenarios/<case>.spec.ts` | | | 3 |
11
+ | 3 | Required branch / role / validation / edge | | | PRD/SRS + Spec + Task + Test | `scenarios/<case>.spec.ts` | | | Final |
12
+ | Final | Final state, evidence, and known gaps | | | PRD/SRS + Spec + Task + Test | | summarize evidence and known gaps | | close |
13
+
14
+ ## Opening
15
+
16
+ - Audience:
17
+ - One-sentence goal:
18
+ - Starting state:
19
+ - Primary user journey:
20
+ - What this demo proves:
21
+
22
+ ## Coverage Alignment
23
+
24
+ Every required function point in the PRD/SRS should appear here, either as a demo step or as a known gap.
25
+
26
+ | Function / Business Point | PRD / SRS Need | Spec / Design Contract | Task Scope | Test Case / Assertion | Demo Step | Status |
27
+ | --- | --- | --- | --- | --- | --- | --- |
28
+ | | | | | | 1 | covered |
29
+ | | | | | | 2 | covered |
30
+ | | | | | | 3 | covered |
31
+
32
+ ## Rehearsal Checklist
33
+
34
+ | Demo Step | Browser Use Handoff | Playwright Case | Rehearsed | Evidence | Ready |
35
+ | --- | --- | --- | --- | --- | --- |
36
+ | 1 | | | no | trace/report/screenshot | no |
37
+ | 2 | | | no | trace/report/screenshot | no |
38
+ | 3 | | | no | trace/report/screenshot | no |
39
+
40
+ ## Pause Rules
41
+
42
+ - Pause if login/session state is lost.
43
+ - Pause if the UI no longer matches the prepared Playwright case.
44
+ - Pause if a P0/P1 function point cannot be shown.
45
+ - Do not improvise new clicks during the external demo; record the blocker and return to Demo Prep.
46
+
47
+ ## Appendix: Prep Sources
48
+
49
+ | Source | Path / Link | Used For |
50
+ | --- | --- | --- |
51
+ | SRS / PRD | | user goal and scope |
52
+ | Spec / AC | | observable pass criteria |
53
+ | Test cases | | scenario steps and expected result |
54
+ | Browser Use handoff | | login state, visible target, candidate locators |
55
+
56
+ ## Documentation Feedback
57
+
58
+ - No-update rationale:
59
+ - Created from the ZSK module template; no demo outline has been generated yet.
@@ -0,0 +1,23 @@
1
+ # __MODULE_NAME__ Demo Report
2
+
3
+ ## Session
4
+
5
+ - Session id:
6
+ - Status: NOT_STARTED
7
+ - Mode:
8
+
9
+ ## Coverage
10
+
11
+ | Function Point | FR/AC | Scenario | Result | Evidence | Issues |
12
+ | --- | --- | --- | --- | --- | --- |
13
+
14
+ ## Reusable Scenarios
15
+
16
+ | Scenario | Source | Reuse Target | Evidence |
17
+ | --- | --- | --- | --- |
18
+
19
+ ## Documentation Feedback
20
+
21
+ - No-update rationale:
22
+ - Created from the ZSK module template; no demo has been performed yet.
23
+
@@ -0,0 +1,18 @@
1
+ # __MODULE_NAME__ Deploy
2
+
3
+ ## Deployment
4
+
5
+ | Environment | URL | Version | Result | Evidence |
6
+ | --- | --- | --- | --- | --- |
7
+
8
+ ## Rollback
9
+
10
+ - Owner:
11
+ - Command:
12
+ - Notes:
13
+
14
+ ## Documentation Feedback
15
+
16
+ - No-update rationale:
17
+ - Created from the ZSK module template; no deployment has been performed yet.
18
+
@@ -1,5 +1,17 @@
1
1
  # __MODULE_NAME__ Design
2
2
 
3
+ ## Playwright Locator And State Strategy
4
+
5
+ | Scenario | Page / Route | Preferred Locator Strategy | State Coverage | API / Mock | Auth / Storage | Evidence |
6
+ | --- | --- | --- | --- | --- | --- | --- |
7
+ | P0 happy path | | getByRole / getByLabel / getByTestId | loading / success / error | | | screenshot + trace |
8
+
9
+ Guidelines:
10
+
11
+ - Prefer user-facing locators: `getByRole`, `getByLabel`, `getByPlaceholder`, `getByTestId`.
12
+ - Add implementation tasks for missing accessible names, labels, or stable test ids.
13
+ - Define auth/storage reuse before demo so Playwright can run repeatably.
14
+
3
15
  ## Documentation Feedback
4
16
 
5
17
  - No-update rationale:
@@ -9,6 +9,8 @@ sources: {}
9
9
  runtime:
10
10
  url: http://localhost:3000
11
11
  tools:
12
+ - playwright_mcp
13
+ - playwright
12
14
  - computer_use
13
15
  - browser_use
14
16
 
@@ -18,7 +20,8 @@ tests:
18
20
  automated:
19
21
  unit: []
20
22
  integration: []
21
- e2e: []
23
+ e2e:
24
+ - __DOCS_OUTPUT__/scenarios
22
25
  tdd_required: true
23
26
 
24
27
  outputs:
@@ -0,0 +1,7 @@
1
+ # __MODULE_NAME__ Proposal
2
+
3
+ ## Documentation Feedback
4
+
5
+ - No-update rationale:
6
+ - Created from the ZSK module template; no proposal has been drafted yet.
7
+
@@ -0,0 +1,12 @@
1
+ # __MODULE_NAME__ Ready
2
+
3
+ ## Gate
4
+
5
+ | Issue | Fix Evidence | Deployment | Ready |
6
+ | --- | --- | --- | --- |
7
+
8
+ ## Documentation Feedback
9
+
10
+ - No-update rationale:
11
+ - Created from the ZSK module template; no fixes have been marked ready for verify yet.
12
+
@@ -0,0 +1,12 @@
1
+ # __MODULE_NAME__ Review
2
+
3
+ ## Review Findings
4
+
5
+ | Finding | Severity | Owner | Issue |
6
+ | --- | --- | --- | --- |
7
+
8
+ ## Documentation Feedback
9
+
10
+ - No-update rationale:
11
+ - Created from the ZSK module template; no review has been performed yet.
12
+
@@ -0,0 +1,13 @@
1
+ # __MODULE_NAME__ Scenarios
2
+
3
+ Reusable demo, verify, and regression scenarios for this module.
4
+
5
+ ## Scenario Lifecycle
6
+
7
+ | Stage | Responsibility |
8
+ | --- | --- |
9
+ | Spec | Define scenario contract and FR/AC linkage |
10
+ | Design | Define locator/state/auth/evidence strategy |
11
+ | Task | Create Playwright skeleton and fixture work |
12
+ | Demo | Execute, record, and promote scenarios |
13
+ | Verify | Reuse scenarios for fix verification |
@@ -0,0 +1,13 @@
1
+ import { test, expect } from "@playwright/test";
2
+
3
+ test.describe("__MODULE_NAME__ demo scenarios", () => {
4
+ test("P0 happy path", async ({ page }) => {
5
+ test.skip(!process.env.ZSK_DEMO_BASE_URL, "Set ZSK_DEMO_BASE_URL to run this scenario.");
6
+
7
+ await page.goto(process.env.ZSK_DEMO_BASE_URL);
8
+
9
+ // Replace this with the scenario contract from spec.md and locator strategy from design.md.
10
+ await expect(page).toHaveURL(/.+/);
11
+ });
12
+ });
13
+