@mhmdreza-rafiei/agentry 0.1.0 → 0.2.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 +205 -41
- package/dist/_chunks/source_parser.mjs +2 -0
- package/dist/_chunks/source_parser2.mjs +74 -0
- package/dist/_chunks/theme.mjs +2 -0
- package/dist/_chunks/theme2.mjs +123 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +1687 -0
- package/package.json +30 -11
- package/bin/agentry.js +0 -257
- package/examples/agents/frontend/frontend-developer/AGENT.md +0 -17
- package/examples/agents/frontend/frontend-developer/agentry.json +0 -5
- package/examples/rules/workflow/ask-dont-guess/RULE.md +0 -15
- package/examples/rules/workflow/ask-dont-guess/agentry.json +0 -5
- package/examples/scripts/env/doctor/agentry.json +0 -5
- package/examples/scripts/env/doctor/run.sh +0 -4
- package/examples/skills/prompt/enhance-prompt/SKILL.md +0 -186
- package/examples/skills/prompt/enhance-prompt/references/TEMPLATE.md +0 -182
- package/profile/backend.json +0 -5
- package/profile/frontend.json +0 -5
- package/src/commands.js +0 -64
- package/src/profile.js +0 -21
- package/src/registry.js +0 -145
- package/src/source.js +0 -52
package/README.md
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
<img src="docs/agentry-logo.png" alt="agentry" width="800" />
|
|
4
|
+
|
|
5
|
+
**A raw installer for AI agent tooling.**
|
|
6
|
+
|
|
7
|
+
`agentry` fetches **agents, skills, rules, scripts, and profiles** from any Git repo (or local path) and installs the ones you pick into your project — or globally — under each target provider's directory (`.cursor/`, `.claude/skills/`, `.agents/skills/`, …). The CLI ships no assets of its own; you point it at a source.
|
|
8
|
+
|
|
9
|
+
It mirrors the clean Clack-style UX of [`vercel-labs/skills`](https://github.com/vercel-labs/skills) and extends it beyond skills-only. Supports **70+ agent providers**.
|
|
10
|
+
|
|
11
|
+
[](https://www.npmjs.com/package/@mhmdreza-rafiei/agentry)
|
|
12
|
+
[](#license)
|
|
13
|
+
[](#development--test)
|
|
14
|
+
[](https://github.com/mhmdreza-rafiei/agentry)
|
|
15
|
+
|
|
16
|
+
⭐ If agentry saves you time, [star the repo](https://github.com/mhmdreza-rafiei/agentry) — it helps others find it.
|
|
17
|
+
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
---
|
|
4
21
|
|
|
5
22
|
## Install / run
|
|
6
23
|
|
|
@@ -13,82 +30,229 @@ npm install -g agentry@latest
|
|
|
13
30
|
|
|
14
31
|
# Update / uninstall the CLI
|
|
15
32
|
agentry update
|
|
16
|
-
agentry
|
|
33
|
+
agentry uninstall
|
|
17
34
|
```
|
|
18
35
|
|
|
19
|
-
> Publishing to npm is pending. Until then, run from a clone: `node
|
|
36
|
+
> Publishing to npm is pending. Until then, run from a clone: `node dist/cli.mjs …` (after `npm run build`) or `npm run dev -- …`.
|
|
20
37
|
|
|
21
38
|
## Usage
|
|
22
39
|
|
|
23
40
|
```
|
|
24
|
-
agentry add <
|
|
41
|
+
agentry add <kind> <source> [category/name | category] [options]
|
|
25
42
|
agentry add profile <name> [source] [options]
|
|
26
|
-
agentry remove <
|
|
27
|
-
agentry list
|
|
28
|
-
agentry update
|
|
43
|
+
agentry remove <kind> [category/name | category] [options]
|
|
44
|
+
agentry list [source] [kind]
|
|
45
|
+
agentry update [kind] [source] [selector]
|
|
46
|
+
agentry uninstall
|
|
29
47
|
```
|
|
30
48
|
|
|
31
|
-
`<source>` is a GitHub shorthand `author/repo`, a full git URL, or a local path.
|
|
49
|
+
`<kind>` is `skill | rule | agent | profile | script` (singular; plurals like `skills` are accepted and normalized). `<source>` is a GitHub shorthand `author/repo`, a full GitHub URL, a GitHub tree subdir URL, a GitLab URL, any git URL, or a local path.
|
|
32
50
|
|
|
33
51
|
```bash
|
|
34
52
|
agentry add skills Prat011/awesome-llm-skills # list all skills and pick
|
|
35
|
-
agentry add skills Prat011/awesome-llm-skills video-downloader
|
|
53
|
+
agentry add skills Prat011/awesome-llm-skills video-downloader # one skill (no category)
|
|
36
54
|
agentry add skills Prat011/awesome-llm-skills document-skills/docx # one skill (category/name)
|
|
37
|
-
agentry add
|
|
38
|
-
agentry add
|
|
39
|
-
agentry
|
|
40
|
-
agentry
|
|
55
|
+
agentry add skills ./my-skills --list # preview only, no install
|
|
56
|
+
agentry add skills ./my-skills prompt/enhance-prompt -a cursor -a claude-code # install to 2 providers
|
|
57
|
+
agentry add agents author/repo frontend-developer # one agent (.mdc file)
|
|
58
|
+
agentry add rules author/repo ask-dont-guess # one rule (.mdc file)
|
|
59
|
+
agentry add scripts author/repo lint # one script (usecase folder)
|
|
60
|
+
agentry add profile frontend author/repo # apply profile/frontend.yaml
|
|
61
|
+
agentry remove skills document-skills/docx # remove an installed artifact
|
|
62
|
+
agentry list author/repo
|
|
63
|
+
agentry update # self-update (checks version first)
|
|
64
|
+
agentry update skills author/repo prompt/enhance-prompt # re-install one artifact from source
|
|
65
|
+
agentry update skills # re-install all skills from lockfile sources
|
|
66
|
+
agentry uninstall # remove the CLI
|
|
41
67
|
```
|
|
42
68
|
|
|
43
|
-
Flags: `-g, --global` (into
|
|
69
|
+
Flags: `-g, --global` (into `~`), `--project` (current folder, default), `--dir <path>`, `-a, --agent <name>` (repeatable; `*` for all; default: prompt to choose), `-l, --list` (preview, no install), `--copy` (copy files instead of symlinking), `--all` (install everything to all agents, no prompts), `-y, --yes` (no prompts), `-v, --version`, `-h, --help`.
|
|
44
70
|
|
|
45
|
-
When
|
|
71
|
+
When you run `agentry add` without `--agent`, it shows a **fetch animation** (parsing source → discovering → found N), lets you **pick artifacts** (with an `All` toggle), then prompts **"Which agents do you want to install to?"** — universal providers (`.agents/skills`) are locked in and others are selectable, defaulting to the providers you already have installed. The interactive UI (animated robot logo, spinners, prompts) is suppressed automatically when running inside an agent or CI; non-interactive runs default to the current project and auto-detected providers.
|
|
46
72
|
|
|
47
73
|
## How sources are discovered
|
|
48
74
|
|
|
49
|
-
For each
|
|
75
|
+
For each kind, `agentry` finds artifacts in two ways and merges them:
|
|
50
76
|
|
|
51
|
-
1. Under an explicit folder
|
|
52
|
-
2. At the repo root by marker
|
|
77
|
+
1. Under an explicit `<kind>s/` folder (see artifact layouts below).
|
|
78
|
+
2. At the repo root by marker — a folder with `SKILL.md` is a skill; a `.mdc` file at root is an agent or rule. (Scripts and profiles are folder/file kinds found only under their `scripts/` and `profiles/` folders.)
|
|
53
79
|
|
|
54
|
-
Selectors after the source: `category/name` (one
|
|
80
|
+
Selectors after the source: `category/name` (one artifact), `name` (one artifact when uncategorized), `category` (whole category), or omit to list-and-pick.
|
|
55
81
|
|
|
56
|
-
|
|
82
|
+
Artifacts install to the provider's directory and are tracked in `.agentry/lock.json` for idempotent installs and clean removal. `remove` works purely on installed files, so it needs no source.
|
|
57
83
|
|
|
58
|
-
##
|
|
84
|
+
## Artifact layouts (how to create installable tools)
|
|
85
|
+
|
|
86
|
+
Create artifacts in your repo using these layouts, then `agentry add` from your repo:
|
|
59
87
|
|
|
60
|
-
|
|
88
|
+
### Skills — folder per skill
|
|
61
89
|
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
90
|
+
```
|
|
91
|
+
skills/
|
|
92
|
+
enhance-prompt/
|
|
93
|
+
SKILL.md # YAML frontmatter: name, description
|
|
94
|
+
references/
|
|
95
|
+
TEMPLATE.md # optional supporting docs
|
|
96
|
+
...
|
|
69
97
|
```
|
|
70
98
|
|
|
71
|
-
`
|
|
99
|
+
`SKILL.md` frontmatter:
|
|
72
100
|
|
|
73
|
-
|
|
101
|
+
```yaml
|
|
102
|
+
---
|
|
103
|
+
name: enhance-prompt
|
|
104
|
+
description: Rewrite a user message into a precise, portable agent prompt.
|
|
105
|
+
---
|
|
106
|
+
# enhance-prompt
|
|
107
|
+
Instructions for the agent...
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Categorized skills: `skills/<category>/<name>/SKILL.md`.
|
|
111
|
+
|
|
112
|
+
### Agents — single `.mdc` file
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
agents/
|
|
116
|
+
frontend-developer.mdc
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`.mdc` frontmatter (same shape as skills):
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
---
|
|
123
|
+
name: frontend-developer
|
|
124
|
+
description: Senior frontend engineer agent.
|
|
125
|
+
---
|
|
126
|
+
# frontend-developer
|
|
127
|
+
Agent instructions...
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Categorized agents: `agents/<category>/<name>.mdc`.
|
|
131
|
+
|
|
132
|
+
### Rules — single `.mdc` file
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
rules/
|
|
136
|
+
ask-dont-guess.mdc
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Same frontmatter and body shape as agents. Categorized rules: `rules/<category>/<name>.mdc`.
|
|
140
|
+
|
|
141
|
+
### Scripts — folder per use case
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
scripts/
|
|
145
|
+
lint/
|
|
146
|
+
run.js # entrypoint (any language; a folder with files = one script)
|
|
147
|
+
README.md # optional docs
|
|
148
|
+
format/
|
|
149
|
+
run.js
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
A script is a **folder** containing its files (entrypoint, helpers, docs). Categorized scripts: `scripts/<category>/<usecase>/`.
|
|
153
|
+
|
|
154
|
+
### Profiles — single `.yaml` file (in a source repo)
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
profiles/
|
|
158
|
+
frontend.yaml
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
A profile bundles artifact selectors + target agents + scope into one config. See the **Profiles** section below for the schema. Categorized profiles: `profiles/<category>/<name>.yaml`.
|
|
162
|
+
|
|
163
|
+
## How to install tools with agentry
|
|
74
164
|
|
|
75
165
|
```bash
|
|
76
|
-
#
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
#
|
|
80
|
-
|
|
166
|
+
# From a GitHub repo (author/repo shorthand)
|
|
167
|
+
agentry add skills Prat011/awesome-llm-skills
|
|
168
|
+
|
|
169
|
+
# From a full GitHub URL
|
|
170
|
+
agentry add skills https://github.com/Prat011/awesome-llm-skills
|
|
171
|
+
|
|
172
|
+
# From a subdirectory of a repo (GitHub tree URL)
|
|
173
|
+
agentry add skills https://github.com/vercel-labs/agent-skills/tree/main/skills/web-design
|
|
174
|
+
|
|
175
|
+
# From a GitLab URL
|
|
176
|
+
agentry add skills https://gitlab.com/org/repo
|
|
177
|
+
|
|
178
|
+
# From any git URL
|
|
179
|
+
agentry add skills git@github.com:owner/repo.git
|
|
180
|
+
|
|
181
|
+
# From a local path
|
|
182
|
+
agentry add skills ./my-skills
|
|
183
|
+
|
|
184
|
+
# Install to specific providers
|
|
185
|
+
agentry add skills ./my-skills enhance-prompt --agent cursor --agent claude-code
|
|
186
|
+
|
|
187
|
+
# Install to all providers
|
|
188
|
+
agentry add skills ./my-skills enhance-prompt --agent '*'
|
|
189
|
+
|
|
190
|
+
# Preview without installing
|
|
191
|
+
agentry add skills ./my-skills --list
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Supported providers
|
|
195
|
+
|
|
196
|
+
`agentry` installs into 70+ agent providers, mirroring vercel-labs/skills. Each provider has a project skills directory and a global one. A few common ones:
|
|
197
|
+
|
|
198
|
+
| Provider | `--agent` | Project path | Global path |
|
|
199
|
+
| -------------- | ---------------- | ------------------- | ----------------------------- |
|
|
200
|
+
| Cursor | `cursor` | `.agents/skills/` | `~/.cursor/skills/` |
|
|
201
|
+
| Claude Code | `claude-code` | `.claude/skills/` | `~/.claude/skills/` |
|
|
202
|
+
| Codex | `codex` | `.agents/skills/` | `~/.codex/skills/` |
|
|
203
|
+
| OpenCode | `opencode` | `.agents/skills/` | `~/.config/opencode/skills/` |
|
|
204
|
+
| Gemini CLI | `gemini-cli` | `.agents/skills/` | `~/.gemini/skills/` |
|
|
205
|
+
| Windsurf | `windsurf` | `.windsurf/skills/` | `~/.codeium/windsurf/skills/` |
|
|
206
|
+
| Cline | `cline` | `.agents/skills/` | `~/.agents/skills/` |
|
|
207
|
+
| Amp | `amp` | `.agents/skills/` | `~/.config/agents/skills/` |
|
|
208
|
+
| Goose | `goose` | `.goose/skills/` | `~/.config/goose/skills/` |
|
|
209
|
+
| Roo Code | `roo` | `.roo/skills/` | `~/.roo/skills/` |
|
|
210
|
+
| GitHub Copilot | `github-copilot` | `.agents/skills/` | `~/.copilot/skills/` |
|
|
211
|
+
| Augment | `augment` | `.augment/skills/` | `~/.augment/skills/` |
|
|
212
|
+
| Continue | `continue` | `.continue/skills/` | `~/.continue/skills/` |
|
|
213
|
+
| Zed | `zed` | `.agents/skills/` | `~/.agents/skills/` |
|
|
214
|
+
| Warp | `warp` | `.agents/skills/` | `~/.agents/skills/` |
|
|
215
|
+
|
|
216
|
+
...and 55+ more. The CLI auto-detects installed providers; pass `--agent` to target specific ones or `--agent '*'` for all.
|
|
217
|
+
|
|
218
|
+
### Universal install (`.agents/skills`)
|
|
219
|
+
|
|
220
|
+
Providers whose skills directory is `.agents/skills/` (Cursor, Codex, OpenCode, Gemini CLI, Cline, Amp, Zed, Warp, GitHub Copilot, …) are **universal**: a skill is installed **once** to `.agents/skills/<id>` and every universal provider reads it from there. Non-universal providers (Claude Code, Windsurf, Goose, Roo, Augment, Continue, …) get a **symlink** from their own skills directory to the canonical `.agents/skills/<id>` copy, so a single install reaches all of them with no duplication. Use `--copy` to make independent copies instead of symlinks.
|
|
221
|
+
|
|
222
|
+
## Profiles
|
|
223
|
+
|
|
224
|
+
A profile is a YAML file at `profile/<name>.yaml` in your project. It bundles artifact selectors, target agents, and scope; `agentry add profile <name> <source>` fetches the source once and installs everything the profile lists.
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
name: frontend
|
|
228
|
+
description: Frontend agents, rules, and skills
|
|
229
|
+
scope: project # project | global
|
|
230
|
+
targets:
|
|
231
|
+
agents: [cursor, claude-code] # target providers; '*' = all
|
|
232
|
+
artifacts:
|
|
233
|
+
skills:
|
|
234
|
+
- id: prompt/enhance-prompt
|
|
235
|
+
agents:
|
|
236
|
+
- id: frontend-developer
|
|
237
|
+
rules:
|
|
238
|
+
- id: ask-dont-guess
|
|
239
|
+
scripts:
|
|
240
|
+
- id: lint
|
|
81
241
|
```
|
|
82
242
|
|
|
243
|
+
Each artifact ref may override the CLI source with its own `source:`. The command-line `<source>` is the default for refs without one.
|
|
244
|
+
|
|
83
245
|
## Development / test
|
|
84
246
|
|
|
85
247
|
```bash
|
|
86
|
-
npm
|
|
87
|
-
|
|
88
|
-
|
|
248
|
+
npm run typecheck # tsc --noEmit
|
|
249
|
+
npm test # vitest (discovery, source parser, agents registry, install/remove, profiles)
|
|
250
|
+
npm run build # obuild -> dist/cli.mjs
|
|
251
|
+
npm run dev -- … # run via tsx (no build needed)
|
|
252
|
+
node dist/cli.mjs … # run the built CLI
|
|
89
253
|
```
|
|
90
254
|
|
|
91
|
-
`
|
|
255
|
+
`src/` holds the logic: `cli.ts` (router), `commands.ts` (handlers), `core/` (types, source-parser, git, lock), `registry/agents.ts` (70+ providers), `artifacts/` (discovery, profiles), `ui/` (theme, prompts, detect). Runtime deps are minimal and UI libs are bundled by `obuild`.
|
|
92
256
|
|
|
93
257
|
## License
|
|
94
258
|
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
function isLocalPath(source) {
|
|
5
|
+
if (!source) return false;
|
|
6
|
+
if (source === "." || source === "..") return true;
|
|
7
|
+
if (source.startsWith("./") || source.startsWith("../") || source.startsWith("/") || source.startsWith("~")) return true;
|
|
8
|
+
try {
|
|
9
|
+
return existsSync(source) && statSync(source).isDirectory();
|
|
10
|
+
} catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function parseGithubTreeUrl(url) {
|
|
15
|
+
const m = url.match(/^https?:\/\/github\.com\/([\w.-]+\/[\w.-]+?)\/tree\/([^/]+)\/(.+)$/);
|
|
16
|
+
if (!m) return null;
|
|
17
|
+
return {
|
|
18
|
+
ownerRepo: m[1],
|
|
19
|
+
ref: m[2],
|
|
20
|
+
subpath: m[3].replace(/\/+$/, "")
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function parseSource(source) {
|
|
24
|
+
if (!source || typeof source !== "string") throw new Error("Empty source.");
|
|
25
|
+
const raw = source;
|
|
26
|
+
if (isLocalPath(source)) return {
|
|
27
|
+
kind: "local",
|
|
28
|
+
raw,
|
|
29
|
+
url: null,
|
|
30
|
+
subpath: "",
|
|
31
|
+
local: resolve(source.replace(/^~/, homedir()))
|
|
32
|
+
};
|
|
33
|
+
const tree = parseGithubTreeUrl(source);
|
|
34
|
+
if (tree) return {
|
|
35
|
+
kind: "github-url",
|
|
36
|
+
raw,
|
|
37
|
+
url: `https://github.com/${tree.ownerRepo}.git`,
|
|
38
|
+
subpath: tree.subpath,
|
|
39
|
+
ref: tree.ref,
|
|
40
|
+
local: null
|
|
41
|
+
};
|
|
42
|
+
let m = source.match(/^https?:\/\/github\.com\/([\w.-]+\/[\w.-]+?)(?:\.git)?\/?$/);
|
|
43
|
+
if (m) return {
|
|
44
|
+
kind: "github-url",
|
|
45
|
+
raw,
|
|
46
|
+
url: `https://github.com/${m[1]}.git`,
|
|
47
|
+
subpath: "",
|
|
48
|
+
local: null
|
|
49
|
+
};
|
|
50
|
+
m = source.match(/^https?:\/\/gitlab\.com\/([\w./-]+?)(?:\.git)?\/?$/);
|
|
51
|
+
if (m) return {
|
|
52
|
+
kind: "gitlab-url",
|
|
53
|
+
raw,
|
|
54
|
+
url: `https://gitlab.com/${m[1]}.git`,
|
|
55
|
+
subpath: "",
|
|
56
|
+
local: null
|
|
57
|
+
};
|
|
58
|
+
if (source.startsWith("git@") || /^https?:\/\/.*\.git$/.test(source)) return {
|
|
59
|
+
kind: "git-url",
|
|
60
|
+
raw,
|
|
61
|
+
url: source,
|
|
62
|
+
subpath: "",
|
|
63
|
+
local: null
|
|
64
|
+
};
|
|
65
|
+
if (/^[\w.-]+\/[\w.-]+$/.test(source)) return {
|
|
66
|
+
kind: "github-shorthand",
|
|
67
|
+
raw,
|
|
68
|
+
url: `https://github.com/${source}.git`,
|
|
69
|
+
subpath: "",
|
|
70
|
+
local: null
|
|
71
|
+
};
|
|
72
|
+
throw new Error(`Cannot parse source "${source}". Use author/repo, a GitHub/GitLab URL, a git URL, or a local path.`);
|
|
73
|
+
}
|
|
74
|
+
export { isLocalPath, parseSource };
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import c from "picocolors";
|
|
2
|
+
const PALETTE = {
|
|
3
|
+
primary: c.blue,
|
|
4
|
+
success: c.green,
|
|
5
|
+
error: c.red,
|
|
6
|
+
warn: c.yellow,
|
|
7
|
+
info: c.blue,
|
|
8
|
+
dim: c.dim,
|
|
9
|
+
bold: c.bold,
|
|
10
|
+
text: c.white
|
|
11
|
+
};
|
|
12
|
+
const theme = PALETTE;
|
|
13
|
+
c.blue(process.stdout.isTTY ? "✓" : "v"), c.red(process.stdout.isTTY ? "✗" : "x"), c.yellow(process.stdout.isTTY ? "⚠" : "!"), c.blue(process.stdout.isTTY ? "ℹ" : "i"), process.stdout.isTTY, process.stdout.isTTY, process.stdout.isTTY;
|
|
14
|
+
const RESET = "\x1B[0m";
|
|
15
|
+
const GRAYS = [
|
|
16
|
+
"\x1B[38;5;255m",
|
|
17
|
+
"\x1B[38;5;252m",
|
|
18
|
+
"\x1B[38;5;249m",
|
|
19
|
+
"\x1B[38;5;246m",
|
|
20
|
+
"\x1B[38;5;243m",
|
|
21
|
+
"\x1B[38;5;240m"
|
|
22
|
+
];
|
|
23
|
+
function gradLine(line) {
|
|
24
|
+
const n = line.length || 1;
|
|
25
|
+
let out = "";
|
|
26
|
+
for (let i = 0; i < line.length; i++) {
|
|
27
|
+
const g = GRAYS[Math.min(GRAYS.length - 1, Math.floor(i / n * GRAYS.length))];
|
|
28
|
+
out += `${g}${line[i]}${RESET}`;
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
const LOGO_LINES = [
|
|
33
|
+
" █████╗ ██████╗ ███████╗███╗ ██╗████████╗██████╗ ██╗ ██╗",
|
|
34
|
+
"██╔══██╗██╔════╝ ██╔════╝████╗ ██║╚══██╔══╝██╔══██╗╚██╗ ██╔╝",
|
|
35
|
+
"███████║██║ ███╗█████╗ ██╔██╗ ██║ ██║ ██████╔╝ ╚████╔╝ ",
|
|
36
|
+
"██╔══██║██║ ██║██╔══╝ ██║╚██╗██║ ██║ ██╔══██╗ ╚██╔╝ ",
|
|
37
|
+
"██║ ██║╚██████╔╝███████╗██║ ╚████║ ██║ ██║ ██║ ██║ ",
|
|
38
|
+
"╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ "
|
|
39
|
+
];
|
|
40
|
+
function logo() {
|
|
41
|
+
return LOGO_LINES.map((line) => gradLine(line)).join("\n");
|
|
42
|
+
}
|
|
43
|
+
function tagline() {
|
|
44
|
+
return c.dim(" Install agents, skills, rules & profiles");
|
|
45
|
+
}
|
|
46
|
+
function badge() {
|
|
47
|
+
return c.bgBlue(c.white(c.bold(" Agentry ")));
|
|
48
|
+
}
|
|
49
|
+
function delay(ms) {
|
|
50
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
51
|
+
}
|
|
52
|
+
async function animateLogo() {
|
|
53
|
+
process.stdout.write("\n" + logo() + "\n");
|
|
54
|
+
process.stdout.write(tagline() + "\n\n");
|
|
55
|
+
if (process.stdout.isTTY) await delay(280);
|
|
56
|
+
}
|
|
57
|
+
function h(title) {
|
|
58
|
+
return c.bold(c.blue(title));
|
|
59
|
+
}
|
|
60
|
+
function cmd(s) {
|
|
61
|
+
return c.cyan(s);
|
|
62
|
+
}
|
|
63
|
+
function flag(s) {
|
|
64
|
+
return c.blue(s);
|
|
65
|
+
}
|
|
66
|
+
function dim(s) {
|
|
67
|
+
return c.dim(s);
|
|
68
|
+
}
|
|
69
|
+
function bullet(s) {
|
|
70
|
+
return ` ${c.blue("•")} ${s}`;
|
|
71
|
+
}
|
|
72
|
+
function printHelp() {
|
|
73
|
+
const lines = [
|
|
74
|
+
"",
|
|
75
|
+
`${badge()} ${dim("install agents, skills, rules, scripts & profiles")}`,
|
|
76
|
+
"",
|
|
77
|
+
h("Usage"),
|
|
78
|
+
` ${cmd("agentry")} ${flag("add")} ${dim("<kind> <source> [selector] [options]")}`,
|
|
79
|
+
` ${cmd("agentry")} ${flag("add")} ${dim("profile <name> [source] [options]")}`,
|
|
80
|
+
` ${cmd("agentry")} ${flag("remove")} ${dim("<kind> [selector] [options]")}`,
|
|
81
|
+
` ${cmd("agentry")} ${flag("list")} ${dim("[source] [kind]")}`,
|
|
82
|
+
` ${cmd("agentry")} ${flag("update")} ${dim("[kind] [source] [selector]")}`,
|
|
83
|
+
` ${cmd("agentry")} ${flag("uninstall")}`,
|
|
84
|
+
"",
|
|
85
|
+
h("Kinds"),
|
|
86
|
+
bullet(`${c.bold("skill")} ${c.bold("rule")} ${c.bold("agent")} ${c.bold("profile")} ${c.bold("script")} ${dim("(or all)")}`),
|
|
87
|
+
dim(" Plurals accepted: skills → skill, agents → agent, …"),
|
|
88
|
+
"",
|
|
89
|
+
h("Sources"),
|
|
90
|
+
bullet(`${cmd("author/repo")} ${dim("GitHub shorthand")}`),
|
|
91
|
+
bullet(`${cmd("https://github.com/…")} ${dim("GitHub URL or /tree/<ref>/<dir>")}`),
|
|
92
|
+
bullet(`${cmd("https://gitlab.com/…")} ${dim("GitLab URL")}`),
|
|
93
|
+
bullet(`${cmd("git@host:owner/repo.git")} ${dim("any git URL")}`),
|
|
94
|
+
bullet(`${cmd("./path")} ${dim("|")} ${cmd("/path")} ${dim("|")} ${cmd("~/path")} ${dim("local directory")}`),
|
|
95
|
+
"",
|
|
96
|
+
h("Examples"),
|
|
97
|
+
bullet(`${cmd("agentry add skills")} Prat011/awesome-llm-skills`),
|
|
98
|
+
bullet(`${cmd("agentry add skills")} ./my-skills ${flag("--list")}`),
|
|
99
|
+
bullet(`${cmd("agentry add skills")} ./my-skills enhance-prompt ${flag("-a")} cursor ${flag("-a")} claude-code`),
|
|
100
|
+
bullet(`${cmd("agentry add agents")} author/repo frontend-developer`),
|
|
101
|
+
bullet(`${cmd("agentry add profile")} frontend author/repo`),
|
|
102
|
+
bullet(`${cmd("agentry remove skills")} enhance-prompt`),
|
|
103
|
+
bullet(`${cmd("agentry update")}`),
|
|
104
|
+
bullet(`${cmd("agentry update skills")} author/repo enhance-prompt`),
|
|
105
|
+
"",
|
|
106
|
+
h("Options"),
|
|
107
|
+
` ${flag("-g, --global")} ${dim("Install into ~ (all projects)")}`,
|
|
108
|
+
` ${flag("--project")} ${dim("Install into the current folder (default)")}`,
|
|
109
|
+
` ${flag("--dir")} ${dim("<p>")} ${dim("Install into a specific folder")}`,
|
|
110
|
+
` ${flag("-a, --agent")} ${dim("<n>")} ${dim("Target provider(s); repeatable; '*' = all")}`,
|
|
111
|
+
` ${flag("-l, --list")} ${dim("Preview only — write nothing")}`,
|
|
112
|
+
` ${flag("--copy")} ${dim("Copy files instead of symlinking")}`,
|
|
113
|
+
` ${flag("--all")} ${dim("Install everything to all agents, no prompts")}`,
|
|
114
|
+
` ${flag("-y, --yes")} ${dim("Don't prompt")}`,
|
|
115
|
+
` ${flag("-v, --version")} ${dim("Print version")}`,
|
|
116
|
+
` ${flag("-h, --help")} ${dim("Show this help")}`,
|
|
117
|
+
"",
|
|
118
|
+
dim("Tip: omit --agent to pick providers interactively (universal locked + searchable list)."),
|
|
119
|
+
""
|
|
120
|
+
];
|
|
121
|
+
process.stdout.write(lines.join("\n"));
|
|
122
|
+
}
|
|
123
|
+
export { PALETTE, animateLogo, badge, delay, logo, printHelp, tagline, theme };
|
package/dist/cli.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {}
|