@phnx-labs/agents-cli 1.20.72 → 1.20.73
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 +299 -0
- package/README.md +40 -4
- package/dist/bin/agents +0 -0
- package/dist/commands/activity.d.ts +12 -0
- package/dist/commands/activity.js +68 -0
- package/dist/commands/apply.d.ts +13 -0
- package/dist/commands/apply.js +28 -3
- package/dist/commands/browser.js +1 -1
- package/dist/commands/cloud.js +21 -11
- package/dist/commands/doctor.js +8 -4
- package/dist/commands/events.d.ts +11 -10
- package/dist/commands/events.js +30 -21
- package/dist/commands/exec.d.ts +34 -0
- package/dist/commands/exec.js +337 -39
- package/dist/commands/feed.d.ts +13 -0
- package/dist/commands/feed.js +130 -29
- package/dist/commands/hq.d.ts +2 -0
- package/dist/commands/hq.js +58 -0
- package/dist/commands/lease.d.ts +19 -0
- package/dist/commands/lease.js +138 -11
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +123 -0
- package/dist/commands/logs.js +1 -1
- package/dist/commands/mine.d.ts +27 -0
- package/dist/commands/mine.js +207 -0
- package/dist/commands/monitors.js +79 -49
- package/dist/commands/plugins.js +1 -0
- package/dist/commands/profiles.js +158 -0
- package/dist/commands/repo.js +2 -60
- package/dist/commands/resources.d.ts +5 -0
- package/dist/commands/resources.js +95 -0
- package/dist/commands/routines.d.ts +2 -0
- package/dist/commands/routines.js +139 -37
- package/dist/commands/secrets.js +234 -47
- package/dist/commands/send.d.ts +15 -0
- package/dist/commands/send.js +62 -0
- package/dist/commands/sessions-tail.d.ts +1 -0
- package/dist/commands/sessions-tail.js +20 -9
- package/dist/commands/sessions.js +18 -3
- package/dist/commands/setup-mine.d.ts +18 -0
- package/dist/commands/setup-mine.js +106 -0
- package/dist/commands/setup-share.js +2 -2
- package/dist/commands/setup.js +3 -1
- package/dist/commands/share.d.ts +8 -1
- package/dist/commands/share.js +122 -37
- package/dist/commands/ssh.d.ts +9 -0
- package/dist/commands/ssh.js +196 -26
- package/dist/commands/sync.js +1 -1
- package/dist/commands/teams.js +11 -2
- package/dist/index.js +79 -10
- package/dist/lib/activity.d.ts +124 -0
- package/dist/lib/activity.js +542 -0
- package/dist/lib/agents.js +16 -5
- package/dist/lib/artifact-actions.d.ts +1 -1
- package/dist/lib/artifact-actions.js +1 -1
- package/dist/lib/ask-classifier.d.ts +2 -1
- package/dist/lib/ask-classifier.js +3 -3
- package/dist/lib/auth-health.d.ts +32 -4
- package/dist/lib/auth-health.js +40 -1
- package/dist/lib/auto-pull.js +8 -1
- package/dist/lib/brand.d.ts +40 -0
- package/dist/lib/brand.js +122 -0
- package/dist/lib/browser/drivers/ssh.js +4 -7
- package/dist/lib/browser/service.js +6 -8
- package/dist/lib/channels/providers/index.d.ts +2 -0
- package/dist/lib/channels/providers/index.js +20 -0
- package/dist/lib/channels/providers/mailbox.d.ts +2 -0
- package/dist/lib/channels/providers/mailbox.js +26 -0
- package/dist/lib/channels/providers/openclaw-telegram.d.ts +2 -0
- package/dist/lib/channels/providers/openclaw-telegram.js +34 -0
- package/dist/lib/channels/providers/rush.d.ts +6 -0
- package/dist/lib/channels/providers/rush.js +55 -0
- package/dist/lib/channels/registry.d.ts +42 -0
- package/dist/lib/channels/registry.js +20 -0
- package/dist/lib/channels/resolve.d.ts +11 -0
- package/dist/lib/channels/resolve.js +12 -0
- package/dist/lib/cli-resources.d.ts +18 -0
- package/dist/lib/cli-resources.js +53 -4
- package/dist/lib/cloud/codex.js +6 -3
- package/dist/lib/cloud/factory.d.ts +1 -0
- package/dist/lib/cloud/factory.js +10 -4
- package/dist/lib/cloud/rush.d.ts +3 -1
- package/dist/lib/cloud/rush.js +6 -1
- package/dist/lib/cloud/types.d.ts +2 -0
- package/dist/lib/codex-home.d.ts +35 -0
- package/dist/lib/codex-home.js +136 -0
- package/dist/lib/crabbox/cli.d.ts +44 -0
- package/dist/lib/crabbox/cli.js +120 -20
- package/dist/lib/crabbox/lease.d.ts +52 -1
- package/dist/lib/crabbox/lease.js +117 -16
- package/dist/lib/crabbox/progress.d.ts +31 -0
- package/dist/lib/crabbox/progress.js +76 -0
- package/dist/lib/crabbox/runtimes.d.ts +4 -0
- package/dist/lib/crabbox/runtimes.js +33 -8
- package/dist/lib/crabbox/setup-copy.d.ts +87 -0
- package/dist/lib/crabbox/setup-copy.js +127 -0
- package/dist/lib/daemon.d.ts +5 -5
- package/dist/lib/daemon.js +9 -9
- package/dist/lib/drive-sync.js +6 -3
- package/dist/lib/event-stream.d.ts +36 -0
- package/dist/lib/event-stream.js +68 -0
- package/dist/lib/events.d.ts +1 -1
- package/dist/lib/exec.d.ts +11 -0
- package/dist/lib/exec.js +23 -2
- package/dist/lib/feed-policy.d.ts +1 -1
- package/dist/lib/feed-policy.js +14 -9
- package/dist/lib/feed-ranking.d.ts +32 -0
- package/dist/lib/feed-ranking.js +224 -0
- package/dist/lib/feed.d.ts +35 -2
- package/dist/lib/feed.js +66 -3
- package/dist/lib/fleet/auth-sync.d.ts +53 -0
- package/dist/lib/fleet/auth-sync.js +92 -0
- package/dist/lib/fleet/remote-login.d.ts +187 -0
- package/dist/lib/fleet/remote-login.js +556 -0
- package/dist/lib/format.d.ts +30 -3
- package/dist/lib/format.js +34 -5
- package/dist/lib/fs-atomic.d.ts +7 -2
- package/dist/lib/fs-atomic.js +8 -12
- package/dist/lib/git.d.ts +16 -0
- package/dist/lib/git.js +79 -2
- package/dist/lib/heal.js +11 -3
- package/dist/lib/hosts/progress.d.ts +28 -10
- package/dist/lib/hosts/progress.js +79 -22
- package/dist/lib/hosts/remote-cmd.js +4 -0
- package/dist/lib/hq/floor.d.ts +87 -0
- package/dist/lib/hq/floor.js +226 -0
- package/dist/lib/menubar/install-menubar.js +14 -20
- package/dist/lib/notify.d.ts +1 -0
- package/dist/lib/notify.js +3 -3
- package/dist/lib/open-url.d.ts +2 -0
- package/dist/lib/open-url.js +19 -0
- package/dist/lib/openclaw-keychain.d.ts +56 -0
- package/dist/lib/openclaw-keychain.js +236 -0
- package/dist/lib/overdue.js +10 -0
- package/dist/lib/permissions.d.ts +44 -1
- package/dist/lib/permissions.js +284 -7
- package/dist/lib/project-launch.d.ts +6 -12
- package/dist/lib/project-launch.js +13 -228
- package/dist/lib/project-resources.d.ts +7 -0
- package/dist/lib/project-resources.js +291 -0
- package/dist/lib/pty-client.d.ts +27 -0
- package/dist/lib/pty-client.js +136 -10
- package/dist/lib/refresh.js +14 -10
- package/dist/lib/resource-profiles.d.ts +26 -0
- package/dist/lib/resource-profiles.js +157 -0
- package/dist/lib/resources/permissions.js +7 -1
- package/dist/lib/resources/types.d.ts +1 -1
- package/dist/lib/resources.d.ts +1 -1
- package/dist/lib/resources.js +32 -3
- package/dist/lib/routines.d.ts +11 -0
- package/dist/lib/routines.js +56 -15
- package/dist/lib/runner.d.ts +1 -0
- package/dist/lib/runner.js +66 -5
- package/dist/lib/secrets/bundles.d.ts +16 -3
- package/dist/lib/secrets/bundles.js +206 -37
- package/dist/lib/secrets/icloud-import.d.ts +2 -2
- package/dist/lib/secrets/icloud-import.js +9 -6
- package/dist/lib/secrets/mcp.js +1 -1
- package/dist/lib/secrets/vault-age-helper.d.ts +1 -0
- package/dist/lib/secrets/vault-age-helper.js +34 -0
- package/dist/lib/secrets/vault.d.ts +49 -0
- package/dist/lib/secrets/vault.js +397 -0
- package/dist/lib/self-heal/checks/path.js +3 -1
- package/dist/lib/self-heal/checks/shadowing.js +10 -2
- package/dist/lib/self-heal/checks/shims.js +19 -11
- package/dist/lib/session/cloud.d.ts +2 -2
- package/dist/lib/session/cloud.js +2 -2
- package/dist/lib/session/db.d.ts +4 -0
- package/dist/lib/session/db.js +44 -7
- package/dist/lib/session/discover.d.ts +2 -0
- package/dist/lib/session/discover.js +114 -3
- package/dist/lib/session/stream-render.d.ts +3 -0
- package/dist/lib/session/stream-render.js +130 -0
- package/dist/lib/session/types.d.ts +6 -0
- package/dist/lib/share/analytics.d.ts +13 -0
- package/dist/lib/share/analytics.js +45 -0
- package/dist/lib/share/config.d.ts +19 -5
- package/dist/lib/share/config.js +44 -8
- package/dist/lib/share/provision.d.ts +58 -6
- package/dist/lib/share/provision.js +97 -22
- package/dist/lib/share/publish.d.ts +36 -13
- package/dist/lib/share/publish.js +55 -8
- package/dist/lib/share/worker-template.js +83 -17
- package/dist/lib/shims.d.ts +9 -0
- package/dist/lib/shims.js +91 -13
- package/dist/lib/ssh-exec.d.ts +14 -0
- package/dist/lib/ssh-exec.js +57 -0
- package/dist/lib/staleness/detectors/hooks.js +25 -1
- package/dist/lib/staleness/detectors/permissions.js +66 -0
- package/dist/lib/staleness/detectors/workflows.js +20 -0
- package/dist/lib/staleness/writers/hooks.js +58 -4
- package/dist/lib/staleness/writers/permissions.js +2 -2
- package/dist/lib/staleness/writers/skills.js +1 -1
- package/dist/lib/staleness/writers/sources.d.ts +10 -1
- package/dist/lib/staleness/writers/sources.js +68 -1
- package/dist/lib/star-nudge.d.ts +45 -0
- package/dist/lib/star-nudge.js +91 -0
- package/dist/lib/startup/command-registry.d.ts +6 -1
- package/dist/lib/startup/command-registry.js +17 -3
- package/dist/lib/state.d.ts +2 -0
- package/dist/lib/state.js +3 -0
- package/dist/lib/subagents-registry.d.ts +2 -0
- package/dist/lib/subagents-registry.js +3 -0
- package/dist/lib/teams/parsers.js +214 -6
- package/dist/lib/teams/supervisor.d.ts +7 -0
- package/dist/lib/teams/supervisor.js +2 -1
- package/dist/lib/template.d.ts +1 -1
- package/dist/lib/template.js +1 -1
- package/dist/lib/triggers/webhook.js +36 -3
- package/dist/lib/types.d.ts +73 -0
- package/dist/lib/version.d.ts +40 -0
- package/dist/lib/version.js +94 -16
- package/dist/lib/versions.d.ts +11 -0
- package/dist/lib/versions.js +208 -76
- package/dist/lib/workflows.d.ts +2 -0
- package/dist/lib/workflows.js +88 -0
- package/package.json +2 -1
- package/dist/commands/daemon.d.ts +0 -10
- package/dist/commands/daemon.js +0 -121
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,304 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.20.73
|
|
4
|
+
|
|
5
|
+
- **`agents cli install <binary-cli>` no longer hardcodes `/usr/local/bin` (#1103).**
|
|
6
|
+
Binary-method installs downloaded (and extracted archives) straight into
|
|
7
|
+
`/usr/local/bin`, which fails with `EACCES` on Apple Silicon Macs where that
|
|
8
|
+
directory is root-owned and not user-writable. A new `resolveBinDir()` picks
|
|
9
|
+
the install directory instead: honor `AGENTS_CLI_BIN_DIR` if set, else prefer
|
|
10
|
+
`~/.local/bin` (created on demand — the same XDG user-bin dir shims already
|
|
11
|
+
use), else fall back to `/usr/local/bin` with an actionable error pointing at
|
|
12
|
+
`AGENTS_CLI_BIN_DIR` / `~/.local/bin` instead of a bare `EACCES`. Source:
|
|
13
|
+
`apps/cli/src/lib/cli-resources.ts`, `apps/cli/src/lib/cli-resources.test.ts`.
|
|
14
|
+
|
|
15
|
+
- **Stream host follows over one persistent SSH connection (RUSH-1407).** `run --host` and `hosts logs -f` now follow remote logs with a long-lived `tail -f` stream that reconnects from the saved byte offset and captures the remote `.exit` code without per-cycle SSH spawns. Source: `apps/cli/src/lib/hosts/progress.ts`.
|
|
16
|
+
|
|
17
|
+
- **Reuse warm crabbox boxes from `agents run` (RUSH-1609).** `agents run <agent> "<task>" --box <slug>` now targets an existing warm crabbox box, runs the same bootstrap and credential provisioning as `--lease`, and leaves the box running for reuse across repositories. Source: `apps/cli/src/commands/exec.ts`, `apps/cli/src/lib/crabbox/lease.ts`.
|
|
18
|
+
|
|
19
|
+
- **Show reasoning in Factory progress timelines (RUSH-1634).** Factory detail panes now interleave assistant prose and reasoning summaries with tool calls in the Progress rail, so agent activity explains intent instead of showing only file/tool touches. Source: `apps/factory/src/core/session.summary.ts`, `apps/factory/ui/settings/components/mission-control/Timeline.tsx`.
|
|
20
|
+
|
|
21
|
+
- **Expose an Agents HQ floor snapshot bridge (RUSH-1638).** `agents hq floor --json` now emits a machine-readable floor snapshot that joins live sessions, teams, feed blocks, room placement, ambient events, and command-backed actions for HQ clients. Source: `apps/cli/src/commands/hq.ts`, `apps/cli/src/lib/hq/floor.ts`.
|
|
22
|
+
|
|
23
|
+
- **Menu-bar Quick Dispatch attaches selected screenshots after ticket creation (RUSH-1693).** The helper now uploads every selected quick-capture screenshot to the created Linear issue itself after parsing the `Created RUSH-###` result, instead of relying on the ticket agent to run a second proof-upload command from its prompt. Source: `apps/cli/menubar/Sources/MenubarHelper/AgentsCLI.swift`, `apps/cli/menubar/Sources/MenubarHelper/IssueSelfTest.swift`, `apps/cli/docs/menubar.md`.
|
|
24
|
+
|
|
25
|
+
- **Move supported OpenClaw secrets into Keychain-backed refs (RUSH-175).** `agents secrets openclaw-keychain migrate` now stores supported OpenClaw plaintext credentials in macOS Keychain, rewrites OpenClaw config fields to exec SecretRefs, and refuses to delete top-level env secrets that have no supported SecretRef target. Source: `apps/cli/src/lib/openclaw-keychain.ts`, `apps/cli/src/commands/secrets.ts`, `apps/cli/docs/secrets.md`.
|
|
26
|
+
|
|
27
|
+
- **Provision share workers completely (RUSH-1792).** `agents share setup` now configures the R2 lifecycle rule and sets the Worker `WRITE_TOKEN` through Cloudflare's Workers Secrets API after deploying the R2-bound Worker. Source: `apps/cli/src/lib/share/provision.ts`.
|
|
28
|
+
|
|
29
|
+
- **Extract a reusable share-publish endpoint seam (RUSH-1794).** `agents share <file>` now delegates its authenticated PUT (bearer token, `--slug`, `--expire`) through `publishToEndpoint`, decoupled from config/keychain loading, with a real-HTTP test asserting the wire contract. Source: `apps/cli/src/lib/share/publish.ts`.
|
|
30
|
+
|
|
31
|
+
- **Map the default share domain automatically (RUSH-1796).** `agents share setup` now maps `share.agents-cli.sh` when the Cloudflare token can see the `agents-cli.sh` zone, while keeping the workers.dev endpoint when it cannot and honoring `--domain` overrides. Source: `apps/cli/src/commands/share.ts`, `apps/cli/docs/share.md`.
|
|
32
|
+
|
|
33
|
+
- **Expire shared artifacts end to end (RUSH-1797).** `agents share --expire` now stores
|
|
34
|
+
`expires-at` metadata for the Worker to enforce and `agents share setup` installs a
|
|
35
|
+
managed R2 lifecycle rule so old share objects self-clean. Source:
|
|
36
|
+
`apps/cli/src/lib/share/{publish,provision,worker-template}.ts`.
|
|
37
|
+
|
|
38
|
+
- **`agents share` central mode now follows synced config plus injected write tokens (RUSH-1798).** `agents share join` can bind an existing synced endpoint without reprovisioning, publish reads `SHARE_WRITE_TOKEN` from runtime env before falling back to the local `share` bundle, and agent/team/supported cloud launches propagate the token when it is already available so ephemeral agents can publish durable links with no Cloudflare setup. Source: `apps/cli/src/commands/share.ts`, `apps/cli/src/lib/share/config.ts`, `apps/cli/src/commands/exec.ts`, `apps/cli/src/commands/cloud.ts`, `apps/cli/src/commands/teams.ts`, `apps/cli/src/lib/cloud/rush.ts`, `apps/cli/src/lib/cloud/factory.ts`, `apps/cli/src/lib/cloud/codex.ts`.
|
|
39
|
+
|
|
40
|
+
- **Plan-render auto-publish plumbing (RUSH-1799).** `agents share <file> --json`
|
|
41
|
+
now emits a stable `{ url, coverUrl, expiresAt }` result so plan-render hooks can
|
|
42
|
+
publish rendered HTML and post the returned link without scraping terminal output.
|
|
43
|
+
Source: `apps/cli/src/commands/share.ts`, `apps/cli/src/lib/share/publish.ts`.
|
|
44
|
+
|
|
45
|
+
- Added `agents share` regression coverage for token storage, publish upload headers, expiry metadata, and Cloudflare provisioning request shapes without calling real Cloudflare in CI. Source: `src/lib/share/{config,publish-file,provision}.test.ts`, `src/lib/share/provision.ts`.
|
|
46
|
+
|
|
47
|
+
- `agents repo pull` now fast-forwards the local checkout after fetch
|
|
48
|
+
(`--ff-only` semantics) and reports when it is blocked by local changes or
|
|
49
|
+
local commits instead of leaving the checkout behind origin. The system repo
|
|
50
|
+
uses the same fast-forward path as user and extra repos.
|
|
51
|
+
|
|
52
|
+
- **`agents share` default links are much harder to guess (RUSH-1821).** The random
|
|
53
|
+
tail of an auto-generated share slug is now a 64-bit nonce (`randomBytes(8)`, 16 hex
|
|
54
|
+
chars) instead of the old 24-bit / 6-hex tail — closing a `~16.7M`-possibility space
|
|
55
|
+
that was small enough to brute-force. Since share reads are public (the URL is the only
|
|
56
|
+
capability), the nonce is the whole defense, so it now carries the full 64 bits.
|
|
57
|
+
Passed-in `--slug` values and existing links are unchanged. `docs/share.md` now states
|
|
58
|
+
the security model explicitly (unlisted-not-secret; reads are public; use `--expire`
|
|
59
|
+
for sensitive content; an opt-in auth-gated read is a future option). Source:
|
|
60
|
+
`apps/cli/src/lib/share/publish.ts` (`defaultSlug`), `apps/cli/src/lib/share/publish.test.ts`,
|
|
61
|
+
`apps/cli/docs/share.md`.
|
|
62
|
+
|
|
63
|
+
- **`agents secrets list`/`view` gain `--json` (RUSH-1834).** Agents can now discover which secrets bundles and keys exist as machine-readable JSON before injecting one — `list --json` emits bundle metadata (name, key count, policy, backend, timestamps) and `view <bundle> --json` lists each key with its kind and stored/missing state. Values stay `null` unless `--reveal` (which keeps the same non-TTY `--plaintext` gate and audit event as the human view), so the discovery surface never leaks a secret. Gated on the explicit `--json` flag, not `stdout.isTTY`. Source: `apps/cli/src/commands/secrets.ts`.
|
|
64
|
+
|
|
65
|
+
- **Per-user URL namespaces + privacy-first analytics for `agents share` (RUSH-1835).**
|
|
66
|
+
Shares now publish under the publisher's GitHub username (`share.agents-cli.sh/<user>/<slug>`),
|
|
67
|
+
with `/<user>` rendering a public gallery and legacy flat slugs still resolving. Every HTML
|
|
68
|
+
publish also injects a cookieless Cloudflare Web Analytics beacon (opt out with
|
|
69
|
+
`--no-analytics`). Configure the token during `agents share setup --analytics-token`, and
|
|
70
|
+
check status with `agents share status` / `agents share analytics`. Source:
|
|
71
|
+
`apps/cli/src/commands/share.ts`, `apps/cli/src/lib/share/{publish,analytics,worker-template}.ts`,
|
|
72
|
+
`apps/cli/src/lib/git.ts`, `apps/cli/docs/share.md`.
|
|
73
|
+
|
|
74
|
+
- **Codex no longer breaks on macOS when its versioned `CODEX_HOME` overflows the
|
|
75
|
+
Unix-socket `SUN_LEN` limit.** Codex binds an app-server control socket at
|
|
76
|
+
`$CODEX_HOME/app-server-control/app-server-control.sock`, and macOS caps Unix
|
|
77
|
+
socket paths at 104 bytes (`SUN_LEN`). agents-cli points `CODEX_HOME` at the deep
|
|
78
|
+
versioned home (`~/.agents/.history/versions/codex/<version>/home/.codex`), which
|
|
79
|
+
for a typical user is long enough that the derived socket path exceeds 104 bytes —
|
|
80
|
+
so `codex app-server daemon start` failed with `path must be shorter than
|
|
81
|
+
SUN_LEN` and every codex spawn on macOS died (this took down every OpenClaw agent
|
|
82
|
+
on a mac-mini). Codex exposes no socket-path override and resolves symlinks before
|
|
83
|
+
binding, so a short symlink to the deep home does not help. The codex shims and
|
|
84
|
+
`buildExecEnv` now detect the overflow on macOS and relocate the home once to a
|
|
85
|
+
short real directory under `~/.agents/.codex-homes/<version>/.codex` (leaving a
|
|
86
|
+
symlink behind so the versioned path still resolves), keeping config, auth, and
|
|
87
|
+
state intact. A caller-set `CODEX_HOME` is always respected. Source:
|
|
88
|
+
`apps/cli/src/lib/codex-home.ts` (new), `apps/cli/src/lib/shims.ts`,
|
|
89
|
+
`apps/cli/src/lib/exec.ts`.
|
|
90
|
+
|
|
91
|
+
- **Gate GitHub webhook routines on pull request labels (RUSH-203).** `agents routines add --on github:pull_request` and `agents cloud run --on pr` now preserve GitHub `--action` and `--label` filters, so a UX test routine can fire only when a PR receives `ux-approved`. Source: `apps/cli/src/lib/routines.ts`, `apps/cli/src/lib/triggers/webhook.ts`, `apps/cli/src/commands/routines.ts`, `apps/cli/src/commands/cloud.ts`.
|
|
92
|
+
|
|
93
|
+
- **Remove the deprecated `agents daemon` command tree (RUSH-403).** The legacy `agents daemon start|stop|status|logs` aliases are gone for v2.0; use `agents routines start|stop|status|scheduler-logs` for scheduler controls. Source: `apps/cli/src/lib/startup/command-registry.ts`, `apps/cli/src/index.ts`, `apps/cli/src/lib/daemon.ts`, `apps/cli/docs/03-routines.md`.
|
|
94
|
+
|
|
95
|
+
Added top-level resource profiles via `agents profile use`, filtering synced resources and secrets bundles by the active profile.
|
|
96
|
+
Fixed source-qualified resource profile selectors for permission groups and workflows so `project:`, `user:`, and `system:` patterns match the real resource layer.
|
|
97
|
+
Fixed `resolveResource` to fall through to lower-precedence layers when a higher-layer match is excluded by the active profile, matching `listResources` behavior.
|
|
98
|
+
|
|
99
|
+
- **Support multiple accounts per secrets bundle (RUSH-668).** Secrets bundle keys now accept `BASE.account` names such as `GITHUB_USERNAME.personal`; selected account variants inject as the base env key and conflicting variants fail loud unless narrowed with `--keys`. Source: `apps/cli/src/lib/secrets/bundles.ts`, `apps/cli/docs/secrets.md`.
|
|
100
|
+
|
|
101
|
+
- **Harden synced vault writes (RUSH-682).** Synced secret mutations now lock the vault across the full read-modify-write cycle and persist through an atomic rename, preventing concurrent CLI processes from losing each other's bundle updates. Source: `apps/cli/src/lib/secrets/vault.ts`.
|
|
102
|
+
|
|
103
|
+
## Features
|
|
104
|
+
|
|
105
|
+
- Added `agents login`, `agents logout`, and `agents whoami` plus `agents secrets create --synced` for age-encrypted synced secrets stored in `~/.agents/vault.age`.
|
|
106
|
+
- Protected synced secrets vaults from accidental replacement: `agents login --create` and `agents login --join <path>` now require `--force` before replacing an existing `vault.age`, and synced bundle writes batch metadata plus stored keys into one vault update.
|
|
107
|
+
- Synced vault encryption now runs without re-executing the `agents` binary, so standalone macOS installs can encrypt and decrypt vault data reliably; new vault writes also use the age library's default scrypt work factor.
|
|
108
|
+
|
|
109
|
+
- **Keep project resources in workspace config (RUSH-705).** Project-scoped commands,
|
|
110
|
+
skills, subagents, and workflows now sync into the current workspace's `.<agent>/`
|
|
111
|
+
directory instead of lingering in global agent version homes. Source:
|
|
112
|
+
`apps/cli/src/lib/project-resources.ts`.
|
|
113
|
+
- **Track Goose workflow subrecipes from first sync (RUSH-705).** Goose workflow
|
|
114
|
+
`.subrecipes/` directories are tracked in the ownership manifest from the first
|
|
115
|
+
sync, preventing workflows from being incorrectly skipped on later syncs. Source:
|
|
116
|
+
`apps/cli/src/lib/project-resources.ts`.
|
|
117
|
+
|
|
118
|
+
- **`agents activity` — an event-sourced view of what agents *did*.** A new append-only, per-session event log (`~/.agents/.history/activity/<sessionId>.jsonl`) records agent-semantic milestones at hook time (plans, PRs, worktrees, sub-agents, artifacts) with no transcript re-parsing. `agents activity` renders the stream newest-first (milestones individually, routine edits collapsed to a count); `agents feed` gains a compact recent-activity lane. Source: `apps/cli/src/lib/activity.ts`, `apps/cli/src/commands/activity.ts`.
|
|
119
|
+
|
|
120
|
+
- **Lease command surface: reuse picker, devices section, step UI, and Tailscale net-mode (RUSH-1922/1923/1924).**
|
|
121
|
+
Wires the command layer onto the merged crabbox-core lib:
|
|
122
|
+
- **Reuse (F3).** On an interactive `agents run … --lease`, a picker lists your
|
|
123
|
+
warm boxes (`ready` + unexpired, most-recently-touched first) and offers
|
|
124
|
+
"Provision a fresh box" / "Always provision fresh (remember for this repo)".
|
|
125
|
+
New flags: `--reuse` (scriptable — auto-pick the freshest warm box, else
|
|
126
|
+
fresh) and `--bare` (skip copying your local `~/.agents` setup onto the box,
|
|
127
|
+
i.e. `copySetup=false`). Headless / `--json` never blocks — it provisions
|
|
128
|
+
fresh unless `--reuse`/`--box` is given. New subcommands `agents lease list`
|
|
129
|
+
(`--json`) and `agents lease stop <slug>`.
|
|
130
|
+
- **Step UI (F2).** The box-side setup now renders as a live checklist —
|
|
131
|
+
each `___PHASE_<name>___` step from the lib's `onStep` stream prints via
|
|
132
|
+
`renderStepLine` (✔ Step — detail (elapsed)). Non-TTY prints one line per
|
|
133
|
+
step; `--json` emits `{phase:"setup",name,elapsedMs}` events. Host-side
|
|
134
|
+
warmup/ready/teardown phases are unchanged.
|
|
135
|
+
- **Devices (F4).** `agents devices` gains a live "Leased boxes (ephemeral ·
|
|
136
|
+
via crabbox)" section computed from `crabboxList()` — never written into the
|
|
137
|
+
device registry. `agents ssh <slug>` now resolves a leased-box slug and
|
|
138
|
+
connects to `crabbox@<tailnet-or-ip>:2222`.
|
|
139
|
+
- **Net-mode (F5).** New `--tailscale` / `--no-tailscale` on `agents run`.
|
|
140
|
+
`netMode = (--tailscale || reuse-context) && !--no-tailscale` (a solo
|
|
141
|
+
one-shot `--lease` stays public) is threaded into the lease so the lib leases
|
|
142
|
+
onto the tailnet. `agents lease setup` now also captures a Tailscale auth key
|
|
143
|
+
(EPHEMERAL, pre-authorized, `tag:crabbox`) into the `tailscale.com` secrets
|
|
144
|
+
bundle as `CRABBOX_TAILSCALE_AUTH_KEY`; when Tailscale is requested with no
|
|
145
|
+
key configured the run falls back to a public lease with an actionable hint.
|
|
146
|
+
The final "box ready/kept" line surfaces the box's tailnet FQDN/IP.
|
|
147
|
+
|
|
148
|
+
Source: `apps/cli/src/commands/exec.ts`, `apps/cli/src/commands/lease.ts`,
|
|
149
|
+
`apps/cli/src/commands/ssh.ts` (+ `*.test.ts`).
|
|
150
|
+
|
|
151
|
+
- Add GitHub Copilot CLI permission sync, writing supported allow rules to `.copilot/permissions-config.json`.
|
|
152
|
+
|
|
153
|
+
- **Lease lifecycle: setup-copy, step progress, and tailscale plumbing (RUSH-1920/1921/1924).** `agents run --lease` gains a library core the command layer wires up: `copySetupToBox` pushes the git-tracked subset of the local `~/.agents` onto the box and refreshes it (never `~/.claude`); the box bootstrap now echoes `___PHASE_<name>___` sentinels parsed into a structured `LeaseStep` stream (`onStep` + `renderStepLine`); and a `netMode: 'tailscale'` path leases boxes onto the tailnet (`--network tailscale -tailscale-tags tag:crabbox`, `CRABBOX_TAILSCALE_AUTH_KEY` from a secrets bundle) with `CrabboxBox.tailscaleIPv4`/`tailscaleFQDN` parsed from box labels. Source: `apps/cli/src/lib/crabbox/setup-copy.ts`, `apps/cli/src/lib/crabbox/progress.ts`, `apps/cli/src/lib/crabbox/lease.ts`, `apps/cli/src/lib/crabbox/cli.ts`.
|
|
154
|
+
|
|
155
|
+
- **`agents cloud run --json` now emits machine-readable failures.** `die()` — the
|
|
156
|
+
shared fatal-exit path — always wrote red text to stderr and left stdout empty,
|
|
157
|
+
so an agent parsing `--json` output saw nothing plus a bare nonzero exit with no
|
|
158
|
+
reason. `die()` gains an optional `{ json, hint }` and, in json mode, prints
|
|
159
|
+
`{"error", "hint"?}` to stdout; a pure `formatDie()` makes the human/agent split
|
|
160
|
+
unit-testable. Every failure path in `cloud run` now threads the resolved
|
|
161
|
+
`--json` flag. Source: `apps/cli/src/lib/format.ts`, `apps/cli/src/commands/cloud.ts`.
|
|
162
|
+
(RUSH-1830)
|
|
163
|
+
|
|
164
|
+
- **Show live Droid quota bars in `agents view` (RUSH-1357).** Factory billing
|
|
165
|
+
limits now render as `S`/`W`/`M` windows for Droid, matching Claude's live-usage
|
|
166
|
+
display. Source: `apps/cli/src/lib/usage.ts`.
|
|
167
|
+
|
|
168
|
+
- **`agents events` is now one unified stream — operational + agent activity.** Agent-semantic events (plans, PRs, worktrees, sub-agents, artifacts) share the event vocabulary and read through the same reader as operational events (secrets, teams, commands), newest-first. `--module activity` shows agent events, `--audit` restricts to operational only, and all existing filters (`--event`, `--agent`, `--since`, `--command`) apply across both. New `readUnifiedEvents` (`apps/cli/src/lib/event-stream.ts`) is the single read surface for higher-level features. Source: `apps/cli/src/lib/events.ts`, `apps/cli/src/lib/activity.ts`, `apps/cli/src/commands/events.ts`.
|
|
169
|
+
|
|
170
|
+
- **The daemon no longer crash-loops on headless Linux when a routine is overdue.**
|
|
171
|
+
On an overdue routine the daemon fires a best-effort desktop notification via
|
|
172
|
+
`notify-send` (Linux) / `osascript` (macOS). A missing notifier binary — the
|
|
173
|
+
default on a headless box without `libnotify-bin` — surfaces as an asynchronous
|
|
174
|
+
`spawn` `'error'` event, not the synchronous throw the surrounding `try/catch`
|
|
175
|
+
expected, so Node re-threw it as an uncaught exception and killed the daemon.
|
|
176
|
+
systemd then restart-looped it every ~10s, which also tore down the browser IPC
|
|
177
|
+
socket (`agents browser start` failed with "Timeout waiting for browser daemon
|
|
178
|
+
socket"). Both notifier spawns now carry an `'error'` listener so the failure is
|
|
179
|
+
swallowed as the "best-effort" contract already promised. Source:
|
|
180
|
+
`apps/cli/src/lib/overdue.ts`, `apps/cli/src/lib/overdue.test.ts`.
|
|
181
|
+
|
|
182
|
+
- **`agents fleet apply` — reconcile the fleet from under the `fleet` verb.** The idempotent reconcile engine already shipped as top-level `agents apply`, but users who reach for `fleet`/`devices` as the noun (`fleet capture`, `fleet login`, `fleet status`) had no matching `fleet apply`. This surfaces the identical command as `agents fleet apply` (and `agents devices apply`) via a shared configurator, so the two can never drift — same flags, same engine, same `--plan`/`--device`/`--only` semantics. Pure discoverability alias; no behavior change to `agents apply`. Source: `apps/cli/src/commands/apply.ts` (`configureApplyCommand`, `registerFleetApplyAlias`), `apps/cli/src/commands/ssh.ts`.
|
|
183
|
+
|
|
184
|
+
- **`agents fleet login` now finds the agent CLIs on the remote box.** The remote drive ran the login command over a non-login SSH shell (`ssh <box> kimi`), where the agents-cli shims (`~/.agents/.cache/shims`) are not on PATH — so `kimi`/`droid`/`codex` were "command not found" and the device-code scrape always timed out. The remote command now prepends the shim dir (resolved on the box via `$HOME`) to PATH so the login program launches. Source: `apps/cli/src/lib/fleet/remote-login.ts`.
|
|
185
|
+
|
|
186
|
+
- **New `agents fleet login` — log agent CLIs into every fleet box over SSH from one browser page.** File-copying one OAuth credential across N machines is fatal: a shared refresh token rotates server-side on first refresh and invalidates the other copies. The durable fix is a per-machine login (one interactive OAuth per agent x box), and this command makes that bearable. It drives each box's device-code flow through the PTY sidecar (`ssh -tt <box> <loginCmd>`), scrapes the verification URL + user code, and surfaces every pending login in ONE local dark/light dashboard with per-code `Authorize` deep-links and TTL countdowns — so you enter codes back-to-back instead of babysitting N terminals. Default mode requests all codes concurrently; `--interactive` walks one box at a time, requesting each code just-in-time so the ~15-min TTL can't expire while you work. Only true device-code flows are driven (droid, codex, kimi); loopback / keychain-bound / uncharacterized agents (claude, gemini, antigravity, opencode, grok) are flagged non-remotable with an honest reason instead of a mis-drive. Flags: `--agents <csv>`, `--devices <csv>`, `--all`, `--interactive`, `--json`. Source: `apps/cli/src/lib/fleet/remote-login.ts`, `apps/cli/src/lib/fleet/auth-sync.ts` (`FLEET_LOGIN_FLOWS`), `apps/cli/src/commands/ssh.ts`, `apps/cli/src/lib/open-url.ts`.
|
|
187
|
+
|
|
188
|
+
- **`agents fleet ping` stops crying wolf on healthy accounts.** The auth matrix
|
|
189
|
+
painted a fully-logged-in fleet as half-broken: `codex`/`grok` (which have no
|
|
190
|
+
in-repo live-probe endpoint) rolled up as an alarming yellow `0/N`, and the
|
|
191
|
+
`--verbose` per-account list painted `expired` **red** — lumped with a real
|
|
192
|
+
`revoked` — even though `expired` is soft and self-refreshes on the CLI's next
|
|
193
|
+
launch (kimi/droid). Both renderers now share one truthful color model
|
|
194
|
+
(`verdictColor` / `authCellColor`): red is reserved for `revoked` (the only
|
|
195
|
+
"re-login now"); `unverified` reads as neutral **gray** "signed in
|
|
196
|
+
(unverifiable)"; `expired`/`rate_limited`/`error` are soft **yellow**; and the
|
|
197
|
+
cell numerator counts signed-in accounts (`live + present`) so a logged-in codex
|
|
198
|
+
fleet reads `1/1`, not `0/1`. Separately, `fleet ping --verbose` now actually
|
|
199
|
+
emits the per-account breakdown: the root program's global `--verbose` was
|
|
200
|
+
shadowing the subcommand flag, so the breakdown was silently unreachable — the
|
|
201
|
+
action now reads the effective value from the merged globals. Source:
|
|
202
|
+
`apps/cli/src/lib/auth-health.ts`, `apps/cli/src/commands/ssh.ts`,
|
|
203
|
+
`apps/cli/src/lib/auth-health.test.ts`.
|
|
204
|
+
|
|
205
|
+
- **Wire allowlist support for ForgeCode and Hermes (RUSH-1748, RUSH-1749).** ForgeCode now receives permission groups as `~/.forge/permissions.yaml` operation-family policies (`read`, `write`, `command`, `url`) for built-in tools; this file is active only when `.forge.toml` has `restricted = true`, and MCP tools bypass it. Hermes now receives command allow rules in `~/.hermes/config.yaml` `command_allowlist` and deny globs in `approvals.deny`, preserving sibling YAML keys such as `mcp_servers` and `hooks`. Source: `apps/cli/src/lib/agents.ts`, `apps/cli/src/lib/permissions.ts`, `apps/cli/src/lib/resources/permissions.ts`, `apps/cli/src/lib/staleness/detectors/permissions.ts`, `apps/cli/docs/{00-concepts,02-resource-sync}.md`.
|
|
206
|
+
|
|
207
|
+
- **`agents run --lease`/`--box` fail fast outside a git repo instead of billing a dead box.** crabbox syncs the working directory to the leased box with `git ls-files`, so from a non-git directory the run died at `build sync file list: exit status 128` — but only *after* provisioning (and billing) the box. `agents run` now checks the working directory is a git repo before provisioning and exits with an actionable message (`… is not a git repository. Run from inside a git repo, or initialize one: (cd <dir> && git init)`). Source: `apps/cli/src/commands/exec.ts`.
|
|
208
|
+
|
|
209
|
+
- **Fix `agents run --lease` setup-copy (and `agents ssh <slug>`) to actually reach the box.** Both used a raw `ssh crabbox@ip:2222`, which fails `publickey` — crabbox provisions a per-lease identity key. They now tunnel through crabbox's own ssh invocation (`crabbox ssh --id <slug> --reclaim`), so the git-tracked `~/.agents` config really lands on a leased box (`agents repo refresh` then materializes it) and `agents ssh <slug>` connects. Verified end-to-end on a real Hetzner box. Source: `apps/cli/src/lib/crabbox/{setup-copy,cli}.ts`, `apps/cli/src/commands/ssh.ts`.
|
|
210
|
+
|
|
211
|
+
- **Fix the Linear `--label` trigger filter matching nothing.** `routines` and
|
|
212
|
+
`monitors` jobs triggered on `linear:Issue` with `--label <name>` never fired:
|
|
213
|
+
the matcher read `data.labels.nodes[].name` (the GraphQL-query connection
|
|
214
|
+
shape), but Linear webhook bodies flatten list relations — `data.labels` is a
|
|
215
|
+
flat array of label objects. The `.nodes` read always yielded `[]`, so every
|
|
216
|
+
label filter silently failed to match. It now reads the flat array. The prior
|
|
217
|
+
unit test fixtured the same wrong shape, so the suite was green while the
|
|
218
|
+
integration was dead; the fixture now uses the real webhook shape and a
|
|
219
|
+
regression test locks it. Source: `apps/cli/src/lib/triggers/webhook.ts`.
|
|
220
|
+
|
|
221
|
+
- **`agents menubar` now works from the Bun single-file binary.** When the CLI runs
|
|
222
|
+
as the compiled Bun executable, `import.meta.url` points inside the virtual
|
|
223
|
+
`/$bunfs/` bundle, so the menu-bar helper couldn't find the shipped
|
|
224
|
+
`MenubarHelper.app` on disk (`bundle source: missing (cannot enable)`) or read its
|
|
225
|
+
own `package.json` (`current version: unknown`, and a perpetual "stale" warning).
|
|
226
|
+
`enable` refused with "no menu-bar helper bundle ships with this install." Version
|
|
227
|
+
and bundle resolution now fall back to the real on-disk install, located by
|
|
228
|
+
following the `agents` launcher symlink, so `enable`/`disable`/`status` behave the
|
|
229
|
+
same whether the CLI runs under Node or the Bun binary. Source:
|
|
230
|
+
`apps/cli/src/lib/version.ts`, `apps/cli/src/lib/menubar/install-menubar.ts`.
|
|
231
|
+
|
|
232
|
+
- Add OpenClaw workflow sync by projecting agents-cli workflows into Lobster `.lobster` files under `.openclaw/workflows/`.
|
|
233
|
+
|
|
234
|
+
- **Fix the PTY sidecar (`agents pty`, interactive `agents teams`, `agents fleet login`) on the macOS standalone binary.** Since the macOS release became a `bun --compile` standalone (#315), the sidecar was spawned AS that binary (`process.execPath pty _server`) — but a Bun standalone cannot `require()` a native addon, so node-pty's `pty.node` failed to load (`Cannot require module ../build/Debug/pty.node`) and every PTY-backed command died with "PTY server failed to start within 5 seconds." `getServerSpawnArgs` now detects the standalone case and runs the sidecar via a real `node` executing the `dist/index.js` that ships beside the binary (where the prebuilt `pty.node` loads from disk), falling back to the binary only when no node / no dist is found. Verified end-to-end against a real compiled Mach-O standalone. Source: `apps/cli/src/lib/pty-client.ts`.
|
|
235
|
+
|
|
236
|
+
- `agents sessions` now indexes routine-run transcripts from durable run history; use `agents sessions --routine --all` or `agents sessions <run-id>` to inspect a routine run with the existing summary view.
|
|
237
|
+
|
|
238
|
+
- **`agents routines add`, `run`, and `runs` now support `--json`.** Previously only
|
|
239
|
+
`list`/`status` emitted JSON, so an agent creating a routine or triggering a run
|
|
240
|
+
had to scrape human strings for the job name / run id. `add` emits
|
|
241
|
+
`{ ok, added, job }`, `run` emits `{ ok, job, runId, logDir }`, and `runs` emits an
|
|
242
|
+
array of run records — all on stdout, with the scheduler-start banner suppressed so
|
|
243
|
+
it never pollutes the JSON stream. Source: `apps/cli/src/commands/routines.ts`.
|
|
244
|
+
(RUSH-1833)
|
|
245
|
+
|
|
246
|
+
- **`agents run <agent>` no longer hangs when launched headless without a prompt.**
|
|
247
|
+
A run with no prompt and no explicit `--interactive` resolves to interactive
|
|
248
|
+
intent — but in a non-TTY shell (a headless agent, a pipe, CI) there is no
|
|
249
|
+
terminal to host the REPL, so it attached a TUI to dead stdin and hung forever.
|
|
250
|
+
It now fails fast with the headless alternatives (`agents run <agent> "<task>"`
|
|
251
|
+
or `agents run <agent> --headless` to read the prompt from stdin). An explicit
|
|
252
|
+
`--interactive` is still honored. Source: `apps/cli/src/commands/exec.ts`,
|
|
253
|
+
`apps/cli/src/lib/exec.ts` (`inferredInteractiveWithoutTty`). (RUSH-1829)
|
|
254
|
+
|
|
255
|
+
- Menu bar routines now include latest run `exitCode` and `failureReason` from `agents routines list --json`, show failed routine reasons inline, label healthy-but-overdue routines as `overdue` instead of `exit 0`, and open the concise logs summary instead of a raw Terminal dump.
|
|
256
|
+
|
|
257
|
+
- Show Droid teammate activity in `agents teams collect` by normalizing stream-json tools, file edits, and final messages.
|
|
258
|
+
|
|
259
|
+
Fix: route remaining specialized direct SSH spawns through the shared hardened SSH baseline.
|
|
260
|
+
|
|
261
|
+
- **Agent feed dispatch now keeps local and remote answer paths separate (RUSH-1472).** `agents feed` only applies stall suppression, default-on-no-answer policy, and dispatch controls to blocks owned by the local machine, so remote feed rows cannot enqueue answers into the wrong local mailbox. Per-block `timeoutMinutes` is honored for approval defaults and decision parking, policy/default answers are tested against the real mailbox spool, block-specific `allowedOperators` restrict high-consequence answers, and urgent notification text is emoji-free. Source: `apps/cli/src/commands/feed.ts`, `apps/cli/src/lib/{ask-classifier,feed,feed-policy,notify}.ts`.
|
|
262
|
+
|
|
263
|
+
- **`agents feed` ranks blocked agents by cost of delay and surfaces runaway/needy control cards (RUSH-1478).** Open blocks are sorted by idle time, downstream blast radius, dollar burn rate, and classifier irreducibility, while silent high-burn/relaunch-loop agents and chronic askers render once as control cards with `ag feed --pause` / `ag feed --kill` actions. Source: `apps/cli/src/lib/feed-ranking.ts`, `apps/cli/src/commands/feed.ts`, `apps/cli/src/lib/feed.ts`.
|
|
264
|
+
|
|
265
|
+
- Make live session follows compact by default: `agents sessions tail` now prints low-noise message/tool/result lines unless `--json` is passed, and `agents logs -f <id>` keeps raw transcript streaming behind `--full`.
|
|
266
|
+
|
|
267
|
+
- **Fix `agents repo refresh` for stale plugin skill shadows.** Full refresh now forces a materialization pass, copies trusted plugin-bundled skills into legacy top-level agent-home skill dirs when those names already matter to the agent, and prunes orphaned top-level skill dirs whose source no longer exists.
|
|
268
|
+
|
|
269
|
+
- `agents run <profile> --lease` now provisions the profile's host runtime and temporary profile config on the leased box without copying base-runtime OAuth credentials when the profile authenticates with its own API key, including OpenCode and Antigravity-hosted profiles.
|
|
270
|
+
|
|
271
|
+
- `agents pty` now starts its sidecar correctly from the standalone CLI binary and includes the spawned command plus recent sidecar log lines when startup fails.
|
|
272
|
+
|
|
273
|
+
- Fixed `agents secrets openclaw-keychain migrate` so OpenClaw Keychain writes no longer expose secret values in process argv, and migration now fails closed when matching plaintext credentials disagree.
|
|
274
|
+
|
|
275
|
+
- `agents share setup` and `agents setup share` now read Cloudflare provisioning credentials from the `cloudflare` secrets bundle and persist the Worker write token as `WRITE_TOKEN` in the `share` bundle, matching the setup/onboarding contract while keeping endpoint config in `agents.yaml` under `share:`.
|
|
276
|
+
|
|
277
|
+
- Fix `agents routines list` and `agents routines view` so a project-layer routine with the same name no longer hides the user-layer `devices` allowlist written by `agents routines devices --set`.
|
|
278
|
+
|
|
279
|
+
- Keep piped CLI output human-readable unless `--json` is passed.
|
|
280
|
+
|
|
281
|
+
- Add `--json` to `agents monitors view` and `agents monitors test`, and send monitor errors to stderr so JSON stdout stays parseable.
|
|
282
|
+
|
|
283
|
+
- Add `--json` output to `agents routines add`, `agents routines run`, and
|
|
284
|
+
`agents routines runs` so scripts can capture routine and run ids without scraping human text.
|
|
285
|
+
|
|
286
|
+
- Fix hook directory sync status so bundled hook directories such as `hooks/tests` copy correctly and no longer appear permanently drifted after sync.
|
|
287
|
+
|
|
288
|
+
- Neutralize residual OSS scrub breadcrumbs by replacing browser/session test fixture hostnames with `remote-host` and removing legacy private product path references from cloud proxy comments.
|
|
289
|
+
|
|
290
|
+
- **Add `agents setup mine` / `agents mine` — white-label the CLI.** Mint your own personally-named binary (e.g. `jack`) that runs every agents verb under your name, with the built-in commands you disable hidden and a per-brand resource profile that curates skills/plugins/MCP/etc. `agents setup mine` is the wizard; `agents mine init/list/toggle/remove` manage brands. Free and Apache-2.0. Source: `apps/cli/src/commands/mine.ts`, `apps/cli/src/lib/brand.ts`.
|
|
291
|
+
|
|
292
|
+
- **One-time "star us on GitHub" nudge after your first successful run.** After a
|
|
293
|
+
user's first successful `agents run` or `agents teams`, agents-cli prints a
|
|
294
|
+
single plain inline line pointing at the repo. Shown at most once ever (claimed
|
|
295
|
+
with an atomic O_EXCL sentinel so concurrent `agents teams` processes can't
|
|
296
|
+
double-print), and skipped for non-TTY, CI, `--json`/`--quiet`, or
|
|
297
|
+
`AGENTS_NO_NUDGE=1`. The `agents teams` call site only nudges on a clean drain
|
|
298
|
+
(no failed teammates). Source: `apps/cli/src/lib/star-nudge.ts`,
|
|
299
|
+
`apps/cli/src/commands/exec.ts`, `apps/cli/src/commands/teams.ts`,
|
|
300
|
+
`apps/cli/src/lib/teams/supervisor.ts`.
|
|
301
|
+
|
|
3
302
|
## 1.20.72
|
|
4
303
|
|
|
5
304
|
- **Stop `agents doctor` from reporting phantom drift and `agents prune` from
|
package/README.md
CHANGED
|
@@ -35,12 +35,16 @@
|
|
|
35
35
|
|
|
36
36
|
https://agents-cli.sh/demo.mp4
|
|
37
37
|
|
|
38
|
+
## Quickstart
|
|
39
|
+
|
|
38
40
|
```bash
|
|
39
|
-
npm install -g @phnx-labs/agents-cli
|
|
40
|
-
#
|
|
41
|
-
|
|
41
|
+
npm install -g @phnx-labs/agents-cli # or: curl -fsSL agi-cli.sh | sh
|
|
42
|
+
agents setup # first-time setup -- config + pick your agents
|
|
43
|
+
agents run claude "explain this repo" # run any agent on your existing subscription
|
|
42
44
|
```
|
|
43
45
|
|
|
46
|
+
`agents setup` is interactive and idempotent -- safe to re-run on a new machine. The `agi-cli.sh` one-liner installs this same canonical `@phnx-labs/agents-cli` package. Prefer bun? `bun install -g @phnx-labs/agents-cli` works too.
|
|
47
|
+
|
|
44
48
|
Already installed? `agents upgrade` updates agents-cli itself to the latest version (`agents upgrade 1.2.3` for a specific version or dist-tag, `-y` to skip the confirm prompt). The command is `upgrade` on every platform -- there is no `agents update` (on macOS, `agents helper update` is a different command that reinstalls the keychain helper, not agents-cli).
|
|
45
49
|
|
|
46
50
|
Source: [github.com/phnx-labs/agents-cli](https://github.com/phnx-labs/agents-cli)
|
|
@@ -604,6 +608,7 @@ Bundle skills, commands, hooks, MCP servers, settings, and permissions under a s
|
|
|
604
608
|
# Install from a git URL or local path
|
|
605
609
|
agents plugins install hivemind@https://github.com/activeloopai/hivemind.git
|
|
606
610
|
agents plugins install ./my-plugin
|
|
611
|
+
agents plugins add ./my-plugin
|
|
607
612
|
|
|
608
613
|
# Apply to one agent (default version) or all supported
|
|
609
614
|
agents plugins sync rush-toolkit claude
|
|
@@ -646,6 +651,32 @@ Plugins live in the user repo (`~/.agents/plugins/`), not inside any single vers
|
|
|
646
651
|
|
|
647
652
|
---
|
|
648
653
|
|
|
654
|
+
## Make it yours
|
|
655
|
+
|
|
656
|
+
White-label the CLI. `agents setup mine` mints a **personally-named binary** — `jack` instead of `agents` — that _is_ agents-cli: same tool, your name, running the exact feature set you choose. Anyone can mint their own; Jack and Pranjal each get an independent brand.
|
|
657
|
+
|
|
658
|
+
```bash
|
|
659
|
+
agents setup mine # wizard: pick a name, check off what to disable
|
|
660
|
+
agents mine init jack --disable teams cloud # or non-interactively
|
|
661
|
+
|
|
662
|
+
jack run claude "hello" # every agents verb, under your name
|
|
663
|
+
jack --help # help, version, and errors all read "jack"
|
|
664
|
+
```
|
|
665
|
+
|
|
666
|
+
Manage brands with `agents mine list | toggle | remove`:
|
|
667
|
+
|
|
668
|
+
```bash
|
|
669
|
+
agents mine toggle jack --disable-plugin rush --disable-skill deploy
|
|
670
|
+
agents mine toggle jack --enable teams
|
|
671
|
+
agents mine remove jack --purge
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
Under the hood, `init` drops a pure pass-through shim in `~/.agents/.cache/shims/<name>` (already on `PATH`) that sets `AGENTS_BRAND` and forwards every argument to the same binary — nothing is copied or forked. The brand's config lives in `~/.agents/agents.yaml` (`brands.<name>`), so it rides `agents repo push/pull` across your fleet. Disabling a command hides it **only** under that brand; plain `agents` / `ag` keep every command. Curated skills/plugins/MCP ride a per-brand [resource profile](apps/cli/docs/profiles.md). Full reference: [Make it yours](apps/cli/docs/mine.md).
|
|
675
|
+
|
|
676
|
+
> Personal use is free and Apache-2.0. Redistributing a branded build commercially will require a license in a future release.
|
|
677
|
+
|
|
678
|
+
---
|
|
679
|
+
|
|
649
680
|
## Browser
|
|
650
681
|
|
|
651
682
|
<p align="center">
|
|
@@ -862,6 +893,7 @@ Sources: a command's stdout (`--watch` / `--poll`), an HTTP endpoint (`--poll-ht
|
|
|
862
893
|
# Publish an HTML artifact to a public link on your own Cloudflare R2 (~$0).
|
|
863
894
|
agents share setup # once: provision bucket + Worker on your CF
|
|
864
895
|
agents share plan.html --slug fleet --expire 30d # → https://<base>/fleet
|
|
896
|
+
agents share plan.html --json # URL object for plan-render hooks
|
|
865
897
|
agents share status # show the endpoint
|
|
866
898
|
```
|
|
867
899
|
|
|
@@ -877,6 +909,8 @@ this is effectively free.
|
|
|
877
909
|
**Fleet mode:** provision one endpoint, then every fleet / cloud / ephemeral agent
|
|
878
910
|
publishes through it with a shared write token — `agents share join <baseUrl>` uses an
|
|
879
911
|
existing endpoint with no provisioning. `--expire 30d|12h|<date>` auto-expires a link.
|
|
912
|
+
`--json` emits `{ url, coverUrl, expiresAt }` so plan-render automation can publish the
|
|
913
|
+
rendered HTML and post the returned link without scraping terminal text.
|
|
880
914
|
See [docs/share.md](apps/cli/docs/share.md).
|
|
881
915
|
|
|
882
916
|
---
|
|
@@ -924,7 +958,7 @@ Two repos with the same shape, different roles:
|
|
|
924
958
|
|
|
925
959
|
**Version pinning:** `agents.yaml` at project root pins which agent version to use (like `.nvmrc` for Node).
|
|
926
960
|
|
|
927
|
-
**Resource resolution:** When syncing resources (commands, skills, rules, hooks, MCP, permissions), the order is **project > user > system**. A `.agents/` directory at project root wins, then `~/.agents/`, then `~/.agents-system/`. Same-named resources higher in the chain override lower ones; everything else unions in.
|
|
961
|
+
**Resource resolution:** When syncing resources (commands, skills, rules, hooks, MCP, permissions), the order is **project > user > system**. A `.agents/` directory at project root wins, then `~/.agents/`, then `~/.agents-system/`. Same-named resources higher in the chain override lower ones; everything else unions in. Run `agents resources --merged` to see the effective skills, commands, MCP servers, hooks, rules, plugins, workflows, and subagents, with each row tagged by its winning layer.
|
|
928
962
|
|
|
929
963
|
See [docs/00-concepts.md](apps/cli/docs/00-concepts.md) for the full mental model: DotAgents repos, resource kinds, and how resolution works end-to-end.
|
|
930
964
|
|
|
@@ -1151,6 +1185,8 @@ Yes -- `agents run` is non-interactive by default. `--yes` auto-accepts prompts,
|
|
|
1151
1185
|
|
|
1152
1186
|
The auto-update prompt is suppressed automatically when stdin or stdout isn't a TTY. For headless environments where TTY detection misfires (k8s pods that allocate a PTY for stdout, cloud sandbox factories), set `AGENTS_CLI_DISABLE_AUTO_UPDATE=1` to skip the update check entirely -- no prompt, no network call.
|
|
1153
1187
|
|
|
1188
|
+
agents-cli also prints a one-time "star us on GitHub" line after your first successful `agents run`/`agents teams`. It's already skipped in CI, non-TTY, `--json`, and `--quiet` runs; set `AGENTS_NO_NUDGE=1` to suppress it everywhere.
|
|
1189
|
+
|
|
1154
1190
|
To update on demand instead of waiting for the prompt, run `agents upgrade` (add `-y` to skip the confirmation, or pass a version/dist-tag to install something other than latest).
|
|
1155
1191
|
|
|
1156
1192
|
### What happens to my config when I switch versions?
|
package/dist/bin/agents
CHANGED
|
Binary file
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agents activity` -- the agent-activity lane: a running stream of what agents
|
|
3
|
+
* DID (plan created, PR opened, worktree created, sub-agent spawned, files
|
|
4
|
+
* edited), read from the append-only per-session activity logs.
|
|
5
|
+
*
|
|
6
|
+
* Complements `agents feed` (what agents are WAITING on). Events are emitted at
|
|
7
|
+
* hook time by 11-activity-log.py, so this reader never re-parses transcripts --
|
|
8
|
+
* it tails the logs and collapses routine work to counts, surfacing milestones
|
|
9
|
+
* individually and newest-first.
|
|
10
|
+
*/
|
|
11
|
+
import type { Command } from 'commander';
|
|
12
|
+
export declare function registerActivityCommand(program: Command): void;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { collapseActivity, ensureActivityLogHook, formatActivityLine, readRecentActivity, styleForEvent, tierForEvent, } from '../lib/activity.js';
|
|
3
|
+
/** Wire the activity-log hooks into each hooks-capable version's settings. */
|
|
4
|
+
async function installActivityHooks() {
|
|
5
|
+
const warnings = [];
|
|
6
|
+
const hookInstall = ensureActivityLogHook();
|
|
7
|
+
if (hookInstall.error) {
|
|
8
|
+
warnings.push(hookInstall.error);
|
|
9
|
+
return warnings;
|
|
10
|
+
}
|
|
11
|
+
const [{ iterHooksCapableVersions, parseHookManifest, registerHooksToSettings }, { getVersionHomePath }] = await Promise.all([
|
|
12
|
+
import('../lib/hooks.js'),
|
|
13
|
+
import('../lib/versions.js'),
|
|
14
|
+
]);
|
|
15
|
+
const manifest = parseHookManifest({ warn: false });
|
|
16
|
+
for (const { agent, version } of iterHooksCapableVersions({ agent: 'claude' })) {
|
|
17
|
+
const result = registerHooksToSettings(agent, getVersionHomePath(agent, version), manifest);
|
|
18
|
+
if (result.errors.length > 0)
|
|
19
|
+
warnings.push(`${agent}@${version}: ${result.errors.join('; ')}`);
|
|
20
|
+
}
|
|
21
|
+
return warnings;
|
|
22
|
+
}
|
|
23
|
+
export function registerActivityCommand(program) {
|
|
24
|
+
program
|
|
25
|
+
.command('activity')
|
|
26
|
+
.description('Recent agent activity -- plans, PRs, worktrees, sub-agents (newest first)')
|
|
27
|
+
.option('--json', 'Emit the raw event list as JSON')
|
|
28
|
+
.option('--all', 'Include routine activity (file edits) inline, not collapsed')
|
|
29
|
+
.option('--milestones', 'Only milestone events (plans, PRs, worktrees, sub-agents)')
|
|
30
|
+
.option('-n, --limit <n>', 'Cap the number of events shown', (v) => parseInt(v, 10), 40)
|
|
31
|
+
.option('--since <minutes>', 'Only events within the last N minutes', (v) => parseInt(v, 10))
|
|
32
|
+
.action(async (opts) => {
|
|
33
|
+
const warnings = await installActivityHooks();
|
|
34
|
+
const sinceMs = typeof opts.since === 'number' && opts.since > 0
|
|
35
|
+
? Date.now() - opts.since * 60_000
|
|
36
|
+
: undefined;
|
|
37
|
+
let events = readRecentActivity({ sinceMs, limit: opts.limit });
|
|
38
|
+
if (opts.milestones)
|
|
39
|
+
events = events.filter((e) => tierForEvent(e.event) === 'milestone');
|
|
40
|
+
if (opts.json) {
|
|
41
|
+
process.stdout.write(`${JSON.stringify(events, null, 2)}\n`);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
for (const w of warnings)
|
|
45
|
+
process.stderr.write(chalk.yellow(` ! ${w}\n`));
|
|
46
|
+
if (events.length === 0) {
|
|
47
|
+
process.stdout.write(chalk.gray('No recent agent activity. Events appear here as agents create plans, open PRs, and spawn sub-agents.\n'));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const { milestones, counts, subagentCount } = collapseActivity(events);
|
|
51
|
+
process.stdout.write(chalk.bold('\n recent activity\n'));
|
|
52
|
+
const shown = opts.all ? events : milestones;
|
|
53
|
+
for (const ev of shown)
|
|
54
|
+
process.stdout.write(`${formatActivityLine(ev, { showHost: true })}\n`);
|
|
55
|
+
if (!opts.all) {
|
|
56
|
+
const parts = Object.entries(counts)
|
|
57
|
+
.sort((a, b) => b[1] - a[1])
|
|
58
|
+
.map(([event, n]) => `${styleForEvent(event).label} ×${n}`);
|
|
59
|
+
if (parts.length > 0) {
|
|
60
|
+
process.stdout.write(chalk.gray(`\n · ${parts.join(' ')}\n`));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (subagentCount > 0) {
|
|
64
|
+
process.stdout.write(chalk.magenta(`\n ⑂ ${subagentCount} sub-agent${subagentCount === 1 ? '' : 's'} spawned\n`));
|
|
65
|
+
}
|
|
66
|
+
process.stdout.write('\n');
|
|
67
|
+
});
|
|
68
|
+
}
|
package/dist/commands/apply.d.ts
CHANGED
|
@@ -9,4 +9,17 @@
|
|
|
9
9
|
import { Command } from 'commander';
|
|
10
10
|
/** padEnd on the visible width, ignoring chalk color codes. Exported for tests. */
|
|
11
11
|
export declare function stripPad(s: string, width: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Attach the reconcile options + action to a command node. Shared by the
|
|
14
|
+
* top-level `agents apply` and its `agents fleet apply` alias so the two can
|
|
15
|
+
* never drift — identical flags, identical engine.
|
|
16
|
+
*/
|
|
17
|
+
export declare function configureApplyCommand(cmd: Command): Command;
|
|
12
18
|
export declare function registerApplyCommand(program: Command): void;
|
|
19
|
+
/**
|
|
20
|
+
* Surface `agents apply` under the fleet command tree as `agents fleet apply`
|
|
21
|
+
* (and `agents devices apply`). Same reconcile engine as the top-level command —
|
|
22
|
+
* a discoverability alias for users who reach for `fleet` as the verb. Kept in
|
|
23
|
+
* lockstep via {@link configureApplyCommand}.
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerFleetApplyAlias(devicesCmd: Command): void;
|
package/dist/commands/apply.js
CHANGED
|
@@ -267,9 +267,13 @@ function reportResults(results) {
|
|
|
267
267
|
}
|
|
268
268
|
console.log(chalk.green('Fleet reconciled.'));
|
|
269
269
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
270
|
+
/**
|
|
271
|
+
* Attach the reconcile options + action to a command node. Shared by the
|
|
272
|
+
* top-level `agents apply` and its `agents fleet apply` alias so the two can
|
|
273
|
+
* never drift — identical flags, identical engine.
|
|
274
|
+
*/
|
|
275
|
+
export function configureApplyCommand(cmd) {
|
|
276
|
+
return cmd
|
|
273
277
|
.description('Reconcile the fleet to a declared profile: install agents, sync config, propagate login.')
|
|
274
278
|
.option('-f, --file <path>', 'Manifest file carrying a fleet: block (default: agents.yaml)')
|
|
275
279
|
.option('--plan', 'Show the reconcile plan and exit (no changes)')
|
|
@@ -292,6 +296,9 @@ export function registerApplyCommand(program) {
|
|
|
292
296
|
process.exit(1);
|
|
293
297
|
}
|
|
294
298
|
});
|
|
299
|
+
}
|
|
300
|
+
export function registerApplyCommand(program) {
|
|
301
|
+
const applyCmd = configureApplyCommand(program.command('apply'));
|
|
295
302
|
setHelpSections(applyCmd, {
|
|
296
303
|
examples: `
|
|
297
304
|
# Preview what would change across the fleet
|
|
@@ -305,3 +312,21 @@ export function registerApplyCommand(program) {
|
|
|
305
312
|
`,
|
|
306
313
|
});
|
|
307
314
|
}
|
|
315
|
+
/**
|
|
316
|
+
* Surface `agents apply` under the fleet command tree as `agents fleet apply`
|
|
317
|
+
* (and `agents devices apply`). Same reconcile engine as the top-level command —
|
|
318
|
+
* a discoverability alias for users who reach for `fleet` as the verb. Kept in
|
|
319
|
+
* lockstep via {@link configureApplyCommand}.
|
|
320
|
+
*/
|
|
321
|
+
export function registerFleetApplyAlias(devicesCmd) {
|
|
322
|
+
const sub = configureApplyCommand(devicesCmd.command('apply'));
|
|
323
|
+
setHelpSections(sub, {
|
|
324
|
+
examples: `
|
|
325
|
+
# Preview the fleet reconcile
|
|
326
|
+
agents fleet apply --plan
|
|
327
|
+
|
|
328
|
+
# Reconcile every device to the profile
|
|
329
|
+
agents fleet apply -y
|
|
330
|
+
`,
|
|
331
|
+
});
|
|
332
|
+
}
|
package/dist/commands/browser.js
CHANGED
|
@@ -1420,7 +1420,7 @@ function registerTaskCommands(browser) {
|
|
|
1420
1420
|
process.exit(1);
|
|
1421
1421
|
}
|
|
1422
1422
|
try {
|
|
1423
|
-
const { env } = readAndResolveBundleEnv(parsed.bundle, { caller: 'browser type', keys: [parsed.key], agentOnly: isHeadlessSecretsContext() });
|
|
1423
|
+
const { env } = readAndResolveBundleEnv(parsed.bundle, { caller: 'browser type', keys: [parsed.key], keyMode: 'storage', agentOnly: isHeadlessSecretsContext() });
|
|
1424
1424
|
if (!(parsed.key in env)) {
|
|
1425
1425
|
console.error(`Key "${parsed.key}" not in bundle "${parsed.bundle}".`);
|
|
1426
1426
|
process.exit(1);
|