@pratikpsl/agent-skills 0.6.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.
- package/README.md +41 -17
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +2 -0
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/dotnet-setup.d.ts +2 -11
- package/dist/cli/commands/dotnet-setup.d.ts.map +1 -1
- package/dist/cli/commands/dotnet-setup.js +5 -32
- package/dist/cli/commands/dotnet-setup.js.map +1 -1
- package/dist/cli/commands/list.js +1 -1
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/setup.d.ts +9 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +77 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/index.js +16 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/core/copy-skills.d.ts +3 -1
- package/dist/core/copy-skills.d.ts.map +1 -1
- package/dist/core/copy-skills.js +35 -11
- package/dist/core/copy-skills.js.map +1 -1
- package/dist/core/ide-map.d.ts +10 -0
- package/dist/core/ide-map.d.ts.map +1 -0
- package/dist/core/ide-map.js +37 -0
- package/dist/core/ide-map.js.map +1 -0
- package/dist/core/manifest.d.ts +2 -10
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/manifest.js +120 -24
- package/dist/core/manifest.js.map +1 -1
- package/dist/core/resolve-pack.d.ts.map +1 -1
- package/dist/core/resolve-pack.js +23 -2
- package/dist/core/resolve-pack.js.map +1 -1
- package/package.json +8 -6
- package/templates/default/instructions.md +34 -0
- package/templates/dotnet/AgentSkills/entry-points/{copilot-instructions.md → entry-point.md} +2 -3
- package/templates/shared/manifest.json +62 -0
- package/templates/dotnet/AgentSkills/entry-points/AGENTS.md +0 -50
- package/templates/dotnet/AgentSkills/entry-points/CLAUDE.md +0 -50
- package/templates/dotnet/AgentSkills/entry-points/antigravity-instructions.md +0 -50
- package/templates/dotnet/AgentSkills/entry-points/cursor-instructions.md +0 -50
- package/templates/dotnet/manifest.json +0 -92
package/README.md
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
|
|
5
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.
|
|
6
6
|
|
|
7
|
-
Currently published on npm as **0.5.0**; this branch prepares **0.6.0**.
|
|
8
7
|
|
|
9
8
|
---
|
|
10
9
|
|
|
@@ -12,38 +11,60 @@ Currently published on npm as **0.5.0**; this branch prepares **0.6.0**.
|
|
|
12
11
|
|
|
13
12
|
From any project root (Node 18+):
|
|
14
13
|
|
|
14
|
+
### Default: Single-File Instructions (Cross-OS Hardlinked)
|
|
15
|
+
|
|
16
|
+
Running with **no arguments** automatically scaffolds the universal single-file agent instructions across all IDEs using cross-OS hardlinks:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
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
|
+
|
|
15
35
|
```bash
|
|
16
36
|
# Install the full .NET/C# skill set + every IDE entry-point
|
|
17
|
-
npx @pratikpsl/agent-skills
|
|
37
|
+
npx @pratikpsl/agent-skills dotnet-setup
|
|
18
38
|
|
|
19
39
|
# Or install shared skills + one IDE entry-point only
|
|
20
|
-
npx @pratikpsl/agent-skills
|
|
21
|
-
npx @pratikpsl/agent-skills
|
|
22
|
-
npx @pratikpsl/agent-skills
|
|
23
|
-
npx @pratikpsl/agent-skills
|
|
24
|
-
npx @pratikpsl/agent-skills
|
|
40
|
+
npx @pratikpsl/agent-skills dotnet-setup cursor # → .cursor/rules/instructions.md
|
|
41
|
+
npx @pratikpsl/agent-skills dotnet-setup claude # → CLAUDE.md
|
|
42
|
+
npx @pratikpsl/agent-skills dotnet-setup codex # → AGENTS.md
|
|
43
|
+
npx @pratikpsl/agent-skills dotnet-setup copilot # → .github/copilot-instructions.md
|
|
44
|
+
npx @pratikpsl/agent-skills dotnet-setup antigravity # → .agents/GEMINI.md
|
|
25
45
|
```
|
|
26
46
|
|
|
27
|
-
Until 0.6.0 is published, use `@0.5.0` or the git branch for local testing.
|
|
28
|
-
|
|
29
47
|
---
|
|
30
48
|
|
|
31
49
|
## Commands
|
|
32
50
|
|
|
33
51
|
| Command | Description |
|
|
34
52
|
| --- | --- |
|
|
35
|
-
| `npx @pratikpsl/agent-skills
|
|
36
|
-
| `npx @pratikpsl/agent-skills
|
|
37
|
-
| `npx @pratikpsl/agent-skills list dotnet` | List skills in the `dotnet` pack |
|
|
38
|
-
| `npx @pratikpsl/agent-skills add dotnet <skill>` | Copy one skill into the project |
|
|
39
|
-
| `npx @pratikpsl/agent-skills add dotnet --all` | Copy all skills (same pack content as `dotnet-setup`) |
|
|
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 |
|
|
40
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 |
|
|
41
61
|
| `npx @pratikpsl/agent-skills --help` | Show CLI help |
|
|
42
62
|
| `npx @pratikpsl/agent-skills --version` | Show CLI version |
|
|
43
63
|
|
|
44
64
|
### Options
|
|
45
65
|
|
|
46
66
|
- `--force` — overwrite existing skill and entry-point files
|
|
67
|
+
- `--hardlink` / `--no-hardlink` — control cross-OS hardlinking for shared entry points
|
|
47
68
|
- `--path <dir>` — target project root (default: `process.cwd()`)
|
|
48
69
|
|
|
49
70
|
---
|
|
@@ -52,9 +73,12 @@ Until 0.6.0 is published, use `@0.5.0` or the git branch for local testing.
|
|
|
52
73
|
|
|
53
74
|
| Pack | Path | Notes |
|
|
54
75
|
| --- | --- | --- |
|
|
76
|
+
| `default` | `templates/default/` | Universal single-file agent instructions, cross-OS hardlinked across all IDEs |
|
|
55
77
|
| `dotnet` | `templates/dotnet/` | .NET/C# skills, agents, memory, IDE entry-points |
|
|
56
78
|
|
|
57
|
-
Aliases accepted by the CLI:
|
|
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`
|
|
58
82
|
|
|
59
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`).
|
|
60
84
|
|
|
@@ -121,7 +145,7 @@ Useful scripts:
|
|
|
121
145
|
# Expect: dist/** and templates/dotnet/** (not Skills/ or src/)
|
|
122
146
|
```
|
|
123
147
|
4. Publish:
|
|
124
|
-
- **Trusted Publisher (preferred):** push an annotated tag matching `package.json`, e.g. `v0.
|
|
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`.
|
|
125
149
|
- **Manual:**
|
|
126
150
|
```bash
|
|
127
151
|
npm login
|
|
@@ -129,7 +153,7 @@ Useful scripts:
|
|
|
129
153
|
npm publish --access public --otp=YOUR_6_DIGIT_OTP
|
|
130
154
|
```
|
|
131
155
|
5. Confirm on npm: https://www.npmjs.com/package/@pratikpsl/agent-skills
|
|
132
|
-
6. Smoke-test: `npx @pratikpsl/agent-skills@0.
|
|
156
|
+
6. Smoke-test: `npx @pratikpsl/agent-skills@0.7.0 --version` and `dotnet-setup` in a throwaway folder.
|
|
133
157
|
|
|
134
158
|
---
|
|
135
159
|
|
|
@@ -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,
|
|
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"}
|
package/dist/cli/commands/add.js
CHANGED
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../../src/cli/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
|
-
import
|
|
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,
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"dotnet-setup.js","sourceRoot":"","sources":["../../../src/cli/commands/dotnet-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export function listCommand(program) {
|
|
|
12
12
|
.action((pack) => {
|
|
13
13
|
const packsToList = pack
|
|
14
14
|
? [pack]
|
|
15
|
-
: ["dotnet"];
|
|
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
|
|
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":"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"}
|
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}`);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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;
|
|
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
|
|
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;
|
|
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"}
|
package/dist/core/copy-skills.js
CHANGED
|
@@ -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
|
-
*
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"copy-skills.js","sourceRoot":"","sources":["../../src/core/copy-skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SkillEntry } from "./manifest.js";
|
|
2
|
+
export declare const IDE_ENTRY_POINT_MAP: Record<string, string>;
|
|
3
|
+
export declare const VALID_IDE_NAMES: string;
|
|
4
|
+
export declare const ENTRY_POINT_PREFIX = "entry-point:";
|
|
5
|
+
/**
|
|
6
|
+
* Filters skills for a given IDE (or all IDEs when undefined).
|
|
7
|
+
* Deduplicates multiple skills targeting the same destination.
|
|
8
|
+
*/
|
|
9
|
+
export declare function filterSkillsForIde(skills: SkillEntry[], ide?: string): SkillEntry[];
|
|
10
|
+
//# sourceMappingURL=ide-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ide-map.d.ts","sourceRoot":"","sources":["../../src/core/ide-map.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAStD,CAAC;AAEF,eAAO,MAAM,eAAe,QAA8C,CAAC;AAC3E,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,UAAU,EAAE,EACpB,GAAG,CAAC,EAAE,MAAM,GACX,UAAU,EAAE,CAuBd"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// src/core/ide-map.ts
|
|
2
|
+
// Central registry of supported AI coding IDEs and their entry-point mappings.
|
|
3
|
+
export const IDE_ENTRY_POINT_MAP = {
|
|
4
|
+
cursor: "entry-point:cursor",
|
|
5
|
+
claude: "entry-point:claude",
|
|
6
|
+
codex: "entry-point:codex",
|
|
7
|
+
copilot: "entry-point:copilot",
|
|
8
|
+
antigravity: "entry-point:antigravity",
|
|
9
|
+
windsurf: "entry-point:windsurf",
|
|
10
|
+
cline: "entry-point:cline",
|
|
11
|
+
aider: "entry-point:aider",
|
|
12
|
+
};
|
|
13
|
+
export const VALID_IDE_NAMES = Object.keys(IDE_ENTRY_POINT_MAP).join(", ");
|
|
14
|
+
export const ENTRY_POINT_PREFIX = "entry-point:";
|
|
15
|
+
/**
|
|
16
|
+
* Filters skills for a given IDE (or all IDEs when undefined).
|
|
17
|
+
* Deduplicates multiple skills targeting the same destination.
|
|
18
|
+
*/
|
|
19
|
+
export function filterSkillsForIde(skills, ide) {
|
|
20
|
+
if (!ide) {
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
return skills.filter((s) => {
|
|
23
|
+
const dest = s.dest ?? s.path;
|
|
24
|
+
if (seen.has(dest))
|
|
25
|
+
return false;
|
|
26
|
+
seen.add(dest);
|
|
27
|
+
return true;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const targetSkillName = IDE_ENTRY_POINT_MAP[ide.toLowerCase()];
|
|
31
|
+
if (!targetSkillName) {
|
|
32
|
+
throw new Error(`Unknown IDE "${ide}". Valid options are: ${VALID_IDE_NAMES}`);
|
|
33
|
+
}
|
|
34
|
+
return skills.filter((s) => (!s.name.startsWith(ENTRY_POINT_PREFIX) && s.name !== "instructions") ||
|
|
35
|
+
s.name === targetSkillName);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ide-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ide-map.js","sourceRoot":"","sources":["../../src/core/ide-map.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,+EAA+E;AAI/E,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,MAAM,EAAE,oBAAoB;IAC5B,MAAM,EAAE,oBAAoB;IAC5B,KAAK,EAAE,mBAAmB;IAC1B,OAAO,EAAE,qBAAqB;IAC9B,WAAW,EAAE,yBAAyB;IACtC,QAAQ,EAAE,sBAAsB;IAChC,KAAK,EAAE,mBAAmB;IAC1B,KAAK,EAAE,mBAAmB;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAoB,EACpB,GAAY;IAEZ,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACzB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;YAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,eAAe,GAAG,mBAAmB,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,gBAAgB,GAAG,yBAAyB,eAAe,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;QACrE,CAAC,CAAC,IAAI,KAAK,eAAe,CAC7B,CAAC;AACJ,CAAC"}
|
package/dist/core/manifest.d.ts
CHANGED
|
@@ -5,11 +5,7 @@ export interface SkillEntry {
|
|
|
5
5
|
description: string;
|
|
6
6
|
/** Source path of the skill, relative to the pack root. */
|
|
7
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
|
-
*/
|
|
8
|
+
/** Destination path in the target project, relative to the project root. */
|
|
13
9
|
dest?: string;
|
|
14
10
|
}
|
|
15
11
|
export interface Manifest {
|
|
@@ -20,10 +16,6 @@ export interface Manifest {
|
|
|
20
16
|
/** All skills provided by this pack. */
|
|
21
17
|
skills: SkillEntry[];
|
|
22
18
|
}
|
|
23
|
-
|
|
24
|
-
* Reads and validates the manifest.json for a pack.
|
|
25
|
-
*
|
|
26
|
-
* @throws When manifest is missing, unreadable, or structurally invalid.
|
|
27
|
-
*/
|
|
19
|
+
export declare function discoverSkills(packDir: string): SkillEntry[];
|
|
28
20
|
export declare function readManifest(packDir: string): Manifest;
|
|
29
21
|
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAQA,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,4EAA4E;IAC5E,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;AA8FD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAkB5D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAyCtD"}
|