awesome-agents 0.1.1 → 0.1.3
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/AGENTS.md +9 -3
- package/CHANGELOG.md +30 -0
- package/README.md +42 -26
- package/docs/cli.md +19 -7
- package/docs/product/command-model.md +16 -2
- package/docs/product/harness-targets.md +16 -8
- package/docs/product/open-questions.md +3 -2
- package/docs/product/product-scope.md +15 -10
- package/docs/product/profile-source-format.md +22 -16
- package/package.json +1 -1
- package/src/cli.js +50 -17
- package/src/constants.js +1 -2
- package/src/help.js +530 -0
- package/src/installer.js +129 -25
- package/src/renderers.js +5 -8
- package/src/source.js +200 -23
package/AGENTS.md
CHANGED
|
@@ -7,10 +7,16 @@ agent profiles into agent harnesses. It intentionally mirrors the command shape
|
|
|
7
7
|
of `npx skills`, but installs profile artifacts for Codex, Claude Code, and
|
|
8
8
|
OpenCode.
|
|
9
9
|
|
|
10
|
-
The canonical source format is
|
|
10
|
+
The canonical source format is repo-neutral:
|
|
11
11
|
|
|
12
|
-
- `agents/profiles/*.
|
|
13
|
-
- `agents/
|
|
12
|
+
- `agents/profiles/*.agent.yaml`: preferred YAML profile definitions.
|
|
13
|
+
- `agents/profiles/*.agf.yaml`: Agent Format-style YAML profile definitions.
|
|
14
|
+
- `agents/profiles/*.md`: Markdown profile definitions with YAML frontmatter.
|
|
15
|
+
- `agents/adapters/<harness>/*`: optional harness-specific metadata and notes.
|
|
16
|
+
|
|
17
|
+
Never hard-code a particular source repository into runtime behavior, tests, or
|
|
18
|
+
examples. Use neutral fixture/source names unless a test is explicitly about
|
|
19
|
+
source resolution.
|
|
14
20
|
|
|
15
21
|
## Setup Commands
|
|
16
22
|
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
This file is maintained by `npm run changelog` and `npm run release`. Release entries are generated from git commit history.
|
|
4
4
|
|
|
5
|
+
## 0.1.3 - 2026-07-05
|
|
6
|
+
|
|
7
|
+
Initial tracked release.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Add release automation (3ee72ed)
|
|
12
|
+
- Add chief of staff profile install support (e683a72)
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
- Fix flaky color-sensitive assertions in CLI tests (5262811)
|
|
17
|
+
- Fix agent profile install UX (961497c)
|
|
18
|
+
- Fix npm bin metadata (085e6ee)
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Polish CLI help and profile source support (d931ae9)
|
|
23
|
+
- Split product notes by area (1d24611)
|
|
24
|
+
- Scaffold awesome-agents CLI (e1ec6a4)
|
|
25
|
+
|
|
26
|
+
## 0.1.2 - 2026-07-05
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- Require an explicit source for `add`, `install`, and `use`; remove the hardcoded default source fallback.
|
|
31
|
+
- Replace source-specific help and documentation examples with neutral `owner/repo` examples.
|
|
32
|
+
- Parse repo-neutral YAML profile files in addition to Markdown frontmatter files.
|
|
33
|
+
- Replace source-specific test fixtures with neutral profile-source fixtures.
|
|
34
|
+
|
|
5
35
|
## 0.1.1 - 2026-07-05
|
|
6
36
|
|
|
7
37
|
Initial tracked release.
|
package/README.md
CHANGED
|
@@ -5,18 +5,17 @@ It mirrors the useful parts of `npx skills`, but the unit is an operational
|
|
|
5
5
|
agent profile instead of a skill.
|
|
6
6
|
|
|
7
7
|
Supported sources are GitHub repos, Git URLs, or local checkouts that use the
|
|
8
|
-
|
|
9
|
-
the selected harness, and installed into the
|
|
10
|
-
or OpenCode.
|
|
8
|
+
agent-profile source layout. Profiles are read from YAML or Markdown files under
|
|
9
|
+
`agents/profiles/`, adapted for the selected harness, and installed into the
|
|
10
|
+
right place for Codex, Claude Code, or OpenCode.
|
|
11
11
|
|
|
12
12
|
## Install And Run
|
|
13
13
|
|
|
14
14
|
Use the CLI with `npx`:
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
npx awesome-agents add
|
|
18
|
-
npx awesome-agents add
|
|
19
|
-
npx awesome-agents add pablof7z/touch-grass --agent ios-tester --harness opencode
|
|
17
|
+
npx awesome-agents add owner/repo --agent triage-agent
|
|
18
|
+
npx awesome-agents add owner/repo --agent triage-agent --harness opencode
|
|
20
19
|
```
|
|
21
20
|
|
|
22
21
|
From this repo during development:
|
|
@@ -24,15 +23,15 @@ From this repo during development:
|
|
|
24
23
|
```bash
|
|
25
24
|
npm install
|
|
26
25
|
npm test
|
|
27
|
-
node ./bin/awesome-agents.js add
|
|
26
|
+
node ./bin/awesome-agents.js add ./test/fixtures/profile-source --agent triage-agent --dry-run
|
|
28
27
|
```
|
|
29
28
|
|
|
30
29
|
## Commands
|
|
31
30
|
|
|
32
31
|
```bash
|
|
33
|
-
awesome-agents add
|
|
34
|
-
awesome-agents install
|
|
35
|
-
awesome-agents use <source@profile> [options]
|
|
32
|
+
awesome-agents add <source> [options]
|
|
33
|
+
awesome-agents install <source> [options] # alias for add
|
|
34
|
+
awesome-agents use <source[@profile]> [options]
|
|
36
35
|
awesome-agents list [options]
|
|
37
36
|
awesome-agents remove <profile...> [options]
|
|
38
37
|
awesome-agents update [profile...] [options]
|
|
@@ -41,27 +40,32 @@ awesome-agents init [name]
|
|
|
41
40
|
|
|
42
41
|
Useful install options:
|
|
43
42
|
|
|
44
|
-
- `--agent <slug>` to select an agent profile, for example `--agent
|
|
43
|
+
- `--agent <slug>` to select an agent profile, for example `--agent triage-agent`
|
|
45
44
|
- `--profile <slug>` or `--skill <slug>` as explicit profile aliases; `--skill`
|
|
46
45
|
is command-shape compatibility and does not mean the artifact is a skill
|
|
47
46
|
- `--harness codex|claude-code|opencode|*` to select target harnesses
|
|
48
47
|
- `--all` to install all profiles to all supported harnesses
|
|
49
48
|
- `--dry-run` to preview writes
|
|
50
|
-
- `--project` for project-level install
|
|
49
|
+
- `--project` for project-level install where supported; Codex profiles install globally
|
|
51
50
|
- `--global` for user-level install
|
|
52
51
|
- `--list` to inspect available source profiles without installing
|
|
53
52
|
|
|
53
|
+
Human-readable output uses subtle ANSI color. Set `NO_COLOR=1` to disable color,
|
|
54
|
+
or pass `--json` for machine-readable output. After an install, the CLI also
|
|
55
|
+
prints run commands for target harness CLIs it finds on `PATH`, such as
|
|
56
|
+
`codex --profile <profile>` or `claude --agent <profile>`.
|
|
57
|
+
|
|
54
58
|
## Harness Targets
|
|
55
59
|
|
|
56
60
|
Project installs write to:
|
|
57
61
|
|
|
58
|
-
- Codex:
|
|
62
|
+
- Codex: not supported; Codex profiles load from user config
|
|
59
63
|
- Claude Code: `.claude/agents/<profile>.md`
|
|
60
64
|
- OpenCode: `.opencode/agents/<profile>.md`
|
|
61
65
|
|
|
62
66
|
Global installs write to:
|
|
63
67
|
|
|
64
|
-
- Codex: `$CODEX_HOME
|
|
68
|
+
- Codex: `$CODEX_HOME/<profile>.config.toml`, or `~/.codex/<profile>.config.toml`
|
|
65
69
|
- Claude Code: `$CLAUDE_HOME/agents/<profile>.md`, or `~/.claude/agents/<profile>.md`
|
|
66
70
|
- OpenCode: `$OPENCODE_CONFIG_DIR/agents/<profile>.md`, or `~/.config/opencode/agents/<profile>.md`
|
|
67
71
|
|
|
@@ -70,6 +74,15 @@ installs or `~/.awesome-agents/installed.json` for global installs. `list`,
|
|
|
70
74
|
`remove`, and `update` use this registry and refuse to overwrite or delete files
|
|
71
75
|
that do not contain the generated marker unless `--force` is passed.
|
|
72
76
|
|
|
77
|
+
Run Codex profiles with:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
codex --profile <profile>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Codex expects a plain profile name. It does not accept a path passed to
|
|
84
|
+
`--profile`.
|
|
85
|
+
|
|
73
86
|
## Source Format
|
|
74
87
|
|
|
75
88
|
An agent-profile source should look like:
|
|
@@ -77,27 +90,30 @@ An agent-profile source should look like:
|
|
|
77
90
|
```text
|
|
78
91
|
agents/
|
|
79
92
|
profiles/
|
|
80
|
-
|
|
93
|
+
triage-agent.agent.yaml
|
|
94
|
+
ops-agent.agf.yaml
|
|
95
|
+
legacy-agent.md
|
|
81
96
|
adapters/
|
|
82
97
|
codex/
|
|
83
|
-
|
|
98
|
+
optional-agent.md
|
|
84
99
|
```
|
|
85
100
|
|
|
86
|
-
|
|
87
|
-
|
|
101
|
+
YAML profile files are preferred. The loader also accepts Markdown files with
|
|
102
|
+
YAML frontmatter for compatibility with tools that use `.agent.md`-style
|
|
103
|
+
profiles. Adapters are optional and can provide harness-specific metadata, but a
|
|
104
|
+
profile should stand on its own without requiring an adapter.
|
|
88
105
|
|
|
89
106
|
## Examples
|
|
90
107
|
|
|
91
108
|
```bash
|
|
92
|
-
npx awesome-agents add
|
|
93
|
-
npx awesome-agents add
|
|
94
|
-
npx awesome-agents add
|
|
95
|
-
npx awesome-agents add
|
|
96
|
-
npx awesome-agents
|
|
97
|
-
npx awesome-agents use pablof7z/touch-grass --agent ios-ux-ui-critic --harness claude-code
|
|
109
|
+
npx awesome-agents add owner/repo --list
|
|
110
|
+
npx awesome-agents add owner/repo --agent triage-agent
|
|
111
|
+
npx awesome-agents add owner/repo --agent triage-agent --harness codex --global
|
|
112
|
+
npx awesome-agents add owner/repo --all --dry-run
|
|
113
|
+
npx awesome-agents use owner/repo --agent triage-agent --harness claude-code
|
|
98
114
|
npx awesome-agents list --json
|
|
99
|
-
npx awesome-agents remove
|
|
100
|
-
npx awesome-agents update
|
|
115
|
+
npx awesome-agents remove triage-agent --agent codex
|
|
116
|
+
npx awesome-agents update triage-agent --agent codex --dry-run
|
|
101
117
|
```
|
|
102
118
|
|
|
103
119
|
## Release Workflow
|
package/docs/cli.md
CHANGED
|
@@ -12,19 +12,24 @@
|
|
|
12
12
|
|
|
13
13
|
The CLI is noninteractive for the initial scaffold. Options such as `--yes` are
|
|
14
14
|
accepted for parity, but command behavior should be fully scriptable. Installs
|
|
15
|
-
default to project scope
|
|
15
|
+
default to project scope where the selected harness supports project-local
|
|
16
|
+
profiles. Codex is the exception: Codex `--profile` loads named config layers
|
|
17
|
+
from `CODEX_HOME`, so Codex profile installs are user-level.
|
|
16
18
|
|
|
17
19
|
## Source Resolution
|
|
18
20
|
|
|
19
21
|
Supported source values:
|
|
20
22
|
|
|
21
|
-
- Local path: `/
|
|
22
|
-
- GitHub shorthand: `
|
|
23
|
-
- GitHub URL: `https://github.com/
|
|
23
|
+
- Local path: `/path/to/agent-profiles`, `~/agent-profiles`, `.`
|
|
24
|
+
- GitHub shorthand: `owner/repo`
|
|
25
|
+
- GitHub URL: `https://github.com/owner/repo`
|
|
24
26
|
|
|
25
27
|
For GitHub sources, the CLI clones a shallow temporary copy and reads
|
|
26
28
|
`agents/profiles`.
|
|
27
29
|
|
|
30
|
+
There is no default source. `add`, `install`, and `use` require the caller to
|
|
31
|
+
provide a source explicitly.
|
|
32
|
+
|
|
28
33
|
## Install Syntax
|
|
29
34
|
|
|
30
35
|
The preferred remote install form is:
|
|
@@ -36,15 +41,14 @@ npx awesome-agents add owner/repo --agent <profile-slug>
|
|
|
36
41
|
For example:
|
|
37
42
|
|
|
38
43
|
```bash
|
|
39
|
-
npx awesome-agents add
|
|
40
|
-
npx awesome-agents add pablof7z/touch-grass --agent chief-of-staff
|
|
44
|
+
npx awesome-agents add owner/repo --agent triage-agent
|
|
41
45
|
```
|
|
42
46
|
|
|
43
47
|
`--agent` selects the reusable agent profile. `--harness` selects where the
|
|
44
48
|
generated profile is installed:
|
|
45
49
|
|
|
46
50
|
```bash
|
|
47
|
-
npx awesome-agents add
|
|
51
|
+
npx awesome-agents add owner/repo --agent triage-agent --harness opencode
|
|
48
52
|
```
|
|
49
53
|
|
|
50
54
|
For backward compatibility, `--agent codex`, `--agent claude-code`, and
|
|
@@ -53,6 +57,14 @@ For backward compatibility, `--agent codex`, `--agent claude-code`, and
|
|
|
53
57
|
The `--skill` flag is accepted only as a command-shape alias for `--profile`.
|
|
54
58
|
Installed artifacts remain operational agent profiles.
|
|
55
59
|
|
|
60
|
+
After install, human-readable output should show the CLI command to run each
|
|
61
|
+
installed profile through any matching harness CLI found on `PATH`. Examples:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
codex --profile triage-agent
|
|
65
|
+
claude --agent triage-agent
|
|
66
|
+
```
|
|
67
|
+
|
|
56
68
|
## Install Safety
|
|
57
69
|
|
|
58
70
|
Generated files contain the marker `Generated by awesome-agents`. The CLI refuses
|
|
@@ -21,7 +21,7 @@ Accepted direction:
|
|
|
21
21
|
The CLI supports:
|
|
22
22
|
|
|
23
23
|
- `--agent <slug>` as the preferred profile selector, matching user-facing
|
|
24
|
-
language such as `npx awesome-agents add owner/repo --agent
|
|
24
|
+
language such as `npx awesome-agents add owner/repo --agent triage-agent`.
|
|
25
25
|
- `--profile <slug>` to select profiles explicitly.
|
|
26
26
|
- `--skill <slug>` as a compatibility alias, even though the artifact is a profile.
|
|
27
27
|
- `--harness <codex|claude-code|opencode|*>` to select target harnesses.
|
|
@@ -34,7 +34,10 @@ The CLI supports:
|
|
|
34
34
|
|
|
35
35
|
Accepted implementation decision:
|
|
36
36
|
|
|
37
|
-
- Install scope defaults to project
|
|
37
|
+
- Install scope defaults to project where the target harness supports project-local profiles.
|
|
38
|
+
- Codex is an exception because `codex --profile <name>` loads
|
|
39
|
+
`$CODEX_HOME/<name>.config.toml`. Codex profile installs should use that
|
|
40
|
+
user-level config-layer target.
|
|
38
41
|
- Codex is the default harness when no `--harness` or legacy harness-valued
|
|
39
42
|
`--agent` is provided.
|
|
40
43
|
- The CLI is noninteractive in the initial scaffold.
|
|
@@ -45,5 +48,16 @@ Accepted implementation decision:
|
|
|
45
48
|
The CLI should be useful from automation:
|
|
46
49
|
|
|
47
50
|
- Human-readable output should include clear target paths.
|
|
51
|
+
- Human-readable install output should show how to run the installed profile
|
|
52
|
+
through harness CLIs detected on the user's machine.
|
|
48
53
|
- `--json` should be available for scripts.
|
|
49
54
|
- `--dry-run` should preview writes without touching target files or registries.
|
|
55
|
+
|
|
56
|
+
## Profile Identity
|
|
57
|
+
|
|
58
|
+
User correction:
|
|
59
|
+
|
|
60
|
+
- Each installed profile should instruct the harness to identify itself by its
|
|
61
|
+
installed name and role. If the user asks the running agent "who are you?" or
|
|
62
|
+
asks for `triage-agent`, it should know it is the `triage-agent` profile or at
|
|
63
|
+
least that its role is Triage Agent.
|
|
@@ -12,10 +12,20 @@ Initial harness targets:
|
|
|
12
12
|
|
|
13
13
|
## Codex
|
|
14
14
|
|
|
15
|
-
Generated Codex
|
|
15
|
+
Generated Codex profiles install to:
|
|
16
16
|
|
|
17
|
-
- Project:
|
|
18
|
-
- Global: `$CODEX_HOME
|
|
17
|
+
- Project: not supported; Codex profiles load from user config
|
|
18
|
+
- Global: `$CODEX_HOME/<profile>.config.toml`, or `~/.codex/<profile>.config.toml`
|
|
19
|
+
|
|
20
|
+
Run with:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
codex --profile <profile>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Codex profiles are not project-local in the same way Claude Code and OpenCode
|
|
27
|
+
agents are. `--profile` expects a plain name and layers the corresponding config
|
|
28
|
+
file from `CODEX_HOME`.
|
|
19
29
|
|
|
20
30
|
The generated TOML includes:
|
|
21
31
|
|
|
@@ -24,10 +34,6 @@ The generated TOML includes:
|
|
|
24
34
|
- optional model settings
|
|
25
35
|
- `developer_instructions`
|
|
26
36
|
|
|
27
|
-
Open question:
|
|
28
|
-
|
|
29
|
-
- Whether future versions should also generate Codex `--profile` config layers in addition to Codex custom agents.
|
|
30
|
-
|
|
31
37
|
## Claude Code
|
|
32
38
|
|
|
33
39
|
Generated Claude Code subagents install to:
|
|
@@ -48,4 +54,6 @@ OpenCode output is Markdown with frontmatter and a generated marker.
|
|
|
48
54
|
|
|
49
55
|
## Adapter Gaps
|
|
50
56
|
|
|
51
|
-
|
|
57
|
+
Some source repositories may provide Codex adapters first. Claude Code and
|
|
58
|
+
OpenCode use generated defaults unless a source repository adds native adapters
|
|
59
|
+
for those harnesses.
|
|
@@ -16,5 +16,6 @@ These are unresolved product questions for `awesome-agents`.
|
|
|
16
16
|
|
|
17
17
|
## Harness Support
|
|
18
18
|
|
|
19
|
-
- Should future versions
|
|
20
|
-
|
|
19
|
+
- Should future versions also support Codex custom-agent files in addition to
|
|
20
|
+
Codex `--profile` config layers?
|
|
21
|
+
- Should source repositories add native Claude Code and OpenCode adapters instead of relying on generated defaults?
|
|
@@ -7,7 +7,8 @@ These notes capture what `awesome-agents` is and why it exists.
|
|
|
7
7
|
- The package is named `awesome-agents`.
|
|
8
8
|
- It should be installable with `npx`.
|
|
9
9
|
- Its command structure should mirror `npx skills`, but for agent profiles.
|
|
10
|
-
- It should install profiles from
|
|
10
|
+
- It should install profiles from any explicit source repository that follows
|
|
11
|
+
the `agents/profiles` source layout.
|
|
11
12
|
- Initial harness targets are Codex, Claude Code, and OpenCode.
|
|
12
13
|
- The package should be published after the scaffold works.
|
|
13
14
|
|
|
@@ -20,18 +21,22 @@ Product distinction:
|
|
|
20
21
|
- `npx skills` installs reusable task workflows and instructions.
|
|
21
22
|
- `awesome-agents` installs reusable operational agent identities.
|
|
22
23
|
- A profile can define prompt, model preference, tool boundaries, notes, coordination style, and harness-specific configuration.
|
|
24
|
+
- Installed profiles should preserve explicit self-identity. A running
|
|
25
|
+
profile should know its installed slug and role.
|
|
23
26
|
|
|
24
27
|
The CLI should not pretend profiles are skills. It can mirror `npx skills` command shape where that helps user memory, but the artifact remains an agent profile.
|
|
25
28
|
|
|
26
|
-
##
|
|
29
|
+
## Source Independence
|
|
27
30
|
|
|
28
|
-
|
|
31
|
+
`awesome-agents` is independent of any particular profile repository. It should
|
|
32
|
+
not know about or default to one source. Users must name the local path, GitHub
|
|
33
|
+
shorthand, or Git URL they want to install from.
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
- `ios-ux-ui-critic`
|
|
32
|
-
- `chief-of-staff`
|
|
35
|
+
Product correction:
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
- Do not intertwine source-repository concepts into the `awesome-agents`
|
|
38
|
+
codebase.
|
|
39
|
+
- Source repositories provide profile artifacts; `awesome-agents` understands
|
|
40
|
+
the artifact shape and target harnesses.
|
|
41
|
+
- Examples and tests should use neutral source names unless they are testing
|
|
42
|
+
source resolution itself.
|
|
@@ -4,11 +4,13 @@ These notes capture how profile source repositories are organized.
|
|
|
4
4
|
|
|
5
5
|
## Canonical Layout
|
|
6
6
|
|
|
7
|
-
The
|
|
7
|
+
The source format is intentionally repo-neutral:
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
10
|
agents/
|
|
11
11
|
profiles/
|
|
12
|
+
<profile>.agent.yaml
|
|
13
|
+
<profile>.agf.yaml
|
|
12
14
|
<profile>.md
|
|
13
15
|
adapters/
|
|
14
16
|
<harness>/
|
|
@@ -18,40 +20,44 @@ agents/
|
|
|
18
20
|
Canonical profiles live at:
|
|
19
21
|
|
|
20
22
|
```text
|
|
21
|
-
agents/profiles/*.md
|
|
23
|
+
agents/profiles/*.{agent.yaml,agent.yml,agf.yaml,agf.yml,yaml,yml,agent.md,md}
|
|
22
24
|
```
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
Optional harness adapters live at:
|
|
25
27
|
|
|
26
28
|
```text
|
|
27
|
-
agents/adapters/<harness
|
|
29
|
+
agents/adapters/<harness>/*
|
|
28
30
|
```
|
|
29
31
|
|
|
30
32
|
## Profile Files
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
YAML profile files are preferred. The loader should support a pragmatic subset
|
|
35
|
+
of emerging YAML agent-definition shapes:
|
|
33
36
|
|
|
34
|
-
|
|
37
|
+
- simple profile YAML with `id`, `name`, `description`, `model`, and
|
|
38
|
+
`instructions`;
|
|
39
|
+
- Agent Format-style YAML with `metadata` and `execution_policy.config`;
|
|
40
|
+
- Markdown files with YAML frontmatter for compatibility with `.agent.md`
|
|
41
|
+
ecosystems.
|
|
35
42
|
|
|
36
|
-
|
|
43
|
+
The CLI should preserve canonical profile content and generate harness-specific install files. A profile is reusable product content, not local machine setup.
|
|
37
44
|
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
- `ios-ux-ui-critic`
|
|
45
|
+
Adapters are optional. A profile should be useful without a harness adapter; an
|
|
46
|
+
adapter is only an override for harness-specific metadata or instructions.
|
|
41
47
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
loadable skills.
|
|
48
|
+
Profile source files are intentionally under `agents/`, not `skills/`, because
|
|
49
|
+
the source format models agent profiles separately from loadable skills.
|
|
45
50
|
|
|
46
51
|
## Source Resolution
|
|
47
52
|
|
|
48
53
|
The CLI should support:
|
|
49
54
|
|
|
50
|
-
- Local paths such as `/
|
|
51
|
-
- GitHub shorthand such as `
|
|
55
|
+
- Local paths such as `/path/to/agent-profiles`.
|
|
56
|
+
- GitHub shorthand such as `owner/repo`.
|
|
52
57
|
- GitHub URLs.
|
|
53
58
|
|
|
54
|
-
The
|
|
59
|
+
The package must not hard-code any source repository. `add`, `install`, and
|
|
60
|
+
`use` require an explicit source from the caller.
|
|
55
61
|
|
|
56
62
|
## Registry Or Search
|
|
57
63
|
|
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { PACKAGE_NAME, PACKAGE_VERSION, SUPPORTED_AGENTS } from "./constants.js";
|
|
3
|
+
import { configureHelp, formatMissingSourceError, ui } from "./help.js";
|
|
3
4
|
import {
|
|
4
5
|
initProfile,
|
|
5
6
|
installFromSource,
|
|
@@ -19,12 +20,14 @@ export async function run(argv = process.argv) {
|
|
|
19
20
|
.helpOption("-h, --help", "Show this help message")
|
|
20
21
|
.showHelpAfterError();
|
|
21
22
|
|
|
23
|
+
configureHelp(program);
|
|
24
|
+
|
|
22
25
|
addInstallCommand(program, "add");
|
|
23
26
|
addInstallCommand(program, "install");
|
|
24
27
|
|
|
25
28
|
program
|
|
26
29
|
.command("use")
|
|
27
|
-
.argument("
|
|
30
|
+
.argument("<source>", "Source plus profile, for example owner/repo@profile")
|
|
28
31
|
.description("Print one rendered agent profile without installing it")
|
|
29
32
|
.option("-s, --profile <profile>", "Profile slug to use")
|
|
30
33
|
.option("--skill <profile>", "Compatibility alias for --profile")
|
|
@@ -79,7 +82,7 @@ export async function run(argv = process.argv) {
|
|
|
79
82
|
if (options.json) {
|
|
80
83
|
printJson(result);
|
|
81
84
|
} else {
|
|
82
|
-
printOperations(result.operations, result.registryPath);
|
|
85
|
+
printOperations(result.operations, result.registryPath, result.runInstructions);
|
|
83
86
|
}
|
|
84
87
|
});
|
|
85
88
|
|
|
@@ -100,7 +103,7 @@ export async function run(argv = process.argv) {
|
|
|
100
103
|
if (options.json) {
|
|
101
104
|
printJson(result);
|
|
102
105
|
} else {
|
|
103
|
-
printOperations(result.operations, result.registryPath);
|
|
106
|
+
printOperations(result.operations, result.registryPath, result.runInstructions);
|
|
104
107
|
}
|
|
105
108
|
});
|
|
106
109
|
|
|
@@ -116,9 +119,9 @@ export async function run(argv = process.argv) {
|
|
|
116
119
|
if (options.json) {
|
|
117
120
|
printJson(result);
|
|
118
121
|
} else {
|
|
119
|
-
console.log(`${result.action}:`);
|
|
122
|
+
console.log(`${ui.success(result.action)}:`);
|
|
120
123
|
for (const file of result.files) {
|
|
121
|
-
console.log(` ${file}`);
|
|
124
|
+
console.log(` ${ui.path(file)}`);
|
|
122
125
|
}
|
|
123
126
|
}
|
|
124
127
|
});
|
|
@@ -137,7 +140,7 @@ function addInstallCommand(program, commandName) {
|
|
|
137
140
|
.argument("[source]", "Local path, GitHub owner/repo, or GitHub URL")
|
|
138
141
|
.description(commandName === "install" ? "Alias for add" : "Install agent profiles from a source")
|
|
139
142
|
.option("-g, --global", "Install globally")
|
|
140
|
-
.option("-p, --project", "Install into the current project
|
|
143
|
+
.option("-p, --project", "Install into the current project; not supported for Codex profiles")
|
|
141
144
|
.option("-a, --agent <agents...>", "Agent profile slugs to install; accepts harness names for backward compatibility")
|
|
142
145
|
.option("--harness <harnesses...>", `Target harnesses (${SUPPORTED_AGENTS.join(", ")}, or *)`)
|
|
143
146
|
.option("--target <harnesses...>", "Compatibility alias for --harness")
|
|
@@ -151,6 +154,12 @@ function addInstallCommand(program, commandName) {
|
|
|
151
154
|
.option("--json", "Output JSON")
|
|
152
155
|
.option("--home <dir>", "Override HOME for path expansion")
|
|
153
156
|
.action(async (source = undefined, options) => {
|
|
157
|
+
if (!source) {
|
|
158
|
+
process.stderr.write(formatMissingSourceError(commandName));
|
|
159
|
+
process.exitCode = 1;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
|
|
154
163
|
if (options.list) {
|
|
155
164
|
const profiles = await listAvailable(source, options);
|
|
156
165
|
if (options.json) {
|
|
@@ -165,48 +174,72 @@ function addInstallCommand(program, commandName) {
|
|
|
165
174
|
if (options.json) {
|
|
166
175
|
printJson(result);
|
|
167
176
|
} else {
|
|
168
|
-
printOperations(result.operations, result.registryPath);
|
|
177
|
+
printOperations(result.operations, result.registryPath, result.runInstructions);
|
|
169
178
|
}
|
|
170
179
|
});
|
|
171
180
|
}
|
|
172
181
|
|
|
173
182
|
function printAvailable(profiles) {
|
|
174
183
|
if (profiles.length === 0) {
|
|
175
|
-
console.log("No profiles found.");
|
|
184
|
+
console.log(ui.warning("No profiles found."));
|
|
176
185
|
return;
|
|
177
186
|
}
|
|
187
|
+
console.log(ui.bold("Available profiles:"));
|
|
178
188
|
for (const profile of profiles) {
|
|
179
|
-
console.log(
|
|
189
|
+
console.log(` ${ui.profile(profile.slug)} ${profile.summary || profile.name}`);
|
|
180
190
|
}
|
|
181
191
|
}
|
|
182
192
|
|
|
183
193
|
function printInstalled(result) {
|
|
184
194
|
if (result.installs.length === 0) {
|
|
185
|
-
console.log(`No ${result.scope} profiles installed.`);
|
|
195
|
+
console.log(ui.warning(`No ${result.scope} profiles installed.`));
|
|
186
196
|
return;
|
|
187
197
|
}
|
|
188
198
|
|
|
199
|
+
console.log(ui.bold(`${result.scope} profiles:`));
|
|
189
200
|
for (const install of result.installs) {
|
|
190
|
-
const missing = install.exists ? "" :
|
|
191
|
-
console.log(
|
|
201
|
+
const missing = install.exists ? "" : ` ${ui.warning("(missing target)")}`;
|
|
202
|
+
console.log(` ${ui.profile(install.profile)} ${ui.command(install.harness)} ${ui.path(install.target)}${missing}`);
|
|
192
203
|
}
|
|
193
|
-
console.log(
|
|
204
|
+
console.log(`${ui.bold("Registry:")} ${ui.path(result.registryPath)}`);
|
|
194
205
|
}
|
|
195
206
|
|
|
196
|
-
function printOperations(operations, registryPath) {
|
|
207
|
+
function printOperations(operations, registryPath, runInstructions = []) {
|
|
197
208
|
if (operations.length === 0) {
|
|
198
|
-
console.log("No matching profiles.");
|
|
209
|
+
console.log(ui.warning("No matching profiles."));
|
|
199
210
|
return;
|
|
200
211
|
}
|
|
201
212
|
|
|
202
213
|
for (const operation of operations) {
|
|
203
|
-
console.log(`${operation.action}: ${operation.profile} -> ${operation.harness} at ${operation.target}`);
|
|
214
|
+
console.log(`${formatAction(operation.action)}: ${ui.profile(operation.profile)} -> ${ui.command(operation.harness)} at ${ui.path(operation.target)}`);
|
|
204
215
|
}
|
|
205
216
|
if (registryPath) {
|
|
206
|
-
console.log(
|
|
217
|
+
console.log(`${ui.bold("Registry:")} ${ui.path(registryPath)}`);
|
|
218
|
+
}
|
|
219
|
+
printRunInstructions(runInstructions);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function printRunInstructions(runInstructions = []) {
|
|
223
|
+
if (runInstructions.length === 0) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
console.log(ui.bold("Run installed profiles:"));
|
|
228
|
+
for (const instruction of runInstructions) {
|
|
229
|
+
console.log(` ${ui.profile(instruction.profile)} via ${ui.command(instruction.harness)}: ${ui.command(instruction.command)}`);
|
|
230
|
+
if (instruction.note) {
|
|
231
|
+
console.log(` ${instruction.note}`);
|
|
232
|
+
}
|
|
207
233
|
}
|
|
208
234
|
}
|
|
209
235
|
|
|
210
236
|
function printJson(value) {
|
|
211
237
|
console.log(JSON.stringify(value, null, 2));
|
|
212
238
|
}
|
|
239
|
+
|
|
240
|
+
function formatAction(action) {
|
|
241
|
+
if (action.startsWith("would-")) {
|
|
242
|
+
return ui.warning(action);
|
|
243
|
+
}
|
|
244
|
+
return ui.success(action);
|
|
245
|
+
}
|
package/src/constants.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export const PACKAGE_NAME = "awesome-agents";
|
|
2
|
-
export const PACKAGE_VERSION = "0.1.
|
|
3
|
-
export const DEFAULT_SOURCE = "pablof7z/touch-grass";
|
|
2
|
+
export const PACKAGE_VERSION = "0.1.3";
|
|
4
3
|
export const DEFAULT_AGENT = "codex";
|
|
5
4
|
export const SUPPORTED_AGENTS = ["codex", "claude-code", "opencode"];
|
|
6
5
|
export const REGISTRY_DIRNAME = ".awesome-agents";
|