openspec-playwright 0.1.69 → 0.1.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/openspec-e2e/SKILL.md +5 -5
- package/README.md +4 -4
- package/README.zh-CN.md +4 -4
- package/dist/commands/init.js +30 -38
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.js +24 -31
- package/dist/commands/update.js.map +1 -1
- package/employee-standards.md +2 -2
- package/package.json +1 -2
- package/schemas/playwright-e2e/schema.yaml +0 -56
- /package/{schemas/playwright-e2e/templates → templates}/app-exploration.md +0 -0
- /package/{schemas/playwright-e2e/templates → templates}/app-knowledge.md +0 -0
- /package/{schemas/playwright-e2e/templates → templates}/e2e-test.ts +0 -0
- /package/{schemas/playwright-e2e/templates → templates}/playwright.config.ts +0 -0
- /package/{schemas/playwright-e2e/templates → templates}/report.md +0 -0
- /package/{schemas/playwright-e2e/templates → templates}/test-plan.md +0 -0
|
@@ -189,7 +189,7 @@ From `browser_snapshot` output, extract **interactive elements** for each route:
|
|
|
189
189
|
|
|
190
190
|
Output: `openspec/changes/<name>/specs/playwright/app-exploration.md`
|
|
191
191
|
|
|
192
|
-
Use template: `
|
|
192
|
+
Use template: `templates/app-exploration.md`
|
|
193
193
|
|
|
194
194
|
Key fields per route:
|
|
195
195
|
|
|
@@ -247,7 +247,7 @@ Read `tests/playwright/app-knowledge.md` as context for cross-change patterns.
|
|
|
247
247
|
|
|
248
248
|
**Create test cases**: functional requirement → test case, with `@role` and `@auth` tags. Reference verified selectors from app-exploration.md.
|
|
249
249
|
|
|
250
|
-
Template: `
|
|
250
|
+
Template: `templates/test-plan.md`
|
|
251
251
|
|
|
252
252
|
**Idempotency**: If test-plan.md exists → read and use, do NOT regenerate.
|
|
253
253
|
|
|
@@ -378,7 +378,7 @@ Auth required. To set up:
|
|
|
378
378
|
|
|
379
379
|
### 8. Configure playwright.config.ts
|
|
380
380
|
|
|
381
|
-
If missing → generate from `
|
|
381
|
+
If missing → generate from `templates/playwright.config.ts`.
|
|
382
382
|
|
|
383
383
|
**Auto-detect BASE_URL** (in priority order):
|
|
384
384
|
|
|
@@ -450,13 +450,13 @@ Read report at `openspec/reports/playwright-e2e-<name>-<timestamp>.md`. Present:
|
|
|
450
450
|
- Auto-heal notes
|
|
451
451
|
- Recommendations with `file:line` references
|
|
452
452
|
|
|
453
|
-
Report template: `
|
|
453
|
+
Report template: `templates/report.md`
|
|
454
454
|
|
|
455
455
|
**Update tasks.md** if all tests pass: find E2E-related items, append `✅ Verified via Playwright E2E (<timestamp>)`.
|
|
456
456
|
|
|
457
457
|
## Report Structure
|
|
458
458
|
|
|
459
|
-
Reference: `
|
|
459
|
+
Reference: `templates/report.md`
|
|
460
460
|
|
|
461
461
|
## Graceful Degradation
|
|
462
462
|
|
package/README.md
CHANGED
|
@@ -149,12 +149,12 @@ Playwright MCP is installed globally via `claude mcp add` and enables the Healer
|
|
|
149
149
|
## Architecture
|
|
150
150
|
|
|
151
151
|
```
|
|
152
|
-
|
|
153
|
-
└──
|
|
152
|
+
Templates (in npm package, installed to .claude/skills/openspec-e2e/templates/)
|
|
153
|
+
└── test-plan.md, report.md, playwright.config.ts, e2e-test.ts, app-exploration.md
|
|
154
154
|
|
|
155
155
|
CLI (openspec-pw)
|
|
156
|
-
├── init → Installs commands
|
|
157
|
-
├── update → Syncs commands
|
|
156
|
+
├── init → Installs commands, skill & templates to .claude/
|
|
157
|
+
├── update → Syncs commands, skill & templates from npm
|
|
158
158
|
├── run → Executes E2E tests with server lifecycle
|
|
159
159
|
├── verify → Checks implementation against artifacts
|
|
160
160
|
└── doctor → Checks prerequisites
|
package/README.zh-CN.md
CHANGED
|
@@ -150,12 +150,12 @@ Playwright MCP 通过 `claude mcp add` 全局安装,启用 Healer Agent(通
|
|
|
150
150
|
## 架构
|
|
151
151
|
|
|
152
152
|
```
|
|
153
|
-
|
|
154
|
-
└──
|
|
153
|
+
模板(内置于 npm 包,安装到 .claude/skills/openspec-e2e/templates/)
|
|
154
|
+
└── test-plan.md, report.md, playwright.config.ts, e2e-test.ts, app-exploration.md
|
|
155
155
|
|
|
156
156
|
CLI (openspec-pw)
|
|
157
|
-
├── init →
|
|
158
|
-
├── update → 从 npm
|
|
157
|
+
├── init → 安装命令、skill 和模板到 .claude/
|
|
158
|
+
├── update → 从 npm 同步命令、skill 和模板
|
|
159
159
|
├── run → 执行 E2E 测试并管理服务器生命周期
|
|
160
160
|
├── verify → 检查实现是否符合 artifacts
|
|
161
161
|
└── doctor → 检查前置条件
|
package/dist/commands/init.js
CHANGED
|
@@ -8,7 +8,6 @@ import { readFile } from "fs/promises";
|
|
|
8
8
|
import { syncMcpTools } from "./mcpSync.js";
|
|
9
9
|
import { detectEditors, installForAllEditors, installSkill, installProjectClaudeMd, readEmployeeStandards, claudeAdapter, } from "./editors.js";
|
|
10
10
|
const TEMPLATE_DIR = fileURLToPath(new URL("../../templates", import.meta.url));
|
|
11
|
-
const SCHEMA_DIR = fileURLToPath(new URL("../../schemas", import.meta.url));
|
|
12
11
|
const SKILL_SRC = fileURLToPath(new URL("../../.claude/skills/openspec-e2e/SKILL.md", import.meta.url));
|
|
13
12
|
const CMD_BODY_SRC = fileURLToPath(new URL("../../.claude/commands/opsx/e2e-body.md", import.meta.url));
|
|
14
13
|
const EMPLOYEE_STANDARDS_SRC = fileURLToPath(new URL("../../employee-standards.md", import.meta.url));
|
|
@@ -53,15 +52,22 @@ export async function init(options) {
|
|
|
53
52
|
try {
|
|
54
53
|
execSync("claude mcp add playwright npx @playwright/mcp@latest", {
|
|
55
54
|
cwd: projectRoot,
|
|
56
|
-
stdio: "
|
|
55
|
+
stdio: "pipe",
|
|
56
|
+
encoding: "utf-8",
|
|
57
57
|
});
|
|
58
58
|
console.log(chalk.green(" ✓ Playwright MCP installed globally"));
|
|
59
59
|
console.log(chalk.gray(" (Restart Claude Code to activate)"));
|
|
60
60
|
}
|
|
61
|
-
catch {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
catch (err) {
|
|
62
|
+
const e = err;
|
|
63
|
+
if (e.stderr?.includes("already exists")) {
|
|
64
|
+
console.log(chalk.green(" ✓ Playwright MCP already installed"));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(chalk.yellow(" ⚠ Failed to run claude mcp add. Run manually:"));
|
|
68
|
+
console.log(chalk.gray(" claude mcp add playwright npx @playwright/mcp@latest"));
|
|
69
|
+
console.log(chalk.gray(" (Restart Claude Code to activate the MCP server)"));
|
|
70
|
+
}
|
|
65
71
|
}
|
|
66
72
|
}
|
|
67
73
|
}
|
|
@@ -80,6 +86,7 @@ export async function init(options) {
|
|
|
80
86
|
if (existsSync(join(projectRoot, ".claude"))) {
|
|
81
87
|
const skillContent = await readFile(SKILL_SRC, "utf-8");
|
|
82
88
|
installSkill(projectRoot, skillContent);
|
|
89
|
+
installSkillTemplates(projectRoot);
|
|
83
90
|
}
|
|
84
91
|
// 5. Sync Healer tools with latest @playwright/mcp (Claude Code only)
|
|
85
92
|
if (existsSync(join(projectRoot, ".claude"))) {
|
|
@@ -91,24 +98,21 @@ export async function init(options) {
|
|
|
91
98
|
console.log(chalk.blue("\n─── Syncing Healer Tools ───"));
|
|
92
99
|
console.log(chalk.gray(" - Claude Code not detected, skipping MCP sync"));
|
|
93
100
|
}
|
|
94
|
-
// 6.
|
|
95
|
-
console.log(chalk.blue("\n─── Installing OpenSpec Schema ───"));
|
|
96
|
-
await installSchema(projectRoot);
|
|
97
|
-
// 7. Generate seed test
|
|
101
|
+
// 6. Generate seed test
|
|
98
102
|
if (options.seed !== false) {
|
|
99
103
|
console.log(chalk.blue("\n─── Generating Seed Test ───"));
|
|
100
104
|
await generateSeedTest(projectRoot);
|
|
101
105
|
}
|
|
102
|
-
//
|
|
106
|
+
// 7. Generate app-knowledge.md
|
|
103
107
|
console.log(chalk.blue("\n─── Generating App Knowledge ───"));
|
|
104
108
|
await generateAppKnowledge(projectRoot);
|
|
105
|
-
//
|
|
109
|
+
// 8. Install employee-grade CLAUDE.md
|
|
106
110
|
console.log(chalk.blue("\n─── Installing Employee Standards ───"));
|
|
107
111
|
const standards = readEmployeeStandards(EMPLOYEE_STANDARDS_SRC);
|
|
108
112
|
if (standards) {
|
|
109
113
|
installProjectClaudeMd(projectRoot, standards);
|
|
110
114
|
}
|
|
111
|
-
//
|
|
115
|
+
// 9. Summary
|
|
112
116
|
console.log(chalk.blue("\n─── Summary ───"));
|
|
113
117
|
console.log(chalk.green(" ✓ Setup complete!\n"));
|
|
114
118
|
console.log(chalk.bold("Next steps:"));
|
|
@@ -121,7 +125,7 @@ export async function init(options) {
|
|
|
121
125
|
console.log(chalk.gray(" 5. In Claude Code, run: /opsx:e2e <change-name>"));
|
|
122
126
|
}
|
|
123
127
|
console.log(chalk.gray(` ${hasClaude ? "6." : "5."} Or: openspec-pw run <change-name>`));
|
|
124
|
-
console.log(chalk.gray(` ${hasClaude ? "
|
|
128
|
+
console.log(chalk.gray(` ${hasClaude ? "6." : "5."} Or: openspec-pw doctor to verify setup\n`));
|
|
125
129
|
console.log(chalk.bold("How it works:"));
|
|
126
130
|
console.log(chalk.gray(" /opsx:e2e reads your OpenSpec specs and runs Playwright"));
|
|
127
131
|
console.log(chalk.gray(" E2E tests through a three-agent pipeline:"));
|
|
@@ -162,7 +166,7 @@ async function generateSeedTest(projectRoot) {
|
|
|
162
166
|
console.log(chalk.gray(" (Customize BASE_URL and credentials for your app)"));
|
|
163
167
|
}
|
|
164
168
|
async function generateAppKnowledge(projectRoot) {
|
|
165
|
-
const src = join(
|
|
169
|
+
const src = join(TEMPLATE_DIR, "app-knowledge.md");
|
|
166
170
|
const dest = join(projectRoot, "tests", "playwright", "app-knowledge.md");
|
|
167
171
|
if (existsSync(dest)) {
|
|
168
172
|
console.log(chalk.gray(" - app-knowledge.md already exists, skipping"));
|
|
@@ -173,37 +177,25 @@ async function generateAppKnowledge(projectRoot) {
|
|
|
173
177
|
console.log(chalk.green(" ✓ Generated: tests/playwright/app-knowledge.md"));
|
|
174
178
|
}
|
|
175
179
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
const
|
|
179
|
-
const
|
|
180
|
-
mkdirSync(
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
const dest = join(schemaDest, file);
|
|
184
|
-
if (existsSync(src)) {
|
|
185
|
-
writeFileSync(dest, readFileSync(src));
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// Copy templates
|
|
189
|
-
const templatesSrc = join(schemaSrc, "templates");
|
|
190
|
-
const templatesDest = join(schemaDest, "templates");
|
|
191
|
-
mkdirSync(templatesDest, { recursive: true });
|
|
192
|
-
const templateFiles = [
|
|
180
|
+
// Install SKILL reference templates (format guides for LLM to read)
|
|
181
|
+
function installSkillTemplates(projectRoot) {
|
|
182
|
+
const SKILL_DIR = join(projectRoot, ".claude", "skills", "openspec-e2e");
|
|
183
|
+
const templatesDir = join(SKILL_DIR, "templates");
|
|
184
|
+
mkdirSync(templatesDir, { recursive: true });
|
|
185
|
+
const SKILL_TEMPLATE_FILES = [
|
|
186
|
+
"app-exploration.md",
|
|
193
187
|
"test-plan.md",
|
|
188
|
+
"playwright.config.ts",
|
|
194
189
|
"report.md",
|
|
195
190
|
"e2e-test.ts",
|
|
196
|
-
"playwright.config.ts",
|
|
197
|
-
"app-knowledge.md",
|
|
198
191
|
];
|
|
199
|
-
for (const file of
|
|
200
|
-
const src = join(
|
|
201
|
-
const dest = join(
|
|
192
|
+
for (const file of SKILL_TEMPLATE_FILES) {
|
|
193
|
+
const src = join(TEMPLATE_DIR, file);
|
|
194
|
+
const dest = join(templatesDir, file);
|
|
202
195
|
if (existsSync(src)) {
|
|
203
196
|
writeFileSync(dest, readFileSync(src));
|
|
204
197
|
}
|
|
205
198
|
}
|
|
206
|
-
console.log(chalk.green(" ✓ Schema installed: openspec/schemas/playwright-e2e/"));
|
|
207
199
|
}
|
|
208
200
|
function execCmd(cmd, name, silent = false) {
|
|
209
201
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,GACd,MAAM,cAAc,CAAC;AAEtB,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChF,MAAM,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/update.js
CHANGED
|
@@ -33,9 +33,9 @@ export async function update(options) {
|
|
|
33
33
|
console.log(chalk.gray(" Run manually: npm install -g openspec-playwright"));
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
// 2. Update commands for all detected editors
|
|
36
|
+
// 2. Update commands for all detected editors
|
|
37
37
|
if (options.skill !== false) {
|
|
38
|
-
console.log(chalk.blue("\n─── Updating Commands &
|
|
38
|
+
console.log(chalk.blue("\n─── Updating Commands & Skill ───"));
|
|
39
39
|
try {
|
|
40
40
|
const tmpDir = join(tmpdir(), "openspec-e2e-update");
|
|
41
41
|
rmSync(tmpDir, { recursive: true, force: true });
|
|
@@ -53,7 +53,6 @@ export async function update(options) {
|
|
|
53
53
|
// Extract tarball
|
|
54
54
|
await tar.extract({ file: tarballPath, cwd: tmpDir, strip: 1 });
|
|
55
55
|
const bodySrc = join(tmpDir, ".claude", "commands", "opsx", "e2e-body.md");
|
|
56
|
-
const schemaSrc = join(tmpDir, "schemas", "playwright-e2e");
|
|
57
56
|
// Install commands for all detected editors
|
|
58
57
|
const adapters = detectEditors(projectRoot);
|
|
59
58
|
if (adapters.length > 0 && existsSync(bodySrc)) {
|
|
@@ -66,10 +65,10 @@ export async function update(options) {
|
|
|
66
65
|
const skillContent = readFileSync(skillSrc, "utf-8");
|
|
67
66
|
installSkill(projectRoot, skillContent);
|
|
68
67
|
}
|
|
69
|
-
//
|
|
70
|
-
|
|
68
|
+
// Sync SKILL reference templates
|
|
69
|
+
syncSkillTemplates(tmpDir, projectRoot);
|
|
71
70
|
rmSync(tmpDir, { recursive: true, force: true });
|
|
72
|
-
console.log(chalk.green(" ✓ Commands &
|
|
71
|
+
console.log(chalk.green(" ✓ Commands, skill & templates updated to latest"));
|
|
73
72
|
}
|
|
74
73
|
catch (err) {
|
|
75
74
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -134,32 +133,26 @@ export async function update(options) {
|
|
|
134
133
|
console.log(chalk.gray(" Then run openspec-pw run <change-name> to verify.\n"));
|
|
135
134
|
}
|
|
136
135
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
const src = join(templatesSrc, file);
|
|
157
|
-
const dest = join(templatesDest, file);
|
|
158
|
-
if (existsSync(src)) {
|
|
159
|
-
writeFileSync(dest, readFileSync(src));
|
|
160
|
-
}
|
|
136
|
+
// Sync SKILL reference templates from extracted tarball to project
|
|
137
|
+
function syncSkillTemplates(tmpDir, projectRoot) {
|
|
138
|
+
if (!existsSync(join(projectRoot, ".claude")))
|
|
139
|
+
return;
|
|
140
|
+
const SKILL_DIR = join(projectRoot, ".claude", "skills", "openspec-e2e");
|
|
141
|
+
const templatesDir = join(SKILL_DIR, "templates");
|
|
142
|
+
mkdirSync(templatesDir, { recursive: true });
|
|
143
|
+
const SKILL_TEMPLATE_FILES = [
|
|
144
|
+
"app-exploration.md",
|
|
145
|
+
"test-plan.md",
|
|
146
|
+
"playwright.config.ts",
|
|
147
|
+
"report.md",
|
|
148
|
+
"e2e-test.ts",
|
|
149
|
+
];
|
|
150
|
+
for (const file of SKILL_TEMPLATE_FILES) {
|
|
151
|
+
const src = join(tmpDir, "templates", file);
|
|
152
|
+
const dest = join(templatesDir, file);
|
|
153
|
+
if (existsSync(src)) {
|
|
154
|
+
writeFileSync(dest, readFileSync(src));
|
|
161
155
|
}
|
|
162
156
|
}
|
|
163
|
-
console.log(chalk.green(" ✓ Schema updated: openspec/schemas/playwright-e2e/"));
|
|
164
157
|
}
|
|
165
158
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,MAAM,EACN,WAAW,EACX,QAAQ,GACT,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,YAAY,GACb,MAAM,cAAc,CAAC;AAQtB,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IAErE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,UAAU,CACzB,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,CACnE,CAAC;IACF,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAC1E,CAAC;QACF,OAAO;IACT,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,QAAQ,CAAC,oCAAoC,EAAE;gBAC7C,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,WAAW;aACjB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CACjE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/employee-standards.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## 一、代码质量
|
|
9
9
|
|
|
10
|
-
**lint + typecheck 后才能算成功**。动手前,先探索项目用什么工具:查看 `package.json` scripts、`Makefile`、`pyproject.toml`、`justfile` 等,找到该语言的 lint +
|
|
10
|
+
**lint + typecheck 后才能算成功**。动手前,先探索项目用什么工具:查看 `package.json` scripts、`Makefile`、`pyproject.toml`、`justfile` 等,找到该语言的 lint + typecheck 命令并执行。工具不存在时,明确告知用户,不得假装成功。
|
|
11
11
|
|
|
12
12
|
**拒绝'够用就行'**。架构缺陷、状态重复、模式不一致——说出来并修复。
|
|
13
13
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
**文件读取完整**:超过 500 行的文件,不要假设单次读取覆盖了完整文件——根据需要分次读取相关段落,或编辑前重新读取完整文件。超过 10 条消息后,编辑任何文件前强制重新读取。
|
|
21
21
|
|
|
22
|
-
**OpenSpec
|
|
22
|
+
**OpenSpec 阶段隔离**:`specs/playwright/`、`tests/playwright/`(seed 除外)和 `test-plan.md` 由 `/opsx:e2e` 显式触发,不由 explore/propose/continue/apply/verify 等阶段自动推断。E2E 工作流是独立的。
|
|
23
23
|
|
|
24
24
|
**重构前清死代码**:未使用的 import/export/prop/console.log 先删掉,单独提交,再做重构。
|
|
25
25
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openspec-playwright",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.71",
|
|
4
4
|
"description": "OpenSpec + Playwright E2E verification setup tool for Claude Code",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -41,7 +41,6 @@
|
|
|
41
41
|
"dist",
|
|
42
42
|
"bin",
|
|
43
43
|
"templates",
|
|
44
|
-
"schemas",
|
|
45
44
|
".claude",
|
|
46
45
|
"employee-standards.md",
|
|
47
46
|
"README.md",
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
name: playwright-e2e
|
|
2
|
-
version: 1
|
|
3
|
-
description: Playwright E2E verification for an OpenSpec change
|
|
4
|
-
|
|
5
|
-
artifacts:
|
|
6
|
-
- id: test-plan
|
|
7
|
-
generates: specs/playwright/test-plan.md
|
|
8
|
-
description: Test plan derived from change specs
|
|
9
|
-
template: test-plan.md
|
|
10
|
-
instruction: |
|
|
11
|
-
Generate a test plan from the change specs. Each functional requirement becomes
|
|
12
|
-
one or more test cases.
|
|
13
|
-
|
|
14
|
-
For each test case, specify:
|
|
15
|
-
- **Test name** (kebab-case): what it verifies
|
|
16
|
-
- **Route/Page**: which URL or UI component it targets
|
|
17
|
-
- **Prerequisites**: auth role needed (user/admin/guest/none)
|
|
18
|
-
- **Happy path**: main user flow to verify
|
|
19
|
-
- **Error paths**: key error conditions to verify
|
|
20
|
-
|
|
21
|
-
Mark tests with role tags: `@role(user)`, `@role(admin)`, `@role(guest)`, `@role(none)`.
|
|
22
|
-
Mark auth requirement: `@auth(required)` or `@auth(none)`.
|
|
23
|
-
|
|
24
|
-
- id: e2e-test
|
|
25
|
-
generates: tests/playwright/<change>.spec.ts
|
|
26
|
-
description: Playwright E2E test suite
|
|
27
|
-
template: e2e-test.ts
|
|
28
|
-
instruction: |
|
|
29
|
-
Generate Playwright tests from the test-plan.
|
|
30
|
-
|
|
31
|
-
Rules:
|
|
32
|
-
- Follow the page object pattern from seed.spec.ts
|
|
33
|
-
- Prefer `data-testid` selectors, fall back to semantic selectors
|
|
34
|
-
- Each test maps to one test case from the test-plan
|
|
35
|
-
- Use `@project(user)` / `@project(admin)` for role-specific tests
|
|
36
|
-
- Cover happy path AND key error paths
|
|
37
|
-
- Name tests descriptively: `test('shows error on invalid input')`
|
|
38
|
-
|
|
39
|
-
- id: playwright-config
|
|
40
|
-
generates: playwright.config.ts
|
|
41
|
-
description: Playwright config with webServer and auth projects
|
|
42
|
-
template: playwright.config.ts
|
|
43
|
-
instruction: |
|
|
44
|
-
Configure Playwright for E2E testing.
|
|
45
|
-
|
|
46
|
-
- Set webServer command and url from BASE_URL
|
|
47
|
-
- Set baseURL for all tests
|
|
48
|
-
- Add auth setup project if credentials are configured
|
|
49
|
-
- Preserve any existing config fields (browsers, retries, etc.)
|
|
50
|
-
- Do NOT overwrite existing projects unless they conflict
|
|
51
|
-
|
|
52
|
-
apply:
|
|
53
|
-
requires: [test-plan, e2e-test]
|
|
54
|
-
instruction: |
|
|
55
|
-
Run tests via: openspec-pw run <change-name>
|
|
56
|
-
Analyze results and generate report at openspec/reports/playwright-e2e-<change>-<timestamp>.md
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|