@aipper/aiws 0.0.11 → 0.0.12

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/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@aipper/aiws",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "AI Workspace CLI (init/update/validate) for Claude Code / OpenCode / Codex / iFlow.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "aiws": "./bin/aiws.js"
8
8
  },
9
9
  "dependencies": {
10
- "@aipper/aiws-spec": "0.0.11"
10
+ "@aipper/aiws-spec": "0.0.12"
11
11
  },
12
12
  "files": [
13
13
  "bin",
@@ -1,3 +1,4 @@
1
+ import fs from "node:fs/promises";
1
2
  import path from "node:path";
2
3
  import { loadTemplate } from "../spec.js";
3
4
  import { UserError } from "../errors.js";
@@ -16,6 +17,11 @@ export async function codexInstallSkillsCommand(options) {
16
17
  const skillsDir = resolveCodexSkillsDir(options.skillsDir);
17
18
  const dryRun = options.dryRun === true;
18
19
  if (!dryRun) await ensureDir(skillsDir);
20
+ const skillsDirIsSymlink = await fs
21
+ .lstat(skillsDir)
22
+ .then((st) => st.isSymbolicLink())
23
+ .catch(() => false);
24
+ const skillsDirReal = skillsDirIsSymlink ? await fs.realpath(skillsDir).catch(() => skillsDir) : skillsDir;
19
25
 
20
26
  const skillFiles = await listTemplateCodexSkills(tpl);
21
27
 
@@ -60,9 +66,9 @@ export async function codexInstallSkillsCommand(options) {
60
66
  }
61
67
  }
62
68
 
63
- console.log(`${dryRun ? "✓ (dry-run)" : "✓"} aiws codex install-skills: ${skillsDir}`);
69
+ const header = skillsDirIsSymlink && skillsDirReal !== skillsDir ? `${skillsDir} -> ${skillsDirReal}` : skillsDir;
70
+ console.log(`${dryRun ? "✓ (dry-run)" : "✓"} aiws codex install-skills: ${header}`);
64
71
  if (created.length > 0) console.log(`created: ${created.join(", ")}`);
65
72
  if (updated.length > 0) console.log(`updated: ${updated.join(", ")}`);
66
73
  if (overwritten.length > 0) console.log(`overwritten: ${overwritten.join(", ")}`);
67
74
  }
68
-
@@ -1,3 +1,4 @@
1
+ import fs from "node:fs/promises";
1
2
  import path from "node:path";
2
3
  import { loadTemplate } from "../spec.js";
3
4
  import { normalizeNewlines } from "../hash.js";
@@ -13,6 +14,11 @@ export async function codexStatusSkillsCommand(options) {
13
14
  const tpl = await loadTemplate(templateId);
14
15
 
15
16
  const skillsDir = resolveCodexSkillsDir(options.skillsDir);
17
+ const skillsDirIsSymlink = await fs
18
+ .lstat(skillsDir)
19
+ .then((st) => st.isSymbolicLink())
20
+ .catch(() => false);
21
+ const skillsDirReal = skillsDirIsSymlink ? await fs.realpath(skillsDir).catch(() => skillsDir) : skillsDir;
16
22
  const skillFiles = await listTemplateCodexSkills(tpl);
17
23
 
18
24
  /** @type {Array<{ name: string, status: "ok" | "missing" | "unmanaged" | "outdated" }>} */
@@ -42,13 +48,16 @@ export async function codexStatusSkillsCommand(options) {
42
48
  /** @type {{ ok: number, missing: number, unmanaged: number, outdated: number }} */ ({ ok: 0, missing: 0, unmanaged: 0, outdated: 0 }),
43
49
  );
44
50
 
45
- console.log(`✓ aiws codex status-skills: ${skillsDir}`);
51
+ const header = skillsDirIsSymlink && skillsDirReal !== skillsDir ? `${skillsDir} -> ${skillsDirReal}` : skillsDir;
52
+ console.log(`✓ aiws codex status-skills: ${header}`);
46
53
  console.log(`ok=${counts.ok} missing=${counts.missing} unmanaged=${counts.unmanaged} outdated=${counts.outdated}`);
47
54
  for (const r of rows) {
48
55
  console.log(`${r.status}\t${r.name}`);
49
56
  }
57
+ if (counts.ok === 0 && counts.missing === rows.length && skillsDirIsSymlink) {
58
+ console.log("Note: skills dir is a symlink; if you installed to a different dir, pass --dir (or set CODEX_HOME).");
59
+ }
50
60
  if (counts.missing > 0 || counts.outdated > 0) {
51
61
  console.log("Next: aiws codex install-skills");
52
62
  }
53
63
  }
54
-