openspec-playwright 0.1.62 ā 0.1.64
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/commands/CLAUDE.md +12 -0
- package/.claude/commands/opsx/CLAUDE.md +12 -0
- package/.claude/commands/opsx/e2e-body.md +5 -0
- package/.claude/commands/opsx/e2e.md +5 -1
- package/.claude/skills/CLAUDE.md +12 -0
- package/.claude/skills/openspec-e2e/CLAUDE.md +14 -0
- package/.claude/skills/openspec-e2e/SKILL.md +101 -77
- 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/employee-standards.md +3 -3
- package/package.json +21 -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/.github/workflows/release.yml +0 -81
- package/docs/plans/2026-03-26-openspec-playwright-design.md +0 -180
- 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/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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"}
|