@ichintansoni/skills-master 0.1.4 → 0.1.6

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/bin.js CHANGED
@@ -4,7 +4,7 @@
4
4
  import { Command } from "commander";
5
5
 
6
6
  // package.json
7
- var version = "0.1.4";
7
+ var version = "0.1.6";
8
8
 
9
9
  // src/types.ts
10
10
  var ALL_TARGETS = ["claude", "cursor", "copilot", "agents"];
@@ -1358,8 +1358,8 @@ async function registryBuildCommand(opts) {
1358
1358
  }
1359
1359
 
1360
1360
  // src/commands/marketplace.ts
1361
- import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync5 } from "fs";
1362
- import { dirname as dirname2, join as join11, resolve as resolve2 } from "path";
1361
+ import { existsSync as existsSync11, readdirSync as readdirSync3, readFileSync as readFileSync9, rmSync as rmSync2 } from "fs";
1362
+ import { dirname as dirname2, join as join11, resolve as resolve2, sep } from "path";
1363
1363
  var CLASS_LABEL = {
1364
1364
  code: "code skills (frameworks & APIs)",
1365
1365
  design: "design-review skills",
@@ -1372,6 +1372,8 @@ var CLASS_CATEGORY = {
1372
1372
  "lang-tooling": "development",
1373
1373
  overview: "development"
1374
1374
  };
1375
+ var PLUGINS_DIR = "plugins";
1376
+ var MARKETPLACE_JSON = ".claude-plugin/marketplace.json";
1375
1377
  function pluginName(domain, cls) {
1376
1378
  const clsSeg = cls === "overview" ? "overviews" : cls;
1377
1379
  return `skills-master-${domain}-${clsSeg}`;
@@ -1379,10 +1381,20 @@ function pluginName(domain, cls) {
1379
1381
  function titleCase(s) {
1380
1382
  return s.charAt(0).toUpperCase() + s.slice(1);
1381
1383
  }
1382
- async function marketplaceBuildCommand(opts) {
1383
- const content = await resolveContent({ content: opts.content, cwd: opts.cwd });
1384
- const out = resolve2(opts.out ?? dirname2(content.root));
1385
- const version2 = opts.version ?? "0.1.0";
1384
+ function toPosix(p) {
1385
+ return p.split(sep).join("/");
1386
+ }
1387
+ function listFiles(root, dir, acc = []) {
1388
+ const abs = join11(root, dir);
1389
+ if (!existsSync11(abs)) return acc;
1390
+ for (const entry of readdirSync3(abs, { withFileTypes: true })) {
1391
+ const rel = `${dir}/${entry.name}`;
1392
+ if (entry.isDirectory()) listFiles(root, rel, acc);
1393
+ else acc.push(rel);
1394
+ }
1395
+ return acc;
1396
+ }
1397
+ function buildOutputs(content, out, version2) {
1386
1398
  const groups = /* @__PURE__ */ new Map();
1387
1399
  for (const dir of content.skillDirs()) {
1388
1400
  const skill = content.loadSkill(dir.split(/[\\/]/).pop());
@@ -1392,7 +1404,7 @@ async function marketplaceBuildCommand(opts) {
1392
1404
  const ctx = {
1393
1405
  projectRoot: out,
1394
1406
  paths: {
1395
- claude: `plugins/${name}/skills`,
1407
+ claude: `${PLUGINS_DIR}/${name}/skills`,
1396
1408
  cursor: "",
1397
1409
  copilot: "",
1398
1410
  agents: ""
@@ -1404,38 +1416,87 @@ async function marketplaceBuildCommand(opts) {
1404
1416
  g.count += 1;
1405
1417
  groups.set(key, g);
1406
1418
  }
1419
+ const outFiles = /* @__PURE__ */ new Map();
1420
+ const counts = [];
1407
1421
  const plugins = [];
1408
1422
  for (const { domain, cls, files, count } of groups.values()) {
1409
1423
  const name = pluginName(domain, cls);
1410
- applyFiles(out, files, { overwrite: true });
1424
+ for (const f of files) outFiles.set(toPosix(f.path), f.contents);
1411
1425
  const description = `${titleCase(domain)} ${CLASS_LABEL[cls]}.`;
1412
- const pluginDir = join11(out, "plugins", name, ".claude-plugin");
1413
- mkdirSync2(pluginDir, { recursive: true });
1414
1426
  const manifest = {
1415
1427
  name,
1416
1428
  version: version2,
1417
1429
  description,
1418
1430
  author: { name: "skills-master contributors" }
1419
1431
  };
1420
- writeFileSync5(join11(pluginDir, "plugin.json"), JSON.stringify(manifest, null, 2) + "\n", "utf8");
1421
- plugins.push({ name, source: `./plugins/${name}`, description, version: version2, category: CLASS_CATEGORY[cls] });
1422
- log.info(`Built ${name} (${count} skills).`);
1432
+ outFiles.set(
1433
+ `${PLUGINS_DIR}/${name}/.claude-plugin/plugin.json`,
1434
+ JSON.stringify(manifest, null, 2) + "\n"
1435
+ );
1436
+ plugins.push({ name, source: `./${PLUGINS_DIR}/${name}`, description, version: version2, category: CLASS_CATEGORY[cls] });
1437
+ counts.push({ name, count });
1423
1438
  }
1424
1439
  plugins.sort((a, b) => a.name.localeCompare(b.name));
1440
+ counts.sort((a, b) => a.name.localeCompare(b.name));
1425
1441
  const marketplace2 = {
1426
1442
  $schema: "https://www.schemastore.org/claude-code-marketplace.json",
1427
1443
  name: "skills-master",
1428
1444
  owner: { name: "skills-master contributors" },
1429
1445
  plugins
1430
1446
  };
1431
- const mpDir = join11(out, ".claude-plugin");
1432
- mkdirSync2(mpDir, { recursive: true });
1433
- writeFileSync5(join11(mpDir, "marketplace.json"), JSON.stringify(marketplace2, null, 2) + "\n", "utf8");
1434
- log.success(`Wrote .claude-plugin/marketplace.json (${plugins.length} plugins).`);
1447
+ outFiles.set(MARKETPLACE_JSON, JSON.stringify(marketplace2, null, 2) + "\n");
1448
+ return { files: outFiles, counts, pluginCount: plugins.length };
1449
+ }
1450
+ async function marketplaceBuildCommand(opts) {
1451
+ const content = await resolveContent({ content: opts.content, cwd: opts.cwd });
1452
+ const out = resolve2(opts.out ?? dirname2(content.root));
1453
+ const version2 = opts.version ?? "0.1.0";
1454
+ const { files, counts, pluginCount } = buildOutputs(content, out, version2);
1455
+ const onDisk = new Set(listFiles(out, PLUGINS_DIR));
1456
+ if (existsSync11(join11(out, MARKETPLACE_JSON))) onDisk.add(MARKETPLACE_JSON);
1457
+ if (opts.check) {
1458
+ const missing = [];
1459
+ const differing = [];
1460
+ for (const [rel, contents] of files) {
1461
+ if (!onDisk.has(rel)) {
1462
+ missing.push(rel);
1463
+ continue;
1464
+ }
1465
+ if (readFileSync9(join11(out, rel), "utf8") !== contents) differing.push(rel);
1466
+ }
1467
+ const stale2 = [...onDisk].filter((rel) => !files.has(rel)).sort();
1468
+ if (missing.length || differing.length || stale2.length) {
1469
+ log.error(
1470
+ `Marketplace output is out of date (${missing.length} missing, ${differing.length} changed, ${stale2.length} stale) \u2014 run \`pnpm skills:marketplace\` and commit the result.`
1471
+ );
1472
+ for (const rel of missing.sort().slice(0, 10)) log.error(` missing: ${rel}`);
1473
+ for (const rel of differing.sort().slice(0, 10)) log.error(` changed: ${rel}`);
1474
+ for (const rel of stale2.slice(0, 10)) log.error(` stale: ${rel}`);
1475
+ return false;
1476
+ }
1477
+ log.success(`Marketplace output is up to date (${pluginCount} plugins, ${files.size} files).`);
1478
+ return true;
1479
+ }
1480
+ const stale = [...onDisk].filter((rel) => !files.has(rel)).sort();
1481
+ for (const rel of stale) rmSync2(join11(out, rel), { force: true });
1482
+ pruneEmptyDirsUnder(join11(out, PLUGINS_DIR));
1483
+ const emitted = [...files].map(([path, contents]) => ({ path, contents, mode: "whole" }));
1484
+ applyFiles(out, emitted, { overwrite: true });
1485
+ for (const { name, count } of counts) log.info(`Built ${name} (${count} skills).`);
1486
+ if (stale.length) log.info(`Removed ${stale.length} stale file(s).`);
1487
+ log.success(`Wrote ${MARKETPLACE_JSON} (${pluginCount} plugins, ${files.size} files).`);
1488
+ return true;
1489
+ }
1490
+ function pruneEmptyDirsUnder(root) {
1491
+ if (!existsSync11(root)) return;
1492
+ for (const entry of readdirSync3(root, { withFileTypes: true })) {
1493
+ if (entry.isDirectory()) pruneEmptyDirsUnder(join11(root, entry.name));
1494
+ }
1495
+ if (readdirSync3(root).length === 0) rmSync2(root, { recursive: true, force: true });
1435
1496
  }
1436
1497
 
1437
1498
  // src/commands/new.ts
1438
- import { existsSync as existsSync11, mkdirSync as mkdirSync3, writeFileSync as writeFileSync6 } from "fs";
1499
+ import { existsSync as existsSync12, mkdirSync as mkdirSync2, writeFileSync as writeFileSync5 } from "fs";
1439
1500
  import { join as join12 } from "path";
1440
1501
  function template(domain, cls, category, name) {
1441
1502
  const today2 = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
@@ -1497,11 +1558,11 @@ async function newSkillCommand(opts) {
1497
1558
  const content = await resolveContent({ content: opts.content, cwd: opts.cwd });
1498
1559
  const dir = join12(content.root, domain, CLASS_DIR[cls], ...parts.slice(2));
1499
1560
  const skillMd = join12(dir, "SKILL.md");
1500
- if (existsSync11(skillMd) && !opts.force) {
1561
+ if (existsSync12(skillMd) && !opts.force) {
1501
1562
  throw new Error(`Skill already exists at ${skillMd} (use --force to overwrite).`);
1502
1563
  }
1503
- mkdirSync3(dir, { recursive: true });
1504
- writeFileSync6(skillMd, template(domain, cls, category, name), "utf8");
1564
+ mkdirSync2(dir, { recursive: true });
1565
+ writeFileSync5(skillMd, template(domain, cls, category, name), "utf8");
1505
1566
  log.success(`Created ${skillMd}`);
1506
1567
  return skillMd;
1507
1568
  }
@@ -1607,9 +1668,16 @@ registry.command("build").description("Generate registry.json from the skill tre
1607
1668
  )
1608
1669
  );
1609
1670
  var marketplace = program.command("marketplace").description("Claude marketplace maintenance");
1610
- marketplace.command("build").description("Generate .claude-plugin/marketplace.json and per-class plugins").option("--content <dir>").option("--out <dir>", "output root").option("--version <v>").action(
1671
+ marketplace.command("build").description("Generate .claude-plugin/marketplace.json and per-class plugins").option("--content <dir>").option("--out <dir>", "output root").option("--check", "verify the committed marketplace output is current (CI)").option("--version <v>").action(
1611
1672
  (opts) => run(
1612
- () => marketplaceBuildCommand({ cwd: process.cwd(), content: opts.content, out: opts.out, version: opts.version })
1673
+ () => marketplaceBuildCommand({
1674
+ cwd: process.cwd(),
1675
+ content: opts.content,
1676
+ out: opts.out,
1677
+ check: opts.check,
1678
+ version: opts.version
1679
+ }),
1680
+ true
1613
1681
  )
1614
1682
  );
1615
1683
  program.parseAsync(process.argv);
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts","../package.json","../src/types.ts","../src/schema/projectConfig.ts","../src/core/yaml.ts","../src/emitters/util.ts","../src/emitters/claude.ts","../src/core/condense.ts","../src/emitters/cursor.ts","../src/emitters/copilot.ts","../src/emitters/agents.ts","../src/emitters/index.ts","../src/core/project.ts","../src/schema/lockfile.ts","../src/util/log.ts","../src/commands/init.ts","../src/content/source.ts","../src/core/discover.ts","../src/core/parse.ts","../src/schema/frontmatter.ts","../src/core/registry-build.ts","../src/core/install.ts","../src/core/compile.ts","../src/core/writer.ts","../src/core/markers.ts","../src/core/hash.ts","../src/core/gitignore.ts","../src/commands/add.ts","../src/commands/update.ts","../src/commands/remove.ts","../src/commands/doctor.ts","../src/commands/catalog.ts","../src/core/lint.ts","../src/commands/lint.ts","../src/commands/registry.ts","../src/schema/registry.ts","../src/commands/marketplace.ts","../src/commands/new.ts"],"sourcesContent":["import { Command } from \"commander\";\n// Single source of truth for the version. release.yml rewrites this\n// package.json before running the build, so the bundle carries the\n// released version; a literal here would silently report a stale one.\nimport { version } from \"../package.json\";\nimport { ALL_TARGETS, type TargetId } from \"./types\";\nimport { initCommand } from \"./commands/init\";\nimport { addCommand } from \"./commands/add\";\nimport { updateCommand } from \"./commands/update\";\nimport { removeCommand } from \"./commands/remove\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport { listCommand, searchCommand, viewCommand } from \"./commands/catalog\";\nimport { lintCommand } from \"./commands/lint\";\nimport { registryBuildCommand } from \"./commands/registry\";\nimport { marketplaceBuildCommand } from \"./commands/marketplace\";\nimport { newSkillCommand } from \"./commands/new\";\nimport { log } from \"./util/log\";\n\nconst VALID = new Set<string>(ALL_TARGETS);\n\nfunction parseTargets(value?: string): TargetId[] | undefined {\n if (!value) return undefined;\n if (value === \"all\") return ALL_TARGETS;\n const ids = value.split(\",\").map((s) => s.trim()).filter(Boolean);\n for (const id of ids) {\n if (!VALID.has(id)) {\n throw new Error(`Unknown target \"${id}\". Valid: ${[...VALID, \"all\"].join(\", \")}.`);\n }\n }\n return ids as TargetId[];\n}\n\nasync function run(fn: () => Promise<unknown> | unknown, exitOnFalse = false): Promise<void> {\n try {\n const result = await fn();\n if (exitOnFalse && result === false) process.exitCode = 1;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n\nconst program = new Command();\nprogram\n .name(\"skills-master\")\n .description(\"Install tool-agnostic Apple & Android development skills into any AI coding tool.\")\n .version(version);\n\nprogram\n .command(\"init\")\n .description(\"Detect tools and write skills-master.json\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--ref <ref>\", \"content git ref\")\n .option(\"--no-commit\", \"gitignore generated files instead of committing them\")\n .option(\"--force\", \"overwrite an existing config\")\n .action((opts) =>\n run(() =>\n initCommand({\n cwd: process.cwd(),\n targets: parseTargets(opts.target),\n commit: opts.commit,\n contentRef: opts.ref,\n force: opts.force,\n }),\n ),\n );\n\nprogram\n .command(\"list\")\n .description(\"List available skills\")\n .option(\"--domain <domain>\", \"e.g. apple, android\")\n .option(\"--class <class>\")\n .option(\"--category <category>\")\n .option(\"--platform <platform>\")\n .option(\"--json\")\n .option(\"--content <dir>\", \"local skills directory\")\n .option(\"--ref <ref>\")\n .action((opts) =>\n run(() =>\n listCommand({\n cwd: process.cwd(),\n domain: opts.domain,\n class: opts.class,\n category: opts.category,\n platform: opts.platform,\n json: opts.json,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"search <query>\")\n .description(\"Search skills by name, description, tags\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((query, opts) =>\n run(() => searchCommand({ cwd: process.cwd(), query, content: opts.content, ref: opts.ref })),\n );\n\nprogram\n .command(\"view <name>\")\n .description(\"Show a skill's metadata and body\")\n .option(\"--raw\", \"print the raw SKILL.md body\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((name, opts) =>\n run(() =>\n viewCommand({ cwd: process.cwd(), name, raw: opts.raw, content: opts.content, ref: opts.ref }),\n ),\n );\n\nprogram\n .command(\"add <names...>\")\n .description(\"Install skills (by name, category, or class) into your tools\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--with-pairs\", \"also install paired (code<->design) skills\")\n .option(\"--dry-run\", \"preview without writing\")\n .option(\"--overwrite\", \"overwrite changed files without asking\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((names, opts) =>\n run(() =>\n addCommand({\n cwd: process.cwd(),\n names,\n targets: parseTargets(opts.target),\n withPairs: opts.withPairs,\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"update [names...]\")\n .description(\"Re-install skills whose content changed\")\n .option(\"--dry-run\")\n .option(\"--overwrite\", \"force re-install, replacing local edits\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((names, opts) =>\n run(() =>\n updateCommand({\n cwd: process.cwd(),\n names,\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"remove <names...>\")\n .description(\"Remove installed skills\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--dry-run\")\n .action((names, opts) =>\n run(() =>\n removeCommand({ cwd: process.cwd(), names, targets: parseTargets(opts.target), dryRun: opts.dryRun }),\n ),\n );\n\nprogram\n .command(\"doctor\")\n .description(\"Check installed skills for drift and missing files\")\n .action(() => run(() => doctorCommand({ cwd: process.cwd() })));\n\nprogram\n .command(\"lint\")\n .description(\"Validate the skill library (maintainer command)\")\n .option(\"--content <dir>\")\n .action((opts) => run(() => lintCommand({ cwd: process.cwd(), content: opts.content }), true));\n\nprogram\n .command(\"new <spec>\")\n .description(\"Scaffold a new skill: class/category/name (maintainer command)\")\n .option(\"--content <dir>\")\n .option(\"--force\")\n .action((spec, opts) =>\n run(() => newSkillCommand({ cwd: process.cwd(), spec, content: opts.content, force: opts.force })),\n );\n\nconst registry = program.command(\"registry\").description(\"Registry maintenance\");\nregistry\n .command(\"build\")\n .description(\"Generate registry.json from the skill tree\")\n .option(\"--content <dir>\")\n .option(\"--check\", \"verify the committed registry.json is current (CI)\")\n .option(\"--version <v>\")\n .action((opts) =>\n run(\n () => registryBuildCommand({ cwd: process.cwd(), content: opts.content, check: opts.check, version: opts.version }),\n true,\n ),\n );\n\nconst marketplace = program.command(\"marketplace\").description(\"Claude marketplace maintenance\");\nmarketplace\n .command(\"build\")\n .description(\"Generate .claude-plugin/marketplace.json and per-class plugins\")\n .option(\"--content <dir>\")\n .option(\"--out <dir>\", \"output root\")\n .option(\"--version <v>\")\n .action((opts) =>\n run(() =>\n marketplaceBuildCommand({ cwd: process.cwd(), content: opts.content, out: opts.out, version: opts.version }),\n ),\n );\n\nprogram.parseAsync(process.argv);\n","{\n \"name\": \"@ichintansoni/skills-master\",\n \"version\": \"0.1.4\",\n \"description\": \"Install tool-agnostic Apple & Android development skills into any AI coding tool (Claude Code, Cursor, Copilot, AGENTS.md).\",\n \"keywords\": [\n \"skills\",\n \"apple\",\n \"swift\",\n \"swiftui\",\n \"android\",\n \"kotlin\",\n \"jetpack-compose\",\n \"material3\",\n \"claude\",\n \"cursor\",\n \"copilot\",\n \"agents.md\",\n \"ai\",\n \"agent\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Chintan Soni\",\n \"homepage\": \"https://github.com/iChintanSoni/skills-master#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/iChintanSoni/skills-master.git\",\n \"directory\": \"packages/cli\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/iChintanSoni/skills-master/issues\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"skills-master\": \"./dist/bin.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsx src/bin.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublishOnly\": \"tsup\"\n },\n \"dependencies\": {\n \"commander\": \"^15.0.0\",\n \"giget\": \"^3.3.1\",\n \"gray-matter\": \"^4.0.3\",\n \"semver\": \"^7.8.5\",\n \"yaml\": \"^2.5.1\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.1.0\",\n \"@types/semver\": \"^7.8.0\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.23.7\",\n \"typescript\": \"^6.0.3\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","/**\n * Shared types for the skills-master compiler.\n *\n * The canonical authored unit is a *skill*: a directory containing a `SKILL.md`\n * (frontmatter + body) plus optional on-demand resource files. An *emitter*\n * projects a parsed skill into the files a particular AI tool expects.\n */\n\nimport type { Frontmatter } from \"./schema/frontmatter\";\n\nexport type { Frontmatter } from \"./schema/frontmatter\";\n\n/** The four AI-tool targets shipped at launch. */\nexport type TargetId = \"claude\" | \"cursor\" | \"copilot\" | \"agents\";\n\nexport const ALL_TARGETS: TargetId[] = [\"claude\", \"cursor\", \"copilot\", \"agents\"];\n\n/** On-demand \"Level 3\" resource files that may sit beside a SKILL.md. */\nexport interface SkillResources {\n reference?: string;\n examples?: string;\n checklist?: string;\n}\n\nexport const RESOURCE_FILES = {\n reference: \"reference.md\",\n examples: \"examples.md\",\n checklist: \"checklist.md\",\n} as const;\n\nexport type ResourceKey = keyof typeof RESOURCE_FILES;\n\n/** A skill after its SKILL.md and resource files have been read and validated. */\nexport interface ParsedSkill {\n /** kebab-case name; equals the leaf folder name. */\n name: string;\n /** absolute path to the skill's source directory. */\n dir: string;\n /** path relative to the skills root, e.g. `code/app-frameworks/swiftdata-modeling`. */\n relPath: string;\n /** validated, normalized frontmatter. */\n frontmatter: Frontmatter;\n /** markdown body (everything after the frontmatter). */\n body: string;\n /** raw text of any present resource files. */\n resources: SkillResources;\n}\n\n/**\n * Output file modes:\n * - `whole` — the emitter owns the entire file (overwrite as a unit).\n * - `block` — the emitter owns only a marked region inside a shared file.\n */\nexport type FileMode = \"whole\" | \"block\";\n\nexport interface EmittedFile {\n /** path relative to the consuming project root. */\n path: string;\n /** for `whole`: the full file contents. for `block`: the managed region body. */\n contents: string;\n mode: FileMode;\n /** required for `block` mode — identifies the managed region (usually the skill name). */\n blockId?: string;\n /** for `block` mode — written into the BEGIN marker for drift detection. */\n blockVersion?: string;\n}\n\nexport interface EmitContext {\n /** absolute path to the consuming project root. */\n projectRoot: string;\n /** effective per-target output paths (already merged with defaults). */\n paths: Record<TargetId, string>;\n}\n\nexport interface Emitter {\n id: TargetId | (string & {});\n /** human label for logs. */\n label: string;\n /** detect whether this tool is present in a project (used by auto-detect). */\n detect(projectRoot: string): boolean;\n /** project a skill into target files. */\n emit(skill: ParsedSkill, ctx: EmitContext): EmittedFile[];\n}\n\n/** Result of applying a single EmittedFile to disk. */\nexport type WriteAction = \"created\" | \"updated\" | \"unchanged\" | \"skipped\";\n\nexport interface WriteResult {\n path: string;\n mode: FileMode;\n blockId?: string;\n action: WriteAction;\n}\n","import { z } from \"zod\";\nimport type { TargetId } from \"../types\";\n\nexport const TargetIdSchema = z.enum([\"claude\", \"cursor\", \"copilot\", \"agents\"]);\n\n/** Default output location per target, relative to the project root. */\nexport const DEFAULT_PATHS: Record<TargetId, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/rules\",\n copilot: \".github\",\n agents: \"AGENTS.md\",\n};\n\nexport const ProjectConfigSchema = z\n .object({\n $schema: z.string().optional(),\n /** Git ref of the content repo to install from (tag/branch/sha). */\n contentRef: z.string().default(\"main\"),\n /**\n * Targets to emit. Empty array means \"auto-detect on every run\".\n */\n targets: z.array(TargetIdSchema).default([]),\n /** Per-target output path overrides (merged over DEFAULT_PATHS). */\n paths: z\n .object({\n claude: z.string(),\n cursor: z.string(),\n copilot: z.string(),\n agents: z.string(),\n })\n .partial()\n .default({}),\n scope: z.enum([\"project\"]).default(\"project\"),\n /** true = commit generated files; false = add them to .gitignore. */\n commit: z.boolean().default(true),\n })\n .strict();\n\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\nexport const CONFIG_FILENAME = \"skills-master.json\";\nexport const LOCKFILE_NAME = \"skills-master.lock.json\";\n\n/** Resolve effective output paths by merging overrides over the defaults. */\nexport function resolvePaths(cfg: ProjectConfig): Record<TargetId, string> {\n return { ...DEFAULT_PATHS, ...cfg.paths } as Record<TargetId, string>;\n}\n","import YAML from \"yaml\";\n\n/**\n * Serialize a frontmatter object to a deterministic YAML block (no `---` fences).\n * Insertion order of keys is preserved, so emitters control field order.\n * Long strings are not wrapped (lineWidth: 0), keeping descriptions on one line.\n */\nexport function toYaml(obj: Record<string, unknown>): string {\n return YAML.stringify(obj, { lineWidth: 0 }).trimEnd();\n}\n\n/** Wrap a YAML block in `---` fences for embedding at the top of a Markdown file. */\nexport function frontmatterBlock(obj: Record<string, unknown>): string {\n return `---\\n${toYaml(obj)}\\n---`;\n}\n\n/**\n * Build a full Markdown document from a frontmatter object and a body.\n * Guarantees exactly one blank line between the frontmatter and the body.\n */\nexport function withFrontmatter(obj: Record<string, unknown>, body: string): string {\n return `${frontmatterBlock(obj)}\\n\\n${body.trim()}\\n`;\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Frontmatter } from \"../schema/frontmatter\";\n\n/** True when `rel` exists under the project root (used for tool auto-detection). */\nexport function existsRel(root: string, rel: string): boolean {\n return existsSync(join(root, rel));\n}\n\nconst ACRONYMS: Record<string, string> = {\n hig: \"HIG\",\n ui: \"UI\",\n ml: \"ML\",\n ar: \"AR\",\n av: \"AV\",\n os: \"OS\",\n ci: \"CI\",\n cd: \"CD\",\n url: \"URL\",\n api: \"API\",\n sf: \"SF\",\n spm: \"SPM\",\n ios: \"iOS\",\n ipados: \"iPadOS\",\n macos: \"macOS\",\n tvos: \"tvOS\",\n visionos: \"visionOS\",\n watchos: \"watchOS\",\n};\n\n/** Human title derived from a kebab-case skill name (e.g. \"hig-sheets\" → \"HIG Sheets\"). */\nexport function titleFromName(name: string): string {\n return name\n .split(\"-\")\n .filter(Boolean)\n .map((w) => ACRONYMS[w] ?? w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\n/** Comma-join a skill's globs, or undefined if it declares none. */\nexport function globsToString(fm: Frontmatter): string | undefined {\n const g = fm.globs;\n if (!g || g.length === 0) return undefined;\n return g.join(\",\");\n}\n\n/** True when the skill ships any on-demand resource files. */\nexport function hasResources(resources: {\n reference?: string;\n examples?: string;\n checklist?: string;\n}): boolean {\n return Boolean(resources.reference || resources.examples || resources.checklist);\n}\n","import { RESOURCE_FILES, type Emitter, type EmittedFile, type ResourceKey } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { existsRel } from \"./util\";\n\n/**\n * Claude Code emitter — the lossless, native projection.\n * Writes `.claude/skills/<name>/SKILL.md` plus verbatim copies of any resource\n * files, preserving progressive disclosure. The `x-skills-master` block is\n * dropped; the body (including links to resource files, which are co-located)\n * is kept exactly.\n */\nexport const claudeEmitter: Emitter = {\n id: \"claude\",\n label: \"Claude Code\",\n detect: (root) => existsRel(root, \".claude\"),\n emit(skill, ctx): EmittedFile[] {\n const dir = `${ctx.paths.claude}/${skill.name}`;\n const fm = {\n name: skill.frontmatter.name,\n description: skill.frontmatter.description,\n };\n const files: EmittedFile[] = [\n {\n path: `${dir}/SKILL.md`,\n contents: withFrontmatter(fm, skill.body),\n mode: \"whole\",\n },\n ];\n for (const key of Object.keys(RESOURCE_FILES) as ResourceKey[]) {\n const text = skill.resources[key];\n if (text) {\n files.push({\n path: `${dir}/${RESOURCE_FILES[key]}`,\n contents: text.trimEnd() + \"\\n\",\n mode: \"whole\",\n });\n }\n }\n return files;\n },\n};\n","/**\n * Condense a canonical SKILL.md body for single-file targets (Cursor, Copilot,\n * AGENTS.md) that cannot carry on-demand resource files.\n *\n * - Links to reference.md / examples.md / checklist.md are flattened to plain\n * text and a one-line pointer to the full skill is appended (\"drop-and-note\").\n * - The `## Open question` section can optionally be summarized to a single\n * tradeoff line for terse targets.\n */\n\n// The character classes deliberately exclude their own delimiters and newlines.\n// A link-text class of [^\\]]+ can match \"[\", which makes every \"[\" an overlapping\n// restart position and the whole scan quadratic on adversarial input\n// (CodeQL js/polynomial-redos). Excluding \"[\" keeps restarts disjoint, so\n// matching stays linear. Markdown link text may not span lines here either.\nconst L3_LINK_RE =\n /\\[([^\\][\\n]+)\\]\\((?:\\.\\/)?(reference|examples|checklist)\\.md(?:#[^()\\n]*)?\\)/g;\n\nexport interface CondenseOptions {\n /** \"keep\" (default) leaves the section intact; \"summarize\" collapses it. */\n openQuestion?: \"keep\" | \"summarize\";\n /** whether the source skill had any resource files (drives the pointer note). */\n hadResources?: boolean;\n /** how to refer to the full skill in the appended note. */\n fullSkillNote?: string;\n}\n\nconst DEFAULT_NOTE =\n \"Extended reference and worked examples are available in the full Claude Code skill for this topic.\";\n\nexport function condenseBody(body: string, opts: CondenseOptions = {}): string {\n let out = body;\n let strippedLink = false;\n\n out = out.replace(L3_LINK_RE, (_m, text: string) => {\n strippedLink = true;\n return text;\n });\n\n if (opts.openQuestion === \"summarize\") {\n out = summarizeOpenQuestion(out);\n }\n\n out = out.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\n if (opts.hadResources || strippedLink) {\n out += `\\n\\n> ${opts.fullSkillNote ?? DEFAULT_NOTE}`;\n }\n\n return out + \"\\n\";\n}\n\nfunction summarizeOpenQuestion(body: string): string {\n const re = /^## Open question[ \\t]*\\n([\\s\\S]*?)(?=\\n## |\\s*$)/m;\n return body.replace(re, (_m, section: string) => {\n const firstPara = section.trim().split(/\\n\\s*\\n/)[0]?.replace(/\\s+/g, \" \").trim() ?? \"\";\n return `## Open question\\n\\nTradeoff: ${firstPara}\\n`;\n });\n}\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, globsToString, hasResources } from \"./util\";\n\n/**\n * Cursor emitter — `.cursor/rules/<name>.mdc`, a single file.\n * Frontmatter is exactly the three fields Cursor understands:\n * - `globs` present → Auto-Attached rule\n * - `globs` absent → Agent-Requested rule (description-driven)\n * A skills library never sets `alwaysApply: true` (that would inject every\n * skill into every chat).\n */\nexport const cursorEmitter: Emitter = {\n id: \"cursor\",\n label: \"Cursor\",\n detect: (root) => existsRel(root, \".cursor\"),\n emit(skill, ctx): EmittedFile[] {\n const globs = globsToString(skill.frontmatter);\n const fm: Record<string, unknown> = {\n description: skill.frontmatter.description,\n };\n if (globs) fm.globs = globs;\n fm.alwaysApply = false;\n\n const body = condenseBody(skill.body, {\n openQuestion: \"keep\",\n hadResources: hasResources(skill.resources),\n });\n\n return [\n {\n path: `${ctx.paths.cursor}/${skill.name}.mdc`,\n contents: withFrontmatter(fm, body),\n mode: \"whole\",\n },\n ];\n },\n};\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, globsToString, hasResources, titleFromName } from \"./util\";\n\n/**\n * GitHub Copilot emitter — two outputs:\n * 1. `.github/instructions/<name>.instructions.md` (whole file) with the\n * required `applyTo` glob and the condensed body.\n * 2. a one-line pointer block in `.github/copilot-instructions.md` (managed\n * via sentinel markers) so the always-loaded root file stays small.\n */\nexport const copilotEmitter: Emitter = {\n id: \"copilot\",\n label: \"GitHub Copilot\",\n detect: (root) => existsRel(root, \".github\"),\n emit(skill, ctx): EmittedFile[] {\n const base = ctx.paths.copilot; // e.g. \".github\"\n const instructionsPath = `${base}/instructions/${skill.name}.instructions.md`;\n const applyTo = globsToString(skill.frontmatter) ?? \"**\";\n\n const fm = {\n applyTo,\n description: skill.frontmatter.description,\n };\n const body = condenseBody(skill.body, {\n openQuestion: \"keep\",\n hadResources: hasResources(skill.resources),\n });\n\n const pointer = `For ${titleFromName(skill.name)} guidance, see \\`${instructionsPath}\\`.`;\n\n return [\n {\n path: instructionsPath,\n contents: withFrontmatter(fm, body),\n mode: \"whole\",\n },\n {\n path: `${base}/copilot-instructions.md`,\n contents: pointer,\n mode: \"block\",\n blockId: skill.name,\n blockVersion: skill.frontmatter[\"x-skills-master\"].version,\n },\n ];\n },\n};\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, hasResources, titleFromName } from \"./util\";\n\n/**\n * AGENTS.md emitter — the broad cross-tool standard. Plain Markdown, no\n * frontmatter (per the spec). Each skill becomes a `###` section inside a\n * sentinel-managed block so installs compose and updates stay surgical.\n * Bodies are summarized aggressively (this file is read in full by many tools).\n */\nexport const agentsEmitter: Emitter = {\n id: \"agents\",\n label: \"AGENTS.md\",\n detect: (root) => existsRel(root, \"AGENTS.md\"),\n emit(skill, ctx): EmittedFile[] {\n const body = condenseBody(skill.body, {\n openQuestion: \"summarize\",\n hadResources: hasResources(skill.resources),\n });\n const section = `### ${titleFromName(skill.name)}\\n\\n${body.trim()}`;\n return [\n {\n path: ctx.paths.agents,\n contents: section,\n mode: \"block\",\n blockId: skill.name,\n blockVersion: skill.frontmatter[\"x-skills-master\"].version,\n },\n ];\n },\n};\n","import type { Emitter, TargetId } from \"../types\";\nimport { claudeEmitter } from \"./claude\";\nimport { cursorEmitter } from \"./cursor\";\nimport { copilotEmitter } from \"./copilot\";\nimport { agentsEmitter } from \"./agents\";\n\n/**\n * The emitter registry. Adding support for a new tool (Windsurf, Cline, …) is a\n * one-line change here plus a new emitter file — the rest of the pipeline is\n * generic over the `Emitter` interface.\n */\nexport const EMITTERS: Emitter[] = [\n claudeEmitter,\n cursorEmitter,\n copilotEmitter,\n agentsEmitter,\n];\n\nconst BY_ID = new Map<string, Emitter>(EMITTERS.map((e) => [e.id, e]));\n\nexport function getEmitter(id: string): Emitter | undefined {\n return BY_ID.get(id);\n}\n\n/** Detect which targets are present in a project. */\nexport function detectTargets(projectRoot: string): TargetId[] {\n return EMITTERS.filter((e) => e.detect(projectRoot)).map((e) => e.id as TargetId);\n}\n\nexport { claudeEmitter, cursorEmitter, copilotEmitter, agentsEmitter };\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n CONFIG_FILENAME,\n LOCKFILE_NAME,\n ProjectConfigSchema,\n type ProjectConfig,\n} from \"../schema/projectConfig\";\nimport { LockfileSchema, emptyLockfile, type Lockfile } from \"../schema/lockfile\";\n\nexport function configPath(root: string): string {\n return join(root, CONFIG_FILENAME);\n}\nexport function lockfilePath(root: string): string {\n return join(root, LOCKFILE_NAME);\n}\n\nexport function loadConfig(root: string): ProjectConfig | null {\n const p = configPath(root);\n if (!existsSync(p)) return null;\n return ProjectConfigSchema.parse(JSON.parse(readFileSync(p, \"utf8\")));\n}\n\n/** Load config, or return parsed defaults if none exists. */\nexport function loadConfigOrDefault(root: string): ProjectConfig {\n return loadConfig(root) ?? ProjectConfigSchema.parse({});\n}\n\nexport function saveConfig(root: string, cfg: ProjectConfig): void {\n const withSchema = { $schema: \"https://skills-master.dev/schema/config.json\", ...cfg };\n writeFileSync(configPath(root), JSON.stringify(withSchema, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport function loadLockfile(root: string): Lockfile {\n const p = lockfilePath(root);\n if (!existsSync(p)) return emptyLockfile();\n return LockfileSchema.parse(JSON.parse(readFileSync(p, \"utf8\")));\n}\n\nexport function saveLockfile(root: string, lock: Lockfile): void {\n writeFileSync(lockfilePath(root), JSON.stringify(lock, null, 2) + \"\\n\", \"utf8\");\n}\n","import { z } from \"zod\";\n\n/** Records, per target, which files an install produced and their content hash. */\nexport const EmittedTargetSchema = z.object({\n /** whole-file outputs owned by this target for this skill. */\n files: z.array(z.string()).default([]),\n /** shared file this skill writes a managed block into (block-mode targets). */\n block: z.string().optional(),\n /** sha256 of the concatenated emitted contents, for drift detection. */\n hash: z.string(),\n});\n\nexport const LockedSkillSchema = z.object({\n /** resolved skill version at install time. */\n version: z.string(),\n /** sha256 of the canonical SKILL.md + resource files at install time. */\n sourceHash: z.string(),\n /** targets this skill was emitted to. */\n emitted: z.record(z.string(), EmittedTargetSchema),\n});\n\nexport const LockfileSchema = z.object({\n lockfileVersion: z.literal(1).default(1),\n contentRef: z.string().default(\"main\"),\n skills: z.record(z.string(), LockedSkillSchema).default({}),\n});\n\nexport type EmittedTarget = z.infer<typeof EmittedTargetSchema>;\nexport type LockedSkill = z.infer<typeof LockedSkillSchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\n\nexport function emptyLockfile(contentRef = \"main\"): Lockfile {\n return { lockfileVersion: 1, contentRef, skills: {} };\n}\n","/* Minimal, dependency-free logger so core modules don't couple to a prompt lib. */\n\nlet quiet = false;\nexport function setQuiet(v: boolean): void {\n quiet = v;\n}\n\nconst sym = {\n info: \"•\",\n ok: \"✓\",\n warn: \"!\",\n err: \"✗\",\n};\n\nexport const log = {\n plain(msg: string): void {\n if (!quiet) console.log(msg);\n },\n info(msg: string): void {\n if (!quiet) console.log(`${sym.info} ${msg}`);\n },\n success(msg: string): void {\n if (!quiet) console.log(`${sym.ok} ${msg}`);\n },\n warn(msg: string): void {\n if (!quiet) console.warn(`${sym.warn} ${msg}`);\n },\n error(msg: string): void {\n console.error(`${sym.err} ${msg}`);\n },\n};\n","import { ProjectConfigSchema, type ProjectConfig } from \"../schema/projectConfig\";\nimport { ALL_TARGETS, type TargetId } from \"../types\";\nimport { detectTargets } from \"../emitters\";\nimport { loadConfig, saveConfig } from \"../core/project\";\nimport { log } from \"../util/log\";\n\nexport interface InitOptions {\n cwd: string;\n /** explicit target set; if omitted, auto-detect (falling back to all). */\n targets?: TargetId[];\n commit?: boolean;\n contentRef?: string;\n force?: boolean;\n}\n\nexport function initCommand(opts: InitOptions): ProjectConfig {\n const existing = loadConfig(opts.cwd);\n if (existing && !opts.force) {\n log.warn(`skills-master.json already exists — leaving it untouched (use --force to overwrite).`);\n return existing;\n }\n\n let targets = opts.targets;\n if (!targets || targets.length === 0) {\n const detected = detectTargets(opts.cwd);\n if (detected.length > 0) {\n targets = detected;\n log.info(`Detected tools: ${detected.join(\", \")}`);\n } else {\n targets = ALL_TARGETS;\n log.info(`No tools detected — defaulting to all targets (${ALL_TARGETS.join(\", \")}).`);\n }\n }\n\n const cfg = ProjectConfigSchema.parse({\n contentRef: opts.contentRef ?? \"main\",\n targets,\n commit: opts.commit ?? true,\n });\n saveConfig(opts.cwd, cfg);\n log.success(`Wrote skills-master.json (targets: ${targets.join(\", \")}, commit: ${cfg.commit}).`);\n return cfg;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, isAbsolute, join, resolve } from \"node:path\";\nimport { findSkillDirs } from \"../core/discover\";\nimport { loadSkill } from \"../core/parse\";\nimport { buildRegistry } from \"../core/registry-build\";\nimport type { Registry } from \"../schema/registry\";\nimport type { ParsedSkill } from \"../types\";\n\n/** Default content repo (override with SKILLS_MASTER_REPO). */\nconst DEFAULT_REPO = \"github:iChintanSoni/skills-master\";\n\n/** package.json `name` that identifies the skills-master content repo (dev checkout). */\nconst CONTENT_REPO_PACKAGE = \"skills-master-monorepo\";\n\n/** A resolved, on-disk skills tree the CLI reads from. */\nexport class ContentSource {\n constructor(public readonly root: string) {}\n\n skillDirs(): string[] {\n return findSkillDirs(this.root);\n }\n\n findDir(name: string): string | undefined {\n const dirs = this.skillDirs();\n return dirs.find((d) => basename(d) === name) ?? dirs.find((d) => safeName(d, this.root) === name);\n }\n\n loadSkill(name: string): ParsedSkill {\n const dir = this.findDir(name);\n if (!dir) throw new Error(`Skill \"${name}\" not found in content at ${this.root}`);\n return loadSkill(dir, this.root);\n }\n\n registry(): Registry {\n return buildRegistry(this.root);\n }\n}\n\nfunction safeName(dir: string, root: string): string {\n try {\n return loadSkill(dir, root).name;\n } catch {\n return \"\";\n }\n}\n\nexport interface ResolveContentOptions {\n /** explicit path to a local skills directory. */\n content?: string;\n /** git ref for remote fetch. */\n ref?: string;\n /** start dir for the upward repo search. */\n cwd?: string;\n}\n\n/**\n * Resolve where skill content lives, in priority order:\n * 1. explicit `--content <dir>`\n * 2. SKILLS_MASTER_CONTENT env var\n * 3. the skills-master content repo, if running inside it (dev convenience, searched upward)\n * 4. remote fetch via giget (published content)\n */\nexport async function resolveContent(opts: ResolveContentOptions = {}): Promise<ContentSource> {\n if (opts.content) {\n const root = isAbsolute(opts.content) ? opts.content : resolve(process.cwd(), opts.content);\n return new ContentSource(root);\n }\n const env = process.env.SKILLS_MASTER_CONTENT;\n if (env) return new ContentSource(resolve(env));\n\n const local = findLocalSkillsDir(opts.cwd ?? process.cwd());\n if (local) return new ContentSource(local);\n\n return new ContentSource(await fetchRemote(opts.ref ?? \"main\"));\n}\n\n/**\n * Walk upward looking for the skills-master content repo: a root whose\n * `package.json` name is {@link CONTENT_REPO_PACKAGE} and that has a `skills/`\n * subtree. Keying on the package name (not just any pnpm workspace with a\n * `skills/` dir) keeps an unrelated monorepo from hijacking content resolution.\n */\nfunction findLocalSkillsDir(start: string): string | null {\n let dir = resolve(start);\n for (let i = 0; i < 8; i++) {\n const candidate = join(dir, \"skills\");\n if (existsSync(candidate) && isContentRepoRoot(dir)) return candidate;\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/** True when `dir` is the skills-master monorepo root (by package.json name). */\nfunction isContentRepoRoot(dir: string): boolean {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, \"package.json\"), \"utf8\")) as { name?: string };\n return pkg.name === CONTENT_REPO_PACKAGE;\n } catch {\n return false;\n }\n}\n\n/** Download the `skills/` subtree of the content repo to a local cache. */\nasync function fetchRemote(ref: string): Promise<string> {\n const repo = process.env.SKILLS_MASTER_REPO ?? DEFAULT_REPO;\n const cacheDir = join(homedir(), \".skills-master-cache\", ref.replace(/[^\\w.-]/g, \"_\"));\n const { downloadTemplate } = await import(\"giget\");\n const { dir } = await downloadTemplate(`${repo}/skills#${ref}`, {\n dir: cacheDir,\n force: true,\n forceClean: true,\n });\n return dir;\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\n\nconst SKILL_FILE = \"SKILL.md\";\nconst IGNORE = new Set([\"node_modules\", \".git\", \"dist\", \".cache\"]);\n\n/**\n * Recursively find every directory under `skillsRoot` that contains a SKILL.md.\n * Returns absolute directory paths, sorted for deterministic output.\n */\nexport function findSkillDirs(skillsRoot: string): string[] {\n const found: string[] = [];\n if (!existsSync(skillsRoot)) return found;\n\n const walk = (dir: string): void => {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n if (entries.includes(SKILL_FILE)) found.push(dir);\n for (const entry of entries) {\n if (IGNORE.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(dir, entry);\n let isDir = false;\n try {\n isDir = statSync(full).isDirectory();\n } catch {\n isDir = false;\n }\n if (isDir) walk(full);\n }\n };\n\n walk(skillsRoot);\n return found.sort();\n}\n\n/** Path of a skill dir relative to the skills root (uses forward slashes). */\nexport function relPathOf(skillsRoot: string, dir: string): string {\n return relative(skillsRoot, dir).split(/[\\\\/]/).join(\"/\");\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport { FrontmatterSchema, type Frontmatter } from \"../schema/frontmatter\";\nimport {\n RESOURCE_FILES,\n type ParsedSkill,\n type ResourceKey,\n type SkillResources,\n} from \"../types\";\nimport { relPathOf } from \"./discover\";\n\nexport interface RawSkill {\n dir: string;\n relPath: string;\n /** leaf folder name (the expected `name`). */\n folderName: string;\n /** unvalidated frontmatter object. */\n data: Record<string, unknown>;\n body: string;\n resources: SkillResources;\n skillMdPath: string;\n /** full unparsed SKILL.md text (used for YAML-hazard linting). */\n rawText: string;\n}\n\n/** Read a skill directory's SKILL.md and resource files without validating. */\nexport function loadRawSkill(dir: string, skillsRoot: string): RawSkill {\n const skillMdPath = join(dir, \"SKILL.md\");\n const rawText = readFileSync(skillMdPath, \"utf8\");\n const parsed = matter(rawText);\n\n const resources: SkillResources = {};\n for (const key of Object.keys(RESOURCE_FILES) as ResourceKey[]) {\n const p = join(dir, RESOURCE_FILES[key]);\n if (existsSync(p)) resources[key] = readFileSync(p, \"utf8\");\n }\n\n return {\n dir,\n relPath: relPathOf(skillsRoot, dir),\n folderName: basename(dir),\n data: parsed.data as Record<string, unknown>,\n body: parsed.content.replace(/^\\n+/, \"\").trimEnd(),\n resources,\n skillMdPath,\n rawText,\n };\n}\n\nexport class SkillValidationError extends Error {\n constructor(\n public readonly relPath: string,\n public readonly issues: string[],\n ) {\n super(`Invalid skill \"${relPath}\":\\n - ${issues.join(\"\\n - \")}`);\n this.name = \"SkillValidationError\";\n }\n}\n\n/** Validate raw frontmatter; returns the typed frontmatter or a list of issues. */\nexport function validateFrontmatter(\n data: Record<string, unknown>,\n): { ok: true; value: Frontmatter } | { ok: false; issues: string[] } {\n const result = FrontmatterSchema.safeParse(data);\n if (result.success) return { ok: true, value: result.data };\n const issues = result.error.issues.map((i) => {\n const path = i.path.join(\".\");\n return path ? `${path}: ${i.message}` : i.message;\n });\n return { ok: false, issues };\n}\n\n/** Load and validate a skill directory into a ParsedSkill (throws on failure). */\nexport function loadSkill(dir: string, skillsRoot: string): ParsedSkill {\n const raw = loadRawSkill(dir, skillsRoot);\n const validated = validateFrontmatter(raw.data);\n if (!validated.ok) throw new SkillValidationError(raw.relPath, validated.issues);\n return {\n name: validated.value.name,\n dir: raw.dir,\n relPath: raw.relPath,\n frontmatter: validated.value,\n body: raw.body,\n resources: raw.resources,\n };\n}\n","import { z } from \"zod\";\nimport semver from \"semver\";\n\n/** kebab-case, used for skill `name` and `pairs_with` references. */\nexport const NAME_RE = /^[a-z0-9-]{1,64}$/;\nexport const ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const StabilitySchema = z.enum([\"stable\", \"emerging\", \"contested\"]);\nexport type Stability = z.infer<typeof StabilitySchema>;\n\n/**\n * Skill classes are reusable across domains (Apple, Android, web, …):\n * - code → produces compilable code\n * - design → produces UX/design critique (e.g. Apple HIG, Material)\n * - lang-tooling → cross-cutting language/build/test/ship guidance\n * - overview → decision-guidance routers\n */\nexport const SkillClassSchema = z.enum([\n \"code\",\n \"design\",\n \"lang-tooling\",\n \"overview\",\n]);\nexport type SkillClass = z.infer<typeof SkillClassSchema>;\n\n/** Maps a skill `class` to its directory name within a domain in `skills/<domain>/`. */\nexport const CLASS_DIR: Record<SkillClass, string> = {\n code: \"code\",\n design: \"design\",\n \"lang-tooling\": \"lang-tooling\",\n overview: \"overviews\",\n};\n\n/**\n * Our private metadata block. Stripped from every projected output.\n * Domain-agnostic by design: `domain` namespaces a technology ecosystem\n * (apple, android, web, …); `platforms` and `requires` are free-form so each\n * domain defines its own vocabulary (ios/android/wear-os; {ios:\"17\"} / {android:\"14\"}).\n */\nexport const XSkillsMasterSchema = z\n .object({\n domain: z.string().min(1),\n class: SkillClassSchema,\n category: z.string().min(1),\n platforms: z.array(z.string().min(1)).min(1),\n /** domain-defined version requirements, e.g. { ios: \"17\", swift: \"6.0\" }. */\n requires: z.record(z.string(), z.string()).optional(),\n pairs_with: z.array(z.string().regex(NAME_RE)).default([]),\n /** citation URLs to canonical docs — never verbatim content. */\n sources: z.array(z.string().url()).default([]),\n snapshot_date: z.string().regex(ISO_DATE_RE, \"must be an ISO date (YYYY-MM-DD)\"),\n stability: StabilitySchema,\n version: z\n .string()\n .refine((v) => semver.valid(v) != null, \"must be a valid semver version\"),\n })\n .strict();\nexport type XSkillsMaster = z.infer<typeof XSkillsMasterSchema>;\n\n/** `globs` may be authored as a string or array; normalized to an array. */\nconst GlobsSchema = z\n .union([z.string(), z.array(z.string())])\n .transform((g) => (Array.isArray(g) ? g : [g]))\n .optional();\n\nexport const FrontmatterSchema = z\n .object({\n name: z.string().regex(NAME_RE, \"must be kebab-case ([a-z0-9-], <=64 chars)\"),\n description: z\n .string()\n .min(1, \"description is required\")\n .max(1024, \"description must be <= 1024 characters\"),\n globs: GlobsSchema,\n tags: z.array(z.string()).default([]),\n \"x-skills-master\": XSkillsMasterSchema,\n })\n // Tolerate tool-native extras (e.g. allowed-tools) without failing validation.\n .passthrough();\nexport type Frontmatter = z.infer<typeof FrontmatterSchema>;\n","import { findSkillDirs } from \"./discover\";\nimport { loadSkill } from \"./parse\";\nimport type { Registry, RegistryEntry } from \"../schema/registry\";\n\n/**\n * Build the catalog from the skill tree. Output is deterministic (no timestamp)\n * so a committed `registry.json` can be drift-checked in CI.\n */\nexport function buildRegistry(skillsRoot: string, version = \"0.1.0\"): Registry {\n const dirs = findSkillDirs(skillsRoot);\n const skills: RegistryEntry[] = dirs.map((dir) => {\n const s = loadSkill(dir, skillsRoot);\n const xm = s.frontmatter[\"x-skills-master\"];\n return {\n name: s.name,\n domain: xm.domain,\n class: xm.class,\n category: xm.category,\n description: s.frontmatter.description,\n platforms: xm.platforms,\n stability: xm.stability,\n version: xm.version,\n tags: s.frontmatter.tags ?? [],\n pairs_with: xm.pairs_with,\n path: s.relPath,\n resources: {\n reference: Boolean(s.resources.reference),\n examples: Boolean(s.resources.examples),\n checklist: Boolean(s.resources.checklist),\n },\n };\n });\n skills.sort((a, b) => a.name.localeCompare(b.name));\n return {\n $schema: \"https://skills-master.dev/schema/registry.json\",\n version,\n skills,\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ParsedSkill, TargetId } from \"../types\";\nimport type { LockedSkill } from \"../schema/lockfile\";\nimport { compileSkill } from \"./compile\";\nimport { applyFiles, type ApplyOptions, type DetailedWriteResult } from \"./writer\";\nimport { sha256 } from \"./hash\";\n\nexport interface InstallResult {\n name: string;\n version: string;\n results: DetailedWriteResult[];\n locked: LockedSkill;\n}\n\n/** Hash a skill's canonical source for drift detection. */\nexport function sourceHashOf(skill: ParsedSkill): string {\n const xm = skill.frontmatter[\"x-skills-master\"];\n return sha256(\n skill.relPath,\n xm.version,\n skill.frontmatter.description,\n skill.body,\n skill.resources.reference ?? \"\",\n skill.resources.examples ?? \"\",\n skill.resources.checklist ?? \"\",\n );\n}\n\n/**\n * Hash the given whole-file outputs as they currently exist on disk. Both the\n * lockfile (at install time) and the `update`/`doctor` drift checks use this\n * one function, so a clean install always reconciles.\n */\nexport function diskHash(projectRoot: string, relPaths: string[]): string {\n const sorted = [...relPaths].sort((a, b) => a.localeCompare(b));\n const parts: string[] = [];\n for (const p of sorted) {\n const abs = join(projectRoot, p);\n const contents = existsSync(abs) ? readFileSync(abs, \"utf8\") : \"<<missing>>\";\n parts.push(p, contents);\n }\n return sha256(...parts);\n}\n\n/** Compile a skill to the given targets and write the outputs to a project. */\nexport function installSkill(\n projectRoot: string,\n skill: ParsedSkill,\n targets: TargetId[],\n paths: Record<TargetId, string>,\n opts: ApplyOptions = {},\n): InstallResult {\n const compiled = compileSkill(skill, targets, { projectRoot, paths });\n const allFiles = compiled.flatMap((c) => c.files);\n const results = applyFiles(projectRoot, allFiles, opts);\n\n const emitted: LockedSkill[\"emitted\"] = {};\n for (const c of compiled) {\n const whole = c.files.filter((f) => f.mode === \"whole\").map((f) => f.path);\n const block = c.files.find((f) => f.mode === \"block\")?.path;\n // Hash covers only whole-file outputs (block files are marker-managed and\n // safe to reconcile). Computed from disk after writing so the lockfile\n // records what actually landed; in dry-run nothing is written or saved.\n const hash = opts.dryRun ? sha256(\"dry-run\", ...whole) : diskHash(projectRoot, whole);\n emitted[c.target] = { files: whole, ...(block ? { block } : {}), hash };\n }\n\n const version = skill.frontmatter[\"x-skills-master\"].version;\n return {\n name: skill.name,\n version,\n results,\n locked: { version, sourceHash: sourceHashOf(skill), emitted },\n };\n}\n","import type { EmitContext, EmittedFile, ParsedSkill, TargetId } from \"../types\";\nimport { getEmitter } from \"../emitters\";\n\nexport interface CompiledTarget {\n target: TargetId;\n files: EmittedFile[];\n}\n\n/** Run the emitters for the requested targets over a single skill. */\nexport function compileSkill(\n skill: ParsedSkill,\n targets: TargetId[],\n ctx: EmitContext,\n): CompiledTarget[] {\n const out: CompiledTarget[] = [];\n for (const target of targets) {\n const emitter = getEmitter(target);\n if (!emitter) throw new Error(`Unknown target: ${target}`);\n out.push({ target, files: emitter.emit(skill, ctx) });\n }\n return out;\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, rmdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { EmittedFile, WriteAction, WriteResult } from \"../types\";\nimport { hasBlock, removeBlock, upsertBlock } from \"./markers\";\n\nexport type ConflictChoice = \"overwrite\" | \"skip\";\n\nexport interface ApplyOptions {\n dryRun?: boolean;\n /** force-overwrite changed whole-files without asking. */\n overwrite?: boolean;\n /** called for a changed whole-file when neither overwrite nor dryRun is set. */\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface DetailedWriteResult extends WriteResult {\n /** previous file contents (whole-file) when it changed — for diff previews. */\n before?: string;\n /** new file contents (whole-file) when it changed. */\n after?: string;\n}\n\nfunction ensureDir(absPath: string): void {\n mkdirSync(dirname(absPath), { recursive: true });\n}\n\nfunction applyWhole(\n projectRoot: string,\n file: EmittedFile,\n opts: ApplyOptions,\n): DetailedWriteResult {\n const abs = join(projectRoot, file.path);\n const exists = existsSync(abs);\n const next = file.contents;\n\n if (!exists) {\n if (!opts.dryRun) {\n ensureDir(abs);\n writeFileSync(abs, next, \"utf8\");\n }\n return { path: file.path, mode: \"whole\", action: \"created\", after: next };\n }\n\n const current = readFileSync(abs, \"utf8\");\n if (current === next) {\n return { path: file.path, mode: \"whole\", action: \"unchanged\" };\n }\n\n // changed\n let choice: ConflictChoice = \"overwrite\";\n if (!opts.overwrite) {\n choice = opts.onConflict ? opts.onConflict(file.path) : opts.dryRun ? \"overwrite\" : \"skip\";\n }\n if (choice === \"skip\") {\n return { path: file.path, mode: \"whole\", action: \"skipped\", before: current, after: next };\n }\n if (!opts.dryRun) writeFileSync(abs, next, \"utf8\");\n return { path: file.path, mode: \"whole\", action: \"updated\", before: current, after: next };\n}\n\nfunction applyBlock(\n projectRoot: string,\n file: EmittedFile,\n opts: ApplyOptions,\n): DetailedWriteResult {\n const abs = join(projectRoot, file.path);\n const exists = existsSync(abs);\n const current = exists ? readFileSync(abs, \"utf8\") : \"\";\n const blockId = file.blockId!;\n const next = upsertBlock(current, blockId, file.contents, file.blockVersion);\n\n let action: WriteAction;\n if (current === next) action = \"unchanged\";\n else if (!exists || !hasBlock(current, blockId)) action = \"created\";\n else action = \"updated\";\n\n if (action !== \"unchanged\" && !opts.dryRun) {\n ensureDir(abs);\n writeFileSync(abs, next, \"utf8\");\n }\n return { path: file.path, mode: \"block\", blockId, action };\n}\n\n/** Apply a batch of emitted files to a project. */\nexport function applyFiles(\n projectRoot: string,\n files: EmittedFile[],\n opts: ApplyOptions = {},\n): DetailedWriteResult[] {\n return files.map((f) =>\n f.mode === \"block\" ? applyBlock(projectRoot, f, opts) : applyWhole(projectRoot, f, opts),\n );\n}\n\n/** Remove now-empty ancestor directories of the given files, up to (not incl.) the project root. */\nexport function pruneEmptyDirs(projectRoot: string, relFilePaths: string[], dryRun = false): void {\n if (dryRun) return;\n const seen = new Set<string>();\n for (const rel of relFilePaths) {\n let dir = dirname(join(projectRoot, rel));\n while (dir.startsWith(projectRoot) && dir !== projectRoot && !seen.has(dir)) {\n seen.add(dir);\n try {\n if (existsSync(dir) && readdirSync(dir).length === 0) {\n rmdirSync(dir);\n dir = dirname(dir);\n } else break;\n } catch {\n break;\n }\n }\n }\n}\n\n/** Remove a whole-file output. */\nexport function removeWholeFile(projectRoot: string, relPath: string, dryRun = false): boolean {\n const abs = join(projectRoot, relPath);\n if (!existsSync(abs)) return false;\n if (!dryRun) rmSync(abs);\n return true;\n}\n\n/**\n * Remove a managed block from a shared file. Deletes the file if it becomes\n * empty. Returns true if anything changed.\n */\nexport function removeBlockFromFile(\n projectRoot: string,\n relPath: string,\n blockId: string,\n dryRun = false,\n): boolean {\n const abs = join(projectRoot, relPath);\n if (!existsSync(abs)) return false;\n const current = readFileSync(abs, \"utf8\");\n if (!hasBlock(current, blockId)) return false;\n const next = removeBlock(current, blockId);\n if (!dryRun) {\n if (next.trim().length === 0) rmSync(abs);\n else writeFileSync(abs, next, \"utf8\");\n }\n return true;\n}\n","/**\n * Sentinel-marker management for shared files (AGENTS.md, copilot-instructions.md).\n *\n * A managed region looks like:\n *\n * <!-- BEGIN skills-master:<id> v<version> -->\n * ...generated content...\n * <!-- END skills-master:<id> -->\n *\n * Only the bytes between (and including) the markers are ever touched, so any\n * hand-written content elsewhere in the file is preserved.\n */\n\nconst PREFIX = \"skills-master\";\n\nfunction escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function beginMarker(id: string, version?: string): string {\n return version\n ? `<!-- BEGIN ${PREFIX}:${id} v${version} -->`\n : `<!-- BEGIN ${PREFIX}:${id} -->`;\n}\n\nexport function endMarker(id: string): string {\n return `<!-- END ${PREFIX}:${id} -->`;\n}\n\nfunction blockRegex(id: string): RegExp {\n const esc = escapeRe(id);\n return new RegExp(\n `[ \\\\t]*<!-- BEGIN ${PREFIX}:${esc}(?: v[^>]*)? -->[\\\\s\\\\S]*?<!-- END ${PREFIX}:${esc} -->`,\n );\n}\n\n/** Build a complete managed block (markers + body). */\nexport function renderBlock(id: string, body: string, version?: string): string {\n return `${beginMarker(id, version)}\\n${body.trim()}\\n${endMarker(id)}`;\n}\n\nexport function hasBlock(file: string, id: string): boolean {\n return blockRegex(id).test(file);\n}\n\n/** Read the inner body of a managed block, or null if absent. */\nexport function readBlock(file: string, id: string): string | null {\n const m = blockRegex(id).exec(file);\n if (!m) return null;\n const inner = m[0]\n .replace(new RegExp(`^[ \\\\t]*<!-- BEGIN ${PREFIX}:${escapeRe(id)}(?: v[^>]*)? -->\\\\n?`), \"\")\n .replace(new RegExp(`\\\\n?<!-- END ${PREFIX}:${escapeRe(id)} -->$`), \"\");\n return inner;\n}\n\n/** Read the version recorded in a block's BEGIN marker, or null. */\nexport function readBlockVersion(file: string, id: string): string | null {\n const m = new RegExp(\n `<!-- BEGIN ${PREFIX}:${escapeRe(id)} v([^\\\\s>]+) -->`,\n ).exec(file);\n return m && m[1] ? m[1] : null;\n}\n\n/**\n * Insert or replace a managed block. Returns the new file contents.\n * If the block is absent it is appended, separated by a blank line.\n */\nexport function upsertBlock(\n file: string,\n id: string,\n body: string,\n version?: string,\n): string {\n const block = renderBlock(id, body, version);\n const re = blockRegex(id);\n if (re.test(file)) {\n return file.replace(re, block);\n }\n const base = file.replace(/\\s+$/, \"\");\n if (base.length === 0) return block + \"\\n\";\n return `${base}\\n\\n${block}\\n`;\n}\n\n/**\n * Remove a managed block (and a trailing blank line). Returns the new contents.\n * If the file becomes empty (only whitespace), returns the empty string so the\n * caller can delete it.\n */\nexport function removeBlock(file: string, id: string): string {\n const re = new RegExp(blockRegex(id).source + `\\\\n?\\\\n?`);\n const next = file.replace(re, \"\");\n return next.trim().length === 0 ? \"\" : next.replace(/\\n{3,}/g, \"\\n\\n\").trimEnd() + \"\\n\";\n}\n","import { createHash } from \"node:crypto\";\n\n/** Deterministic sha256 of one or more strings, prefixed `sha256:`. */\nexport function sha256(...parts: string[]): string {\n const h = createHash(\"sha256\");\n for (const p of parts) {\n h.update(p, \"utf8\");\n h.update(\"\u0000\"); // domain separator between parts\n }\n return \"sha256:\" + h.digest(\"hex\");\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/** Ensure each entry appears in the project's .gitignore (idempotent). */\nexport function ensureGitignored(root: string, entries: string[]): void {\n const p = join(root, \".gitignore\");\n const current = existsSync(p) ? readFileSync(p, \"utf8\") : \"\";\n const lines = new Set(current.split(\"\\n\").map((l) => l.trim()));\n const missing = entries.filter((e) => !lines.has(e));\n if (missing.length === 0) return;\n const header = current.includes(\"# skills-master\") ? \"\" : \"\\n# skills-master generated outputs\\n\";\n const next = current.replace(/\\s*$/, \"\") + header + missing.join(\"\\n\") + \"\\n\";\n writeFileSync(p, next, \"utf8\");\n}\n","import { resolvePaths } from \"../schema/projectConfig\";\nimport { ALL_TARGETS, type TargetId } from \"../types\";\nimport { detectTargets } from \"../emitters\";\nimport { resolveContent } from \"../content/source\";\nimport { installSkill } from \"../core/install\";\nimport {\n loadConfig,\n loadConfigOrDefault,\n loadLockfile,\n saveConfig,\n saveLockfile,\n} from \"../core/project\";\nimport { ensureGitignored } from \"../core/gitignore\";\nimport type { ConflictChoice } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface AddOptions {\n cwd: string;\n /** skill names, category names, or class names to install. */\n names: string[];\n targets?: TargetId[];\n content?: string;\n ref?: string;\n withPairs?: boolean;\n dryRun?: boolean;\n overwrite?: boolean;\n /** interactive conflict resolver (bin supplies this on a TTY). */\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface AddResult {\n targets: TargetId[];\n installed: { name: string; version: string }[];\n skipped: string[];\n}\n\nexport async function addCommand(opts: AddOptions): Promise<AddResult> {\n const cfg = loadConfigOrDefault(opts.cwd);\n const hadConfig = loadConfig(opts.cwd) != null;\n\n let targets = opts.targets?.length ? opts.targets : cfg.targets;\n if (!targets.length) targets = detectTargets(opts.cwd);\n if (!targets.length) targets = ALL_TARGETS;\n\n const content = await resolveContent({\n content: opts.content,\n ref: opts.ref ?? cfg.contentRef,\n cwd: opts.cwd,\n });\n const registry = content.registry();\n const byName = new Map(registry.skills.map((s) => [s.name, s]));\n\n // Resolve tokens → concrete skill names (name > category > class).\n const selected = new Set<string>();\n const skipped: string[] = [];\n for (const token of opts.names) {\n if (byName.has(token)) {\n selected.add(token);\n continue;\n }\n const byCategory = registry.skills.filter((s) => s.category === token);\n const byClass = registry.skills.filter((s) => s.class === token);\n const group = byCategory.length ? byCategory : byClass;\n if (group.length) {\n group.forEach((s) => selected.add(s.name));\n } else {\n log.warn(`No skill, category, or class matches \"${token}\".`);\n skipped.push(token);\n }\n }\n\n if (opts.withPairs) {\n for (const name of [...selected]) {\n for (const pair of byName.get(name)?.pairs_with ?? []) {\n if (byName.has(pair)) selected.add(pair);\n else log.warn(`Paired skill \"${pair}\" (from \"${name}\") is not in the registry.`);\n }\n }\n }\n\n if (selected.size === 0) {\n log.error(\"Nothing to install.\");\n return { targets, installed: [], skipped };\n }\n\n const paths = resolvePaths(cfg);\n const lock = loadLockfile(opts.cwd);\n lock.contentRef = opts.ref ?? cfg.contentRef;\n const installed: { name: string; version: string }[] = [];\n\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n for (const name of [...selected].sort()) {\n const skill = content.loadSkill(name);\n const result = installSkill(opts.cwd, skill, targets, paths, {\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n onConflict: opts.onConflict,\n });\n if (!opts.dryRun) lock.skills[name] = result.locked;\n installed.push({ name, version: result.version });\n\n for (const r of result.results) {\n const tag = r.mode === \"block\" ? `${r.path} [${r.blockId}]` : r.path;\n log.info(`${prefix}${r.action.padEnd(9)} ${tag}`);\n }\n }\n\n if (!opts.dryRun) {\n saveLockfile(opts.cwd, lock);\n if (!hadConfig) {\n saveConfig(opts.cwd, { ...cfg, targets });\n log.info(\"Wrote skills-master.json.\");\n }\n if (!cfg.commit) {\n const outs = targets.map((t) => paths[t]);\n ensureGitignored(opts.cwd, outs);\n }\n }\n\n log.success(\n `${prefix}Installed ${installed.length} skill(s) into ${targets.length} target(s): ${targets.join(\", \")}.`,\n );\n return { targets, installed, skipped };\n}\n","import { resolvePaths } from \"../schema/projectConfig\";\nimport type { TargetId } from \"../types\";\nimport { resolveContent } from \"../content/source\";\nimport { diskHash, installSkill, sourceHashOf } from \"../core/install\";\nimport { loadConfigOrDefault, loadLockfile, saveLockfile } from \"../core/project\";\nimport type { ConflictChoice } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface UpdateOptions {\n cwd: string;\n names?: string[];\n content?: string;\n ref?: string;\n dryRun?: boolean;\n overwrite?: boolean;\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface UpdateResult {\n updated: string[];\n upToDate: string[];\n skipped: string[];\n}\n\nexport async function updateCommand(opts: UpdateOptions): Promise<UpdateResult> {\n const cfg = loadConfigOrDefault(opts.cwd);\n const lock = loadLockfile(opts.cwd);\n const ref = opts.ref ?? cfg.contentRef;\n const updated: string[] = [];\n const upToDate: string[] = [];\n const skipped: string[] = [];\n\n const names = opts.names?.length ? opts.names : Object.keys(lock.skills);\n if (names.length === 0) {\n log.info(\"No installed skills to update.\");\n return { updated, upToDate, skipped };\n }\n\n const content = await resolveContent({ content: opts.content, ref, cwd: opts.cwd });\n const paths = resolvePaths(cfg);\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n\n for (const name of names.sort()) {\n const locked = lock.skills[name];\n if (!locked) {\n log.warn(`\"${name}\" is not installed — run \\`add\\` first.`);\n skipped.push(name);\n continue;\n }\n\n let skill;\n try {\n skill = content.loadSkill(name);\n } catch {\n log.warn(`\"${name}\" no longer exists in the content library.`);\n skipped.push(name);\n continue;\n }\n\n const refChanged = lock.contentRef !== ref;\n const sourceChanged = locked.sourceHash !== sourceHashOf(skill);\n if (!opts.overwrite && !sourceChanged && !refChanged) {\n upToDate.push(name);\n continue;\n }\n\n // Re-emit to exactly the targets this skill was installed to.\n const targets = Object.keys(locked.emitted) as TargetId[];\n\n // Detect user edits to owned whole-files since install.\n const userEdited = targets.some((t) => {\n const e = locked.emitted[t];\n return e && diskHash(opts.cwd, e.files) !== e.hash;\n });\n if (userEdited && !opts.overwrite && !opts.onConflict) {\n log.warn(`${prefix}\"${name}\" has local edits — skipping (use --overwrite to replace).`);\n skipped.push(name);\n continue;\n }\n\n const result = installSkill(opts.cwd, skill, targets, paths, {\n dryRun: opts.dryRun,\n overwrite: opts.overwrite || !userEdited,\n onConflict: opts.onConflict,\n });\n if (!opts.dryRun) lock.skills[name] = result.locked;\n updated.push(name);\n for (const r of result.results) {\n if (r.action === \"unchanged\") continue;\n const tag = r.mode === \"block\" ? `${r.path} [${r.blockId}]` : r.path;\n log.info(`${prefix}${r.action.padEnd(9)} ${tag}`);\n }\n }\n\n if (!opts.dryRun) {\n lock.contentRef = ref;\n saveLockfile(opts.cwd, lock);\n }\n\n log.success(\n `${prefix}Updated ${updated.length}, up-to-date ${upToDate.length}, skipped ${skipped.length}.`,\n );\n return { updated, upToDate, skipped };\n}\n","import type { TargetId } from \"../types\";\nimport { loadLockfile, saveLockfile } from \"../core/project\";\nimport { pruneEmptyDirs, removeBlockFromFile, removeWholeFile } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface RemoveOptions {\n cwd: string;\n names: string[];\n /** restrict removal to specific targets; default = every target the skill was installed to. */\n targets?: TargetId[];\n dryRun?: boolean;\n}\n\nexport interface RemoveResult {\n removed: string[];\n missing: string[];\n}\n\nexport function removeCommand(opts: RemoveOptions): RemoveResult {\n const lock = loadLockfile(opts.cwd);\n const removed: string[] = [];\n const missing: string[] = [];\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n\n for (const name of opts.names) {\n const locked = lock.skills[name];\n if (!locked) {\n log.warn(`\"${name}\" is not installed.`);\n missing.push(name);\n continue;\n }\n\n const targets = (opts.targets?.length\n ? opts.targets\n : (Object.keys(locked.emitted) as TargetId[])\n ).filter((t) => locked.emitted[t]);\n\n const wholeRemoved: string[] = [];\n for (const t of targets) {\n const e = locked.emitted[t]!;\n for (const file of e.files) {\n if (removeWholeFile(opts.cwd, file, opts.dryRun)) {\n wholeRemoved.push(file);\n log.info(`${prefix}removed ${file}`);\n }\n }\n if (e.block && removeBlockFromFile(opts.cwd, e.block, name, opts.dryRun)) {\n log.info(`${prefix}unblocked ${e.block} [${name}]`);\n }\n if (!opts.dryRun) delete locked.emitted[t];\n }\n pruneEmptyDirs(opts.cwd, wholeRemoved, opts.dryRun);\n\n if (!opts.dryRun) {\n if (Object.keys(locked.emitted).length === 0) delete lock.skills[name];\n }\n removed.push(name);\n }\n\n if (!opts.dryRun) saveLockfile(opts.cwd, lock);\n log.success(`${prefix}Removed ${removed.length} skill(s).`);\n return { removed, missing };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { diskHash } from \"../core/install\";\nimport { loadConfig, loadLockfile } from \"../core/project\";\nimport { hasBlock } from \"../core/markers\";\nimport { log } from \"../util/log\";\n\nexport interface DoctorOptions {\n cwd: string;\n}\n\nexport interface DoctorReport {\n problems: string[];\n ok: boolean;\n}\n\nexport function doctorCommand(opts: DoctorOptions): DoctorReport {\n const problems: string[] = [];\n const note = (msg: string) => problems.push(msg);\n\n const cfg = loadConfig(opts.cwd);\n if (!cfg) {\n log.warn(\"No skills-master.json found — run `skills-master init`.\");\n } else {\n log.info(`Config targets: ${cfg.targets.length ? cfg.targets.join(\", \") : \"(auto-detect)\"}`);\n }\n\n const lock = loadLockfile(opts.cwd);\n const names = Object.keys(lock.skills);\n if (names.length === 0) {\n log.info(\"No skills installed.\");\n return { problems, ok: true };\n }\n\n for (const name of names) {\n const locked = lock.skills[name]!;\n for (const [target, e] of Object.entries(locked.emitted)) {\n for (const file of e.files) {\n if (!existsSync(join(opts.cwd, file))) note(`${name}: missing ${target} file ${file}`);\n }\n if (e.files.every((f) => existsSync(join(opts.cwd, f)))) {\n if (diskHash(opts.cwd, e.files) !== e.hash) {\n note(`${name}: local edits to ${target} output(s) (run \\`update --overwrite\\` to reset)`);\n }\n }\n if (e.block) {\n const abs = join(opts.cwd, e.block);\n if (!existsSync(abs) || !hasBlock(readFileSync(abs, \"utf8\"), name)) {\n note(`${name}: missing managed block in ${e.block}`);\n }\n }\n }\n }\n\n if (problems.length === 0) {\n log.success(`All ${names.length} installed skill(s) look healthy.`);\n } else {\n for (const p of problems) log.warn(p);\n log.plain(`\\n${problems.length} problem(s) found.`);\n }\n return { problems, ok: problems.length === 0 };\n}\n","import { resolveContent } from \"../content/source\";\nimport type { Registry, RegistryEntry } from \"../schema/registry\";\nimport { log } from \"../util/log\";\n\nexport interface CatalogQuery {\n content?: string;\n ref?: string;\n cwd?: string;\n}\n\nasync function registryOf(q: CatalogQuery): Promise<Registry> {\n const content = await resolveContent({ content: q.content, ref: q.ref, cwd: q.cwd });\n return content.registry();\n}\n\nexport interface ListOptions extends CatalogQuery {\n domain?: string;\n class?: string;\n category?: string;\n platform?: string;\n json?: boolean;\n}\n\nexport async function listCommand(opts: ListOptions): Promise<RegistryEntry[]> {\n const reg = await registryOf(opts);\n let skills = reg.skills;\n if (opts.domain) skills = skills.filter((s) => s.domain === opts.domain);\n if (opts.class) skills = skills.filter((s) => s.class === opts.class);\n if (opts.category) skills = skills.filter((s) => s.category === opts.category);\n if (opts.platform) {\n const platform = opts.platform;\n skills = skills.filter((s) => s.platforms.includes(platform));\n }\n\n if (opts.json) {\n log.plain(JSON.stringify(skills, null, 2));\n return skills;\n }\n\n if (skills.length === 0) {\n log.info(\"No skills match.\");\n return skills;\n }\n\n const groups = new Map<string, RegistryEntry[]>();\n for (const s of skills) {\n const key = `${s.domain}/${s.class}/${s.category}`;\n (groups.get(key) ?? groups.set(key, []).get(key)!).push(s);\n }\n for (const [group, entries] of [...groups].sort()) {\n log.plain(`\\n${group}`);\n for (const s of entries) {\n const flag = s.stability === \"stable\" ? \"\" : ` (${s.stability})`;\n log.plain(` ${s.name} v${s.version}${flag}`);\n log.plain(` ${truncate(s.description, 96)}`);\n }\n }\n log.plain(`\\n${skills.length} skill(s).`);\n return skills;\n}\n\nexport interface SearchOptions extends CatalogQuery {\n query: string;\n}\n\nexport async function searchCommand(opts: SearchOptions): Promise<RegistryEntry[]> {\n const reg = await registryOf(opts);\n const q = opts.query.toLowerCase();\n const hits = reg.skills.filter((s) =>\n [s.name, s.description, s.domain, s.category, s.class, ...s.tags]\n .join(\" \")\n .toLowerCase()\n .includes(q),\n );\n if (hits.length === 0) {\n log.info(`No matches for \"${opts.query}\".`);\n return hits;\n }\n for (const s of hits) {\n log.plain(`${s.name} (${s.class}/${s.category}) v${s.version}`);\n log.plain(` ${truncate(s.description, 96)}`);\n }\n log.plain(`\\n${hits.length} match(es).`);\n return hits;\n}\n\nexport interface ViewOptions extends CatalogQuery {\n name: string;\n raw?: boolean;\n}\n\nexport async function viewCommand(opts: ViewOptions): Promise<void> {\n const content = await resolveContent({ content: opts.content, ref: opts.ref, cwd: opts.cwd });\n const skill = content.loadSkill(opts.name);\n const xm = skill.frontmatter[\"x-skills-master\"];\n if (opts.raw) {\n log.plain(skill.body);\n return;\n }\n log.plain(`${skill.name} v${xm.version} [${xm.domain}/${xm.class}/${xm.category}] ${xm.stability}`);\n log.plain(`platforms: ${xm.platforms.join(\", \")}`);\n if (xm.requires) {\n log.plain(`requires: ${Object.entries(xm.requires).map(([k, v]) => `${k} ${v}`).join(\", \")}`);\n }\n if (xm.pairs_with.length) log.plain(`pairs with: ${xm.pairs_with.join(\", \")}`);\n log.plain(`\\n${skill.frontmatter.description}\\n`);\n log.plain(`sources:`);\n for (const url of xm.sources) log.plain(` ${url}`);\n const res = Object.entries(skill.resources).filter(([, v]) => v).map(([k]) => k);\n if (res.length) log.plain(`\\nresource files: ${res.join(\", \")}`);\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + \"…\";\n}\n","import type { Frontmatter } from \"../schema/frontmatter\";\nimport { findSkillDirs, relPathOf } from \"./discover\";\nimport { loadRawSkill, validateFrontmatter } from \"./parse\";\n\nexport type DiagnosticLevel = \"error\" | \"warn\";\n\nexport interface Diagnostic {\n relPath: string;\n level: DiagnosticLevel;\n message: string;\n}\n\nexport interface LintResult {\n diagnostics: Diagnostic[];\n skillCount: number;\n errorCount: number;\n warnCount: number;\n}\n\nconst CANONICAL_HEADINGS = [\n \"## When to use\",\n \"## Core guidance\",\n \"## Pitfalls\",\n \"## References\",\n \"## See also\",\n];\nconst MAX_BODY_LINES = 500;\nconst WARN_BODY_LINES = 450;\n\nfunction today(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\ninterface Loaded {\n relPath: string;\n folderName: string;\n fm?: Frontmatter;\n body: string;\n}\n\nexport function lintSkills(skillsRoot: string): LintResult {\n const dirs = findSkillDirs(skillsRoot);\n const diagnostics: Diagnostic[] = [];\n const loaded: Loaded[] = [];\n const byName = new Map<string, Frontmatter>();\n\n for (const dir of dirs) {\n let raw;\n try {\n raw = loadRawSkill(dir, skillsRoot);\n } catch (err) {\n diagnostics.push({\n relPath: relPathOf(skillsRoot, dir),\n level: \"error\",\n message: `failed to parse SKILL.md: ${err instanceof Error ? err.message.split(\"\\n\")[0] : String(err)}`,\n });\n continue;\n }\n\n // YAML hazard: an unquoted scalar containing \" #\" is silently truncated as\n // a comment (e.g. \"@Test, #expect\" loses everything from \"#expect\" on).\n for (const line of raw.rawText.split(\"\\n\")) {\n const m = /^(\\s*)(name|description|category):\\s+(?![\"'])(.*\\s#.*)$/.exec(line);\n if (m) {\n diagnostics.push({\n relPath: raw.relPath,\n level: \"warn\",\n message: `frontmatter \"${m[2]}\" contains \" #\", which YAML reads as a comment — quote the value`,\n });\n }\n }\n\n const v = validateFrontmatter(raw.data);\n if (!v.ok) {\n for (const issue of v.issues) {\n diagnostics.push({ relPath: raw.relPath, level: \"error\", message: issue });\n }\n loaded.push({ relPath: raw.relPath, folderName: raw.folderName, body: raw.body });\n continue;\n }\n loaded.push({ relPath: raw.relPath, folderName: raw.folderName, fm: v.value, body: raw.body });\n byName.set(v.value.name, v.value);\n }\n\n // Skill names must be globally unique (the registry and `add` key on name).\n const nameDirs = new Map<string, string[]>();\n for (const s of loaded) {\n const n = s.fm?.name ?? s.folderName;\n (nameDirs.get(n) ?? nameDirs.set(n, []).get(n)!).push(s.relPath);\n }\n for (const [name, paths] of nameDirs) {\n if (paths.length > 1) {\n for (const p of paths) {\n diagnostics.push({ relPath: p, level: \"error\", message: `duplicate skill name \"${name}\" (also at ${paths.filter((x) => x !== p).join(\", \")})` });\n }\n }\n }\n\n const todayStr = today();\n\n for (const s of loaded) {\n const push = (level: DiagnosticLevel, message: string) =>\n diagnostics.push({ relPath: s.relPath, level, message });\n if (!s.fm) continue;\n const fm = s.fm;\n const xm = fm[\"x-skills-master\"];\n\n // name == folder name\n if (fm.name !== s.folderName) {\n push(\"error\", `name \"${fm.name}\" must equal the folder name \"${s.folderName}\"`);\n }\n\n // description shape (soft)\n if (!/use when/i.test(fm.description)) {\n push(\"warn\", `description should include a \"Use when ...\" trigger clause`);\n }\n\n // snapshot_date not in the future\n if (xm.snapshot_date > todayStr) {\n push(\"error\", `snapshot_date ${xm.snapshot_date} is in the future`);\n }\n\n // contested ⇒ Open question section\n if (xm.stability === \"contested\" && !/^## Open question\\b/m.test(s.body)) {\n push(\"error\", `stability is \"contested\" but no \"## Open question\" section is present`);\n }\n\n // body length\n const lineCount = s.body.split(\"\\n\").length;\n if (lineCount > MAX_BODY_LINES) {\n push(\"error\", `SKILL.md body is ${lineCount} lines (max ${MAX_BODY_LINES}); move depth into reference.md/examples.md`);\n } else if (lineCount > WARN_BODY_LINES) {\n push(\"warn\", `SKILL.md body is ${lineCount} lines (approaching the ${MAX_BODY_LINES}-line cap)`);\n }\n\n // domain should match the top path segment\n if (!s.relPath.startsWith(`${xm.domain}/`)) {\n push(\"warn\", `domain \"${xm.domain}\" does not match the top folder of \"${s.relPath}\"`);\n }\n\n // sources should be present and be https documentation URLs\n if (xm.sources.length === 0) {\n push(\"warn\", `no sources — add at least one canonical documentation URL`);\n }\n for (const url of xm.sources) {\n if (!/^https:\\/\\//.test(url)) {\n push(\"warn\", `sources entry should be an https URL: ${url}`);\n }\n }\n\n // canonical headings\n for (const heading of CANONICAL_HEADINGS) {\n if (!s.body.includes(heading)) {\n push(\"warn\", `missing recommended section \"${heading}\"`);\n }\n }\n\n // pairs_with referential integrity (bidirectional)\n for (const partner of xm.pairs_with) {\n const partnerFm = byName.get(partner);\n if (!partnerFm) {\n push(\"error\", `pairs_with references unknown skill \"${partner}\"`);\n continue;\n }\n if (!partnerFm[\"x-skills-master\"].pairs_with.includes(fm.name)) {\n push(\"error\", `pairs_with \"${partner}\" is not reciprocated (add \"${fm.name}\" to its pairs_with)`);\n }\n }\n }\n\n const errorCount = diagnostics.filter((d) => d.level === \"error\").length;\n const warnCount = diagnostics.filter((d) => d.level === \"warn\").length;\n return { diagnostics, skillCount: dirs.length, errorCount, warnCount };\n}\n","import { resolveContent } from \"../content/source\";\nimport { lintSkills } from \"../core/lint\";\nimport { log } from \"../util/log\";\n\nexport interface LintCmdOptions {\n content?: string;\n cwd?: string;\n}\n\n/** Lint the skill library. Returns true when there are no errors. */\nexport async function lintCommand(opts: LintCmdOptions): Promise<boolean> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const result = lintSkills(content.root);\n\n for (const d of result.diagnostics) {\n const line = `${d.level === \"error\" ? \"✗\" : \"!\"} ${d.relPath}: ${d.message}`;\n if (d.level === \"error\") log.error(line);\n else log.warn(line);\n }\n\n log.plain(\n `\\nLinted ${result.skillCount} skill(s): ${result.errorCount} error(s), ${result.warnCount} warning(s).`,\n );\n return result.errorCount === 0;\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveContent } from \"../content/source\";\nimport { buildRegistry } from \"../core/registry-build\";\nimport { REGISTRY_FILENAME } from \"../schema/registry\";\nimport { log } from \"../util/log\";\n\nexport interface RegistryBuildOptions {\n content?: string;\n cwd?: string;\n /** when true, verify the committed registry.json is up to date (CI mode). */\n check?: boolean;\n version?: string;\n}\n\n/** Build (or verify) registry.json from the skill tree. Returns true on success. */\nexport async function registryBuildCommand(opts: RegistryBuildOptions): Promise<boolean> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const registry = buildRegistry(content.root, opts.version ?? \"0.1.0\");\n const json = JSON.stringify(registry, null, 2) + \"\\n\";\n const outPath = join(content.root, REGISTRY_FILENAME);\n\n if (opts.check) {\n const current = existsSync(outPath) ? readFileSync(outPath, \"utf8\") : \"\";\n if (current !== json) {\n log.error(`registry.json is out of date — run \\`registry build\\` and commit the result.`);\n return false;\n }\n log.success(`registry.json is up to date (${registry.skills.length} skills).`);\n return true;\n }\n\n writeFileSync(outPath, json, \"utf8\");\n log.success(`Wrote ${REGISTRY_FILENAME} (${registry.skills.length} skills).`);\n return true;\n}\n","import { z } from \"zod\";\nimport { SkillClassSchema, StabilitySchema } from \"./frontmatter\";\n\n/** One catalog entry. Generated from the skill tree by `registry build`. */\nexport const RegistryEntrySchema = z.object({\n name: z.string(),\n domain: z.string(),\n class: SkillClassSchema,\n category: z.string(),\n description: z.string(),\n platforms: z.array(z.string()),\n stability: StabilitySchema,\n version: z.string(),\n tags: z.array(z.string()).default([]),\n pairs_with: z.array(z.string()).default([]),\n /** path relative to the skills root. */\n path: z.string(),\n /** which on-demand resource files exist. */\n resources: z.object({\n reference: z.boolean(),\n examples: z.boolean(),\n checklist: z.boolean(),\n }),\n});\n\nexport const RegistrySchema = z.object({\n $schema: z.string().optional(),\n /** aggregate library version (bumped on release). */\n version: z.string().default(\"0.1.0\"),\n generatedAt: z.string().optional(),\n skills: z.array(RegistryEntrySchema).default([]),\n});\n\nexport type RegistryEntry = z.infer<typeof RegistryEntrySchema>;\nexport type Registry = z.infer<typeof RegistrySchema>;\n\nexport const REGISTRY_FILENAME = \"registry.json\";\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { resolveContent } from \"../content/source\";\nimport { claudeEmitter } from \"../emitters\";\nimport { applyFiles } from \"../core/writer\";\nimport type { EmitContext, EmittedFile, TargetId } from \"../types\";\nimport type { SkillClass } from \"../schema/frontmatter\";\nimport { log } from \"../util/log\";\n\nconst CLASS_LABEL: Record<SkillClass, string> = {\n code: \"code skills (frameworks & APIs)\",\n design: \"design-review skills\",\n \"lang-tooling\": \"language, build, test & ship skills\",\n overview: \"decision-guidance routers\",\n};\n\nconst CLASS_CATEGORY: Record<SkillClass, string> = {\n code: \"development\",\n design: \"design\",\n \"lang-tooling\": \"development\",\n overview: \"development\",\n};\n\nfunction pluginName(domain: string, cls: SkillClass): string {\n const clsSeg = cls === \"overview\" ? \"overviews\" : cls;\n return `skills-master-${domain}-${clsSeg}`;\n}\n\nfunction titleCase(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport interface MarketplaceBuildOptions {\n content?: string;\n cwd?: string;\n /** output root for .claude-plugin/ and plugins/ (defaults to the repo root above skills/). */\n out?: string;\n version?: string;\n}\n\nexport async function marketplaceBuildCommand(opts: MarketplaceBuildOptions): Promise<void> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const out = resolve(opts.out ?? dirname(content.root));\n const version = opts.version ?? \"0.1.0\";\n\n // Group emitted files by (domain, class).\n const groups = new Map<string, { domain: string; cls: SkillClass; files: EmittedFile[]; count: number }>();\n\n for (const dir of content.skillDirs()) {\n const skill = content.loadSkill(dir.split(/[\\\\/]/).pop()!);\n const xm = skill.frontmatter[\"x-skills-master\"];\n const key = `${xm.domain}:${xm.class}`;\n const name = pluginName(xm.domain, xm.class);\n const ctx: EmitContext = {\n projectRoot: out,\n paths: {\n claude: `plugins/${name}/skills`,\n cursor: \"\",\n copilot: \"\",\n agents: \"\",\n } as Record<TargetId, string>,\n };\n const files = claudeEmitter.emit(skill, ctx);\n const g = groups.get(key) ?? { domain: xm.domain, cls: xm.class, files: [], count: 0 };\n g.files.push(...files);\n g.count += 1;\n groups.set(key, g);\n }\n\n const plugins: {\n name: string;\n source: string;\n description: string;\n version: string;\n category: string;\n }[] = [];\n\n for (const { domain, cls, files, count } of groups.values()) {\n const name = pluginName(domain, cls);\n applyFiles(out, files, { overwrite: true });\n\n const description = `${titleCase(domain)} ${CLASS_LABEL[cls]}.`;\n const pluginDir = join(out, \"plugins\", name, \".claude-plugin\");\n mkdirSync(pluginDir, { recursive: true });\n const manifest = {\n name,\n version,\n description,\n author: { name: \"skills-master contributors\" },\n };\n writeFileSync(join(pluginDir, \"plugin.json\"), JSON.stringify(manifest, null, 2) + \"\\n\", \"utf8\");\n\n plugins.push({ name, source: `./plugins/${name}`, description, version, category: CLASS_CATEGORY[cls] });\n log.info(`Built ${name} (${count} skills).`);\n }\n\n plugins.sort((a, b) => a.name.localeCompare(b.name));\n const marketplace = {\n $schema: \"https://www.schemastore.org/claude-code-marketplace.json\",\n name: \"skills-master\",\n owner: { name: \"skills-master contributors\" },\n plugins,\n };\n const mpDir = join(out, \".claude-plugin\");\n mkdirSync(mpDir, { recursive: true });\n writeFileSync(join(mpDir, \"marketplace.json\"), JSON.stringify(marketplace, null, 2) + \"\\n\", \"utf8\");\n log.success(`Wrote .claude-plugin/marketplace.json (${plugins.length} plugins).`);\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveContent } from \"../content/source\";\nimport { CLASS_DIR, SkillClassSchema, type SkillClass } from \"../schema/frontmatter\";\nimport { log } from \"../util/log\";\n\nexport interface NewSkillOptions {\n /** \"domain/class/category/name\", e.g. \"apple/code/app-frameworks/swiftui-foo\". */\n spec: string;\n content?: string;\n cwd?: string;\n force?: boolean;\n}\n\nfunction template(domain: string, cls: SkillClass, category: string, name: string): string {\n const today = new Date().toISOString().slice(0, 10);\n return `---\nname: ${name}\ndescription: TODO — one-line, third person. Use when <triggers go here>.\nglobs:\n - \"**/*\"\ntags: []\nx-skills-master:\n domain: ${domain}\n class: ${cls}\n category: ${category}\n platforms: [${domain}]\n requires: {}\n pairs_with: []\n sources: []\n snapshot_date: \"${today}\"\n stability: emerging\n version: 0.1.0\n---\n\n## When to use\n\nTODO — when should an agent reach for this skill?\n\n## Core guidance\n\nTODO — the do/don't, idioms, and best practices (original prose, no copied docs).\n\n## Platform notes\n\nTODO — platform-specific caveats.\n\n## Pitfalls\n\nTODO — common mistakes.\n\n## References\n\n- **Documentation:** [TODO](https://developer.apple.com/documentation/...)\n- **Human Interface Guidelines:** [TODO](https://developer.apple.com/design/human-interface-guidelines/...)\n- **WWDC:** [TODO](https://developer.apple.com/videos/...)\n\n## See also\n\nTODO — paired skills referenced by name.\n`;\n}\n\nexport async function newSkillCommand(opts: NewSkillOptions): Promise<string> {\n const parts = opts.spec.split(\"/\").filter(Boolean);\n if (parts.length < 4) {\n throw new Error(`Expected \"domain/class/category/name\", got \"${opts.spec}\".`);\n }\n const domain = parts[0]!;\n const cls = SkillClassSchema.parse(parts[1]);\n const category = parts[2]!;\n const name = parts[parts.length - 1]!;\n\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const dir = join(content.root, domain, CLASS_DIR[cls], ...parts.slice(2));\n const skillMd = join(dir, \"SKILL.md\");\n\n if (existsSync(skillMd) && !opts.force) {\n throw new Error(`Skill already exists at ${skillMd} (use --force to overwrite).`);\n }\n mkdirSync(dir, { recursive: true });\n writeFileSync(skillMd, template(domain, cls, category, name), \"utf8\");\n log.success(`Created ${skillMd}`);\n return skillMd;\n}\n"],"mappings":"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","names":["existsSync","join","z","join","existsSync","existsSync","readFileSync","basename","join","existsSync","join","existsSync","readFileSync","join","z","join","readFileSync","existsSync","version","basename","join","existsSync","readFileSync","existsSync","readFileSync","join","existsSync","readdirSync","readFileSync","writeFileSync","join","version","version","join","existsSync","writeFileSync","readFileSync","readdirSync","join","existsSync","readFileSync","version","existsSync","readFileSync","writeFileSync","join","registry","existsSync","readFileSync","join","existsSync","join","readFileSync","existsSync","readFileSync","writeFileSync","join","z","z","registry","join","existsSync","readFileSync","writeFileSync","mkdirSync","writeFileSync","dirname","join","resolve","resolve","dirname","version","join","mkdirSync","writeFileSync","marketplace","existsSync","mkdirSync","writeFileSync","join","today","join","existsSync","mkdirSync","writeFileSync"]}
1
+ {"version":3,"sources":["../src/bin.ts","../package.json","../src/types.ts","../src/schema/projectConfig.ts","../src/core/yaml.ts","../src/emitters/util.ts","../src/emitters/claude.ts","../src/core/condense.ts","../src/emitters/cursor.ts","../src/emitters/copilot.ts","../src/emitters/agents.ts","../src/emitters/index.ts","../src/core/project.ts","../src/schema/lockfile.ts","../src/util/log.ts","../src/commands/init.ts","../src/content/source.ts","../src/core/discover.ts","../src/core/parse.ts","../src/schema/frontmatter.ts","../src/core/registry-build.ts","../src/core/install.ts","../src/core/compile.ts","../src/core/writer.ts","../src/core/markers.ts","../src/core/hash.ts","../src/core/gitignore.ts","../src/commands/add.ts","../src/commands/update.ts","../src/commands/remove.ts","../src/commands/doctor.ts","../src/commands/catalog.ts","../src/core/lint.ts","../src/commands/lint.ts","../src/commands/registry.ts","../src/schema/registry.ts","../src/commands/marketplace.ts","../src/commands/new.ts"],"sourcesContent":["import { Command } from \"commander\";\n// Single source of truth for the version. release.yml rewrites this\n// package.json before running the build, so the bundle carries the\n// released version; a literal here would silently report a stale one.\nimport { version } from \"../package.json\";\nimport { ALL_TARGETS, type TargetId } from \"./types\";\nimport { initCommand } from \"./commands/init\";\nimport { addCommand } from \"./commands/add\";\nimport { updateCommand } from \"./commands/update\";\nimport { removeCommand } from \"./commands/remove\";\nimport { doctorCommand } from \"./commands/doctor\";\nimport { listCommand, searchCommand, viewCommand } from \"./commands/catalog\";\nimport { lintCommand } from \"./commands/lint\";\nimport { registryBuildCommand } from \"./commands/registry\";\nimport { marketplaceBuildCommand } from \"./commands/marketplace\";\nimport { newSkillCommand } from \"./commands/new\";\nimport { log } from \"./util/log\";\n\nconst VALID = new Set<string>(ALL_TARGETS);\n\nfunction parseTargets(value?: string): TargetId[] | undefined {\n if (!value) return undefined;\n if (value === \"all\") return ALL_TARGETS;\n const ids = value.split(\",\").map((s) => s.trim()).filter(Boolean);\n for (const id of ids) {\n if (!VALID.has(id)) {\n throw new Error(`Unknown target \"${id}\". Valid: ${[...VALID, \"all\"].join(\", \")}.`);\n }\n }\n return ids as TargetId[];\n}\n\nasync function run(fn: () => Promise<unknown> | unknown, exitOnFalse = false): Promise<void> {\n try {\n const result = await fn();\n if (exitOnFalse && result === false) process.exitCode = 1;\n } catch (err) {\n log.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n\nconst program = new Command();\nprogram\n .name(\"skills-master\")\n .description(\"Install tool-agnostic Apple & Android development skills into any AI coding tool.\")\n .version(version);\n\nprogram\n .command(\"init\")\n .description(\"Detect tools and write skills-master.json\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--ref <ref>\", \"content git ref\")\n .option(\"--no-commit\", \"gitignore generated files instead of committing them\")\n .option(\"--force\", \"overwrite an existing config\")\n .action((opts) =>\n run(() =>\n initCommand({\n cwd: process.cwd(),\n targets: parseTargets(opts.target),\n commit: opts.commit,\n contentRef: opts.ref,\n force: opts.force,\n }),\n ),\n );\n\nprogram\n .command(\"list\")\n .description(\"List available skills\")\n .option(\"--domain <domain>\", \"e.g. apple, android\")\n .option(\"--class <class>\")\n .option(\"--category <category>\")\n .option(\"--platform <platform>\")\n .option(\"--json\")\n .option(\"--content <dir>\", \"local skills directory\")\n .option(\"--ref <ref>\")\n .action((opts) =>\n run(() =>\n listCommand({\n cwd: process.cwd(),\n domain: opts.domain,\n class: opts.class,\n category: opts.category,\n platform: opts.platform,\n json: opts.json,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"search <query>\")\n .description(\"Search skills by name, description, tags\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((query, opts) =>\n run(() => searchCommand({ cwd: process.cwd(), query, content: opts.content, ref: opts.ref })),\n );\n\nprogram\n .command(\"view <name>\")\n .description(\"Show a skill's metadata and body\")\n .option(\"--raw\", \"print the raw SKILL.md body\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((name, opts) =>\n run(() =>\n viewCommand({ cwd: process.cwd(), name, raw: opts.raw, content: opts.content, ref: opts.ref }),\n ),\n );\n\nprogram\n .command(\"add <names...>\")\n .description(\"Install skills (by name, category, or class) into your tools\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--with-pairs\", \"also install paired (code<->design) skills\")\n .option(\"--dry-run\", \"preview without writing\")\n .option(\"--overwrite\", \"overwrite changed files without asking\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((names, opts) =>\n run(() =>\n addCommand({\n cwd: process.cwd(),\n names,\n targets: parseTargets(opts.target),\n withPairs: opts.withPairs,\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"update [names...]\")\n .description(\"Re-install skills whose content changed\")\n .option(\"--dry-run\")\n .option(\"--overwrite\", \"force re-install, replacing local edits\")\n .option(\"--content <dir>\")\n .option(\"--ref <ref>\")\n .action((names, opts) =>\n run(() =>\n updateCommand({\n cwd: process.cwd(),\n names,\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n content: opts.content,\n ref: opts.ref,\n }),\n ),\n );\n\nprogram\n .command(\"remove <names...>\")\n .description(\"Remove installed skills\")\n .option(\"--target <list>\", \"comma list or 'all'\")\n .option(\"--dry-run\")\n .action((names, opts) =>\n run(() =>\n removeCommand({ cwd: process.cwd(), names, targets: parseTargets(opts.target), dryRun: opts.dryRun }),\n ),\n );\n\nprogram\n .command(\"doctor\")\n .description(\"Check installed skills for drift and missing files\")\n .action(() => run(() => doctorCommand({ cwd: process.cwd() })));\n\nprogram\n .command(\"lint\")\n .description(\"Validate the skill library (maintainer command)\")\n .option(\"--content <dir>\")\n .action((opts) => run(() => lintCommand({ cwd: process.cwd(), content: opts.content }), true));\n\nprogram\n .command(\"new <spec>\")\n .description(\"Scaffold a new skill: class/category/name (maintainer command)\")\n .option(\"--content <dir>\")\n .option(\"--force\")\n .action((spec, opts) =>\n run(() => newSkillCommand({ cwd: process.cwd(), spec, content: opts.content, force: opts.force })),\n );\n\nconst registry = program.command(\"registry\").description(\"Registry maintenance\");\nregistry\n .command(\"build\")\n .description(\"Generate registry.json from the skill tree\")\n .option(\"--content <dir>\")\n .option(\"--check\", \"verify the committed registry.json is current (CI)\")\n .option(\"--version <v>\")\n .action((opts) =>\n run(\n () => registryBuildCommand({ cwd: process.cwd(), content: opts.content, check: opts.check, version: opts.version }),\n true,\n ),\n );\n\nconst marketplace = program.command(\"marketplace\").description(\"Claude marketplace maintenance\");\nmarketplace\n .command(\"build\")\n .description(\"Generate .claude-plugin/marketplace.json and per-class plugins\")\n .option(\"--content <dir>\")\n .option(\"--out <dir>\", \"output root\")\n .option(\"--check\", \"verify the committed marketplace output is current (CI)\")\n .option(\"--version <v>\")\n .action((opts) =>\n run(\n () =>\n marketplaceBuildCommand({\n cwd: process.cwd(),\n content: opts.content,\n out: opts.out,\n check: opts.check,\n version: opts.version,\n }),\n true,\n ),\n );\n\nprogram.parseAsync(process.argv);\n","{\n \"name\": \"@ichintansoni/skills-master\",\n \"version\": \"0.1.6\",\n \"description\": \"Install tool-agnostic Apple & Android development skills into any AI coding tool (Claude Code, Cursor, Copilot, AGENTS.md).\",\n \"keywords\": [\n \"skills\",\n \"apple\",\n \"swift\",\n \"swiftui\",\n \"android\",\n \"kotlin\",\n \"jetpack-compose\",\n \"material3\",\n \"claude\",\n \"cursor\",\n \"copilot\",\n \"agents.md\",\n \"ai\",\n \"agent\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Chintan Soni\",\n \"homepage\": \"https://github.com/iChintanSoni/skills-master#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/iChintanSoni/skills-master.git\",\n \"directory\": \"packages/cli\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/iChintanSoni/skills-master/issues\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"skills-master\": \"./dist/bin.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsx src/bin.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"typecheck\": \"tsc --noEmit\",\n \"prepublishOnly\": \"tsup\"\n },\n \"dependencies\": {\n \"commander\": \"^15.0.0\",\n \"giget\": \"^3.3.1\",\n \"gray-matter\": \"^4.0.3\",\n \"semver\": \"^7.8.5\",\n \"yaml\": \"^2.5.1\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.1.0\",\n \"@types/semver\": \"^7.8.0\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.23.7\",\n \"typescript\": \"^6.0.3\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","/**\n * Shared types for the skills-master compiler.\n *\n * The canonical authored unit is a *skill*: a directory containing a `SKILL.md`\n * (frontmatter + body) plus optional on-demand resource files. An *emitter*\n * projects a parsed skill into the files a particular AI tool expects.\n */\n\nimport type { Frontmatter } from \"./schema/frontmatter\";\n\nexport type { Frontmatter } from \"./schema/frontmatter\";\n\n/** The four AI-tool targets shipped at launch. */\nexport type TargetId = \"claude\" | \"cursor\" | \"copilot\" | \"agents\";\n\nexport const ALL_TARGETS: TargetId[] = [\"claude\", \"cursor\", \"copilot\", \"agents\"];\n\n/** On-demand \"Level 3\" resource files that may sit beside a SKILL.md. */\nexport interface SkillResources {\n reference?: string;\n examples?: string;\n checklist?: string;\n}\n\nexport const RESOURCE_FILES = {\n reference: \"reference.md\",\n examples: \"examples.md\",\n checklist: \"checklist.md\",\n} as const;\n\nexport type ResourceKey = keyof typeof RESOURCE_FILES;\n\n/** A skill after its SKILL.md and resource files have been read and validated. */\nexport interface ParsedSkill {\n /** kebab-case name; equals the leaf folder name. */\n name: string;\n /** absolute path to the skill's source directory. */\n dir: string;\n /** path relative to the skills root, e.g. `code/app-frameworks/swiftdata-modeling`. */\n relPath: string;\n /** validated, normalized frontmatter. */\n frontmatter: Frontmatter;\n /** markdown body (everything after the frontmatter). */\n body: string;\n /** raw text of any present resource files. */\n resources: SkillResources;\n}\n\n/**\n * Output file modes:\n * - `whole` — the emitter owns the entire file (overwrite as a unit).\n * - `block` — the emitter owns only a marked region inside a shared file.\n */\nexport type FileMode = \"whole\" | \"block\";\n\nexport interface EmittedFile {\n /** path relative to the consuming project root. */\n path: string;\n /** for `whole`: the full file contents. for `block`: the managed region body. */\n contents: string;\n mode: FileMode;\n /** required for `block` mode — identifies the managed region (usually the skill name). */\n blockId?: string;\n /** for `block` mode — written into the BEGIN marker for drift detection. */\n blockVersion?: string;\n}\n\nexport interface EmitContext {\n /** absolute path to the consuming project root. */\n projectRoot: string;\n /** effective per-target output paths (already merged with defaults). */\n paths: Record<TargetId, string>;\n}\n\nexport interface Emitter {\n id: TargetId | (string & {});\n /** human label for logs. */\n label: string;\n /** detect whether this tool is present in a project (used by auto-detect). */\n detect(projectRoot: string): boolean;\n /** project a skill into target files. */\n emit(skill: ParsedSkill, ctx: EmitContext): EmittedFile[];\n}\n\n/** Result of applying a single EmittedFile to disk. */\nexport type WriteAction = \"created\" | \"updated\" | \"unchanged\" | \"skipped\";\n\nexport interface WriteResult {\n path: string;\n mode: FileMode;\n blockId?: string;\n action: WriteAction;\n}\n","import { z } from \"zod\";\nimport type { TargetId } from \"../types\";\n\nexport const TargetIdSchema = z.enum([\"claude\", \"cursor\", \"copilot\", \"agents\"]);\n\n/** Default output location per target, relative to the project root. */\nexport const DEFAULT_PATHS: Record<TargetId, string> = {\n claude: \".claude/skills\",\n cursor: \".cursor/rules\",\n copilot: \".github\",\n agents: \"AGENTS.md\",\n};\n\nexport const ProjectConfigSchema = z\n .object({\n $schema: z.string().optional(),\n /** Git ref of the content repo to install from (tag/branch/sha). */\n contentRef: z.string().default(\"main\"),\n /**\n * Targets to emit. Empty array means \"auto-detect on every run\".\n */\n targets: z.array(TargetIdSchema).default([]),\n /** Per-target output path overrides (merged over DEFAULT_PATHS). */\n paths: z\n .object({\n claude: z.string(),\n cursor: z.string(),\n copilot: z.string(),\n agents: z.string(),\n })\n .partial()\n .default({}),\n scope: z.enum([\"project\"]).default(\"project\"),\n /** true = commit generated files; false = add them to .gitignore. */\n commit: z.boolean().default(true),\n })\n .strict();\n\nexport type ProjectConfig = z.infer<typeof ProjectConfigSchema>;\n\nexport const CONFIG_FILENAME = \"skills-master.json\";\nexport const LOCKFILE_NAME = \"skills-master.lock.json\";\n\n/** Resolve effective output paths by merging overrides over the defaults. */\nexport function resolvePaths(cfg: ProjectConfig): Record<TargetId, string> {\n return { ...DEFAULT_PATHS, ...cfg.paths } as Record<TargetId, string>;\n}\n","import YAML from \"yaml\";\n\n/**\n * Serialize a frontmatter object to a deterministic YAML block (no `---` fences).\n * Insertion order of keys is preserved, so emitters control field order.\n * Long strings are not wrapped (lineWidth: 0), keeping descriptions on one line.\n */\nexport function toYaml(obj: Record<string, unknown>): string {\n return YAML.stringify(obj, { lineWidth: 0 }).trimEnd();\n}\n\n/** Wrap a YAML block in `---` fences for embedding at the top of a Markdown file. */\nexport function frontmatterBlock(obj: Record<string, unknown>): string {\n return `---\\n${toYaml(obj)}\\n---`;\n}\n\n/**\n * Build a full Markdown document from a frontmatter object and a body.\n * Guarantees exactly one blank line between the frontmatter and the body.\n */\nexport function withFrontmatter(obj: Record<string, unknown>, body: string): string {\n return `${frontmatterBlock(obj)}\\n\\n${body.trim()}\\n`;\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Frontmatter } from \"../schema/frontmatter\";\n\n/** True when `rel` exists under the project root (used for tool auto-detection). */\nexport function existsRel(root: string, rel: string): boolean {\n return existsSync(join(root, rel));\n}\n\nconst ACRONYMS: Record<string, string> = {\n hig: \"HIG\",\n ui: \"UI\",\n ml: \"ML\",\n ar: \"AR\",\n av: \"AV\",\n os: \"OS\",\n ci: \"CI\",\n cd: \"CD\",\n url: \"URL\",\n api: \"API\",\n sf: \"SF\",\n spm: \"SPM\",\n ios: \"iOS\",\n ipados: \"iPadOS\",\n macos: \"macOS\",\n tvos: \"tvOS\",\n visionos: \"visionOS\",\n watchos: \"watchOS\",\n};\n\n/** Human title derived from a kebab-case skill name (e.g. \"hig-sheets\" → \"HIG Sheets\"). */\nexport function titleFromName(name: string): string {\n return name\n .split(\"-\")\n .filter(Boolean)\n .map((w) => ACRONYMS[w] ?? w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n}\n\n/** Comma-join a skill's globs, or undefined if it declares none. */\nexport function globsToString(fm: Frontmatter): string | undefined {\n const g = fm.globs;\n if (!g || g.length === 0) return undefined;\n return g.join(\",\");\n}\n\n/** True when the skill ships any on-demand resource files. */\nexport function hasResources(resources: {\n reference?: string;\n examples?: string;\n checklist?: string;\n}): boolean {\n return Boolean(resources.reference || resources.examples || resources.checklist);\n}\n","import { RESOURCE_FILES, type Emitter, type EmittedFile, type ResourceKey } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { existsRel } from \"./util\";\n\n/**\n * Claude Code emitter — the lossless, native projection.\n * Writes `.claude/skills/<name>/SKILL.md` plus verbatim copies of any resource\n * files, preserving progressive disclosure. The `x-skills-master` block is\n * dropped; the body (including links to resource files, which are co-located)\n * is kept exactly.\n */\nexport const claudeEmitter: Emitter = {\n id: \"claude\",\n label: \"Claude Code\",\n detect: (root) => existsRel(root, \".claude\"),\n emit(skill, ctx): EmittedFile[] {\n const dir = `${ctx.paths.claude}/${skill.name}`;\n const fm = {\n name: skill.frontmatter.name,\n description: skill.frontmatter.description,\n };\n const files: EmittedFile[] = [\n {\n path: `${dir}/SKILL.md`,\n contents: withFrontmatter(fm, skill.body),\n mode: \"whole\",\n },\n ];\n for (const key of Object.keys(RESOURCE_FILES) as ResourceKey[]) {\n const text = skill.resources[key];\n if (text) {\n files.push({\n path: `${dir}/${RESOURCE_FILES[key]}`,\n contents: text.trimEnd() + \"\\n\",\n mode: \"whole\",\n });\n }\n }\n return files;\n },\n};\n","/**\n * Condense a canonical SKILL.md body for single-file targets (Cursor, Copilot,\n * AGENTS.md) that cannot carry on-demand resource files.\n *\n * - Links to reference.md / examples.md / checklist.md are flattened to plain\n * text and a one-line pointer to the full skill is appended (\"drop-and-note\").\n * - The `## Open question` section can optionally be summarized to a single\n * tradeoff line for terse targets.\n */\n\n// The character classes deliberately exclude their own delimiters and newlines.\n// A link-text class of [^\\]]+ can match \"[\", which makes every \"[\" an overlapping\n// restart position and the whole scan quadratic on adversarial input\n// (CodeQL js/polynomial-redos). Excluding \"[\" keeps restarts disjoint, so\n// matching stays linear. Markdown link text may not span lines here either.\nconst L3_LINK_RE =\n /\\[([^\\][\\n]+)\\]\\((?:\\.\\/)?(reference|examples|checklist)\\.md(?:#[^()\\n]*)?\\)/g;\n\nexport interface CondenseOptions {\n /** \"keep\" (default) leaves the section intact; \"summarize\" collapses it. */\n openQuestion?: \"keep\" | \"summarize\";\n /** whether the source skill had any resource files (drives the pointer note). */\n hadResources?: boolean;\n /** how to refer to the full skill in the appended note. */\n fullSkillNote?: string;\n}\n\nconst DEFAULT_NOTE =\n \"Extended reference and worked examples are available in the full Claude Code skill for this topic.\";\n\nexport function condenseBody(body: string, opts: CondenseOptions = {}): string {\n let out = body;\n let strippedLink = false;\n\n out = out.replace(L3_LINK_RE, (_m, text: string) => {\n strippedLink = true;\n return text;\n });\n\n if (opts.openQuestion === \"summarize\") {\n out = summarizeOpenQuestion(out);\n }\n\n out = out.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\n if (opts.hadResources || strippedLink) {\n out += `\\n\\n> ${opts.fullSkillNote ?? DEFAULT_NOTE}`;\n }\n\n return out + \"\\n\";\n}\n\nfunction summarizeOpenQuestion(body: string): string {\n const re = /^## Open question[ \\t]*\\n([\\s\\S]*?)(?=\\n## |\\s*$)/m;\n return body.replace(re, (_m, section: string) => {\n const firstPara = section.trim().split(/\\n\\s*\\n/)[0]?.replace(/\\s+/g, \" \").trim() ?? \"\";\n return `## Open question\\n\\nTradeoff: ${firstPara}\\n`;\n });\n}\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, globsToString, hasResources } from \"./util\";\n\n/**\n * Cursor emitter — `.cursor/rules/<name>.mdc`, a single file.\n * Frontmatter is exactly the three fields Cursor understands:\n * - `globs` present → Auto-Attached rule\n * - `globs` absent → Agent-Requested rule (description-driven)\n * A skills library never sets `alwaysApply: true` (that would inject every\n * skill into every chat).\n */\nexport const cursorEmitter: Emitter = {\n id: \"cursor\",\n label: \"Cursor\",\n detect: (root) => existsRel(root, \".cursor\"),\n emit(skill, ctx): EmittedFile[] {\n const globs = globsToString(skill.frontmatter);\n const fm: Record<string, unknown> = {\n description: skill.frontmatter.description,\n };\n if (globs) fm.globs = globs;\n fm.alwaysApply = false;\n\n const body = condenseBody(skill.body, {\n openQuestion: \"keep\",\n hadResources: hasResources(skill.resources),\n });\n\n return [\n {\n path: `${ctx.paths.cursor}/${skill.name}.mdc`,\n contents: withFrontmatter(fm, body),\n mode: \"whole\",\n },\n ];\n },\n};\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { withFrontmatter } from \"../core/yaml\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, globsToString, hasResources, titleFromName } from \"./util\";\n\n/**\n * GitHub Copilot emitter — two outputs:\n * 1. `.github/instructions/<name>.instructions.md` (whole file) with the\n * required `applyTo` glob and the condensed body.\n * 2. a one-line pointer block in `.github/copilot-instructions.md` (managed\n * via sentinel markers) so the always-loaded root file stays small.\n */\nexport const copilotEmitter: Emitter = {\n id: \"copilot\",\n label: \"GitHub Copilot\",\n detect: (root) => existsRel(root, \".github\"),\n emit(skill, ctx): EmittedFile[] {\n const base = ctx.paths.copilot; // e.g. \".github\"\n const instructionsPath = `${base}/instructions/${skill.name}.instructions.md`;\n const applyTo = globsToString(skill.frontmatter) ?? \"**\";\n\n const fm = {\n applyTo,\n description: skill.frontmatter.description,\n };\n const body = condenseBody(skill.body, {\n openQuestion: \"keep\",\n hadResources: hasResources(skill.resources),\n });\n\n const pointer = `For ${titleFromName(skill.name)} guidance, see \\`${instructionsPath}\\`.`;\n\n return [\n {\n path: instructionsPath,\n contents: withFrontmatter(fm, body),\n mode: \"whole\",\n },\n {\n path: `${base}/copilot-instructions.md`,\n contents: pointer,\n mode: \"block\",\n blockId: skill.name,\n blockVersion: skill.frontmatter[\"x-skills-master\"].version,\n },\n ];\n },\n};\n","import { type Emitter, type EmittedFile } from \"../types\";\nimport { condenseBody } from \"../core/condense\";\nimport { existsRel, hasResources, titleFromName } from \"./util\";\n\n/**\n * AGENTS.md emitter — the broad cross-tool standard. Plain Markdown, no\n * frontmatter (per the spec). Each skill becomes a `###` section inside a\n * sentinel-managed block so installs compose and updates stay surgical.\n * Bodies are summarized aggressively (this file is read in full by many tools).\n */\nexport const agentsEmitter: Emitter = {\n id: \"agents\",\n label: \"AGENTS.md\",\n detect: (root) => existsRel(root, \"AGENTS.md\"),\n emit(skill, ctx): EmittedFile[] {\n const body = condenseBody(skill.body, {\n openQuestion: \"summarize\",\n hadResources: hasResources(skill.resources),\n });\n const section = `### ${titleFromName(skill.name)}\\n\\n${body.trim()}`;\n return [\n {\n path: ctx.paths.agents,\n contents: section,\n mode: \"block\",\n blockId: skill.name,\n blockVersion: skill.frontmatter[\"x-skills-master\"].version,\n },\n ];\n },\n};\n","import type { Emitter, TargetId } from \"../types\";\nimport { claudeEmitter } from \"./claude\";\nimport { cursorEmitter } from \"./cursor\";\nimport { copilotEmitter } from \"./copilot\";\nimport { agentsEmitter } from \"./agents\";\n\n/**\n * The emitter registry. Adding support for a new tool (Windsurf, Cline, …) is a\n * one-line change here plus a new emitter file — the rest of the pipeline is\n * generic over the `Emitter` interface.\n */\nexport const EMITTERS: Emitter[] = [\n claudeEmitter,\n cursorEmitter,\n copilotEmitter,\n agentsEmitter,\n];\n\nconst BY_ID = new Map<string, Emitter>(EMITTERS.map((e) => [e.id, e]));\n\nexport function getEmitter(id: string): Emitter | undefined {\n return BY_ID.get(id);\n}\n\n/** Detect which targets are present in a project. */\nexport function detectTargets(projectRoot: string): TargetId[] {\n return EMITTERS.filter((e) => e.detect(projectRoot)).map((e) => e.id as TargetId);\n}\n\nexport { claudeEmitter, cursorEmitter, copilotEmitter, agentsEmitter };\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n CONFIG_FILENAME,\n LOCKFILE_NAME,\n ProjectConfigSchema,\n type ProjectConfig,\n} from \"../schema/projectConfig\";\nimport { LockfileSchema, emptyLockfile, type Lockfile } from \"../schema/lockfile\";\n\nexport function configPath(root: string): string {\n return join(root, CONFIG_FILENAME);\n}\nexport function lockfilePath(root: string): string {\n return join(root, LOCKFILE_NAME);\n}\n\nexport function loadConfig(root: string): ProjectConfig | null {\n const p = configPath(root);\n if (!existsSync(p)) return null;\n return ProjectConfigSchema.parse(JSON.parse(readFileSync(p, \"utf8\")));\n}\n\n/** Load config, or return parsed defaults if none exists. */\nexport function loadConfigOrDefault(root: string): ProjectConfig {\n return loadConfig(root) ?? ProjectConfigSchema.parse({});\n}\n\nexport function saveConfig(root: string, cfg: ProjectConfig): void {\n const withSchema = { $schema: \"https://skills-master.dev/schema/config.json\", ...cfg };\n writeFileSync(configPath(root), JSON.stringify(withSchema, null, 2) + \"\\n\", \"utf8\");\n}\n\nexport function loadLockfile(root: string): Lockfile {\n const p = lockfilePath(root);\n if (!existsSync(p)) return emptyLockfile();\n return LockfileSchema.parse(JSON.parse(readFileSync(p, \"utf8\")));\n}\n\nexport function saveLockfile(root: string, lock: Lockfile): void {\n writeFileSync(lockfilePath(root), JSON.stringify(lock, null, 2) + \"\\n\", \"utf8\");\n}\n","import { z } from \"zod\";\n\n/** Records, per target, which files an install produced and their content hash. */\nexport const EmittedTargetSchema = z.object({\n /** whole-file outputs owned by this target for this skill. */\n files: z.array(z.string()).default([]),\n /** shared file this skill writes a managed block into (block-mode targets). */\n block: z.string().optional(),\n /** sha256 of the concatenated emitted contents, for drift detection. */\n hash: z.string(),\n});\n\nexport const LockedSkillSchema = z.object({\n /** resolved skill version at install time. */\n version: z.string(),\n /** sha256 of the canonical SKILL.md + resource files at install time. */\n sourceHash: z.string(),\n /** targets this skill was emitted to. */\n emitted: z.record(z.string(), EmittedTargetSchema),\n});\n\nexport const LockfileSchema = z.object({\n lockfileVersion: z.literal(1).default(1),\n contentRef: z.string().default(\"main\"),\n skills: z.record(z.string(), LockedSkillSchema).default({}),\n});\n\nexport type EmittedTarget = z.infer<typeof EmittedTargetSchema>;\nexport type LockedSkill = z.infer<typeof LockedSkillSchema>;\nexport type Lockfile = z.infer<typeof LockfileSchema>;\n\nexport function emptyLockfile(contentRef = \"main\"): Lockfile {\n return { lockfileVersion: 1, contentRef, skills: {} };\n}\n","/* Minimal, dependency-free logger so core modules don't couple to a prompt lib. */\n\nlet quiet = false;\nexport function setQuiet(v: boolean): void {\n quiet = v;\n}\n\nconst sym = {\n info: \"•\",\n ok: \"✓\",\n warn: \"!\",\n err: \"✗\",\n};\n\nexport const log = {\n plain(msg: string): void {\n if (!quiet) console.log(msg);\n },\n info(msg: string): void {\n if (!quiet) console.log(`${sym.info} ${msg}`);\n },\n success(msg: string): void {\n if (!quiet) console.log(`${sym.ok} ${msg}`);\n },\n warn(msg: string): void {\n if (!quiet) console.warn(`${sym.warn} ${msg}`);\n },\n error(msg: string): void {\n console.error(`${sym.err} ${msg}`);\n },\n};\n","import { ProjectConfigSchema, type ProjectConfig } from \"../schema/projectConfig\";\nimport { ALL_TARGETS, type TargetId } from \"../types\";\nimport { detectTargets } from \"../emitters\";\nimport { loadConfig, saveConfig } from \"../core/project\";\nimport { log } from \"../util/log\";\n\nexport interface InitOptions {\n cwd: string;\n /** explicit target set; if omitted, auto-detect (falling back to all). */\n targets?: TargetId[];\n commit?: boolean;\n contentRef?: string;\n force?: boolean;\n}\n\nexport function initCommand(opts: InitOptions): ProjectConfig {\n const existing = loadConfig(opts.cwd);\n if (existing && !opts.force) {\n log.warn(`skills-master.json already exists — leaving it untouched (use --force to overwrite).`);\n return existing;\n }\n\n let targets = opts.targets;\n if (!targets || targets.length === 0) {\n const detected = detectTargets(opts.cwd);\n if (detected.length > 0) {\n targets = detected;\n log.info(`Detected tools: ${detected.join(\", \")}`);\n } else {\n targets = ALL_TARGETS;\n log.info(`No tools detected — defaulting to all targets (${ALL_TARGETS.join(\", \")}).`);\n }\n }\n\n const cfg = ProjectConfigSchema.parse({\n contentRef: opts.contentRef ?? \"main\",\n targets,\n commit: opts.commit ?? true,\n });\n saveConfig(opts.cwd, cfg);\n log.success(`Wrote skills-master.json (targets: ${targets.join(\", \")}, commit: ${cfg.commit}).`);\n return cfg;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, isAbsolute, join, resolve } from \"node:path\";\nimport { findSkillDirs } from \"../core/discover\";\nimport { loadSkill } from \"../core/parse\";\nimport { buildRegistry } from \"../core/registry-build\";\nimport type { Registry } from \"../schema/registry\";\nimport type { ParsedSkill } from \"../types\";\n\n/** Default content repo (override with SKILLS_MASTER_REPO). */\nconst DEFAULT_REPO = \"github:iChintanSoni/skills-master\";\n\n/** package.json `name` that identifies the skills-master content repo (dev checkout). */\nconst CONTENT_REPO_PACKAGE = \"skills-master-monorepo\";\n\n/** A resolved, on-disk skills tree the CLI reads from. */\nexport class ContentSource {\n constructor(public readonly root: string) {}\n\n skillDirs(): string[] {\n return findSkillDirs(this.root);\n }\n\n findDir(name: string): string | undefined {\n const dirs = this.skillDirs();\n return dirs.find((d) => basename(d) === name) ?? dirs.find((d) => safeName(d, this.root) === name);\n }\n\n loadSkill(name: string): ParsedSkill {\n const dir = this.findDir(name);\n if (!dir) throw new Error(`Skill \"${name}\" not found in content at ${this.root}`);\n return loadSkill(dir, this.root);\n }\n\n registry(): Registry {\n return buildRegistry(this.root);\n }\n}\n\nfunction safeName(dir: string, root: string): string {\n try {\n return loadSkill(dir, root).name;\n } catch {\n return \"\";\n }\n}\n\nexport interface ResolveContentOptions {\n /** explicit path to a local skills directory. */\n content?: string;\n /** git ref for remote fetch. */\n ref?: string;\n /** start dir for the upward repo search. */\n cwd?: string;\n}\n\n/**\n * Resolve where skill content lives, in priority order:\n * 1. explicit `--content <dir>`\n * 2. SKILLS_MASTER_CONTENT env var\n * 3. the skills-master content repo, if running inside it (dev convenience, searched upward)\n * 4. remote fetch via giget (published content)\n */\nexport async function resolveContent(opts: ResolveContentOptions = {}): Promise<ContentSource> {\n if (opts.content) {\n const root = isAbsolute(opts.content) ? opts.content : resolve(process.cwd(), opts.content);\n return new ContentSource(root);\n }\n const env = process.env.SKILLS_MASTER_CONTENT;\n if (env) return new ContentSource(resolve(env));\n\n const local = findLocalSkillsDir(opts.cwd ?? process.cwd());\n if (local) return new ContentSource(local);\n\n return new ContentSource(await fetchRemote(opts.ref ?? \"main\"));\n}\n\n/**\n * Walk upward looking for the skills-master content repo: a root whose\n * `package.json` name is {@link CONTENT_REPO_PACKAGE} and that has a `skills/`\n * subtree. Keying on the package name (not just any pnpm workspace with a\n * `skills/` dir) keeps an unrelated monorepo from hijacking content resolution.\n */\nfunction findLocalSkillsDir(start: string): string | null {\n let dir = resolve(start);\n for (let i = 0; i < 8; i++) {\n const candidate = join(dir, \"skills\");\n if (existsSync(candidate) && isContentRepoRoot(dir)) return candidate;\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/** True when `dir` is the skills-master monorepo root (by package.json name). */\nfunction isContentRepoRoot(dir: string): boolean {\n try {\n const pkg = JSON.parse(readFileSync(join(dir, \"package.json\"), \"utf8\")) as { name?: string };\n return pkg.name === CONTENT_REPO_PACKAGE;\n } catch {\n return false;\n }\n}\n\n/** Download the `skills/` subtree of the content repo to a local cache. */\nasync function fetchRemote(ref: string): Promise<string> {\n const repo = process.env.SKILLS_MASTER_REPO ?? DEFAULT_REPO;\n const cacheDir = join(homedir(), \".skills-master-cache\", ref.replace(/[^\\w.-]/g, \"_\"));\n const { downloadTemplate } = await import(\"giget\");\n const { dir } = await downloadTemplate(`${repo}/skills#${ref}`, {\n dir: cacheDir,\n force: true,\n forceClean: true,\n });\n return dir;\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\n\nconst SKILL_FILE = \"SKILL.md\";\nconst IGNORE = new Set([\"node_modules\", \".git\", \"dist\", \".cache\"]);\n\n/**\n * Recursively find every directory under `skillsRoot` that contains a SKILL.md.\n * Returns absolute directory paths, sorted for deterministic output.\n */\nexport function findSkillDirs(skillsRoot: string): string[] {\n const found: string[] = [];\n if (!existsSync(skillsRoot)) return found;\n\n const walk = (dir: string): void => {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n if (entries.includes(SKILL_FILE)) found.push(dir);\n for (const entry of entries) {\n if (IGNORE.has(entry) || entry.startsWith(\".\")) continue;\n const full = join(dir, entry);\n let isDir = false;\n try {\n isDir = statSync(full).isDirectory();\n } catch {\n isDir = false;\n }\n if (isDir) walk(full);\n }\n };\n\n walk(skillsRoot);\n return found.sort();\n}\n\n/** Path of a skill dir relative to the skills root (uses forward slashes). */\nexport function relPathOf(skillsRoot: string, dir: string): string {\n return relative(skillsRoot, dir).split(/[\\\\/]/).join(\"/\");\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport { FrontmatterSchema, type Frontmatter } from \"../schema/frontmatter\";\nimport {\n RESOURCE_FILES,\n type ParsedSkill,\n type ResourceKey,\n type SkillResources,\n} from \"../types\";\nimport { relPathOf } from \"./discover\";\n\nexport interface RawSkill {\n dir: string;\n relPath: string;\n /** leaf folder name (the expected `name`). */\n folderName: string;\n /** unvalidated frontmatter object. */\n data: Record<string, unknown>;\n body: string;\n resources: SkillResources;\n skillMdPath: string;\n /** full unparsed SKILL.md text (used for YAML-hazard linting). */\n rawText: string;\n}\n\n/** Read a skill directory's SKILL.md and resource files without validating. */\nexport function loadRawSkill(dir: string, skillsRoot: string): RawSkill {\n const skillMdPath = join(dir, \"SKILL.md\");\n const rawText = readFileSync(skillMdPath, \"utf8\");\n const parsed = matter(rawText);\n\n const resources: SkillResources = {};\n for (const key of Object.keys(RESOURCE_FILES) as ResourceKey[]) {\n const p = join(dir, RESOURCE_FILES[key]);\n if (existsSync(p)) resources[key] = readFileSync(p, \"utf8\");\n }\n\n return {\n dir,\n relPath: relPathOf(skillsRoot, dir),\n folderName: basename(dir),\n data: parsed.data as Record<string, unknown>,\n body: parsed.content.replace(/^\\n+/, \"\").trimEnd(),\n resources,\n skillMdPath,\n rawText,\n };\n}\n\nexport class SkillValidationError extends Error {\n constructor(\n public readonly relPath: string,\n public readonly issues: string[],\n ) {\n super(`Invalid skill \"${relPath}\":\\n - ${issues.join(\"\\n - \")}`);\n this.name = \"SkillValidationError\";\n }\n}\n\n/** Validate raw frontmatter; returns the typed frontmatter or a list of issues. */\nexport function validateFrontmatter(\n data: Record<string, unknown>,\n): { ok: true; value: Frontmatter } | { ok: false; issues: string[] } {\n const result = FrontmatterSchema.safeParse(data);\n if (result.success) return { ok: true, value: result.data };\n const issues = result.error.issues.map((i) => {\n const path = i.path.join(\".\");\n return path ? `${path}: ${i.message}` : i.message;\n });\n return { ok: false, issues };\n}\n\n/** Load and validate a skill directory into a ParsedSkill (throws on failure). */\nexport function loadSkill(dir: string, skillsRoot: string): ParsedSkill {\n const raw = loadRawSkill(dir, skillsRoot);\n const validated = validateFrontmatter(raw.data);\n if (!validated.ok) throw new SkillValidationError(raw.relPath, validated.issues);\n return {\n name: validated.value.name,\n dir: raw.dir,\n relPath: raw.relPath,\n frontmatter: validated.value,\n body: raw.body,\n resources: raw.resources,\n };\n}\n","import { z } from \"zod\";\nimport semver from \"semver\";\n\n/** kebab-case, used for skill `name` and `pairs_with` references. */\nexport const NAME_RE = /^[a-z0-9-]{1,64}$/;\nexport const ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nexport const StabilitySchema = z.enum([\"stable\", \"emerging\", \"contested\"]);\nexport type Stability = z.infer<typeof StabilitySchema>;\n\n/**\n * Skill classes are reusable across domains (Apple, Android, web, …):\n * - code → produces compilable code\n * - design → produces UX/design critique (e.g. Apple HIG, Material)\n * - lang-tooling → cross-cutting language/build/test/ship guidance\n * - overview → decision-guidance routers\n */\nexport const SkillClassSchema = z.enum([\n \"code\",\n \"design\",\n \"lang-tooling\",\n \"overview\",\n]);\nexport type SkillClass = z.infer<typeof SkillClassSchema>;\n\n/** Maps a skill `class` to its directory name within a domain in `skills/<domain>/`. */\nexport const CLASS_DIR: Record<SkillClass, string> = {\n code: \"code\",\n design: \"design\",\n \"lang-tooling\": \"lang-tooling\",\n overview: \"overviews\",\n};\n\n/**\n * Our private metadata block. Stripped from every projected output.\n * Domain-agnostic by design: `domain` namespaces a technology ecosystem\n * (apple, android, web, …); `platforms` and `requires` are free-form so each\n * domain defines its own vocabulary (ios/android/wear-os; {ios:\"17\"} / {android:\"14\"}).\n */\nexport const XSkillsMasterSchema = z\n .object({\n domain: z.string().min(1),\n class: SkillClassSchema,\n category: z.string().min(1),\n platforms: z.array(z.string().min(1)).min(1),\n /** domain-defined version requirements, e.g. { ios: \"17\", swift: \"6.0\" }. */\n requires: z.record(z.string(), z.string()).optional(),\n pairs_with: z.array(z.string().regex(NAME_RE)).default([]),\n /** citation URLs to canonical docs — never verbatim content. */\n sources: z.array(z.string().url()).default([]),\n snapshot_date: z.string().regex(ISO_DATE_RE, \"must be an ISO date (YYYY-MM-DD)\"),\n stability: StabilitySchema,\n version: z\n .string()\n .refine((v) => semver.valid(v) != null, \"must be a valid semver version\"),\n })\n .strict();\nexport type XSkillsMaster = z.infer<typeof XSkillsMasterSchema>;\n\n/** `globs` may be authored as a string or array; normalized to an array. */\nconst GlobsSchema = z\n .union([z.string(), z.array(z.string())])\n .transform((g) => (Array.isArray(g) ? g : [g]))\n .optional();\n\nexport const FrontmatterSchema = z\n .object({\n name: z.string().regex(NAME_RE, \"must be kebab-case ([a-z0-9-], <=64 chars)\"),\n description: z\n .string()\n .min(1, \"description is required\")\n .max(1024, \"description must be <= 1024 characters\"),\n globs: GlobsSchema,\n tags: z.array(z.string()).default([]),\n \"x-skills-master\": XSkillsMasterSchema,\n })\n // Tolerate tool-native extras (e.g. allowed-tools) without failing validation.\n .passthrough();\nexport type Frontmatter = z.infer<typeof FrontmatterSchema>;\n","import { findSkillDirs } from \"./discover\";\nimport { loadSkill } from \"./parse\";\nimport type { Registry, RegistryEntry } from \"../schema/registry\";\n\n/**\n * Build the catalog from the skill tree. Output is deterministic (no timestamp)\n * so a committed `registry.json` can be drift-checked in CI.\n */\nexport function buildRegistry(skillsRoot: string, version = \"0.1.0\"): Registry {\n const dirs = findSkillDirs(skillsRoot);\n const skills: RegistryEntry[] = dirs.map((dir) => {\n const s = loadSkill(dir, skillsRoot);\n const xm = s.frontmatter[\"x-skills-master\"];\n return {\n name: s.name,\n domain: xm.domain,\n class: xm.class,\n category: xm.category,\n description: s.frontmatter.description,\n platforms: xm.platforms,\n stability: xm.stability,\n version: xm.version,\n tags: s.frontmatter.tags ?? [],\n pairs_with: xm.pairs_with,\n path: s.relPath,\n resources: {\n reference: Boolean(s.resources.reference),\n examples: Boolean(s.resources.examples),\n checklist: Boolean(s.resources.checklist),\n },\n };\n });\n skills.sort((a, b) => a.name.localeCompare(b.name));\n return {\n $schema: \"https://skills-master.dev/schema/registry.json\",\n version,\n skills,\n };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ParsedSkill, TargetId } from \"../types\";\nimport type { LockedSkill } from \"../schema/lockfile\";\nimport { compileSkill } from \"./compile\";\nimport { applyFiles, type ApplyOptions, type DetailedWriteResult } from \"./writer\";\nimport { sha256 } from \"./hash\";\n\nexport interface InstallResult {\n name: string;\n version: string;\n results: DetailedWriteResult[];\n locked: LockedSkill;\n}\n\n/** Hash a skill's canonical source for drift detection. */\nexport function sourceHashOf(skill: ParsedSkill): string {\n const xm = skill.frontmatter[\"x-skills-master\"];\n return sha256(\n skill.relPath,\n xm.version,\n skill.frontmatter.description,\n skill.body,\n skill.resources.reference ?? \"\",\n skill.resources.examples ?? \"\",\n skill.resources.checklist ?? \"\",\n );\n}\n\n/**\n * Hash the given whole-file outputs as they currently exist on disk. Both the\n * lockfile (at install time) and the `update`/`doctor` drift checks use this\n * one function, so a clean install always reconciles.\n */\nexport function diskHash(projectRoot: string, relPaths: string[]): string {\n const sorted = [...relPaths].sort((a, b) => a.localeCompare(b));\n const parts: string[] = [];\n for (const p of sorted) {\n const abs = join(projectRoot, p);\n const contents = existsSync(abs) ? readFileSync(abs, \"utf8\") : \"<<missing>>\";\n parts.push(p, contents);\n }\n return sha256(...parts);\n}\n\n/** Compile a skill to the given targets and write the outputs to a project. */\nexport function installSkill(\n projectRoot: string,\n skill: ParsedSkill,\n targets: TargetId[],\n paths: Record<TargetId, string>,\n opts: ApplyOptions = {},\n): InstallResult {\n const compiled = compileSkill(skill, targets, { projectRoot, paths });\n const allFiles = compiled.flatMap((c) => c.files);\n const results = applyFiles(projectRoot, allFiles, opts);\n\n const emitted: LockedSkill[\"emitted\"] = {};\n for (const c of compiled) {\n const whole = c.files.filter((f) => f.mode === \"whole\").map((f) => f.path);\n const block = c.files.find((f) => f.mode === \"block\")?.path;\n // Hash covers only whole-file outputs (block files are marker-managed and\n // safe to reconcile). Computed from disk after writing so the lockfile\n // records what actually landed; in dry-run nothing is written or saved.\n const hash = opts.dryRun ? sha256(\"dry-run\", ...whole) : diskHash(projectRoot, whole);\n emitted[c.target] = { files: whole, ...(block ? { block } : {}), hash };\n }\n\n const version = skill.frontmatter[\"x-skills-master\"].version;\n return {\n name: skill.name,\n version,\n results,\n locked: { version, sourceHash: sourceHashOf(skill), emitted },\n };\n}\n","import type { EmitContext, EmittedFile, ParsedSkill, TargetId } from \"../types\";\nimport { getEmitter } from \"../emitters\";\n\nexport interface CompiledTarget {\n target: TargetId;\n files: EmittedFile[];\n}\n\n/** Run the emitters for the requested targets over a single skill. */\nexport function compileSkill(\n skill: ParsedSkill,\n targets: TargetId[],\n ctx: EmitContext,\n): CompiledTarget[] {\n const out: CompiledTarget[] = [];\n for (const target of targets) {\n const emitter = getEmitter(target);\n if (!emitter) throw new Error(`Unknown target: ${target}`);\n out.push({ target, files: emitter.emit(skill, ctx) });\n }\n return out;\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, rmdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { EmittedFile, WriteAction, WriteResult } from \"../types\";\nimport { hasBlock, removeBlock, upsertBlock } from \"./markers\";\n\nexport type ConflictChoice = \"overwrite\" | \"skip\";\n\nexport interface ApplyOptions {\n dryRun?: boolean;\n /** force-overwrite changed whole-files without asking. */\n overwrite?: boolean;\n /** called for a changed whole-file when neither overwrite nor dryRun is set. */\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface DetailedWriteResult extends WriteResult {\n /** previous file contents (whole-file) when it changed — for diff previews. */\n before?: string;\n /** new file contents (whole-file) when it changed. */\n after?: string;\n}\n\nfunction ensureDir(absPath: string): void {\n mkdirSync(dirname(absPath), { recursive: true });\n}\n\nfunction applyWhole(\n projectRoot: string,\n file: EmittedFile,\n opts: ApplyOptions,\n): DetailedWriteResult {\n const abs = join(projectRoot, file.path);\n const exists = existsSync(abs);\n const next = file.contents;\n\n if (!exists) {\n if (!opts.dryRun) {\n ensureDir(abs);\n writeFileSync(abs, next, \"utf8\");\n }\n return { path: file.path, mode: \"whole\", action: \"created\", after: next };\n }\n\n const current = readFileSync(abs, \"utf8\");\n if (current === next) {\n return { path: file.path, mode: \"whole\", action: \"unchanged\" };\n }\n\n // changed\n let choice: ConflictChoice = \"overwrite\";\n if (!opts.overwrite) {\n choice = opts.onConflict ? opts.onConflict(file.path) : opts.dryRun ? \"overwrite\" : \"skip\";\n }\n if (choice === \"skip\") {\n return { path: file.path, mode: \"whole\", action: \"skipped\", before: current, after: next };\n }\n if (!opts.dryRun) writeFileSync(abs, next, \"utf8\");\n return { path: file.path, mode: \"whole\", action: \"updated\", before: current, after: next };\n}\n\nfunction applyBlock(\n projectRoot: string,\n file: EmittedFile,\n opts: ApplyOptions,\n): DetailedWriteResult {\n const abs = join(projectRoot, file.path);\n const exists = existsSync(abs);\n const current = exists ? readFileSync(abs, \"utf8\") : \"\";\n const blockId = file.blockId!;\n const next = upsertBlock(current, blockId, file.contents, file.blockVersion);\n\n let action: WriteAction;\n if (current === next) action = \"unchanged\";\n else if (!exists || !hasBlock(current, blockId)) action = \"created\";\n else action = \"updated\";\n\n if (action !== \"unchanged\" && !opts.dryRun) {\n ensureDir(abs);\n writeFileSync(abs, next, \"utf8\");\n }\n return { path: file.path, mode: \"block\", blockId, action };\n}\n\n/** Apply a batch of emitted files to a project. */\nexport function applyFiles(\n projectRoot: string,\n files: EmittedFile[],\n opts: ApplyOptions = {},\n): DetailedWriteResult[] {\n return files.map((f) =>\n f.mode === \"block\" ? applyBlock(projectRoot, f, opts) : applyWhole(projectRoot, f, opts),\n );\n}\n\n/** Remove now-empty ancestor directories of the given files, up to (not incl.) the project root. */\nexport function pruneEmptyDirs(projectRoot: string, relFilePaths: string[], dryRun = false): void {\n if (dryRun) return;\n const seen = new Set<string>();\n for (const rel of relFilePaths) {\n let dir = dirname(join(projectRoot, rel));\n while (dir.startsWith(projectRoot) && dir !== projectRoot && !seen.has(dir)) {\n seen.add(dir);\n try {\n if (existsSync(dir) && readdirSync(dir).length === 0) {\n rmdirSync(dir);\n dir = dirname(dir);\n } else break;\n } catch {\n break;\n }\n }\n }\n}\n\n/** Remove a whole-file output. */\nexport function removeWholeFile(projectRoot: string, relPath: string, dryRun = false): boolean {\n const abs = join(projectRoot, relPath);\n if (!existsSync(abs)) return false;\n if (!dryRun) rmSync(abs);\n return true;\n}\n\n/**\n * Remove a managed block from a shared file. Deletes the file if it becomes\n * empty. Returns true if anything changed.\n */\nexport function removeBlockFromFile(\n projectRoot: string,\n relPath: string,\n blockId: string,\n dryRun = false,\n): boolean {\n const abs = join(projectRoot, relPath);\n if (!existsSync(abs)) return false;\n const current = readFileSync(abs, \"utf8\");\n if (!hasBlock(current, blockId)) return false;\n const next = removeBlock(current, blockId);\n if (!dryRun) {\n if (next.trim().length === 0) rmSync(abs);\n else writeFileSync(abs, next, \"utf8\");\n }\n return true;\n}\n","/**\n * Sentinel-marker management for shared files (AGENTS.md, copilot-instructions.md).\n *\n * A managed region looks like:\n *\n * <!-- BEGIN skills-master:<id> v<version> -->\n * ...generated content...\n * <!-- END skills-master:<id> -->\n *\n * Only the bytes between (and including) the markers are ever touched, so any\n * hand-written content elsewhere in the file is preserved.\n */\n\nconst PREFIX = \"skills-master\";\n\nfunction escapeRe(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function beginMarker(id: string, version?: string): string {\n return version\n ? `<!-- BEGIN ${PREFIX}:${id} v${version} -->`\n : `<!-- BEGIN ${PREFIX}:${id} -->`;\n}\n\nexport function endMarker(id: string): string {\n return `<!-- END ${PREFIX}:${id} -->`;\n}\n\nfunction blockRegex(id: string): RegExp {\n const esc = escapeRe(id);\n return new RegExp(\n `[ \\\\t]*<!-- BEGIN ${PREFIX}:${esc}(?: v[^>]*)? -->[\\\\s\\\\S]*?<!-- END ${PREFIX}:${esc} -->`,\n );\n}\n\n/** Build a complete managed block (markers + body). */\nexport function renderBlock(id: string, body: string, version?: string): string {\n return `${beginMarker(id, version)}\\n${body.trim()}\\n${endMarker(id)}`;\n}\n\nexport function hasBlock(file: string, id: string): boolean {\n return blockRegex(id).test(file);\n}\n\n/** Read the inner body of a managed block, or null if absent. */\nexport function readBlock(file: string, id: string): string | null {\n const m = blockRegex(id).exec(file);\n if (!m) return null;\n const inner = m[0]\n .replace(new RegExp(`^[ \\\\t]*<!-- BEGIN ${PREFIX}:${escapeRe(id)}(?: v[^>]*)? -->\\\\n?`), \"\")\n .replace(new RegExp(`\\\\n?<!-- END ${PREFIX}:${escapeRe(id)} -->$`), \"\");\n return inner;\n}\n\n/** Read the version recorded in a block's BEGIN marker, or null. */\nexport function readBlockVersion(file: string, id: string): string | null {\n const m = new RegExp(\n `<!-- BEGIN ${PREFIX}:${escapeRe(id)} v([^\\\\s>]+) -->`,\n ).exec(file);\n return m && m[1] ? m[1] : null;\n}\n\n/**\n * Insert or replace a managed block. Returns the new file contents.\n * If the block is absent it is appended, separated by a blank line.\n */\nexport function upsertBlock(\n file: string,\n id: string,\n body: string,\n version?: string,\n): string {\n const block = renderBlock(id, body, version);\n const re = blockRegex(id);\n if (re.test(file)) {\n return file.replace(re, block);\n }\n const base = file.replace(/\\s+$/, \"\");\n if (base.length === 0) return block + \"\\n\";\n return `${base}\\n\\n${block}\\n`;\n}\n\n/**\n * Remove a managed block (and a trailing blank line). Returns the new contents.\n * If the file becomes empty (only whitespace), returns the empty string so the\n * caller can delete it.\n */\nexport function removeBlock(file: string, id: string): string {\n const re = new RegExp(blockRegex(id).source + `\\\\n?\\\\n?`);\n const next = file.replace(re, \"\");\n return next.trim().length === 0 ? \"\" : next.replace(/\\n{3,}/g, \"\\n\\n\").trimEnd() + \"\\n\";\n}\n","import { createHash } from \"node:crypto\";\n\n/** Deterministic sha256 of one or more strings, prefixed `sha256:`. */\nexport function sha256(...parts: string[]): string {\n const h = createHash(\"sha256\");\n for (const p of parts) {\n h.update(p, \"utf8\");\n h.update(\"\u0000\"); // domain separator between parts\n }\n return \"sha256:\" + h.digest(\"hex\");\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/** Ensure each entry appears in the project's .gitignore (idempotent). */\nexport function ensureGitignored(root: string, entries: string[]): void {\n const p = join(root, \".gitignore\");\n const current = existsSync(p) ? readFileSync(p, \"utf8\") : \"\";\n const lines = new Set(current.split(\"\\n\").map((l) => l.trim()));\n const missing = entries.filter((e) => !lines.has(e));\n if (missing.length === 0) return;\n const header = current.includes(\"# skills-master\") ? \"\" : \"\\n# skills-master generated outputs\\n\";\n const next = current.replace(/\\s*$/, \"\") + header + missing.join(\"\\n\") + \"\\n\";\n writeFileSync(p, next, \"utf8\");\n}\n","import { resolvePaths } from \"../schema/projectConfig\";\nimport { ALL_TARGETS, type TargetId } from \"../types\";\nimport { detectTargets } from \"../emitters\";\nimport { resolveContent } from \"../content/source\";\nimport { installSkill } from \"../core/install\";\nimport {\n loadConfig,\n loadConfigOrDefault,\n loadLockfile,\n saveConfig,\n saveLockfile,\n} from \"../core/project\";\nimport { ensureGitignored } from \"../core/gitignore\";\nimport type { ConflictChoice } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface AddOptions {\n cwd: string;\n /** skill names, category names, or class names to install. */\n names: string[];\n targets?: TargetId[];\n content?: string;\n ref?: string;\n withPairs?: boolean;\n dryRun?: boolean;\n overwrite?: boolean;\n /** interactive conflict resolver (bin supplies this on a TTY). */\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface AddResult {\n targets: TargetId[];\n installed: { name: string; version: string }[];\n skipped: string[];\n}\n\nexport async function addCommand(opts: AddOptions): Promise<AddResult> {\n const cfg = loadConfigOrDefault(opts.cwd);\n const hadConfig = loadConfig(opts.cwd) != null;\n\n let targets = opts.targets?.length ? opts.targets : cfg.targets;\n if (!targets.length) targets = detectTargets(opts.cwd);\n if (!targets.length) targets = ALL_TARGETS;\n\n const content = await resolveContent({\n content: opts.content,\n ref: opts.ref ?? cfg.contentRef,\n cwd: opts.cwd,\n });\n const registry = content.registry();\n const byName = new Map(registry.skills.map((s) => [s.name, s]));\n\n // Resolve tokens → concrete skill names (name > category > class).\n const selected = new Set<string>();\n const skipped: string[] = [];\n for (const token of opts.names) {\n if (byName.has(token)) {\n selected.add(token);\n continue;\n }\n const byCategory = registry.skills.filter((s) => s.category === token);\n const byClass = registry.skills.filter((s) => s.class === token);\n const group = byCategory.length ? byCategory : byClass;\n if (group.length) {\n group.forEach((s) => selected.add(s.name));\n } else {\n log.warn(`No skill, category, or class matches \"${token}\".`);\n skipped.push(token);\n }\n }\n\n if (opts.withPairs) {\n for (const name of [...selected]) {\n for (const pair of byName.get(name)?.pairs_with ?? []) {\n if (byName.has(pair)) selected.add(pair);\n else log.warn(`Paired skill \"${pair}\" (from \"${name}\") is not in the registry.`);\n }\n }\n }\n\n if (selected.size === 0) {\n log.error(\"Nothing to install.\");\n return { targets, installed: [], skipped };\n }\n\n const paths = resolvePaths(cfg);\n const lock = loadLockfile(opts.cwd);\n lock.contentRef = opts.ref ?? cfg.contentRef;\n const installed: { name: string; version: string }[] = [];\n\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n for (const name of [...selected].sort()) {\n const skill = content.loadSkill(name);\n const result = installSkill(opts.cwd, skill, targets, paths, {\n dryRun: opts.dryRun,\n overwrite: opts.overwrite,\n onConflict: opts.onConflict,\n });\n if (!opts.dryRun) lock.skills[name] = result.locked;\n installed.push({ name, version: result.version });\n\n for (const r of result.results) {\n const tag = r.mode === \"block\" ? `${r.path} [${r.blockId}]` : r.path;\n log.info(`${prefix}${r.action.padEnd(9)} ${tag}`);\n }\n }\n\n if (!opts.dryRun) {\n saveLockfile(opts.cwd, lock);\n if (!hadConfig) {\n saveConfig(opts.cwd, { ...cfg, targets });\n log.info(\"Wrote skills-master.json.\");\n }\n if (!cfg.commit) {\n const outs = targets.map((t) => paths[t]);\n ensureGitignored(opts.cwd, outs);\n }\n }\n\n log.success(\n `${prefix}Installed ${installed.length} skill(s) into ${targets.length} target(s): ${targets.join(\", \")}.`,\n );\n return { targets, installed, skipped };\n}\n","import { resolvePaths } from \"../schema/projectConfig\";\nimport type { TargetId } from \"../types\";\nimport { resolveContent } from \"../content/source\";\nimport { diskHash, installSkill, sourceHashOf } from \"../core/install\";\nimport { loadConfigOrDefault, loadLockfile, saveLockfile } from \"../core/project\";\nimport type { ConflictChoice } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface UpdateOptions {\n cwd: string;\n names?: string[];\n content?: string;\n ref?: string;\n dryRun?: boolean;\n overwrite?: boolean;\n onConflict?: (path: string) => ConflictChoice;\n}\n\nexport interface UpdateResult {\n updated: string[];\n upToDate: string[];\n skipped: string[];\n}\n\nexport async function updateCommand(opts: UpdateOptions): Promise<UpdateResult> {\n const cfg = loadConfigOrDefault(opts.cwd);\n const lock = loadLockfile(opts.cwd);\n const ref = opts.ref ?? cfg.contentRef;\n const updated: string[] = [];\n const upToDate: string[] = [];\n const skipped: string[] = [];\n\n const names = opts.names?.length ? opts.names : Object.keys(lock.skills);\n if (names.length === 0) {\n log.info(\"No installed skills to update.\");\n return { updated, upToDate, skipped };\n }\n\n const content = await resolveContent({ content: opts.content, ref, cwd: opts.cwd });\n const paths = resolvePaths(cfg);\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n\n for (const name of names.sort()) {\n const locked = lock.skills[name];\n if (!locked) {\n log.warn(`\"${name}\" is not installed — run \\`add\\` first.`);\n skipped.push(name);\n continue;\n }\n\n let skill;\n try {\n skill = content.loadSkill(name);\n } catch {\n log.warn(`\"${name}\" no longer exists in the content library.`);\n skipped.push(name);\n continue;\n }\n\n const refChanged = lock.contentRef !== ref;\n const sourceChanged = locked.sourceHash !== sourceHashOf(skill);\n if (!opts.overwrite && !sourceChanged && !refChanged) {\n upToDate.push(name);\n continue;\n }\n\n // Re-emit to exactly the targets this skill was installed to.\n const targets = Object.keys(locked.emitted) as TargetId[];\n\n // Detect user edits to owned whole-files since install.\n const userEdited = targets.some((t) => {\n const e = locked.emitted[t];\n return e && diskHash(opts.cwd, e.files) !== e.hash;\n });\n if (userEdited && !opts.overwrite && !opts.onConflict) {\n log.warn(`${prefix}\"${name}\" has local edits — skipping (use --overwrite to replace).`);\n skipped.push(name);\n continue;\n }\n\n const result = installSkill(opts.cwd, skill, targets, paths, {\n dryRun: opts.dryRun,\n overwrite: opts.overwrite || !userEdited,\n onConflict: opts.onConflict,\n });\n if (!opts.dryRun) lock.skills[name] = result.locked;\n updated.push(name);\n for (const r of result.results) {\n if (r.action === \"unchanged\") continue;\n const tag = r.mode === \"block\" ? `${r.path} [${r.blockId}]` : r.path;\n log.info(`${prefix}${r.action.padEnd(9)} ${tag}`);\n }\n }\n\n if (!opts.dryRun) {\n lock.contentRef = ref;\n saveLockfile(opts.cwd, lock);\n }\n\n log.success(\n `${prefix}Updated ${updated.length}, up-to-date ${upToDate.length}, skipped ${skipped.length}.`,\n );\n return { updated, upToDate, skipped };\n}\n","import type { TargetId } from \"../types\";\nimport { loadLockfile, saveLockfile } from \"../core/project\";\nimport { pruneEmptyDirs, removeBlockFromFile, removeWholeFile } from \"../core/writer\";\nimport { log } from \"../util/log\";\n\nexport interface RemoveOptions {\n cwd: string;\n names: string[];\n /** restrict removal to specific targets; default = every target the skill was installed to. */\n targets?: TargetId[];\n dryRun?: boolean;\n}\n\nexport interface RemoveResult {\n removed: string[];\n missing: string[];\n}\n\nexport function removeCommand(opts: RemoveOptions): RemoveResult {\n const lock = loadLockfile(opts.cwd);\n const removed: string[] = [];\n const missing: string[] = [];\n const prefix = opts.dryRun ? \"[dry-run] \" : \"\";\n\n for (const name of opts.names) {\n const locked = lock.skills[name];\n if (!locked) {\n log.warn(`\"${name}\" is not installed.`);\n missing.push(name);\n continue;\n }\n\n const targets = (opts.targets?.length\n ? opts.targets\n : (Object.keys(locked.emitted) as TargetId[])\n ).filter((t) => locked.emitted[t]);\n\n const wholeRemoved: string[] = [];\n for (const t of targets) {\n const e = locked.emitted[t]!;\n for (const file of e.files) {\n if (removeWholeFile(opts.cwd, file, opts.dryRun)) {\n wholeRemoved.push(file);\n log.info(`${prefix}removed ${file}`);\n }\n }\n if (e.block && removeBlockFromFile(opts.cwd, e.block, name, opts.dryRun)) {\n log.info(`${prefix}unblocked ${e.block} [${name}]`);\n }\n if (!opts.dryRun) delete locked.emitted[t];\n }\n pruneEmptyDirs(opts.cwd, wholeRemoved, opts.dryRun);\n\n if (!opts.dryRun) {\n if (Object.keys(locked.emitted).length === 0) delete lock.skills[name];\n }\n removed.push(name);\n }\n\n if (!opts.dryRun) saveLockfile(opts.cwd, lock);\n log.success(`${prefix}Removed ${removed.length} skill(s).`);\n return { removed, missing };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { diskHash } from \"../core/install\";\nimport { loadConfig, loadLockfile } from \"../core/project\";\nimport { hasBlock } from \"../core/markers\";\nimport { log } from \"../util/log\";\n\nexport interface DoctorOptions {\n cwd: string;\n}\n\nexport interface DoctorReport {\n problems: string[];\n ok: boolean;\n}\n\nexport function doctorCommand(opts: DoctorOptions): DoctorReport {\n const problems: string[] = [];\n const note = (msg: string) => problems.push(msg);\n\n const cfg = loadConfig(opts.cwd);\n if (!cfg) {\n log.warn(\"No skills-master.json found — run `skills-master init`.\");\n } else {\n log.info(`Config targets: ${cfg.targets.length ? cfg.targets.join(\", \") : \"(auto-detect)\"}`);\n }\n\n const lock = loadLockfile(opts.cwd);\n const names = Object.keys(lock.skills);\n if (names.length === 0) {\n log.info(\"No skills installed.\");\n return { problems, ok: true };\n }\n\n for (const name of names) {\n const locked = lock.skills[name]!;\n for (const [target, e] of Object.entries(locked.emitted)) {\n for (const file of e.files) {\n if (!existsSync(join(opts.cwd, file))) note(`${name}: missing ${target} file ${file}`);\n }\n if (e.files.every((f) => existsSync(join(opts.cwd, f)))) {\n if (diskHash(opts.cwd, e.files) !== e.hash) {\n note(`${name}: local edits to ${target} output(s) (run \\`update --overwrite\\` to reset)`);\n }\n }\n if (e.block) {\n const abs = join(opts.cwd, e.block);\n if (!existsSync(abs) || !hasBlock(readFileSync(abs, \"utf8\"), name)) {\n note(`${name}: missing managed block in ${e.block}`);\n }\n }\n }\n }\n\n if (problems.length === 0) {\n log.success(`All ${names.length} installed skill(s) look healthy.`);\n } else {\n for (const p of problems) log.warn(p);\n log.plain(`\\n${problems.length} problem(s) found.`);\n }\n return { problems, ok: problems.length === 0 };\n}\n","import { resolveContent } from \"../content/source\";\nimport type { Registry, RegistryEntry } from \"../schema/registry\";\nimport { log } from \"../util/log\";\n\nexport interface CatalogQuery {\n content?: string;\n ref?: string;\n cwd?: string;\n}\n\nasync function registryOf(q: CatalogQuery): Promise<Registry> {\n const content = await resolveContent({ content: q.content, ref: q.ref, cwd: q.cwd });\n return content.registry();\n}\n\nexport interface ListOptions extends CatalogQuery {\n domain?: string;\n class?: string;\n category?: string;\n platform?: string;\n json?: boolean;\n}\n\nexport async function listCommand(opts: ListOptions): Promise<RegistryEntry[]> {\n const reg = await registryOf(opts);\n let skills = reg.skills;\n if (opts.domain) skills = skills.filter((s) => s.domain === opts.domain);\n if (opts.class) skills = skills.filter((s) => s.class === opts.class);\n if (opts.category) skills = skills.filter((s) => s.category === opts.category);\n if (opts.platform) {\n const platform = opts.platform;\n skills = skills.filter((s) => s.platforms.includes(platform));\n }\n\n if (opts.json) {\n log.plain(JSON.stringify(skills, null, 2));\n return skills;\n }\n\n if (skills.length === 0) {\n log.info(\"No skills match.\");\n return skills;\n }\n\n const groups = new Map<string, RegistryEntry[]>();\n for (const s of skills) {\n const key = `${s.domain}/${s.class}/${s.category}`;\n (groups.get(key) ?? groups.set(key, []).get(key)!).push(s);\n }\n for (const [group, entries] of [...groups].sort()) {\n log.plain(`\\n${group}`);\n for (const s of entries) {\n const flag = s.stability === \"stable\" ? \"\" : ` (${s.stability})`;\n log.plain(` ${s.name} v${s.version}${flag}`);\n log.plain(` ${truncate(s.description, 96)}`);\n }\n }\n log.plain(`\\n${skills.length} skill(s).`);\n return skills;\n}\n\nexport interface SearchOptions extends CatalogQuery {\n query: string;\n}\n\nexport async function searchCommand(opts: SearchOptions): Promise<RegistryEntry[]> {\n const reg = await registryOf(opts);\n const q = opts.query.toLowerCase();\n const hits = reg.skills.filter((s) =>\n [s.name, s.description, s.domain, s.category, s.class, ...s.tags]\n .join(\" \")\n .toLowerCase()\n .includes(q),\n );\n if (hits.length === 0) {\n log.info(`No matches for \"${opts.query}\".`);\n return hits;\n }\n for (const s of hits) {\n log.plain(`${s.name} (${s.class}/${s.category}) v${s.version}`);\n log.plain(` ${truncate(s.description, 96)}`);\n }\n log.plain(`\\n${hits.length} match(es).`);\n return hits;\n}\n\nexport interface ViewOptions extends CatalogQuery {\n name: string;\n raw?: boolean;\n}\n\nexport async function viewCommand(opts: ViewOptions): Promise<void> {\n const content = await resolveContent({ content: opts.content, ref: opts.ref, cwd: opts.cwd });\n const skill = content.loadSkill(opts.name);\n const xm = skill.frontmatter[\"x-skills-master\"];\n if (opts.raw) {\n log.plain(skill.body);\n return;\n }\n log.plain(`${skill.name} v${xm.version} [${xm.domain}/${xm.class}/${xm.category}] ${xm.stability}`);\n log.plain(`platforms: ${xm.platforms.join(\", \")}`);\n if (xm.requires) {\n log.plain(`requires: ${Object.entries(xm.requires).map(([k, v]) => `${k} ${v}`).join(\", \")}`);\n }\n if (xm.pairs_with.length) log.plain(`pairs with: ${xm.pairs_with.join(\", \")}`);\n log.plain(`\\n${skill.frontmatter.description}\\n`);\n log.plain(`sources:`);\n for (const url of xm.sources) log.plain(` ${url}`);\n const res = Object.entries(skill.resources).filter(([, v]) => v).map(([k]) => k);\n if (res.length) log.plain(`\\nresource files: ${res.join(\", \")}`);\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + \"…\";\n}\n","import type { Frontmatter } from \"../schema/frontmatter\";\nimport { findSkillDirs, relPathOf } from \"./discover\";\nimport { loadRawSkill, validateFrontmatter } from \"./parse\";\n\nexport type DiagnosticLevel = \"error\" | \"warn\";\n\nexport interface Diagnostic {\n relPath: string;\n level: DiagnosticLevel;\n message: string;\n}\n\nexport interface LintResult {\n diagnostics: Diagnostic[];\n skillCount: number;\n errorCount: number;\n warnCount: number;\n}\n\nconst CANONICAL_HEADINGS = [\n \"## When to use\",\n \"## Core guidance\",\n \"## Pitfalls\",\n \"## References\",\n \"## See also\",\n];\nconst MAX_BODY_LINES = 500;\nconst WARN_BODY_LINES = 450;\n\nfunction today(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\ninterface Loaded {\n relPath: string;\n folderName: string;\n fm?: Frontmatter;\n body: string;\n}\n\nexport function lintSkills(skillsRoot: string): LintResult {\n const dirs = findSkillDirs(skillsRoot);\n const diagnostics: Diagnostic[] = [];\n const loaded: Loaded[] = [];\n const byName = new Map<string, Frontmatter>();\n\n for (const dir of dirs) {\n let raw;\n try {\n raw = loadRawSkill(dir, skillsRoot);\n } catch (err) {\n diagnostics.push({\n relPath: relPathOf(skillsRoot, dir),\n level: \"error\",\n message: `failed to parse SKILL.md: ${err instanceof Error ? err.message.split(\"\\n\")[0] : String(err)}`,\n });\n continue;\n }\n\n // YAML hazard: an unquoted scalar containing \" #\" is silently truncated as\n // a comment (e.g. \"@Test, #expect\" loses everything from \"#expect\" on).\n for (const line of raw.rawText.split(\"\\n\")) {\n const m = /^(\\s*)(name|description|category):\\s+(?![\"'])(.*\\s#.*)$/.exec(line);\n if (m) {\n diagnostics.push({\n relPath: raw.relPath,\n level: \"warn\",\n message: `frontmatter \"${m[2]}\" contains \" #\", which YAML reads as a comment — quote the value`,\n });\n }\n }\n\n const v = validateFrontmatter(raw.data);\n if (!v.ok) {\n for (const issue of v.issues) {\n diagnostics.push({ relPath: raw.relPath, level: \"error\", message: issue });\n }\n loaded.push({ relPath: raw.relPath, folderName: raw.folderName, body: raw.body });\n continue;\n }\n loaded.push({ relPath: raw.relPath, folderName: raw.folderName, fm: v.value, body: raw.body });\n byName.set(v.value.name, v.value);\n }\n\n // Skill names must be globally unique (the registry and `add` key on name).\n const nameDirs = new Map<string, string[]>();\n for (const s of loaded) {\n const n = s.fm?.name ?? s.folderName;\n (nameDirs.get(n) ?? nameDirs.set(n, []).get(n)!).push(s.relPath);\n }\n for (const [name, paths] of nameDirs) {\n if (paths.length > 1) {\n for (const p of paths) {\n diagnostics.push({ relPath: p, level: \"error\", message: `duplicate skill name \"${name}\" (also at ${paths.filter((x) => x !== p).join(\", \")})` });\n }\n }\n }\n\n const todayStr = today();\n\n for (const s of loaded) {\n const push = (level: DiagnosticLevel, message: string) =>\n diagnostics.push({ relPath: s.relPath, level, message });\n if (!s.fm) continue;\n const fm = s.fm;\n const xm = fm[\"x-skills-master\"];\n\n // name == folder name\n if (fm.name !== s.folderName) {\n push(\"error\", `name \"${fm.name}\" must equal the folder name \"${s.folderName}\"`);\n }\n\n // description shape (soft)\n if (!/use when/i.test(fm.description)) {\n push(\"warn\", `description should include a \"Use when ...\" trigger clause`);\n }\n\n // snapshot_date not in the future\n if (xm.snapshot_date > todayStr) {\n push(\"error\", `snapshot_date ${xm.snapshot_date} is in the future`);\n }\n\n // contested ⇒ Open question section\n if (xm.stability === \"contested\" && !/^## Open question\\b/m.test(s.body)) {\n push(\"error\", `stability is \"contested\" but no \"## Open question\" section is present`);\n }\n\n // body length\n const lineCount = s.body.split(\"\\n\").length;\n if (lineCount > MAX_BODY_LINES) {\n push(\"error\", `SKILL.md body is ${lineCount} lines (max ${MAX_BODY_LINES}); move depth into reference.md/examples.md`);\n } else if (lineCount > WARN_BODY_LINES) {\n push(\"warn\", `SKILL.md body is ${lineCount} lines (approaching the ${MAX_BODY_LINES}-line cap)`);\n }\n\n // domain should match the top path segment\n if (!s.relPath.startsWith(`${xm.domain}/`)) {\n push(\"warn\", `domain \"${xm.domain}\" does not match the top folder of \"${s.relPath}\"`);\n }\n\n // sources should be present and be https documentation URLs\n if (xm.sources.length === 0) {\n push(\"warn\", `no sources — add at least one canonical documentation URL`);\n }\n for (const url of xm.sources) {\n if (!/^https:\\/\\//.test(url)) {\n push(\"warn\", `sources entry should be an https URL: ${url}`);\n }\n }\n\n // canonical headings\n for (const heading of CANONICAL_HEADINGS) {\n if (!s.body.includes(heading)) {\n push(\"warn\", `missing recommended section \"${heading}\"`);\n }\n }\n\n // pairs_with referential integrity (bidirectional)\n for (const partner of xm.pairs_with) {\n const partnerFm = byName.get(partner);\n if (!partnerFm) {\n push(\"error\", `pairs_with references unknown skill \"${partner}\"`);\n continue;\n }\n if (!partnerFm[\"x-skills-master\"].pairs_with.includes(fm.name)) {\n push(\"error\", `pairs_with \"${partner}\" is not reciprocated (add \"${fm.name}\" to its pairs_with)`);\n }\n }\n }\n\n const errorCount = diagnostics.filter((d) => d.level === \"error\").length;\n const warnCount = diagnostics.filter((d) => d.level === \"warn\").length;\n return { diagnostics, skillCount: dirs.length, errorCount, warnCount };\n}\n","import { resolveContent } from \"../content/source\";\nimport { lintSkills } from \"../core/lint\";\nimport { log } from \"../util/log\";\n\nexport interface LintCmdOptions {\n content?: string;\n cwd?: string;\n}\n\n/** Lint the skill library. Returns true when there are no errors. */\nexport async function lintCommand(opts: LintCmdOptions): Promise<boolean> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const result = lintSkills(content.root);\n\n for (const d of result.diagnostics) {\n const line = `${d.level === \"error\" ? \"✗\" : \"!\"} ${d.relPath}: ${d.message}`;\n if (d.level === \"error\") log.error(line);\n else log.warn(line);\n }\n\n log.plain(\n `\\nLinted ${result.skillCount} skill(s): ${result.errorCount} error(s), ${result.warnCount} warning(s).`,\n );\n return result.errorCount === 0;\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveContent } from \"../content/source\";\nimport { buildRegistry } from \"../core/registry-build\";\nimport { REGISTRY_FILENAME } from \"../schema/registry\";\nimport { log } from \"../util/log\";\n\nexport interface RegistryBuildOptions {\n content?: string;\n cwd?: string;\n /** when true, verify the committed registry.json is up to date (CI mode). */\n check?: boolean;\n version?: string;\n}\n\n/** Build (or verify) registry.json from the skill tree. Returns true on success. */\nexport async function registryBuildCommand(opts: RegistryBuildOptions): Promise<boolean> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const registry = buildRegistry(content.root, opts.version ?? \"0.1.0\");\n const json = JSON.stringify(registry, null, 2) + \"\\n\";\n const outPath = join(content.root, REGISTRY_FILENAME);\n\n if (opts.check) {\n const current = existsSync(outPath) ? readFileSync(outPath, \"utf8\") : \"\";\n if (current !== json) {\n log.error(`registry.json is out of date — run \\`registry build\\` and commit the result.`);\n return false;\n }\n log.success(`registry.json is up to date (${registry.skills.length} skills).`);\n return true;\n }\n\n writeFileSync(outPath, json, \"utf8\");\n log.success(`Wrote ${REGISTRY_FILENAME} (${registry.skills.length} skills).`);\n return true;\n}\n","import { z } from \"zod\";\nimport { SkillClassSchema, StabilitySchema } from \"./frontmatter\";\n\n/** One catalog entry. Generated from the skill tree by `registry build`. */\nexport const RegistryEntrySchema = z.object({\n name: z.string(),\n domain: z.string(),\n class: SkillClassSchema,\n category: z.string(),\n description: z.string(),\n platforms: z.array(z.string()),\n stability: StabilitySchema,\n version: z.string(),\n tags: z.array(z.string()).default([]),\n pairs_with: z.array(z.string()).default([]),\n /** path relative to the skills root. */\n path: z.string(),\n /** which on-demand resource files exist. */\n resources: z.object({\n reference: z.boolean(),\n examples: z.boolean(),\n checklist: z.boolean(),\n }),\n});\n\nexport const RegistrySchema = z.object({\n $schema: z.string().optional(),\n /** aggregate library version (bumped on release). */\n version: z.string().default(\"0.1.0\"),\n generatedAt: z.string().optional(),\n skills: z.array(RegistryEntrySchema).default([]),\n});\n\nexport type RegistryEntry = z.infer<typeof RegistryEntrySchema>;\nexport type Registry = z.infer<typeof RegistrySchema>;\n\nexport const REGISTRY_FILENAME = \"registry.json\";\n","import { existsSync, readdirSync, readFileSync, rmSync } from \"node:fs\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport { resolveContent, type ContentSource } from \"../content/source\";\nimport { claudeEmitter } from \"../emitters\";\nimport { applyFiles } from \"../core/writer\";\nimport type { EmitContext, EmittedFile, TargetId } from \"../types\";\nimport type { SkillClass } from \"../schema/frontmatter\";\nimport { log } from \"../util/log\";\n\nconst CLASS_LABEL: Record<SkillClass, string> = {\n code: \"code skills (frameworks & APIs)\",\n design: \"design-review skills\",\n \"lang-tooling\": \"language, build, test & ship skills\",\n overview: \"decision-guidance routers\",\n};\n\nconst CLASS_CATEGORY: Record<SkillClass, string> = {\n code: \"development\",\n design: \"design\",\n \"lang-tooling\": \"development\",\n overview: \"development\",\n};\n\n/** Directory holding the generated per-class plugins, relative to the output root. */\nconst PLUGINS_DIR = \"plugins\";\n/** The generated marketplace manifest, relative to the output root. */\nconst MARKETPLACE_JSON = \".claude-plugin/marketplace.json\";\n\nfunction pluginName(domain: string, cls: SkillClass): string {\n const clsSeg = cls === \"overview\" ? \"overviews\" : cls;\n return `skills-master-${domain}-${clsSeg}`;\n}\n\nfunction titleCase(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction toPosix(p: string): string {\n return p.split(sep).join(\"/\");\n}\n\n/** Every file under `dir`, as output-root-relative POSIX paths. */\nfunction listFiles(root: string, dir: string, acc: string[] = []): string[] {\n const abs = join(root, dir);\n if (!existsSync(abs)) return acc;\n for (const entry of readdirSync(abs, { withFileTypes: true })) {\n const rel = `${dir}/${entry.name}`;\n if (entry.isDirectory()) listFiles(root, rel, acc);\n else acc.push(rel);\n }\n return acc;\n}\n\nexport interface MarketplaceBuildOptions {\n content?: string;\n cwd?: string;\n /** output root for .claude-plugin/ and plugins/ (defaults to the repo root above skills/). */\n out?: string;\n /** when true, verify the committed marketplace output is up to date (CI mode). */\n check?: boolean;\n version?: string;\n}\n\ninterface MarketplaceOutput {\n /** every generated file, keyed by output-root-relative POSIX path. */\n files: Map<string, string>;\n /** per-plugin skill counts, for logging. */\n counts: { name: string; count: number }[];\n pluginCount: number;\n}\n\n/**\n * Compute the complete marketplace projection in memory. Both the write and the\n * `--check` paths run through this, so CI verifies exactly what `build` writes.\n */\nfunction buildOutputs(content: ContentSource, out: string, version: string): MarketplaceOutput {\n // Group emitted files by (domain, class).\n const groups = new Map<string, { domain: string; cls: SkillClass; files: EmittedFile[]; count: number }>();\n\n for (const dir of content.skillDirs()) {\n const skill = content.loadSkill(dir.split(/[\\\\/]/).pop()!);\n const xm = skill.frontmatter[\"x-skills-master\"];\n const key = `${xm.domain}:${xm.class}`;\n const name = pluginName(xm.domain, xm.class);\n const ctx: EmitContext = {\n projectRoot: out,\n paths: {\n claude: `${PLUGINS_DIR}/${name}/skills`,\n cursor: \"\",\n copilot: \"\",\n agents: \"\",\n } as Record<TargetId, string>,\n };\n const files = claudeEmitter.emit(skill, ctx);\n const g = groups.get(key) ?? { domain: xm.domain, cls: xm.class, files: [], count: 0 };\n g.files.push(...files);\n g.count += 1;\n groups.set(key, g);\n }\n\n const outFiles = new Map<string, string>();\n const counts: { name: string; count: number }[] = [];\n const plugins: {\n name: string;\n source: string;\n description: string;\n version: string;\n category: string;\n }[] = [];\n\n for (const { domain, cls, files, count } of groups.values()) {\n const name = pluginName(domain, cls);\n for (const f of files) outFiles.set(toPosix(f.path), f.contents);\n\n const description = `${titleCase(domain)} ${CLASS_LABEL[cls]}.`;\n const manifest = {\n name,\n version,\n description,\n author: { name: \"skills-master contributors\" },\n };\n outFiles.set(\n `${PLUGINS_DIR}/${name}/.claude-plugin/plugin.json`,\n JSON.stringify(manifest, null, 2) + \"\\n\",\n );\n\n plugins.push({ name, source: `./${PLUGINS_DIR}/${name}`, description, version, category: CLASS_CATEGORY[cls] });\n counts.push({ name, count });\n }\n\n plugins.sort((a, b) => a.name.localeCompare(b.name));\n counts.sort((a, b) => a.name.localeCompare(b.name));\n const marketplace = {\n $schema: \"https://www.schemastore.org/claude-code-marketplace.json\",\n name: \"skills-master\",\n owner: { name: \"skills-master contributors\" },\n plugins,\n };\n outFiles.set(MARKETPLACE_JSON, JSON.stringify(marketplace, null, 2) + \"\\n\");\n\n return { files: outFiles, counts, pluginCount: plugins.length };\n}\n\n/** Build (or verify) the plugin marketplace from the skill tree. Returns true on success. */\nexport async function marketplaceBuildCommand(opts: MarketplaceBuildOptions): Promise<boolean> {\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const out = resolve(opts.out ?? dirname(content.root));\n const version = opts.version ?? \"0.1.0\";\n\n const { files, counts, pluginCount } = buildOutputs(content, out, version);\n\n // Everything under plugins/ plus the marketplace manifest is generated, so any\n // on-disk file outside the expected set is stale and must not survive a build.\n const onDisk = new Set(listFiles(out, PLUGINS_DIR));\n if (existsSync(join(out, MARKETPLACE_JSON))) onDisk.add(MARKETPLACE_JSON);\n\n if (opts.check) {\n const missing: string[] = [];\n const differing: string[] = [];\n for (const [rel, contents] of files) {\n if (!onDisk.has(rel)) {\n missing.push(rel);\n continue;\n }\n if (readFileSync(join(out, rel), \"utf8\") !== contents) differing.push(rel);\n }\n const stale = [...onDisk].filter((rel) => !files.has(rel)).sort();\n\n if (missing.length || differing.length || stale.length) {\n log.error(\n `Marketplace output is out of date (${missing.length} missing, ${differing.length} changed, ${stale.length} stale) — run \\`pnpm skills:marketplace\\` and commit the result.`,\n );\n for (const rel of missing.sort().slice(0, 10)) log.error(` missing: ${rel}`);\n for (const rel of differing.sort().slice(0, 10)) log.error(` changed: ${rel}`);\n for (const rel of stale.slice(0, 10)) log.error(` stale: ${rel}`);\n return false;\n }\n log.success(`Marketplace output is up to date (${pluginCount} plugins, ${files.size} files).`);\n return true;\n }\n\n // Delete stale output first: a skill that moved to another class, or was\n // renamed or removed, would otherwise keep shipping from its old plugin.\n const stale = [...onDisk].filter((rel) => !files.has(rel)).sort();\n for (const rel of stale) rmSync(join(out, rel), { force: true });\n pruneEmptyDirsUnder(join(out, PLUGINS_DIR));\n\n const emitted: EmittedFile[] = [...files].map(([path, contents]) => ({ path, contents, mode: \"whole\" }));\n applyFiles(out, emitted, { overwrite: true });\n\n for (const { name, count } of counts) log.info(`Built ${name} (${count} skills).`);\n if (stale.length) log.info(`Removed ${stale.length} stale file(s).`);\n log.success(`Wrote ${MARKETPLACE_JSON} (${pluginCount} plugins, ${files.size} files).`);\n return true;\n}\n\n/** Recursively drop directories left empty after stale files were removed. */\nfunction pruneEmptyDirsUnder(root: string): void {\n if (!existsSync(root)) return;\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (entry.isDirectory()) pruneEmptyDirsUnder(join(root, entry.name));\n }\n if (readdirSync(root).length === 0) rmSync(root, { recursive: true, force: true });\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { resolveContent } from \"../content/source\";\nimport { CLASS_DIR, SkillClassSchema, type SkillClass } from \"../schema/frontmatter\";\nimport { log } from \"../util/log\";\n\nexport interface NewSkillOptions {\n /** \"domain/class/category/name\", e.g. \"apple/code/app-frameworks/swiftui-foo\". */\n spec: string;\n content?: string;\n cwd?: string;\n force?: boolean;\n}\n\nfunction template(domain: string, cls: SkillClass, category: string, name: string): string {\n const today = new Date().toISOString().slice(0, 10);\n return `---\nname: ${name}\ndescription: TODO — one-line, third person. Use when <triggers go here>.\nglobs:\n - \"**/*\"\ntags: []\nx-skills-master:\n domain: ${domain}\n class: ${cls}\n category: ${category}\n platforms: [${domain}]\n requires: {}\n pairs_with: []\n sources: []\n snapshot_date: \"${today}\"\n stability: emerging\n version: 0.1.0\n---\n\n## When to use\n\nTODO — when should an agent reach for this skill?\n\n## Core guidance\n\nTODO — the do/don't, idioms, and best practices (original prose, no copied docs).\n\n## Platform notes\n\nTODO — platform-specific caveats.\n\n## Pitfalls\n\nTODO — common mistakes.\n\n## References\n\n- **Documentation:** [TODO](https://developer.apple.com/documentation/...)\n- **Human Interface Guidelines:** [TODO](https://developer.apple.com/design/human-interface-guidelines/...)\n- **WWDC:** [TODO](https://developer.apple.com/videos/...)\n\n## See also\n\nTODO — paired skills referenced by name.\n`;\n}\n\nexport async function newSkillCommand(opts: NewSkillOptions): Promise<string> {\n const parts = opts.spec.split(\"/\").filter(Boolean);\n if (parts.length < 4) {\n throw new Error(`Expected \"domain/class/category/name\", got \"${opts.spec}\".`);\n }\n const domain = parts[0]!;\n const cls = SkillClassSchema.parse(parts[1]);\n const category = parts[2]!;\n const name = parts[parts.length - 1]!;\n\n const content = await resolveContent({ content: opts.content, cwd: opts.cwd });\n const dir = join(content.root, domain, CLASS_DIR[cls], ...parts.slice(2));\n const skillMd = join(dir, \"SKILL.md\");\n\n if (existsSync(skillMd) && !opts.force) {\n throw new Error(`Skill already exists at ${skillMd} (use --force to overwrite).`);\n }\n mkdirSync(dir, { recursive: true });\n writeFileSync(skillMd, template(domain, cls, category, name), \"utf8\");\n log.success(`Created ${skillMd}`);\n return skillMd;\n}\n"],"mappings":"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","names":["existsSync","join","z","join","existsSync","existsSync","readFileSync","basename","join","existsSync","join","existsSync","readFileSync","join","z","join","readFileSync","existsSync","version","basename","join","existsSync","readFileSync","existsSync","readFileSync","join","existsSync","readdirSync","readFileSync","writeFileSync","join","version","version","join","existsSync","writeFileSync","readFileSync","readdirSync","join","existsSync","readFileSync","version","existsSync","readFileSync","writeFileSync","join","registry","existsSync","readFileSync","join","existsSync","join","readFileSync","existsSync","readFileSync","writeFileSync","join","z","z","registry","join","existsSync","readFileSync","writeFileSync","existsSync","readdirSync","readFileSync","rmSync","dirname","join","resolve","join","existsSync","readdirSync","version","marketplace","resolve","dirname","readFileSync","stale","rmSync","existsSync","mkdirSync","writeFileSync","join","today","join","existsSync","mkdirSync","writeFileSync"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ichintansoni/skills-master",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Install tool-agnostic Apple & Android development skills into any AI coding tool (Claude Code, Cursor, Copilot, AGENTS.md).",
5
5
  "keywords": [
6
6
  "skills",
@@ -38,7 +38,7 @@
38
38
  "README.md"
39
39
  ],
40
40
  "engines": {
41
- "node": ">=20"
41
+ "node": ">=22"
42
42
  },
43
43
  "publishConfig": {
44
44
  "access": "public"