agent-skill-manager 1.15.0 → 1.15.1
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.backup.md +38 -22
- package/README.md +40 -24
- package/dist/agent-skill-manager.js +4 -4
- package/dist/{chunk-257hhznr.js → chunk-6t9cpddh.js} +1 -1
- package/dist/{chunk-vhkxjexp.js → chunk-etgg42ff.js} +1 -1
- package/dist/{chunk-q9kp1v01.js → chunk-zzvkjwrx.js} +2 -2
- package/package.json +1 -1
package/README.backup.md
CHANGED
|
@@ -51,7 +51,7 @@ The more AI agents you use, the worse this gets. Every new tool adds another ski
|
|
|
51
51
|
- **See everything at once** — List, search, and filter skills across all providers and scopes from one dashboard. No more `ls`-ing through hidden directories.
|
|
52
52
|
- **Install from GitHub in one command** — `asm install github:user/repo` handles cloning, validation, and placement. Supports single-skill repos, multi-skill collections, subfolder URLs, and private repos via SSH.
|
|
53
53
|
- **Catch problems before they bite** — Built-in security scanning flags dangerous patterns (shell execution, network access, credential exposure, obfuscation) before you install. Duplicate audit finds and cleans redundant skills across providers.
|
|
54
|
-
- **Works with every major agent** —
|
|
54
|
+
- **Works with every major agent** — 17 providers built-in: Claude Code, Codex, OpenClaw, Cursor, Windsurf, Cline, Roo Code, Continue, GitHub Copilot, Aider, OpenCode, Zed, Augment, Amp, Gemini CLI, Google Antigravity, and a generic Agents provider. Add custom providers in seconds via config.
|
|
55
55
|
- **Two interfaces, one tool** — Full interactive TUI with keyboard navigation, search, and detail views. Or use the CLI with `--json` for scripting and automation.
|
|
56
56
|
|
|
57
57
|
<p align="center">
|
|
@@ -130,25 +130,27 @@ asm install github:anthropics/skills --all # install everything
|
|
|
130
130
|
|
|
131
131
|
## Supported Agent Tools
|
|
132
132
|
|
|
133
|
-
`asm` ships with **
|
|
134
|
-
|
|
135
|
-
| Tool
|
|
136
|
-
|
|
|
137
|
-
| Claude Code
|
|
138
|
-
| Codex
|
|
139
|
-
| OpenClaw
|
|
140
|
-
| Agents (generic)
|
|
141
|
-
| Cursor
|
|
142
|
-
| Windsurf
|
|
143
|
-
| Cline
|
|
144
|
-
| Roo Code
|
|
145
|
-
| Continue
|
|
146
|
-
| GitHub Copilot
|
|
147
|
-
| Aider
|
|
148
|
-
| OpenCode
|
|
149
|
-
| Zed
|
|
150
|
-
| Augment
|
|
151
|
-
| Amp
|
|
133
|
+
`asm` ships with **17 built-in providers**. The first 4 are enabled by default; the rest can be enabled via `asm config edit`.
|
|
134
|
+
|
|
135
|
+
| Tool | Global Path | Project Path | Default |
|
|
136
|
+
| ------------------ | --------------------------------- | ----------------------- | :------: |
|
|
137
|
+
| Claude Code | `~/.claude/skills/` | `.claude/skills/` | enabled |
|
|
138
|
+
| Codex | `~/.codex/skills/` | `.codex/skills/` | enabled |
|
|
139
|
+
| OpenClaw | `~/.openclaw/skills/` | `.openclaw/skills/` | enabled |
|
|
140
|
+
| Agents (generic) | `~/.agents/skills/` | `.agents/skills/` | enabled |
|
|
141
|
+
| Cursor | `~/.cursor/rules/` | `.cursor/rules/` | disabled |
|
|
142
|
+
| Windsurf | `~/.windsurf/rules/` | `.windsurf/rules/` | disabled |
|
|
143
|
+
| Cline | `~/Documents/Cline/Rules/` | `.clinerules/` | disabled |
|
|
144
|
+
| Roo Code | `~/.roo/rules/` | `.roo/rules/` | disabled |
|
|
145
|
+
| Continue | `~/.continue/rules/` | `.continue/rules/` | disabled |
|
|
146
|
+
| GitHub Copilot | `~/.github/instructions/` | `.github/instructions/` | disabled |
|
|
147
|
+
| Aider | `~/.aider/skills/` | `.aider/skills/` | disabled |
|
|
148
|
+
| OpenCode | `~/.config/opencode/skills/` | `.opencode/skills/` | disabled |
|
|
149
|
+
| Zed | `~/.config/zed/prompt_overrides/` | `.zed/rules/` | disabled |
|
|
150
|
+
| Augment | `~/.augment/rules/` | `.augment/rules/` | disabled |
|
|
151
|
+
| Amp | `~/.amp/skills/` | `.amp/skills/` | disabled |
|
|
152
|
+
| Gemini CLI | `~/.gemini/skills/` | `.gemini/skills/` | disabled |
|
|
153
|
+
| Google Antigravity | `~/.antigravity/skills/` | `.antigravity/skills/` | disabled |
|
|
152
154
|
|
|
153
155
|
Enable a provider:
|
|
154
156
|
|
|
@@ -169,7 +171,7 @@ Yes. `asm` is MIT licensed and free forever. No accounts, no telemetry, no paywa
|
|
|
169
171
|
v1.10.0 shipped on March 18, 2026. The project has had 10 releases in the past week. Check the [changelog](docs/CHANGELOG.md) for the full history.
|
|
170
172
|
|
|
171
173
|
**Which AI agents does it support?**
|
|
172
|
-
|
|
174
|
+
17 providers built-in: Claude Code, Codex, OpenClaw, Cursor, Windsurf, Cline, Roo Code, Continue, GitHub Copilot, Aider, OpenCode, Zed, Augment, Amp, Gemini CLI, Google Antigravity, and a generic Agents provider. The first 4 are enabled by default; enable the rest via `asm config edit`. You can also add any custom agent that stores skills as directories with a `SKILL.md` file.
|
|
173
175
|
|
|
174
176
|
**How does it compare to managing skills manually?**
|
|
175
177
|
Manual management means remembering where each agent stores skills, cloning repos by hand, checking for duplicates yourself, and having no security scanning. `asm` automates all of that with one command.
|
|
@@ -342,7 +344,7 @@ The install command clones the repository, validates `SKILL.md` files, scans for
|
|
|
342
344
|
<details>
|
|
343
345
|
<summary><strong>Configuration</strong></summary>
|
|
344
346
|
|
|
345
|
-
On first run, a config file is created at `~/.config/agent-skill-manager/config.json` with
|
|
347
|
+
On first run, a config file is created at `~/.config/agent-skill-manager/config.json` with 17 default providers. The first 4 are enabled; the rest are disabled until you enable them:
|
|
346
348
|
|
|
347
349
|
```json
|
|
348
350
|
{
|
|
@@ -452,6 +454,20 @@ On first run, a config file is created at `~/.config/agent-skill-manager/config.
|
|
|
452
454
|
"global": "~/.amp/skills",
|
|
453
455
|
"project": ".amp/skills",
|
|
454
456
|
"enabled": false
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
"name": "gemini",
|
|
460
|
+
"label": "Gemini CLI",
|
|
461
|
+
"global": "~/.gemini/skills",
|
|
462
|
+
"project": ".gemini/skills",
|
|
463
|
+
"enabled": false
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
"name": "antigravity",
|
|
467
|
+
"label": "Google Antigravity",
|
|
468
|
+
"global": "~/.antigravity/skills",
|
|
469
|
+
"project": ".antigravity/skills",
|
|
470
|
+
"enabled": false
|
|
455
471
|
}
|
|
456
472
|
],
|
|
457
473
|
"customPaths": [],
|
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
<p align="center">
|
|
26
26
|
<a href="#get-started-in-30-seconds"><strong>Get Started in 30 Seconds →</strong></a>
|
|
27
27
|
|
|
|
28
|
-
<a href="https://luongnv.com/asm/"><strong>Browse
|
|
28
|
+
<a href="https://luongnv.com/asm/"><strong>Browse 2,600+ Skills Online →</strong></a>
|
|
29
29
|
</p>
|
|
30
30
|
|
|
31
31
|
---
|
|
@@ -62,7 +62,7 @@ The more AI agents you use, the worse this gets. Every new tool adds another ski
|
|
|
62
62
|
- **Install from GitHub in one command** — `asm install github:user/repo` handles cloning, validation, and placement. Supports single-skill repos, multi-skill collections, subfolder URLs, and private repos via SSH.
|
|
63
63
|
- **Catch problems before they bite** — Built-in security scanning flags dangerous patterns (shell execution, network access, credential exposure, obfuscation) before you install. Duplicate audit finds and cleans redundant skills across providers.
|
|
64
64
|
- **Create and test skills locally** — Scaffold new skills with `asm init`, symlink them for live development with `asm link`, audit for security issues, and verify metadata — all before publishing. [See the full local dev workflow ↓](#build-test-and-ship-your-own-skills)
|
|
65
|
-
- **Works with every major agent** —
|
|
65
|
+
- **Works with every major agent** — 17 providers built-in: Claude Code, Codex, OpenClaw, Cursor, Windsurf, Cline, Roo Code, Continue, GitHub Copilot, Aider, OpenCode, Zed, Augment, Amp, Gemini CLI, Google Antigravity, and a generic Agents provider. Add custom providers in seconds via config.
|
|
66
66
|
- **Two interfaces, one tool** — Full interactive TUI with keyboard navigation, search, and detail views. Or use the CLI with `--json` for scripting and automation.
|
|
67
67
|
|
|
68
68
|
<p align="center">
|
|
@@ -283,7 +283,7 @@ asm
|
|
|
283
283
|
|
|
284
284
|
## Open-Source Skill Collections
|
|
285
285
|
|
|
286
|
-
A curated list of skill repositories you can install with a single command. Over **
|
|
286
|
+
A curated list of skill repositories you can install with a single command. Over **2,600 skills** available across these collections:
|
|
287
287
|
|
|
288
288
|
> **Last updated:** 2026-03-18
|
|
289
289
|
|
|
@@ -322,25 +322,27 @@ asm install github:anthropics/skills --all
|
|
|
322
322
|
|
|
323
323
|
## Supported Agent Tools
|
|
324
324
|
|
|
325
|
-
`asm` ships with **
|
|
326
|
-
|
|
327
|
-
| Tool
|
|
328
|
-
|
|
|
329
|
-
| Claude Code
|
|
330
|
-
| Codex
|
|
331
|
-
| OpenClaw
|
|
332
|
-
| Agents (generic)
|
|
333
|
-
| Cursor
|
|
334
|
-
| Windsurf
|
|
335
|
-
| Cline
|
|
336
|
-
| Roo Code
|
|
337
|
-
| Continue
|
|
338
|
-
| GitHub Copilot
|
|
339
|
-
| Aider
|
|
340
|
-
| OpenCode
|
|
341
|
-
| Zed
|
|
342
|
-
| Augment
|
|
343
|
-
| Amp
|
|
325
|
+
`asm` ships with **17 built-in providers**, all enabled by default. Disable any you don't need via `asm config edit`.
|
|
326
|
+
|
|
327
|
+
| Tool | Global Path | Project Path | Default |
|
|
328
|
+
| ------------------ | --------------------------------- | ----------------------- | :-----: |
|
|
329
|
+
| Claude Code | `~/.claude/skills/` | `.claude/skills/` | enabled |
|
|
330
|
+
| Codex | `~/.codex/skills/` | `.codex/skills/` | enabled |
|
|
331
|
+
| OpenClaw | `~/.openclaw/skills/` | `.openclaw/skills/` | enabled |
|
|
332
|
+
| Agents (generic) | `~/.agents/skills/` | `.agents/skills/` | enabled |
|
|
333
|
+
| Cursor | `~/.cursor/rules/` | `.cursor/rules/` | enabled |
|
|
334
|
+
| Windsurf | `~/.windsurf/rules/` | `.windsurf/rules/` | enabled |
|
|
335
|
+
| Cline | `~/Documents/Cline/Rules/` | `.clinerules/` | enabled |
|
|
336
|
+
| Roo Code | `~/.roo/rules/` | `.roo/rules/` | enabled |
|
|
337
|
+
| Continue | `~/.continue/rules/` | `.continue/rules/` | enabled |
|
|
338
|
+
| GitHub Copilot | `~/.github/instructions/` | `.github/instructions/` | enabled |
|
|
339
|
+
| Aider | `~/.aider/skills/` | `.aider/skills/` | enabled |
|
|
340
|
+
| OpenCode | `~/.config/opencode/skills/` | `.opencode/skills/` | enabled |
|
|
341
|
+
| Zed | `~/.config/zed/prompt_overrides/` | `.zed/rules/` | enabled |
|
|
342
|
+
| Augment | `~/.augment/rules/` | `.augment/rules/` | enabled |
|
|
343
|
+
| Amp | `~/.amp/skills/` | `.amp/skills/` | enabled |
|
|
344
|
+
| Gemini CLI | `~/.gemini/skills/` | `.gemini/skills/` | enabled |
|
|
345
|
+
| Google Antigravity | `~/.antigravity/skills/` | `.antigravity/skills/` | enabled |
|
|
344
346
|
|
|
345
347
|
Disable a provider — opens config in `$EDITOR`, set `"enabled": false` for any provider:
|
|
346
348
|
|
|
@@ -361,7 +363,7 @@ Yes. `asm` is MIT licensed and free forever. No accounts, no telemetry, no paywa
|
|
|
361
363
|
v1.12.0 shipped on March 23, 2026. The project has had 12 releases in the past week. Check the [changelog](docs/CHANGELOG.md) for the full history.
|
|
362
364
|
|
|
363
365
|
**Which AI agents does it support?**
|
|
364
|
-
|
|
366
|
+
17 providers built-in: Claude Code, Codex, OpenClaw, Cursor, Windsurf, Cline, Roo Code, Continue, GitHub Copilot, Aider, OpenCode, Zed, Augment, Amp, Gemini CLI, Google Antigravity, and a generic Agents provider. All 17 are enabled by default; disable any you don't need via `asm config edit`. You can also add any custom agent that stores skills as directories with a `SKILL.md` file.
|
|
365
367
|
|
|
366
368
|
**How does it compare to managing skills manually?**
|
|
367
369
|
Manual management means remembering where each agent stores skills, cloning repos by hand, checking for duplicates yourself, and having no security scanning. `asm` automates all of that with one command.
|
|
@@ -641,7 +643,7 @@ The install command clones the repository, validates `SKILL.md` files, scans for
|
|
|
641
643
|
<details>
|
|
642
644
|
<summary><strong>Configuration</strong></summary>
|
|
643
645
|
|
|
644
|
-
On first run, a config file is created at `~/.config/agent-skill-manager/config.json` with
|
|
646
|
+
On first run, a config file is created at `~/.config/agent-skill-manager/config.json` with 17 default providers, all enabled:
|
|
645
647
|
|
|
646
648
|
```json
|
|
647
649
|
{
|
|
@@ -751,6 +753,20 @@ On first run, a config file is created at `~/.config/agent-skill-manager/config.
|
|
|
751
753
|
"global": "~/.amp/skills",
|
|
752
754
|
"project": ".amp/skills",
|
|
753
755
|
"enabled": false
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
"name": "gemini",
|
|
759
|
+
"label": "Gemini CLI",
|
|
760
|
+
"global": "~/.gemini/skills",
|
|
761
|
+
"project": ".gemini/skills",
|
|
762
|
+
"enabled": false
|
|
763
|
+
},
|
|
764
|
+
{
|
|
765
|
+
"name": "antigravity",
|
|
766
|
+
"label": "Google Antigravity",
|
|
767
|
+
"global": "~/.antigravity/skills",
|
|
768
|
+
"project": ".antigravity/skills",
|
|
769
|
+
"enabled": false
|
|
754
770
|
}
|
|
755
771
|
],
|
|
756
772
|
"customPaths": [],
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{A as q5,B as $5,C as u2,D as Z5,a as L0,b as K0,c as n2,e as i,f as c4,g as x2,h as l4,i as a4,j as g2,k as i4,l as H,m as n4,n as T4,o as s4,p as h2,q as o4,r as r4,u as t4,v as k2,w as m,x as v2,y as e4}from"./chunk-
|
|
2
|
+
import{A as q5,B as $5,C as u2,D as Z5,a as L0,b as K0,c as n2,e as i,f as c4,g as x2,h as l4,i as a4,j as g2,k as i4,l as H,m as n4,n as T4,o as s4,p as h2,q as o4,r as r4,u as t4,v as k2,w as m,x as v2,y as e4}from"./chunk-zzvkjwrx.js";import{E as p,F as A,G as k,H as m4,I as y,J as p4,K as y2,L as S2,M as Hq,N as y4,O as W$,P as v,Q as d4}from"./chunk-etgg42ff.js";var f=A((u5)=>{var T$=Symbol.for("yaml.alias"),Z1=Symbol.for("yaml.document"),Tq=Symbol.for("yaml.map"),X1=Symbol.for("yaml.pair"),F$=Symbol.for("yaml.scalar"),Fq=Symbol.for("yaml.seq"),t=Symbol.for("yaml.node.type"),f5=(q)=>!!q&&typeof q==="object"&&q[t]===T$,y5=(q)=>!!q&&typeof q==="object"&&q[t]===Z1,x5=(q)=>!!q&&typeof q==="object"&&q[t]===Tq,g5=(q)=>!!q&&typeof q==="object"&&q[t]===X1,Q1=(q)=>!!q&&typeof q==="object"&&q[t]===F$,h5=(q)=>!!q&&typeof q==="object"&&q[t]===Fq;function U1(q){if(q&&typeof q==="object")switch(q[t]){case Tq:case Fq:return!0}return!1}function k5(q){if(q&&typeof q==="object")switch(q[t]){case T$:case Tq:case F$:case Fq:return!0}return!1}var v5=(q)=>(Q1(q)||U1(q))&&!!q.anchor;u5.ALIAS=T$;u5.DOC=Z1;u5.MAP=Tq;u5.NODE_TYPE=t;u5.PAIR=X1;u5.SCALAR=F$;u5.SEQ=Fq;u5.hasAnchor=v5;u5.isAlias=f5;u5.isCollection=U1;u5.isDocument=y5;u5.isMap=x5;u5.isNode=k5;u5.isPair=g5;u5.isScalar=Q1;u5.isSeq=h5});var u0=A((X8)=>{var h=f(),u=Symbol("break visit"),z1=Symbol("skip children"),s=Symbol("remove node");function Lq(q,$){let Z=G1($);if(h.isDocument(q)){if(M0(null,q.contents,Z,Object.freeze([q]))===s)q.contents=null}else M0(null,q,Z,Object.freeze([]))}Lq.BREAK=u;Lq.SKIP=z1;Lq.REMOVE=s;function M0(q,$,Z,X){let Q=J1(q,$,Z,X);if(h.isNode(Q)||h.isPair(Q))return Y1(q,X,Q),M0(q,Q,Z,X);if(typeof Q!=="symbol"){if(h.isCollection($)){X=Object.freeze(X.concat($));for(let U=0;U<$.items.length;++U){let z=M0(U,$.items[U],Z,X);if(typeof z==="number")U=z-1;else if(z===u)return u;else if(z===s)$.items.splice(U,1),U-=1}}else if(h.isPair($)){X=Object.freeze(X.concat($));let U=M0("key",$.key,Z,X);if(U===u)return u;else if(U===s)$.key=null;let z=M0("value",$.value,Z,X);if(z===u)return u;else if(z===s)$.value=null}}return Q}async function Kq(q,$){let Z=G1($);if(h.isDocument(q)){if(await A0(null,q.contents,Z,Object.freeze([q]))===s)q.contents=null}else await A0(null,q,Z,Object.freeze([]))}Kq.BREAK=u;Kq.SKIP=z1;Kq.REMOVE=s;async function A0(q,$,Z,X){let Q=await J1(q,$,Z,X);if(h.isNode(Q)||h.isPair(Q))return Y1(q,X,Q),A0(q,Q,Z,X);if(typeof Q!=="symbol"){if(h.isCollection($)){X=Object.freeze(X.concat($));for(let U=0;U<$.items.length;++U){let z=await A0(U,$.items[U],Z,X);if(typeof z==="number")U=z-1;else if(z===u)return u;else if(z===s)$.items.splice(U,1),U-=1}}else if(h.isPair($)){X=Object.freeze(X.concat($));let U=await A0("key",$.key,Z,X);if(U===u)return u;else if(U===s)$.key=null;let z=await A0("value",$.value,Z,X);if(z===u)return u;else if(z===s)$.value=null}}return Q}function G1(q){if(typeof q==="object"&&(q.Collection||q.Node||q.Value))return Object.assign({Alias:q.Node,Map:q.Node,Scalar:q.Node,Seq:q.Node},q.Value&&{Map:q.Value,Scalar:q.Value,Seq:q.Value},q.Collection&&{Map:q.Collection,Seq:q.Collection},q);return q}function J1(q,$,Z,X){if(typeof Z==="function")return Z(q,$,X);if(h.isMap($))return Z.Map?.(q,$,X);if(h.isSeq($))return Z.Seq?.(q,$,X);if(h.isPair($))return Z.Pair?.(q,$,X);if(h.isScalar($))return Z.Scalar?.(q,$,X);if(h.isAlias($))return Z.Alias?.(q,$,X);return}function Y1(q,$,Z){let X=$[$.length-1];if(h.isCollection(X))X.items[q]=Z;else if(h.isPair(X))if(q==="key")X.key=Z;else X.value=Z;else if(h.isDocument(X))X.contents=Z;else{let Q=h.isAlias(X)?"alias":"scalar";throw Error(`Cannot replace node with ${Q} parent`)}}X8.visit=Lq;X8.visitAsync=Kq});var L$=A((Y8)=>{var H1=f(),z8=u0(),G8={"!":"%21",",":"%2C","[":"%5B","]":"%5D","{":"%7B","}":"%7D"},J8=(q)=>q.replace(/[!,[\]{}]/g,($)=>G8[$]);class d{constructor(q,$){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},d.defaultYaml,q),this.tags=Object.assign({},d.defaultTags,$)}clone(){let q=new d(this.yaml,this.tags);return q.docStart=this.docStart,q}atDocument(){let q=new d(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:d.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},d.defaultTags);break}return q}add(q,$){if(this.atNextDocument)this.yaml={explicit:d.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},d.defaultTags),this.atNextDocument=!1;let Z=q.trim().split(/[ \t]+/),X=Z.shift();switch(X){case"%TAG":{if(Z.length!==2){if($(0,"%TAG directive should contain exactly two parts"),Z.length<2)return!1}let[Q,U]=Z;return this.tags[Q]=U,!0}case"%YAML":{if(this.yaml.explicit=!0,Z.length!==1)return $(0,"%YAML directive should contain exactly one part"),!1;let[Q]=Z;if(Q==="1.1"||Q==="1.2")return this.yaml.version=Q,!0;else{let U=/^\d+\.\d+$/.test(Q);return $(6,`Unsupported YAML version ${Q}`,U),!1}}default:return $(0,`Unknown directive ${X}`,!0),!1}}tagName(q,$){if(q==="!")return"!";if(q[0]!=="!")return $(`Not a valid tag: ${q}`),null;if(q[1]==="<"){let U=q.slice(2,-1);if(U==="!"||U==="!!")return $(`Verbatim tags aren't resolved, so ${q} is invalid.`),null;if(q[q.length-1]!==">")$("Verbatim tags must end with a >");return U}let[,Z,X]=q.match(/^(.*!)([^!]*)$/s);if(!X)$(`The ${q} tag has no suffix`);let Q=this.tags[Z];if(Q)try{return Q+decodeURIComponent(X)}catch(U){return $(String(U)),null}if(Z==="!")return q;return $(`Could not resolve tag: ${q}`),null}tagString(q){for(let[$,Z]of Object.entries(this.tags))if(q.startsWith(Z))return $+J8(q.substring(Z.length));return q[0]==="!"?q:`!<${q}>`}toString(q){let $=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],Z=Object.entries(this.tags),X;if(q&&Z.length>0&&H1.isNode(q.contents)){let Q={};z8.visit(q.contents,(U,z)=>{if(H1.isNode(z)&&z.tag)Q[z.tag]=!0}),X=Object.keys(Q)}else X=[];for(let[Q,U]of Z){if(Q==="!!"&&U==="tag:yaml.org,2002:")continue;if(!q||X.some((z)=>z.startsWith(U)))$.push(`%TAG ${Q} ${U}`)}return $.join(`
|
|
3
3
|
`)}}d.defaultYaml={explicit:!1,version:"1.2"};d.defaultTags={"!!":"tag:yaml.org,2002:"};Y8.Directives=d});var Rq=A((_8)=>{var V1=f(),V8=u0();function W8(q){if(/[\x00-\x19\s,[\]{}]/.test(q)){let Z=`Anchor must not contain whitespace or control characters: ${JSON.stringify(q)}`;throw Error(Z)}return!0}function W1(q){let $=new Set;return V8.visit(q,{Value(Z,X){if(X.anchor)$.add(X.anchor)}}),$}function B1(q,$){for(let Z=1;;++Z){let X=`${q}${Z}`;if(!$.has(X))return X}}function B8(q,$){let Z=[],X=new Map,Q=null;return{onAnchor:(U)=>{Z.push(U),Q??(Q=W1(q));let z=B1($,Q);return Q.add(z),z},setAnchors:()=>{for(let U of Z){let z=X.get(U);if(typeof z==="object"&&z.anchor&&(V1.isScalar(z.node)||V1.isCollection(z.node)))z.node.anchor=z.anchor;else{let G=Error("Failed to resolve repeated object (this should not happen)");throw G.source=U,G}}},sourceObjects:X}}_8.anchorIsValid=W8;_8.anchorNames=W1;_8.createNodeAnchors=B8;_8.findNewAnchor=B1});var K$=A((K8)=>{function m0(q,$,Z,X){if(X&&typeof X==="object")if(Array.isArray(X))for(let Q=0,U=X.length;Q<U;++Q){let z=X[Q],G=m0(q,X,String(Q),z);if(G===void 0)delete X[Q];else if(G!==z)X[Q]=G}else if(X instanceof Map)for(let Q of Array.from(X.keys())){let U=X.get(Q),z=m0(q,X,Q,U);if(z===void 0)X.delete(Q);else if(z!==U)X.set(Q,z)}else if(X instanceof Set)for(let Q of Array.from(X)){let U=m0(q,X,Q,Q);if(U===void 0)X.delete(Q);else if(U!==Q)X.delete(Q),X.add(U)}else for(let[Q,U]of Object.entries(X)){let z=m0(q,X,Q,U);if(z===void 0)delete X[Q];else if(z!==U)X[Q]=z}return q.call($,Z,X)}K8.applyReviver=m0});var $0=A((A8)=>{var M8=f();function _1(q,$,Z){if(Array.isArray(q))return q.map((X,Q)=>_1(X,String(Q),Z));if(q&&typeof q.toJSON==="function"){if(!Z||!M8.hasAnchor(q))return q.toJSON($,Z);let X={aliasCount:0,count:1,res:void 0};Z.anchors.set(q,X),Z.onCreate=(U)=>{X.res=U,delete Z.onCreate};let Q=q.toJSON($,Z);if(Z.onCreate)Z.onCreate(Q);return Q}if(typeof q==="bigint"&&!Z?.keep)return Number(q);return q}A8.toJS=_1});var Mq=A((N8)=>{var D8=K$(),O1=f(),w8=$0();class T1{constructor(q){Object.defineProperty(this,O1.NODE_TYPE,{value:q})}clone(){let q=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));if(this.range)q.range=this.range.slice();return q}toJS(q,{mapAsMap:$,maxAliasCount:Z,onAnchor:X,reviver:Q}={}){if(!O1.isDocument(q))throw TypeError("A document argument is required");let U={anchors:new Map,doc:q,keep:!0,mapAsMap:$===!0,mapKeyWarned:!1,maxAliasCount:typeof Z==="number"?Z:100},z=w8.toJS(this,"",U);if(typeof X==="function")for(let{count:G,res:J}of U.anchors.values())X(J,G);return typeof Q==="function"?D8.applyReviver(Q,{"":z},"",z):z}}N8.NodeBase=T1});var p0=A((E8)=>{var P8=Rq(),C8=u0(),I0=f(),b8=Mq(),S8=$0();class F1 extends b8.NodeBase{constructor(q){super(I0.ALIAS);this.source=q,Object.defineProperty(this,"tag",{set(){throw Error("Alias nodes cannot have tags")}})}resolve(q,$){let Z;if($?.aliasResolveCache)Z=$.aliasResolveCache;else if(Z=[],C8.visit(q,{Node:(Q,U)=>{if(I0.isAlias(U)||I0.hasAnchor(U))Z.push(U)}}),$)$.aliasResolveCache=Z;let X=void 0;for(let Q of Z){if(Q===this)break;if(Q.anchor===this.source)X=Q}return X}toJSON(q,$){if(!$)return{source:this.source};let{anchors:Z,doc:X,maxAliasCount:Q}=$,U=this.resolve(X,$);if(!U){let G=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(G)}let z=Z.get(U);if(!z)S8.toJS(U,null,$),z=Z.get(U);if(z?.res===void 0)throw ReferenceError("This should not happen: Alias anchor was not resolved?");if(Q>=0){if(z.count+=1,z.aliasCount===0)z.aliasCount=Aq(X,U,Z);if(z.count*z.aliasCount>Q)throw ReferenceError("Excessive alias count indicates a resource exhaustion attack")}return z.res}toString(q,$,Z){let X=`*${this.source}`;if(q){if(P8.anchorIsValid(this.source),q.options.verifyAliasOrder&&!q.anchors.has(this.source)){let Q=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(Q)}if(q.implicitKey)return`${X} `}return X}}function Aq(q,$,Z){if(I0.isAlias($)){let X=$.resolve(q),Q=Z&&X&&Z.get(X);return Q?Q.count*Q.aliasCount:0}else if(I0.isCollection($)){let X=0;for(let Q of $.items){let U=Aq(q,Q,Z);if(U>X)X=U}return X}else if(I0.isPair($)){let X=Aq(q,$.key,Z),Q=Aq(q,$.value,Z);return Math.max(X,Q)}return 1}E8.Alias=F1});var x=A((k8)=>{var y8=f(),x8=Mq(),g8=$0(),h8=(q)=>!q||typeof q!=="function"&&typeof q!=="object";class H0 extends x8.NodeBase{constructor(q){super(y8.SCALAR);this.value=q}toJSON(q,$){return $?.keep?this.value:g8.toJS(this.value,q,$)}toString(){return String(this.value)}}H0.BLOCK_FOLDED="BLOCK_FOLDED";H0.BLOCK_LITERAL="BLOCK_LITERAL";H0.PLAIN="PLAIN";H0.QUOTE_DOUBLE="QUOTE_DOUBLE";H0.QUOTE_SINGLE="QUOTE_SINGLE";k8.Scalar=H0;k8.isScalarValue=h8});var d0=A((l8)=>{var m8=p0(),V0=f(),L1=x(),p8="tag:yaml.org,2002:";function d8(q,$,Z){if($){let X=Z.filter((U)=>U.tag===$),Q=X.find((U)=>!U.format)??X[0];if(!Q)throw Error(`Tag ${$} not found`);return Q}return Z.find((X)=>X.identify?.(q)&&!X.format)}function c8(q,$,Z){if(V0.isDocument(q))q=q.contents;if(V0.isNode(q))return q;if(V0.isPair(q)){let V=Z.schema[V0.MAP].createNode?.(Z.schema,null,Z);return V.items.push(q),V}if(q instanceof String||q instanceof Number||q instanceof Boolean||typeof BigInt<"u"&&q instanceof BigInt)q=q.valueOf();let{aliasDuplicateObjects:X,onAnchor:Q,onTagObj:U,schema:z,sourceObjects:G}=Z,J=void 0;if(X&&q&&typeof q==="object")if(J=G.get(q),J)return J.anchor??(J.anchor=Q(q)),new m8.Alias(J.anchor);else J={anchor:null,node:null},G.set(q,J);if($?.startsWith("!!"))$=p8+$.slice(2);let Y=d8(q,$,z.tags);if(!Y){if(q&&typeof q.toJSON==="function")q=q.toJSON();if(!q||typeof q!=="object"){let V=new L1.Scalar(q);if(J)J.node=V;return V}Y=q instanceof Map?z[V0.MAP]:(Symbol.iterator in Object(q))?z[V0.SEQ]:z[V0.MAP]}if(U)U(Y),delete Z.onTagObj;let B=Y?.createNode?Y.createNode(Z.schema,q,Z):typeof Y?.nodeClass?.from==="function"?Y.nodeClass.from(Z.schema,q,Z):new L1.Scalar(q);if($)B.tag=$;else if(!Y.default)B.tag=Y.tag;if(J)J.node=B;return B}l8.createNode=c8});var Iq=A((s8)=>{var i8=d0(),o=f(),n8=Mq();function R$(q,$,Z){let X=Z;for(let Q=$.length-1;Q>=0;--Q){let U=$[Q];if(typeof U==="number"&&Number.isInteger(U)&&U>=0){let z=[];z[U]=X,X=z}else X=new Map([[U,X]])}return i8.createNode(X,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error("This should not happen, please report a bug.")},schema:q,sourceObjects:new Map})}var K1=(q)=>q==null||typeof q==="object"&&!!q[Symbol.iterator]().next().done;class R1 extends n8.NodeBase{constructor(q,$){super(q);Object.defineProperty(this,"schema",{value:$,configurable:!0,enumerable:!1,writable:!0})}clone(q){let $=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));if(q)$.schema=q;if($.items=$.items.map((Z)=>o.isNode(Z)||o.isPair(Z)?Z.clone(q):Z),this.range)$.range=this.range.slice();return $}addIn(q,$){if(K1(q))this.add($);else{let[Z,...X]=q,Q=this.get(Z,!0);if(o.isCollection(Q))Q.addIn(X,$);else if(Q===void 0&&this.schema)this.set(Z,R$(this.schema,X,$));else throw Error(`Expected YAML collection at ${Z}. Remaining path: ${X}`)}}deleteIn(q){let[$,...Z]=q;if(Z.length===0)return this.delete($);let X=this.get($,!0);if(o.isCollection(X))return X.deleteIn(Z);else throw Error(`Expected YAML collection at ${$}. Remaining path: ${Z}`)}getIn(q,$){let[Z,...X]=q,Q=this.get(Z,!0);if(X.length===0)return!$&&o.isScalar(Q)?Q.value:Q;else return o.isCollection(Q)?Q.getIn(X,$):void 0}hasAllNullValues(q){return this.items.every(($)=>{if(!o.isPair($))return!1;let Z=$.value;return Z==null||q&&o.isScalar(Z)&&Z.value==null&&!Z.commentBefore&&!Z.comment&&!Z.tag})}hasIn(q){let[$,...Z]=q;if(Z.length===0)return this.has($);let X=this.get($,!0);return o.isCollection(X)?X.hasIn(Z):!1}setIn(q,$){let[Z,...X]=q;if(X.length===0)this.set(Z,$);else{let Q=this.get(Z,!0);if(o.isCollection(Q))Q.setIn(X,$);else if(Q===void 0&&this.schema)this.set(Z,R$(this.schema,X,$));else throw Error(`Expected YAML collection at ${Z}. Remaining path: ${X}`)}}}s8.Collection=R1;s8.collectionFromPath=R$;s8.isEmptyPath=K1});var c0=A(($Z)=>{var e8=(q)=>q.replace(/^(?!$)(?: $)?/gm,"#");function M$(q,$){if(/^\n+$/.test(q))return q.substring(1);return $?q.replace(/^(?! *$)/gm,$):q}var qZ=(q,$,Z)=>q.endsWith(`
|
|
4
4
|
`)?M$(Z,$):Z.includes(`
|
|
5
5
|
`)?`
|
|
@@ -447,7 +447,7 @@ ${H.bold("Options:")}
|
|
|
447
447
|
${H.bold("Examples:")}
|
|
448
448
|
asm init my-skill ${H.dim("Scaffold (interactive tool)")}
|
|
449
449
|
asm init my-skill -p claude ${H.dim("Scaffold in Claude Code")}
|
|
450
|
-
asm init my-skill --path ./skills ${H.dim("Scaffold in custom directory")}`)}async function qJ(q){if(q.flags.help){eG();return}let $=q.subcommand;if(!$)E("Missing required argument: <name>"),console.error('Run "asm init --help" for usage.'),process.exit(2);let Z=h0($),X;if(q.flags.path){let{resolve:Q}=await import("path");X=Q(q.flags.path)}else{let Q=await v(),{provider:U}=await Oq(Q,q.flags.provider,!!process.stdin.isTTY),{join:z}=await import("path"),{resolveProviderPath:G}=await import("./chunk-
|
|
450
|
+
asm init my-skill --path ./skills ${H.dim("Scaffold in custom directory")}`)}async function qJ(q){if(q.flags.help){eG();return}let $=q.subcommand;if(!$)E("Missing required argument: <name>"),console.error('Run "asm init --help" for usage.'),process.exit(2);let Z=h0($),X;if(q.flags.path){let{resolve:Q}=await import("path");X=Q(q.flags.path)}else{let Q=await v(),{provider:U}=await Oq(Q,q.flags.provider,!!process.stdin.isTTY),{join:z}=await import("path"),{resolveProviderPath:G}=await import("./chunk-etgg42ff.js"),J=G(Q.providers.find((Y)=>Y.name===U.name).global);X=z(J,Z)}if(await _4(X)){if(!q.flags.force){if(!process.stdin.isTTY)E(`Directory already exists: ${X}. Use --force to overwrite.`),process.exit(2);process.stderr.write(`${H.yellow(`Directory already exists: ${X}`)}
|
|
451
451
|
${H.bold("Overwrite?")} [y/N] `);let Q=await f0();if(Q.toLowerCase()!=="y"&&Q.toLowerCase()!=="yes")console.error("Aborted."),process.exit(0)}}await B4(Z,X),console.error(H.green(`Done! Created skill "${Z}" at ${X}`))}function $J(){console.log(`${H.bold("Usage:")} asm stats [options]
|
|
452
452
|
|
|
453
453
|
Show aggregate skill metrics with provider distribution charts,
|
|
@@ -478,7 +478,7 @@ ${H.bold("Options:")}
|
|
|
478
478
|
${H.bold("Examples:")}
|
|
479
479
|
asm link ./my-skill ${H.dim("Link (interactive tool)")}
|
|
480
480
|
asm link ./my-skill -p claude ${H.dim("Link to Claude Code")}
|
|
481
|
-
asm link ./my-skill --name alias ${H.dim("Link with custom name")}`)}async function QJ(q){if(q.flags.help){XJ();return}let $=q.subcommand;if(!$)E("Missing required argument: <path>"),console.error('Run "asm link --help" for usage.'),process.exit(2);let{resolve:Z,basename:X}=await import("path"),Q=Z($),U=await R4(Q),z=q.flags.name?h0(q.flags.name):X(Q),G=await v(),{provider:J}=await Oq(G,q.flags.provider,!!process.stdin.isTTY),{resolveProviderPath:Y}=await import("./chunk-
|
|
481
|
+
asm link ./my-skill --name alias ${H.dim("Link with custom name")}`)}async function QJ(q){if(q.flags.help){XJ();return}let $=q.subcommand;if(!$)E("Missing required argument: <path>"),console.error('Run "asm link --help" for usage.'),process.exit(2);let{resolve:Z,basename:X}=await import("path"),Q=Z($),U=await R4(Q),z=q.flags.name?h0(q.flags.name):X(Q),G=await v(),{provider:J}=await Oq(G,q.flags.provider,!!process.stdin.isTTY),{resolveProviderPath:Y}=await import("./chunk-etgg42ff.js"),B=Y(G.providers.find((O)=>O.name===J.name).global),{join:V}=await import("path"),W=V(B,z);if(!q.flags.force){let O=!1;try{let{access:F}=await import("fs/promises");await F(W),O=!0}catch{}if(O){if(!process.stdin.isTTY)E(`Target already exists: ${W}. Use --force to overwrite.`),process.exit(2);process.stderr.write(`${H.yellow(`Target already exists: ${W}`)}
|
|
482
482
|
${H.bold("Overwrite?")} [y/N] `);let F=await f0();if(F.toLowerCase()!=="y"&&F.toLowerCase()!=="yes")console.error("Aborted."),process.exit(0);await X$(Q,B,z,!0)}else await X$(Q,B,z,!1)}else await X$(Q,B,z,!0);if(q.flags.json)console.log(m({success:!0,name:z,symlinkPath:W,targetPath:Q}));else console.error(H.green(`Done! Linked "${z}" -> ${Q}`)),console.error(` Symlink: ${W}`),console.error(H.dim(` If you move or delete the source, run "asm uninstall ${z}" to clean up.`))}function UJ(){console.log(`${H.bold("Usage:")} asm index <subcommand> [options]
|
|
483
483
|
|
|
484
484
|
Manage the skill index for searching available skills from indexed repos.
|
|
@@ -509,4 +509,4 @@ ${H.bold("Examples:")}
|
|
|
509
509
|
`));for(let Q of Z)console.error(`${H.cyan(`${Q.owner}/${Q.repo}`)} - ${Q.skillCount} skills ${H.dim(`(${new Date(Q.updatedAt).toLocaleDateString()})`)}`)}break}case"remove":{let Z=q.positional[0];if(!Z)E("Missing required argument: <owner/repo>"),console.error('Run "asm index --help" for usage.'),process.exit(2);let[X,Q]=Z.split("/");if(!X||!Q)E("Invalid format. Use: <owner/repo>"),process.exit(2);if(!q.flags.yes&&process.stdin.isTTY){process.stderr.write(`${H.bold("Remove")} ${H.cyan(`${X}/${Q}`)} ${H.bold("from index?")} [y/N] `);let z=await f0();if(z.toLowerCase()!=="y"&&z.toLowerCase()!=="yes")console.error("Aborted."),process.exit(0)}if(await u4(X,Q))console.error(H.green(`Removed ${X}/${Q} from index`));else E(`Repository not found in index: ${X}/${Q}`),process.exit(1);break}default:E(`Unknown subcommand: "${$}"`),console.error('Run "asm index --help" for usage.'),process.exit(2)}}async function Q5(q){let $=PG(q);if($.flags.noColor)globalThis.__CLI_NO_COLOR=!0;if($.flags.verbose)m4(!0);if($.flags.version){console.log(`asm ${u2}`);return}if(!$.command&&$.flags.help){CG();return}if(!$.command)return;switch($.command){case"list":await gG($);break;case"search":await hG($);break;case"inspect":await kG($);break;case"uninstall":await vG($);break;case"audit":await uG($);break;case"install":await oG($);break;case"config":await lG($);break;case"export":await tG($);break;case"init":await qJ($);break;case"stats":await ZJ($);break;case"link":await QJ($);break;case"index":await zJ($);break;default:E(`Unknown command: "${$.command}"`),console.error('Run "asm --help" for usage.'),process.exit(2)}}function U5(q){let $=q.slice(2);if($.length===0)return!1;let Z=["list","search","inspect","uninstall","audit","config","install","export","init","stats","link","index"],X=$[0];if(Z.includes(X))return!0;if(X==="--help"||X==="-h")return!0;if(X==="--version"||X==="-v")return!0;if(X.startsWith("-")||X.length>0)return!0;return!1}if(U5(process.argv))await Q5(process.argv);else if(!(typeof globalThis.Bun<"u")){let{spawn:$}=await import("child_process"),Z=$("bun",[process.argv[1],...process.argv.slice(2)],{stdio:"inherit"});Z.on("error",()=>{console.error(`The interactive TUI requires Bun (https://bun.sh).
|
|
510
510
|
Install it with: curl -fsSL https://bun.sh/install | bash
|
|
511
511
|
|
|
512
|
-
`+"CLI commands (list, search, inspect, etc.) work with Node.js — run: asm --help"),process.exit(1)}),Z.on("exit",(X)=>process.exit(X??0))}else await import("./chunk-
|
|
512
|
+
`+"CLI commands (list, search, inspect, etc.) work with Node.js — run: asm --help"),process.exit(1)}),Z.on("exit",(X)=>process.exit(X??0))}else await import("./chunk-6t9cpddh.js");
|