openspec-playwright 0.3.34 → 0.3.35
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/dist/index.js
CHANGED
|
@@ -15,6 +15,7 @@ import { migrate } from "./commands/migrate.js";
|
|
|
15
15
|
import { uninstall } from "./commands/uninstall.js";
|
|
16
16
|
import { audit } from "./commands/audit.js";
|
|
17
17
|
import { explore } from "./commands/explore.js";
|
|
18
|
+
import { checkForUpdate } from "./shared/version-check.js";
|
|
18
19
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
19
20
|
const pkg = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
|
|
20
21
|
const program = new Command();
|
|
@@ -28,18 +29,27 @@ program
|
|
|
28
29
|
.option("-c, --change <name>", "default change name", "default")
|
|
29
30
|
.option("--no-mcp", "skip Playwright MCP configuration")
|
|
30
31
|
.option("--seed", "force regenerate seed.spec.ts (overwrite if exists)")
|
|
31
|
-
.action(
|
|
32
|
+
.action(async (opts) => {
|
|
33
|
+
await init(opts);
|
|
34
|
+
await checkForUpdate(pkg.version);
|
|
35
|
+
});
|
|
32
36
|
program
|
|
33
37
|
.command("doctor")
|
|
34
38
|
.description("Check if all prerequisites are installed")
|
|
35
39
|
.option("--json", "Output results as JSON")
|
|
36
|
-
.action(
|
|
40
|
+
.action(async (opts) => {
|
|
41
|
+
await doctor(opts);
|
|
42
|
+
await checkForUpdate(pkg.version);
|
|
43
|
+
});
|
|
37
44
|
program
|
|
38
45
|
.command("update")
|
|
39
46
|
.description("Update the CLI tool and commands to the latest version")
|
|
40
47
|
.option("--no-cli", "skip CLI update")
|
|
41
48
|
.option("--no-skill", "skip command update")
|
|
42
|
-
.action(
|
|
49
|
+
.action(async (opts) => {
|
|
50
|
+
await update(opts);
|
|
51
|
+
// No version check needed after update — user just updated
|
|
52
|
+
});
|
|
43
53
|
program
|
|
44
54
|
.command("run <change-name>")
|
|
45
55
|
.description("Run Playwright E2E tests for an OpenSpec change")
|
|
@@ -55,21 +65,33 @@ program
|
|
|
55
65
|
.option("--escalated <n>", "Number of human escalations", (v) => parseInt(v, 10), undefined)
|
|
56
66
|
.option("--headed", "Show browser during test run (default: headless)")
|
|
57
67
|
.option("--update-snapshots", "Update screenshot baselines before running tests")
|
|
58
|
-
.action(
|
|
68
|
+
.action(async (changeName, opts) => {
|
|
69
|
+
await run(changeName, opts);
|
|
70
|
+
await checkForUpdate(pkg.version);
|
|
71
|
+
});
|
|
59
72
|
program
|
|
60
73
|
.command("migrate")
|
|
61
74
|
.description("Migrate old-style change spec files to the new tests/playwright/changes/<name>/ structure")
|
|
62
75
|
.option("-n, --dry-run", "Show what would be migrated without moving files")
|
|
63
76
|
.option("-f, --force", "Overwrite existing files at the new location")
|
|
64
|
-
.action(
|
|
77
|
+
.action(async (opts) => {
|
|
78
|
+
await migrate(opts);
|
|
79
|
+
await checkForUpdate(pkg.version);
|
|
80
|
+
});
|
|
65
81
|
program
|
|
66
82
|
.command("uninstall")
|
|
67
83
|
.description("Remove OpenSpec + Playwright E2E integration from the current project")
|
|
68
|
-
.action(
|
|
84
|
+
.action(async () => {
|
|
85
|
+
await uninstall();
|
|
86
|
+
await checkForUpdate(pkg.version);
|
|
87
|
+
});
|
|
69
88
|
program
|
|
70
89
|
.command("audit")
|
|
71
90
|
.description("Audit test files for orphaned specs, missing auth, sitemap issues")
|
|
72
|
-
.action(
|
|
91
|
+
.action(async () => {
|
|
92
|
+
await audit();
|
|
93
|
+
await checkForUpdate(pkg.version);
|
|
94
|
+
});
|
|
73
95
|
program
|
|
74
96
|
.command("explore")
|
|
75
97
|
.description("Explore routes in parallel with Playwright")
|
|
@@ -77,6 +99,7 @@ program
|
|
|
77
99
|
.option("-n, --dry-run", "Show what would be explored without running")
|
|
78
100
|
.action(async (opts) => {
|
|
79
101
|
await explore(opts);
|
|
102
|
+
await checkForUpdate(pkg.version);
|
|
80
103
|
});
|
|
81
104
|
program.parse();
|
|
82
105
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,8FAA8F;AAC9F,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC5C,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version check: periodically query npm for the latest version
|
|
3
|
+
* and show a one-line hint when the user's CLI is outdated.
|
|
4
|
+
*
|
|
5
|
+
* - Caches result in `~/.openspec-pw-version.json`
|
|
6
|
+
* - Only hits the registry once per 24 hours
|
|
7
|
+
* - Never throws — failures are silently ignored
|
|
8
|
+
* - Runs *after* the command completes so it doesn't slow anything down
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
11
|
+
import { join } from "path";
|
|
12
|
+
import { homedir } from "os";
|
|
13
|
+
import { execFile } from "node:child_process";
|
|
14
|
+
import { promisify } from "util";
|
|
15
|
+
import chalk from "chalk";
|
|
16
|
+
import { needsShell } from "./platform.js";
|
|
17
|
+
const execFileAsync = promisify(execFile);
|
|
18
|
+
const CACHE_FILE = join(homedir(), ".openspec-pw-version.json");
|
|
19
|
+
const CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours
|
|
20
|
+
function readCache() {
|
|
21
|
+
try {
|
|
22
|
+
if (!existsSync(CACHE_FILE))
|
|
23
|
+
return null;
|
|
24
|
+
return JSON.parse(readFileSync(CACHE_FILE, "utf-8"));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function writeCache(cache) {
|
|
31
|
+
try {
|
|
32
|
+
writeFileSync(CACHE_FILE, JSON.stringify(cache));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// ignore — cache is optional
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async function fetchLatestVersion() {
|
|
39
|
+
try {
|
|
40
|
+
const { stdout } = await execFileAsync("npm", ["view", "openspec-playwright", "version"], { timeout: 10_000, shell: needsShell });
|
|
41
|
+
return stdout.trim() || null;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function compareVersions(a, b) {
|
|
48
|
+
const pa = a.replace(/^v/, "").split(".").map(Number);
|
|
49
|
+
const pb = b.replace(/^v/, "").split(".").map(Number);
|
|
50
|
+
for (let i = 0; i < 3; i++) {
|
|
51
|
+
if ((pa[i] ?? 0) > (pb[i] ?? 0))
|
|
52
|
+
return 1;
|
|
53
|
+
if ((pa[i] ?? 0) < (pb[i] ?? 0))
|
|
54
|
+
return -1;
|
|
55
|
+
}
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Show a version update hint if the CLI is outdated.
|
|
60
|
+
* Call this *after* the main command finishes so it doesn't block.
|
|
61
|
+
*/
|
|
62
|
+
export async function checkForUpdate(currentVersion) {
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
const cached = readCache();
|
|
65
|
+
let latest;
|
|
66
|
+
if (cached && now - cached.lastCheck < CACHE_TTL) {
|
|
67
|
+
latest = cached.latestVersion;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
latest = await fetchLatestVersion();
|
|
71
|
+
if (latest) {
|
|
72
|
+
writeCache({ lastCheck: now, latestVersion: latest });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!latest || compareVersions(latest, currentVersion) <= 0)
|
|
76
|
+
return;
|
|
77
|
+
// Newer version available
|
|
78
|
+
console.log(chalk.gray(`\n💡 A new version of openspec-pw is available: ${currentVersion} → ${latest}`));
|
|
79
|
+
console.log(chalk.gray(" Run: npm install -g openspec-playwright@latest"));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/shared/version-check.ts"],"names":[],"mappings":"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"}
|