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 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 OpenCode.
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 opencode
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
- - `--harness codex|claude-code|opencode|*` to select target harnesses; without
47
- it, the CLI installs to every harness whose CLI it finds on `PATH`
48
- (falling back to Codex if none are found)
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 profiles install globally
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 also
57
- prints run commands for target harness CLIs it finds on `PATH`, such as
58
- `codex --profile <profile>` or `claude --agent <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 is noninteractive for the initial scaffold. Options such as `--yes` are
14
- accepted for parity, but command behavior should be fully scriptable. 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.
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`, and
55
- `--agent opencode` are still accepted as harness selectors.
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
@@ -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 OpenCode rendering/target behavior.
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 legacy harness
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`. Codex profile installs should use that
40
- user-level config-layer target.
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
- installs to every supported harness whose CLI is detected on `PATH` (checks
43
- for `codex`, `claude`, `opencode`). If none are detected, it falls back to
44
- Codex only.
45
- - `--harness <harness>` (or a harness-valued `--agent`) narrows the install to
46
- that single harness, overriding detection.
47
- - The CLI is noninteractive in the initial scaffold.
48
- - `--yes` is accepted for command-shape parity, but prompts are not currently required.
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
- - Initial harness targets are Codex, Claude Code, and OpenCode.
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 that local support material into
46
- `~/.agents/homes/<slug>/` and transcribes the agent definition to the target
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.5",
4
- "description": "Install reusable agent profiles into Codex, Claude Code, and OpenCode.",
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 { PACKAGE_NAME, PACKAGE_VERSION, SUPPORTED_AGENTS } from "./constants.js";
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 OpenCode.")
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", "Accepted for npx skills parity; prompts are not used")
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, options);
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
- console.log(` ${ui.profile(profile.slug)} ${profile.summary || profile.name}`);
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 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}`);
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.5";
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
  ]);