openspec-playwright 0.1.62 → 0.1.63
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/LICENSE +21 -0
- package/README.md +4 -3
- package/README.zh-CN.md +4 -3
- package/bin/CLAUDE.md +11 -0
- package/dist/CLAUDE.md +17 -0
- package/dist/commands/doctor.d.ts +4 -1
- package/dist/commands/doctor.js +110 -73
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/editors.js +149 -95
- package/dist/commands/editors.js.map +1 -1
- package/dist/commands/init.js +105 -97
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcpSync.js +46 -31
- package/dist/commands/mcpSync.js.map +1 -1
- package/dist/commands/run.d.ts +13 -0
- package/dist/commands/run.js +74 -51
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/uninstall.d.ts +1 -0
- package/dist/commands/uninstall.js +133 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.js +79 -68
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +33 -26
- package/dist/index.js.map +1 -1
- package/package.json +19 -1
- package/schemas/playwright-e2e/templates/playwright.config.ts +22 -22
- package/templates/CLAUDE.md +15 -0
- package/templates/seed.spec.ts +5 -3
- package/.claude/commands/opsx/e2e-body.md +0 -39
- package/.claude/commands/opsx/e2e.md +0 -47
- package/.claude/skills/openspec-e2e/SKILL.md +0 -464
- package/.github/workflows/release.yml +0 -81
- package/docs/plans/2026-03-26-openspec-playwright-design.md +0 -180
- package/employee-standards.md +0 -44
- package/openspec/schemas/playwright-e2e/schema.yaml +0 -56
- package/openspec/schemas/playwright-e2e/templates/e2e-test.ts +0 -55
- package/openspec/schemas/playwright-e2e/templates/playwright.config.ts +0 -52
- package/openspec/schemas/playwright-e2e/templates/report.md +0 -27
- package/openspec/schemas/playwright-e2e/templates/test-plan.md +0 -24
- package/openspec-playwright-0.1.62.tgz +0 -0
- package/release-notes.md +0 -5
- package/src/commands/doctor.ts +0 -115
- package/src/commands/editors.ts +0 -606
- package/src/commands/init.ts +0 -252
- package/src/commands/mcpSync.ts +0 -160
- package/src/commands/run.ts +0 -172
- package/src/commands/update.ts +0 -192
- package/src/index.ts +0 -47
- package/tests/editors.test.ts +0 -180
- package/tsconfig.json +0 -18
- package/vitest.config.ts +0 -9
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-present wxhou
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ openspec-pw init # Install Playwright E2E integration
|
|
|
20
20
|
|
|
21
21
|
## Supported AI Coding Assistants
|
|
22
22
|
|
|
23
|
-
Auto-detects and installs commands for all
|
|
23
|
+
Auto-detects and installs commands for all 23 editors OpenSpec supports:
|
|
24
24
|
|
|
25
25
|
| Editor | Path | Editor | Path |
|
|
26
26
|
|--------|------|--------|------|
|
|
@@ -54,6 +54,7 @@ Auto-detects and installs commands for all 24 editors OpenSpec supports:
|
|
|
54
54
|
openspec-pw init # Initialize integration (one-time setup)
|
|
55
55
|
openspec-pw update # Update CLI and commands to latest version
|
|
56
56
|
openspec-pw doctor # Check prerequisites
|
|
57
|
+
openspec-pw uninstall # Remove integration from the project
|
|
57
58
|
```
|
|
58
59
|
|
|
59
60
|
## How It Works
|
|
@@ -100,12 +101,12 @@ openspec-pw doctor # Check prerequisites
|
|
|
100
101
|
|
|
101
102
|
1. **Node.js >= 20**
|
|
102
103
|
2. **OpenSpec** initialized: `npm install -g @fission-ai/openspec && openspec init`
|
|
103
|
-
3. **One of
|
|
104
|
+
3. **One of 23 editors**: Claude Code, Cursor, Windsurf, Cline, Continue, Amazon Q, Gemini CLI, GitHub Copilot, Kiro, Kilo Code, iFlow, CoStrict, OpenCode, Auggie, Factory, CodeBuddy, Codex, Pi, Qoder, Qwen Code, RooCode, Crush, Antigravity (auto-detected)
|
|
104
105
|
4. **Claude Code only**: Playwright MCP — `claude mcp add playwright npx @playwright/mcp@latest`
|
|
105
106
|
|
|
106
107
|
## What `openspec-pw init` Does
|
|
107
108
|
|
|
108
|
-
1. Detects installed AI coding assistants (all
|
|
109
|
+
1. Detects installed AI coding assistants (all 23 supported editors)
|
|
109
110
|
2. Installs E2E command/workflow files for each detected editor
|
|
110
111
|
3. Installs `/openspec-e2e` skill for Claude Code
|
|
111
112
|
4. Installs Playwright MCP globally for Claude Code (via `claude mcp add`)
|
package/README.zh-CN.md
CHANGED
|
@@ -20,7 +20,7 @@ openspec-pw init # 安装 Playwright E2E 集成
|
|
|
20
20
|
|
|
21
21
|
## 支持的 AI 编码助手
|
|
22
22
|
|
|
23
|
-
自动检测并安装 OpenSpec 支持的全部
|
|
23
|
+
自动检测并安装 OpenSpec 支持的全部 23 个编辑器的命令文件:
|
|
24
24
|
|
|
25
25
|
| 编辑器 | 路径 | 编辑器 | 路径 |
|
|
26
26
|
|--------|------|--------|------|
|
|
@@ -54,6 +54,7 @@ openspec-pw init # 安装 Playwright E2E 集成
|
|
|
54
54
|
openspec-pw init # 初始化集成(一次性设置)
|
|
55
55
|
openspec-pw update # 更新 CLI 和命令到最新版本
|
|
56
56
|
openspec-pw doctor # 检查前置条件
|
|
57
|
+
openspec-pw uninstall # 移除项目中的集成
|
|
57
58
|
```
|
|
58
59
|
|
|
59
60
|
## 工作原理
|
|
@@ -101,12 +102,12 @@ openspec-pw doctor # 检查前置条件
|
|
|
101
102
|
|
|
102
103
|
1. **Node.js >= 20**
|
|
103
104
|
2. **OpenSpec** 已初始化: `npm install -g @fission-ai/openspec && openspec init`
|
|
104
|
-
3. **任一
|
|
105
|
+
3. **任一 23 编辑器**: Claude Code、Cursor、Windsurf、Cline、Continue 等(自动检测)
|
|
105
106
|
4. **仅 Claude Code**: Playwright MCP — `claude mcp add playwright npx @playwright/mcp@latest`
|
|
106
107
|
|
|
107
108
|
## `openspec-pw init` 做了什么
|
|
108
109
|
|
|
109
|
-
1. 检测已安装的 AI 编码助手(支持全部
|
|
110
|
+
1. 检测已安装的 AI 编码助手(支持全部 23 个编辑器)
|
|
110
111
|
2. 为每个检测到的编辑器安装 E2E 命令/工作流文件
|
|
111
112
|
3. 为 Claude Code 安装 `/openspec-e2e` skill
|
|
112
113
|
4. 为 Claude Code 全局安装 Playwright MCP(通过 `claude mcp add`)
|
package/bin/CLAUDE.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<claude-mem-context>
|
|
2
|
+
# Recent Activity
|
|
3
|
+
|
|
4
|
+
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
+
|
|
6
|
+
### Mar 26, 2026
|
|
7
|
+
|
|
8
|
+
| ID | Time | T | Title | Read |
|
|
9
|
+
|----|------|---|-------|------|
|
|
10
|
+
| #5347 | 6:14 PM | 🔄 | Removed complex wrapper script bin/openspec-pw.js | ~119 |
|
|
11
|
+
</claude-mem-context>
|
package/dist/CLAUDE.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<claude-mem-context>
|
|
2
|
+
# Recent Activity
|
|
3
|
+
|
|
4
|
+
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
|
+
|
|
6
|
+
### Mar 26, 2026
|
|
7
|
+
|
|
8
|
+
| ID | Time | T | Title | Read |
|
|
9
|
+
|----|------|---|-------|------|
|
|
10
|
+
| #5344 | 6:14 PM | 🟣 | Openspec-playwright CLI tool with 4 commands implemented | ~294 |
|
|
11
|
+
|
|
12
|
+
### Mar 27, 2026
|
|
13
|
+
|
|
14
|
+
| ID | Time | T | Title | Read |
|
|
15
|
+
|----|------|---|-------|------|
|
|
16
|
+
| #5381 | 9:46 AM | 🟣 | Built openspec-pw CLI tool with init and doctor commands | ~206 |
|
|
17
|
+
</claude-mem-context>
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,110 +1,147 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from
|
|
2
|
-
import { join } from
|
|
3
|
-
import { homedir } from
|
|
4
|
-
import { execSync } from
|
|
5
|
-
import chalk from
|
|
6
|
-
export async function doctor() {
|
|
7
|
-
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { execSync } from "child_process";
|
|
5
|
+
import chalk from "chalk";
|
|
6
|
+
export async function doctor(options = {}) {
|
|
7
|
+
const checks = [];
|
|
8
8
|
const projectRoot = process.cwd();
|
|
9
|
-
let allOk = true;
|
|
10
9
|
// Node.js
|
|
11
|
-
console.log(chalk.blue('─── Node.js ───'));
|
|
12
10
|
try {
|
|
13
|
-
const node = execSync(
|
|
14
|
-
|
|
11
|
+
const node = execSync("node --version", { encoding: "utf-8" }).trim();
|
|
12
|
+
checks.push({
|
|
13
|
+
category: "Node.js",
|
|
14
|
+
name: "node",
|
|
15
|
+
ok: true,
|
|
16
|
+
message: node,
|
|
17
|
+
});
|
|
15
18
|
}
|
|
16
19
|
catch {
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
checks.push({
|
|
21
|
+
category: "Node.js",
|
|
22
|
+
name: "node",
|
|
23
|
+
ok: false,
|
|
24
|
+
message: "not found",
|
|
25
|
+
});
|
|
19
26
|
}
|
|
20
27
|
// npm
|
|
21
|
-
console.log(chalk.blue('\n─── npm ───'));
|
|
22
28
|
try {
|
|
23
|
-
const npm = execSync(
|
|
24
|
-
|
|
29
|
+
const npm = execSync("npm --version", { encoding: "utf-8" }).trim();
|
|
30
|
+
checks.push({
|
|
31
|
+
category: "npm",
|
|
32
|
+
name: "npm",
|
|
33
|
+
ok: true,
|
|
34
|
+
message: npm,
|
|
35
|
+
});
|
|
25
36
|
}
|
|
26
37
|
catch {
|
|
27
|
-
|
|
28
|
-
|
|
38
|
+
checks.push({
|
|
39
|
+
category: "npm",
|
|
40
|
+
name: "npm",
|
|
41
|
+
ok: false,
|
|
42
|
+
message: "not found",
|
|
43
|
+
});
|
|
29
44
|
}
|
|
30
45
|
// OpenSpec
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
console.log(chalk.gray(' Run: openspec init'));
|
|
39
|
-
allOk = false;
|
|
40
|
-
}
|
|
46
|
+
const hasOpenSpec = existsSync(join(projectRoot, "openspec"));
|
|
47
|
+
checks.push({
|
|
48
|
+
category: "OpenSpec",
|
|
49
|
+
name: "openspec",
|
|
50
|
+
ok: hasOpenSpec,
|
|
51
|
+
message: hasOpenSpec ? "initialized" : "not initialized",
|
|
52
|
+
});
|
|
41
53
|
// Playwright browsers
|
|
42
|
-
console.log(chalk.blue('\n─── Playwright Browsers ───'));
|
|
43
54
|
try {
|
|
44
|
-
const pw = execSync(
|
|
45
|
-
|
|
55
|
+
const pw = execSync("npx playwright --version", {
|
|
56
|
+
encoding: "utf-8",
|
|
57
|
+
}).trim();
|
|
58
|
+
checks.push({
|
|
59
|
+
category: "Playwright Browsers",
|
|
60
|
+
name: "playwright",
|
|
61
|
+
ok: true,
|
|
62
|
+
message: pw,
|
|
63
|
+
});
|
|
46
64
|
}
|
|
47
65
|
catch {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
66
|
+
checks.push({
|
|
67
|
+
category: "Playwright Browsers",
|
|
68
|
+
name: "playwright",
|
|
69
|
+
ok: false,
|
|
70
|
+
message: "not installed",
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Playwright MCP
|
|
54
74
|
const homeDir = homedir();
|
|
55
|
-
const claudeJsonPath = join(homeDir,
|
|
75
|
+
const claudeJsonPath = join(homeDir, ".claude.json");
|
|
56
76
|
let mcpInstalled = false;
|
|
57
77
|
if (existsSync(claudeJsonPath)) {
|
|
58
78
|
try {
|
|
59
|
-
const claudeJson = JSON.parse(readFileSync(claudeJsonPath,
|
|
79
|
+
const claudeJson = JSON.parse(readFileSync(claudeJsonPath, "utf-8"));
|
|
60
80
|
const globalMcp = claudeJson?.mcpServers ?? {};
|
|
61
81
|
const localMcp = claudeJson?.projects?.[projectRoot]?.mcpServers ?? {};
|
|
62
|
-
if (globalMcp[
|
|
82
|
+
if (globalMcp["playwright"] || localMcp["playwright"]) {
|
|
63
83
|
mcpInstalled = true;
|
|
64
84
|
}
|
|
65
85
|
}
|
|
66
86
|
catch {
|
|
67
|
-
//
|
|
87
|
+
// .claude.json missing or malformed — MCP not configured
|
|
68
88
|
}
|
|
69
89
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
allOk = false;
|
|
77
|
-
}
|
|
90
|
+
checks.push({
|
|
91
|
+
category: "Playwright MCP",
|
|
92
|
+
name: "playwright-mcp",
|
|
93
|
+
ok: mcpInstalled,
|
|
94
|
+
message: mcpInstalled ? "installed" : "not configured",
|
|
95
|
+
});
|
|
78
96
|
// Skill
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
console.log(chalk.gray(' Run: openspec-pw init'));
|
|
87
|
-
allOk = false;
|
|
88
|
-
}
|
|
97
|
+
const hasSkill = existsSync(join(projectRoot, ".claude", "skills", "openspec-e2e", "SKILL.md"));
|
|
98
|
+
checks.push({
|
|
99
|
+
category: "Claude Code Skill",
|
|
100
|
+
name: "skill",
|
|
101
|
+
ok: hasSkill,
|
|
102
|
+
message: hasSkill ? "installed" : "not installed",
|
|
103
|
+
});
|
|
89
104
|
// Seed test
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
105
|
+
const hasSeed = existsSync(join(projectRoot, "tests", "playwright", "seed.spec.ts"));
|
|
106
|
+
checks.push({
|
|
107
|
+
category: "Seed Test",
|
|
108
|
+
name: "seed",
|
|
109
|
+
ok: hasSeed,
|
|
110
|
+
message: hasSeed ? "found" : "not found (optional)",
|
|
111
|
+
});
|
|
112
|
+
const allOk = checks.filter((c) => !c.ok && c.category !== "Seed Test").length === 0;
|
|
113
|
+
if (options.json) {
|
|
114
|
+
console.log(JSON.stringify({ ok: allOk, checks }, null, 2));
|
|
115
|
+
if (!allOk)
|
|
116
|
+
process.exit(1);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Text output
|
|
120
|
+
console.log(chalk.blue("\n🔍 OpenSpec + Playwright E2E Prerequisites Check\n"));
|
|
121
|
+
let lastCategory = "";
|
|
122
|
+
for (const check of checks) {
|
|
123
|
+
if (check.category !== lastCategory) {
|
|
124
|
+
console.log(chalk.blue(`─── ${check.category} ───`));
|
|
125
|
+
lastCategory = check.category;
|
|
126
|
+
}
|
|
127
|
+
if (check.ok) {
|
|
128
|
+
console.log(chalk.green(` ✓ ${check.name}: ${check.message}`));
|
|
129
|
+
}
|
|
130
|
+
else if (check.category === "Seed Test") {
|
|
131
|
+
console.log(chalk.yellow(` ⚠ ${check.name}: ${check.message}`));
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.log(chalk.red(` ✗ ${check.name}: ${check.message}`));
|
|
135
|
+
}
|
|
98
136
|
}
|
|
99
|
-
|
|
100
|
-
console.log(chalk.blue('\n─── Summary ───'));
|
|
137
|
+
console.log(chalk.blue("\n─── Summary ───"));
|
|
101
138
|
if (allOk) {
|
|
102
|
-
console.log(chalk.green(
|
|
103
|
-
console.log(chalk.gray(
|
|
139
|
+
console.log(chalk.green(" ✅ All prerequisites met!\n"));
|
|
140
|
+
console.log(chalk.gray(" Run: /opsx:e2e <change-name> in Claude Code\n"));
|
|
104
141
|
}
|
|
105
142
|
else {
|
|
106
|
-
console.log(chalk.red(
|
|
107
|
-
console.log(chalk.gray(
|
|
143
|
+
console.log(chalk.red(" ❌ Some prerequisites are missing\n"));
|
|
144
|
+
console.log(chalk.gray(" Run: openspec-pw init to fix\n"));
|
|
108
145
|
process.exit(1);
|
|
109
146
|
}
|
|
110
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|