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 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 the `touch-grass` layout:
10
+ The canonical source format is repo-neutral:
11
11
 
12
- - `agents/profiles/*.md`: Markdown profile with YAML frontmatter.
13
- - `agents/adapters/<harness>/*.md`: optional harness-specific metadata and notes.
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
- `touch-grass` layout. Profiles are read from `agents/profiles/*.md`, adapted for
9
- the selected harness, and installed into the right place for Codex, Claude Code,
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 pablof7z/touch-grass --agent ios-tester
18
- npx awesome-agents add pablof7z/touch-grass --agent chief-of-staff
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 pablof7z/touch-grass --agent ios-tester --dry-run
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 [source] [options]
34
- awesome-agents install [source] [options] # alias for add
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 ios-tester`
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, the default
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: `.codex/agents/<profile>.toml`
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/agents/<profile>.toml`, or `~/.codex/agents/<profile>.toml`
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
- ios-tester.md
93
+ triage-agent.agent.yaml
94
+ ops-agent.agf.yaml
95
+ legacy-agent.md
81
96
  adapters/
82
97
  codex/
83
- ios-tester.md
98
+ optional-agent.md
84
99
  ```
85
100
 
86
- Profile files are Markdown with YAML frontmatter. Adapters are optional and can
87
- provide harness-specific metadata such as model and reasoning effort.
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 pablof7z/touch-grass --list
93
- npx awesome-agents add pablof7z/touch-grass --agent ios-tester
94
- npx awesome-agents add pablof7z/touch-grass --agent chief-of-staff
95
- npx awesome-agents add pablof7z/touch-grass --agent ios-tester --harness codex --global
96
- npx awesome-agents add pablof7z/touch-grass --all --dry-run
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 ios-tester --agent codex
100
- npx awesome-agents update ios-tester --agent codex --dry-run
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; pass `--global` for user-level installs.
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: `/Users/customer/touch-grass`, `~/touch-grass`, `.`
22
- - GitHub shorthand: `pablof7z/touch-grass`
23
- - GitHub URL: `https://github.com/pablof7z/touch-grass`
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 pablof7z/touch-grass --agent ios-tester
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 pablof7z/touch-grass --agent ios-tester --harness opencode
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 ios-tester`.
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 to match the `npx skills` mental model and avoid surprising user-global mutation.
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 custom agents install to:
15
+ Generated Codex profiles install to:
16
16
 
17
- - Project: `.codex/agents/<profile>.toml`
18
- - Global: `$CODEX_HOME/agents/<profile>.toml`, or `~/.codex/agents/<profile>.toml`
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
- Current `touch-grass` profiles have Codex adapters. Claude Code and OpenCode currently use generated defaults unless source repositories add native adapters for those harnesses.
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 generate Codex `--profile` config layers in addition to Codex custom agents?
20
- - Should `touch-grass` add native Claude Code and OpenCode adapters instead of relying on generated defaults?
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 `touch-grass`, both local `/Users/customer/touch-grass` and GitHub `pablof7z/touch-grass`.
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
- ## First Source
29
+ ## Source Independence
27
30
 
28
- The first real source repository is `touch-grass`, which currently carries reusable operational agent profiles such as:
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
- - `ios-tester`
31
- - `ios-ux-ui-critic`
32
- - `chief-of-staff`
35
+ Product correction:
33
36
 
34
- `awesome-agents` should install those profiles without requiring the user to copy profile files manually.
35
-
36
- The `chief-of-staff` profile is an explicit category-boundary example: it is an
37
- operational agent identity, not a skill.
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 initial source format follows the `touch-grass` layout:
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
- Harness adapters live at:
26
+ Optional harness adapters live at:
25
27
 
26
28
  ```text
27
- agents/adapters/<harness>/*.md
29
+ agents/adapters/<harness>/*
28
30
  ```
29
31
 
30
32
  ## Profile Files
31
33
 
32
- Profile files are Markdown with YAML frontmatter.
34
+ YAML profile files are preferred. The loader should support a pragmatic subset
35
+ of emerging YAML agent-definition shapes:
33
36
 
34
- The CLI should preserve canonical profile content and generate harness-specific install files. A profile is reusable product content, not local machine setup.
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
- Current `touch-grass` profiles include:
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
- - `chief-of-staff`
39
- - `ios-tester`
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
- The `chief-of-staff` source files are intentionally under `agents/`, not
43
- `skills/`, because the source format models agent profiles separately from
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 `/Users/customer/touch-grass`.
51
- - GitHub shorthand such as `pablof7z/touch-grass`.
55
+ - Local paths such as `/path/to/agent-profiles`.
56
+ - GitHub shorthand such as `owner/repo`.
52
57
  - GitHub URLs.
53
58
 
54
- The first source repository is `touch-grass`, but the format should not be hard-coded only to that repository.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awesome-agents",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Install reusable agent profiles into Codex, Claude Code, and OpenCode.",
5
5
  "type": "module",
6
6
  "bin": {
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("[source]", "Source plus profile, for example pablof7z/touch-grass@ios-tester")
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 (default)")
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(`${profile.slug} ${profile.summary || profile.name}`);
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 ? "" : " (missing target)";
191
- console.log(`${install.profile} ${install.harness} ${install.target}${missing}`);
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(`Registry: ${result.registryPath}`);
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(`Registry: ${registryPath}`);
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.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";