openspec-playwright 0.2.3 → 0.2.4

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.
@@ -1,4 +1,3 @@
1
- import { execSync } from "child_process";
2
1
  import { existsSync, mkdirSync, readdirSync, renameSync, } from "fs";
3
2
  import { join } from "path";
4
3
  import chalk from "chalk";
@@ -19,24 +18,7 @@ export async function migrate(options) {
19
18
  return;
20
19
  }
21
20
  console.log(chalk.blue("\nšŸ”„ OpenSpec Playwright: Migration\n"));
22
- // 1. Get list of OpenSpec changes (to validate)
23
- let changeNames = [];
24
- try {
25
- const result = execSync("npx openspec list --json", {
26
- cwd: projectRoot,
27
- encoding: "utf-8",
28
- timeout: 30000,
29
- });
30
- const data = JSON.parse(result);
31
- changeNames = Array.isArray(data)
32
- ? data.map((c) => c.name)
33
- : Object.keys(data);
34
- }
35
- catch {
36
- // If openspec not available or no changes, proceed with empty list
37
- changeNames = [];
38
- }
39
- // 2. Find old-style spec files in root
21
+ // 1. Find old-style spec files in root
40
22
  const oldFiles = readdirSync(testsDir)
41
23
  .filter((f) => f.endsWith(".spec.ts"))
42
24
  .filter((f) => !SHARED_FILES.has(f))
@@ -51,48 +33,30 @@ export async function migrate(options) {
51
33
  const oldPath = join(testsDir, fileName);
52
34
  const newDir = join(testsDir, "changes", changeName);
53
35
  const newPath = join(newDir, fileName);
54
- const valid = changeNames.includes(changeName);
55
- const reason = valid
56
- ? undefined
57
- : changeNames.length === 0
58
- ? "openspec not initialized or no changes found"
59
- : `change "${changeName}" not found in openspec`;
60
- return { fileName, changeName, oldPath, newPath, valid, reason };
36
+ return { fileName, changeName, oldPath, newPath };
61
37
  });
62
- // 4. Display findings
63
- const validItems = items.filter((i) => i.valid);
64
- const invalidItems = items.filter((i) => !i.valid);
38
+ // 3. Display migration plan
65
39
  for (const item of items) {
66
- const icon = item.valid ? chalk.green("āœ“") : chalk.red("āœ—");
67
- console.log(` ${icon} ${item.fileName} → changes/${item.changeName}/${item.fileName}`);
68
- if (item.reason) {
69
- console.log(chalk.gray(` Skip: ${item.reason}`));
70
- }
40
+ console.log(` ${chalk.green("→")} ${item.fileName} → changes/${item.changeName}/${item.fileName}`);
71
41
  }
72
- if (invalidItems.length > 0) {
73
- console.log(chalk.yellow(`\n ⚠ ${invalidItems.length} file(s) skipped (no matching OpenSpec change)`));
74
- }
75
- if (validItems.length === 0) {
76
- console.log(chalk.blue("\n No valid migrations to perform.\n"));
77
- return;
78
- }
79
- // 5. Dry run or execute
42
+ // 4. Dry run
80
43
  if (options.dryRun) {
81
44
  console.log(chalk.blue(`\n─── Dry run — no files were moved ───`));
82
- console.log(chalk.green(" All valid migrations would succeed.\n"));
45
+ console.log(chalk.green(" All migrations would succeed.\n"));
83
46
  return;
84
47
  }
48
+ // 5. Ensure changes/ directory exists
49
+ mkdirSync(join(testsDir, "changes"), { recursive: true });
50
+ // 6. Execute migrations
85
51
  console.log(chalk.blue("\n─── Migrating ───"));
86
52
  let migrated = 0;
87
53
  let skipped = 0;
88
- for (const item of validItems) {
89
- // Check if file exists
54
+ for (const item of items) {
90
55
  if (!existsSync(item.oldPath)) {
91
56
  console.log(chalk.yellow(` ⚠ ${item.fileName} not found, skipping`));
92
57
  skipped++;
93
58
  continue;
94
59
  }
95
- // Check if new location already has a file
96
60
  if (existsSync(item.newPath)) {
97
61
  if (!options.force) {
98
62
  console.log(chalk.yellow(` ⚠ ${item.newPath} already exists. Use --force to overwrite.`));
@@ -100,16 +64,15 @@ export async function migrate(options) {
100
64
  continue;
101
65
  }
102
66
  }
103
- // Create directory and move
104
67
  mkdirSync(join(testsDir, "changes", item.changeName), {
105
68
  recursive: true,
106
69
  });
107
70
  renameSync(item.oldPath, item.newPath);
108
71
  migrated++;
109
72
  }
110
- // 6. Summary
73
+ // 7. Summary
111
74
  console.log(chalk.blue("\n─── Results ───"));
112
- console.log(` ${chalk.green(`āœ“ ${migrated} migrated`)} ${chalk.red(`āœ— ${skipped} skipped`)}`);
75
+ console.log(` ${chalk.green(`āœ“ ${migrated} migrated`)} ${skipped > 0 ? chalk.red(`āœ— ${skipped} skipped`) : ""}`);
113
76
  console.log(chalk.blue("\n─── Next step ───"));
114
77
  console.log(chalk.green(" Run `openspec-pw run <name>` to verify each migrated change.\n"));
115
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openspec-playwright",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "OpenSpec + Playwright E2E verification setup tool for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {