joist-codegen 2.3.0-next.16 → 2.3.0-next.17

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,8 +1,12 @@
1
1
  /**
2
2
  * Copies Joist's bundled Agent Skills into the project so coding agents can
3
- * discover them.
3
+ * discover them, then prunes any previously-installed Joist skills that no
4
+ * longer ship with this version.
4
5
  *
5
6
  * The skills are framework-owned and rewritten on every codegen run, so users
6
7
  * should not hand-edit them (re-run codegen to pick up new Joist versions).
8
+ *
9
+ * Logs only what actually changed: the added and removed skill names, staying
10
+ * quiet when nothing changed.
7
11
  */
8
12
  export declare function installSkills(rootDir?: string): Promise<void>;
@@ -12,26 +12,58 @@ const bundledSkillsDir = (0, path_1.resolve)(__dirname, "../skills");
12
12
  * by Codex (and opencode), so writing both gives native coverage across all three.
13
13
  */
14
14
  const skillTargets = [".claude/skills", ".agents/skills"];
15
+ /** Joist owns the `joist-` skill namespace, so stale ones there are ours to prune. */
16
+ const skillPrefix = "joist-";
15
17
  /**
16
18
  * Copies Joist's bundled Agent Skills into the project so coding agents can
17
- * discover them.
19
+ * discover them, then prunes any previously-installed Joist skills that no
20
+ * longer ship with this version.
18
21
  *
19
22
  * The skills are framework-owned and rewritten on every codegen run, so users
20
23
  * should not hand-edit them (re-run codegen to pick up new Joist versions).
24
+ *
25
+ * Logs only what actually changed: the added and removed skill names, staying
26
+ * quiet when nothing changed.
21
27
  */
22
28
  async function installSkills(rootDir = ".") {
23
- let skillNames;
29
+ const bundled = await readSkillNames(bundledSkillsDir);
30
+ if (bundled.length === 0)
31
+ return;
32
+ const bundledSet = new Set(bundled);
33
+ // Snapshot what each target already has before we copy/remove, so we can diff.
34
+ const existingPerTarget = await Promise.all(skillTargets.map((target) => readSkillNames((0, path_1.join)(rootDir, target))));
35
+ // Always `cp` the bundled skills into each target, overwriting any existing ones
36
+ await Promise.all(skillTargets.flatMap((target) => bundled.map((name) => fs_1.promises.cp((0, path_1.join)(bundledSkillsDir, name), (0, path_1.join)(rootDir, target, name), { recursive: true, force: true }))));
37
+ // Prune stale Joist skills (previously installed here, but no longer bundled).
38
+ const removed = new Set();
39
+ await Promise.all(skillTargets.map(async (target, i) => {
40
+ const stale = existingPerTarget[i].filter((name) => name.startsWith(skillPrefix) && !bundledSet.has(name));
41
+ await Promise.all(stale.map(async (name) => {
42
+ removed.add(name);
43
+ await fs_1.promises.rm((0, path_1.join)(rootDir, target, name), { recursive: true, force: true });
44
+ }));
45
+ }));
46
+ // A skill is "new" if it was missing from at least one target before this run.
47
+ const added = bundled.filter((name) => existingPerTarget.some((names) => !names.includes(name)));
48
+ if (added.length > 0) {
49
+ console.log(`Added ${added.length} Joist skill(s) to ${skillTargets.join(" and ")}:`);
50
+ for (const name of added)
51
+ console.log(` + ${name}`);
52
+ }
53
+ if (removed.size > 0) {
54
+ console.log(`Removed ${removed.size} stale Joist skill(s) from ${skillTargets.join(" and ")}:`);
55
+ for (const name of removed)
56
+ console.log(` - ${name}`);
57
+ }
58
+ }
59
+ /** Lists the skill directory names in a dir, or `[]` if it's missing. I.e. ["joist-upsert", ...]. */
60
+ async function readSkillNames(dir) {
24
61
  try {
25
- const entries = await fs_1.promises.readdir(bundledSkillsDir, { withFileTypes: true });
26
- skillNames = entries.filter((e) => e.isDirectory()).map((e) => e.name);
62
+ const entries = await fs_1.promises.readdir(dir, { withFileTypes: true });
63
+ return entries.filter((e) => e.isDirectory()).map((e) => e.name);
27
64
  }
28
65
  catch {
29
- // The bundled skills are missing (e.g. running against an unbuilt package); nothing to do.
30
- return;
66
+ return [];
31
67
  }
32
- if (skillNames.length === 0)
33
- return;
34
- await Promise.all(skillTargets.flatMap((target) => skillNames.map((name) => fs_1.promises.cp((0, path_1.join)(bundledSkillsDir, name), (0, path_1.join)(rootDir, target, name), { recursive: true, force: true }))));
35
- console.log(`Installed ${skillNames.length} Joist skill(s) into ${skillTargets.join(" and ")}`);
36
68
  }
37
69
  //# sourceMappingURL=installSkills.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"installSkills.js","sourceRoot":"","sources":["../src/installSkills.ts"],"names":[],"mappings":";;AAqBA,sCAoBC;AAzCD,2BAAoC;AACpC,+BAAqC;AAErC,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,IAAA,cAAO,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,YAAY,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;AAE1D;;;;;;GAMG;AACI,KAAK,UAAU,aAAa,CAAC,UAAkB,GAAG;IACvD,IAAI,UAAoB,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,2FAA2F;QAC3F,OAAO;IACT,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEpC,MAAM,OAAO,CAAC,GAAG,CACf,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAC9B,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACtB,aAAE,CAAC,EAAE,CAAC,IAAA,WAAI,EAAC,gBAAgB,EAAE,IAAI,CAAC,EAAE,IAAA,WAAI,EAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACnG,CACF,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,MAAM,wBAAwB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAClG,CAAC"}
1
+ {"version":3,"file":"installSkills.js","sourceRoot":"","sources":["../src/installSkills.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "joist-codegen",
3
- "version": "2.3.0-next.16",
3
+ "version": "2.3.0-next.17",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -18,7 +18,7 @@
18
18
  "skills"
19
19
  ],
20
20
  "peerDependencies": {
21
- "joist-utils": "2.3.0-next.16",
21
+ "joist-utils": "2.3.0-next.17",
22
22
  "knex": "^3.1.0",
23
23
  "pg": "^8.22.0"
24
24
  },