@pleri/olam-cli 0.1.36 → 0.1.37

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=symlink-reconcile.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symlink-reconcile.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/symlink-reconcile.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { reconcileSkillSymlinks } from '../symlink-reconcile.js';
3
+ function makeFakeFs(opts) {
4
+ const npmSkills = opts.npmSkills ?? [];
5
+ const claudeSkills = opts.claudeSkills ?? [];
6
+ const danglingSymlinks = new Set(opts.danglingSymlinks ?? []);
7
+ const nonOlamSymlinks = new Set(opts.nonOlamSymlinks ?? []);
8
+ const nonPackageSymlinks = new Set(opts.nonPackageSymlinks ?? []);
9
+ const symlinks = new Map();
10
+ const unlinked = [];
11
+ const allClaude = [
12
+ ...claudeSkills,
13
+ ...(opts.danglingSymlinks ?? []),
14
+ ...(opts.nonOlamSymlinks ?? []),
15
+ ...(opts.nonPackageSymlinks ?? []),
16
+ ];
17
+ return {
18
+ symlinks,
19
+ unlinked,
20
+ readdirSync: (p) => {
21
+ if (p === '/npm/skills')
22
+ return npmSkills;
23
+ return allClaude;
24
+ },
25
+ existsSync: (p) => {
26
+ // base dirs always exist
27
+ if (p === '/npm/skills' || p === '/claude/skills')
28
+ return true;
29
+ const name = p.split('/').pop();
30
+ // dangling symlink target → does NOT exist
31
+ if (danglingSymlinks.has(name))
32
+ return false;
33
+ // npm skill dir entries exist (for symlink target resolution)
34
+ if (p.startsWith('/npm/skills/') && npmSkills.includes(name))
35
+ return true;
36
+ // claude skill entries: only those declared in claudeSkills exist
37
+ if (p.startsWith('/claude/skills/') && claudeSkills.includes(name))
38
+ return true;
39
+ // readlink targets pointing into a fake npm path: exist iff name is in npmSkills
40
+ if (p.includes('@pleri/olam-cli/plugin/skills/') && npmSkills.includes(name))
41
+ return true;
42
+ return false;
43
+ },
44
+ lstatSync: (p) => {
45
+ const name = p.split('/').pop();
46
+ const isSymlink = danglingSymlinks.has(name) ||
47
+ nonPackageSymlinks.has(name) ||
48
+ claudeSkills.some((s) => s === name);
49
+ return { isSymbolicLink: () => isSymlink };
50
+ },
51
+ readlinkSync: (p) => {
52
+ const name = p.split('/').pop();
53
+ if (nonPackageSymlinks.has(name))
54
+ return `/some/other/path/${name}`;
55
+ return `/usr/local/lib/node_modules/@pleri/olam-cli/plugin/skills/${name}`;
56
+ },
57
+ symlinkSync: (target, linkPath) => {
58
+ symlinks.set(linkPath.split('/').pop(), target);
59
+ },
60
+ unlinkSync: (p) => {
61
+ unlinked.push(p.split('/').pop());
62
+ },
63
+ mkdirSync: vi.fn(),
64
+ };
65
+ }
66
+ describe('reconcileSkillSymlinks', () => {
67
+ it('adds symlink for new skill in npm source', () => {
68
+ const fakeFs = makeFakeFs({ npmSkills: ['olam-worlds'], claudeSkills: [] });
69
+ const result = reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
70
+ expect(result.added).toContain('olam-worlds');
71
+ expect(fakeFs.symlinks.has('olam-worlds')).toBe(true);
72
+ });
73
+ it('keeps existing valid symlink', () => {
74
+ const fakeFs = makeFakeFs({ npmSkills: ['olam-worlds'], claudeSkills: ['olam-worlds'] });
75
+ const result = reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
76
+ expect(result.kept).toContain('olam-worlds');
77
+ expect(fakeFs.unlinked).toHaveLength(0);
78
+ });
79
+ it('removes dangling olam-* symlink', () => {
80
+ const fakeFs = makeFakeFs({ npmSkills: [], claudeSkills: [], danglingSymlinks: ['olam-old'] });
81
+ const result = reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
82
+ expect(result.removed).toContain('olam-old');
83
+ expect(fakeFs.unlinked).toContain('olam-old');
84
+ });
85
+ it('never touches non-olam-* entries', () => {
86
+ const fakeFs = makeFakeFs({ npmSkills: [], claudeSkills: [], nonOlamSymlinks: ['diakon-skill'] });
87
+ reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
88
+ expect(fakeFs.unlinked).not.toContain('diakon-skill');
89
+ });
90
+ it('never touches olam-* symlinks not pointing into @pleri/olam-cli', () => {
91
+ const fakeFs = makeFakeFs({
92
+ npmSkills: [],
93
+ claudeSkills: [],
94
+ nonPackageSymlinks: ['olam-custom'],
95
+ });
96
+ reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
97
+ expect(fakeFs.unlinked).not.toContain('olam-custom');
98
+ });
99
+ it('handles empty npm skills dir gracefully', () => {
100
+ const fakeFs = makeFakeFs({ npmSkills: [], claudeSkills: [] });
101
+ const result = reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
102
+ expect(result.added).toHaveLength(0);
103
+ expect(result.removed).toHaveLength(0);
104
+ });
105
+ });
106
+ //# sourceMappingURL=symlink-reconcile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symlink-reconcile.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/symlink-reconcile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Scan-and-reconcile olam skill symlinks after npm install.
3
+ *
4
+ * Source of truth: $(npm root -g)/@pleri/olam-cli/plugin/skills/olam-*
5
+ * Deployed location: ~/.claude/skills/olam-*
6
+ *
7
+ * Rules (T22/OQ29):
8
+ * - For each olam-* dir in npm source not in deployed: create symlink
9
+ * - For each olam-* symlink in deployed pointing into npm package:
10
+ * if target file exists → leave alone
11
+ * if dangling → remove
12
+ * - Never touch non-olam-* entries (collision-safety per T7/T10)
13
+ */
14
+ import * as fs from 'node:fs';
15
+ export interface ReconcileResult {
16
+ readonly added: string[];
17
+ readonly removed: string[];
18
+ readonly kept: string[];
19
+ }
20
+ export type FsAdapter = {
21
+ readdirSync: (p: string) => string[];
22
+ existsSync: (p: string) => boolean;
23
+ lstatSync: (p: string) => fs.Stats;
24
+ readlinkSync: (p: string) => string;
25
+ symlinkSync: (target: string, linkPath: string) => void;
26
+ unlinkSync: (p: string) => void;
27
+ mkdirSync: (p: string, opts?: {
28
+ recursive?: boolean;
29
+ }) => void;
30
+ };
31
+ export declare function reconcileSkillSymlinks(npmSkillsDir: string, claudeSkillsDir: string, _fs?: FsAdapter): ReconcileResult;
32
+ //# sourceMappingURL=symlink-reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symlink-reconcile.d.ts","sourceRoot":"","sources":["../../src/lib/symlink-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,EAAE,CAAC,KAAK,CAAC;IACnC,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAChE,CAAC;AAYF,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,GAAG,GAAE,SAAkB,GACtB,eAAe,CAsDjB"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Scan-and-reconcile olam skill symlinks after npm install.
3
+ *
4
+ * Source of truth: $(npm root -g)/@pleri/olam-cli/plugin/skills/olam-*
5
+ * Deployed location: ~/.claude/skills/olam-*
6
+ *
7
+ * Rules (T22/OQ29):
8
+ * - For each olam-* dir in npm source not in deployed: create symlink
9
+ * - For each olam-* symlink in deployed pointing into npm package:
10
+ * if target file exists → leave alone
11
+ * if dangling → remove
12
+ * - Never touch non-olam-* entries (collision-safety per T7/T10)
13
+ */
14
+ import * as fs from 'node:fs';
15
+ import * as path from 'node:path';
16
+ const realFs = {
17
+ readdirSync: (p) => fs.readdirSync(p),
18
+ existsSync: (p) => fs.existsSync(p),
19
+ lstatSync: (p) => fs.lstatSync(p),
20
+ readlinkSync: (p) => fs.readlinkSync(p),
21
+ symlinkSync: (t, l) => fs.symlinkSync(t, l),
22
+ unlinkSync: (p) => fs.unlinkSync(p),
23
+ mkdirSync: (p, o) => { fs.mkdirSync(p, o); },
24
+ };
25
+ export function reconcileSkillSymlinks(npmSkillsDir, claudeSkillsDir, _fs = realFs) {
26
+ const added = [];
27
+ const removed = [];
28
+ const kept = [];
29
+ _fs.mkdirSync(claudeSkillsDir, { recursive: true });
30
+ const sourceSkills = _fs.existsSync(npmSkillsDir)
31
+ ? _fs.readdirSync(npmSkillsDir).filter((d) => d.startsWith('olam-'))
32
+ : [];
33
+ // Add missing symlinks (EEXIST race: another process may win between existsSync and symlinkSync)
34
+ for (const skill of sourceSkills) {
35
+ const linkPath = path.join(claudeSkillsDir, skill);
36
+ const target = path.join(npmSkillsDir, skill);
37
+ if (!_fs.existsSync(linkPath)) {
38
+ try {
39
+ _fs.symlinkSync(target, linkPath);
40
+ added.push(skill);
41
+ }
42
+ catch (e) {
43
+ if (e.code !== 'EEXIST')
44
+ throw e;
45
+ kept.push(skill); // concurrent write won the race
46
+ }
47
+ }
48
+ }
49
+ // Clean dangling symlinks (only olam-* entries)
50
+ const deployedEntries = _fs.existsSync(claudeSkillsDir)
51
+ ? _fs.readdirSync(claudeSkillsDir).filter((d) => d.startsWith('olam-'))
52
+ : [];
53
+ for (const entry of deployedEntries) {
54
+ const linkPath = path.join(claudeSkillsDir, entry);
55
+ let isSymlink = false;
56
+ try {
57
+ isSymlink = _fs.lstatSync(linkPath).isSymbolicLink();
58
+ }
59
+ catch {
60
+ continue;
61
+ }
62
+ if (!isSymlink)
63
+ continue;
64
+ const target = _fs.readlinkSync(linkPath);
65
+ // Only manage symlinks that point into an npm package root
66
+ if (!target.includes('@pleri/olam-cli')) {
67
+ kept.push(entry);
68
+ continue;
69
+ }
70
+ if (_fs.existsSync(target)) {
71
+ kept.push(entry);
72
+ }
73
+ else {
74
+ _fs.unlinkSync(linkPath);
75
+ removed.push(entry);
76
+ }
77
+ }
78
+ return { added, removed, kept };
79
+ }
80
+ //# sourceMappingURL=symlink-reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symlink-reconcile.js","sourceRoot":"","sources":["../../src/lib/symlink-reconcile.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pleri/olam-cli",
3
- "version": "0.1.36",
3
+ "version": "0.1.37",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "olam": "./dist/index.js"