aiblueprint-cli 1.4.108 → 1.4.110

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.
Files changed (40) hide show
  1. package/README.md +10 -0
  2. package/agents-config/claude-config/mods/agent4everything/.claude-plugin/plugin.json +5 -0
  3. package/agents-config/claude-config/mods/agent4everything/hooks/hooks.json +1 -0
  4. package/agents-config/claude-config/mods/agent4everything/hooks/register.ts +96 -0
  5. package/agents-config/claude-config/mods/aiblueprint/.claude-plugin/plugin.json +71 -0
  6. package/agents-config/claude-config/mods/aiblueprint/hooks/hooks.json +1 -0
  7. package/agents-config/claude-config/mods/aiblueprint/hooks/register.tsx +309 -0
  8. package/agents-config/claude-config/mods/aiblueprint/tests/band.test.tsx +74 -0
  9. package/agents-config/claude-config/mods/aiblueprint/types/index.d.ts +14 -0
  10. package/agents-config/claude-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +8 -74
  11. package/agents-config/claude-config/scripts/statusline/src/index.ts +1 -0
  12. package/agents-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +8 -74
  13. package/agents-config/scripts/statusline/src/index.ts +1 -0
  14. package/agents-config/skills/agents-manager/SKILL.md +15 -453
  15. package/agents-config/skills/apex/SKILL.md +14 -110
  16. package/agents-config/skills/app-icon/SKILL.md +22 -117
  17. package/agents-config/skills/appstore-connect/SKILL.md +22 -85
  18. package/agents-config/skills/arena/LICENSE +21 -0
  19. package/agents-config/skills/arena/SKILL.md +371 -0
  20. package/agents-config/skills/arena/agents/openai.yaml +9 -0
  21. package/agents-config/skills/arena/assets/codex-icon.svg +22 -0
  22. package/agents-config/skills/arena/bracket.py +1235 -0
  23. package/agents-config/skills/arena/rubric.md +79 -0
  24. package/agents-config/skills/arena/strategies.json +205 -0
  25. package/agents-config/skills/audit-memories/SKILL.md +13 -139
  26. package/agents-config/skills/audit-skills/SKILL.md +6 -65
  27. package/agents-config/skills/environments-manager/SKILL.md +14 -238
  28. package/agents-config/skills/grill-me/SKILL.md +8 -22
  29. package/agents-config/skills/hooks-manager/SKILL.md +8 -54
  30. package/agents-config/skills/rules-manager/SKILL.md +11 -192
  31. package/agents-config/skills/skill-manager/SKILL.md +19 -158
  32. package/agents-config/skills/skill-manager/references/description-recommandation.md +15 -85
  33. package/agents-config/skills/test-audit/CAMPAIGN.md +117 -0
  34. package/agents-config/skills/test-audit/LICENSE +23 -0
  35. package/agents-config/skills/test-audit/SKILL.md +169 -0
  36. package/agents-config/skills/test-audit/agents/openai.yaml +10 -0
  37. package/agents-config/skills/test-audit/assets/codex-icon.svg +1 -0
  38. package/agents-config/skills/use-style/SKILL.md +8 -48
  39. package/dist/cli.js +125 -78
  40. package/package.json +1 -1
@@ -1,58 +1,18 @@
1
1
  ---
2
2
  name: use-style
3
3
  description: Apply named visual style guides to landing pages, app shells, and UI. Use for $use-style, /useskill, list styles, or styles like ios-app, grid, vercel, black-grid, stripe, linear, raycast, gumroad, dusk, or luma.
4
+ disable-model-invocation: true
5
+ user-invocable: true
4
6
  ---
5
7
 
6
- Load and apply a named style before designing or implementing any UI.
8
+ Load a named style before designing or implementing UI. Parse the name from `$ARGUMENTS` or the message. Aliases: `ios`/`iphone`/`nowstack-mobile`/`ink & spark` → `ios-app`; `use-vercel`/`geist` → `vercel`; `old vercel`/`black grid` → `black-grid`; `testsprite`/`test sprite` → `testspirite`; `lu.ma`/`luma.com` → `luma`; `super simple`/`SUPER_SIMPLE` → `super-simple`.
7
9
 
8
- ## Invocation
10
+ Defaults: NowStack / Expo / NativeWind → `ios-app`. Codelynx product landings → `grid`. Vercel / Geist infrastructure marketing → `vercel`. Austere monochrome tools → `black-grid`. Linear / issue tracker shell → `linear`. Newspaper / magazine → `new-york-times`. Anthropic / Claude cream lab → `anthropic`. Neo-brutalist yellow/pink → `gumroad`. Glossy dark glow marketing → `raycast`. Attio twilight CRM → `dusk`. TestSprite paper dashboard → `testspirite`. Luma / events / RSVP → `luma`.
9
11
 
10
- - Explicit: `$use-style ios-app`, `$use-style vercel`, `$use-style black-grid`, `/useskill list`, or "use the grid style"
11
- - Implicit: user references NowStack Mobile, Ink & Spark, an iOS app shell, Expo / React Native / NativeWind app UI, `/aiblueprint`, `/agents`, `/aibuilder`, "grid theme", Vercel, Geist, a minimalist dark tool UI, Stripe / fintech / checkout / dashboard UI, Linear / issue tracker / app-shell sidebar UI, NYT / newspaper / editorial / broadsheet / magazine layouts, Anthropic / Claude / warm cream AI-lab pages, Gumroad / neo-brutalist / loud commerce / bold yellow-pink pages, Raycast / glossy dark / glow gradients / floating glass nav / premium product marketing, Dusk / Attio / dark CRM dashboard floating on a twilight backdrop / blue data viz / colorful category pills, Luma / lu.ma / event timeline / calendar / RSVP / discover / a dark consumer events-and-calendar app with photo-led cards, a top teal aurora, and a white pill button, or TestSprite / TestSpirite / calm light dev-tool dashboard / warm paper canvas with one forest-green accent / grouped sidebar + promo rail / isometric line-art empty states
12
-
13
- Parse the style name from `$ARGUMENTS` or the message. Treat `ios`, `ios app`, `ios-app`, `iphone app`, `nowstack-mobile`, `nowstack mobile`, and `ink & spark` as `ios-app`. Treat `use-vercel`, `vercel style`, and `current vercel` as `vercel`. Treat `vercel-simple`, `old vercel`, `black grid`, and `black-grid` as `black-grid`. Treat `testsprite`, `test-sprite`, and `test sprite` as `testspirite`. Treat `luma`, `lu.ma`, and `luma.com` as `luma`. Treat `list`, `styles`, `available styles`, and missing style names with no implicit match as a request to list available styles and ask the user to choose before designing. Default to `ios-app` when the user references NowStack Mobile, Ink & Spark, an iOS app shell, Expo, React Native, NativeWind, or OS-native tabs. Default to `grid` for Codelynx product landings. Default to `vercel` when the user references Vercel, the Vercel dashboard, Geist, Vercel's changelog, or black infrastructure marketing with large editorial whitespace. Default to `black-grid` for austere monochrome developer tools, calculators, indexes, or line-driven data products. Default to `linear` when the user references Linear, an issue tracker, or a dense sidebar + list + detail app shell. Default to `new-york-times` when the user references a newspaper, broadsheet, magazine, or serif editorial layout. Default to `anthropic` when the user references Anthropic, Claude, or a warm cream + serif AI-lab aesthetic. Default to `gumroad` when the user references Gumroad, neo-brutalism, hard offset shadows, or a loud yellow/pink bordered look. Default to `raycast` when the user references Raycast, a glossy dark page with glow gradients, a floating glass nav, or premium dark product marketing. Default to `dusk` when the user references Attio, a dark CRM/data dashboard floating on a twilight/aurora backdrop, vivid-blue charts, or colorful category pills. Default to `testspirite` when the user references TestSprite, a calm light dev-tool dashboard, a warm paper canvas with a single forest-green accent, a grouped sidebar with a free-trial/upgrade promo rail, or isometric line-art empty states. Default to `luma` when the user references Luma, lu.ma, an event timeline/feed, a calendar or RSVP/invite app, a discover page, or a dark consumer events UI with photo-led cards, a top teal aurora, and a white pill button.
14
-
15
- If the parsed style is `list`, or if no style can be inferred, do not load a style file. Reply with the available styles table below, add one short line asking which style to use, and stop until the user chooses.
16
-
17
- ## Workflow
12
+ If the name is `list` or nothing matches, list the styles in `styles/` and stop until the user chooses.
18
13
 
19
14
  1. Read `styles/<name>.md` from this skill directory.
20
- 2. Check for project overrides and prefer them over the portable spec:
21
- - `.agents/styles/<name>.md`
22
- - `.agents/styles/<name>-theme.md`
23
- - `.agents/styles/<name>-theme-migration.md` (migration playbooks only)
24
- 3. Treat the loaded style as hard constraints for layout, typography, color, borders, motion, and component choice.
25
- 4. Reuse existing primitives. In Codelynx repos, import `GridTheme*` components from `grid-theme-primitives.tsx` instead of reinventing patterns.
26
-
27
- ## Available styles
28
-
29
- | Style | File | Vibe |
30
- |-------|------|------|
31
- | `ios-app` | `styles/ios-app.md` | NowStack Mobile Ink & Spark. iOS/Expo app UI with monochrome ink/paper, one yellow `#FFE040` spark, NativeWind tokens, OS-native tabs, flat hairline cards. |
32
- | `grid` | `styles/grid.md` | Blueprint landing. Square geometry, 1px borders, mono data, condensed display type. |
33
- | `vercel` | `styles/vercel.md` | Current Vercel product language. Black canvas, Geist Sans, hairline dashboard structure, dense deployment lists, vast editorial marketing space, restrained semantic color. |
34
- | `black-grid` | `styles/black-grid.md` | Austere monochrome developer tools. Black canvas, Geist + mono, sharp line-defined indexes and calculators, no decoration. |
35
- | `stripe` | `styles/stripe.md` | Stripe fintech UI. Pale `#f6f9fc` canvas, white cards on soft shadows, blurple `#635BFF` accent, green CTA, rounded geometry. |
36
- | `linear` | `styles/linear.md` | Linear app shell. Near-black `#08090a` canvas, dense aligned sidebar + list + detail panes, indigo `#5e6ad2` accent, Inter Display headings, quiet line-defined chrome. |
37
- | `new-york-times` | `styles/new-york-times.md` | Print-newspaper editorial. Paper-white, serif headlines (Cheltenham/Georgia), Franklin sans kickers, blackletter masthead, hairline rules, multi-column grid, red/blue accents only. |
38
- | `anthropic` | `styles/anthropic.md` | Warm AI-lab. Cream `#f0efe9` paper, bold grotesque sans display + reading serif, clay-coral `#cc785c` accent, big soft-rounded dark panels, pill buttons. Light marketing + dark Claude app surfaces. |
39
- | `gumroad` | `styles/gumroad.md` | Loud neo-brutalist commerce. Yellow `#ffc900` + pink `#ff90e8`, thick black borders, hard offset shadows `4px 4px 0 #000`, flat fills, bold geometric sans, pill buttons. Light marketplace + dark dashboard surfaces. |
40
- | `raycast` | `styles/raycast.md` | Glossy dark product marketing. Near-black `#0a0a0a` + red `#ff6363` glow, floating glass nav (`backdrop-blur`), oversized bold pricing, large-radius `rounded-3xl` cards, soft glow over hard shadows. |
41
- | `dusk` | `styles/dusk.md` | Refined dark data app (Attio-style). Rounded near-black window floating on a twilight gradient backdrop, vivid sky-blue `#38bdf8` charts, `#3b6eff` primary, colorful category pills, Inter + mono numbers. |
42
- | `luma` | `styles/luma.md` | Dark consumer events + calendar app (Luma/lu.ma). Near-black `#0a0a0b` canvas with one soft teal aurora at the top, near-borderless `rounded-2xl` photo-led cards, white pill primary buttons, blue `#2f6bff` status pills, gold `#f5b13d` event times, centered timeline column. |
43
- | `testspirite` | `styles/testspirite.md` | Calm light dev-tool app shell (TestSprite). Warm paper-white `#f7f7f3` canvas, one forest-green `#3d7c4e` accent, grouped sidebar + promo rail, soft `rounded-xl` cards on quiet borders, pale-green `#eaf3ea` status pills, isometric line-art empty states. |
44
-
45
- Add new styles as `styles/<name>.md` and register them here.
46
-
47
- ## Output rules
48
-
49
- - Match the style vibe precisely. Do not blend with generic SaaS aesthetics.
50
- - Honor the anti-patterns section in the style file.
51
- - When a project spec lists concrete tokens or components, use those over prose approximations.
52
- - For landing pages, scaffold the page shell from the style first, then fill sections.
53
-
54
- ## Related skills
15
+ 2. Prefer project overrides: `.agents/styles/<name>.md`, `<name>-theme.md`, `<name>-theme-migration.md`.
16
+ 3. Treat the loaded style as hard constraints. Reuse existing primitives (Codelynx: `GridTheme*` from `grid-theme-primitives.tsx`).
55
17
 
56
- - `frontend-design` / `frontend-skill`: general UI craft. Defer to `use-style` when a named style is requested.
57
- - `use-feature`: reusable feature and UX implementation patterns that are not visual styles.
58
- - `impeccable`: polish pass after the style is applied.
18
+ Match the vibe exactly. Honor the style file's anti-patterns. Scaffold the shell first on landing pages. `impeccable` is the polish pass after the style is applied.
package/dist/cli.js CHANGED
@@ -30139,6 +30139,16 @@ __exportCjs(exports_commander, {
30139
30139
  InvalidArgumentError: (value) => $InvalidArgumentError = value,
30140
30140
  InvalidOptionArgumentError: (value) => $InvalidOptionArgumentError = value
30141
30141
  });
30142
+
30143
+ // node_modules/ansi-escapes/index.js
30144
+ var exports_ansi_escapes = {};
30145
+ __exportCjs(exports_ansi_escapes, {
30146
+ default: () => $default
30147
+ }, {
30148
+ default: (value2) => $default = value2
30149
+ });
30150
+
30151
+ // node_modules/commander/index.js
30142
30152
  var { Argument } = require_argument();
30143
30153
  var { Command } = require_command();
30144
30154
  var { CommanderError, InvalidArgumentError } = require_error();
@@ -30172,12 +30182,6 @@ var {
30172
30182
  } = exports_commander;
30173
30183
 
30174
30184
  // node_modules/ansi-escapes/index.js
30175
- var exports_ansi_escapes = {};
30176
- __exportCjs(exports_ansi_escapes, {
30177
- default: () => $default
30178
- }, {
30179
- default: (value2) => $default = value2
30180
- });
30181
30185
  var ansiEscapes = exports_ansi_escapes;
30182
30186
  var $default = ansiEscapes;
30183
30187
  var ESC = "\x1B[";
@@ -32299,7 +32303,7 @@ var lib_default = inquirer;
32299
32303
  // src/commands/setup.ts
32300
32304
  var import_fs_extra9 = __toESM(require_lib4(), 1);
32301
32305
  import path13 from "path";
32302
- import os11 from "os";
32306
+ import os12 from "os";
32303
32307
 
32304
32308
  // node_modules/chalk/source/vendor/ansi-styles/index.js
32305
32309
  var ANSI_BACKGROUND_OFFSET = 10;
@@ -33022,10 +33026,27 @@ async function installStatuslineDependencies(claudeDir) {
33022
33026
 
33023
33027
  // src/commands/setup/settings.ts
33024
33028
  var import_fs_extra2 = __toESM(require_lib4(), 1);
33029
+ import os5 from "os";
33025
33030
  import path4 from "path";
33026
33031
  function toPosixPath(p) {
33027
33032
  return p.replace(/\\/g, "/");
33028
33033
  }
33034
+ function expandHome(p) {
33035
+ return p.startsWith("~/") ? path4.join(os5.homedir(), p.slice(2)) : p;
33036
+ }
33037
+ function enableMods(env, mods, claudeDir) {
33038
+ env.CLAUDE_CODE_ENABLE_FUNCTION_HOOKS = "1";
33039
+ const dirs = (env.CLAUDE_CODE_PLUGIN_DIRS ?? "").split(path4.delimiter).filter(Boolean);
33040
+ const known = new Set(dirs.map((dir) => path4.resolve(expandHome(dir))));
33041
+ for (const mod of mods) {
33042
+ const dir = path4.join(claudeDir, "mods", mod);
33043
+ if (known.has(path4.resolve(dir)))
33044
+ continue;
33045
+ dirs.push(toPosixPath(dir));
33046
+ known.add(path4.resolve(dir));
33047
+ }
33048
+ env.CLAUDE_CODE_PLUGIN_DIRS = dirs.join(path4.delimiter);
33049
+ }
33029
33050
  async function hasExistingStatusLine(claudeDir) {
33030
33051
  const settingsPath = path4.join(claudeDir, "settings.json");
33031
33052
  try {
@@ -33060,6 +33081,9 @@ async function updateSettings(options, claudeDir) {
33060
33081
  delete settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL;
33061
33082
  }
33062
33083
  settings.env.CLAUDE_CODE_DISABLE_1M_CONTEXT = "1";
33084
+ if (options.installedMods && options.installedMods.length > 0) {
33085
+ enableMods(settings.env, options.installedMods, claudeDir);
33086
+ }
33063
33087
  if (!settings.permissions) {
33064
33088
  settings.permissions = {};
33065
33089
  }
@@ -33086,7 +33110,7 @@ async function updateSettings(options, claudeDir) {
33086
33110
  // src/commands/setup/utils.ts
33087
33111
  var import_fs_extra3 = __toESM(require_lib4(), 1);
33088
33112
  import path5 from "path";
33089
- import os5 from "os";
33113
+ import os6 from "os";
33090
33114
  import { exec } from "child_process";
33091
33115
  import { promisify } from "util";
33092
33116
  var execAsync = promisify(exec);
@@ -33103,7 +33127,7 @@ class SimpleSpinner {
33103
33127
  }
33104
33128
  var GITHUB_REPO = "https://github.com/Melvynx/aiblueprint.git";
33105
33129
  async function cloneRepository() {
33106
- const tmpDir = path5.join(os5.tmpdir(), `aiblueprint-${Date.now()}`);
33130
+ const tmpDir = path5.join(os6.tmpdir(), `aiblueprint-${Date.now()}`);
33107
33131
  try {
33108
33132
  await import_fs_extra3.default.ensureDir(tmpDir);
33109
33133
  await execAsync(`git clone --depth 1 --quiet ${GITHUB_REPO} "${tmpDir}"`);
@@ -33153,7 +33177,7 @@ function getVersion() {
33153
33177
 
33154
33178
  // src/lib/platform.ts
33155
33179
  var import_fs_extra4 = __toESM(require_lib4(), 1);
33156
- import os6 from "os";
33180
+ import os7 from "os";
33157
33181
  import path6 from "path";
33158
33182
  import { execSync as execSync2 } from "child_process";
33159
33183
  function escapeShellArg(arg) {
@@ -33162,15 +33186,15 @@ function escapeShellArg(arg) {
33162
33186
  var cachedPlatformInfo = null;
33163
33187
  var cachedAudioPlayer = undefined;
33164
33188
  function isWSL() {
33165
- if (os6.platform() !== "linux")
33189
+ if (os7.platform() !== "linux")
33166
33190
  return false;
33167
- const release = os6.release().toLowerCase();
33191
+ const release = os7.release().toLowerCase();
33168
33192
  return release.includes("microsoft") || release.includes("wsl");
33169
33193
  }
33170
33194
  function getPlatformInfo() {
33171
33195
  if (cachedPlatformInfo)
33172
33196
  return cachedPlatformInfo;
33173
- const platform = os6.platform();
33197
+ const platform = os7.platform();
33174
33198
  const wsl = isWSL();
33175
33199
  cachedPlatformInfo = {
33176
33200
  platform,
@@ -33178,14 +33202,14 @@ function getPlatformInfo() {
33178
33202
  isMacOS: platform === "darwin",
33179
33203
  isLinux: platform === "linux" && !wsl,
33180
33204
  isWSL: wsl,
33181
- homeDir: os6.homedir()
33205
+ homeDir: os7.homedir()
33182
33206
  };
33183
33207
  return cachedPlatformInfo;
33184
33208
  }
33185
33209
  function detectAudioPlayer() {
33186
33210
  if (cachedAudioPlayer !== undefined)
33187
33211
  return cachedAudioPlayer;
33188
- const platform = os6.platform();
33212
+ const platform = os7.platform();
33189
33213
  if (platform === "darwin") {
33190
33214
  cachedAudioPlayer = "afplay";
33191
33215
  return cachedAudioPlayer;
@@ -33224,7 +33248,7 @@ function getPlaySoundCommand(soundPath) {
33224
33248
  const player = detectAudioPlayer();
33225
33249
  if (!player)
33226
33250
  return null;
33227
- const platform = os6.platform();
33251
+ const platform = os7.platform();
33228
33252
  const safePath = escapeShellArg(soundPath);
33229
33253
  if (platform === "darwin") {
33230
33254
  return `afplay -v 0.1 ${safePath}`;
@@ -33336,12 +33360,11 @@ async function applyPathPlaceholders(target, claudeDir) {
33336
33360
  }
33337
33361
  }
33338
33362
  function transformFileContent(content, claudeDir) {
33339
- let transformed = content;
33340
- transformed = replaceClaudePathPlaceholder(transformed, claudeDir);
33341
- for (const pattern of KNOWN_CLAUDE_PATHS) {
33342
- transformed = transformed.replace(new RegExp(pattern.source, "g"), `${claudeDir}/`);
33343
- }
33344
- transformed = transformed.replace(/\\/g, "/");
33363
+ const normalizedClaudeDir = claudeDir.replace(/\\/g, "/");
33364
+ const windowsPath = /C:[\\/]+Users[\\/]+[^\\/\r\n"'`]+[\\/]+\.claude[\\/]+([^\s"'`<>|]*)/;
33365
+ const claudePaths = new RegExp([windowsPath.source, ...KNOWN_CLAUDE_PATHS.map((pattern) => pattern.source)].join("|"), "gi");
33366
+ let transformed = content.replace(claudePaths, (_match, relativePath) => `${normalizedClaudeDir}/${relativePath?.replace(/\\+/g, "/") ?? ""}`);
33367
+ transformed = replaceClaudePathPlaceholder(transformed, normalizedClaudeDir);
33345
33368
  const audioPatterns = [
33346
33369
  /afplay\s+-v\s+[\d.]+\s+'[^']+'/g,
33347
33370
  /afplay\s+'[^']+'/g,
@@ -33360,7 +33383,7 @@ function transformFileContent(content, claudeDir) {
33360
33383
  }
33361
33384
 
33362
33385
  // src/lib/telemetry.ts
33363
- import os7 from "os";
33386
+ import os8 from "os";
33364
33387
  import fs5 from "fs";
33365
33388
  import path7 from "path";
33366
33389
  var TELEMETRY_URL = "https://codelynx.dev/api/cli/events";
@@ -33369,13 +33392,13 @@ var isDisabled = () => {
33369
33392
  };
33370
33393
  var getBasePayload = () => ({
33371
33394
  cliVersion: getVersion(),
33372
- platform: os7.platform(),
33373
- arch: os7.arch(),
33395
+ platform: os8.platform(),
33396
+ arch: os8.arch(),
33374
33397
  nodeVersion: process.version
33375
33398
  });
33376
33399
  function getTokenFilePath() {
33377
- const homeDir = os7.homedir();
33378
- if (os7.platform() === "win32") {
33400
+ const homeDir = os8.homedir();
33401
+ if (os8.platform() === "win32") {
33379
33402
  const appData = process.env.APPDATA || path7.join(homeDir, "AppData", "Roaming");
33380
33403
  return path7.join(appData, "aiblueprint", "token.txt");
33381
33404
  }
@@ -33388,12 +33411,12 @@ function getSystemInfo() {
33388
33411
  hasProToken = fs5.existsSync(getTokenFilePath());
33389
33412
  } catch {}
33390
33413
  return {
33391
- osVersion: os7.release(),
33392
- osType: os7.type(),
33393
- totalMemory: `${Math.round(os7.totalmem() / (1024 * 1024 * 1024))}GB`,
33394
- cpus: os7.cpus().length,
33414
+ osVersion: os8.release(),
33415
+ osType: os8.type(),
33416
+ totalMemory: `${Math.round(os8.totalmem() / (1024 * 1024 * 1024))}GB`,
33417
+ cpus: os8.cpus().length,
33395
33418
  shell: process.env.SHELL || process.env.COMSPEC || "unknown",
33396
- homeDir: os7.homedir(),
33419
+ homeDir: os8.homedir(),
33397
33420
  locale: process.env.LANG || process.env.LC_ALL || "unknown",
33398
33421
  hasProToken
33399
33422
  };
@@ -33436,12 +33459,12 @@ async function flushTelemetry() {
33436
33459
 
33437
33460
  // src/lib/agents-installer.ts
33438
33461
  var import_fs_extra5 = __toESM(require_lib4(), 1);
33439
- import os8 from "os";
33462
+ import os9 from "os";
33440
33463
  import path8 from "path";
33441
33464
  var AGENT_CATEGORIES = ["skills", "agents"];
33442
33465
  async function platformSymlink(source, target) {
33443
33466
  await import_fs_extra5.default.ensureDir(path8.dirname(target));
33444
- const isWindows = os8.platform() === "win32";
33467
+ const isWindows = os9.platform() === "win32";
33445
33468
  const sourceStat = await import_fs_extra5.default.stat(source).catch(() => null);
33446
33469
  const isDir = sourceStat?.isDirectory() ?? false;
33447
33470
  if (isWindows && isDir) {
@@ -33553,10 +33576,10 @@ function isAgentCategory(category) {
33553
33576
  }
33554
33577
 
33555
33578
  // src/lib/folder-paths.ts
33556
- import os9 from "os";
33579
+ import os10 from "os";
33557
33580
  import path9 from "path";
33558
33581
  function resolveFolders(options = {}) {
33559
- const rootDir = options.folder ? path9.resolve(options.folder) : os9.homedir();
33582
+ const rootDir = options.folder ? path9.resolve(options.folder) : os10.homedir();
33560
33583
  const claudeDir = options.claudeCodeFolder ? path9.resolve(options.claudeCodeFolder) : path9.join(rootDir, ".claude");
33561
33584
  const codexDir = options.codexFolder ? path9.resolve(options.codexFolder) : path9.join(rootDir, ".codex");
33562
33585
  const agentsDir = options.agentsFolder ? path9.resolve(options.agentsFolder) : path9.join(rootDir, ".agents");
@@ -33727,7 +33750,7 @@ async function mergeCodexConfigFile(sourceConfigPath, codexDir) {
33727
33750
 
33728
33751
  // src/lib/configs-store.ts
33729
33752
  var import_fs_extra7 = __toESM(require_lib4(), 1);
33730
- import os10 from "os";
33753
+ import os11 from "os";
33731
33754
  import path11 from "path";
33732
33755
  var RETENTION_MANAGED_BACKUP_TRIGGERS = new Set(["setup", "sync", "load", "backup-load"]);
33733
33756
  var DEFAULT_BACKUP_RETENTION_DAYS = 30;
@@ -33780,7 +33803,7 @@ async function hasContent(folderPath) {
33780
33803
  async function copyManagedFolder(source, destination) {
33781
33804
  await import_fs_extra7.default.copy(source, destination, {
33782
33805
  overwrite: true,
33783
- dereference: os10.platform() === "win32",
33806
+ dereference: os11.platform() === "win32",
33784
33807
  filter: async (sourcePath) => {
33785
33808
  const stat = await import_fs_extra7.default.lstat(sourcePath);
33786
33809
  return !(stat.isSocket() || stat.isFIFO() || stat.isCharacterDevice() || stat.isBlockDevice());
@@ -34340,7 +34363,8 @@ async function setupCommand(params = {}) {
34340
34363
  "customStatusline",
34341
34364
  "aiblueprintAgents",
34342
34365
  "aiblueprintSkills",
34343
- "installCodex"
34366
+ "installCodex",
34367
+ "claudeMods"
34344
34368
  ];
34345
34369
  console.log(source_default.green("✓ Installing all features (--skip mode)"));
34346
34370
  } else {
@@ -34374,6 +34398,11 @@ async function setupCommand(params = {}) {
34374
34398
  value: "installCodex",
34375
34399
  name: "Codex setup - Starter config + share skills/agents with ~/.codex",
34376
34400
  checked: true
34401
+ },
34402
+ {
34403
+ value: "claudeMods",
34404
+ name: "Claude Code mods - aiblueprint usage band + agent4everything skills sync",
34405
+ checked: true
34377
34406
  }
34378
34407
  ]
34379
34408
  }
@@ -34390,6 +34419,7 @@ async function setupCommand(params = {}) {
34390
34419
  aiblueprintAgents: features.includes("aiblueprintAgents"),
34391
34420
  aiblueprintSkills: features.includes("aiblueprintSkills"),
34392
34421
  installCodex: features.includes("installCodex"),
34422
+ claudeMods: features.includes("claudeMods"),
34393
34423
  skipInteractive
34394
34424
  };
34395
34425
  const s = new SimpleSpinner;
@@ -34440,6 +34470,23 @@ async function setupCommand(params = {}) {
34440
34470
  s.stop("Scripts not available in repository");
34441
34471
  }
34442
34472
  }
34473
+ if (options.claudeMods) {
34474
+ s.start("Setting up Claude Code mods");
34475
+ const modsSource = await resolveClaudeAssetPath(sourceDir, "mods");
34476
+ if (modsSource) {
34477
+ const entries = await import_fs_extra9.default.readdir(modsSource, { withFileTypes: true });
34478
+ const mods = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
34479
+ for (const mod of mods) {
34480
+ await import_fs_extra9.default.copy(path13.join(modsSource, mod), path13.join(claudeDir, "mods", mod), {
34481
+ overwrite: true
34482
+ });
34483
+ }
34484
+ options.installedMods = mods;
34485
+ s.stop(`Mods installed (${mods.join(", ")})`);
34486
+ } else {
34487
+ s.stop("Mods not available in repository");
34488
+ }
34489
+ }
34443
34490
  if (options.aiblueprintAgents) {
34444
34491
  s.start("Setting up AIBlueprint agents");
34445
34492
  const agentsSource = path13.join(sourceDir, "agents");
@@ -34544,7 +34591,7 @@ async function setupCommand(params = {}) {
34544
34591
  console.log(source_default.gray(`
34545
34592
  Next steps:`));
34546
34593
  if (options.shellShortcuts) {
34547
- const platform = os11.platform();
34594
+ const platform = os12.platform();
34548
34595
  if (platform === "win32") {
34549
34596
  console.log(source_default.gray(" • Restart PowerShell to load the new functions"));
34550
34597
  } else {
@@ -34574,7 +34621,7 @@ Next steps:`));
34574
34621
  // src/commands/setup-terminal.ts
34575
34622
  var import_fs_extra10 = __toESM(require_lib4(), 1);
34576
34623
  import path14 from "path";
34577
- import os12 from "os";
34624
+ import os13 from "os";
34578
34625
  import { execSync as execSync3, exec as exec2 } from "child_process";
34579
34626
  var OHMYZSH_INSTALL_URL = "https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh";
34580
34627
  var INSTALL_TIMEOUT = 120000;
@@ -34741,7 +34788,7 @@ plugins=(${pluginsString})`;
34741
34788
  }
34742
34789
  async function setupTerminalCommand(options = {}) {
34743
34790
  const { skipInteractive, homeDir: customHomeDir } = options;
34744
- const homeDir = customHomeDir || os12.homedir();
34791
+ const homeDir = customHomeDir || os13.homedir();
34745
34792
  try {
34746
34793
  console.log(source_default.blue.bold(`
34747
34794
  \uD83D\uDDA5️ AIBlueprint Terminal Setup ${source_default.gray(`v${getVersion()}`)}
@@ -34891,24 +34938,24 @@ Next steps:`));
34891
34938
  // src/commands/setup/symlinks.ts
34892
34939
  var import_fs_extra11 = __toESM(require_lib4(), 1);
34893
34940
  import path15 from "path";
34894
- import os13 from "os";
34941
+ import os14 from "os";
34895
34942
  async function getToolPaths(tool, customFolder) {
34896
34943
  let baseDir;
34897
34944
  switch (tool) {
34898
34945
  case "claude-code":
34899
- baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os13.homedir(), ".claude");
34946
+ baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os14.homedir(), ".claude");
34900
34947
  return {
34901
34948
  baseDir,
34902
34949
  agentsPath: path15.join(baseDir, "agents")
34903
34950
  };
34904
34951
  case "codex":
34905
- baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os13.homedir(), ".codex");
34952
+ baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os14.homedir(), ".codex");
34906
34953
  return {
34907
34954
  baseDir,
34908
34955
  agentsPath: path15.join(baseDir, "agents")
34909
34956
  };
34910
34957
  case "factoryai":
34911
- baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os13.homedir(), ".factory");
34958
+ baseDir = customFolder ? path15.resolve(customFolder) : path15.join(os14.homedir(), ".factory");
34912
34959
  return {
34913
34960
  baseDir,
34914
34961
  agentsPath: path15.join(baseDir, "droids")
@@ -34936,7 +34983,7 @@ async function createSymlink(sourcePath, targetPath, options = {}) {
34936
34983
  return false;
34937
34984
  }
34938
34985
  }
34939
- const isWindows = os13.platform() === "win32";
34986
+ const isWindows = os14.platform() === "win32";
34940
34987
  if (isWindows) {
34941
34988
  await import_fs_extra11.default.symlink(sourcePath, targetPath, "junction");
34942
34989
  } else {
@@ -35780,14 +35827,14 @@ var Y2 = ({ indicator: t = "dots" } = {}) => {
35780
35827
  // src/lib/agents-unifier.ts
35781
35828
  var import_fs_extra13 = __toESM(require_lib4(), 1);
35782
35829
  import crypto from "crypto";
35783
- import os15 from "os";
35830
+ import os16 from "os";
35784
35831
  import path17 from "path";
35785
35832
 
35786
35833
  // src/lib/backup-utils.ts
35787
35834
  var import_fs_extra12 = __toESM(require_lib4(), 1);
35788
35835
  import path16 from "path";
35789
- import os14 from "os";
35790
- var BACKUP_BASE_DIR = path16.join(os14.homedir(), ".config", "aiblueprint", "backup");
35836
+ import os15 from "os";
35837
+ var BACKUP_BASE_DIR = path16.join(os15.homedir(), ".config", "aiblueprint", "backup");
35791
35838
  function getBackupDir() {
35792
35839
  return process.env.AIBLUEPRINT_BACKUP_DIR || BACKUP_BASE_DIR;
35793
35840
  }
@@ -35834,7 +35881,7 @@ var MANAGED_FOLDERS = [".claude", ".codex", ".agents"];
35834
35881
  async function copyForBackup(sourcePath, destPath) {
35835
35882
  await import_fs_extra12.default.copy(sourcePath, destPath, {
35836
35883
  overwrite: true,
35837
- dereference: os14.platform() === "win32"
35884
+ dereference: os15.platform() === "win32"
35838
35885
  });
35839
35886
  }
35840
35887
  async function hasMeaningfulContent(dir) {
@@ -36560,7 +36607,7 @@ async function ensureBackupPath(result, dryRun = false) {
36560
36607
  }
36561
36608
  async function createDirectorySymlink(source, target) {
36562
36609
  await import_fs_extra13.default.ensureDir(path17.dirname(target));
36563
- if (os15.platform() === "win32") {
36610
+ if (os16.platform() === "win32") {
36564
36611
  await import_fs_extra13.default.symlink(source, target, "junction");
36565
36612
  return;
36566
36613
  }
@@ -36568,7 +36615,7 @@ async function createDirectorySymlink(source, target) {
36568
36615
  }
36569
36616
  async function createFileSymlink(source, target) {
36570
36617
  await import_fs_extra13.default.ensureDir(path17.dirname(target));
36571
- if (os15.platform() === "win32") {
36618
+ if (os16.platform() === "win32") {
36572
36619
  await import_fs_extra13.default.symlink(source, target, "file");
36573
36620
  return;
36574
36621
  }
@@ -37274,7 +37321,7 @@ Codex agents render failed:`), error);
37274
37321
  // src/lib/session-unifier.ts
37275
37322
  var import_fs_extra14 = __toESM(require_lib4(), 1);
37276
37323
  import crypto2 from "crypto";
37277
- import os16 from "os";
37324
+ import os17 from "os";
37278
37325
  import path18 from "path";
37279
37326
  var MANAGED_FOLDERS2 = [".claude", ".codex", ".agents"];
37280
37327
  var SESSION_PATHS = {
@@ -37298,7 +37345,7 @@ async function collectSnapshotSources(folders) {
37298
37345
  ...await listSnapshotSources(storePaths.configsDir, "config"),
37299
37346
  ...await listSnapshotSources(storePaths.backupsDir, "backup")
37300
37347
  ];
37301
- if (path18.resolve(folders.rootDir) === os16.homedir()) {
37348
+ if (path18.resolve(folders.rootDir) === os17.homedir()) {
37302
37349
  sources.push(...await listSnapshotSources(getBackupDir(), "legacy-backup"));
37303
37350
  }
37304
37351
  return sources.sort((a, b) => a.name.localeCompare(b.name));
@@ -37571,7 +37618,7 @@ import path21 from "path";
37571
37618
 
37572
37619
  // src/lib/pro-installer.ts
37573
37620
  var import_fs_extra15 = __toESM(require_lib4(), 1);
37574
- import os17 from "os";
37621
+ import os18 from "os";
37575
37622
  import path19 from "path";
37576
37623
  import { exec as exec3, execFile } from "child_process";
37577
37624
  import { promisify as promisify2 } from "util";
@@ -37604,7 +37651,7 @@ function routePath(relativePath) {
37604
37651
  return { kind: "claude", relativePath };
37605
37652
  }
37606
37653
  function getCacheRepoDir() {
37607
- return path19.join(os17.homedir(), ".config", "aiblueprint", "pro-repos", "aiblueprint-cli-premium");
37654
+ return path19.join(os18.homedir(), ".config", "aiblueprint", "pro-repos", "aiblueprint-cli-premium");
37608
37655
  }
37609
37656
  async function execGitWithAuth(command, token, repoUrl, cwd) {
37610
37657
  const authenticatedUrl = `https://x-access-token:${token}@${repoUrl.replace(/^https?:\/\//, "")}`;
@@ -37775,7 +37822,7 @@ async function installProConfigs(options) {
37775
37822
  } catch (error) {
37776
37823
  console.warn("Git caching failed, falling back to API download");
37777
37824
  }
37778
- const tempDir = path19.join(os17.tmpdir(), `aiblueprint-premium-${Date.now()}`);
37825
+ const tempDir = path19.join(os18.tmpdir(), `aiblueprint-premium-${Date.now()}`);
37779
37826
  try {
37780
37827
  let success = false;
37781
37828
  for (const candidate of CONFIG_FOLDER_CANDIDATES2) {
@@ -37809,7 +37856,7 @@ async function syncAllAgentSymlinks(agentsDir, claudeDir) {
37809
37856
  }
37810
37857
  }
37811
37858
  function getAssistantProCacheDir() {
37812
- return path19.join(os17.homedir(), ".config", "aiblueprint", "pro-repos", "assistant-pro-skills");
37859
+ return path19.join(os18.homedir(), ".config", "aiblueprint", "pro-repos", "assistant-pro-skills");
37813
37860
  }
37814
37861
  async function runAuthenticatedGit(args, token, cwd) {
37815
37862
  const authorization = Buffer.from(`x-access-token:${token}`).toString("base64");
@@ -37880,7 +37927,7 @@ function isYamlContentLine(line) {
37880
37927
  async function ensureHermesExternalSkillsDir(hermesDir, agentsSkillsDir) {
37881
37928
  const configPath = path19.join(hermesDir, "config.yaml");
37882
37929
  const resolvedSkillsDir = path19.resolve(agentsSkillsDir);
37883
- const defaultSkillsDir = path19.join(os17.homedir(), ".agents", "skills");
37930
+ const defaultSkillsDir = path19.join(os18.homedir(), ".agents", "skills");
37884
37931
  const configuredPath = resolvedSkillsDir === defaultSkillsDir ? "~/.agents/skills" : resolvedSkillsDir;
37885
37932
  const yamlEntry = ` - ${JSON.stringify(configuredPath)}`;
37886
37933
  await import_fs_extra15.default.ensureDir(hermesDir);
@@ -37969,15 +38016,15 @@ async function configureAssistantProConsumers(options) {
37969
38016
 
37970
38017
  // src/lib/token-storage.ts
37971
38018
  var import_fs_extra16 = __toESM(require_lib4(), 1);
37972
- import os18 from "os";
38019
+ import os19 from "os";
37973
38020
  import path20 from "path";
37974
38021
  function getConfigDir() {
37975
- const platform = os18.platform();
38022
+ const platform = os19.platform();
37976
38023
  if (platform === "win32") {
37977
- const appData = process.env.APPDATA || path20.join(os18.homedir(), "AppData", "Roaming");
38024
+ const appData = process.env.APPDATA || path20.join(os19.homedir(), "AppData", "Roaming");
37978
38025
  return path20.join(appData, "aiblueprint");
37979
38026
  } else {
37980
- const configHome = process.env.XDG_CONFIG_HOME || path20.join(os18.homedir(), ".config");
38027
+ const configHome = process.env.XDG_CONFIG_HOME || path20.join(os19.homedir(), ".config");
37981
38028
  return path20.join(configHome, "aiblueprint");
37982
38029
  }
37983
38030
  }
@@ -38033,13 +38080,13 @@ async function getAssistantProToken() {
38033
38080
  function getTokenInfo() {
38034
38081
  return {
38035
38082
  path: getTokenFilePath2(),
38036
- platform: os18.platform()
38083
+ platform: os19.platform()
38037
38084
  };
38038
38085
  }
38039
38086
  function getAssistantProTokenInfo() {
38040
38087
  return {
38041
38088
  path: getAssistantProTokenFilePath(),
38042
- platform: os18.platform()
38089
+ platform: os19.platform()
38043
38090
  };
38044
38091
  }
38045
38092
 
@@ -39219,19 +39266,19 @@ async function configsBackupsCleanCommand(options = {}) {
39219
39266
  }
39220
39267
 
39221
39268
  // src/commands/openclaw-pro.ts
39222
- import os21 from "os";
39269
+ import os22 from "os";
39223
39270
  import path25 from "path";
39224
39271
 
39225
39272
  // src/lib/openclaw-installer.ts
39226
39273
  var import_fs_extra19 = __toESM(require_lib4(), 1);
39227
- import os19 from "os";
39274
+ import os20 from "os";
39228
39275
  import path23 from "path";
39229
39276
  import { exec as exec4 } from "child_process";
39230
39277
  import { promisify as promisify3 } from "util";
39231
39278
  var execAsync3 = promisify3(exec4);
39232
39279
  var OPENCLAW_PRO_REPO = "Melvynx/openclawpro";
39233
39280
  function getCacheRepoDir2() {
39234
- return path23.join(os19.homedir(), ".config", "openclaw", "pro-repos", "openclawpro");
39281
+ return path23.join(os20.homedir(), ".config", "openclaw", "pro-repos", "openclawpro");
39235
39282
  }
39236
39283
  async function execGitWithAuth2(command, token, repoUrl, cwd) {
39237
39284
  const authenticatedUrl = `https://x-access-token:${token}@${repoUrl.replace(/^https?:\/\//, "")}`;
@@ -39280,7 +39327,7 @@ async function copyConfigFromCache2(cacheConfigDir, targetDir, onProgress) {
39280
39327
  }
39281
39328
  async function installOpenclawProConfigs(options) {
39282
39329
  const { githubToken, openclawFolder, onProgress } = options;
39283
- const targetFolder = openclawFolder || path23.join(os19.homedir(), ".openclaw");
39330
+ const targetFolder = openclawFolder || path23.join(os20.homedir(), ".openclaw");
39284
39331
  try {
39285
39332
  const cacheConfigDir = await cloneOrUpdateRepo2(githubToken);
39286
39333
  await copyConfigFromCache2(cacheConfigDir, targetFolder, onProgress);
@@ -39292,14 +39339,14 @@ async function installOpenclawProConfigs(options) {
39292
39339
 
39293
39340
  // src/lib/openclaw-token-storage.ts
39294
39341
  var import_fs_extra20 = __toESM(require_lib4(), 1);
39295
- import os20 from "os";
39342
+ import os21 from "os";
39296
39343
  import path24 from "path";
39297
39344
  function getConfigDir2() {
39298
- const platform = os20.platform();
39345
+ const platform = os21.platform();
39299
39346
  if (platform === "win32") {
39300
- return path24.join(process.env.APPDATA || os20.homedir(), "openclaw");
39347
+ return path24.join(process.env.APPDATA || os21.homedir(), "openclaw");
39301
39348
  }
39302
- return path24.join(os20.homedir(), ".config", "openclaw");
39349
+ return path24.join(os21.homedir(), ".config", "openclaw");
39303
39350
  }
39304
39351
  function getTokenPath() {
39305
39352
  return path24.join(getConfigDir2(), "token.txt");
@@ -39320,7 +39367,7 @@ async function getOpenclawToken() {
39320
39367
  function getOpenclawTokenInfo() {
39321
39368
  return {
39322
39369
  path: getTokenPath(),
39323
- platform: os20.platform()
39370
+ platform: os21.platform()
39324
39371
  };
39325
39372
  }
39326
39373
 
@@ -39432,7 +39479,7 @@ async function openclawProSetupCommand(options = {}) {
39432
39479
  Se(source_default.red("❌ Not activated"));
39433
39480
  process.exit(1);
39434
39481
  }
39435
- const openclawDir = options.folder ? path25.resolve(options.folder) : path25.join(os21.homedir(), ".openclaw");
39482
+ const openclawDir = options.folder ? path25.resolve(options.folder) : path25.join(os22.homedir(), ".openclaw");
39436
39483
  const spinner = Y2();
39437
39484
  const onProgress = (file, type) => {
39438
39485
  spinner.message(`Installing: ${source_default.cyan(file)} ${source_default.gray(`(${type})`)}`);
@@ -39606,10 +39653,10 @@ var import_fs_extra23 = __toESM(require_lib4(), 1);
39606
39653
  import { spawn as spawn2 } from "child_process";
39607
39654
  import { execSync as execSync4 } from "child_process";
39608
39655
  import path27 from "path";
39609
- import os22 from "os";
39656
+ import os23 from "os";
39610
39657
  function checkCommand2(cmd) {
39611
39658
  try {
39612
- const isWindows = os22.platform() === "win32";
39659
+ const isWindows = os23.platform() === "win32";
39613
39660
  const whichCmd = isWindows ? `where ${cmd}` : `which ${cmd}`;
39614
39661
  execSync4(whichCmd, { stdio: "ignore" });
39615
39662
  return true;