@pratikpsl/agent-skills 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +16 -8
  2. package/dist/bin/agent-skills.d.ts +3 -0
  3. package/dist/bin/agent-skills.d.ts.map +1 -0
  4. package/dist/bin/agent-skills.js +6 -0
  5. package/dist/bin/agent-skills.js.map +1 -0
  6. package/dist/cli/commands/add.d.ts +3 -0
  7. package/dist/cli/commands/add.d.ts.map +1 -0
  8. package/dist/cli/commands/add.js +71 -0
  9. package/dist/cli/commands/add.js.map +1 -0
  10. package/dist/cli/commands/dotnet-setup.d.ts +14 -0
  11. package/dist/cli/commands/dotnet-setup.d.ts.map +1 -0
  12. package/dist/cli/commands/dotnet-setup.js +110 -0
  13. package/dist/cli/commands/dotnet-setup.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +3 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -0
  16. package/dist/cli/commands/init.js +36 -0
  17. package/dist/cli/commands/init.js.map +1 -0
  18. package/dist/cli/commands/list.d.ts +3 -0
  19. package/dist/cli/commands/list.d.ts.map +1 -0
  20. package/dist/cli/commands/list.js +37 -0
  21. package/dist/cli/commands/list.js.map +1 -0
  22. package/dist/cli/index.d.ts +2 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +29 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/core/copy-skills.d.ts +28 -0
  27. package/dist/core/copy-skills.d.ts.map +1 -0
  28. package/dist/core/copy-skills.js +60 -0
  29. package/dist/core/copy-skills.js.map +1 -0
  30. package/dist/core/load-pack.d.ts +15 -0
  31. package/dist/core/load-pack.d.ts.map +1 -0
  32. package/dist/core/load-pack.js +35 -0
  33. package/dist/core/load-pack.js.map +1 -0
  34. package/dist/core/manifest.d.ts +29 -0
  35. package/dist/core/manifest.d.ts.map +1 -0
  36. package/dist/core/manifest.js +75 -0
  37. package/dist/core/manifest.js.map +1 -0
  38. package/dist/core/resolve-pack.d.ts +7 -0
  39. package/dist/core/resolve-pack.d.ts.map +1 -0
  40. package/dist/core/resolve-pack.js +38 -0
  41. package/dist/core/resolve-pack.js.map +1 -0
  42. package/package.json +8 -5
  43. package/templates/dotnet/AgentSkills/entry-points/antigravity-instructions.md +50 -0
  44. package/{src/templates → templates}/dotnet/manifest.json +8 -2
  45. package/bin/agent-skills.js +0 -7
  46. package/src/__tests__/copySkills.test.js +0 -161
  47. package/src/__tests__/list.test.js +0 -49
  48. package/src/__tests__/manifest.test.js +0 -72
  49. package/src/commands/add.js +0 -89
  50. package/src/commands/dotnet-setup.js +0 -67
  51. package/src/commands/init.js +0 -42
  52. package/src/commands/list.js +0 -41
  53. package/src/index.js +0 -33
  54. package/src/lib/copySkills.js +0 -84
  55. package/src/lib/manifest.js +0 -117
  56. package/src/lib/resolvePack.js +0 -44
  57. /package/{src/templates → templates}/dotnet/AgentSkills/OPERATING.md +0 -0
  58. /package/{src/templates → templates}/dotnet/AgentSkills/README.md +0 -0
  59. /package/{src/templates → templates}/dotnet/AgentSkills/agents/README.md +0 -0
  60. /package/{src/templates → templates}/dotnet/AgentSkills/agents/architect.agent.md +0 -0
  61. /package/{src/templates → templates}/dotnet/AgentSkills/agents/developer.agent.md +0 -0
  62. /package/{src/templates → templates}/dotnet/AgentSkills/entry-points/AGENTS.md +0 -0
  63. /package/{src/templates → templates}/dotnet/AgentSkills/entry-points/CLAUDE.md +0 -0
  64. /package/{src/templates → templates}/dotnet/AgentSkills/entry-points/copilot-instructions.md +0 -0
  65. /package/{src/templates → templates}/dotnet/AgentSkills/entry-points/cursor-instructions.md +0 -0
  66. /package/{src/templates → templates}/dotnet/AgentSkills/memory/index.md +0 -0
  67. /package/{src/templates → templates}/dotnet/AgentSkills/memory/lessons/api.md +0 -0
  68. /package/{src/templates → templates}/dotnet/AgentSkills/memory/lessons/auth.md +0 -0
  69. /package/{src/templates → templates}/dotnet/AgentSkills/memory/lessons/csharp.md +0 -0
  70. /package/{src/templates → templates}/dotnet/AgentSkills/memory/lessons/db.md +0 -0
  71. /package/{src/templates → templates}/dotnet/AgentSkills/memory/lessons/design.md +0 -0
  72. /package/{src/templates → templates}/dotnet/AgentSkills/memory/lessons/infra.md +0 -0
  73. /package/{src/templates → templates}/dotnet/AgentSkills/memory/lessons/mcp.md +0 -0
  74. /package/{src/templates → templates}/dotnet/AgentSkills/memory/lessons/testing.md +0 -0
  75. /package/{src/templates → templates}/dotnet/AgentSkills/memory/schema.md +0 -0
  76. /package/{src/templates → templates}/dotnet/AgentSkills/skills/INDEX.md +0 -0
  77. /package/{src/templates → templates}/dotnet/AgentSkills/skills/README.md +0 -0
  78. /package/{src/templates → templates}/dotnet/AgentSkills/skills/code-standards/SKILL.md +0 -0
  79. /package/{src/templates → templates}/dotnet/AgentSkills/skills/core/SKILL.md +0 -0
  80. /package/{src/templates → templates}/dotnet/AgentSkills/skills/csharp-xunit/SKILL.md +0 -0
  81. /package/{src/templates → templates}/dotnet/AgentSkills/skills/design/SKILL.md +0 -0
  82. /package/{src/templates → templates}/dotnet/AgentSkills/skills/dotnet-api/SKILL.md +0 -0
  83. /package/{src/templates → templates}/dotnet/AgentSkills/skills/dotnet-best-practices/SKILL.md +0 -0
  84. /package/{src/templates → templates}/dotnet/AgentSkills/skills/harness/SKILL.md +0 -0
  85. /package/{src/templates → templates}/dotnet/AgentSkills/skills/mcp_dotnet/SKILL.md +0 -0
package/README.md CHANGED
@@ -13,20 +13,28 @@ To setup agent skills in any target project, run:
13
13
  ```bash
14
14
  # In any .NET project root:
15
15
  npx @pratikpsl/agent-skills dotnet-setup
16
+
17
+ # Install shared skills + one IDE entry-point only
18
+ npx @pratikpsl/agent-skills dotnet-setup cursor # → .cursor/rules/instructions.md
19
+ npx @pratikpsl/agent-skills dotnet-setup claude # → CLAUDE.md
20
+ npx @pratikpsl/agent-skills dotnet-setup codex # → AGENTS.md
21
+ npx @pratikpsl/agent-skills dotnet-setup copilot # → .github/copilot-instructions.md
22
+ npx @pratikpsl/agent-skills dotnet-setup antigravity # → .agents/GEMINI.md
16
23
  ```
17
24
 
18
25
  ### Other Commands
19
26
 
20
- | Command | Description |
21
- |---------|-------------|
22
- | `npx @pratikpsl/agent-skills init` | Scaffold an empty `AgentSkills/` folder and `index.json` |
23
- | `npx @pratikpsl/agent-skills list dotnet` | List available skills inside the dotnet pack |
24
- | `npx @pratikpsl/agent-skills add dotnet <skill>` | Copy a single skill into your project |
25
- | `npx @pratikpsl/agent-skills add dotnet --all` | Copy all skills (alternative to `dotnet-setup`) |
26
- | `npx @pratikpsl/agent-skills --help` | Show CLI help |
27
- | `npx @pratikpsl/agent-skills --version` | Show CLI version |
27
+ | Command | Description |
28
+ | ------------------------------------------------ | -------------------------------------------------------- |
29
+ | `npx @pratikpsl/agent-skills init` | Scaffold an empty `AgentSkills/` folder and `index.json` |
30
+ | `npx @pratikpsl/agent-skills list dotnet` | List available skills inside the dotnet pack |
31
+ | `npx @pratikpsl/agent-skills add dotnet <skill>` | Copy a single skill into your project |
32
+ | `npx @pratikpsl/agent-skills add dotnet --all` | Copy all skills (alternative to `dotnet-setup`) |
33
+ | `npx @pratikpsl/agent-skills --help` | Show CLI help |
34
+ | `npx @pratikpsl/agent-skills --version` | Show CLI version |
28
35
 
29
36
  ### Options
37
+
30
38
  - `--force`: Overwrite existing skill and entry point files.
31
39
  - `--path <dir>`: Target project root (defaults to `process.cwd()`).
32
40
 
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import "../cli/index.js";
3
+ //# sourceMappingURL=agent-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-skills.d.ts","sourceRoot":"","sources":["../../src/bin/agent-skills.ts"],"names":[],"mappings":";AAKA,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ // src/bin/agent-skills.ts
3
+ // Thin entrypoint for the `agent-skills` CLI.
4
+ // Delegates immediately to cli/index.ts which wires up commander.
5
+ import "../cli/index.js";
6
+ //# sourceMappingURL=agent-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-skills.js","sourceRoot":"","sources":["../../src/bin/agent-skills.ts"],"names":[],"mappings":";AACA,0BAA0B;AAC1B,8CAA8C;AAC9C,kEAAkE;AAElE,OAAO,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function addCommand(program: Command): void;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8DjD"}
@@ -0,0 +1,71 @@
1
+ // src/cli/commands/add.ts
2
+ // `agent-skills add <pack> <skillName|--all>`
3
+ //
4
+ // Copies a single named skill (or all skills with --all) from a pack into the
5
+ // current project's AgentSkills/ folder.
6
+ //
7
+ // This is the generic command. `dotnet-setup` is a convenience wrapper over this.
8
+ import path from "path";
9
+ import { loadPack } from "../../core/load-pack.js";
10
+ import { copySkills, ensureAgentSkillsDir } from "../../core/copy-skills.js";
11
+ export function addCommand(program) {
12
+ program
13
+ .command("add <pack> [skillName]")
14
+ .description("Copy a skill (or all skills with --all) from a pack into this project")
15
+ .option("--all", "Copy all skills from the pack", false)
16
+ .option("--force", "Overwrite existing files", false)
17
+ .option("--path <dir>", "Target project root (default: cwd)", process.cwd())
18
+ .action((pack, skillName, options) => {
19
+ if (!skillName && !options.all) {
20
+ console.error("✗ Specify a skill name or pass --all to copy every skill.");
21
+ process.exit(1);
22
+ }
23
+ const targetDir = path.resolve(options.path);
24
+ const { packDir, manifest } = loadPackOrExit(pack);
25
+ let skillsToCopy;
26
+ if (options.all) {
27
+ skillsToCopy = manifest.skills;
28
+ }
29
+ else {
30
+ const found = manifest.skills.find((s) => s.name === skillName);
31
+ if (!found) {
32
+ const available = manifest.skills.map((s) => s.name).join(", ");
33
+ console.error(`✗ Skill "${skillName}" not found in pack "${pack}".`);
34
+ console.error(` Available: ${available}`);
35
+ process.exit(1);
36
+ }
37
+ skillsToCopy = [found];
38
+ }
39
+ ensureAgentSkillsDir(targetDir);
40
+ console.log(`\nCopying from ${manifest.name}@${manifest.version} → ${targetDir}\n`);
41
+ const { written, skipped } = copySkills({
42
+ skills: skillsToCopy,
43
+ packDir,
44
+ targetDir,
45
+ force: options.force,
46
+ });
47
+ printSummary(written, skipped);
48
+ if (written.length === 0 && skipped.length > 0) {
49
+ // Everything was skipped — treat as a soft warning, not a hard error.
50
+ process.exit(0);
51
+ }
52
+ });
53
+ }
54
+ function loadPackOrExit(pack) {
55
+ try {
56
+ return loadPack(pack);
57
+ }
58
+ catch (err) {
59
+ const message = err instanceof Error ? err.message : String(err);
60
+ console.error(`✗ ${message}`);
61
+ process.exit(1);
62
+ }
63
+ }
64
+ function printSummary(written, skipped) {
65
+ console.log("\n" + "─".repeat(50));
66
+ console.log(`✔ Done — ${written.length} written, ${skipped.length} skipped.`);
67
+ if (skipped.length > 0) {
68
+ console.log(" (Run with --force to overwrite skipped files.)");
69
+ }
70
+ }
71
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Command } from "commander";
2
+ import type { SkillEntry } from "../../core/manifest.js";
3
+ /**
4
+ * Filters a skill list for a specific IDE:
5
+ * - Keeps all non-entry-point skills (shared AgentSkills content).
6
+ * - Keeps only the entry-point skill matching the given IDE.
7
+ *
8
+ * Exported for unit testing; contains no I/O.
9
+ *
10
+ * @throws When `ide` is not a recognised key in IDE_ENTRY_POINT_MAP.
11
+ */
12
+ export declare function filterSkillsForIde(skills: SkillEntry[], ide: string): SkillEntry[];
13
+ export declare function dotnetSetupCommand(program: Command): void;
14
+ //# sourceMappingURL=dotnet-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotnet-setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dotnet-setup.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAsBzD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAAE,EACpB,GAAG,EAAE,MAAM,GACV,UAAU,EAAE,CAYd;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkEzD"}
@@ -0,0 +1,110 @@
1
+ // src/cli/commands/dotnet-setup.ts
2
+ // `agent-skills dotnet-setup [ide]`
3
+ //
4
+ // Convenience command equivalent to:
5
+ // agent-skills add @pratikpsl/agent-skills-dotnet --all
6
+ //
7
+ // When an optional [ide] positional argument is supplied (cursor | claude |
8
+ // codex | copilot | antigravity), only that IDE's entry-point file is written
9
+ // together with all shared AgentSkills files. All other entry-point files are
10
+ // skipped.
11
+ //
12
+ // Without [ide], all skills including every entry-point are copied (original
13
+ // behaviour — no breaking change).
14
+ import path from "path";
15
+ import { loadPack } from "../../core/load-pack.js";
16
+ import { copySkills, ensureAgentSkillsDir } from "../../core/copy-skills.js";
17
+ const DOTNET_PACK = "@pratikpsl/agent-skills-dotnet";
18
+ /**
19
+ * Maps the user-facing IDE name to the manifest skill name for that IDE's
20
+ * entry-point. Skills whose name starts with `entry-point:` but are NOT in
21
+ * this map are filtered out when an IDE is specified.
22
+ */
23
+ const IDE_ENTRY_POINT_MAP = {
24
+ cursor: "entry-point:cursor",
25
+ claude: "entry-point:claude",
26
+ codex: "entry-point:codex",
27
+ copilot: "entry-point:copilot",
28
+ antigravity: "entry-point:antigravity",
29
+ };
30
+ const ENTRY_POINT_PREFIX = "entry-point:";
31
+ /** Human-readable list of valid IDE names for error messages. */
32
+ const VALID_IDE_NAMES = Object.keys(IDE_ENTRY_POINT_MAP).join(", ");
33
+ /**
34
+ * Filters a skill list for a specific IDE:
35
+ * - Keeps all non-entry-point skills (shared AgentSkills content).
36
+ * - Keeps only the entry-point skill matching the given IDE.
37
+ *
38
+ * Exported for unit testing; contains no I/O.
39
+ *
40
+ * @throws When `ide` is not a recognised key in IDE_ENTRY_POINT_MAP.
41
+ */
42
+ export function filterSkillsForIde(skills, ide) {
43
+ const targetSkillName = IDE_ENTRY_POINT_MAP[ide];
44
+ if (!targetSkillName) {
45
+ throw new Error(`Unknown IDE "${ide}". Valid options are: ${VALID_IDE_NAMES}`);
46
+ }
47
+ return skills.filter((s) => !s.name.startsWith(ENTRY_POINT_PREFIX) || s.name === targetSkillName);
48
+ }
49
+ export function dotnetSetupCommand(program) {
50
+ program
51
+ .command("dotnet-setup")
52
+ .description(`Install the full .NET/C# agent skill set (shortcut for: add ${DOTNET_PACK} --all).\n` +
53
+ ` Optionally pass an IDE name to install only that IDE's entry-point:\n` +
54
+ ` ${VALID_IDE_NAMES}`)
55
+ .argument("[ide]", `IDE entry-point to install (${VALID_IDE_NAMES}). Omit to install all.`)
56
+ .option("--force", "Overwrite existing files", false)
57
+ .option("--path <dir>", "Target project root (default: cwd)", process.cwd())
58
+ .action((ide, options) => {
59
+ const targetDir = path.resolve(options.path);
60
+ if (ide !== undefined) {
61
+ console.log(`\n🔧 Setting up .NET agent skills [${ide}] in: ${targetDir}\n`);
62
+ }
63
+ else {
64
+ console.log(`\n🔧 Setting up .NET agent skills in: ${targetDir}\n`);
65
+ }
66
+ const { packDir, manifest } = loadPackOrExit(DOTNET_PACK);
67
+ let skills;
68
+ if (ide !== undefined) {
69
+ try {
70
+ skills = filterSkillsForIde(manifest.skills, ide);
71
+ }
72
+ catch (err) {
73
+ const message = err instanceof Error ? err.message : String(err);
74
+ console.error(`✗ ${message}`);
75
+ process.exit(1);
76
+ }
77
+ }
78
+ else {
79
+ skills = manifest.skills;
80
+ }
81
+ ensureAgentSkillsDir(targetDir);
82
+ console.log(`Copying from ${manifest.name}@${manifest.version}\n`);
83
+ const { written, skipped } = copySkills({
84
+ skills,
85
+ packDir,
86
+ targetDir,
87
+ force: options.force,
88
+ });
89
+ console.log("\n" + "─".repeat(50));
90
+ console.log(`✔ .NET skills installed — ${written.length} written, ${skipped.length} skipped.`);
91
+ if (skipped.length > 0) {
92
+ console.log(" (Run with --force to overwrite skipped files.)");
93
+ }
94
+ if (written.length === 0 && skipped.length === 0) {
95
+ console.error("\n✗ No skills were copied. Check that the pack contains skill entries.");
96
+ process.exit(1);
97
+ }
98
+ });
99
+ }
100
+ function loadPackOrExit(pack) {
101
+ try {
102
+ return loadPack(pack);
103
+ }
104
+ catch (err) {
105
+ const message = err instanceof Error ? err.message : String(err);
106
+ console.error(`✗ ${message}`);
107
+ process.exit(1);
108
+ }
109
+ }
110
+ //# sourceMappingURL=dotnet-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotnet-setup.js","sourceRoot":"","sources":["../../../src/cli/commands/dotnet-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function initCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsClD"}
@@ -0,0 +1,36 @@
1
+ // src/cli/commands/init.ts
2
+ // `agent-skills init`
3
+ //
4
+ // Scaffolds an empty AgentSkills/ folder + index.json in the current project
5
+ // if one doesn't exist yet. Safe to run multiple times (idempotent).
6
+ import { existsSync, mkdirSync, writeFileSync } from "fs";
7
+ import path from "path";
8
+ export function initCommand(program) {
9
+ program
10
+ .command("init")
11
+ .description("Scaffold an empty AgentSkills/ folder in the current project")
12
+ .option("--path <dir>", "Target project root (default: cwd)", process.cwd())
13
+ .option("--force", "Overwrite existing files", false)
14
+ .action((options) => {
15
+ const targetDir = path.resolve(options.path);
16
+ const agentSkillsDir = path.join(targetDir, "AgentSkills");
17
+ if (existsSync(agentSkillsDir) && !options.force) {
18
+ console.log(`AgentSkills/ already exists at ${agentSkillsDir}`);
19
+ console.log("Use --force to reinitialize.");
20
+ process.exit(0);
21
+ }
22
+ mkdirSync(agentSkillsDir, { recursive: true });
23
+ console.log(`✓ Created ${agentSkillsDir}`);
24
+ const indexPath = path.join(agentSkillsDir, "index.json");
25
+ if (!existsSync(indexPath) || options.force) {
26
+ const indexContent = {
27
+ skills: [],
28
+ _comment: "Add skills via `agent-skills add <pack> <skillName>` or `agent-skills dotnet-setup`",
29
+ };
30
+ writeFileSync(indexPath, JSON.stringify(indexContent, null, 2) + "\n", "utf8");
31
+ console.log(`✓ Created ${indexPath}`);
32
+ }
33
+ console.log("\n✔ AgentSkills initialized. Run `agent-skills dotnet-setup` to add .NET skills.");
34
+ });
35
+ }
36
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,sBAAsB;AACtB,EAAE;AACF,6EAA6E;AAC7E,qEAAqE;AAErE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8DAA8D,CAAC;SAC3E,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3E,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,CAAC,OAAyC,EAAE,EAAE;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAE3D,IAAI,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,kCAAkC,cAAc,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,aAAa,cAAc,EAAE,CAAC,CAAC;QAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC5C,MAAM,YAAY,GAAG;gBACnB,MAAM,EAAE,EAAE;gBACV,QAAQ,EACN,qFAAqF;aACxF,CAAC;YACF,aAAa,CACX,SAAS,EACT,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAC5C,MAAM,CACP,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,CAAC,GAAG,CACT,kFAAkF,CACnF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function listCommand(program: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+BlD"}
@@ -0,0 +1,37 @@
1
+ // src/cli/commands/list.ts
2
+ // `agent-skills list [pack]`
3
+ //
4
+ // Lists available skills in an installed or available pack.
5
+ // When no pack is specified, lists all packs the CLI knows about.
6
+ import { resolvePack } from "../../core/resolve-pack.js";
7
+ import { readManifest } from "../../core/manifest.js";
8
+ export function listCommand(program) {
9
+ program
10
+ .command("list [pack]")
11
+ .description("List available skills in a pack (default: all known packs)")
12
+ .action((pack) => {
13
+ const packsToList = pack
14
+ ? [pack]
15
+ : ["dotnet"]; // Extend this array as new packs are added.
16
+ let exitCode = 0;
17
+ for (const packName of packsToList) {
18
+ try {
19
+ const packDir = resolvePack(packName);
20
+ const manifest = readManifest(packDir);
21
+ console.log(`\n📦 ${manifest.name}@${manifest.version}`);
22
+ console.log("─".repeat(50));
23
+ for (const skill of manifest.skills) {
24
+ console.log(` • ${skill.name.padEnd(28)} ${skill.description}`);
25
+ }
26
+ }
27
+ catch (err) {
28
+ const message = err instanceof Error ? err.message : String(err);
29
+ console.error(`\n✗ Could not list pack "${packName}": ${message}`);
30
+ exitCode = 1;
31
+ }
32
+ }
33
+ if (exitCode !== 0)
34
+ process.exit(exitCode);
35
+ });
36
+ }
37
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/cli/commands/list.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,6BAA6B;AAC7B,EAAE;AACF,4DAA4D;AAC5D,kEAAkE;AAGlE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,CAAC,IAAa,EAAE,EAAE;QACxB,MAAM,WAAW,GAAG,IAAI;YACtB,CAAC,CAAC,CAAC,IAAI,CAAC;YACR,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,4CAA4C;QAE5D,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBAEvC,OAAO,CAAC,GAAG,CAAC,QAAQ,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBAE5B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;oBACpC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO,CAAC,KAAK,CAAC,4BAA4B,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC;gBACnE,QAAQ,GAAG,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ // src/cli/index.ts
2
+ // Wires up the root `commander` program and registers all sub-commands.
3
+ // This file is the only place that imports commander; sub-commands receive
4
+ // the program instance so they stay independently testable.
5
+ import { Command } from "commander";
6
+ import { createRequire } from "module";
7
+ import { initCommand } from "./commands/init.js";
8
+ import { listCommand } from "./commands/list.js";
9
+ import { addCommand } from "./commands/add.js";
10
+ import { dotnetSetupCommand } from "./commands/dotnet-setup.js";
11
+ // Read version from our own package.json without a JSON import assertion
12
+ // (works in Node 18 without the --experimental-json-modules flag).
13
+ const require = createRequire(import.meta.url);
14
+ const { version } = require("../../package.json");
15
+ const program = new Command();
16
+ program
17
+ .name("agent-skills")
18
+ .description("Scaffold and manage AI agent skills across projects")
19
+ .version(version);
20
+ initCommand(program);
21
+ listCommand(program);
22
+ addCommand(program);
23
+ dotnetSetupCommand(program);
24
+ program.parseAsync(process.argv).catch((err) => {
25
+ const message = err instanceof Error ? err.message : String(err);
26
+ console.error(`\n✗ ${message}`);
27
+ process.exit(1);
28
+ });
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,wEAAwE;AACxE,2EAA2E;AAC3E,4DAA4D;AAE5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,yEAAyE;AACzE,mEAAmE;AACnE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEzE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAE5B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { SkillEntry } from "./manifest.js";
2
+ export interface CopyResult {
3
+ /** Files that were successfully written. */
4
+ written: string[];
5
+ /** Files that were skipped because they already exist. */
6
+ skipped: string[];
7
+ }
8
+ export interface CopySkillsOptions {
9
+ /** Skills to copy, filtered from the manifest (all or a single skill). */
10
+ skills: SkillEntry[];
11
+ /** Absolute path to the pack root. */
12
+ packDir: string;
13
+ /** Absolute path to the target project root. */
14
+ targetDir: string;
15
+ /** When true, overwrite existing files. */
16
+ force: boolean;
17
+ }
18
+ /**
19
+ * Copies a list of skill source directories into the target project.
20
+ */
21
+ export declare function copySkills(options: CopySkillsOptions): CopyResult;
22
+ /**
23
+ * Ensures the AgentSkills root directory exists in the target project.
24
+ *
25
+ * @returns Absolute path to AgentSkills/.
26
+ */
27
+ export declare function ensureAgentSkillsDir(targetDir: string): string;
28
+ //# sourceMappingURL=copy-skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-skills.d.ts","sourceRoot":"","sources":["../../src/core/copy-skills.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CA0CjE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI9D"}
@@ -0,0 +1,60 @@
1
+ // src/core/copy-skills.ts
2
+ // Copies skill files from a pack into the target project's AgentSkills/ folder.
3
+ //
4
+ // Rules enforced here:
5
+ // - Never overwrite an existing file without --force; warn and skip instead.
6
+ // - Directories are created recursively as needed.
7
+ // - Returns a summary object for the caller to print: { written, skipped }.
8
+ //
9
+ // This module contains no pack-specific logic. The manifest tells it what
10
+ // to copy; it does not inspect SKILL.md contents.
11
+ import { cpSync, existsSync, mkdirSync, rmSync } from "fs";
12
+ import path from "path";
13
+ /**
14
+ * Copies a list of skill source directories into the target project.
15
+ */
16
+ export function copySkills(options) {
17
+ const { skills, packDir, targetDir, force } = options;
18
+ const written = [];
19
+ const skipped = [];
20
+ for (const skill of skills) {
21
+ const src = path.join(packDir, skill.path);
22
+ // dest overrides where the file lands in the target project.
23
+ // Used for IDE entry-points (e.g. CLAUDE.md, .github/copilot-instructions.md)
24
+ // that must live outside AgentSkills/ at a specific root-relative path.
25
+ const destRelPath = skill.dest ?? skill.path;
26
+ const dest = path.join(targetDir, destRelPath);
27
+ if (!existsSync(src)) {
28
+ console.warn(` ⚠ Source path for skill "${skill.name}" not found: ${src}`);
29
+ skipped.push(destRelPath);
30
+ continue;
31
+ }
32
+ if (existsSync(dest) && !force) {
33
+ console.warn(` ⚠ Skipping "${skill.name}" — destination already exists. Use --force to overwrite.`);
34
+ skipped.push(destRelPath);
35
+ continue;
36
+ }
37
+ mkdirSync(path.dirname(dest), { recursive: true });
38
+ // Remove the destination first when forcing — cpSync throws "src and dest
39
+ // cannot be the same" on Windows if the dest directory already exists,
40
+ // even with force:true.
41
+ if (force && existsSync(dest)) {
42
+ rmSync(dest, { recursive: true, force: true });
43
+ }
44
+ cpSync(src, dest, { recursive: true });
45
+ written.push(destRelPath);
46
+ console.log(` ✓ ${destRelPath}`);
47
+ }
48
+ return { written, skipped };
49
+ }
50
+ /**
51
+ * Ensures the AgentSkills root directory exists in the target project.
52
+ *
53
+ * @returns Absolute path to AgentSkills/.
54
+ */
55
+ export function ensureAgentSkillsDir(targetDir) {
56
+ const dir = path.join(targetDir, "AgentSkills");
57
+ mkdirSync(dir, { recursive: true });
58
+ return dir;
59
+ }
60
+ //# sourceMappingURL=copy-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-skills.js","sourceRoot":"","sources":["../../src/core/copy-skills.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,gFAAgF;AAChF,EAAE;AACF,uBAAuB;AACvB,+EAA+E;AAC/E,qDAAqD;AACrD,8EAA8E;AAC9E,EAAE;AACF,0EAA0E;AAC1E,kDAAkD;AAElD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,IAAI,MAAM,MAAM,CAAC;AAqBxB;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,6DAA6D;QAC7D,8EAA8E;QAC9E,wEAAwE;QACxE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAE/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,8BAA8B,KAAK,CAAC,IAAI,gBAAgB,GAAG,EAAE,CAC9D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,iBAAiB,KAAK,CAAC,IAAI,2DAA2D,CACvF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,0EAA0E;QAC1E,uEAAuE;QACvE,wBAAwB;QACxB,IAAI,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Manifest } from "./manifest.js";
2
+ export interface LoadedPack {
3
+ /** Absolute path to the pack root. */
4
+ packDir: string;
5
+ /** Validated manifest for the pack. */
6
+ manifest: Manifest;
7
+ }
8
+ /**
9
+ * Resolves a pack by name and reads its manifest.
10
+ * Throws with a user-friendly message on any failure.
11
+ *
12
+ * @throws When the pack cannot be resolved or its manifest is invalid.
13
+ */
14
+ export declare function loadPack(packName: string): LoadedPack;
15
+ //# sourceMappingURL=load-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-pack.d.ts","sourceRoot":"","sources":["../../src/core/load-pack.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAoBrD"}
@@ -0,0 +1,35 @@
1
+ // src/core/load-pack.ts
2
+ // Shared helper that resolves a pack and reads its manifest in one step.
3
+ //
4
+ // Eliminates the duplicated try/catch pattern that previously appeared
5
+ // in both add.ts and dotnet-setup.ts. Commands that need a pack and its
6
+ // manifest should call this instead of calling resolvePack + readManifest
7
+ // separately.
8
+ import { resolvePack } from "./resolve-pack.js";
9
+ import { readManifest } from "./manifest.js";
10
+ /**
11
+ * Resolves a pack by name and reads its manifest.
12
+ * Throws with a user-friendly message on any failure.
13
+ *
14
+ * @throws When the pack cannot be resolved or its manifest is invalid.
15
+ */
16
+ export function loadPack(packName) {
17
+ let packDir;
18
+ try {
19
+ packDir = resolvePack(packName);
20
+ }
21
+ catch (err) {
22
+ const message = err instanceof Error ? err.message : String(err);
23
+ throw new Error(`Could not resolve pack "${packName}": ${message}`);
24
+ }
25
+ let manifest;
26
+ try {
27
+ manifest = readManifest(packDir);
28
+ }
29
+ catch (err) {
30
+ const message = err instanceof Error ? err.message : String(err);
31
+ throw new Error(`Could not read manifest for pack "${packName}": ${message}`);
32
+ }
33
+ return { packDir, manifest };
34
+ }
35
+ //# sourceMappingURL=load-pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-pack.js","sourceRoot":"","sources":["../../src/core/load-pack.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,yEAAyE;AACzE,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,0EAA0E;AAC1E,cAAc;AAEd,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAU7C;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,qCAAqC,QAAQ,MAAM,OAAO,EAAE,CAC7D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface SkillEntry {
2
+ /** Short identifier used as a CLI argument. */
3
+ name: string;
4
+ /** Human-readable purpose of the skill. */
5
+ description: string;
6
+ /** Source path of the skill, relative to the pack root. */
7
+ path: string;
8
+ /**
9
+ * Destination path in the target project, relative to the project root.
10
+ * When absent, `path` is used as the destination.
11
+ * Use this for IDE entry-point files that must land outside AgentSkills/.
12
+ */
13
+ dest?: string;
14
+ }
15
+ export interface Manifest {
16
+ /** Package name. */
17
+ name: string;
18
+ /** Semver string. */
19
+ version: string;
20
+ /** All skills provided by this pack. */
21
+ skills: SkillEntry[];
22
+ }
23
+ /**
24
+ * Reads and validates the manifest.json for a pack.
25
+ *
26
+ * @throws When manifest is missing, unreadable, or structurally invalid.
27
+ */
28
+ export declare function readManifest(packDir: string): Manifest;
29
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,UAAU;IACzB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAkCtD"}