awesome-agents 0.1.5 → 0.1.6
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/CHANGELOG.md +9 -0
- package/README.md +34 -9
- package/docs/cli.md +28 -7
- package/docs/product/README.md +1 -1
- package/docs/product/command-model.md +13 -12
- package/docs/product/harness-targets.md +23 -1
- package/docs/product/product-scope.md +4 -4
- package/docs/product/profile-source-format.md +17 -0
- package/package.json +3 -2
- package/src/cli.js +140 -10
- package/src/constants.js +8 -4
- package/src/help.js +12 -10
- package/src/installer.js +99 -11
- package/src/renderers.js +111 -3
- package/src/skills.js +397 -0
- package/src/source.js +26 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
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.6 - 2026-07-06
|
|
6
|
+
|
|
7
|
+
Changes since `v0.1.5`.
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- Align harness detection docs (70a1f8e)
|
|
12
|
+
- Improve agent install workflow (61470fc)
|
|
13
|
+
|
|
5
14
|
## 0.1.5 - 2026-07-06
|
|
6
15
|
|
|
7
16
|
Changes since `v0.1.4`.
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ agent profile instead of a skill.
|
|
|
7
7
|
Supported sources are GitHub repos, Git URLs, or local checkouts that use the
|
|
8
8
|
agent-profile source layout. Profiles are read from YAML or Markdown files under
|
|
9
9
|
`agents/<slug>/`, adapted for the selected harness, and installed into the
|
|
10
|
-
right place for Codex, Claude Code, or
|
|
10
|
+
right place for Codex, Claude Code, OpenCode, or tenex-edge.
|
|
11
11
|
|
|
12
12
|
## Install And Run
|
|
13
13
|
|
|
@@ -15,7 +15,7 @@ Use the CLI with `npx`:
|
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
npx awesome-agents add owner/repo --agent triage-agent
|
|
18
|
-
npx awesome-agents add owner/repo --agent triage-agent --harness
|
|
18
|
+
npx awesome-agents add owner/repo --agent triage-agent --harness tenex-edge
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
From this repo during development:
|
|
@@ -43,19 +43,25 @@ Useful install options:
|
|
|
43
43
|
- `--agent <slug>` to select an agent profile, for example `--agent triage-agent`
|
|
44
44
|
- `--profile <slug>` or `--skill <slug>` as explicit profile aliases; `--skill`
|
|
45
45
|
is command-shape compatibility and does not mean the artifact is a skill
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
- omit a profile selector in an interactive terminal to choose source profiles
|
|
47
|
+
from a checkbox list; every profile is selected by default
|
|
48
|
+
- `--yes` to accept detected profile and harness selections without opening selectors
|
|
49
|
+
- `--harness codex|claude-code|opencode|tenex-edge|*` to select target harnesses;
|
|
50
|
+
without it, the CLI detects harness CLIs on `PATH`; interactive multi-detect
|
|
51
|
+
opens a checkbox selector with every detected harness selected, and
|
|
52
|
+
noninteractive installs use every detected harness. If none are detected, pass
|
|
53
|
+
`--harness`.
|
|
49
54
|
- `--all` to install all profiles to all supported harnesses
|
|
50
55
|
- `--dry-run` to preview writes
|
|
51
|
-
- `--project` for project-level install where supported; Codex
|
|
56
|
+
- `--project` for project-level install where supported; Codex and tenex-edge install globally
|
|
52
57
|
- `--global` for user-level install
|
|
53
58
|
- `--list` to inspect available source profiles without installing
|
|
54
59
|
|
|
55
60
|
Human-readable output uses subtle ANSI color. Set `NO_COLOR=1` to disable color,
|
|
56
|
-
or pass `--json` for machine-readable output. After an install, the CLI
|
|
57
|
-
|
|
58
|
-
`codex --profile <profile
|
|
61
|
+
or pass `--json` for machine-readable output. After an install, the CLI groups
|
|
62
|
+
run commands by profile for target harness CLIs it finds on `PATH`, such as
|
|
63
|
+
`codex --profile <profile>`, `claude --agent <profile>`, or
|
|
64
|
+
`tenex-edge launch <profile>`.
|
|
59
65
|
|
|
60
66
|
## Harness Targets
|
|
61
67
|
|
|
@@ -64,12 +70,14 @@ Project installs write to:
|
|
|
64
70
|
- Codex: not supported; Codex profiles load from user config
|
|
65
71
|
- Claude Code: `.claude/agents/<profile>.md`
|
|
66
72
|
- OpenCode: `.opencode/agents/<profile>.md`
|
|
73
|
+
- tenex-edge: not supported; tenex-edge agents are machine-local
|
|
67
74
|
|
|
68
75
|
Global installs write to:
|
|
69
76
|
|
|
70
77
|
- Codex: `$CODEX_HOME/<profile>.config.toml`, or `~/.codex/<profile>.config.toml`
|
|
71
78
|
- Claude Code: `$CLAUDE_HOME/agents/<profile>.md`, or `~/.claude/agents/<profile>.md`
|
|
72
79
|
- OpenCode: `$OPENCODE_CONFIG_DIR/agents/<profile>.md`, or `~/.config/opencode/agents/<profile>.md`
|
|
80
|
+
- tenex-edge: `$TENEX_EDGE_HOME/agents/<profile>.json`, or `~/.tenex-edge/agents/<profile>.json`
|
|
73
81
|
|
|
74
82
|
The CLI keeps its own registry at `.awesome-agents/installed.json` for project
|
|
75
83
|
installs or `~/.awesome-agents/installed.json` for global installs. `list`,
|
|
@@ -95,6 +103,9 @@ agents/
|
|
|
95
103
|
agent.yaml
|
|
96
104
|
ops-agent/
|
|
97
105
|
agent.agf.yaml
|
|
106
|
+
skills/
|
|
107
|
+
gh-pages-publisher/
|
|
108
|
+
SKILL.md
|
|
98
109
|
scripts/
|
|
99
110
|
heartbeat.sh
|
|
100
111
|
references/
|
|
@@ -105,6 +116,19 @@ YAML profile files are preferred. The loader also accepts Markdown files with
|
|
|
105
116
|
YAML frontmatter for compatibility with tools that use `.agent.md`-style
|
|
106
117
|
profiles. Agent-owned `scripts/` and `references/` are installed into
|
|
107
118
|
`~/.agents/homes/<slug>/scripts` and `~/.agents/homes/<slug>/references`.
|
|
119
|
+
Profiles may also declare immediately relevant skills:
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
skills:
|
|
123
|
+
- gh-pages-publisher
|
|
124
|
+
- pablof7z/tenex-edge basic-skill
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Bare skill names are resolved from the profile directory, then the source
|
|
128
|
+
checkout, then `~/.agents/skills`. Source-qualified entries use the same source
|
|
129
|
+
plus skill selector shape as `npx skills add <source> --skill <skill>`.
|
|
130
|
+
Declared skills are copied into `~/.agents/homes/<slug>/skills/<skill>` and
|
|
131
|
+
listed with complete paths in the installed agent prompt.
|
|
108
132
|
|
|
109
133
|
## Examples
|
|
110
134
|
|
|
@@ -112,6 +136,7 @@ profiles. Agent-owned `scripts/` and `references/` are installed into
|
|
|
112
136
|
npx awesome-agents add owner/repo --list
|
|
113
137
|
npx awesome-agents add owner/repo --agent triage-agent
|
|
114
138
|
npx awesome-agents add owner/repo --agent triage-agent --harness codex --global
|
|
139
|
+
npx awesome-agents add owner/repo --agent triage-agent --harness tenex-edge
|
|
115
140
|
npx awesome-agents add owner/repo --all --dry-run
|
|
116
141
|
npx awesome-agents use owner/repo --agent triage-agent --harness claude-code
|
|
117
142
|
npx awesome-agents list --json
|
package/docs/cli.md
CHANGED
|
@@ -10,11 +10,16 @@
|
|
|
10
10
|
- `update` / `upgrade` reinstalls from the recorded source.
|
|
11
11
|
- `init` creates a profile source skeleton.
|
|
12
12
|
|
|
13
|
-
The CLI
|
|
14
|
-
|
|
15
|
-
default
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
The CLI stays scriptable by default. In an interactive terminal, `add` opens a
|
|
14
|
+
checkbox selector when no profile selector is provided; every source profile is
|
|
15
|
+
selected by default. When no target harness is provided, `add` detects supported
|
|
16
|
+
harness CLIs on `PATH`; multiple detected harnesses open a checkbox selector
|
|
17
|
+
with every harness selected by default. Non-TTY runs, `--json`, and `--yes` use
|
|
18
|
+
all detected selections without prompting. Installs default to project scope
|
|
19
|
+
where the selected harness supports project-local profiles. Codex and tenex-edge
|
|
20
|
+
are exceptions: Codex `--profile` loads named config layers from `CODEX_HOME`,
|
|
21
|
+
while tenex-edge agents live in its machine keystore under
|
|
22
|
+
`$TENEX_EDGE_HOME/agents/` or `~/.tenex-edge/agents/`.
|
|
18
23
|
|
|
19
24
|
## Source Resolution
|
|
20
25
|
|
|
@@ -51,18 +56,34 @@ generated profile is installed:
|
|
|
51
56
|
npx awesome-agents add owner/repo --agent triage-agent --harness opencode
|
|
52
57
|
```
|
|
53
58
|
|
|
54
|
-
For backward compatibility, `--agent codex`, `--agent claude-code`,
|
|
55
|
-
`--agent opencode` are still accepted as harness
|
|
59
|
+
For backward compatibility, `--agent codex`, `--agent claude-code`,
|
|
60
|
+
`--agent opencode`, and `--agent tenex-edge` are still accepted as harness
|
|
61
|
+
selectors.
|
|
62
|
+
|
|
63
|
+
When no harness selector is provided, `add` detects `codex`, `claude`,
|
|
64
|
+
`opencode`, and `tenex-edge` on `PATH`. If none are found, the command fails and
|
|
65
|
+
asks for `--harness`.
|
|
66
|
+
|
|
67
|
+
When no profile selector is provided in an interactive terminal, `add` prompts
|
|
68
|
+
with a checkbox list of source profiles and their summaries. Pressing Enter
|
|
69
|
+
accepts the default of installing every listed profile. Scripts can use `--yes`,
|
|
70
|
+
`--json`, or a non-TTY stdin/stdout path to keep the same noninteractive default.
|
|
56
71
|
|
|
57
72
|
The `--skill` flag is accepted only as a command-shape alias for `--profile`.
|
|
58
73
|
Installed artifacts remain operational agent profiles.
|
|
59
74
|
|
|
75
|
+
Profiles may still declare immediately relevant skills in their source
|
|
76
|
+
definition. Those dependencies are copied into
|
|
77
|
+
`~/.agents/homes/<profile>/skills/<skill>` and appended to the installed prompt
|
|
78
|
+
with complete paths; this does not make the profile itself a skill.
|
|
79
|
+
|
|
60
80
|
After install, human-readable output should show the CLI command to run each
|
|
61
81
|
installed profile through any matching harness CLI found on `PATH`. Examples:
|
|
62
82
|
|
|
63
83
|
```bash
|
|
64
84
|
codex --profile triage-agent
|
|
65
85
|
claude --agent triage-agent
|
|
86
|
+
tenex-edge launch triage-agent
|
|
66
87
|
```
|
|
67
88
|
|
|
68
89
|
## Install Safety
|
package/docs/product/README.md
CHANGED
|
@@ -11,7 +11,7 @@ unless the user confirms them.
|
|
|
11
11
|
- `product-scope.md`: What `awesome-agents` is for and how it differs from skills.
|
|
12
12
|
- `command-model.md`: Command shape, `npx skills` parity, defaults, and scriptability.
|
|
13
13
|
- `profile-source-format.md`: Source repositories, canonical profiles, adapters, and install sources.
|
|
14
|
-
- `harness-targets.md`: Codex, Claude Code, and
|
|
14
|
+
- `harness-targets.md`: Codex, Claude Code, OpenCode, and tenex-edge rendering/target behavior.
|
|
15
15
|
- `safety-and-publishing.md`: Install safety, registry behavior, verification, and npm/GitHub publish state.
|
|
16
16
|
- `open-questions.md`: Unresolved product questions.
|
|
17
17
|
|
|
@@ -24,9 +24,9 @@ The CLI supports:
|
|
|
24
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
|
-
- `--harness <codex|claude-code|opencode|*>` to select target harnesses.
|
|
28
|
-
- `--agent <codex|claude-code|opencode|*>` remains accepted as a
|
|
29
|
-
selector when the value is a known harness or harness alias.
|
|
27
|
+
- `--harness <codex|claude-code|opencode|tenex-edge|*>` to select target harnesses.
|
|
28
|
+
- `--agent <codex|claude-code|opencode|tenex-edge|*>` remains accepted as a
|
|
29
|
+
legacy harness selector when the value is a known harness or harness alias.
|
|
30
30
|
- `--all` to install every profile.
|
|
31
31
|
- `--list` to inspect source profiles before installing.
|
|
32
32
|
|
|
@@ -36,16 +36,17 @@ Accepted implementation decision:
|
|
|
36
36
|
|
|
37
37
|
- Install scope defaults to project where the target harness supports project-local profiles.
|
|
38
38
|
- Codex is an exception because `codex --profile <name>` loads
|
|
39
|
-
`$CODEX_HOME/<name>.config.toml`.
|
|
40
|
-
|
|
39
|
+
`$CODEX_HOME/<name>.config.toml`. tenex-edge is also global because invitable
|
|
40
|
+
local agents live under `$TENEX_EDGE_HOME/agents/` or `~/.tenex-edge/agents/`.
|
|
41
41
|
- When no `--harness` or legacy harness-valued `--agent` is provided, the CLI
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
-
|
|
42
|
+
detects supported harness CLIs on `PATH` (`codex`, `claude`, `opencode`, and
|
|
43
|
+
`tenex-edge`).
|
|
44
|
+
- If one harness is detected, install to it. If multiple harnesses are detected,
|
|
45
|
+
interactive installs open a checkbox selector with every detected harness
|
|
46
|
+
selected by default; noninteractive, `--json`, and `--yes` installs use every
|
|
47
|
+
detected harness.
|
|
48
|
+
- If no harness is detected, fail with a clear message asking for `--harness`.
|
|
49
|
+
- `--harness <harness>` (or a harness-valued `--agent`) overrides detection.
|
|
49
50
|
|
|
50
51
|
## Scriptability
|
|
51
52
|
|
|
@@ -9,6 +9,7 @@ Initial harness targets:
|
|
|
9
9
|
- Codex
|
|
10
10
|
- Claude Code
|
|
11
11
|
- OpenCode
|
|
12
|
+
- tenex-edge
|
|
12
13
|
|
|
13
14
|
## Codex
|
|
14
15
|
|
|
@@ -53,8 +54,29 @@ Generated OpenCode agents install to:
|
|
|
53
54
|
|
|
54
55
|
OpenCode output is Markdown with frontmatter and a generated marker.
|
|
55
56
|
|
|
57
|
+
## tenex-edge
|
|
58
|
+
|
|
59
|
+
Generated tenex-edge agents install to:
|
|
60
|
+
|
|
61
|
+
- Project: not supported; tenex-edge agents are machine-local
|
|
62
|
+
- Global: `$TENEX_EDGE_HOME/agents/<profile>.json`, or `~/.tenex-edge/agents/<profile>.json`
|
|
63
|
+
|
|
64
|
+
Run with:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
tenex-edge launch <profile>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
The generated JSON is a tenex-edge local agent keystore entry with:
|
|
71
|
+
|
|
72
|
+
- a generated Nostr keypair, preserved across reinstalls
|
|
73
|
+
- `command: ["claude"]`
|
|
74
|
+
- an inline Claude `agent` definition passed by tenex-edge as `--agents`
|
|
75
|
+
- a byline derived from the profile summary
|
|
76
|
+
|
|
56
77
|
## Adapter Gaps
|
|
57
78
|
|
|
58
79
|
Some source repositories may provide Codex adapters first. Claude Code and
|
|
59
80
|
OpenCode use generated defaults unless a source repository adds native adapters
|
|
60
|
-
for those harnesses.
|
|
81
|
+
for those harnesses. tenex-edge uses a native adapter when present, otherwise it
|
|
82
|
+
reuses the Claude Code adapter before falling back to the base profile.
|
|
@@ -9,7 +9,7 @@ These notes capture what `awesome-agents` is and why it exists.
|
|
|
9
9
|
- Its command structure should mirror `npx skills`, but for agent profiles.
|
|
10
10
|
- It should install profiles from any explicit source repository that follows
|
|
11
11
|
the `agents/<slug>/agent.yaml` source layout.
|
|
12
|
-
-
|
|
12
|
+
- Harness targets are Codex, Claude Code, OpenCode, and tenex-edge.
|
|
13
13
|
- The package should be published after the scaffold works.
|
|
14
14
|
|
|
15
15
|
## Product Boundary
|
|
@@ -42,6 +42,6 @@ Product correction:
|
|
|
42
42
|
source resolution itself.
|
|
43
43
|
- Source repositories should use one agent definition format per agent directory:
|
|
44
44
|
`agents/<slug>/agent.yaml` plus colocated support material.
|
|
45
|
-
- `awesome-agents` installs
|
|
46
|
-
`~/.agents/homes/<slug>/` and transcribes the agent
|
|
47
|
-
harness.
|
|
45
|
+
- `awesome-agents` installs local support material and declared immediately
|
|
46
|
+
relevant skills into `~/.agents/homes/<slug>/` and transcribes the agent
|
|
47
|
+
definition to the target harness.
|
|
@@ -10,6 +10,7 @@ The source format is intentionally repo-neutral:
|
|
|
10
10
|
agents/
|
|
11
11
|
<profile>/
|
|
12
12
|
agent.yaml
|
|
13
|
+
skills/
|
|
13
14
|
scripts/
|
|
14
15
|
references/
|
|
15
16
|
```
|
|
@@ -27,6 +28,20 @@ agents/<profile>/scripts/*
|
|
|
27
28
|
agents/<profile>/references/*
|
|
28
29
|
```
|
|
29
30
|
|
|
31
|
+
Immediately relevant skills can be declared in the profile definition:
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
skills:
|
|
35
|
+
- gh-pages-publisher
|
|
36
|
+
- pablof7z/tenex-edge basic-skill
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Bare skill names resolve from the profile directory, then the source checkout,
|
|
40
|
+
then from `~/.agents/skills`. Source-qualified entries use the same source plus
|
|
41
|
+
skill selector shape as `npx skills add <source> --skill <skill>`. Installed
|
|
42
|
+
skills are copied into `~/.agents/homes/<profile>/skills/<skill>` and appended
|
|
43
|
+
to the rendered agent prompt with complete paths.
|
|
44
|
+
|
|
30
45
|
## Profile Files
|
|
31
46
|
|
|
32
47
|
YAML profile files are preferred. The loader should support a pragmatic subset
|
|
@@ -43,6 +58,8 @@ The CLI should preserve canonical profile content and generate harness-specific
|
|
|
43
58
|
Agent-owned scripts and references should be installed into
|
|
44
59
|
`~/.agents/homes/<profile>/scripts` and
|
|
45
60
|
`~/.agents/homes/<profile>/references`.
|
|
61
|
+
Declared skills should be installed into
|
|
62
|
+
`~/.agents/homes/<profile>/skills/<skill>`.
|
|
46
63
|
|
|
47
64
|
Profile source files are intentionally under `agents/`, not `skills/`, because
|
|
48
65
|
the source format models agent profiles separately from loadable skills.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "awesome-agents",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Install reusable agent profiles into Codex, Claude Code, and
|
|
3
|
+
"version": "0.1.6",
|
|
4
|
+
"description": "Install reusable agent profiles into Codex, Claude Code, OpenCode, and tenex-edge.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"awesome-agents": "bin/awesome-agents.js"
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"node": ">=22.12.0"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
+
"@inquirer/checkbox": "^4.3.2",
|
|
46
47
|
"commander": "^15.0.0",
|
|
47
48
|
"yaml": "^2.9.0"
|
|
48
49
|
}
|
package/src/cli.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import
|
|
2
|
+
import checkbox from "@inquirer/checkbox";
|
|
3
|
+
import { stripVTControlCharacters } from "node:util";
|
|
4
|
+
import { HARNESS_COMMANDS, PACKAGE_NAME, PACKAGE_VERSION, SUPPORTED_AGENTS } from "./constants.js";
|
|
3
5
|
import { configureHelp, formatMissingSourceError, ui } from "./help.js";
|
|
4
6
|
import {
|
|
5
7
|
initProfile,
|
|
@@ -15,7 +17,7 @@ export async function run(argv = process.argv) {
|
|
|
15
17
|
const program = new Command();
|
|
16
18
|
program
|
|
17
19
|
.name(PACKAGE_NAME)
|
|
18
|
-
.description("Install reusable agent profiles into Codex, Claude Code, and
|
|
20
|
+
.description("Install reusable agent profiles into Codex, Claude Code, OpenCode, and tenex-edge.")
|
|
19
21
|
.version(PACKAGE_VERSION, "-v, --version")
|
|
20
22
|
.helpOption("-h, --help", "Show this help message")
|
|
21
23
|
.showHelpAfterError();
|
|
@@ -140,14 +142,14 @@ function addInstallCommand(program, commandName) {
|
|
|
140
142
|
.argument("[source]", "Local path, GitHub owner/repo, or GitHub URL")
|
|
141
143
|
.description(commandName === "install" ? "Alias for add" : "Install agent profiles from a source")
|
|
142
144
|
.option("-g, --global", "Install globally")
|
|
143
|
-
.option("-p, --project", "Install into the current project; not supported for Codex profiles")
|
|
145
|
+
.option("-p, --project", "Install into the current project; not supported for Codex or tenex-edge profiles")
|
|
144
146
|
.option("-a, --agent <agents...>", "Agent profile slugs to install; accepts harness names for backward compatibility")
|
|
145
147
|
.option("--harness <harnesses...>", `Target harnesses (${SUPPORTED_AGENTS.join(", ")}, or *)`)
|
|
146
148
|
.option("--target <harnesses...>", "Compatibility alias for --harness")
|
|
147
149
|
.option("-s, --profile <profiles...>", "Profile slugs to install (or *)")
|
|
148
150
|
.option("--skill <profiles...>", "Compatibility alias for --profile")
|
|
149
151
|
.option("-l, --list", "List available profiles in the source without installing")
|
|
150
|
-
.option("-y, --yes", "
|
|
152
|
+
.option("-y, --yes", "Accept detected profile and harness selections without opening selectors")
|
|
151
153
|
.option("--all", "Install all profiles to all supported agents")
|
|
152
154
|
.option("--dry-run", "Print planned installs without writing files")
|
|
153
155
|
.option("--force", "Allow overwriting files without the generated marker")
|
|
@@ -170,7 +172,11 @@ function addInstallCommand(program, commandName) {
|
|
|
170
172
|
return;
|
|
171
173
|
}
|
|
172
174
|
|
|
173
|
-
const result = await installFromSource(source,
|
|
175
|
+
const result = await installFromSource(source, {
|
|
176
|
+
...options,
|
|
177
|
+
chooseProfiles: shouldPromptForProfiles(options) ? promptProfileSelection : undefined,
|
|
178
|
+
chooseHarnesses: shouldPromptForHarnesses(options) ? promptHarnessSelection : undefined
|
|
179
|
+
});
|
|
174
180
|
if (options.json) {
|
|
175
181
|
printJson(result);
|
|
176
182
|
} else {
|
|
@@ -186,7 +192,12 @@ function printAvailable(profiles) {
|
|
|
186
192
|
}
|
|
187
193
|
console.log(ui.bold("Available profiles:"));
|
|
188
194
|
for (const profile of profiles) {
|
|
189
|
-
|
|
195
|
+
const summary = profile.summary || profile.name;
|
|
196
|
+
console.log(` ${ui.profile(profile.slug)} ${ui.dim(shortText(summary, 100))}`);
|
|
197
|
+
const details = formatProfileDetails(profile);
|
|
198
|
+
if (details) {
|
|
199
|
+
console.log(` ${details}`);
|
|
200
|
+
}
|
|
190
201
|
}
|
|
191
202
|
}
|
|
192
203
|
|
|
@@ -216,6 +227,9 @@ function printOperations(operations, registryPath, runInstructions = []) {
|
|
|
216
227
|
if (registryPath) {
|
|
217
228
|
console.log(`${ui.bold("Registry:")} ${ui.path(registryPath)}`);
|
|
218
229
|
}
|
|
230
|
+
if (runInstructions.length > 0) {
|
|
231
|
+
console.log("");
|
|
232
|
+
}
|
|
219
233
|
printRunInstructions(runInstructions);
|
|
220
234
|
}
|
|
221
235
|
|
|
@@ -225,10 +239,11 @@ function printRunInstructions(runInstructions = []) {
|
|
|
225
239
|
}
|
|
226
240
|
|
|
227
241
|
console.log(ui.bold("Run installed profiles:"));
|
|
228
|
-
for (const
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
242
|
+
for (const group of groupRunInstructions(runInstructions)) {
|
|
243
|
+
const summary = group.summary ? ` -- ${ui.dim(shortText(group.summary, 120))}` : "";
|
|
244
|
+
console.log(` ${ui.profile(group.profile)}${summary}`);
|
|
245
|
+
for (const instruction of group.instructions) {
|
|
246
|
+
console.log(` ${ui.command(runHarnessLabel(instruction.harness))}: ${ui.command(instruction.command)}`);
|
|
232
247
|
}
|
|
233
248
|
}
|
|
234
249
|
}
|
|
@@ -243,3 +258,118 @@ function formatAction(action) {
|
|
|
243
258
|
}
|
|
244
259
|
return ui.success(action);
|
|
245
260
|
}
|
|
261
|
+
|
|
262
|
+
function shouldPromptForProfiles(options) {
|
|
263
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY && !options.json && !options.yes);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function shouldPromptForHarnesses(options) {
|
|
267
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY && !options.json && !options.yes);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
async function promptProfileSelection(profiles) {
|
|
271
|
+
if (profiles.length === 0) {
|
|
272
|
+
return [];
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return checkbox({
|
|
276
|
+
message: "Select agent profiles to install",
|
|
277
|
+
choices: profiles.map((profile) => {
|
|
278
|
+
const name = formatPromptChoice(profile);
|
|
279
|
+
return {
|
|
280
|
+
value: profile.slug,
|
|
281
|
+
name,
|
|
282
|
+
checkedName: name,
|
|
283
|
+
short: profile.slug,
|
|
284
|
+
description: formatPromptDescription(profile),
|
|
285
|
+
checked: true
|
|
286
|
+
};
|
|
287
|
+
}),
|
|
288
|
+
pageSize: Math.min(Math.max(profiles.length, 7), 12),
|
|
289
|
+
required: true,
|
|
290
|
+
loop: false
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
async function promptHarnessSelection(harnesses) {
|
|
295
|
+
return checkbox({
|
|
296
|
+
message: "Select target harnesses",
|
|
297
|
+
choices: harnesses.map((harness) => {
|
|
298
|
+
const name = formatHarnessChoice(harness);
|
|
299
|
+
return {
|
|
300
|
+
value: harness,
|
|
301
|
+
name,
|
|
302
|
+
checkedName: name,
|
|
303
|
+
short: harness,
|
|
304
|
+
checked: true
|
|
305
|
+
};
|
|
306
|
+
}),
|
|
307
|
+
pageSize: Math.min(Math.max(harnesses.length, 4), 8),
|
|
308
|
+
required: true,
|
|
309
|
+
loop: false
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function formatHarnessChoice(harness) {
|
|
314
|
+
const command = HARNESS_COMMANDS.get(harness);
|
|
315
|
+
return command ? `${ui.command(harness)} ${ui.dim(`detected: ${command}`)}` : ui.command(harness);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function formatPromptChoice(profile) {
|
|
319
|
+
const summary = profile.summary || profile.name;
|
|
320
|
+
return `${ui.profile(profile.slug)} ${ui.dim(shortText(summary, 88))}`;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
function formatPromptDescription(profile) {
|
|
324
|
+
return [
|
|
325
|
+
profile.summary || profile.name,
|
|
326
|
+
formatProfileDetails(profile)
|
|
327
|
+
].filter(Boolean).join("\n");
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
function formatProfileDetails(profile) {
|
|
331
|
+
const details = [];
|
|
332
|
+
if (profile.kind) {
|
|
333
|
+
details.push(`kind: ${profile.kind}`);
|
|
334
|
+
}
|
|
335
|
+
if (profile.adapters?.length) {
|
|
336
|
+
details.push(`custom adapters: ${profile.adapters.join(", ")}`);
|
|
337
|
+
}
|
|
338
|
+
return details.length > 0 ? ui.dim(details.join(" | ")) : "";
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function groupRunInstructions(runInstructions) {
|
|
342
|
+
const groups = new Map();
|
|
343
|
+
for (const instruction of runInstructions) {
|
|
344
|
+
const key = instruction.profile;
|
|
345
|
+
if (!groups.has(key)) {
|
|
346
|
+
groups.set(key, {
|
|
347
|
+
profile: instruction.profile,
|
|
348
|
+
name: instruction.name,
|
|
349
|
+
summary: instruction.summary,
|
|
350
|
+
instructions: []
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
groups.get(key).instructions.push(instruction);
|
|
354
|
+
}
|
|
355
|
+
return [...groups.values()];
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function runHarnessLabel(harness) {
|
|
359
|
+
if (harness === "claude-code") {
|
|
360
|
+
return "claude";
|
|
361
|
+
}
|
|
362
|
+
return harness;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function shortText(value, maxLength) {
|
|
366
|
+
const text = stripVTControlCharacters(String(value ?? ""))
|
|
367
|
+
.replace(/\s+/g, " ")
|
|
368
|
+
.trim();
|
|
369
|
+
|
|
370
|
+
if (text.length <= maxLength) {
|
|
371
|
+
return text;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return `${text.slice(0, Math.max(0, maxLength - 3)).trimEnd()}...`;
|
|
375
|
+
}
|
package/src/constants.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const PACKAGE_NAME = "awesome-agents";
|
|
2
|
-
export const PACKAGE_VERSION = "0.1.
|
|
2
|
+
export const PACKAGE_VERSION = "0.1.6";
|
|
3
3
|
export const DEFAULT_AGENT = "codex";
|
|
4
|
-
export const SUPPORTED_AGENTS = ["codex", "claude-code", "opencode"];
|
|
4
|
+
export const SUPPORTED_AGENTS = ["codex", "claude-code", "opencode", "tenex-edge"];
|
|
5
5
|
export const REGISTRY_DIRNAME = ".awesome-agents";
|
|
6
6
|
export const REGISTRY_FILENAME = "installed.json";
|
|
7
7
|
export const GENERATED_MARKER = "Generated by awesome-agents";
|
|
@@ -14,12 +14,16 @@ export const AGENT_ALIASES = new Map([
|
|
|
14
14
|
["claude-code", "claude-code"],
|
|
15
15
|
["claudecode", "claude-code"],
|
|
16
16
|
["opencode", "opencode"],
|
|
17
|
-
["open-code", "opencode"]
|
|
17
|
+
["open-code", "opencode"],
|
|
18
|
+
["tenex", "tenex-edge"],
|
|
19
|
+
["tenex-edge", "tenex-edge"],
|
|
20
|
+
["tenexedge", "tenex-edge"]
|
|
18
21
|
]);
|
|
19
22
|
|
|
20
23
|
// The CLI binary used to detect whether a harness is available on PATH.
|
|
21
24
|
export const HARNESS_COMMANDS = new Map([
|
|
22
25
|
["codex", "codex"],
|
|
23
26
|
["claude-code", "claude"],
|
|
24
|
-
["opencode", "opencode"]
|
|
27
|
+
["opencode", "opencode"],
|
|
28
|
+
["tenex-edge", "tenex-edge"]
|
|
25
29
|
]);
|