@christang/keel 5.77.0 → 5.78.0

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,4 @@
1
- <!-- keel:start version=5.77.0 -->
1
+ <!-- keel:start version=5.78.0 -->
2
2
  ## Keel Bootstrap
3
3
 
4
4
  - Start every session with `keel context`; OpenSpec artifacts and Git are the only durable authority — never native memory, goals, or transcripts.
package/bin/keel.js CHANGED
@@ -1277,9 +1277,34 @@ function skillRootForTarget(target) {
1277
1277
  return path.join(".opencode", "skills");
1278
1278
  }
1279
1279
 
1280
- function openspecSkillRootForTarget(target) {
1280
+ // Which OpenSpec layout a Codex repository carries (#169). OpenSpec 1.6 wrote
1281
+ // Codex's skills under `.codex/skills` and its commands as prompts in
1282
+ // CODEX_HOME; 1.13, which Keel pins, writes skills under `.agents/skills` and
1283
+ // no command files. A repository set up under 1.6 keeps its layout, and every
1284
+ // other one — a fresh repository included — gets the one the pin writes.
1285
+ function codexOpenSpecLayout(repo) {
1286
+ const holdsOpenSpec = (root) => {
1287
+ try {
1288
+ return fs
1289
+ .readdirSync(path.join(repo, root))
1290
+ .some((entry) => entry.startsWith("openspec-"));
1291
+ } catch {
1292
+ return false;
1293
+ }
1294
+ };
1295
+ return holdsOpenSpec(path.join(".codex", "skills"))
1296
+ && !holdsOpenSpec(path.join(".agents", "skills"))
1297
+ ? "legacy"
1298
+ : "agents";
1299
+ }
1300
+
1301
+ function openspecSkillRootForTarget(target, repo) {
1281
1302
  if (target === "claude") return path.join(".claude", "skills");
1282
- if (target === "codex") return path.join(".codex", "skills");
1303
+ if (target === "codex") {
1304
+ return codexOpenSpecLayout(repo) === "legacy"
1305
+ ? path.join(".codex", "skills")
1306
+ : path.join(".agents", "skills");
1307
+ }
1283
1308
  return path.join(".opencode", "skills");
1284
1309
  }
1285
1310
 
@@ -1294,6 +1319,16 @@ function commandSurfaceForTarget(target, repo) {
1294
1319
  remediation: "run keel --init --target claude or openspec update --force",
1295
1320
  };
1296
1321
  }
1322
+ if (target === "codex" && codexOpenSpecLayout(repo) === "agents") {
1323
+ // OpenSpec 1.13 surfaces Codex's workflows as the skills counted on the
1324
+ // line above and writes no command file, so there is nothing to count here.
1325
+ return {
1326
+ location: path.join(".agents", "skills"),
1327
+ paths: [],
1328
+ remediation: "run keel --init --target codex or openspec update --force",
1329
+ skillsOnly: true,
1330
+ };
1331
+ }
1297
1332
  if (target === "codex") {
1298
1333
  const home = codexHome();
1299
1334
  const location = path.join(home, "prompts");
@@ -1320,13 +1355,15 @@ function commandPathForAction(target, repo, action) {
1320
1355
  return path.join(repo, ".claude", "commands", "opsx", `${action}.md`);
1321
1356
  }
1322
1357
  if (target === "codex") {
1323
- return path.join(codexHome(), "prompts", `opsx-${action}.md`);
1358
+ return codexOpenSpecLayout(repo) === "legacy"
1359
+ ? path.join(codexHome(), "prompts", `opsx-${action}.md`)
1360
+ : null;
1324
1361
  }
1325
1362
  return path.join(repo, ".opencode", "commands", `opsx-${action}.md`);
1326
1363
  }
1327
1364
 
1328
1365
  function openspecOverlaySurfacesForTarget(target, repo) {
1329
- const skillRoot = openspecSkillRootForTarget(target);
1366
+ const skillRoot = openspecSkillRootForTarget(target, repo);
1330
1367
  return OPENSPEC_OVERLAY_ACTIONS.flatMap((action) => {
1331
1368
  if (action === "propose" && target === "opencode") {
1332
1369
  return [];
@@ -1346,7 +1383,7 @@ function openspecOverlaySurfacesForTarget(target, repo) {
1346
1383
  action,
1347
1384
  path: commandPathForAction(target, repo, action),
1348
1385
  },
1349
- ];
1386
+ ].filter((surface) => surface.path !== null);
1350
1387
  });
1351
1388
  }
1352
1389
 
@@ -1699,7 +1736,7 @@ function printTargetSurface(repo, target) {
1699
1736
  }
1700
1737
  }
1701
1738
 
1702
- const openspecSkillRoot = openspecSkillRootForTarget(target);
1739
+ const openspecSkillRoot = openspecSkillRootForTarget(target, repo);
1703
1740
  const openspecSkillPaths = OPENSPEC_SKILLS.map((skill) =>
1704
1741
  path.join(repo, openspecSkillRoot, skill, "SKILL.md")
1705
1742
  );
@@ -1722,16 +1759,25 @@ function printTargetSurface(repo, target) {
1722
1759
  );
1723
1760
 
1724
1761
  const commands = commandSurfaceForTarget(target, repo);
1725
- const commandCounts = countExisting(commands.paths);
1726
- const commandDetail =
1727
- surfaceStatus(commandCounts) === "ok"
1728
- ? formatCount(commandCounts, commands.location)
1729
- : `${formatCount(commandCounts, commands.location)}; ${commands.remediation}`;
1730
- printDoctorLine(
1731
- "OpenSpec commands",
1732
- surfaceStatus(commandCounts),
1733
- commandDetail
1734
- );
1762
+ if (commands.skillsOnly) {
1763
+ printDoctorLine(
1764
+ "OpenSpec commands",
1765
+ "ok",
1766
+ `none; OpenSpec 1.13 surfaces Codex's workflows as the skills under `
1767
+ + `${commands.location}`
1768
+ );
1769
+ } else {
1770
+ const commandCounts = countExisting(commands.paths);
1771
+ const commandDetail =
1772
+ surfaceStatus(commandCounts) === "ok"
1773
+ ? formatCount(commandCounts, commands.location)
1774
+ : `${formatCount(commandCounts, commands.location)}; ${commands.remediation}`;
1775
+ printDoctorLine(
1776
+ "OpenSpec commands",
1777
+ surfaceStatus(commandCounts),
1778
+ commandDetail
1779
+ );
1780
+ }
1735
1781
 
1736
1782
  const overlayPaths = openspecOverlaySurfacesForTarget(target, repo).map(
1737
1783
  (surface) => surface.path
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@christang/keel",
3
- "version": "5.77.0",
3
+ "version": "5.78.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@christang/keel",
9
- "version": "5.77.0",
9
+ "version": "5.78.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@fission-ai/openspec": "^1.4.1"
@@ -19,22 +19,21 @@
19
19
  }
20
20
  },
21
21
  "node_modules/@fission-ai/openspec": {
22
- "version": "1.6.0",
23
- "resolved": "https://registry.npmjs.org/@fission-ai/openspec/-/openspec-1.6.0.tgz",
24
- "integrity": "sha512-7yFTQ3hrrk11mQ2ACClNv2gtAN0o116vCgwoiQKmreoB6ambSnrZh7wf2FNFoSDBXHBi9iiCQ7G16fG71ZNppA==",
25
- "hasInstallScript": true,
22
+ "version": "1.13.2",
23
+ "resolved": "https://registry.npmjs.org/@fission-ai/openspec/-/openspec-1.13.2.tgz",
24
+ "integrity": "sha512-HzBaN9C1/ET+tgm/pxbWQYY4Kf+X9/1MSVEGQ8ZT3g4ZpdHn6v82CHkN+zmt9qv98Ghw0MDpmURasjJD2f90bg==",
26
25
  "license": "MIT",
27
26
  "dependencies": {
28
- "@inquirer/core": "^10.3.2",
29
- "@inquirer/prompts": "^7.10.1",
30
- "chalk": "^5.5.0",
27
+ "@inquirer/core": "^12.0.0",
28
+ "@inquirer/prompts": "^8.5.2",
29
+ "chalk": "^5.6.2",
31
30
  "commander": "^14.0.0",
32
31
  "cross-spawn": "7.0.6",
32
+ "diff": "^9.0.0",
33
33
  "fast-glob": "^3.3.3",
34
- "ora": "^8.2.0",
35
- "posthog-node": "^5.20.0",
36
- "yaml": "^2.8.2",
37
- "zod": "^4.0.17"
34
+ "ora": "^9.4.1",
35
+ "yaml": "^2.8.3",
36
+ "zod": "^4.4.3"
38
37
  },
39
38
  "bin": {
40
39
  "openspec": "bin/openspec.js"
@@ -44,28 +43,27 @@
44
43
  }
45
44
  },
46
45
  "node_modules/@inquirer/ansi": {
47
- "version": "1.0.2",
48
- "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz",
49
- "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==",
46
+ "version": "2.0.8",
47
+ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.8.tgz",
48
+ "integrity": "sha512-WpQM+Ti6Z40EFwwt+uL2p4UabT+W179zHp6HhLVOzfbwnVn05IPO/eXIZXGNqcT1jbQ15SujNLzQ39k4QPPxBQ==",
50
49
  "license": "MIT",
51
50
  "engines": {
52
- "node": ">=18"
51
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
53
52
  }
54
53
  },
55
54
  "node_modules/@inquirer/checkbox": {
56
- "version": "4.3.2",
57
- "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz",
58
- "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==",
55
+ "version": "5.2.5",
56
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.5.tgz",
57
+ "integrity": "sha512-bRt8J8m+Fot9CXv+zNQGXUq2ET0MggR1fPz7v6edN6MFYmsbfGnMmkmWZJEegMKqrAC8ej/o1sqisHZXZJMAfQ==",
59
58
  "license": "MIT",
60
59
  "dependencies": {
61
- "@inquirer/ansi": "^1.0.2",
62
- "@inquirer/core": "^10.3.2",
63
- "@inquirer/figures": "^1.0.15",
64
- "@inquirer/type": "^3.0.10",
65
- "yoctocolors-cjs": "^2.1.3"
60
+ "@inquirer/ansi": "^2.0.8",
61
+ "@inquirer/core": "^12.0.3",
62
+ "@inquirer/figures": "^2.0.9",
63
+ "@inquirer/type": "4.1.1"
66
64
  },
67
65
  "engines": {
68
- "node": ">=18"
66
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
69
67
  },
70
68
  "peerDependencies": {
71
69
  "@types/node": ">=18"
@@ -77,16 +75,16 @@
77
75
  }
78
76
  },
79
77
  "node_modules/@inquirer/confirm": {
80
- "version": "5.1.21",
81
- "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz",
82
- "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==",
78
+ "version": "6.3.2",
79
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.3.2.tgz",
80
+ "integrity": "sha512-Xvr/0HggjddPtGppuqVmxhTw+Hr8PvsZ/k0HmOEaAqQEt80OITNkFWnsdNmyT0/eM4Ab+iJLx2R8rctlEyfSVg==",
83
81
  "license": "MIT",
84
82
  "dependencies": {
85
- "@inquirer/core": "^10.3.2",
86
- "@inquirer/type": "^3.0.10"
83
+ "@inquirer/core": "^12.0.3",
84
+ "@inquirer/type": "4.1.1"
87
85
  },
88
86
  "engines": {
89
- "node": ">=18"
87
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
90
88
  },
91
89
  "peerDependencies": {
92
90
  "@types/node": ">=18"
@@ -98,22 +96,21 @@
98
96
  }
99
97
  },
100
98
  "node_modules/@inquirer/core": {
101
- "version": "10.3.2",
102
- "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz",
103
- "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==",
99
+ "version": "12.0.3",
100
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-12.0.3.tgz",
101
+ "integrity": "sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==",
104
102
  "license": "MIT",
105
103
  "dependencies": {
106
- "@inquirer/ansi": "^1.0.2",
107
- "@inquirer/figures": "^1.0.15",
108
- "@inquirer/type": "^3.0.10",
104
+ "@inquirer/ansi": "^2.0.8",
105
+ "@inquirer/figures": "^2.0.9",
106
+ "@inquirer/type": "4.1.1",
109
107
  "cli-width": "^4.1.0",
110
- "mute-stream": "^2.0.0",
111
- "signal-exit": "^4.1.0",
112
- "wrap-ansi": "^6.2.0",
113
- "yoctocolors-cjs": "^2.1.3"
108
+ "fast-wrap-ansi": "^0.2.0",
109
+ "mute-stream": "^3.0.0",
110
+ "signal-exit": "^4.1.0"
114
111
  },
115
112
  "engines": {
116
- "node": ">=18"
113
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
117
114
  },
118
115
  "peerDependencies": {
119
116
  "@types/node": ">=18"
@@ -125,17 +122,17 @@
125
122
  }
126
123
  },
127
124
  "node_modules/@inquirer/editor": {
128
- "version": "4.2.23",
129
- "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz",
130
- "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==",
125
+ "version": "5.3.3",
126
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.3.3.tgz",
127
+ "integrity": "sha512-YsKkS2q63IiLtaDK/9nqzdComN97SDQrmKiyNggN+ceP4ty+Z6VwyTz3FpjeUWeW1Efss2xHFKCC9sx7hnrsxg==",
131
128
  "license": "MIT",
132
129
  "dependencies": {
133
- "@inquirer/core": "^10.3.2",
134
- "@inquirer/external-editor": "^1.0.3",
135
- "@inquirer/type": "^3.0.10"
130
+ "@inquirer/core": "^12.0.3",
131
+ "@inquirer/external-editor": "^3.0.5",
132
+ "@inquirer/type": "4.1.1"
136
133
  },
137
134
  "engines": {
138
- "node": ">=18"
135
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
139
136
  },
140
137
  "peerDependencies": {
141
138
  "@types/node": ">=18"
@@ -147,17 +144,16 @@
147
144
  }
148
145
  },
149
146
  "node_modules/@inquirer/expand": {
150
- "version": "4.0.23",
151
- "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz",
152
- "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==",
147
+ "version": "5.1.5",
148
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.5.tgz",
149
+ "integrity": "sha512-uHuXLmXW+TtIfT/9vSBotypAkqn1n34Ul+CLGPos/xANyO4Ff5xZzkYhbKR4NEcfVK4a9mHQOpwVZzluSHFRGw==",
153
150
  "license": "MIT",
154
151
  "dependencies": {
155
- "@inquirer/core": "^10.3.2",
156
- "@inquirer/type": "^3.0.10",
157
- "yoctocolors-cjs": "^2.1.3"
152
+ "@inquirer/core": "^12.0.3",
153
+ "@inquirer/type": "4.1.1"
158
154
  },
159
155
  "engines": {
160
- "node": ">=18"
156
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
161
157
  },
162
158
  "peerDependencies": {
163
159
  "@types/node": ">=18"
@@ -169,16 +165,16 @@
169
165
  }
170
166
  },
171
167
  "node_modules/@inquirer/external-editor": {
172
- "version": "1.0.3",
173
- "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
174
- "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==",
168
+ "version": "3.0.5",
169
+ "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.5.tgz",
170
+ "integrity": "sha512-f3QQJRIX5ZEneBHNUIuPjmbdzHnmRFJA8r2dkcb8q+OM5Uv5KtnuAttQumnrjcBVBM3mcTX1CkmtAkU58VRZxg==",
175
171
  "license": "MIT",
176
172
  "dependencies": {
177
173
  "chardet": "^2.1.1",
178
- "iconv-lite": "^0.7.0"
174
+ "iconv-lite": "^0.7.2"
179
175
  },
180
176
  "engines": {
181
- "node": ">=18"
177
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
182
178
  },
183
179
  "peerDependencies": {
184
180
  "@types/node": ">=18"
@@ -190,25 +186,25 @@
190
186
  }
191
187
  },
192
188
  "node_modules/@inquirer/figures": {
193
- "version": "1.0.15",
194
- "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz",
195
- "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==",
189
+ "version": "2.0.9",
190
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.9.tgz",
191
+ "integrity": "sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==",
196
192
  "license": "MIT",
197
193
  "engines": {
198
- "node": ">=18"
194
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
199
195
  }
200
196
  },
201
197
  "node_modules/@inquirer/input": {
202
- "version": "4.3.1",
203
- "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz",
204
- "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==",
198
+ "version": "5.1.6",
199
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.6.tgz",
200
+ "integrity": "sha512-HtcJhB2QFVXbLuJ5S3syhNbTUVxYvwqV4VRBDkQceBloC9bmTViUoRFP5PbSaDZb3HzfPmpuU/gG4ybVBz4FHA==",
205
201
  "license": "MIT",
206
202
  "dependencies": {
207
- "@inquirer/core": "^10.3.2",
208
- "@inquirer/type": "^3.0.10"
203
+ "@inquirer/core": "^12.0.3",
204
+ "@inquirer/type": "4.1.1"
209
205
  },
210
206
  "engines": {
211
- "node": ">=18"
207
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
212
208
  },
213
209
  "peerDependencies": {
214
210
  "@types/node": ">=18"
@@ -220,16 +216,16 @@
220
216
  }
221
217
  },
222
218
  "node_modules/@inquirer/number": {
223
- "version": "3.0.23",
224
- "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz",
225
- "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==",
219
+ "version": "4.2.3",
220
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.2.3.tgz",
221
+ "integrity": "sha512-6Yuwh1NGSbu1Lo4N1EWjXs1jKRntLg/ZCwhmeorEHde90v1XxAozdbd4Iu30eOQLW+6h1hp2O9ujNfLSbTPJnA==",
226
222
  "license": "MIT",
227
223
  "dependencies": {
228
- "@inquirer/core": "^10.3.2",
229
- "@inquirer/type": "^3.0.10"
224
+ "@inquirer/core": "^12.0.3",
225
+ "@inquirer/type": "4.1.1"
230
226
  },
231
227
  "engines": {
232
- "node": ">=18"
228
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
233
229
  },
234
230
  "peerDependencies": {
235
231
  "@types/node": ">=18"
@@ -241,17 +237,17 @@
241
237
  }
242
238
  },
243
239
  "node_modules/@inquirer/password": {
244
- "version": "4.0.23",
245
- "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz",
246
- "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==",
240
+ "version": "5.2.2",
241
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.2.2.tgz",
242
+ "integrity": "sha512-W9zYdyzogK+6110mqwaSJWCBu2yA5Q/OfnGSjjZB1bNpHlmUozXxTl0+QOZBNeVd6Qo81/qT75gW05gLAtITxw==",
247
243
  "license": "MIT",
248
244
  "dependencies": {
249
- "@inquirer/ansi": "^1.0.2",
250
- "@inquirer/core": "^10.3.2",
251
- "@inquirer/type": "^3.0.10"
245
+ "@inquirer/ansi": "^2.0.8",
246
+ "@inquirer/core": "^12.0.3",
247
+ "@inquirer/type": "4.1.1"
252
248
  },
253
249
  "engines": {
254
- "node": ">=18"
250
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
255
251
  },
256
252
  "peerDependencies": {
257
253
  "@types/node": ">=18"
@@ -263,24 +259,24 @@
263
259
  }
264
260
  },
265
261
  "node_modules/@inquirer/prompts": {
266
- "version": "7.10.1",
267
- "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz",
268
- "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==",
262
+ "version": "8.7.2",
263
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.7.2.tgz",
264
+ "integrity": "sha512-QoRB4wFIjgH5iOhSjoIKMkTvSHDuV+O3OITlIqAYO0oK5x364GJILXiMBvlPiE+klg7Xx9tq5XVqQHcGUDYYPA==",
269
265
  "license": "MIT",
270
266
  "dependencies": {
271
- "@inquirer/checkbox": "^4.3.2",
272
- "@inquirer/confirm": "^5.1.21",
273
- "@inquirer/editor": "^4.2.23",
274
- "@inquirer/expand": "^4.0.23",
275
- "@inquirer/input": "^4.3.1",
276
- "@inquirer/number": "^3.0.23",
277
- "@inquirer/password": "^4.0.23",
278
- "@inquirer/rawlist": "^4.1.11",
279
- "@inquirer/search": "^3.2.2",
280
- "@inquirer/select": "^4.4.2"
267
+ "@inquirer/checkbox": "^5.2.5",
268
+ "@inquirer/confirm": "^6.3.2",
269
+ "@inquirer/editor": "^5.3.3",
270
+ "@inquirer/expand": "^5.1.5",
271
+ "@inquirer/input": "^5.1.6",
272
+ "@inquirer/number": "^4.2.3",
273
+ "@inquirer/password": "^5.2.2",
274
+ "@inquirer/rawlist": "^5.3.5",
275
+ "@inquirer/search": "^4.3.3",
276
+ "@inquirer/select": "^5.2.5"
281
277
  },
282
278
  "engines": {
283
- "node": ">=18"
279
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
284
280
  },
285
281
  "peerDependencies": {
286
282
  "@types/node": ">=18"
@@ -292,17 +288,16 @@
292
288
  }
293
289
  },
294
290
  "node_modules/@inquirer/rawlist": {
295
- "version": "4.1.11",
296
- "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz",
297
- "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==",
291
+ "version": "5.3.5",
292
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.5.tgz",
293
+ "integrity": "sha512-1oHky1ONfCOwNrnkQGDE1oaSij/3fI6HFMSf2H/WsGO2lEyDX9My82iggITSy9ddSZ8yk8j9v41OI0fVoSIoaA==",
298
294
  "license": "MIT",
299
295
  "dependencies": {
300
- "@inquirer/core": "^10.3.2",
301
- "@inquirer/type": "^3.0.10",
302
- "yoctocolors-cjs": "^2.1.3"
296
+ "@inquirer/core": "^12.0.3",
297
+ "@inquirer/type": "4.1.1"
303
298
  },
304
299
  "engines": {
305
- "node": ">=18"
300
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
306
301
  },
307
302
  "peerDependencies": {
308
303
  "@types/node": ">=18"
@@ -314,18 +309,17 @@
314
309
  }
315
310
  },
316
311
  "node_modules/@inquirer/search": {
317
- "version": "3.2.2",
318
- "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz",
319
- "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==",
312
+ "version": "4.3.3",
313
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.3.3.tgz",
314
+ "integrity": "sha512-fyuIU1Nbpvwlikjg3gXwJFDI11+EFjqQ7P+iByfmivIKQ1vmaykNrD/vy5unHuUqUpsOsnvJ25//tPF7E/RBRA==",
320
315
  "license": "MIT",
321
316
  "dependencies": {
322
- "@inquirer/core": "^10.3.2",
323
- "@inquirer/figures": "^1.0.15",
324
- "@inquirer/type": "^3.0.10",
325
- "yoctocolors-cjs": "^2.1.3"
317
+ "@inquirer/core": "^12.0.3",
318
+ "@inquirer/figures": "^2.0.9",
319
+ "@inquirer/type": "4.1.1"
326
320
  },
327
321
  "engines": {
328
- "node": ">=18"
322
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
329
323
  },
330
324
  "peerDependencies": {
331
325
  "@types/node": ">=18"
@@ -337,19 +331,18 @@
337
331
  }
338
332
  },
339
333
  "node_modules/@inquirer/select": {
340
- "version": "4.4.2",
341
- "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz",
342
- "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==",
334
+ "version": "5.2.5",
335
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.5.tgz",
336
+ "integrity": "sha512-9kc15hr8r/kI+3DO/xLog5nOzTz1jqsHXa6JBFzmQKhkoJ8Slda1I1L/uD8ZSZ9tF1yp79wwXe7mclvX1rqR2Q==",
343
337
  "license": "MIT",
344
338
  "dependencies": {
345
- "@inquirer/ansi": "^1.0.2",
346
- "@inquirer/core": "^10.3.2",
347
- "@inquirer/figures": "^1.0.15",
348
- "@inquirer/type": "^3.0.10",
349
- "yoctocolors-cjs": "^2.1.3"
339
+ "@inquirer/ansi": "^2.0.8",
340
+ "@inquirer/core": "^12.0.3",
341
+ "@inquirer/figures": "^2.0.9",
342
+ "@inquirer/type": "4.1.1"
350
343
  },
351
344
  "engines": {
352
- "node": ">=18"
345
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
353
346
  },
354
347
  "peerDependencies": {
355
348
  "@types/node": ">=18"
@@ -361,12 +354,12 @@
361
354
  }
362
355
  },
363
356
  "node_modules/@inquirer/type": {
364
- "version": "3.0.10",
365
- "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz",
366
- "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==",
357
+ "version": "4.1.1",
358
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.1.1.tgz",
359
+ "integrity": "sha512-yJoHYrMnxIsJZCY+0Vb66Dy3he3kL3e2wOBKhoSwWWAzZAY82emlxwgprCtp6yRixvNRNq9ztfRWQYPNr3Go7A==",
367
360
  "license": "MIT",
368
361
  "engines": {
369
- "node": ">=18"
362
+ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0"
370
363
  },
371
364
  "peerDependencies": {
372
365
  "@types/node": ">=18"
@@ -412,25 +405,10 @@
412
405
  "node": ">= 8"
413
406
  }
414
407
  },
415
- "node_modules/@posthog/core": {
416
- "version": "1.43.1",
417
- "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.43.1.tgz",
418
- "integrity": "sha512-hGM8f5sp3we6Em/RQHXbmyYm554hUx9+9jhf92ZQgDS4/xW72KHyZiO9wcFye+qAx2cJAOhOCDIznmO1FV8IbA==",
419
- "license": "MIT",
420
- "dependencies": {
421
- "@posthog/types": "^1.396.0"
422
- }
423
- },
424
- "node_modules/@posthog/types": {
425
- "version": "1.397.0",
426
- "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.397.0.tgz",
427
- "integrity": "sha512-Pa7FtsBo3V0XrhY4y8Xquwp8U07syuZ2IGQdlsRyxhz0yejQLceFjI58UssCXE5zDCDj3km5l7H3ufD6rHChCg==",
428
- "license": "MIT"
429
- },
430
408
  "node_modules/ansi-regex": {
431
- "version": "6.2.2",
432
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
433
- "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
409
+ "version": "6.4.0",
410
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz",
411
+ "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==",
434
412
  "license": "MIT",
435
413
  "engines": {
436
414
  "node": ">=12"
@@ -439,21 +417,6 @@
439
417
  "url": "https://github.com/chalk/ansi-regex?sponsor=1"
440
418
  }
441
419
  },
442
- "node_modules/ansi-styles": {
443
- "version": "4.3.0",
444
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
445
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
446
- "license": "MIT",
447
- "dependencies": {
448
- "color-convert": "^2.0.1"
449
- },
450
- "engines": {
451
- "node": ">=8"
452
- },
453
- "funding": {
454
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
455
- }
456
- },
457
420
  "node_modules/braces": {
458
421
  "version": "3.0.3",
459
422
  "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
@@ -500,12 +463,12 @@
500
463
  }
501
464
  },
502
465
  "node_modules/cli-spinners": {
503
- "version": "2.9.2",
504
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
505
- "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
466
+ "version": "3.4.0",
467
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz",
468
+ "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==",
506
469
  "license": "MIT",
507
470
  "engines": {
508
- "node": ">=6"
471
+ "node": ">=18.20"
509
472
  },
510
473
  "funding": {
511
474
  "url": "https://github.com/sponsors/sindresorhus"
@@ -520,24 +483,6 @@
520
483
  "node": ">= 12"
521
484
  }
522
485
  },
523
- "node_modules/color-convert": {
524
- "version": "2.0.1",
525
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
526
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
527
- "license": "MIT",
528
- "dependencies": {
529
- "color-name": "~1.1.4"
530
- },
531
- "engines": {
532
- "node": ">=7.0.0"
533
- }
534
- },
535
- "node_modules/color-name": {
536
- "version": "1.1.4",
537
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
538
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
539
- "license": "MIT"
540
- },
541
486
  "node_modules/commander": {
542
487
  "version": "14.0.3",
543
488
  "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz",
@@ -561,11 +506,14 @@
561
506
  "node": ">= 8"
562
507
  }
563
508
  },
564
- "node_modules/emoji-regex": {
565
- "version": "10.6.0",
566
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
567
- "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
568
- "license": "MIT"
509
+ "node_modules/diff": {
510
+ "version": "9.0.0",
511
+ "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz",
512
+ "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==",
513
+ "license": "BSD-3-Clause",
514
+ "engines": {
515
+ "node": ">=0.3.1"
516
+ }
569
517
  },
570
518
  "node_modules/fast-glob": {
571
519
  "version": "3.3.3",
@@ -583,6 +531,30 @@
583
531
  "node": ">=8.6.0"
584
532
  }
585
533
  },
534
+ "node_modules/fast-string-truncated-width": {
535
+ "version": "3.0.3",
536
+ "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz",
537
+ "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==",
538
+ "license": "MIT"
539
+ },
540
+ "node_modules/fast-string-width": {
541
+ "version": "3.0.2",
542
+ "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz",
543
+ "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==",
544
+ "license": "MIT",
545
+ "dependencies": {
546
+ "fast-string-truncated-width": "^3.0.2"
547
+ }
548
+ },
549
+ "node_modules/fast-wrap-ansi": {
550
+ "version": "0.2.2",
551
+ "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz",
552
+ "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==",
553
+ "license": "MIT",
554
+ "dependencies": {
555
+ "fast-string-width": "^3.0.2"
556
+ }
557
+ },
586
558
  "node_modules/fastq": {
587
559
  "version": "1.20.1",
588
560
  "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
@@ -605,9 +577,9 @@
605
577
  }
606
578
  },
607
579
  "node_modules/get-east-asian-width": {
608
- "version": "1.6.0",
609
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz",
610
- "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==",
580
+ "version": "1.7.0",
581
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz",
582
+ "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==",
611
583
  "license": "MIT",
612
584
  "engines": {
613
585
  "node": ">=18"
@@ -653,15 +625,6 @@
653
625
  "node": ">=0.10.0"
654
626
  }
655
627
  },
656
- "node_modules/is-fullwidth-code-point": {
657
- "version": "3.0.0",
658
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
659
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
660
- "license": "MIT",
661
- "engines": {
662
- "node": ">=8"
663
- }
664
- },
665
628
  "node_modules/is-glob": {
666
629
  "version": "4.0.3",
667
630
  "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -714,13 +677,13 @@
714
677
  "license": "ISC"
715
678
  },
716
679
  "node_modules/log-symbols": {
717
- "version": "6.0.0",
718
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
719
- "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
680
+ "version": "7.0.1",
681
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz",
682
+ "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==",
720
683
  "license": "MIT",
721
684
  "dependencies": {
722
- "chalk": "^5.3.0",
723
- "is-unicode-supported": "^1.3.0"
685
+ "is-unicode-supported": "^2.0.0",
686
+ "yoctocolors": "^2.1.1"
724
687
  },
725
688
  "engines": {
726
689
  "node": ">=18"
@@ -729,18 +692,6 @@
729
692
  "url": "https://github.com/sponsors/sindresorhus"
730
693
  }
731
694
  },
732
- "node_modules/log-symbols/node_modules/is-unicode-supported": {
733
- "version": "1.3.0",
734
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
735
- "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
736
- "license": "MIT",
737
- "engines": {
738
- "node": ">=12"
739
- },
740
- "funding": {
741
- "url": "https://github.com/sponsors/sindresorhus"
742
- }
743
- },
744
695
  "node_modules/merge2": {
745
696
  "version": "1.4.1",
746
697
  "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -776,12 +727,12 @@
776
727
  }
777
728
  },
778
729
  "node_modules/mute-stream": {
779
- "version": "2.0.0",
780
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
781
- "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
730
+ "version": "3.0.0",
731
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz",
732
+ "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==",
782
733
  "license": "ISC",
783
734
  "engines": {
784
- "node": "^18.17.0 || >=20.5.0"
735
+ "node": "^20.17.0 || >=22.9.0"
785
736
  }
786
737
  },
787
738
  "node_modules/onetime": {
@@ -800,23 +751,22 @@
800
751
  }
801
752
  },
802
753
  "node_modules/ora": {
803
- "version": "8.2.0",
804
- "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz",
805
- "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==",
754
+ "version": "9.4.1",
755
+ "resolved": "https://registry.npmjs.org/ora/-/ora-9.4.1.tgz",
756
+ "integrity": "sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==",
806
757
  "license": "MIT",
807
758
  "dependencies": {
808
- "chalk": "^5.3.0",
759
+ "chalk": "^5.6.2",
809
760
  "cli-cursor": "^5.0.0",
810
- "cli-spinners": "^2.9.2",
761
+ "cli-spinners": "^3.2.0",
811
762
  "is-interactive": "^2.0.0",
812
- "is-unicode-supported": "^2.0.0",
813
- "log-symbols": "^6.0.0",
814
- "stdin-discarder": "^0.2.2",
815
- "string-width": "^7.2.0",
816
- "strip-ansi": "^7.1.0"
763
+ "is-unicode-supported": "^2.1.0",
764
+ "log-symbols": "^7.0.1",
765
+ "stdin-discarder": "^0.3.2",
766
+ "string-width": "^8.1.0"
817
767
  },
818
768
  "engines": {
819
- "node": ">=18"
769
+ "node": ">=20"
820
770
  },
821
771
  "funding": {
822
772
  "url": "https://github.com/sponsors/sindresorhus"
@@ -843,26 +793,6 @@
843
793
  "url": "https://github.com/sponsors/jonschlinkert"
844
794
  }
845
795
  },
846
- "node_modules/posthog-node": {
847
- "version": "5.45.2",
848
- "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.45.2.tgz",
849
- "integrity": "sha512-QhHw/xL0ntMG/DzqA/qdiKu8JY8ChK5Obm8m1nMJor5sjJ7+pfVJSx1yAynC7iUAJfJ9V+OhBNhDCyi5IFWC0Q==",
850
- "license": "MIT",
851
- "dependencies": {
852
- "@posthog/core": "^1.43.1"
853
- },
854
- "engines": {
855
- "node": "^20.20.0 || >=22.22.0"
856
- },
857
- "peerDependencies": {
858
- "rxjs": "^7.0.0"
859
- },
860
- "peerDependenciesMeta": {
861
- "rxjs": {
862
- "optional": true
863
- }
864
- }
865
- },
866
796
  "node_modules/queue-microtask": {
867
797
  "version": "1.2.3",
868
798
  "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -972,9 +902,9 @@
972
902
  }
973
903
  },
974
904
  "node_modules/stdin-discarder": {
975
- "version": "0.2.2",
976
- "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
977
- "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==",
905
+ "version": "0.3.2",
906
+ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz",
907
+ "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==",
978
908
  "license": "MIT",
979
909
  "engines": {
980
910
  "node": ">=18"
@@ -984,17 +914,16 @@
984
914
  }
985
915
  },
986
916
  "node_modules/string-width": {
987
- "version": "7.2.0",
988
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
989
- "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
917
+ "version": "8.3.0",
918
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz",
919
+ "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==",
990
920
  "license": "MIT",
991
921
  "dependencies": {
992
- "emoji-regex": "^10.3.0",
993
- "get-east-asian-width": "^1.0.0",
994
- "strip-ansi": "^7.1.0"
922
+ "get-east-asian-width": "^1.5.0",
923
+ "strip-ansi": "^7.1.2"
995
924
  },
996
925
  "engines": {
997
- "node": ">=18"
926
+ "node": ">=20"
998
927
  },
999
928
  "funding": {
1000
929
  "url": "https://github.com/sponsors/sindresorhus"
@@ -1042,61 +971,6 @@
1042
971
  "node": ">= 8"
1043
972
  }
1044
973
  },
1045
- "node_modules/wrap-ansi": {
1046
- "version": "6.2.0",
1047
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
1048
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
1049
- "license": "MIT",
1050
- "dependencies": {
1051
- "ansi-styles": "^4.0.0",
1052
- "string-width": "^4.1.0",
1053
- "strip-ansi": "^6.0.0"
1054
- },
1055
- "engines": {
1056
- "node": ">=8"
1057
- }
1058
- },
1059
- "node_modules/wrap-ansi/node_modules/ansi-regex": {
1060
- "version": "5.0.1",
1061
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
1062
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
1063
- "license": "MIT",
1064
- "engines": {
1065
- "node": ">=8"
1066
- }
1067
- },
1068
- "node_modules/wrap-ansi/node_modules/emoji-regex": {
1069
- "version": "8.0.0",
1070
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
1071
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
1072
- "license": "MIT"
1073
- },
1074
- "node_modules/wrap-ansi/node_modules/string-width": {
1075
- "version": "4.2.3",
1076
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1077
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1078
- "license": "MIT",
1079
- "dependencies": {
1080
- "emoji-regex": "^8.0.0",
1081
- "is-fullwidth-code-point": "^3.0.0",
1082
- "strip-ansi": "^6.0.1"
1083
- },
1084
- "engines": {
1085
- "node": ">=8"
1086
- }
1087
- },
1088
- "node_modules/wrap-ansi/node_modules/strip-ansi": {
1089
- "version": "6.0.1",
1090
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1091
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1092
- "license": "MIT",
1093
- "dependencies": {
1094
- "ansi-regex": "^5.0.1"
1095
- },
1096
- "engines": {
1097
- "node": ">=8"
1098
- }
1099
- },
1100
974
  "node_modules/yaml": {
1101
975
  "version": "2.9.0",
1102
976
  "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
@@ -1112,10 +986,10 @@
1112
986
  "url": "https://github.com/sponsors/eemeli"
1113
987
  }
1114
988
  },
1115
- "node_modules/yoctocolors-cjs": {
1116
- "version": "2.1.3",
1117
- "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
1118
- "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
989
+ "node_modules/yoctocolors": {
990
+ "version": "2.2.0",
991
+ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz",
992
+ "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==",
1119
993
  "license": "MIT",
1120
994
  "engines": {
1121
995
  "node": ">=18"
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@christang/keel",
3
3
  "displayName": "Keel",
4
4
  "description": "Keel OpenSpec execution discipline CLI for Claude Code, Codex, and OpenCode.",
5
- "version": "5.77.0",
5
+ "version": "5.78.0",
6
6
  "license": "MIT",
7
7
  "repository": {
8
8
  "type": "git",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keel",
3
- "version": "5.77.0",
3
+ "version": "5.78.0",
4
4
  "description": "Keel OpenSpec execution discipline: stateless continuity, task capsules, deterministic gates, and expectation alignment for Codex and Claude Code.",
5
5
  "author": {
6
6
  "name": "TanglmChris",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keel",
3
- "version": "5.77.0",
3
+ "version": "5.78.0",
4
4
  "description": "Keel OpenSpec execution discipline: stateless continuity, task capsules, deterministic gates, and expectation alignment for Codex and Claude Code.",
5
5
  "author": {
6
6
  "name": "TanglmChris",
@@ -38,8 +38,8 @@ REQUIRED_SCRIPTS = [
38
38
  "scripts/validate_plugin.py",
39
39
  ]
40
40
 
41
- PACKAGE_VERSION = "5.77.0"
42
- PROTOCOL_VERSION = "5.77.0"
41
+ PACKAGE_VERSION = "5.78.0"
42
+ PROTOCOL_VERSION = "5.78.0"
43
43
  LEGACY_MANAGED_START = "<!-- keel:start version=2.1 -->"
44
44
  OPENSPEC_SCHEMA_NAME = "keel-spec-driven"
45
45
  # Mirrors KEEL_PACKAGE_NAME in scripts/install_to_repo.py, one of the two
@@ -1242,13 +1242,12 @@ def validate_target_surface_scenario() -> int:
1242
1242
  report((codex_init.stderr or codex_init.stdout).strip())
1243
1243
  return 1
1244
1244
  codex_doctor = run_keel(codex_repo, "--doctor", "--target", "codex", env=env)
1245
- codex_prompt_dir = str(codex_home / "prompts")
1246
1245
  if (
1247
1246
  codex_doctor.returncode != 0
1248
1247
  or "OpenSpec commands: ok" not in codex_doctor.stdout
1249
- or posix_paths(codex_prompt_dir) not in posix_paths(codex_doctor.stdout)
1248
+ or "OpenSpec 1.13 surfaces Codex's workflows" not in codex_doctor.stdout
1250
1249
  or "OpenSpec action skills: ok" not in codex_doctor.stdout
1251
- or ".codex/skills" not in posix_paths(codex_doctor.stdout)
1250
+ or ".agents/skills" not in posix_paths(codex_doctor.stdout)
1252
1251
  or "bootstrap: ok" not in codex_doctor.stdout
1253
1252
  or "native plugin runtime: manual" not in codex_doctor.stdout
1254
1253
  or "Target capabilities (codex):" not in codex_doctor.stdout
@@ -1265,16 +1264,15 @@ def validate_target_surface_scenario() -> int:
1265
1264
  report("target-surface scenario Codex init created Claude-only paths.")
1266
1265
  return 1
1267
1266
 
1268
- for prompt in (codex_home / "prompts").glob("opsx-*.md"):
1269
- prompt.unlink()
1267
+ # OpenSpec 1.13 writes Codex's workflows as skills only (#169), so the
1268
+ # surface that can go missing is a skill.
1269
+ shutil.rmtree(codex_repo / ".agents/skills/openspec-propose")
1270
1270
  codex_missing = run_keel(codex_repo, "--doctor", "--target", "codex", env=env)
1271
1271
  if (
1272
1272
  codex_missing.returncode != 0
1273
- or "OpenSpec commands: missing" not in codex_missing.stdout
1274
- or "keel --init --target codex" not in codex_missing.stdout
1275
- or "openspec update --force" not in codex_missing.stdout
1273
+ or "OpenSpec action skills: missing" not in codex_missing.stdout
1276
1274
  ):
1277
- report("target-surface scenario Codex doctor did not report missing prompts.")
1275
+ report("target-surface scenario Codex doctor did not report a missing skill.")
1278
1276
  report((codex_missing.stderr or codex_missing.stdout).strip())
1279
1277
  return 1
1280
1278
 
@@ -2649,15 +2647,11 @@ def openspec_overlay_files(
2649
2647
  }
2650
2648
  if target == "codex":
2651
2649
  assert codex_home is not None
2650
+ # OpenSpec 1.13, which Keel pins, writes Codex's workflows as skills
2651
+ # under `.agents/skills` and no command files (#169).
2652
2652
  return {
2653
- "apply": [
2654
- repo / ".codex/skills/openspec-apply-change/SKILL.md",
2655
- codex_home / "prompts/opsx-apply.md",
2656
- ],
2657
- "archive": [
2658
- repo / ".codex/skills/openspec-archive-change/SKILL.md",
2659
- codex_home / "prompts/opsx-archive.md",
2660
- ],
2653
+ "apply": [repo / ".agents/skills/openspec-apply-change/SKILL.md"],
2654
+ "archive": [repo / ".agents/skills/openspec-archive-change/SKILL.md"],
2661
2655
  }
2662
2656
  return {
2663
2657
  "apply": [
@@ -2777,8 +2771,7 @@ def expected_overlay_surfaces(
2777
2771
  surfaces.append(repo / f".claude/commands/opsx/{action}.md")
2778
2772
  elif target == "codex":
2779
2773
  assert codex_home is not None
2780
- surfaces.append(repo / f".codex/skills/{skill}/SKILL.md")
2781
- surfaces.append(codex_home / f"prompts/opsx-{action}.md")
2774
+ surfaces.append(repo / f".agents/skills/{skill}/SKILL.md")
2782
2775
  else:
2783
2776
  surfaces.append(repo / f".opencode/skills/{skill}/SKILL.md")
2784
2777
  surfaces.append(repo / f".opencode/commands/opsx-{action}.md")
@@ -3022,7 +3015,7 @@ def validate_sync_surface_overlay_scenario() -> int:
3022
3015
  ".claude/skills/openspec-sync-specs/SKILL.md",
3023
3016
  ],
3024
3017
  "codex": [
3025
- ".codex/skills/openspec-sync-specs/SKILL.md",
3018
+ ".agents/skills/openspec-sync-specs/SKILL.md",
3026
3019
  ],
3027
3020
  }
3028
3021
 
@@ -3236,13 +3229,12 @@ def validate_openspec_surface_overlay_scenario() -> int:
3236
3229
  if (
3237
3230
  codex_doctor.returncode != 0
3238
3231
  or "Keel apply/archive/sync overlay: ok" not in codex_doctor.stdout
3239
- or str(codex_home / "prompts") not in codex_doctor.stdout
3240
3232
  ):
3241
3233
  report("openspec-surface-overlay scenario Codex doctor missed overlay health.")
3242
3234
  report((codex_doctor.stderr or codex_doctor.stdout).strip())
3243
3235
  return 1
3244
3236
 
3245
- codex_apply_prompt = codex_home / "prompts/opsx-apply.md"
3237
+ codex_apply_prompt = codex_repo / ".agents/skills/openspec-apply-change/SKILL.md"
3246
3238
  original_prompt = codex_apply_prompt.read_text(encoding="utf-8")
3247
3239
  outdated_prompt = re.sub(
3248
3240
  r"<!--\s*keel:openspec-surface-overlay(?:\s+[^>]*)?\s*-->"
@@ -3269,6 +3261,33 @@ def validate_openspec_surface_overlay_scenario() -> int:
3269
3261
  report("openspec-surface-overlay scenario Codex install did not refresh overlay idempotently.")
3270
3262
  return 1
3271
3263
 
3264
+ # M6 — a repository set up under OpenSpec 1.6 keeps its layout: skills
3265
+ # under `.codex/skills` and commands as CODEX_HOME prompts (#169).
3266
+ legacy_repo = tmp / "codex-legacy"
3267
+ legacy_home = tmp / "codex-legacy-home"
3268
+ legacy_env = os.environ.copy()
3269
+ legacy_env["CODEX_HOME"] = str(legacy_home)
3270
+ legacy_surfaces = []
3271
+ for action, skill in OVERLAY_ACTION_SKILLS.items():
3272
+ for surface in (
3273
+ legacy_repo / f".codex/skills/{skill}/SKILL.md",
3274
+ legacy_home / f"prompts/opsx-{action}.md",
3275
+ ):
3276
+ write_text(surface, f"---\nname: {skill}\n---\n\n# {action}\n")
3277
+ legacy_surfaces.append(surface)
3278
+ run_keel(legacy_repo, "--install", "--target", "codex", env=legacy_env)
3279
+ lost = [
3280
+ str(surface)
3281
+ for surface in legacy_surfaces
3282
+ if surface.read_text(encoding="utf-8").count(OPENSPEC_SURFACE_OVERLAY_START) != 1
3283
+ ]
3284
+ if lost:
3285
+ report(
3286
+ "openspec-surface-overlay scenario 1.6-layout Codex surfaces lost "
3287
+ f"their overlay: {lost!r}"
3288
+ )
3289
+ return 1
3290
+
3272
3291
  opencode_repo = tmp / "opencode"
3273
3292
  opencode_repo.mkdir()
3274
3293
  opencode_init = run_keel(opencode_repo, "--init", "--target", "opencode")
@@ -16617,8 +16636,7 @@ def validate_authoring_alignment_overlay_scenario() -> int:
16617
16636
  report((codex_init.stderr or codex_init.stdout).strip())
16618
16637
  return 1
16619
16638
  codex_surfaces = (
16620
- codex_repo / ".codex/skills/openspec-propose/SKILL.md",
16621
- codex_home / "prompts/opsx-propose.md",
16639
+ codex_repo / ".agents/skills/openspec-propose/SKILL.md",
16622
16640
  )
16623
16641
  for surface in codex_surfaces:
16624
16642
  content = surface.read_text(encoding="utf-8")
@@ -16648,7 +16666,7 @@ def validate_authoring_alignment_overlay_scenario() -> int:
16648
16666
  return 1
16649
16667
 
16650
16668
  apply_skill = (
16651
- codex_repo / ".codex/skills/openspec-apply-change/SKILL.md"
16669
+ codex_repo / ".agents/skills/openspec-apply-change/SKILL.md"
16652
16670
  ).read_text(encoding="utf-8")
16653
16671
  if (
16654
16672
  "rerun `keel-align-expectations`" not in apply_skill
@@ -741,9 +741,10 @@ function stampedProtocol(repo) {
741
741
 
742
742
  // The target the installer left behind. `CLAUDE.md` carries the managed
743
743
  // import only on the Claude target, and only OpenCode writes project commands
744
- // under `.opencode/`. A Codex install writes neither — its OpenSpec commands
745
- // are global prompts under CODEX_HOME — so a managed `AGENTS.md` with neither
746
- // surface beside it is what a Codex install leaves.
744
+ // under `.opencode/`. A Codex install writes neither: OpenSpec 1.13 puts its
745
+ // skills under `.agents/skills`, and 1.6 put its commands in CODEX_HOME, so a
746
+ // managed `AGENTS.md` with neither surface beside it is what a Codex install
747
+ // leaves.
747
748
  function installedTarget(repo) {
748
749
  try {
749
750
  if (/<!--\s*keel:start/.test(fs.readFileSync(path.join(repo, "CLAUDE.md"), "utf8"))) {