@phnx-labs/agents-cli 0.1.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -96
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +17 -135
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +3 -30
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +3 -37
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/sessions.d.ts.map +1 -1
- package/dist/commands/sessions.js +0 -100
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +2 -42
- package/dist/commands/view.js.map +1 -1
- package/dist/index.js +8 -37
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/hooks.test.js +2 -2
- package/dist/lib/__tests__/hooks.test.js.map +1 -1
- package/dist/lib/__tests__/models.test.js +1 -56
- package/dist/lib/__tests__/models.test.js.map +1 -1
- package/dist/lib/__tests__/usage.test.js +2 -4
- package/dist/lib/__tests__/usage.test.js.map +1 -1
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/agents.js +2 -10
- package/dist/lib/agents.js.map +1 -1
- package/dist/lib/exec.d.ts +1 -4
- package/dist/lib/exec.d.ts.map +1 -1
- package/dist/lib/exec.js +15 -24
- package/dist/lib/exec.js.map +1 -1
- package/dist/lib/hooks.d.ts.map +1 -1
- package/dist/lib/hooks.js +1 -153
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/models.d.ts +10 -18
- package/dist/lib/models.d.ts.map +1 -1
- package/dist/lib/models.js +12 -380
- package/dist/lib/models.js.map +1 -1
- package/dist/lib/session/types.d.ts +0 -8
- package/dist/lib/session/types.d.ts.map +1 -1
- package/dist/lib/shims.d.ts +2 -31
- package/dist/lib/shims.d.ts.map +1 -1
- package/dist/lib/shims.js +24 -75
- package/dist/lib/shims.js.map +1 -1
- package/dist/lib/state.d.ts +0 -7
- package/dist/lib/state.d.ts.map +1 -1
- package/dist/lib/state.js +1 -14
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/usage.d.ts +0 -16
- package/dist/lib/usage.d.ts.map +1 -1
- package/dist/lib/usage.js +10 -27
- package/dist/lib/usage.js.map +1 -1
- package/dist/lib/versions.d.ts +1 -7
- package/dist/lib/versions.d.ts.map +1 -1
- package/dist/lib/versions.js +8 -30
- package/dist/lib/versions.js.map +1 -1
- package/package.json +2 -2
- package/dist/commands/cloud.d.ts +0 -3
- package/dist/commands/cloud.d.ts.map +0 -1
- package/dist/commands/cloud.js +0 -322
- package/dist/commands/cloud.js.map +0 -1
- package/dist/commands/profiles.d.ts +0 -3
- package/dist/commands/profiles.d.ts.map +0 -1
- package/dist/commands/profiles.js +0 -242
- package/dist/commands/profiles.js.map +0 -1
- package/dist/commands/secrets.d.ts +0 -3
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js +0 -339
- package/dist/commands/secrets.js.map +0 -1
- package/dist/lib/__tests__/rotate.test.d.ts +0 -2
- package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
- package/dist/lib/__tests__/rotate.test.js +0 -80
- package/dist/lib/__tests__/rotate.test.js.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
- package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
- package/dist/lib/__tests__/secrets.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets.test.js +0 -90
- package/dist/lib/__tests__/secrets.test.js.map +0 -1
- package/dist/lib/__tests__/shims.test.d.ts +0 -2
- package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
- package/dist/lib/__tests__/shims.test.js +0 -39
- package/dist/lib/__tests__/shims.test.js.map +0 -1
- package/dist/lib/__tests__/versions.test.d.ts +0 -2
- package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
- package/dist/lib/__tests__/versions.test.js +0 -63
- package/dist/lib/__tests__/versions.test.js.map +0 -1
- package/dist/lib/cloud/codex.d.ts +0 -19
- package/dist/lib/cloud/codex.d.ts.map +0 -1
- package/dist/lib/cloud/codex.js +0 -210
- package/dist/lib/cloud/codex.js.map +0 -1
- package/dist/lib/cloud/factory.d.ts +0 -26
- package/dist/lib/cloud/factory.d.ts.map +0 -1
- package/dist/lib/cloud/factory.js +0 -37
- package/dist/lib/cloud/factory.js.map +0 -1
- package/dist/lib/cloud/registry.d.ts +0 -6
- package/dist/lib/cloud/registry.d.ts.map +0 -1
- package/dist/lib/cloud/registry.js +0 -56
- package/dist/lib/cloud/registry.js.map +0 -1
- package/dist/lib/cloud/rush.d.ts +0 -15
- package/dist/lib/cloud/rush.d.ts.map +0 -1
- package/dist/lib/cloud/rush.js +0 -185
- package/dist/lib/cloud/rush.js.map +0 -1
- package/dist/lib/cloud/store.d.ts +0 -10
- package/dist/lib/cloud/store.d.ts.map +0 -1
- package/dist/lib/cloud/store.js +0 -96
- package/dist/lib/cloud/store.js.map +0 -1
- package/dist/lib/cloud/stream.d.ts +0 -18
- package/dist/lib/cloud/stream.d.ts.map +0 -1
- package/dist/lib/cloud/stream.js +0 -138
- package/dist/lib/cloud/stream.js.map +0 -1
- package/dist/lib/cloud/types.d.ts +0 -60
- package/dist/lib/cloud/types.d.ts.map +0 -1
- package/dist/lib/cloud/types.js +0 -2
- package/dist/lib/cloud/types.js.map +0 -1
- package/dist/lib/profiles-keychain.d.ts +0 -3
- package/dist/lib/profiles-keychain.d.ts.map +0 -1
- package/dist/lib/profiles-keychain.js +0 -10
- package/dist/lib/profiles-keychain.js.map +0 -1
- package/dist/lib/profiles-presets.d.ts +0 -15
- package/dist/lib/profiles-presets.d.ts.map +0 -1
- package/dist/lib/profiles-presets.js +0 -95
- package/dist/lib/profiles-presets.js.map +0 -1
- package/dist/lib/profiles.d.ts +0 -35
- package/dist/lib/profiles.d.ts.map +0 -1
- package/dist/lib/profiles.js +0 -123
- package/dist/lib/profiles.js.map +0 -1
- package/dist/lib/rotate.d.ts +0 -52
- package/dist/lib/rotate.d.ts.map +0 -1
- package/dist/lib/rotate.js +0 -87
- package/dist/lib/rotate.js.map +0 -1
- package/dist/lib/secrets-bundles.d.ts +0 -29
- package/dist/lib/secrets-bundles.d.ts.map +0 -1
- package/dist/lib/secrets-bundles.js +0 -168
- package/dist/lib/secrets-bundles.js.map +0 -1
- package/dist/lib/secrets.d.ts +0 -27
- package/dist/lib/secrets.d.ts.map +0 -1
- package/dist/lib/secrets.js +0 -127
- package/dist/lib/secrets.js.map +0 -1
- package/dist/lib/session/artifacts.d.ts +0 -5
- package/dist/lib/session/artifacts.d.ts.map +0 -1
- package/dist/lib/session/artifacts.js +0 -75
- package/dist/lib/session/artifacts.js.map +0 -1
package/README.md
CHANGED
|
@@ -20,8 +20,6 @@ Also available as `ag` — all commands work with both `agents` and `ag`.
|
|
|
20
20
|
## Table of contents
|
|
21
21
|
|
|
22
22
|
- [Run any agent, same interface](#run-any-agent-same-interface)
|
|
23
|
-
- [Run open-source models through Claude Code](#run-open-source-models-through-claude-code)
|
|
24
|
-
- [Keep secrets out of plaintext env files](#keep-secrets-out-of-plaintext-env-files)
|
|
25
23
|
- [Put agents on a team](#put-agents-on-a-team)
|
|
26
24
|
- [Non-interactive usage](#non-interactive-usage)
|
|
27
25
|
- [Search sessions fast](#search-sessions-fast)
|
|
@@ -46,9 +44,19 @@ agents run gemini "Write tests for the fixed code"
|
|
|
46
44
|
|
|
47
45
|
Each agent resolves to the project-pinned version, with the right skills, MCP servers, and permissions already synced. No setup between steps -- just run.
|
|
48
46
|
|
|
49
|
-
`agents run` also passes environment overrides to the spawned CLI
|
|
47
|
+
`agents run` also passes through environment overrides to the spawned CLI, so Claude can target any Anthropic-compatible endpoint:
|
|
50
48
|
|
|
51
|
-
|
|
49
|
+
```bash
|
|
50
|
+
agents run claude "Reply with exactly: agents-qwen route ok" \
|
|
51
|
+
--mode full \
|
|
52
|
+
--model qwen3.6:35b \
|
|
53
|
+
--env ANTHROPIC_BASE_URL=https://ollama.example.com \
|
|
54
|
+
--env ANTHROPIC_AUTH_TOKEN="$(security find-generic-password -a "$USER" -s ollama-auth-token -w)" \
|
|
55
|
+
--env ANTHROPIC_MODEL=qwen3.6:35b \
|
|
56
|
+
--env ANTHROPIC_SMALL_FAST_MODEL=qwen3.6:35b
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
This makes agent pipelines possible. Chain agents by strength, swap one for another, script them in CI -- the interface stays the same:
|
|
52
60
|
|
|
53
61
|
```bash
|
|
54
62
|
# Friday night code review
|
|
@@ -65,84 +73,6 @@ Supports plan (read-only) and edit modes, effort levels that map to the right mo
|
|
|
65
73
|
|
|
66
74
|
---
|
|
67
75
|
|
|
68
|
-
## Run open-source models through Claude Code
|
|
69
|
-
|
|
70
|
-
`agents profiles` saves a named bundle of (host CLI, endpoint, model, keychain-backed auth). Ship a preset, paste the API key once, then invoke any open-source model as a first-class agent — no shell function, no plaintext token, no proxy.
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
agents profiles add kimi # prompts for OpenRouter key, stores in Keychain
|
|
74
|
-
agents run kimi "refactor this file" # Claude Code UI, Kimi K2.5 responses
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Built-in presets (all via OpenRouter, one shared key):
|
|
78
|
-
|
|
79
|
-
| Preset | Model | Notes |
|
|
80
|
-
|---|---|---|
|
|
81
|
-
| `kimi` | `moonshotai/kimi-k2.5` | #1 HumanEval (99%), top Kimi. Reasoning — interactive only. |
|
|
82
|
-
| `kimi-chat` | `moonshotai/kimi-k2-0905` | Non-reasoning, print-safe for `agents run`. |
|
|
83
|
-
| `minimax` | `minimax/minimax-m2.5` | #1 SWE-bench Verified (80.2%). Reasoning. |
|
|
84
|
-
| `glm` | `z-ai/glm-5` | #1 Chatbot Arena among open-weight (1451 ELO). |
|
|
85
|
-
| `qwen` | `qwen/qwen3-coder-next` | Latest coding Qwen, sparse MoE 80B/3B active. Print-safe. |
|
|
86
|
-
| `deepseek` | `deepseek/deepseek-chat-v3-0324` | Latest non-reasoning DeepSeek Chat. Print-safe. |
|
|
87
|
-
|
|
88
|
-
`agents profiles presets` lists the catalog. `agents profiles view <name>` shows the env, model, and keychain status.
|
|
89
|
-
|
|
90
|
-
**How it works:** a profile swaps the *model* while keeping Claude Code as the *agent runtime* — same UI, slash commands, skills, MCP tools, permission system. Under the hood it sets `ANTHROPIC_BASE_URL` + `ANTHROPIC_MODEL` and pulls `ANTHROPIC_AUTH_TOKEN` from Keychain at spawn time.
|
|
91
|
-
|
|
92
|
-
Profile YAML lives in `~/.agents/profiles/<name>.yml` with no secrets — safe to `agents push` to a shared repo. Keys live only in macOS Keychain; rotate with `agents profiles login <provider>`.
|
|
93
|
-
|
|
94
|
-
**Custom endpoints** — for self-hosted models (Ollama, vLLM) or other aggregators, drop a YAML file directly:
|
|
95
|
-
|
|
96
|
-
```yaml
|
|
97
|
-
# ~/.agents/profiles/local-qwen.yml
|
|
98
|
-
name: local-qwen
|
|
99
|
-
host: { agent: claude }
|
|
100
|
-
env:
|
|
101
|
-
ANTHROPIC_BASE_URL: https://ollama.internal
|
|
102
|
-
ANTHROPIC_MODEL: qwen3.6:35b
|
|
103
|
-
ANTHROPIC_SMALL_FAST_MODEL: qwen3.6:35b
|
|
104
|
-
auth:
|
|
105
|
-
envVar: ANTHROPIC_AUTH_TOKEN
|
|
106
|
-
keychainItem: agents-cli.ollama.token
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
Then `agents profiles login ollama` to store the token, and `agents run local-qwen "..."` works.
|
|
110
|
-
|
|
111
|
-
**Note on `--print` and reasoning models:** Claude Code's `--print` mode consolidates response text, but returns empty when the response contains `thinking` blocks. Models flagged REASONING in the preset descriptions work fine interactively (plain `claude` launch with the same env) but not with `agents run --print`. Use the non-reasoning `-chat` variant for scripting.
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## Keep secrets out of plaintext env files
|
|
116
|
-
|
|
117
|
-
`agents secrets` stores sensitive values (API keys, tokens, even a test credit card number) in the macOS Keychain and injects them into agents at run time. Bundle files on disk contain only references — safe to `agents push` to a shared repo.
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
agents secrets add prod-stripe --description "Stripe prod + test card"
|
|
121
|
-
agents secrets set prod-stripe STRIPE_SECRET_KEY # prompts, stores in keychain
|
|
122
|
-
agents secrets set prod-stripe TEST_CARD_NUMBER # prompts, stores in keychain
|
|
123
|
-
agents secrets set prod-stripe STRIPE_API_VERSION --value "2024-06-20"
|
|
124
|
-
agents secrets set prod-stripe GITHUB_TOKEN --env GH_TOKEN # read from parent shell
|
|
125
|
-
agents secrets set prod-stripe GCP_CREDS --file ~/.config/gcloud/creds.json
|
|
126
|
-
|
|
127
|
-
agents run claude "charge a test card" --secrets prod-stripe
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
The resulting `~/.agents/secrets/prod-stripe.yml` holds only refs:
|
|
131
|
-
|
|
132
|
-
```yaml
|
|
133
|
-
name: prod-stripe
|
|
134
|
-
vars:
|
|
135
|
-
STRIPE_SECRET_KEY: keychain:STRIPE_SECRET_KEY
|
|
136
|
-
TEST_CARD_NUMBER: keychain:TEST_CARD_NUMBER
|
|
137
|
-
STRIPE_API_VERSION: { value: "2024-06-20" }
|
|
138
|
-
GITHUB_TOKEN: env:GH_TOKEN
|
|
139
|
-
GCP_CREDS: file:~/.config/gcloud/creds.json
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Merge order on `agents run` is **profile env < `--secrets <bundle>` < `--env K=V`** — a profile carries provider auth, bundles carry user-defined values, `--env` is the per-invocation override. Resolution happens right before `spawn`; a missing keychain item aborts the run before the child starts.
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
76
|
## Put agents on a team
|
|
147
77
|
|
|
148
78
|
`agents run` runs one agent synchronously. **Teams** run many agents on the same task, in the background, with coordination.
|
|
@@ -232,7 +162,7 @@ agents add claude@2.0.0 # Install specific version
|
|
|
232
162
|
agents use claude@2.0.0 -p # Pin to this project
|
|
233
163
|
```
|
|
234
164
|
|
|
235
|
-
Like `.nvmrc` for Node -- different projects use different agent versions. A shim system reads
|
|
165
|
+
Like `.nvmrc` for Node -- different projects use different agent versions. A shim system reads `.agents-version` and routes to the right binary automatically. No other tool does this for AI agents.
|
|
236
166
|
|
|
237
167
|
When you switch versions, configs are backed up and resources are re-synced. Each version gets its own isolated home directory with the right skills, commands, and permissions already in place.
|
|
238
168
|
|
|
@@ -383,18 +313,6 @@ agents install mcp:<name> # Install + register
|
|
|
383
313
|
agents mcp list # Show registered servers
|
|
384
314
|
agents mcp add <name> <cmd> # Register manually
|
|
385
315
|
|
|
386
|
-
# Secrets (keychain-backed env bundles, injected at run time)
|
|
387
|
-
agents secrets list # Show all bundles
|
|
388
|
-
agents secrets add <name> # Create an empty bundle
|
|
389
|
-
agents secrets set <bundle> <KEY> # Prompt, store in keychain, write ref
|
|
390
|
-
agents secrets set <bundle> <KEY> --value <v> # Store as YAML literal
|
|
391
|
-
agents secrets set <bundle> <KEY> --env <VAR> # Inherit from parent shell
|
|
392
|
-
agents secrets set <bundle> <KEY> --file <path> # Read from a file at run time
|
|
393
|
-
agents secrets view <name> [--reveal] # Show bundle (masked by default)
|
|
394
|
-
agents secrets import <name> --from .env # Import a dotenv file into keychain
|
|
395
|
-
agents secrets rm <name> # Delete bundle and purge keychain
|
|
396
|
-
agents run <agent> "..." --secrets <name> # Inject a bundle (repeatable)
|
|
397
|
-
|
|
398
316
|
# Sync
|
|
399
317
|
agents pull [source] # Sync from repo
|
|
400
318
|
agents push # Push changes back
|
|
@@ -486,7 +404,7 @@ Each agent CLI has its own config format, its own MCP setup, its own version man
|
|
|
486
404
|
|
|
487
405
|
### Is this like `nvm` / `mise` / `asdf` but for AI agents?
|
|
488
406
|
|
|
489
|
-
For version management, yes — that's the closest analogue. `agents-cli` reads a project
|
|
407
|
+
For version management, yes — that's the closest analogue. `agents-cli` reads `.agents-version` in a project, walks up the directory tree, and routes `claude` / `codex` / `gemini` to the correct installed binary per project. But `agents` also manages agent-native resources (skills, MCP servers, slash commands, hooks, permissions) that language version managers don't touch.
|
|
490
408
|
|
|
491
409
|
### How is this different from Vercel's Open Agents?
|
|
492
410
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsIzD"}
|
package/dist/commands/exec.js
CHANGED
|
@@ -1,27 +1,17 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { buildExecCommand, parseExecEnv, execAgent, runWithFallback, AGENT_COMMANDS, } from '../lib/exec.js';
|
|
3
|
-
import { profileExists, resolveProfileForRun } from '../lib/profiles.js';
|
|
4
|
-
import { readBundle, resolveBundleEnv } from '../lib/secrets-bundles.js';
|
|
5
|
-
import { resolveRunVersion } from '../lib/rotate.js';
|
|
6
3
|
const VALID_AGENTS = Object.keys(AGENT_COMMANDS);
|
|
7
4
|
function isValidAgent(agent) {
|
|
8
5
|
return VALID_AGENTS.includes(agent);
|
|
9
6
|
}
|
|
10
|
-
function formatRotationBanner(result) {
|
|
11
|
-
const { picked, healthy, excluded } = result;
|
|
12
|
-
const label = picked.email ? `${picked.email} · ${picked.agent}@${picked.version}` : `${picked.agent}@${picked.version}`;
|
|
13
|
-
const ratio = `${healthy.length} of ${healthy.length + excluded.length} healthy`;
|
|
14
|
-
return `[agents] rotation picked ${label} (${ratio})`;
|
|
15
|
-
}
|
|
16
7
|
export function registerRunCommand(program) {
|
|
17
8
|
program
|
|
18
|
-
.command('run <agent>
|
|
19
|
-
.description('Execute an agent
|
|
9
|
+
.command('run <agent> <prompt>')
|
|
10
|
+
.description('Execute an agent non-interactively from scripts, scheduled jobs, or automation pipelines. Returns when the agent finishes.')
|
|
20
11
|
.option('-m, --mode <mode>', 'How much the agent can do: plan (read-only), edit (can write files), full (writes + all permissions)', 'plan')
|
|
21
12
|
.option('-e, --effort <effort>', 'Reasoning effort: low | medium | high | xhigh | max | auto (claude and codex only)', 'auto')
|
|
22
13
|
.option('--model <model>', 'Override the model directly (e.g., claude-opus-4-6)')
|
|
23
14
|
.option('--env <key=value>', 'Pass environment variable to the agent (repeatable, e.g., --env DEBUG=1 --env API_KEY=xyz)', (val, prev) => [...prev, val], [])
|
|
24
|
-
.option('--secrets <bundle>', 'Inject a secrets bundle (repeatable). Values resolve from macOS Keychain at run time. See `agents secrets`.', (val, prev) => [...prev, val], [])
|
|
25
15
|
.option('--cwd <dir>', 'Working directory for the agent (defaults to current directory)')
|
|
26
16
|
.option('--add-dir <dir>', 'Grant access to an additional directory outside the project (Claude only, repeatable)', (val, prev) => [...prev, val], [])
|
|
27
17
|
.option('--json', 'Stream events as JSON lines (for parsing by other tools)')
|
|
@@ -30,29 +20,12 @@ export function registerRunCommand(program) {
|
|
|
30
20
|
.option('--verbose', 'Show detailed execution logs')
|
|
31
21
|
.option('--timeout <duration>', 'Kill the agent after this duration (e.g., 30m, 1h, 2h30m)')
|
|
32
22
|
.option('--fallback <agents>', 'Comma-separated agents to try on rate-limit failure. Each entry accepts an optional @version pin (e.g., codex@0.116.0,gemini). The primary runs first; if it exits with a rate-limit error, the next agent picks up via /continue handoff.')
|
|
33
|
-
.option('-r, --rotate', 'Rotate across installed versions of the agent. Picks the signed-in, not-out-of-credits account with the oldest last-active timestamp. Ignored when @version is pinned.')
|
|
34
23
|
.addHelpText('after', `
|
|
35
|
-
Modes:
|
|
36
|
-
With a prompt -> headless (pipes output, no TTY, exits when the agent finishes).
|
|
37
|
-
Without a prompt -> interactive (launches the agent's TUI; stdio is fully inherited).
|
|
38
|
-
|
|
39
|
-
Version rotation (opt-in with --rotate):
|
|
40
|
-
Picks across installed versions using the account data 'agents view' already
|
|
41
|
-
shows: signed-in only, skip out-of-credits, least-recently-active wins. Useful
|
|
42
|
-
when you have multiple accounts of the same CLI and want to spread usage.
|
|
43
|
-
Ignored when @version is pinned, when a profile is used, or with --fallback.
|
|
44
|
-
|
|
45
24
|
Examples:
|
|
46
|
-
#
|
|
47
|
-
agents run claude
|
|
25
|
+
# Quick read-only analysis (plan mode, low reasoning effort)
|
|
26
|
+
agents run claude "summarize recent git commits" --mode plan --effort low
|
|
48
27
|
|
|
49
|
-
#
|
|
50
|
-
agents run claude --rotate
|
|
51
|
-
|
|
52
|
-
# Headless, rotate per invocation (spreads across accounts over time)
|
|
53
|
-
agents run claude "summarize recent git commits" --mode plan --rotate
|
|
54
|
-
|
|
55
|
-
# Pin a specific version (rotation ignored)
|
|
28
|
+
# Edit files with the agent's default effort
|
|
56
29
|
agents run codex@0.116.0 "fix linting errors in src/" --mode edit
|
|
57
30
|
|
|
58
31
|
# Full autonomy with maximum reasoning for a complex task
|
|
@@ -67,81 +40,20 @@ Examples:
|
|
|
67
40
|
# Auto-fallback to codex then gemini if claude hits a rate limit
|
|
68
41
|
agents run claude "refactor auth module" --mode edit --fallback codex,gemini
|
|
69
42
|
|
|
70
|
-
# Inject a named secrets bundle (keychain-backed)
|
|
71
|
-
agents run claude "charge a test card" --secrets prod-stripe
|
|
72
|
-
|
|
73
43
|
# Pin fallback versions: primary claude@2.0.65, fallback codex@0.116.0 then gemini
|
|
74
44
|
agents run claude@2.0.65 "deep refactor" --fallback codex@0.116.0,gemini
|
|
45
|
+
|
|
46
|
+
Note: 'agents run' executes non-interactively (no TTY). To work interactively with
|
|
47
|
+
the agent, launch it directly (e.g., 'claude', 'codex') instead of using 'run'.
|
|
75
48
|
`)
|
|
76
49
|
.action(async (agentSpec, prompt, options) => {
|
|
77
50
|
// Parse agent@version
|
|
78
|
-
const [
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
let fromProfile = false;
|
|
83
|
-
if (isValidAgent(rawAgent)) {
|
|
84
|
-
agent = rawAgent;
|
|
85
|
-
}
|
|
86
|
-
else if (profileExists(rawAgent)) {
|
|
87
|
-
// Not a known agent id, but a profile by this name exists. Profiles
|
|
88
|
-
// bind (host agent, version, env overrides, keychain-backed auth)
|
|
89
|
-
// so Chinese models (Kimi, DeepSeek, Qwen, GLM) can run inside
|
|
90
|
-
// Claude Code without a local proxy.
|
|
91
|
-
try {
|
|
92
|
-
const resolved = resolveProfileForRun(rawAgent);
|
|
93
|
-
agent = resolved.agent;
|
|
94
|
-
if (!version)
|
|
95
|
-
version = resolved.version;
|
|
96
|
-
profileEnv = resolved.env;
|
|
97
|
-
fromProfile = true;
|
|
98
|
-
process.stderr.write(chalk.gray(`Resolved profile '${resolved.profileName}' -> ${agent}${version ? `@${version}` : ''}\n`));
|
|
99
|
-
}
|
|
100
|
-
catch (err) {
|
|
101
|
-
console.error(chalk.red(err.message));
|
|
102
|
-
process.exit(1);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
console.error(chalk.red(`Unknown agent: ${rawAgent}`));
|
|
107
|
-
console.error(chalk.gray(`Available agents: ${VALID_AGENTS.join(', ')}`));
|
|
108
|
-
console.error(chalk.gray(`Or add a profile: agents profiles add <name>`));
|
|
51
|
+
const [agent, version] = agentSpec.split('@');
|
|
52
|
+
if (!isValidAgent(agent)) {
|
|
53
|
+
console.error(chalk.red(`Unknown agent: ${agent}`));
|
|
54
|
+
console.error(chalk.gray(`Available: ${VALID_AGENTS.join(', ')}`));
|
|
109
55
|
process.exit(1);
|
|
110
56
|
}
|
|
111
|
-
// Rotation is opt-in via --rotate. Default honors the pinned default
|
|
112
|
-
// version (from `agents use`) so behavior stays predictable. When
|
|
113
|
-
// opted in, pick the least-recently-active signed-in version that
|
|
114
|
-
// isn't out of credits. Skipped when @version is pinned, when running
|
|
115
|
-
// a profile (profile carries its own version + auth), or when a
|
|
116
|
-
// fallback chain is configured (fallback pins versions directly).
|
|
117
|
-
if (options.rotate) {
|
|
118
|
-
if (version) {
|
|
119
|
-
process.stderr.write(chalk.yellow(`[agents] --rotate ignored: version ${version} is pinned\n`));
|
|
120
|
-
}
|
|
121
|
-
else if (fromProfile) {
|
|
122
|
-
process.stderr.write(chalk.yellow(`[agents] --rotate ignored: profile pins its own version/auth\n`));
|
|
123
|
-
}
|
|
124
|
-
else if (options.fallback) {
|
|
125
|
-
process.stderr.write(chalk.yellow(`[agents] --rotate ignored: --fallback pins versions directly\n`));
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
try {
|
|
129
|
-
const resolved = await resolveRunVersion(agent);
|
|
130
|
-
if (resolved.version) {
|
|
131
|
-
version = resolved.version;
|
|
132
|
-
if (resolved.rotation) {
|
|
133
|
-
process.stderr.write(chalk.gray(formatRotationBanner(resolved.rotation) + '\n'));
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
process.stderr.write(chalk.yellow(`[agents] --rotate found no healthy ${agent} version; falling back to defaults\n`));
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
process.stderr.write(chalk.yellow(`[agents] rotation skipped: ${err.message}\n`));
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
57
|
const mode = options.mode;
|
|
146
58
|
if (!['plan', 'edit', 'full'].includes(mode)) {
|
|
147
59
|
console.error(chalk.red(`Invalid mode: ${mode}. Use 'plan', 'edit', or 'full'`));
|
|
@@ -152,35 +64,14 @@ Examples:
|
|
|
152
64
|
console.error(chalk.red(`Invalid effort: ${effort}. Use 'low', 'medium', 'high', 'xhigh', 'max', or 'auto'`));
|
|
153
65
|
process.exit(1);
|
|
154
66
|
}
|
|
155
|
-
let
|
|
67
|
+
let env;
|
|
156
68
|
try {
|
|
157
|
-
|
|
69
|
+
env = parseExecEnv(options.env);
|
|
158
70
|
}
|
|
159
71
|
catch (err) {
|
|
160
72
|
console.error(chalk.red(err.message));
|
|
161
73
|
process.exit(1);
|
|
162
74
|
}
|
|
163
|
-
// Resolve --secrets bundles in flag order. Later bundles override earlier
|
|
164
|
-
// ones. Any resolution failure (missing keychain item, blocked exec ref)
|
|
165
|
-
// aborts before spawn so the agent never sees a partial env.
|
|
166
|
-
let secretsEnv = {};
|
|
167
|
-
for (const bundleName of options.secrets) {
|
|
168
|
-
try {
|
|
169
|
-
const bundle = readBundle(bundleName);
|
|
170
|
-
secretsEnv = { ...secretsEnv, ...resolveBundleEnv(bundle) };
|
|
171
|
-
}
|
|
172
|
-
catch (err) {
|
|
173
|
-
console.error(chalk.red(err.message));
|
|
174
|
-
process.exit(1);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
// Merge order (later wins): profile env < secrets bundles < --env K=V.
|
|
178
|
-
// Profile carries provider auth; secrets bundles carry user-defined
|
|
179
|
-
// values; --env is the per-invocation override.
|
|
180
|
-
const hasOverrides = profileEnv || options.secrets.length > 0 || userEnv;
|
|
181
|
-
const env = hasOverrides
|
|
182
|
-
? { ...(profileEnv ?? {}), ...secretsEnv, ...(userEnv ?? {}) }
|
|
183
|
-
: undefined;
|
|
184
75
|
const execOptions = {
|
|
185
76
|
agent,
|
|
186
77
|
version,
|
|
@@ -199,10 +90,6 @@ Examples:
|
|
|
199
90
|
};
|
|
200
91
|
const fallback = [];
|
|
201
92
|
if (options.fallback) {
|
|
202
|
-
if (prompt === undefined) {
|
|
203
|
-
console.error(chalk.red('--fallback requires a prompt. Fallback hands off headless runs only — interactive sessions can\'t be resumed on a different CLI.'));
|
|
204
|
-
process.exit(1);
|
|
205
|
-
}
|
|
206
93
|
const entries = options.fallback.split(',').map(s => s.trim()).filter(Boolean);
|
|
207
94
|
for (const entry of entries) {
|
|
208
95
|
const [fbAgent, fbVersion] = entry.split('@');
|
|
@@ -222,14 +109,9 @@ Examples:
|
|
|
222
109
|
const cmd = buildExecCommand(execOptions);
|
|
223
110
|
process.stderr.write(chalk.gray(`Running: ${cmd.join(' ')}\n\n`));
|
|
224
111
|
try {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
exitCode = await runWithFallback({ ...execOptions, prompt: prompt, fallback });
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
exitCode = await execAgent(execOptions);
|
|
232
|
-
}
|
|
112
|
+
const exitCode = fallback.length > 0
|
|
113
|
+
? await runWithFallback({ ...execOptions, fallback })
|
|
114
|
+
: await execAgent(execOptions);
|
|
233
115
|
process.exit(exitCode);
|
|
234
116
|
}
|
|
235
117
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,eAAe,EACf,cAAc,GAKf,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4B5D"}
|
package/dist/commands/models.js
CHANGED
|
@@ -1,29 +1,8 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
2
|
import { resolveAgentName, formatAgentError, agentLabel, } from '../lib/agents.js';
|
|
4
3
|
import { listInstalledVersions, getGlobalDefault, resolveVersion } from '../lib/versions.js';
|
|
5
4
|
import { getModelCatalog, locateModelSource } from '../lib/models.js';
|
|
6
|
-
const MODEL_CAPABLE_AGENTS = ['claude', 'codex'
|
|
7
|
-
/**
|
|
8
|
-
* Agents that don't necessarily install under ~/.agents/versions (cursor ships
|
|
9
|
-
* via a curl script). For these, fall back to the PATH binary and synthesize
|
|
10
|
-
* a version label from the install path so cache keys stay stable.
|
|
11
|
-
*/
|
|
12
|
-
const PATH_ONLY_AGENTS = new Set(['cursor']);
|
|
13
|
-
function fallbackPathVersion(agent) {
|
|
14
|
-
const src = locateModelSource(agent, 'unresolved');
|
|
15
|
-
if (!src)
|
|
16
|
-
return null;
|
|
17
|
-
let real = src.path;
|
|
18
|
-
try {
|
|
19
|
-
real = fs.realpathSync(src.path);
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
/* keep symlink path */
|
|
23
|
-
}
|
|
24
|
-
const m = real.match(/\/versions\/([^/]+)\//);
|
|
25
|
-
return m ? m[1] : 'installed';
|
|
26
|
-
}
|
|
5
|
+
const MODEL_CAPABLE_AGENTS = ['claude', 'codex'];
|
|
27
6
|
export function registerModelsCommand(program) {
|
|
28
7
|
program
|
|
29
8
|
.command('models [agentSpec]', { hidden: true })
|
|
@@ -57,10 +36,7 @@ async function resolveTargets(agentSpec) {
|
|
|
57
36
|
if (!agentSpec) {
|
|
58
37
|
const targets = [];
|
|
59
38
|
for (const agent of MODEL_CAPABLE_AGENTS) {
|
|
60
|
-
|
|
61
|
-
if (!version && PATH_ONLY_AGENTS.has(agent)) {
|
|
62
|
-
version = fallbackPathVersion(agent);
|
|
63
|
-
}
|
|
39
|
+
const version = getGlobalDefault(agent) || (listInstalledVersions(agent)[0] ?? null);
|
|
64
40
|
if (version)
|
|
65
41
|
targets.push({ agent, version, isDefault: true });
|
|
66
42
|
}
|
|
@@ -87,10 +63,7 @@ async function resolveTargets(agentSpec) {
|
|
|
87
63
|
isDefault: v === getGlobalDefault(agent),
|
|
88
64
|
}));
|
|
89
65
|
}
|
|
90
|
-
|
|
91
|
-
if (!version && PATH_ONLY_AGENTS.has(agent)) {
|
|
92
|
-
version = fallbackPathVersion(agent);
|
|
93
|
-
}
|
|
66
|
+
const version = versionSpec || resolveVersion(agent, process.cwd()) || getGlobalDefault(agent);
|
|
94
67
|
if (!version) {
|
|
95
68
|
console.error(chalk.red(`No version of ${agent} is installed. Try \`agents add ${agent}@latest\`.`));
|
|
96
69
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmEzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqa1D"}
|
package/dist/commands/pull.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { AGENTS, ALL_AGENT_IDS,
|
|
3
|
+
import { AGENTS, ALL_AGENT_IDS, MCP_CAPABLE_AGENTS, getAllCliStates, registerMcpToTargets, isAgentName, resolveAgentName, agentLabel, } from '../lib/agents.js';
|
|
4
4
|
import { readManifest, MANIFEST_FILENAME, } from '../lib/manifest.js';
|
|
5
5
|
import { getAgentsDir, ensureAgentsDir, readMeta, updateMeta, } from '../lib/state.js';
|
|
6
6
|
import { DEFAULT_SYSTEM_REPO, LEGACY_SYSTEM_REPO, systemRepoSlug } from '../lib/types.js';
|
|
@@ -12,31 +12,6 @@ import { ensureShimCurrent, isShimsInPath, addShimsToPath, getPathSetupInstructi
|
|
|
12
12
|
import { parseHookManifest, registerHooksToSettings } from '../lib/hooks.js';
|
|
13
13
|
import { select } from '@inquirer/prompts';
|
|
14
14
|
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
15
|
-
/**
|
|
16
|
-
* Old repo layout stored promptcuts under claude/promptcuts.yaml (agent-scoped).
|
|
17
|
-
* The new layout is ~/.agents/promptcuts.yaml at the repo root — the hook
|
|
18
|
-
* reads from a fixed path so it survives version upgrades. If the root file
|
|
19
|
-
* doesn't exist yet but an agent-scoped one does, hoist the first one found.
|
|
20
|
-
*/
|
|
21
|
-
function migratePromptcutsToRoot(agentsDir) {
|
|
22
|
-
const rootPath = path.join(agentsDir, 'promptcuts.yaml');
|
|
23
|
-
if (fs.existsSync(rootPath))
|
|
24
|
-
return;
|
|
25
|
-
const agentDirs = ['claude', 'codex', 'cursor', 'gemini', 'opencode'];
|
|
26
|
-
for (const dir of agentDirs) {
|
|
27
|
-
const legacyPath = path.join(agentsDir, dir, 'promptcuts.yaml');
|
|
28
|
-
if (fs.existsSync(legacyPath)) {
|
|
29
|
-
try {
|
|
30
|
-
fs.renameSync(legacyPath, rootPath);
|
|
31
|
-
console.log(chalk.gray(`Moved ${dir}/promptcuts.yaml → promptcuts.yaml (repo root)`));
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
// Best-effort migration; hook still works if the user moves it manually.
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
15
|
export function registerPullCommand(program) {
|
|
41
16
|
program
|
|
42
17
|
.command('pull [source] [agent]')
|
|
@@ -211,10 +186,6 @@ Skip CLI installs with --skip-clis when you only want config updates, not versio
|
|
|
211
186
|
source: parsed.url,
|
|
212
187
|
});
|
|
213
188
|
}
|
|
214
|
-
// One-time migration: promptcuts.yaml moved from agent-scoped
|
|
215
|
-
// (e.g. claude/promptcuts.yaml) to repo root. We move it so the
|
|
216
|
-
// hook at ~/.agents/hooks/ can always find it at a fixed path.
|
|
217
|
-
migratePromptcutsToRoot(agentsDir);
|
|
218
189
|
// Read manifest for CLI versions and MCP config
|
|
219
190
|
const manifest = readManifest(agentsDir);
|
|
220
191
|
if (!manifest) {
|
|
@@ -347,17 +318,12 @@ Skip CLI installs with --skip-clis when you only want config updates, not versio
|
|
|
347
318
|
}
|
|
348
319
|
}
|
|
349
320
|
}
|
|
350
|
-
// Register hooks as lifecycle events in
|
|
351
|
-
// Claude/codex/gemini all support prompt-time hooks, though only
|
|
352
|
-
// claude can replace the prompt — codex/gemini append via
|
|
353
|
-
// additionalContext. The hook script detects the caller and emits
|
|
354
|
-
// the correct protocol.
|
|
321
|
+
// Register hooks as lifecycle events in settings.json
|
|
355
322
|
const hookManifest = parseHookManifest();
|
|
356
323
|
if (Object.keys(hookManifest).length > 0) {
|
|
357
324
|
let hookRegistered = 0;
|
|
358
|
-
const hookAgents = new Set(HOOKS_CAPABLE_AGENTS);
|
|
359
325
|
for (const agentId of agentsToSync) {
|
|
360
|
-
if (
|
|
326
|
+
if (agentId !== 'claude')
|
|
361
327
|
continue;
|
|
362
328
|
const versions = listInstalledVersions(agentId);
|
|
363
329
|
const defaultVer = getGlobalDefault(agentId);
|