@azerogluemin/ai-bootstrap 0.4.1 → 0.5.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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,101 @@ All notable changes to `@azerogluemin/ai-bootstrap` are documented here.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.0] — 2026-06-21
9
+
10
+ Big architectural + UX redesign from real-world test feedback.
11
+
12
+ ### Added — Pool + Symlink architecture
13
+
14
+ - `~/.claude/skills-pool/` — ALL skills stored ONCE on disk (~3.8 MB total)
15
+ - `~/.claude/agents-pool/` — same for agents
16
+ - User-scope (`~/.claude/skills/`) and project-scope (`<project>/.claude/skills/`)
17
+ are now **symlinks** pointing to pool entries (POSIX), junctions (Windows),
18
+ or copies (Windows fallback when admin not available)
19
+ - **Result**: 10 creator projects = 1 pool copy + 260 symlinks, not 260 file copies
20
+ - Updates to a skill propagate to every project automatically (pnpm-style pattern)
21
+
22
+ ### Changed — wizard simplified 6 steps → 1
23
+
24
+ Previous (v0.4.x): 15+ questions across 6 steps. Real user got overwhelmed,
25
+ hit SIGINT mid-flow, asked "why is this asking globally?".
26
+
27
+ New (v0.5.0): **3 questions only**:
28
+ 1. Adın?
29
+ 2. Əsas dilin? (az/en/ru/tr)
30
+ 3. Sən kimsən, nə edirsən? (1-2 cümlə)
31
+
32
+ Removed entirely:
33
+ - Projects scan step (no projects on fresh machine — `ai-bootstrap scan <path>` later)
34
+ - Bundle selection step (auto-installs `foundation` user-scope; project bundles via `new`)
35
+ - MCPs full picker (auto-installs 9 free MCPs: filesystem, memory, git, fetch,
36
+ time, arxiv, youtube-transcript, puppeteer, playwright)
37
+ - Memory configuration step (defaults: markdown-only, learning-keeper ON, all logs ON)
38
+ - GitHub backup step (use `ai-bootstrap backup init` when ready)
39
+
40
+ ### Changed — `ai-bootstrap new` simplified
41
+
42
+ Previous: 5 questions (single-bundle + override confirm + custom rules).
43
+ New: **3 questions only**:
44
+ 1. Layihə adı?
45
+ 2. Bundle(lər)? (**multi-select checkbox** — pick multiple at once)
46
+ 3. Qısa təsvir? (1-2 cümlə)
47
+
48
+ Removed:
49
+ - Single-bundle intent selection (replaced by multi-select)
50
+ - Bundle override confirm (multi-select handles it)
51
+ - Custom rules question (placeholder added to CLAUDE.md instead)
52
+
53
+ ### Added — new commands
54
+
55
+ - `ai-bootstrap help` — comprehensive guide (full tour, not just brief --help)
56
+ - `ai-bootstrap add` (no args) — **interactive multi-select** of all bundles + skills + agents
57
+ - `ai-bootstrap mcp add` — multi-select MCP picker (was missing)
58
+ - `ai-bootstrap mcp add github notion slack` — direct add
59
+ - `ai-bootstrap scan ~/MyJobs` — manual project scan (replaces removed wizard step)
60
+
61
+ ### Quality
62
+
63
+ - Cross-platform link helper: `linkFromPool()` tries symlink → junction → copy
64
+ - Pool sync detects newer template versions and refreshes pool entries
65
+ - 142 tests still passing (87 smoke + 55 e2e)
66
+
67
+ ### Workflow
68
+
69
+ ```bash
70
+ # 1) Maşına bir dəfə (3 sual, 30 saniyə):
71
+ npm install -g @azerogluemin/ai-bootstrap@latest
72
+ ai-bootstrap
73
+
74
+ # 2) Hər yeni layihə (3 sual, 20 saniyə):
75
+ cd ~/Projects/yeni-layihə
76
+ ai-bootstrap new
77
+ ```
78
+
79
+ ### Migration
80
+
81
+ - v0.4.x project copies → v0.5.0 symlinks: run `ai-bootstrap update` to switch
82
+ - Or `ai-bootstrap remove --all` then `ai-bootstrap new` per project
83
+
84
+ [0.5.0]: https://github.com/eminazeroglu/ai-bootstrap/releases/tag/v0.5.0
85
+
86
+ ## [0.4.2] — 2026-06-21
87
+
88
+ README quick-start fixed — global install upfront.
89
+
90
+ ### Changed
91
+
92
+ - README quick-start was inconsistent: step 1 used `npx` (one-shot, no install),
93
+ step 2 used `ai-bootstrap new` (requires global install). Users hit
94
+ `zsh: command not found: ai-bootstrap` after the wizard.
95
+ - Quick-start is now 3 steps: `npm install -g` → `ai-bootstrap` (wizard) →
96
+ `ai-bootstrap new` (per project)
97
+ - Explanation added: why global install (so `new` / `add` / `doctor` are
98
+ available everywhere) + alternative (always-`npx`)
99
+ - No functional code changes vs. 0.4.1.
100
+
101
+ [0.4.2]: https://github.com/eminazeroglu/ai-bootstrap/releases/tag/v0.4.2
102
+
8
103
  ## [0.4.1] — 2026-06-21
9
104
 
10
105
  README rewrite — published so npm.com lands on the new usage guide.
package/README.md CHANGED
@@ -6,19 +6,26 @@
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
  [![Node ≥22](https://img.shields.io/badge/Node-%E2%89%A522-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
8
8
 
9
- ## TL;DR — 2 addım
9
+ ## TL;DR — 3 addım
10
10
 
11
11
  ```bash
12
- # 1) Bir dəfə bütün maşına (foundation: 10 universal skill)
13
- npx @azerogluemin/ai-bootstrap
12
+ # 1) Bir dəfə qlobal install (ai-bootstrap komandasını maşına əlavə edir)
13
+ npm install -g @azerogluemin/ai-bootstrap
14
14
 
15
- # 2) Hər yeni layihədə (bundle: layihənin növünə uyğun skill-lər)
15
+ # 2) Bir dəfə user-scope wizard (foundation: 10 universal skill)
16
+ ai-bootstrap
17
+
18
+ # 3) Hər yeni layihədə (bundle: layihənin növünə uyğun skill-lər)
16
19
  cd ~/Projects/yeni-layihə
17
20
  ai-bootstrap new
18
21
  ```
19
22
 
20
23
  Bitdi. Hər layihədə sadəcə `claude` yaz — uyğun skill + agent dəstləri özü yüklənir.
21
24
 
25
+ > **Niyə qlobal install?** `npx @azerogluemin/ai-bootstrap` paketi bir dəfə işlədir,
26
+ > sonra `ai-bootstrap new` komandası tapılmır. Qlobal install ilə komanda hər yerdə əlçatandır.
27
+ > Alternativ: hər dəfə `npx @azerogluemin/ai-bootstrap@latest <command>` yazmaq (uzun).
28
+
22
29
  ---
23
30
 
24
31
  ## Necə işləyir — 2 səviyyəli skill sistemi
@@ -41,7 +48,11 @@ Beləliklə **AI Creator** layihən və **SaaS** layihən fərqli skill dəstlə
41
48
  ## İlk dəfə qurulum (bir dəfə maşına)
42
49
 
43
50
  ```bash
44
- npx @azerogluemin/ai-bootstrap
51
+ # Qlobal install — ai-bootstrap komandasını maşına əlavə edir
52
+ npm install -g @azerogluemin/ai-bootstrap
53
+
54
+ # Sonra wizard:
55
+ ai-bootstrap
45
56
  ```
46
57
 
47
58
  Wizard 6 addım soruşur:
@@ -179,10 +190,11 @@ ai-bootstrap remove security-auditor # silmək
179
190
 
180
191
  ### Setup + sync
181
192
  ```bash
182
- npx @azerogluemin/ai-bootstrap # ilk qurulum (user scope, bir dəfə)
183
- ai-bootstrap new # bu qovluğa layihə bundle (hər layihədə)
184
- ai-bootstrap update # yeni versiyada skill-ləri yenilə
185
- ai-bootstrap doctor # sağlamlıq yoxlaması
193
+ npm install -g @azerogluemin/ai-bootstrap # bir dəfə qlobal install
194
+ ai-bootstrap # ilk wizard (user scope foundation)
195
+ ai-bootstrap new # bu qovluğa layihə bundle (hər layihə)
196
+ ai-bootstrap update # yeni versiyada skill-ləri yenilə
197
+ ai-bootstrap doctor # sağlamlıq yoxlaması
186
198
  ```
187
199
 
188
200
  ### Skill management
@@ -8,11 +8,6 @@ export interface AgentInstallResult {
8
8
  agent: string;
9
9
  error: string;
10
10
  }[];
11
+ linkMode?: 'symlink' | 'junction' | 'copy';
11
12
  }
12
- /**
13
- * Install agents into a target agents directory.
14
- * @param agentNames List of agent IDs to install
15
- * @param targetAgentsDir Absolute path. Default `~/.claude/agents/`; pass
16
- * `<project>/.claude/agents/` for project-scope.
17
- */
18
13
  export declare function installAgents(agentNames: string[], targetAgentsDir?: string): AgentInstallResult;
@@ -1,79 +1,31 @@
1
- // Install selected agents to ~/.claude/agents/
2
- // Copies agent directories from packages/templates/agents/<name>/
3
- // (Copy not symlink: npm cache may be cleaned, breaking symlinks.)
4
- import { existsSync, cpSync, rmSync } from 'node:fs';
5
- import { join, resolve } from 'node:path';
6
- import { fileURLToPath } from 'node:url';
1
+ // Install agents into a target agents directory by linking from the pool.
2
+ // Same architecture as skills-installer (v0.5.0 Pool+Symlink).
3
+ import { existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
7
5
  import { ensureDir, AGENTS_DIR } from '../utils/paths.js';
8
- function templatesAgentsPath() {
9
- // Lookup order:
10
- // 1) ./templates/agents/ — published npm package (bundled via prepack)
11
- // 2) ../templates/agents/ — sibling templates package (monorepo dev)
12
- const here = fileURLToPath(import.meta.url);
13
- const cliRoot = resolve(here, '..', '..', '..');
14
- const candidates = [
15
- join(cliRoot, 'templates', 'agents'),
16
- resolve(cliRoot, '..', 'templates', 'agents'),
17
- ];
18
- for (const c of candidates) {
19
- if (existsSync(c))
20
- return c;
21
- }
22
- return candidates[0];
23
- }
24
- /**
25
- * Install agents into a target agents directory.
26
- * @param agentNames List of agent IDs to install
27
- * @param targetAgentsDir Absolute path. Default `~/.claude/agents/`; pass
28
- * `<project>/.claude/agents/` for project-scope.
29
- */
6
+ import { ensurePool, linkFromPool, poolHasAgent, poolAgentPath } from './pool.js';
30
7
  export function installAgents(agentNames, targetAgentsDir = AGENTS_DIR) {
31
- const result = {
32
- installed: [],
33
- skipped: [],
34
- errors: [],
35
- };
8
+ const result = { installed: [], skipped: [], errors: [] };
9
+ ensurePool();
36
10
  ensureDir(targetAgentsDir);
37
- const templatesDir = templatesAgentsPath();
38
- if (!existsSync(templatesDir)) {
39
- for (const name of agentNames) {
40
- result.skipped.push({
41
- agent: name,
42
- reason: 'agents templates folder yoxdur (Mərhələ C-5-də yaradılır)',
43
- });
44
- }
45
- return result;
46
- }
47
11
  for (const name of agentNames) {
48
- const sourceDir = join(templatesDir, name);
49
- const targetDir = join(targetAgentsDir, name);
50
- if (!existsSync(sourceDir)) {
51
- result.skipped.push({
52
- agent: name,
53
- reason: `template yoxdur: ${name} (skill hələ yazılmayıb)`,
54
- });
12
+ if (!poolHasAgent(name)) {
13
+ result.skipped.push({ agent: name, reason: `Pool-da yoxdur: ${name}` });
55
14
  continue;
56
15
  }
57
- if (existsSync(targetDir)) {
58
- result.skipped.push({
59
- agent: name,
60
- reason: 'artıq install olunub',
61
- });
16
+ const target = join(targetAgentsDir, name);
17
+ if (existsSync(target)) {
18
+ result.skipped.push({ agent: name, reason: 'artıq quraşdırılıb' });
62
19
  continue;
63
20
  }
64
21
  try {
65
- cpSync(sourceDir, targetDir, { recursive: true, dereference: true });
22
+ const mode = linkFromPool(poolAgentPath(name), target);
66
23
  result.installed.push(name);
24
+ if (!result.linkMode)
25
+ result.linkMode = mode;
67
26
  }
68
27
  catch (err) {
69
- try {
70
- rmSync(targetDir, { recursive: true, force: true });
71
- }
72
- catch { /* best-effort */ }
73
- result.errors.push({
74
- agent: name,
75
- error: err instanceof Error ? err.message : String(err),
76
- });
28
+ result.errors.push({ agent: name, error: err instanceof Error ? err.message : String(err) });
77
29
  }
78
30
  }
79
31
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"agents-installer.js","sourceRoot":"","sources":["../../src/applier/agents-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents-installer.js","sourceRoot":"","sources":["../../src/applier/agents-installer.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,+DAA+D;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AASlF,MAAM,UAAU,aAAa,CAC3B,UAAoB,EACpB,kBAA0B,UAAU;IAEpC,MAAM,MAAM,GAAuB,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAE9E,UAAU,EAAE,CAAC;IACb,SAAS,CAAC,eAAe,CAAC,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,IAAI,EAAE,EAAE,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACnE,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface PoolResult {
2
+ skillsPool: string;
3
+ agentsPool: string;
4
+ skillsAdded: number;
5
+ skillsUpdated: number;
6
+ agentsAdded: number;
7
+ agentsUpdated: number;
8
+ errors: {
9
+ item: string;
10
+ error: string;
11
+ }[];
12
+ }
13
+ /**
14
+ * Ensure the pool exists and is up-to-date with the bundled templates.
15
+ * Idempotent: safe to call on every install/update.
16
+ *
17
+ * Strategy: compare modification times. If template is newer, refresh pool entry.
18
+ */
19
+ export declare function ensurePool(): PoolResult;
20
+ /**
21
+ * Create a cross-platform link from a pool entry to a target location.
22
+ * - POSIX: symlink
23
+ * - Windows: try junction (no admin needed for dirs), fall back to copy on failure
24
+ *
25
+ * Returns 'symlink' | 'junction' | 'copy' to indicate what was used.
26
+ */
27
+ export declare function linkFromPool(poolEntry: string, targetPath: string): 'symlink' | 'junction' | 'copy';
28
+ /**
29
+ * Check whether a pool entry exists for the given name.
30
+ */
31
+ export declare function poolHasSkill(name: string): boolean;
32
+ export declare function poolHasAgent(name: string): boolean;
33
+ export declare function poolSkillPath(name: string): string;
34
+ export declare function poolAgentPath(name: string): string;
@@ -0,0 +1,166 @@
1
+ // Pool — single source of truth for skill + agent templates.
2
+ //
3
+ // Architecture (v0.5.0):
4
+ // ~/.claude/skills-pool/<skill>/ — every skill, ONE copy on disk
5
+ // ~/.claude/agents-pool/<agent>/ — every agent, ONE copy
6
+ // ~/.claude/skills/<skill> — symlink → pool (user scope)
7
+ // <project>/.claude/skills/<skill> — symlink → pool (project scope)
8
+ //
9
+ // Pool is populated from the bundled templates on first run (or update).
10
+ // pnpm-style: many references, one underlying store.
11
+ //
12
+ // Cross-platform:
13
+ // macOS / Linux / WSL2 — symlinkSync('dir')
14
+ // Windows native — try junction ('junction'); fall back to copy if no admin
15
+ //
16
+ // When a new version of @azerogluemin/ai-bootstrap is installed:
17
+ // - `ai-bootstrap update` re-runs ensurePool() → pool gets new content
18
+ // - All symlinks in user-scope + projects auto-see the update
19
+ // - No per-project re-install needed
20
+ import { existsSync, readdirSync, statSync, lstatSync, cpSync, symlinkSync, rmSync, realpathSync } from 'node:fs';
21
+ import { join, resolve, dirname } from 'node:path';
22
+ import { fileURLToPath } from 'node:url';
23
+ import { IS_WINDOWS, SKILLS_POOL_DIR, AGENTS_POOL_DIR, ensureDir } from '../utils/paths.js';
24
+ /**
25
+ * Resolve absolute path to the bundled templates folder.
26
+ * Same lookup as skills-installer used in v0.4.x.
27
+ */
28
+ function templatesRoot() {
29
+ const here = fileURLToPath(import.meta.url);
30
+ const cliRoot = resolve(here, '..', '..', '..');
31
+ const candidates = [
32
+ join(cliRoot, 'templates'), // published npm pkg (prepack)
33
+ resolve(cliRoot, '..', 'templates'), // monorepo dev sibling
34
+ ];
35
+ for (const c of candidates) {
36
+ if (existsSync(c))
37
+ return c;
38
+ }
39
+ return candidates[0];
40
+ }
41
+ /**
42
+ * Ensure the pool exists and is up-to-date with the bundled templates.
43
+ * Idempotent: safe to call on every install/update.
44
+ *
45
+ * Strategy: compare modification times. If template is newer, refresh pool entry.
46
+ */
47
+ export function ensurePool() {
48
+ const result = {
49
+ skillsPool: SKILLS_POOL_DIR,
50
+ agentsPool: AGENTS_POOL_DIR,
51
+ skillsAdded: 0,
52
+ skillsUpdated: 0,
53
+ agentsAdded: 0,
54
+ agentsUpdated: 0,
55
+ errors: [],
56
+ };
57
+ ensureDir(SKILLS_POOL_DIR);
58
+ ensureDir(AGENTS_POOL_DIR);
59
+ const root = templatesRoot();
60
+ syncCategory(join(root, 'skills'), SKILLS_POOL_DIR, result, 'skills');
61
+ syncCategory(join(root, 'agents'), AGENTS_POOL_DIR, result, 'agents');
62
+ return result;
63
+ }
64
+ function syncCategory(src, dst, result, category) {
65
+ if (!existsSync(src))
66
+ return;
67
+ const items = readdirSync(src);
68
+ for (const name of items) {
69
+ const srcItem = join(src, name);
70
+ const dstItem = join(dst, name);
71
+ try {
72
+ const srcStat = statSync(srcItem);
73
+ if (!srcStat.isDirectory())
74
+ continue;
75
+ if (!existsSync(dstItem)) {
76
+ cpSync(srcItem, dstItem, { recursive: true, dereference: true });
77
+ if (category === 'skills')
78
+ result.skillsAdded++;
79
+ else
80
+ result.agentsAdded++;
81
+ continue;
82
+ }
83
+ // Update check: if template SKILL.md/AGENT.md is newer than pool's, refresh
84
+ const markerFile = category === 'skills' ? 'SKILL.md' : 'AGENT.md';
85
+ const srcMarker = join(srcItem, markerFile);
86
+ const dstMarker = join(dstItem, markerFile);
87
+ if (existsSync(srcMarker) && existsSync(dstMarker)) {
88
+ const srcM = statSync(srcMarker).mtimeMs;
89
+ const dstM = statSync(dstMarker).mtimeMs;
90
+ if (srcM > dstM) {
91
+ rmSync(dstItem, { recursive: true, force: true });
92
+ cpSync(srcItem, dstItem, { recursive: true, dereference: true });
93
+ if (category === 'skills')
94
+ result.skillsUpdated++;
95
+ else
96
+ result.agentsUpdated++;
97
+ }
98
+ }
99
+ }
100
+ catch (err) {
101
+ result.errors.push({ item: name, error: err instanceof Error ? err.message : String(err) });
102
+ }
103
+ }
104
+ }
105
+ /**
106
+ * Create a cross-platform link from a pool entry to a target location.
107
+ * - POSIX: symlink
108
+ * - Windows: try junction (no admin needed for dirs), fall back to copy on failure
109
+ *
110
+ * Returns 'symlink' | 'junction' | 'copy' to indicate what was used.
111
+ */
112
+ export function linkFromPool(poolEntry, targetPath) {
113
+ const parent = dirname(targetPath);
114
+ ensureDir(parent);
115
+ if (existsSync(targetPath) || isBrokenSymlink(targetPath)) {
116
+ // Caller is responsible for skipping; we don't overwrite blindly
117
+ throw new Error(`Target already exists: ${targetPath}`);
118
+ }
119
+ if (!IS_WINDOWS) {
120
+ symlinkSync(poolEntry, targetPath, 'dir');
121
+ return 'symlink';
122
+ }
123
+ // Windows: try junction first (no admin needed for directories)
124
+ try {
125
+ symlinkSync(poolEntry, targetPath, 'junction');
126
+ return 'junction';
127
+ }
128
+ catch {
129
+ // Fall back to copy (admin required for true symlinks; junctions failed too)
130
+ cpSync(poolEntry, targetPath, { recursive: true, dereference: true });
131
+ return 'copy';
132
+ }
133
+ }
134
+ function isBrokenSymlink(p) {
135
+ try {
136
+ const ls = lstatSync(p);
137
+ if (!ls.isSymbolicLink())
138
+ return false;
139
+ try {
140
+ realpathSync(p);
141
+ return false;
142
+ }
143
+ catch {
144
+ return true;
145
+ }
146
+ }
147
+ catch {
148
+ return false;
149
+ }
150
+ }
151
+ /**
152
+ * Check whether a pool entry exists for the given name.
153
+ */
154
+ export function poolHasSkill(name) {
155
+ return existsSync(join(SKILLS_POOL_DIR, name));
156
+ }
157
+ export function poolHasAgent(name) {
158
+ return existsSync(join(AGENTS_POOL_DIR, name));
159
+ }
160
+ export function poolSkillPath(name) {
161
+ return join(SKILLS_POOL_DIR, name);
162
+ }
163
+ export function poolAgentPath(name) {
164
+ return join(AGENTS_POOL_DIR, name);
165
+ }
166
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/applier/pool.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,13 @@ export interface SkillInstallResult {
8
8
  skill: string;
9
9
  error: string;
10
10
  }[];
11
+ /** What link strategy was used (per the first link; consistent across the batch). */
12
+ linkMode?: 'symlink' | 'junction' | 'copy';
11
13
  }
12
14
  /**
13
15
  * Install skills into a target skills directory.
14
- * @param skillNames List of skill IDs to install
15
- * @param targetSkillsDir Absolute path to the skills directory (default: `~/.claude/skills/`).
16
- * Pass `<project>/.claude/skills/` for project-scope installation.
16
+ * @param skillNames List of skill IDs to install (must exist in pool)
17
+ * @param targetSkillsDir Absolute path. Default `~/.claude/skills/` (user scope).
18
+ * Pass `<project>/.claude/skills/` for project scope.
17
19
  */
18
20
  export declare function installSkills(skillNames: string[], targetSkillsDir?: string): SkillInstallResult;
@@ -1,94 +1,45 @@
1
- // Install selected skills to ~/.claude/skills/
2
- // Copies skill directories from packages/templates/skills/<skill>/
1
+ // Install skills into a target skills directory by linking from the pool.
3
2
  //
4
- // Why copy (not symlink): npm caches may be cleaned, breaking symlinks.
5
- // Copying makes the install self-contained and survives any source removal.
6
- // Templates are versioned via the npm package itself.
7
- import { existsSync, cpSync, rmSync } from 'node:fs';
8
- import { join, resolve } from 'node:path';
9
- import { fileURLToPath } from 'node:url';
3
+ // v0.5.0 changed:
4
+ // - Used to COPY skill dirs from templates (~10KB each) per project
5
+ // - Now ensures pool is up-to-date, then SYMLINKS from pool → target
6
+ // - One copy on disk in pool; many lightweight links across projects
7
+ // - Updates to pool (via ai-bootstrap update) propagate automatically
8
+ //
9
+ // Cross-platform: POSIX symlink, Windows junction, copy fallback.
10
+ import { existsSync } from 'node:fs';
11
+ import { join } from 'node:path';
10
12
  import { ensureDir, SKILLS_DIR } from '../utils/paths.js';
11
- /**
12
- * Resolve the absolute path to skills templates folder.
13
- *
14
- * Lookup order:
15
- * 1) ./templates/skills/ — published npm package (bundled via prepack)
16
- * 2) ../templates/skills/ — packages/cli/templates/skills/ (dev edit fallback)
17
- * 3) ../../templates/skills/ — packages/templates/skills/ (monorepo dev)
18
- *
19
- * Returns the first path that exists; otherwise the most-likely production path.
20
- */
21
- function templatesSkillsPath() {
22
- const here = fileURLToPath(import.meta.url);
23
- // From dist/applier/skills-installer.js:
24
- // - cli root = ../../../
25
- const cliRoot = resolve(here, '..', '..', '..');
26
- const candidates = [
27
- join(cliRoot, 'templates', 'skills'), // 1) published npm pkg
28
- resolve(cliRoot, '..', 'templates', 'skills'), // 2) sibling templates package (monorepo)
29
- ];
30
- for (const c of candidates) {
31
- if (existsSync(c))
32
- return c;
33
- }
34
- return candidates[0];
35
- }
13
+ import { ensurePool, linkFromPool, poolHasSkill, poolSkillPath } from './pool.js';
36
14
  /**
37
15
  * Install skills into a target skills directory.
38
- * @param skillNames List of skill IDs to install
39
- * @param targetSkillsDir Absolute path to the skills directory (default: `~/.claude/skills/`).
40
- * Pass `<project>/.claude/skills/` for project-scope installation.
16
+ * @param skillNames List of skill IDs to install (must exist in pool)
17
+ * @param targetSkillsDir Absolute path. Default `~/.claude/skills/` (user scope).
18
+ * Pass `<project>/.claude/skills/` for project scope.
41
19
  */
42
20
  export function installSkills(skillNames, targetSkillsDir = SKILLS_DIR) {
43
- const result = {
44
- installed: [],
45
- skipped: [],
46
- errors: [],
47
- };
21
+ const result = { installed: [], skipped: [], errors: [] };
22
+ // Ensure the pool has the latest templates (no-op if already up-to-date)
23
+ ensurePool();
48
24
  ensureDir(targetSkillsDir);
49
- const templatesDir = templatesSkillsPath();
50
- if (!existsSync(templatesDir)) {
51
- for (const name of skillNames) {
52
- result.errors.push({
53
- skill: name,
54
- error: `Templates folder yoxdur: ${templatesDir}`,
55
- });
56
- }
57
- return result;
58
- }
59
25
  for (const name of skillNames) {
60
- const sourceDir = join(templatesDir, name);
61
- const targetDir = join(targetSkillsDir, name);
62
- // Check source exists
63
- if (!existsSync(sourceDir)) {
64
- result.skipped.push({
65
- skill: name,
66
- reason: `Mənbə yoxdur: ${sourceDir} (skill hələ yazılmayıb)`,
67
- });
26
+ if (!poolHasSkill(name)) {
27
+ result.skipped.push({ skill: name, reason: `Pool-da yoxdur: ${name}` });
68
28
  continue;
69
29
  }
70
- // Check target already exists
71
- if (existsSync(targetDir)) {
72
- result.skipped.push({
73
- skill: name,
74
- reason: 'artıq install olunub',
75
- });
30
+ const target = join(targetSkillsDir, name);
31
+ if (existsSync(target)) {
32
+ result.skipped.push({ skill: name, reason: 'artıq quraşdırılıb' });
76
33
  continue;
77
34
  }
78
- // Copy recursively (npm-cache-safe; survives source removal)
79
35
  try {
80
- cpSync(sourceDir, targetDir, { recursive: true, dereference: true });
36
+ const mode = linkFromPool(poolSkillPath(name), target);
81
37
  result.installed.push(name);
38
+ if (!result.linkMode)
39
+ result.linkMode = mode;
82
40
  }
83
41
  catch (err) {
84
- try {
85
- rmSync(targetDir, { recursive: true, force: true });
86
- }
87
- catch { /* best-effort cleanup */ }
88
- result.errors.push({
89
- skill: name,
90
- error: err instanceof Error ? err.message : String(err),
91
- });
42
+ result.errors.push({ skill: name, error: err instanceof Error ? err.message : String(err) });
92
43
  }
93
44
  }
94
45
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"skills-installer.js","sourceRoot":"","sources":["../../src/applier/skills-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills-installer.js","sourceRoot":"","sources":["../../src/applier/skills-installer.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,EAAE;AACF,kBAAkB;AAClB,sEAAsE;AACtE,uEAAuE;AACvE,uEAAuE;AACvE,wEAAwE;AACxE,EAAE;AACF,kEAAkE;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAUlF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,UAAoB,EACpB,kBAA0B,UAAU;IAEpC,MAAM,MAAM,GAAuB,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAE9E,yEAAyE;IACzE,UAAU,EAAE,CAAC;IACb,SAAS,CAAC,eAAe,CAAC,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,IAAI,EAAE,EAAE,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC;YACnE,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function runHelpCommand(): void;