@pratikpsl/agent-skills 0.5.0 → 0.7.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 (40) hide show
  1. package/README.md +113 -51
  2. package/dist/cli/commands/add.d.ts.map +1 -1
  3. package/dist/cli/commands/add.js +2 -0
  4. package/dist/cli/commands/add.js.map +1 -1
  5. package/dist/cli/commands/dotnet-setup.d.ts +2 -11
  6. package/dist/cli/commands/dotnet-setup.d.ts.map +1 -1
  7. package/dist/cli/commands/dotnet-setup.js +5 -32
  8. package/dist/cli/commands/dotnet-setup.js.map +1 -1
  9. package/dist/cli/commands/list.js +1 -1
  10. package/dist/cli/commands/list.js.map +1 -1
  11. package/dist/cli/commands/setup.d.ts +9 -0
  12. package/dist/cli/commands/setup.d.ts.map +1 -0
  13. package/dist/cli/commands/setup.js +77 -0
  14. package/dist/cli/commands/setup.js.map +1 -0
  15. package/dist/cli/index.js +16 -2
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/core/copy-skills.d.ts +3 -1
  18. package/dist/core/copy-skills.d.ts.map +1 -1
  19. package/dist/core/copy-skills.js +35 -11
  20. package/dist/core/copy-skills.js.map +1 -1
  21. package/dist/core/ide-map.d.ts +10 -0
  22. package/dist/core/ide-map.d.ts.map +1 -0
  23. package/dist/core/ide-map.js +37 -0
  24. package/dist/core/ide-map.js.map +1 -0
  25. package/dist/core/manifest.d.ts +2 -10
  26. package/dist/core/manifest.d.ts.map +1 -1
  27. package/dist/core/manifest.js +120 -24
  28. package/dist/core/manifest.js.map +1 -1
  29. package/dist/core/resolve-pack.d.ts.map +1 -1
  30. package/dist/core/resolve-pack.js +23 -2
  31. package/dist/core/resolve-pack.js.map +1 -1
  32. package/package.json +25 -7
  33. package/templates/default/instructions.md +34 -0
  34. package/templates/dotnet/AgentSkills/entry-points/{copilot-instructions.md → entry-point.md} +2 -3
  35. package/templates/shared/manifest.json +62 -0
  36. package/templates/dotnet/AgentSkills/entry-points/AGENTS.md +0 -50
  37. package/templates/dotnet/AgentSkills/entry-points/CLAUDE.md +0 -50
  38. package/templates/dotnet/AgentSkills/entry-points/antigravity-instructions.md +0 -50
  39. package/templates/dotnet/AgentSkills/entry-points/cursor-instructions.md +0 -50
  40. package/templates/dotnet/manifest.json +0 -92
package/README.md CHANGED
@@ -1,20 +1,42 @@
1
- # agent-skills
1
+ # @pratikpsl/agent-skills
2
2
 
3
- > Scaffold and manage AI agent skills across any project — like `shadcn/ui` but for AI coding agents.
3
+ > Scaffold and manage AI agent skills across any project — like `shadcn/ui`, but for Cursor, Claude, Codex, Copilot, and Antigravity.
4
+
5
+ `@pratikpsl/agent-skills` is a single npm package: a TypeScript CLI plus bundled skill **packs** under `templates/`. No runtime network fetch — packs ship inside the package, so setup works offline after install.
4
6
 
5
- This single package `@pratikpsl/agent-skills` bundles both the CLI tool and the template definitions. This makes installation and publishing simple and ensures offline usage capability with zero network delays at runtime.
6
7
 
7
8
  ---
8
9
 
9
- ## Usage (Consumers)
10
+ ## Quickstart
11
+
12
+ From any project root (Node 18+):
13
+
14
+ ### Default: Single-File Instructions (Cross-OS Hardlinked)
10
15
 
11
- To setup agent skills in any target project, run:
16
+ Running with **no arguments** automatically scaffolds the universal single-file agent instructions across all IDEs using cross-OS hardlinks:
12
17
 
13
18
  ```bash
14
- # In any .NET project root:
19
+ # Installs instructions across all IDEs with cross-OS hardlinks by default
20
+ npx @pratikpsl/agent-skills
21
+
22
+ # Or install for a specific IDE directly
23
+ npx @pratikpsl/agent-skills cursor # → .cursor/rules/instructions.md
24
+ npx @pratikpsl/agent-skills claude # → CLAUDE.md
25
+ npx @pratikpsl/agent-skills codex # → AGENTS.md
26
+ npx @pratikpsl/agent-skills copilot # → .github/copilot-instructions.md
27
+ npx @pratikpsl/agent-skills antigravity # → .agents/GEMINI.md
28
+ npx @pratikpsl/agent-skills windsurf # → .windsurfrules
29
+ npx @pratikpsl/agent-skills cline # → .clinerules
30
+ npx @pratikpsl/agent-skills aider # → CONVENTIONS.md
31
+ ```
32
+
33
+ ### .NET / C# (Modular Skills Pack)
34
+
35
+ ```bash
36
+ # Install the full .NET/C# skill set + every IDE entry-point
15
37
  npx @pratikpsl/agent-skills dotnet-setup
16
38
 
17
- # Install shared skills + one IDE entry-point only
39
+ # Or install shared skills + one IDE entry-point only
18
40
  npx @pratikpsl/agent-skills dotnet-setup cursor # → .cursor/rules/instructions.md
19
41
  npx @pratikpsl/agent-skills dotnet-setup claude # → CLAUDE.md
20
42
  npx @pratikpsl/agent-skills dotnet-setup codex # → AGENTS.md
@@ -22,79 +44,119 @@ npx @pratikpsl/agent-skills dotnet-setup copilot # → .github/copilot-inst
22
44
  npx @pratikpsl/agent-skills dotnet-setup antigravity # → .agents/GEMINI.md
23
45
  ```
24
46
 
25
- ### Other Commands
47
+ ---
26
48
 
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 |
49
+ ## Commands
50
+
51
+ | Command | Description |
52
+ | --- | --- |
53
+ | `npx @pratikpsl/agent-skills [ide]` | **Default**: Scaffold single-file instructions with cross-OS hardlinks |
54
+ | `npx @pratikpsl/agent-skills setup [ide]` | Explicit alias for instructions setup |
55
+ | `npx @pratikpsl/agent-skills dotnet-setup [ide]` | Convenience installer for the .NET pack |
56
+ | `npx @pratikpsl/agent-skills init` | Scaffold an empty `AgentSkills/` folder and `index.json` |
57
+ | `npx @pratikpsl/agent-skills list` | List skills in known packs (`default`, `dotnet`) |
58
+ | `npx @pratikpsl/agent-skills list <pack>` | List skills in a specific pack (`default`, `dotnet`, etc.) |
59
+ | `npx @pratikpsl/agent-skills add <pack> <skill>` | Copy one skill into the project |
60
+ | `npx @pratikpsl/agent-skills add <pack> --all` | Copy all skills from a pack |
61
+ | `npx @pratikpsl/agent-skills --help` | Show CLI help |
62
+ | `npx @pratikpsl/agent-skills --version` | Show CLI version |
35
63
 
36
64
  ### Options
37
65
 
38
- - `--force`: Overwrite existing skill and entry point files.
39
- - `--path <dir>`: Target project root (defaults to `process.cwd()`).
66
+ - `--force` — overwrite existing skill and entry-point files
67
+ - `--hardlink` / `--no-hardlink` — control cross-OS hardlinking for shared entry points
68
+ - `--path <dir>` — target project root (default: `process.cwd()`)
69
+
70
+ ---
71
+
72
+ ## Packs
73
+
74
+ | Pack | Path | Notes |
75
+ | --- | --- | --- |
76
+ | `default` | `templates/default/` | Universal single-file agent instructions, cross-OS hardlinked across all IDEs |
77
+ | `dotnet` | `templates/dotnet/` | .NET/C# skills, agents, memory, IDE entry-points |
78
+
79
+ Aliases accepted by the CLI:
80
+ - Default pack: `default`, `instructions`, `single-file`, `core`, `standard`, `universal`, `base`, `@pratikpsl/agent-skills`
81
+ - .NET pack: `dotnet`, `skills-dotnet`, `@pratikpsl/agent-skills-dotnet`
82
+
83
+ The repo also contains a `Skills/` tree of additional drafts and a `plugins/` folder. Those are **not** part of the published npm tarball (see `.npmignore` and the `files` whitelist in `package.json`).
40
84
 
41
85
  ---
42
86
 
43
- ## Repository Structure
87
+ ## Repository layout
44
88
 
45
89
  ```
46
- agent-skills/
47
- ├── bin/
48
- │ └── agent-skills.js (CLI binary entrypoint)
90
+ coding-skills-ai/
49
91
  ├── src/
50
- │ ├── index.js (CLI commands setup)
51
- │ ├── commands/ (init, list, add, dotnet-setup)
52
- │ ├── lib/ (copySkills, manifest parsing, resolvePack)
53
- │ ├── templates/ (bundled language packs)
54
- │ │ └── dotnet/
55
- │ │ ├── AgentSkills/ (C# best practices, agents, memory, lessons)
56
- │ │ └── manifest.json (declaration of files and destinations)
57
- │ └── __tests__/ (unit test suite)
58
- ├── package.json (unified package configuration)
59
- ├── LICENSE (MIT)
92
+ │ ├── bin/agent-skills.ts # CLI binary entry
93
+ │ ├── cli/ # commander wiring + commands
94
+ │ │ └── commands/ # init, list, add, dotnet-setup
95
+ │ └── core/ # resolve-pack, manifest, copy-skills
96
+ ├── templates/
97
+ │ └── dotnet/ # shipped pack (manifest.json + AgentSkills/)
98
+ ├── tests/ # Vitest suite
99
+ ├── Skills/ # extra drafts (not published)
100
+ ├── plugins/ # local experiments (not published)
101
+ ├── .github/workflows/ # CI + npm publish on version tags
102
+ ├── package.json
103
+ ├── tsconfig.json # emits to dist/
104
+ ├── vitest.config.ts
105
+ ├── LICENSE # Apache-2.0
60
106
  └── README.md
61
107
  ```
62
108
 
109
+ Build output: `tsc` compiles `src/` → `dist/`. The published binary is `dist/bin/agent-skills.js`. Pack templates stay at package-root `templates/` (included via `files`).
110
+
63
111
  ---
64
112
 
65
- ## Local Development
113
+ ## Local development
66
114
 
67
115
  ```bash
68
- # Install dependencies
69
- npm install
70
-
71
- # Run unit tests
116
+ npm ci
117
+ npm run build
72
118
  npm test
73
119
 
74
- # Link CLI globally for local command line testing
120
+ # Optional: try the CLI globally from this checkout
75
121
  npm link
76
-
77
- # Test the linked binary inside any other project directory
78
- agent-skills dotnet-setup
122
+ agent-skills --help
123
+ agent-skills list dotnet
79
124
  ```
80
125
 
81
- ---
126
+ Useful scripts:
82
127
 
83
- ## Publishing to npm
128
+ | Script | What it does |
129
+ | --- | --- |
130
+ | `npm run build` | `tsc` → `dist/` |
131
+ | `npm test` | Vitest (`tests/**/*.test.ts`) |
132
+ | `npm run test:watch` | Vitest watch mode |
133
+ | `npm run dry-run` | Build + `npm publish --dry-run` |
84
134
 
85
- Since this is a unified package, publishing is straightforward:
135
+ ---
86
136
 
87
- 1. **Log in to npm** (if not already):
88
- ```bash
89
- npm login
90
- ```
91
- 2. **Publish the package**:
137
+ ## Publish checklist (maintainers)
138
+
139
+ 1. Ensure `main` is green (CI: Node 18/20/22 — build + test).
140
+ 2. Confirm version in `package.json` (and pack `templates/dotnet/manifest.json` if skill content changed).
141
+ 3. Verify the tarball includes templates:
92
142
  ```bash
93
- npm publish --otp=YOUR_6_DIGIT_OTP
143
+ npm run build
144
+ npm pack --dry-run
145
+ # Expect: dist/** and templates/dotnet/** (not Skills/ or src/)
94
146
  ```
147
+ 4. Publish:
148
+ - **Trusted Publisher (preferred):** push an annotated tag matching `package.json`, e.g. `v0.7.0`. Workflow `.github/workflows/publish.yml` runs tests and `npm publish --provenance`.
149
+ - **Manual:**
150
+ ```bash
151
+ npm login
152
+ npm run build && npm test
153
+ npm publish --access public --otp=YOUR_6_DIGIT_OTP
154
+ ```
155
+ 5. Confirm on npm: https://www.npmjs.com/package/@pratikpsl/agent-skills
156
+ 6. Smoke-test: `npx @pratikpsl/agent-skills@0.7.0 --version` and `dotnet-setup` in a throwaway folder.
95
157
 
96
158
  ---
97
159
 
98
160
  ## License
99
161
 
100
- MIT
162
+ Apache License 2.0 — see [`LICENSE`](./LICENSE).
@@ -1 +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"}
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,CAgEjD"}
@@ -14,6 +14,7 @@ export function addCommand(program) {
14
14
  .description("Copy a skill (or all skills with --all) from a pack into this project")
15
15
  .option("--all", "Copy all skills from the pack", false)
16
16
  .option("--force", "Overwrite existing files", false)
17
+ .option("--hardlink", "Hardlink shared files where possible", false)
17
18
  .option("--path <dir>", "Target project root (default: cwd)", process.cwd())
18
19
  .action((pack, skillName, options) => {
19
20
  if (!skillName && !options.all) {
@@ -43,6 +44,7 @@ export function addCommand(program) {
43
44
  packDir,
44
45
  targetDir,
45
46
  force: options.force,
47
+ hardlink: options.hardlink,
46
48
  });
47
49
  printSummary(written, skipped);
48
50
  if (written.length === 0 && skipped.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,yCAAyC;AACzC,EAAE;AACF,kFAAkF;AAElF,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAG7E,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,OAAO;SACJ,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CACV,uEAAuE,CACxE;SACA,MAAM,CAAC,OAAO,EAAE,+BAA+B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3E,MAAM,CACL,CACE,IAAY,EACZ,SAA6B,EAC7B,OAAuD,EACvD,EAAE;QACF,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CACX,2DAA2D,CAC5D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,YAA0B,CAAC;QAC/B,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChE,OAAO,CAAC,KAAK,CACX,YAAY,SAAS,wBAAwB,IAAI,IAAI,CACtD,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,kBAAkB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,MAAM,SAAS,IAAI,CACvE,CAAC;QAEF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;YACtC,MAAM,EAAE,YAAY;YACpB,OAAO;YACP,SAAS;YACT,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,sEAAsE;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,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,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAiB,EAAE,OAAiB;IACxD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,8CAA8C;AAC9C,EAAE;AACF,8EAA8E;AAC9E,yCAAyC;AACzC,EAAE;AACF,kFAAkF;AAElF,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAG7E,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,OAAO;SACJ,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CACV,uEAAuE,CACxE;SACA,MAAM,CAAC,OAAO,EAAE,+BAA+B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,YAAY,EAAE,sCAAsC,EAAE,KAAK,CAAC;SACnE,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3E,MAAM,CACL,CACE,IAAY,EACZ,SAA6B,EAC7B,OAA0E,EAC1E,EAAE;QACF,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CACX,2DAA2D,CAC5D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAEnD,IAAI,YAA0B,CAAC;QAC/B,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChE,OAAO,CAAC,KAAK,CACX,YAAY,SAAS,wBAAwB,IAAI,IAAI,CACtD,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CACT,kBAAkB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,MAAM,SAAS,IAAI,CACvE,CAAC;QAEF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;YACtC,MAAM,EAAE,YAAY;YACpB,OAAO;YACP,SAAS;YACT,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,sEAAsE;YACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,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,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,OAAiB,EAAE,OAAiB;IACxD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -1,14 +1,5 @@
1
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[];
2
+ import { filterSkillsForIde } from "../../core/ide-map.js";
3
+ export { filterSkillsForIde };
13
4
  export declare function dotnetSetupCommand(program: Command): void;
14
5
  //# sourceMappingURL=dotnet-setup.d.ts.map
@@ -1 +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"}
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,EAAE,kBAAkB,EAAmB,MAAM,uBAAuB,CAAC;AAK5E,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoEzD"}
@@ -14,38 +14,9 @@
14
14
  import path from "path";
15
15
  import { loadPack } from "../../core/load-pack.js";
16
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
- }
17
+ import { filterSkillsForIde, VALID_IDE_NAMES } from "../../core/ide-map.js";
18
+ const DOTNET_PACK = "dotnet";
19
+ export { filterSkillsForIde };
49
20
  export function dotnetSetupCommand(program) {
50
21
  program
51
22
  .command("dotnet-setup")
@@ -54,6 +25,7 @@ export function dotnetSetupCommand(program) {
54
25
  ` ${VALID_IDE_NAMES}`)
55
26
  .argument("[ide]", `IDE entry-point to install (${VALID_IDE_NAMES}). Omit to install all.`)
56
27
  .option("--force", "Overwrite existing files", false)
28
+ .option("--hardlink", "Hardlink shared files where possible", false)
57
29
  .option("--path <dir>", "Target project root (default: cwd)", process.cwd())
58
30
  .action((ide, options) => {
59
31
  const targetDir = path.resolve(options.path);
@@ -85,6 +57,7 @@ export function dotnetSetupCommand(program) {
85
57
  packDir,
86
58
  targetDir,
87
59
  force: options.force,
60
+ hardlink: options.hardlink,
88
61
  });
89
62
  console.log("\n" + "─".repeat(50));
90
63
  console.log(`✔ .NET skills installed — ${written.length} written, ${skipped.length} skipped.`);
@@ -1 +1 @@
1
- {"version":3,"file":"dotnet-setup.js","sourceRoot":"","sources":["../../../src/cli/commands/dotnet-setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dotnet-setup.js","sourceRoot":"","sources":["../../../src/cli/commands/dotnet-setup.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,oCAAoC;AACpC,EAAE;AACF,qCAAqC;AACrC,0DAA0D;AAC1D,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,WAAW;AACX,EAAE;AACF,6EAA6E;AAC7E,mCAAmC;AAEnC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG5E,MAAM,WAAW,GAAG,QAAQ,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CACV,+DAA+D,WAAW,YAAY;QACpF,yEAAyE;QACzE,KAAK,eAAe,EAAE,CACzB;SACA,QAAQ,CACP,OAAO,EACP,+BAA+B,eAAe,yBAAyB,CACxE;SACA,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,YAAY,EAAE,sCAAsC,EAAE,KAAK,CAAC;SACnE,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3E,MAAM,CAAC,CAAC,GAAuB,EAAE,OAA4D,EAAE,EAAE;QAChG,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CACT,sCAAsC,GAAG,SAAS,SAAS,IAAI,CAChE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,yCAAyC,SAAS,IAAI,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAE1D,IAAI,MAAoB,CAAC;QACzB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACpD,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,KAAK,OAAO,EAAE,CAAC,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC3B,CAAC;QAED,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;QAEnE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;YACtC,MAAM;YACN,OAAO;YACP,SAAS;YACT,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CACT,6BAA6B,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,WAAW,CAClF,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,KAAK,CACX,wEAAwE,CACzE,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,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,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -12,7 +12,7 @@ export function listCommand(program) {
12
12
  .action((pack) => {
13
13
  const packsToList = pack
14
14
  ? [pack]
15
- : ["dotnet"]; // Extend this array as new packs are added.
15
+ : ["default", "dotnet"];
16
16
  let exitCode = 0;
17
17
  for (const packName of packsToList) {
18
18
  try {
@@ -1 +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"}
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,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE1B,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,9 @@
1
+ import type { Command } from "commander";
2
+ export interface SetupOptions {
3
+ force?: boolean;
4
+ path?: string;
5
+ hardlink?: boolean;
6
+ }
7
+ export declare function runSetup(ide: string | undefined, options?: SetupOptions): void;
8
+ export declare function setupCommand(program: Command): void;
9
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,OAAO,GAAE,YAAiB,GACzB,IAAI,CAmCN;AAsBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBnD"}
@@ -0,0 +1,77 @@
1
+ // src/cli/commands/setup.ts
2
+ // `agent-skills [ide]` or `agent-skills setup [ide]`
3
+ //
4
+ // Scaffolds the single-file coding agent instruction template.
5
+ // Supports cross-OS hardlinking (Windows, Linux, macOS) so all
6
+ // IDE entry-points share one single file.
7
+ import path from "path";
8
+ import { loadPack } from "../../core/load-pack.js";
9
+ import { copySkills } from "../../core/copy-skills.js";
10
+ import { filterSkillsForIde, VALID_IDE_NAMES } from "../../core/ide-map.js";
11
+ const DEFAULT_PACK = "default";
12
+ export function runSetup(ide, options = {}) {
13
+ const targetDir = path.resolve(options.path ?? process.cwd());
14
+ const force = options.force ?? false;
15
+ const hardlink = options.hardlink ?? true;
16
+ const targetMsg = ide ? ` [${ide}]` : " (all IDE entry points)";
17
+ console.log(`\n🔧 Setting up agent instructions${targetMsg} in: ${targetDir}\n`);
18
+ const { packDir, manifest } = loadPackOrExit(DEFAULT_PACK);
19
+ let skills;
20
+ try {
21
+ skills = filterSkillsForIde(manifest.skills, ide);
22
+ }
23
+ catch (err) {
24
+ const message = err instanceof Error ? err.message : String(err);
25
+ console.error(`✗ ${message}`);
26
+ process.exit(1);
27
+ }
28
+ console.log(`Setting up from ${manifest.name}@${manifest.version}`);
29
+ if (hardlink) {
30
+ console.log("Cross-OS hardlinking enabled — all IDE entry points share one file.\n");
31
+ }
32
+ else {
33
+ console.log();
34
+ }
35
+ const { written, skipped } = copySkills({
36
+ skills,
37
+ packDir,
38
+ targetDir,
39
+ force,
40
+ hardlink,
41
+ });
42
+ printSummary(written, skipped);
43
+ }
44
+ function printSummary(written, skipped) {
45
+ console.log("\n" + "─".repeat(50));
46
+ console.log(`✔ Instructions installed — ${written.length} written, ${skipped.length} skipped.`);
47
+ if (skipped.length > 0) {
48
+ console.log(" (Run with --force to overwrite skipped files.)");
49
+ }
50
+ }
51
+ function loadPackOrExit(pack) {
52
+ try {
53
+ return loadPack(pack);
54
+ }
55
+ catch (err) {
56
+ const message = err instanceof Error ? err.message : String(err);
57
+ console.error(`✗ ${message}`);
58
+ process.exit(1);
59
+ }
60
+ }
61
+ export function setupCommand(program) {
62
+ program
63
+ .command("setup")
64
+ .description(`Install single-file agent instructions with cross-OS hardlinks.\n Available IDEs: ${VALID_IDE_NAMES}`)
65
+ .argument("[ide]", `IDE entry-point to install (${VALID_IDE_NAMES}). Omit to install all.`)
66
+ .option("--force", "Overwrite existing files", false)
67
+ .option("--no-hardlink", "Copy separate files instead of hardlinking")
68
+ .option("--path <dir>", "Target project root (default: cwd)", process.cwd())
69
+ .action((ide, options) => {
70
+ runSetup(ide, {
71
+ force: options.force,
72
+ path: options.path,
73
+ hardlink: options.hardlink ?? true,
74
+ });
75
+ });
76
+ }
77
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,qDAAqD;AACrD,EAAE;AACF,+DAA+D;AAC/D,+DAA+D;AAC/D,0CAA0C;AAE1C,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG5E,MAAM,YAAY,GAAG,SAAS,CAAC;AAQ/B,MAAM,UAAU,QAAQ,CACtB,GAAuB,EACvB,OAAO,GAAiB,EAAE;IAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IAE1C,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,qCAAqC,SAAS,QAAQ,SAAS,IAAI,CAAC,CAAC;IAEjF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC3D,IAAI,MAAoB,CAAC;IAEzB,IAAI,CAAC;QACH,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpD,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,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACvF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;QACtC,MAAM;QACN,OAAO;QACP,SAAS;QACT,KAAK;QACL,QAAQ;KACT,CAAC,CAAC;IAEH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,OAAiB,EAAE,OAAiB;IACxD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CACT,8BAA8B,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,MAAM,WAAW,CACnF,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,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,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CACV,sFAAsF,eAAe,EAAE,CACxG;SACA,QAAQ,CACP,OAAO,EACP,+BAA+B,eAAe,yBAAyB,CACxE;SACA,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;SACrE,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3E,MAAM,CAAC,CAAC,GAAuB,EAAE,OAA6D,EAAE,EAAE;QACjG,QAAQ,CAAC,GAAG,EAAE;YACZ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;SACnC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/cli/index.js CHANGED
@@ -8,6 +8,8 @@ import { initCommand } from "./commands/init.js";
8
8
  import { listCommand } from "./commands/list.js";
9
9
  import { addCommand } from "./commands/add.js";
10
10
  import { dotnetSetupCommand } from "./commands/dotnet-setup.js";
11
+ import { setupCommand, runSetup } from "./commands/setup.js";
12
+ import { VALID_IDE_NAMES } from "../core/ide-map.js";
11
13
  // Read version from our own package.json without a JSON import assertion
12
14
  // (works in Node 18 without the --experimental-json-modules flag).
13
15
  const require = createRequire(import.meta.url);
@@ -16,11 +18,23 @@ const program = new Command();
16
18
  program
17
19
  .name("agent-skills")
18
20
  .description("Scaffold and manage AI agent skills across projects")
19
- .version(version);
21
+ .version(version)
22
+ .argument("[ide]", `IDE entry-point to install (${VALID_IDE_NAMES}). Omit to install all.`)
23
+ .option("--force", "Overwrite existing files", false)
24
+ .option("--no-hardlink", "Copy separate files instead of hardlinking")
25
+ .option("--path <dir>", "Target project root (default: cwd)", process.cwd())
26
+ .action((ide, options) => {
27
+ runSetup(ide, {
28
+ force: options.force,
29
+ path: options.path,
30
+ hardlink: options.hardlink ?? true,
31
+ });
32
+ });
33
+ setupCommand(program);
34
+ dotnetSetupCommand(program);
20
35
  initCommand(program);
21
36
  listCommand(program);
22
37
  addCommand(program);
23
- dotnetSetupCommand(program);
24
38
  program.parseAsync(process.argv).catch((err) => {
25
39
  const message = err instanceof Error ? err.message : String(err);
26
40
  console.error(`\n✗ ${message}`);
@@ -1 +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"}
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;AAChE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,yEAAyE;AACzE,mEAAmE;AACnE,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,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;KAChB,QAAQ,CACP,OAAO,EACP,+BAA+B,eAAe,yBAAyB,CACxE;KACA,MAAM,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC;KACpD,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;KACrE,MAAM,CAAC,cAAc,EAAE,oCAAoC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC3E,MAAM,CAAC,CAAC,GAAuB,EAAE,OAA6D,EAAE,EAAE;IACjG,QAAQ,CAAC,GAAG,EAAE;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;KACnC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,UAAU,CAAC,OAAO,CAAC,CAAC;AAEpB,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"}
@@ -14,9 +14,11 @@ export interface CopySkillsOptions {
14
14
  targetDir: string;
15
15
  /** When true, overwrite existing files. */
16
16
  force: boolean;
17
+ /** When true, hardlink duplicate files sharing the same source to the first written instance. */
18
+ hardlink?: boolean;
17
19
  }
18
20
  /**
19
- * Copies a list of skill source directories into the target project.
21
+ * Copies or hardlinks a list of skill sources into the target project.
20
22
  */
21
23
  export declare function copySkills(options: CopySkillsOptions): CopyResult;
22
24
  /**
@@ -1 +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"}
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;IACf,iGAAiG;IACjG,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAqCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAkCjE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI9D"}
@@ -8,20 +8,46 @@
8
8
  //
9
9
  // This module contains no pack-specific logic. The manifest tells it what
10
10
  // to copy; it does not inspect SKILL.md contents.
11
- import { cpSync, existsSync, mkdirSync, rmSync } from "fs";
11
+ import { cpSync, existsSync, linkSync, mkdirSync, rmSync, statSync } from "fs";
12
12
  import path from "path";
13
13
  /**
14
- * Copies a list of skill source directories into the target project.
14
+ * Places a single skill file or directory, using hardlinks when requested
15
+ * and a previous instance of the source file was already written.
16
+ */
17
+ function placeSkillFile(src, dest, destRelPath, targetDir, hardlink, primaryDestMap) {
18
+ const primaryPath = primaryDestMap.get(src);
19
+ if (hardlink && primaryPath && existsSync(primaryPath)) {
20
+ try {
21
+ linkSync(primaryPath, dest);
22
+ const relPrimary = path.relative(targetDir, primaryPath);
23
+ console.log(` ✓ ${destRelPath} (hardlink → ${relPrimary})`);
24
+ return;
25
+ }
26
+ catch {
27
+ // Fall back to copy if hard link fails (e.g. cross-device link)
28
+ }
29
+ }
30
+ cpSync(src, dest, { recursive: true });
31
+ try {
32
+ if (statSync(src).isFile()) {
33
+ primaryDestMap.set(src, dest);
34
+ }
35
+ }
36
+ catch {
37
+ // Stat error ignored
38
+ }
39
+ console.log(` ✓ ${destRelPath}`);
40
+ }
41
+ /**
42
+ * Copies or hardlinks a list of skill sources into the target project.
15
43
  */
16
44
  export function copySkills(options) {
17
- const { skills, packDir, targetDir, force } = options;
45
+ const { skills, packDir, targetDir, force, hardlink = false } = options;
18
46
  const written = [];
19
47
  const skipped = [];
48
+ const primaryDestMap = new Map();
20
49
  for (const skill of skills) {
21
50
  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
51
  const destRelPath = skill.dest ?? skill.path;
26
52
  const dest = path.join(targetDir, destRelPath);
27
53
  if (!existsSync(src)) {
@@ -32,18 +58,16 @@ export function copySkills(options) {
32
58
  if (existsSync(dest) && !force) {
33
59
  console.warn(` ⚠ Skipping "${skill.name}" — destination already exists. Use --force to overwrite.`);
34
60
  skipped.push(destRelPath);
61
+ if (!primaryDestMap.has(src))
62
+ primaryDestMap.set(src, dest);
35
63
  continue;
36
64
  }
37
65
  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
66
  if (force && existsSync(dest)) {
42
67
  rmSync(dest, { recursive: true, force: true });
43
68
  }
44
- cpSync(src, dest, { recursive: true });
69
+ placeSkillFile(src, dest, destRelPath, targetDir, hardlink, primaryDestMap);
45
70
  written.push(destRelPath);
46
- console.log(` ✓ ${destRelPath}`);
47
71
  }
48
72
  return { written, skipped };
49
73
  }
@@ -1 +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"}
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,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC/E,OAAO,IAAI,MAAM,MAAM,CAAC;AAuBxB;;;GAGG;AACH,SAAS,cAAc,CACrB,GAAW,EACX,IAAY,EACZ,WAAmB,EACnB,SAAiB,EACjB,QAAiB,EACjB,cAAmC;IAEnC,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,QAAQ,IAAI,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,OAAO,WAAW,gBAAgB,UAAU,GAAG,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;QAClE,CAAC;IACH,CAAC;IAED,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3B,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAA0B;IACnD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACxE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,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,CAAC,8BAA8B,KAAK,CAAC,IAAI,gBAAgB,GAAG,EAAE,CAAC,CAAC;YAC5E,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,CAAC,iBAAiB,KAAK,CAAC,IAAI,2DAA2D,CAAC,CAAC;YACrG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,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;QAED,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5B,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"}