@phnx-labs/agents-cli 1.22.35 → 1.22.38
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 +708 -2
- package/README.md +83 -43
- package/dist/bin/agents +0 -0
- package/dist/bootstrap.d.ts +15 -0
- package/dist/bootstrap.js +1212 -0
- package/dist/commands/accounts.d.ts +4 -11
- package/dist/commands/accounts.js +159 -27
- package/dist/commands/artifacts-setup.d.ts +53 -0
- package/dist/commands/artifacts-setup.js +161 -0
- package/dist/commands/artifacts.d.ts +18 -0
- package/dist/commands/artifacts.js +58 -0
- package/dist/commands/attach.js +17 -4
- package/dist/commands/audit.d.ts +8 -8
- package/dist/commands/audit.js +57 -47
- package/dist/commands/browser.js +17 -11
- package/dist/commands/cloud.js +1 -1
- package/dist/commands/commands.js +0 -11
- package/dist/commands/computer-actions.js +33 -0
- package/dist/commands/computer-sessions-picker.d.ts +21 -0
- package/dist/commands/computer-sessions-picker.js +141 -0
- package/dist/commands/computer.d.ts +16 -0
- package/dist/commands/computer.js +37 -0
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.js +401 -0
- package/dist/commands/cp.d.ts +84 -0
- package/dist/commands/cp.js +231 -0
- package/dist/commands/daemon.js +243 -14
- package/dist/commands/detach-core.d.ts +1 -1
- package/dist/commands/detach-core.js +12 -2
- package/dist/commands/detach.js +1 -1
- package/dist/commands/doctor.js +64 -5
- package/dist/commands/events.d.ts +24 -12
- package/dist/commands/events.js +144 -28
- package/dist/commands/exec.js +86 -42
- package/dist/commands/feed.d.ts +1 -1
- package/dist/commands/feed.js +16 -8
- package/dist/commands/focus.d.ts +33 -1
- package/dist/commands/focus.js +177 -17
- package/dist/commands/funnel.d.ts +1 -1
- package/dist/commands/go.js +9 -8
- package/dist/commands/harness-wizard.d.ts +1 -0
- package/dist/commands/harness-wizard.js +18 -20
- package/dist/commands/harness.d.ts +2 -0
- package/dist/commands/harness.js +59 -26
- package/dist/commands/hooks.js +0 -11
- package/dist/commands/inspect.d.ts +94 -1
- package/dist/commands/inspect.js +866 -40
- package/dist/commands/lease.d.ts +4 -4
- package/dist/commands/lease.js +6 -6
- package/dist/commands/login.js +0 -13
- package/dist/commands/logs.d.ts +2 -2
- package/dist/commands/logs.js +2 -2
- package/dist/commands/mcp.js +7 -2
- package/dist/commands/memory.js +7 -2
- package/dist/commands/message.d.ts +1 -1
- package/dist/commands/message.js +37 -6
- package/dist/commands/models.js +71 -0
- package/dist/commands/monitors.d.ts +0 -1
- package/dist/commands/monitors.js +199 -16
- package/dist/commands/open.d.ts +18 -0
- package/dist/commands/open.js +57 -0
- package/dist/commands/packages.js +2 -107
- package/dist/commands/plugins.js +6 -3
- package/dist/commands/profiles.d.ts +1 -0
- package/dist/commands/profiles.js +16 -160
- package/dist/commands/projects.d.ts +28 -0
- package/dist/commands/projects.js +125 -5
- package/dist/commands/reconnect.js +9 -3
- package/dist/commands/repo.js +42 -1
- package/dist/commands/resource-view.d.ts +17 -0
- package/dist/commands/resource-view.js +36 -14
- package/dist/commands/resume.js +9 -2
- package/dist/commands/routines.d.ts +0 -2
- package/dist/commands/routines.js +473 -289
- package/dist/commands/secrets.js +52 -9
- package/dist/commands/sessions-export.d.ts +47 -0
- package/dist/commands/sessions-export.js +116 -6
- package/dist/commands/sessions-import.d.ts +17 -0
- package/dist/commands/sessions-import.js +114 -6
- package/dist/commands/sessions-migrate.d.ts +27 -0
- package/dist/commands/sessions-migrate.js +50 -9
- package/dist/commands/sessions-picker.js +23 -4
- package/dist/commands/sessions-resume.d.ts +5 -3
- package/dist/commands/sessions-resume.js +30 -8
- package/dist/commands/sessions-watch.d.ts +2 -0
- package/dist/commands/sessions-watch.js +53 -0
- package/dist/commands/sessions.d.ts +66 -3
- package/dist/commands/sessions.js +298 -47
- package/dist/commands/setup-browser.js +2 -2
- package/dist/commands/setup-mine.js +0 -1
- package/dist/commands/setup-preferences.js +1 -1
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.js +31 -5
- package/dist/commands/share.d.ts +87 -7
- package/dist/commands/share.js +320 -58
- package/dist/commands/skills.js +0 -11
- package/dist/commands/snapshot.js +1 -1
- package/dist/commands/ssh.d.ts +18 -0
- package/dist/commands/ssh.js +549 -210
- package/dist/commands/sync.d.ts +5 -0
- package/dist/commands/sync.js +212 -32
- package/dist/commands/teams.d.ts +13 -0
- package/dist/commands/teams.js +187 -30
- package/dist/commands/tickets.d.ts +2 -0
- package/dist/commands/tickets.js +43 -0
- package/dist/commands/update.js +2 -4
- package/dist/commands/usage.js +5 -3
- package/dist/commands/versions.js +11 -5
- package/dist/commands/view.js +15 -7
- package/dist/commands/webhook.d.ts +2 -2
- package/dist/commands/webhook.js +7 -7
- package/dist/index.d.ts +18 -2
- package/dist/index.js +53 -1264
- package/dist/lib/account-catalog.d.ts +18 -0
- package/dist/lib/account-catalog.js +38 -0
- package/dist/lib/account-provider-registry.d.ts +18 -0
- package/dist/lib/account-provider-registry.js +59 -0
- package/dist/lib/account-registry.d.ts +40 -0
- package/dist/lib/account-registry.js +239 -0
- package/dist/lib/account-schema.d.ts +44 -0
- package/dist/lib/account-schema.js +91 -0
- package/dist/lib/account-state-service.d.ts +21 -0
- package/dist/lib/account-state-service.js +60 -0
- package/dist/lib/activity.d.ts +1 -1
- package/dist/lib/activity.js +8 -1
- package/dist/lib/add-dir.d.ts +80 -0
- package/dist/lib/add-dir.js +241 -0
- package/dist/lib/agent-cli-commands.d.ts +11 -0
- package/dist/lib/agent-cli-commands.js +30 -0
- package/dist/lib/agents.js +44 -36
- package/dist/lib/answer-router.js +1 -1
- package/dist/lib/audit/log.d.ts +10 -27
- package/dist/lib/audit/log.js +20 -33
- package/dist/lib/auth-health.d.ts +9 -2
- package/dist/lib/auth-health.js +42 -9
- package/dist/lib/auto-pull-worker.js +7 -3
- package/dist/lib/auto-pull.d.ts +44 -3
- package/dist/lib/auto-pull.js +88 -5
- package/dist/lib/binary-shadow.d.ts +28 -0
- package/dist/lib/binary-shadow.js +121 -0
- package/dist/lib/brand.js +9 -3
- package/dist/lib/browser/hygiene.d.ts +90 -0
- package/dist/lib/browser/hygiene.js +146 -0
- package/dist/lib/browser/ipc.d.ts +30 -0
- package/dist/lib/browser/ipc.js +93 -4
- package/dist/lib/browser/profiles.d.ts +3 -2
- package/dist/lib/browser/profiles.js +65 -22
- package/dist/lib/browser/service.d.ts +79 -1
- package/dist/lib/browser/service.js +231 -14
- package/dist/lib/browser/sessions-list.d.ts +22 -2
- package/dist/lib/browser/sessions-list.js +54 -6
- package/dist/lib/browser/stream.d.ts +2 -0
- package/dist/lib/browser/stream.js +1 -0
- package/dist/lib/browser/types.d.ts +63 -1
- package/dist/lib/byok-usage.d.ts +9 -2
- package/dist/lib/byok-usage.js +133 -31
- package/dist/lib/cli-entry.d.ts +11 -0
- package/dist/lib/cli-entry.js +46 -0
- package/dist/lib/cloud/host.d.ts +1 -1
- package/dist/lib/cloud/host.js +2 -2
- package/dist/lib/cloud/registry.js +1 -1
- package/dist/lib/cloud/types.d.ts +1 -1
- package/dist/lib/commands.d.ts +2 -0
- package/dist/lib/commands.js +2 -0
- package/dist/lib/computer/sessions-list.d.ts +150 -0
- package/dist/lib/computer/sessions-list.js +363 -0
- package/dist/lib/config-keys.d.ts +86 -0
- package/dist/lib/config-keys.js +193 -0
- package/dist/lib/config-machine-keys.d.ts +12 -0
- package/dist/lib/config-machine-keys.js +17 -0
- package/dist/lib/config-transfer.js +3 -4
- package/dist/lib/crabbox/cli.d.ts +2 -2
- package/dist/lib/crabbox/cli.js +3 -3
- package/dist/lib/daemon-health.d.ts +22 -0
- package/dist/lib/daemon-health.js +33 -3
- package/dist/lib/daemon-services.d.ts +50 -0
- package/dist/lib/daemon-services.js +147 -0
- package/dist/lib/daemon-ticks.d.ts +35 -66
- package/dist/lib/daemon-ticks.js +77 -159
- package/dist/lib/daemon.d.ts +72 -4
- package/dist/lib/daemon.js +792 -202
- package/dist/lib/deeplink/register.d.ts +49 -0
- package/dist/lib/deeplink/register.js +253 -0
- package/dist/lib/deeplink/url.d.ts +34 -0
- package/dist/lib/deeplink/url.js +78 -0
- package/dist/lib/device-config.d.ts +124 -29
- package/dist/lib/device-config.js +346 -141
- package/dist/lib/devices/config-migration.d.ts +42 -0
- package/dist/lib/devices/config-migration.js +203 -0
- package/dist/lib/devices/connect.js +14 -7
- package/dist/lib/devices/doctor-findings.d.ts +4 -1
- package/dist/lib/devices/doctor-findings.js +20 -1
- package/dist/lib/devices/harness-inventory.d.ts +11 -2
- package/dist/lib/devices/harness-inventory.js +0 -0
- package/dist/lib/devices/health.d.ts +1 -1
- package/dist/lib/devices/health.js +1 -1
- package/dist/lib/devices/pending.d.ts +22 -1
- package/dist/lib/devices/pending.js +67 -2
- package/dist/lib/devices/registry.d.ts +0 -25
- package/dist/lib/devices/registry.js +2 -83
- package/dist/lib/devices/resolve-profile.d.ts +20 -0
- package/dist/lib/devices/resolve-profile.js +44 -0
- package/dist/lib/devices/rollout-verify.d.ts +101 -0
- package/dist/lib/devices/rollout-verify.js +193 -0
- package/dist/lib/devices/ssh-config.js +10 -6
- package/dist/lib/event-families.d.ts +28 -0
- package/dist/lib/event-families.js +159 -0
- package/dist/lib/event-stream.d.ts +9 -1
- package/dist/lib/event-stream.js +26 -9
- package/dist/lib/events.d.ts +9 -1
- package/dist/lib/events.js +21 -6
- package/dist/lib/exec.d.ts +30 -0
- package/dist/lib/exec.js +219 -121
- package/dist/lib/feed-broadcast.d.ts +25 -0
- package/dist/lib/feed-broadcast.js +33 -0
- package/dist/lib/feed.d.ts +1 -1
- package/dist/lib/feed.js +12 -2
- package/dist/lib/fleet/capture.js +15 -0
- package/dist/lib/fleet/manifest.js +9 -0
- package/dist/lib/fleet/types.d.ts +9 -0
- package/dist/lib/fleet-status.js +10 -8
- package/dist/lib/git.d.ts +21 -7
- package/dist/lib/git.js +122 -18
- package/dist/lib/hosts/dispatch.d.ts +8 -3
- package/dist/lib/hosts/dispatch.js +29 -3
- package/dist/lib/hosts/logs.d.ts +2 -2
- package/dist/lib/hosts/logs.js +2 -2
- package/dist/lib/hosts/option.js +1 -1
- package/dist/lib/hosts/passthrough.d.ts +2 -3
- package/dist/lib/hosts/passthrough.js +10 -24
- package/dist/lib/hosts/progress.js +2 -2
- package/dist/lib/hosts/providers/devices.d.ts +3 -3
- package/dist/lib/hosts/providers/devices.js +18 -12
- package/dist/lib/hosts/ready.d.ts +5 -1
- package/dist/lib/hosts/ready.js +9 -3
- package/dist/lib/hosts/reconcile.d.ts +2 -2
- package/dist/lib/hosts/reconcile.js +2 -2
- package/dist/lib/hosts/registry.js +14 -9
- package/dist/lib/hosts/remote-cmd.js +1 -1
- package/dist/lib/hosts/remote-os.d.ts +9 -6
- package/dist/lib/hosts/remote-os.js +13 -6
- package/dist/lib/hosts/routing-flag.d.ts +23 -0
- package/dist/lib/hosts/routing-flag.js +41 -0
- package/dist/lib/hosts/run-target.js +1 -1
- package/dist/lib/hosts/session-index.js +1 -1
- package/dist/lib/hosts/tasks.d.ts +6 -6
- package/dist/lib/hosts/tasks.js +4 -4
- package/dist/lib/hosts/types.js +1 -2
- package/dist/lib/installations/resolve.js +2 -8
- package/dist/lib/isolation-boundary-report.js +0 -1
- package/dist/lib/linear-cache.d.ts +7 -0
- package/dist/lib/linear-cache.js +31 -4
- package/dist/lib/linear-project-counts.d.ts +1 -1
- package/dist/lib/linear-project-counts.js +2 -3
- package/dist/lib/linear-projects.js +1 -1
- package/dist/lib/loop.d.ts +2 -2
- package/dist/lib/loop.js +1 -1
- package/dist/lib/mailbox-target.d.ts +1 -1
- package/dist/lib/mailbox-target.js +1 -1
- package/dist/lib/manifest.js +7 -4
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/snapshot.d.ts +3 -2
- package/dist/lib/menubar/snapshot.js +6 -2
- package/dist/lib/migrate-fold.d.ts +33 -0
- package/dist/lib/migrate-fold.js +130 -0
- package/dist/lib/migrate.d.ts +34 -34
- package/dist/lib/migrate.js +106 -128
- package/dist/lib/model-tier-overrides.d.ts +1 -1
- package/dist/lib/model-tier-overrides.js +15 -2
- package/dist/lib/monitors/config.d.ts +17 -3
- package/dist/lib/monitors/config.js +52 -18
- package/dist/lib/monitors/engine.d.ts +32 -1
- package/dist/lib/monitors/engine.js +94 -11
- package/dist/lib/monitors/fingerprint.d.ts +46 -0
- package/dist/lib/monitors/fingerprint.js +100 -0
- package/dist/lib/monitors/remote.d.ts +47 -0
- package/dist/lib/monitors/remote.js +81 -0
- package/dist/lib/monitors/state.d.ts +39 -0
- package/dist/lib/monitors/state.js +56 -0
- package/dist/lib/onepassword.d.ts +17 -0
- package/dist/lib/onepassword.js +52 -22
- package/dist/lib/open-url.js +1 -1
- package/dist/lib/picker.d.ts +14 -2
- package/dist/lib/picker.js +35 -13
- package/dist/lib/placement.d.ts +1 -1
- package/dist/lib/placement.js +1 -1
- package/dist/lib/pr-land-detach.d.ts +32 -0
- package/dist/lib/pr-land-detach.js +79 -0
- package/dist/lib/profiles-presets.js +13 -0
- package/dist/lib/profiles.d.ts +2 -0
- package/dist/lib/profiles.js +44 -1
- package/dist/lib/project-focus.d.ts +1 -1
- package/dist/lib/project-focus.js +1 -1
- package/dist/lib/project-probe.d.ts +4 -1
- package/dist/lib/project-probe.js +5 -4
- package/dist/lib/project-resources.js +2 -18
- package/dist/lib/project-root.d.ts +16 -0
- package/dist/lib/project-root.js +20 -2
- package/dist/lib/projects.d.ts +20 -1
- package/dist/lib/projects.js +78 -1
- package/dist/lib/refresh-coordinator.d.ts +24 -0
- package/dist/lib/refresh-coordinator.js +52 -0
- package/dist/lib/registry.d.ts +2 -2
- package/dist/lib/registry.js +1 -1
- package/dist/lib/resource-aliases.d.ts +13 -0
- package/dist/lib/resource-aliases.js +26 -0
- package/dist/lib/resources/types.d.ts +1 -1
- package/dist/lib/resources.d.ts +16 -0
- package/dist/lib/resources.js +66 -10
- package/dist/lib/rotate.d.ts +3 -4
- package/dist/lib/rotate.js +4 -5
- package/dist/lib/routine-activation.d.ts +22 -2
- package/dist/lib/routine-activation.js +63 -16
- package/dist/lib/routine-context.d.ts +9 -2
- package/dist/lib/routine-context.js +21 -6
- package/dist/lib/routines-project.d.ts +58 -48
- package/dist/lib/routines-project.js +190 -159
- package/dist/lib/routines.d.ts +44 -7
- package/dist/lib/routines.js +92 -34
- package/dist/lib/run-defaults.d.ts +5 -0
- package/dist/lib/run-defaults.js +11 -1
- package/dist/lib/runner.d.ts +10 -8
- package/dist/lib/runner.js +122 -39
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/agent.d.ts +10 -3
- package/dist/lib/secrets/agent.js +43 -8
- package/dist/lib/secrets/bundles.d.ts +1 -0
- package/dist/lib/secrets/bundles.js +92 -80
- package/dist/lib/secrets/index.js +32 -9
- package/dist/lib/secrets/install-helper.d.ts +4 -4
- package/dist/lib/secrets/install-helper.js +4 -4
- package/dist/lib/secrets/push.d.ts +40 -6
- package/dist/lib/secrets/push.js +58 -11
- package/dist/lib/secrets/read-backoff.d.ts +1 -1
- package/dist/lib/secrets/read-backoff.js +1 -1
- package/dist/lib/secrets/remote.d.ts +24 -0
- package/dist/lib/secrets/remote.js +54 -4
- package/dist/lib/self-update.d.ts +108 -0
- package/dist/lib/self-update.js +276 -1
- package/dist/lib/session/active.d.ts +89 -5
- package/dist/lib/session/active.js +165 -10
- package/dist/lib/session/actor-sidecar.d.ts +1 -1
- package/dist/lib/session/actor-sidecar.js +2 -1
- package/dist/lib/session/db.d.ts +176 -2
- package/dist/lib/session/db.js +484 -17
- package/dist/lib/session/discover.js +27 -4
- package/dist/lib/session/hook-sessions.js +2 -2
- package/dist/lib/session/host-link.d.ts +2 -2
- package/dist/lib/session/host-link.js +2 -2
- package/dist/lib/session/pid-registry.d.ts +21 -0
- package/dist/lib/session/pid-registry.js +57 -0
- package/dist/lib/session/remote-active.js +15 -1
- package/dist/lib/session/remote.js +2 -2
- package/dist/lib/session/session-cache.d.ts +14 -7
- package/dist/lib/session/session-cache.js +51 -9
- package/dist/lib/session/state.d.ts +2 -2
- package/dist/lib/session/state.js +1 -1
- package/dist/lib/session/sync/config.d.ts +10 -10
- package/dist/lib/session/sync/config.js +10 -10
- package/dist/lib/session/sync/r2.d.ts +34 -0
- package/dist/lib/session/sync/r2.js +123 -0
- package/dist/lib/session/throughput.d.ts +1 -1
- package/dist/lib/session/throughput.js +1 -1
- package/dist/lib/session/types.d.ts +23 -1
- package/dist/lib/session/types.js +15 -0
- package/dist/lib/session/viewing-in.d.ts +1 -1
- package/dist/lib/session/viewing-in.js +1 -1
- package/dist/lib/session/watch.d.ts +101 -0
- package/dist/lib/session/watch.js +242 -0
- package/dist/lib/share/analytics.js +1 -1
- package/dist/lib/share/capture.d.ts +1 -1
- package/dist/lib/share/capture.js +3 -3
- package/dist/lib/share/config.d.ts +6 -2
- package/dist/lib/share/config.js +6 -5
- package/dist/lib/share/delete.js +3 -3
- package/dist/lib/share/provision.d.ts +38 -0
- package/dist/lib/share/provision.js +51 -1
- package/dist/lib/share/publish.d.ts +40 -1
- package/dist/lib/share/publish.js +119 -6
- package/dist/lib/share/worker-template.d.ts +12 -1
- package/dist/lib/share/worker-template.js +83 -7
- package/dist/lib/shims.d.ts +17 -3
- package/dist/lib/shims.js +98 -26
- package/dist/lib/signin-badge.js +3 -2
- package/dist/lib/skills.js +2 -0
- package/dist/lib/smart-launch.d.ts +8 -8
- package/dist/lib/smart-launch.js +80 -59
- package/dist/lib/ssh-exec.d.ts +1 -1
- package/dist/lib/ssh-exec.js +1 -1
- package/dist/lib/staleness/prune.d.ts +88 -0
- package/dist/lib/staleness/prune.js +69 -0
- package/dist/lib/staleness/registry.d.ts +1 -1
- package/dist/lib/staleness/writers/commands.js +34 -2
- package/dist/lib/staleness/writers/hooks.js +16 -0
- package/dist/lib/staleness/writers/kinds.d.ts +6 -0
- package/dist/lib/staleness/writers/skills.js +19 -0
- package/dist/lib/staleness/writers/subagents.d.ts +2 -3
- package/dist/lib/staleness/writers/subagents.js +0 -4
- package/dist/lib/staleness/writers/types.d.ts +32 -0
- package/dist/lib/startup/command-registry.d.ts +16 -14
- package/dist/lib/startup/command-registry.js +26 -37
- package/dist/lib/startup/dev-build.d.ts +10 -0
- package/dist/lib/startup/dev-build.js +13 -1
- package/dist/lib/startup/spellcheck.d.ts +18 -0
- package/dist/lib/startup/spellcheck.js +45 -0
- package/dist/lib/state.d.ts +36 -9
- package/dist/lib/state.js +96 -46
- package/dist/lib/subagents-registry.d.ts +0 -7
- package/dist/lib/subagents-registry.js +38 -65
- package/dist/lib/subagents.d.ts +0 -33
- package/dist/lib/subagents.js +0 -75
- package/dist/lib/sync-umbrella.js +1 -1
- package/dist/lib/teams/agents.d.ts +41 -1
- package/dist/lib/teams/agents.js +187 -9
- package/dist/lib/teams/api.d.ts +11 -1
- package/dist/lib/teams/api.js +11 -2
- package/dist/lib/teams/delivery.d.ts +41 -0
- package/dist/lib/teams/delivery.js +60 -0
- package/dist/lib/teams/registry.d.ts +14 -0
- package/dist/lib/teams/registry.js +51 -1
- package/dist/lib/teams/remoteWorktree.d.ts +19 -0
- package/dist/lib/teams/remoteWorktree.js +29 -0
- package/dist/lib/teams/scheduler.d.ts +1 -1
- package/dist/lib/teams/scheduler.js +1 -1
- package/dist/lib/teams/worktree.d.ts +24 -0
- package/dist/lib/teams/worktree.js +42 -0
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +10 -1
- package/dist/lib/terminal/backends/vscodium-agent.js +16 -5
- package/dist/lib/terminal/engine.d.ts +4 -0
- package/dist/lib/terminal/engine.js +8 -2
- package/dist/lib/terminal/types.d.ts +21 -2
- package/dist/lib/testdata/refresh-coordinator-worker.d.ts +1 -0
- package/dist/lib/testdata/refresh-coordinator-worker.js +23 -0
- package/dist/lib/tickets/list.d.ts +53 -0
- package/dist/lib/tickets/list.js +153 -0
- package/dist/lib/tmux/orphan-reap.d.ts +316 -0
- package/dist/lib/tmux/orphan-reap.js +638 -0
- package/dist/lib/tmux/session.d.ts +68 -3
- package/dist/lib/tmux/session.js +96 -5
- package/dist/lib/triggers/handlers.d.ts +20 -0
- package/dist/lib/triggers/handlers.js +16 -1
- package/dist/lib/triggers/webhook.js +10 -0
- package/dist/lib/types.d.ts +47 -35
- package/dist/lib/usage-fleet.d.ts +32 -0
- package/dist/lib/usage-fleet.js +125 -0
- package/dist/lib/usage-refresh.d.ts +3 -3
- package/dist/lib/usage-refresh.js +19 -16
- package/dist/lib/usage.d.ts +51 -47
- package/dist/lib/usage.js +145 -153
- package/dist/lib/version-duplicates.js +2 -2
- package/dist/lib/versions.d.ts +56 -13
- package/dist/lib/versions.js +195 -45
- package/dist/lib/watchdog/log.d.ts +1 -1
- package/dist/lib/watchdog/log.js +3 -3
- package/dist/lib/watchdog/rotate.d.ts +6 -6
- package/dist/lib/watchdog/rotate.js +6 -6
- package/dist/lib/workflows.d.ts +1 -1
- package/dist/lib/yaml-io.d.ts +47 -0
- package/dist/lib/yaml-io.js +55 -0
- package/package.json +2 -1
- package/scripts/install-helper.js +2 -2
- package/scripts/postinstall.js +23 -20
- package/dist/commands/defaults.d.ts +0 -7
- package/dist/commands/defaults.js +0 -107
- package/dist/commands/export.d.ts +0 -11
- package/dist/commands/export.js +0 -215
- package/dist/commands/helper.d.ts +0 -12
- package/dist/commands/helper.js +0 -87
- package/dist/commands/hosts.d.ts +0 -11
- package/dist/commands/hosts.js +0 -330
- package/dist/commands/lock.d.ts +0 -12
- package/dist/commands/lock.js +0 -70
- package/dist/commands/pull.d.ts +0 -17
- package/dist/commands/pull.js +0 -39
- package/dist/commands/push.d.ts +0 -14
- package/dist/commands/push.js +0 -30
- package/dist/commands/set.d.ts +0 -15
- package/dist/commands/set.js +0 -79
- package/dist/commands/setup-share.d.ts +0 -17
- package/dist/commands/setup-share.js +0 -85
- package/dist/commands/wallet.d.ts +0 -20
- package/dist/commands/wallet.js +0 -216
- package/dist/commands/worktree.d.ts +0 -19
- package/dist/commands/worktree.js +0 -272
- package/dist/lib/account-labels.d.ts +0 -24
- package/dist/lib/account-labels.js +0 -72
- package/dist/lib/auto-dispatch-linear.d.ts +0 -18
- package/dist/lib/auto-dispatch-linear.js +0 -107
- package/dist/lib/auto-dispatch-provider.d.ts +0 -10
- package/dist/lib/auto-dispatch-provider.js +0 -30
- package/dist/lib/auto-dispatch.d.ts +0 -93
- package/dist/lib/auto-dispatch.js +0 -128
- package/dist/lib/export.d.ts +0 -72
- package/dist/lib/export.js +0 -269
- package/dist/lib/lock.d.ts +0 -93
- package/dist/lib/lock.js +0 -207
- package/dist/lib/wallet/index.d.ts +0 -78
- package/dist/lib/wallet/index.js +0 -253
|
@@ -16,9 +16,8 @@ import { parseBundleValue, secretsKeychainItem } from '../lib/secrets/index.js';
|
|
|
16
16
|
import { readBundle } from '../lib/secrets/bundles.js';
|
|
17
17
|
import { isInteractiveTerminal } from './utils.js';
|
|
18
18
|
import { getAgentsInvocation } from '../lib/daemon.js';
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { listInstalledVersions, syncResourcesToVersion } from '../lib/versions.js';
|
|
19
|
+
import { ALL_AGENT_IDS } from '../lib/agents.js';
|
|
20
|
+
import { findAccount } from '../lib/account-registry.js';
|
|
22
21
|
/**
|
|
23
22
|
* Pure helper: builds a Profile from collected wizard inputs. Extracted so the
|
|
24
23
|
* shape of preset->profile mapping for the `create` wizard is unit-testable
|
|
@@ -159,6 +158,9 @@ export async function applyFromSecrets(profile, spec, explicitAuthProvider, opts
|
|
|
159
158
|
*/
|
|
160
159
|
export async function addProfile(name, opts, label = 'Profile') {
|
|
161
160
|
validateProfileName(name);
|
|
161
|
+
const account = opts.account ? findAccount(opts.account) : null;
|
|
162
|
+
if (opts.account && !account)
|
|
163
|
+
throw new Error(`Unknown account '${opts.account}'.`);
|
|
162
164
|
if (profileExists(name) && !opts.force) {
|
|
163
165
|
throw new Error(`${label} '${name}' already exists. Use --force to overwrite.`);
|
|
164
166
|
}
|
|
@@ -190,6 +192,10 @@ export async function addProfile(name, opts, label = 'Profile') {
|
|
|
190
192
|
provider: opts.authProvider,
|
|
191
193
|
authEnvVar,
|
|
192
194
|
});
|
|
195
|
+
if (account) {
|
|
196
|
+
profile.account = account.id;
|
|
197
|
+
profile.provider = account.provider;
|
|
198
|
+
}
|
|
193
199
|
if (opts.fromSecrets)
|
|
194
200
|
await applyFromSecrets(profile, opts.fromSecrets, opts.authProvider);
|
|
195
201
|
writeProfile(profile);
|
|
@@ -204,10 +210,14 @@ export async function addProfile(name, opts, label = 'Profile') {
|
|
|
204
210
|
throw new Error(`No preset '${presetName}'.\nAvailable presets: ${listPresets().map((p) => p.name).join(', ')}\n` +
|
|
205
211
|
'Or build a custom harness: --host <agent> --model <id>.');
|
|
206
212
|
}
|
|
207
|
-
if (!opts.fromSecrets && !preset.authOptional) {
|
|
213
|
+
if (!account && !opts.fromSecrets && !preset.authOptional) {
|
|
208
214
|
await ensureProviderToken(preset.provider, preset.signupUrl, opts.keyStdin);
|
|
209
215
|
}
|
|
210
216
|
const profile = profileFromPreset(name, preset, opts.version);
|
|
217
|
+
if (account) {
|
|
218
|
+
profile.account = account.id;
|
|
219
|
+
profile.provider = account.provider;
|
|
220
|
+
}
|
|
211
221
|
if (opts.fromSecrets)
|
|
212
222
|
await applyFromSecrets(profile, opts.fromSecrets, opts.authProvider);
|
|
213
223
|
writeProfile(profile);
|
|
@@ -221,141 +231,8 @@ function renderProfileRow(p) {
|
|
|
221
231
|
const provider = p.provider || (p.auth?.keychainItem?.split('.')[1]) || '-';
|
|
222
232
|
return `${chalk.cyan(p.name.padEnd(16))} ${host.padEnd(14)} ${provider.padEnd(12)} ${chalk.gray(model)}`;
|
|
223
233
|
}
|
|
224
|
-
function splitList(value) {
|
|
225
|
-
if (value === undefined)
|
|
226
|
-
return undefined;
|
|
227
|
-
return value.split(',').map((part) => part.trim()).filter(Boolean);
|
|
228
|
-
}
|
|
229
|
-
function buildResourceProfileFromOptions(existing, opts) {
|
|
230
|
-
const next = { ...(existing ?? {}) };
|
|
231
|
-
if (opts.description !== undefined)
|
|
232
|
-
next.description = opts.description || undefined;
|
|
233
|
-
const keys = ['commands', 'skills', 'hooks', 'subagents', 'plugins', 'workflows', 'permissions', 'mcp'];
|
|
234
|
-
for (const key of keys) {
|
|
235
|
-
const parsed = splitList(opts[key]);
|
|
236
|
-
if (parsed !== undefined)
|
|
237
|
-
next[key] = parsed;
|
|
238
|
-
}
|
|
239
|
-
const secrets = splitList(opts.secrets);
|
|
240
|
-
if (secrets !== undefined)
|
|
241
|
-
next.secrets = secrets;
|
|
242
|
-
if (opts.rules !== undefined)
|
|
243
|
-
next.rules = opts.rules || undefined;
|
|
244
|
-
return next;
|
|
245
|
-
}
|
|
246
|
-
function printResourceProfile(name, preset, activeName) {
|
|
247
|
-
const activeMark = activeName === name ? '*' : ' ';
|
|
248
|
-
const description = preset.description ? ` ${chalk.gray(preset.description)}` : '';
|
|
249
|
-
console.log(`${activeMark} ${chalk.cyan(name)}${description}`);
|
|
250
|
-
}
|
|
251
|
-
function syncInstalledVersionsForActiveProfile(cwd) {
|
|
252
|
-
let synced = 0;
|
|
253
|
-
for (const agent of Object.keys(AGENTS)) {
|
|
254
|
-
for (const version of listInstalledVersions(agent)) {
|
|
255
|
-
syncResourcesToVersion(agent, version, undefined, { cwd, force: true });
|
|
256
|
-
synced++;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
return synced;
|
|
260
|
-
}
|
|
261
|
-
function registerResourceProfileCommands(program) {
|
|
262
|
-
const cmd = program
|
|
263
|
-
.command('profile')
|
|
264
|
-
.description('Activate top-level resource profiles across commands, skills, hooks, rules, MCP, permissions, and secrets.');
|
|
265
|
-
cmd
|
|
266
|
-
.command('list')
|
|
267
|
-
.alias('ls')
|
|
268
|
-
.description('List top-level resource profiles')
|
|
269
|
-
.action(() => {
|
|
270
|
-
const names = listResourceProfileNames();
|
|
271
|
-
if (names.length === 0) {
|
|
272
|
-
console.log(chalk.gray('No resource profiles configured.'));
|
|
273
|
-
console.log(chalk.gray('Try: agents profile set work --skills user:code-review --secrets work'));
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
const active = getActiveResourceProfileName();
|
|
277
|
-
for (const name of names) {
|
|
278
|
-
printResourceProfile(name, getResourceProfilePreset(name), active);
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
cmd
|
|
282
|
-
.command('status')
|
|
283
|
-
.description('Show the active top-level resource profile')
|
|
284
|
-
.action(() => {
|
|
285
|
-
const active = getActiveResourceProfileName();
|
|
286
|
-
if (!active) {
|
|
287
|
-
console.log(chalk.gray('No resource profile active.'));
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
const preset = getResourceProfilePreset(active);
|
|
291
|
-
console.log(chalk.bold(active));
|
|
292
|
-
if (!preset) {
|
|
293
|
-
console.log(chalk.red('Configured active profile is missing from profiles.presets.'));
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
if (preset.description)
|
|
297
|
-
console.log(chalk.gray(preset.description));
|
|
298
|
-
for (const [key, value] of Object.entries(preset)) {
|
|
299
|
-
if (key === 'description')
|
|
300
|
-
continue;
|
|
301
|
-
console.log(`${key}: ${Array.isArray(value) ? value.join(', ') : value}`);
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
cmd
|
|
305
|
-
.command('set <name>')
|
|
306
|
-
.alias('define')
|
|
307
|
-
.description('Create or update a top-level resource profile')
|
|
308
|
-
.option('--description <text>', 'Free-form description')
|
|
309
|
-
.option('--commands <patterns>', 'Comma-separated command selectors, e.g. system:commit,user:*')
|
|
310
|
-
.option('--skills <patterns>', 'Comma-separated skill selectors')
|
|
311
|
-
.option('--hooks <patterns>', 'Comma-separated hook selectors')
|
|
312
|
-
.option('--subagents <patterns>', 'Comma-separated subagent selectors')
|
|
313
|
-
.option('--plugins <patterns>', 'Comma-separated plugin selectors')
|
|
314
|
-
.option('--workflows <patterns>', 'Comma-separated workflow selectors')
|
|
315
|
-
.option('--permissions <patterns>', 'Comma-separated permission group selectors')
|
|
316
|
-
.option('--mcp <patterns>', 'Comma-separated MCP server selectors')
|
|
317
|
-
.option('--rules <preset>', 'Rules preset to compose while active')
|
|
318
|
-
.option('--secrets <names>', 'Comma-separated secrets bundles, or "*"')
|
|
319
|
-
.action((name, opts) => {
|
|
320
|
-
try {
|
|
321
|
-
validateResourceProfileName(name);
|
|
322
|
-
const preset = buildResourceProfileFromOptions(getResourceProfilePreset(name), opts);
|
|
323
|
-
upsertResourceProfilePreset(name, preset);
|
|
324
|
-
console.log(chalk.green(`Profile '${name}' saved.`));
|
|
325
|
-
}
|
|
326
|
-
catch (err) {
|
|
327
|
-
console.error(chalk.red(err.message));
|
|
328
|
-
process.exit(1);
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
cmd
|
|
332
|
-
.command('use <name>')
|
|
333
|
-
.description('Activate a top-level resource profile and reconcile installed versions')
|
|
334
|
-
.action((name) => {
|
|
335
|
-
try {
|
|
336
|
-
setActiveResourceProfile(name);
|
|
337
|
-
const synced = syncInstalledVersionsForActiveProfile(process.cwd());
|
|
338
|
-
console.log(chalk.green(`Profile '${name}' active.`));
|
|
339
|
-
console.log(chalk.gray(`Reconciled ${synced} installed version${synced === 1 ? '' : 's'}.`));
|
|
340
|
-
}
|
|
341
|
-
catch (err) {
|
|
342
|
-
console.error(chalk.red(err.message));
|
|
343
|
-
process.exit(1);
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
cmd
|
|
347
|
-
.command('clear')
|
|
348
|
-
.description('Clear the active top-level resource profile and reconcile installed versions')
|
|
349
|
-
.action(() => {
|
|
350
|
-
setActiveResourceProfile(null);
|
|
351
|
-
const synced = syncInstalledVersionsForActiveProfile(process.cwd());
|
|
352
|
-
console.log(chalk.green('Resource profile cleared.'));
|
|
353
|
-
console.log(chalk.gray(`Reconciled ${synced} installed version${synced === 1 ? '' : 's'}.`));
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
234
|
/** Register the `agents profiles` command tree. */
|
|
357
235
|
export function registerProfilesCommands(program) {
|
|
358
|
-
registerResourceProfileCommands(program);
|
|
359
236
|
const cmd = program
|
|
360
237
|
.command('profiles')
|
|
361
238
|
.description('Named bundles of (host CLI, endpoint, model, auth) — run Kimi/DeepSeek/Qwen/etc through Claude Code without a proxy.')
|
|
@@ -427,28 +304,6 @@ Examples:
|
|
|
427
304
|
# Fully remove the OpenRouter key from Keychain
|
|
428
305
|
agents profiles logout openrouter
|
|
429
306
|
`);
|
|
430
|
-
cmd
|
|
431
|
-
.command('use <name>')
|
|
432
|
-
.description('Alias for `agents profile use <name>`')
|
|
433
|
-
.action((name) => {
|
|
434
|
-
try {
|
|
435
|
-
setActiveResourceProfile(name);
|
|
436
|
-
const synced = syncInstalledVersionsForActiveProfile(process.cwd());
|
|
437
|
-
console.log(chalk.green(`Profile '${name}' active.`));
|
|
438
|
-
console.log(chalk.gray(`Reconciled ${synced} installed version${synced === 1 ? '' : 's'}.`));
|
|
439
|
-
}
|
|
440
|
-
catch (err) {
|
|
441
|
-
console.error(chalk.red(err.message));
|
|
442
|
-
process.exit(1);
|
|
443
|
-
}
|
|
444
|
-
});
|
|
445
|
-
cmd
|
|
446
|
-
.command('status')
|
|
447
|
-
.description('Alias for `agents profile status`')
|
|
448
|
-
.action(() => {
|
|
449
|
-
const active = getActiveResourceProfileName();
|
|
450
|
-
console.log(active ? active : chalk.gray('No resource profile active.'));
|
|
451
|
-
});
|
|
452
307
|
cmd
|
|
453
308
|
.command('list')
|
|
454
309
|
.alias('ls')
|
|
@@ -609,6 +464,7 @@ Examples:
|
|
|
609
464
|
.description('Add a profile. If <name> matches a built-in preset, the preset is applied. Prompts for API key (once per provider).')
|
|
610
465
|
.option('--preset <preset>', 'Use a named preset (defaults to <name> if a preset by that name exists)')
|
|
611
466
|
.option('--version <version>', 'Pin the host CLI version (e.g., 2.1.113)')
|
|
467
|
+
.option('--account <name>', 'Attach an existing durable credential account')
|
|
612
468
|
.option('--key-stdin', 'Read API key from stdin instead of prompting (for scripts/CI)')
|
|
613
469
|
.option('--force', 'Overwrite an existing profile with the same name')
|
|
614
470
|
.addHelpText('after', '\nTo build a custom harness from a host CLI + model in one shot, use `agents harness add`.\n')
|
|
@@ -617,7 +473,7 @@ Examples:
|
|
|
617
473
|
// device routing (see lib/hosts/passthrough.ts). The host+model one-shot
|
|
618
474
|
// lives on `agents harness add`, which owns its own `--host`.
|
|
619
475
|
try {
|
|
620
|
-
await addProfile(name, { preset: opts.preset, version: opts.version, keyStdin: opts.keyStdin, force: opts.force }, 'Profile');
|
|
476
|
+
await addProfile(name, { preset: opts.preset, version: opts.version, account: opts.account, keyStdin: opts.keyStdin, force: opts.force }, 'Profile');
|
|
621
477
|
}
|
|
622
478
|
catch (err) {
|
|
623
479
|
console.error(chalk.red(err.message));
|
|
@@ -8,9 +8,18 @@
|
|
|
8
8
|
* lifecycle state, plan completion, open PRs, and tickets in flight.
|
|
9
9
|
*/
|
|
10
10
|
import type { Command } from 'commander';
|
|
11
|
+
import { type ProjectRepo } from '../lib/projects.js';
|
|
11
12
|
import { type LinearMilestone } from '../lib/linear-project-counts.js';
|
|
12
13
|
/** Recursion guard: a peer answering a probe fan-out never re-fans-out itself. */
|
|
13
14
|
export declare const PROJECTS_NO_FANOUT_ENV = "AGENTS_PROJECTS_LOCAL";
|
|
15
|
+
/**
|
|
16
|
+
* Render `agents projects for-cwd`'s output for a resolved (or absent)
|
|
17
|
+
* project name — `--json` always prints `{"name": ...}` even on no match, so
|
|
18
|
+
* a scripted caller can distinguish "ran and found nothing" from a crash;
|
|
19
|
+
* the plain-text form prints nothing on no match. Returns '' when nothing
|
|
20
|
+
* should be printed.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatForCwdOutput(name: string | undefined, json: boolean): string;
|
|
14
23
|
/**
|
|
15
24
|
* One compact trailing note for peers that didn't answer the `--fleet`
|
|
16
25
|
* fan-out — unreachable, running an agents-cli too old to carry `projects
|
|
@@ -28,6 +37,25 @@ export declare function formatFleetSkippedNote(skipped: string[]): string;
|
|
|
28
37
|
* expected answer here (`undefined`), not something to report.
|
|
29
38
|
*/
|
|
30
39
|
export declare function originSlug(cwd: string): string | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Turn a `--dir` / `--add-dir` value into a `repos[]` row.
|
|
42
|
+
*
|
|
43
|
+
* The slug comes from the DIRECTORY'S OWN origin remote, never from its path:
|
|
44
|
+
* a checkout at `~/src/github.com/muqsitnawaz/agents-cli` whose origin is
|
|
45
|
+
* `phnx-labs/agents-cli` must record the remote it actually pushes to. Pass
|
|
46
|
+
* `slugOverride` for a directory with no origin (a vendored tree, a fresh
|
|
47
|
+
* `git init`).
|
|
48
|
+
*
|
|
49
|
+
* The stored `path` is left for `writeProjectDef` to normalize home-relative,
|
|
50
|
+
* so the same definition re-roots on every machine.
|
|
51
|
+
*/
|
|
52
|
+
export declare function projectRepoFromDir(dir: string, slugOverride?: string): {
|
|
53
|
+
ok: true;
|
|
54
|
+
repo: ProjectRepo;
|
|
55
|
+
} | {
|
|
56
|
+
ok: false;
|
|
57
|
+
error: string;
|
|
58
|
+
};
|
|
31
59
|
/** One `projects list` row, pre-render. */
|
|
32
60
|
export interface ProjectListRow {
|
|
33
61
|
name: string;
|
|
@@ -21,7 +21,7 @@ import { getActiveSessions } from '../lib/session/active.js';
|
|
|
21
21
|
import { gatherRemoteActive } from '../lib/session/remote-active.js';
|
|
22
22
|
import { gatherRemoteAgentsJson } from '../lib/remote-agents-json.js';
|
|
23
23
|
import { formatFleetSummary, formatFleetWorkspaces, parseRemoteProbe, probeProjectWorkspaces, workspaceTargetsForDef, workspaceWarnings, } from '../lib/project-probe.js';
|
|
24
|
-
import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, } from '../lib/projects.js';
|
|
24
|
+
import { listProjectDefs, loadProjectDef, writeProjectDef, removeProjectDef, projectDefPath, isSafeProjectName, validateProjectDef, projectNameForCwd, } from '../lib/projects.js';
|
|
25
25
|
import { rollupSessionsByProject, withDefaultMachine, isDeadStatus, formatDeadSummary, liveDeadSplit, enrichProjectSignals, formatProjectMembersByHost, formatProjectWarnings, } from '../lib/project-status.js';
|
|
26
26
|
import { fetchLinearProjectCounts } from '../lib/linear-project-counts.js';
|
|
27
27
|
import { listLinearProjects, pickLinearProject } from '../lib/linear-projects.js';
|
|
@@ -33,6 +33,18 @@ import { buildLinearImportCandidates, validateImportOpts, } from '../lib/project
|
|
|
33
33
|
export const PROJECTS_NO_FANOUT_ENV = 'AGENTS_PROJECTS_LOCAL';
|
|
34
34
|
/** Max peers named in the skipped note before the rest collapse to `+N`. */
|
|
35
35
|
const SKIPPED_NAME_LIMIT = 4;
|
|
36
|
+
/**
|
|
37
|
+
* Render `agents projects for-cwd`'s output for a resolved (or absent)
|
|
38
|
+
* project name — `--json` always prints `{"name": ...}` even on no match, so
|
|
39
|
+
* a scripted caller can distinguish "ran and found nothing" from a crash;
|
|
40
|
+
* the plain-text form prints nothing on no match. Returns '' when nothing
|
|
41
|
+
* should be printed.
|
|
42
|
+
*/
|
|
43
|
+
export function formatForCwdOutput(name, json) {
|
|
44
|
+
if (json)
|
|
45
|
+
return JSON.stringify({ name: name ?? null });
|
|
46
|
+
return name ?? '';
|
|
47
|
+
}
|
|
36
48
|
/**
|
|
37
49
|
* One compact trailing note for peers that didn't answer the `--fleet`
|
|
38
50
|
* fan-out — unreachable, running an agents-cli too old to carry `projects
|
|
@@ -88,6 +100,34 @@ export function originSlug(cwd) {
|
|
|
88
100
|
return undefined;
|
|
89
101
|
}
|
|
90
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Turn a `--dir` / `--add-dir` value into a `repos[]` row.
|
|
105
|
+
*
|
|
106
|
+
* The slug comes from the DIRECTORY'S OWN origin remote, never from its path:
|
|
107
|
+
* a checkout at `~/src/github.com/muqsitnawaz/agents-cli` whose origin is
|
|
108
|
+
* `phnx-labs/agents-cli` must record the remote it actually pushes to. Pass
|
|
109
|
+
* `slugOverride` for a directory with no origin (a vendored tree, a fresh
|
|
110
|
+
* `git init`).
|
|
111
|
+
*
|
|
112
|
+
* The stored `path` is left for `writeProjectDef` to normalize home-relative,
|
|
113
|
+
* so the same definition re-roots on every machine.
|
|
114
|
+
*/
|
|
115
|
+
export function projectRepoFromDir(dir, slugOverride) {
|
|
116
|
+
const abs = path.resolve(expandLocalHome(dir));
|
|
117
|
+
if (!fs.existsSync(abs))
|
|
118
|
+
return { ok: false, error: `No such directory: ${abs}` };
|
|
119
|
+
if (!fs.statSync(abs).isDirectory())
|
|
120
|
+
return { ok: false, error: `Not a directory: ${abs}` };
|
|
121
|
+
const slug = slugOverride ?? originSlug(abs);
|
|
122
|
+
if (!slug) {
|
|
123
|
+
return {
|
|
124
|
+
ok: false,
|
|
125
|
+
error: `${abs} has no origin remote, so its slug cannot be inferred.\n` +
|
|
126
|
+
` Name it explicitly: --add-dir ${dir} --slug <owner/repo>`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return { ok: true, repo: { slug, path: toHomeRelative(abs) } };
|
|
130
|
+
}
|
|
91
131
|
/**
|
|
92
132
|
* List the workspace's Linear projects and plan their import, binding each to a
|
|
93
133
|
* local checkout under the configured projects root when the names match
|
|
@@ -411,9 +451,12 @@ export function registerProjectsCommands(program) {
|
|
|
411
451
|
examples: `
|
|
412
452
|
agents projects import --from-linear # the projects you actually track
|
|
413
453
|
agents projects add rush --repo phnx-labs/rush --path apps/web
|
|
454
|
+
agents projects add rush --root ~/src/rush --dir ~/src/rush-infra # bind another dir
|
|
455
|
+
agents projects set rush --add-dir ~/.agents/.system # bind one more
|
|
456
|
+
agents projects set rush --rm-dir ~/src/rush-infra # unbind it again
|
|
414
457
|
agents projects list # definitions only (no session scan)
|
|
415
458
|
agents projects list --with-agents # opt-in local active counts
|
|
416
|
-
agents projects list --json # machine-readable defs (
|
|
459
|
+
agents projects list --json # machine-readable defs (AGI EXT uses this)
|
|
417
460
|
echo '{...}' | agents projects save --json # create/update one def from stdin
|
|
418
461
|
agents projects rm rush --json # machine-readable delete
|
|
419
462
|
agents projects status # every project, across the whole fleet
|
|
@@ -425,8 +468,14 @@ export function registerProjectsCommands(program) {
|
|
|
425
468
|
`,
|
|
426
469
|
notes: `
|
|
427
470
|
Definitions are hand-editable YAML in ~/.agents/projects/ and sync across
|
|
428
|
-
machines with 'agents push/
|
|
429
|
-
these commands — never
|
|
471
|
+
machines with 'agents repo push user' / 'agents repo pull user'. AGI EXT
|
|
472
|
+
reads and writes only through these commands — never
|
|
473
|
+
~/.agents/factory/projects.json.
|
|
474
|
+
|
|
475
|
+
A project may bind several directories ('--dir' / '--add-dir'). The cwd an
|
|
476
|
+
agent lands in is 'defaultPath' (else 'root') — set it with --root/--path,
|
|
477
|
+
not with --dir. Every bound directory other than that cwd rides along as
|
|
478
|
+
an --add-dir grant (Claude, Codex, Cursor, Kimi, Grok consume it; others ignore).
|
|
430
479
|
`,
|
|
431
480
|
});
|
|
432
481
|
// ---- list ----
|
|
@@ -465,6 +514,17 @@ export function registerProjectsCommands(program) {
|
|
|
465
514
|
console.log(` ${chalk.bold(row.name.padEnd(w.name))} ${chalk.dim(row.path.padEnd(w.path))} ${chalk.cyan(row.repo.padEnd(w.repo))}${agentsSuffix}`);
|
|
466
515
|
}
|
|
467
516
|
});
|
|
517
|
+
// ---- for-cwd ----
|
|
518
|
+
projects
|
|
519
|
+
.command('for-cwd [cwd]')
|
|
520
|
+
.description('Resolve a directory to its defined project name (root or a repos[].path/subpath match). Defaults to the current directory.')
|
|
521
|
+
.option('--json', 'Machine-readable output: {"name": string | null}')
|
|
522
|
+
.action((cwdArg, opts) => {
|
|
523
|
+
const name = projectNameForCwd(cwdArg ?? process.cwd(), listProjectDefs());
|
|
524
|
+
const out = formatForCwdOutput(name, !!opts.json);
|
|
525
|
+
if (out)
|
|
526
|
+
console.log(out);
|
|
527
|
+
});
|
|
468
528
|
// ---- add ----
|
|
469
529
|
projects
|
|
470
530
|
.command('add <name>')
|
|
@@ -472,6 +532,7 @@ export function registerProjectsCommands(program) {
|
|
|
472
532
|
.option('--root <path>', 'Repo / monorepo root (defaults to the current git repo root)')
|
|
473
533
|
.option('--path <subdir>', 'Default cwd for agents (a monorepo subdir)')
|
|
474
534
|
.option('--repo <owner/repo>', 'Primary GitHub slug (defaults to the origin remote)')
|
|
535
|
+
.option('--dir <path...>', 'A directory this project binds; slug read from its origin. Repeatable')
|
|
475
536
|
.option('--context <path:purpose...>', 'A described starting point; repeatable')
|
|
476
537
|
.option('--goal <objective:measure...>', 'An outcome the project serves; repeatable')
|
|
477
538
|
.option('--linear <url-or-id>', 'Linear project URL or id')
|
|
@@ -502,6 +563,18 @@ export function registerProjectsCommands(program) {
|
|
|
502
563
|
def.defaultPath = `${root.replace(/\/$/, '')}/${opts.path.replace(/^\//, '')}`;
|
|
503
564
|
if (repo)
|
|
504
565
|
def.repo = repo;
|
|
566
|
+
if (opts.dir?.length) {
|
|
567
|
+
const repos = [];
|
|
568
|
+
for (const d of opts.dir) {
|
|
569
|
+
const r = projectRepoFromDir(d);
|
|
570
|
+
if (!r.ok) {
|
|
571
|
+
console.error(chalk.red(r.error));
|
|
572
|
+
process.exit(1);
|
|
573
|
+
}
|
|
574
|
+
repos.push(r.repo);
|
|
575
|
+
}
|
|
576
|
+
def.repos = repos;
|
|
577
|
+
}
|
|
505
578
|
if (opts.context?.length)
|
|
506
579
|
def.contexts = opts.context.map(parseContextFlag);
|
|
507
580
|
if (opts.goal?.length)
|
|
@@ -513,6 +586,8 @@ export function registerProjectsCommands(program) {
|
|
|
513
586
|
console.log(chalk.green(`Defined project "${name}"`));
|
|
514
587
|
console.log(chalk.gray(` ${target}`));
|
|
515
588
|
console.log(chalk.gray(` root ${def.root}${def.repo ? ` · repo ${def.repo}` : ''}`));
|
|
589
|
+
for (const r of def.repos ?? [])
|
|
590
|
+
console.log(chalk.gray(` dir ${r.path} · ${r.slug}`));
|
|
516
591
|
});
|
|
517
592
|
/** Merge `--device a b` (variadic) and `--devices a,b,c` (comma list) into one
|
|
518
593
|
* deduped device filter; undefined when neither was given (= whole fleet). */
|
|
@@ -748,6 +823,9 @@ export function registerProjectsCommands(program) {
|
|
|
748
823
|
.option('--path <subdir>', 'Default cwd for agents (a monorepo subdir)')
|
|
749
824
|
.option('--description <text>', 'One-line description shown on the card')
|
|
750
825
|
.option('--goal <objective:measure...>', 'Replace the goals this project serves; repeatable')
|
|
826
|
+
.option('--add-dir <path>', 'Bind another directory to this project; repeatable', (val, prev) => [...prev, val], [])
|
|
827
|
+
.option('--rm-dir <path>', 'Unbind a directory from this project; repeatable', (val, prev) => [...prev, val], [])
|
|
828
|
+
.option('--slug <owner/repo>', 'Slug for a single --add-dir whose origin cannot be read')
|
|
751
829
|
.action((name, opts) => {
|
|
752
830
|
const def = loadProjectDef(name);
|
|
753
831
|
if (!def) {
|
|
@@ -755,10 +833,17 @@ export function registerProjectsCommands(program) {
|
|
|
755
833
|
process.exit(1);
|
|
756
834
|
}
|
|
757
835
|
const fields = ['repo', 'root', 'path', 'description'].filter((k) => opts[k] !== undefined);
|
|
758
|
-
|
|
836
|
+
const dirWork = opts.addDir.length > 0 || opts.rmDir.length > 0;
|
|
837
|
+
if (fields.length === 0 && !opts.goal?.length && !dirWork) {
|
|
759
838
|
console.error(chalk.red('Nothing to set. Pass a field, e.g. --repo <owner/repo>.'));
|
|
760
839
|
process.exit(1);
|
|
761
840
|
}
|
|
841
|
+
// One --slug cannot name two directories. Refuse rather than guess which
|
|
842
|
+
// --add-dir it was meant for.
|
|
843
|
+
if (opts.slug && opts.addDir.length !== 1) {
|
|
844
|
+
console.error(chalk.red('--slug names a single --add-dir; pass exactly one --add-dir with it.'));
|
|
845
|
+
process.exit(1);
|
|
846
|
+
}
|
|
762
847
|
// Load, mutate the named fields, write back — the `link` pattern. NEVER
|
|
763
848
|
// the `add --force` pattern, which rebuilds the def from flags alone and
|
|
764
849
|
// silently drops linear/contexts/integrations that were not re-passed.
|
|
@@ -784,12 +869,47 @@ export function registerProjectsCommands(program) {
|
|
|
784
869
|
}
|
|
785
870
|
def.defaultPath = `${base}/${opts.path.replace(/^\//, '')}`;
|
|
786
871
|
}
|
|
872
|
+
// --rm-dir before --add-dir, so re-pointing one directory in a single
|
|
873
|
+
// command (`--rm-dir old --add-dir new`) does what it reads like.
|
|
874
|
+
const removed = [];
|
|
875
|
+
for (const d of opts.rmDir) {
|
|
876
|
+
const target = path.resolve(expandLocalHome(d));
|
|
877
|
+
const before = def.repos?.length ?? 0;
|
|
878
|
+
def.repos = (def.repos ?? []).filter((r) => !r.path || path.resolve(expandLocalHome(r.path)) !== target);
|
|
879
|
+
if ((def.repos.length ?? 0) === before) {
|
|
880
|
+
console.error(chalk.red(`"${def.name}" does not bind ${target} — nothing to remove.`));
|
|
881
|
+
process.exit(1);
|
|
882
|
+
}
|
|
883
|
+
removed.push(target);
|
|
884
|
+
}
|
|
885
|
+
const added = [];
|
|
886
|
+
for (const d of opts.addDir) {
|
|
887
|
+
const r = projectRepoFromDir(d, opts.slug);
|
|
888
|
+
if (!r.ok) {
|
|
889
|
+
console.error(chalk.red(r.error));
|
|
890
|
+
process.exit(1);
|
|
891
|
+
}
|
|
892
|
+
const target = path.resolve(expandLocalHome(r.repo.path));
|
|
893
|
+
const dup = (def.repos ?? []).some((x) => x.path && path.resolve(expandLocalHome(x.path)) === target);
|
|
894
|
+
if (dup) {
|
|
895
|
+
console.error(chalk.red(`"${def.name}" already binds ${target}.`));
|
|
896
|
+
process.exit(1);
|
|
897
|
+
}
|
|
898
|
+
def.repos = [...(def.repos ?? []), r.repo];
|
|
899
|
+
added.push(r.repo);
|
|
900
|
+
}
|
|
901
|
+
if (def.repos?.length === 0)
|
|
902
|
+
delete def.repos;
|
|
787
903
|
writeProjectDef(def);
|
|
788
904
|
console.log(chalk.green(`Updated ${def.name}`));
|
|
789
905
|
for (const f of fields)
|
|
790
906
|
console.log(chalk.gray(` ${f} ${f === 'path' ? def.defaultPath : def[f]}`));
|
|
791
907
|
if (opts.goal?.length)
|
|
792
908
|
console.log(chalk.gray(` goals ${def.goals?.map((g) => g.objective).join(' · ')}`));
|
|
909
|
+
for (const r of removed)
|
|
910
|
+
console.log(chalk.gray(` - dir ${toHomeRelative(r)}`));
|
|
911
|
+
for (const r of added)
|
|
912
|
+
console.log(chalk.gray(` + dir ${r.path} · ${r.slug}`));
|
|
793
913
|
});
|
|
794
914
|
// ---- link ----
|
|
795
915
|
projects
|
|
@@ -81,11 +81,17 @@ export async function reconnectAction(id) {
|
|
|
81
81
|
await focusAction(recent.id, {});
|
|
82
82
|
}
|
|
83
83
|
export function registerReconnectCommand(program) {
|
|
84
|
+
// Deprecated: superseded by `agents sessions resume`, which does the same
|
|
85
|
+
// attach-else-recover and additionally takes a tmux alias. Hidden + warned +
|
|
86
|
+
// functional for one release. Bare `reconnect` targeted the most recent
|
|
87
|
+
// session in this directory; that default now lives on `resume`'s picker.
|
|
84
88
|
const cmd = program
|
|
85
|
-
.command('reconnect')
|
|
89
|
+
.command('reconnect', { hidden: true })
|
|
86
90
|
.argument('[session-id]', 'Session id/prefix to reconnect (default: the most recent session started here)')
|
|
87
|
-
.description('
|
|
91
|
+
.description('Deprecated — use `agents sessions resume` instead.')
|
|
88
92
|
.action(async (id) => {
|
|
93
|
+
console.warn(chalk.yellow('`agents reconnect` is deprecated — use `agents sessions resume` instead:'));
|
|
94
|
+
console.warn(chalk.gray(` agents sessions resume${id ? ` ${id}` : ''}`));
|
|
89
95
|
await reconnectAction(id);
|
|
90
96
|
});
|
|
91
97
|
setHelpSections(cmd, {
|
|
@@ -103,7 +109,7 @@ export function registerReconnectCommand(program) {
|
|
|
103
109
|
- Best-effort recovery: a living remote tmux pane is JOINED (a second client, no fork); a dropped one is RESUMED on its origin device (a copy if it was mid-run, a /continue if idle).
|
|
104
110
|
- With no id, targets the most recent session started from this directory (the terminal that most likely just dropped), not the full fleet picker. Falls back to the most recent session anywhere when this directory has none.
|
|
105
111
|
- This is the manual companion to the automatic reconnect that runs during a live 'agents run --device <box>' when the network blinks; use it after that gave up or the terminal tab closed.
|
|
106
|
-
-
|
|
112
|
+
- Deprecated: use 'agents sessions resume' — it attaches a live pane, foregrounds a headless session, or recovers an ended one.
|
|
107
113
|
`,
|
|
108
114
|
});
|
|
109
115
|
}
|
package/dist/commands/repo.js
CHANGED
|
@@ -29,7 +29,7 @@ function resolveRepoPath(target) {
|
|
|
29
29
|
return path.join(HOME, `.agents-${trimmed}`);
|
|
30
30
|
}
|
|
31
31
|
import { applyExtraAliasToVersions, ensureAgentsDir, getExtraRepoDir, getSystemAgentsDir, getUserAgentsDir, readMeta, resolveExtraRepoDir, updateMeta, } from '../lib/state.js';
|
|
32
|
-
import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, getRemoteUrl, sameGitRemote, displayHomePath, } from '../lib/git.js';
|
|
32
|
+
import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, getRemoteUrl, sameGitRemote, displayHomePath, syncRepoGit, } from '../lib/git.js';
|
|
33
33
|
import { DEFAULT_SYSTEM_REPO } from '../lib/types.js';
|
|
34
34
|
import { ALL_AGENT_IDS, isAgentName, resolveAgentName } from '../lib/agents.js';
|
|
35
35
|
import { refresh } from '../lib/refresh.js';
|
|
@@ -1089,6 +1089,47 @@ export function registerRepoCommands(program) {
|
|
|
1089
1089
|
}
|
|
1090
1090
|
}
|
|
1091
1091
|
});
|
|
1092
|
+
// agents repo sync <name> — git-level sync for a single DotAgents repo.
|
|
1093
|
+
// Replaces the git portion of the old `agents sync <repo>` verb.
|
|
1094
|
+
// Semantics: system is pull-only (push: false); user and enabled extras push.
|
|
1095
|
+
repoCmd
|
|
1096
|
+
.command('sync <alias>')
|
|
1097
|
+
.description('Git-sync a repo: pull (and push for user/extras). Aliases: "system", "user", or a registered extra.')
|
|
1098
|
+
.addHelpText('after', `
|
|
1099
|
+
Examples:
|
|
1100
|
+
# Pull the system repo (read-only mirror)
|
|
1101
|
+
agents repo sync system
|
|
1102
|
+
|
|
1103
|
+
# Pull and push the user repo
|
|
1104
|
+
agents repo sync user
|
|
1105
|
+
|
|
1106
|
+
# Sync a registered extra
|
|
1107
|
+
agents repo sync work
|
|
1108
|
+
`)
|
|
1109
|
+
.action(async (alias) => {
|
|
1110
|
+
const targets = collectRepoTargets(alias);
|
|
1111
|
+
if (!targets) {
|
|
1112
|
+
process.exitCode = 1;
|
|
1113
|
+
return;
|
|
1114
|
+
}
|
|
1115
|
+
for (const t of targets) {
|
|
1116
|
+
if (!fs.existsSync(t.dir) || !isGitRepo(t.dir)) {
|
|
1117
|
+
console.log(chalk.yellow(` ${t.alias}: not a git repo, skipping`));
|
|
1118
|
+
continue;
|
|
1119
|
+
}
|
|
1120
|
+
const push = t.alias !== 'system';
|
|
1121
|
+
const spinner = ora(`Syncing ${formatRepoTarget(t.alias, t.dir)}...`).start();
|
|
1122
|
+
const result = await syncRepoGit(t.dir, { push });
|
|
1123
|
+
if (result.success) {
|
|
1124
|
+
const pushed = result.pushed ? ' (pushed)' : '';
|
|
1125
|
+
spinner.succeed(`${formatRepoTarget(t.alias, t.dir)}: ${result.commit}${pushed}`);
|
|
1126
|
+
}
|
|
1127
|
+
else {
|
|
1128
|
+
spinner.fail(`${formatRepoTarget(t.alias, t.dir)}: ${result.error}`);
|
|
1129
|
+
process.exitCode = 1;
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
});
|
|
1092
1133
|
// Deprecated: superseded by `agents sync`. `agents sync --local` runs the same
|
|
1093
1134
|
// reconcile stage (sync-umbrella.ts calls this exact `refresh()`), and `agents
|
|
1094
1135
|
// sync <agent>` targets one agent — with the added reach `refresh` lacks
|
|
@@ -35,6 +35,23 @@ export interface ResourceViewOptions {
|
|
|
35
35
|
filterVersion?: string;
|
|
36
36
|
/** Emit machine-readable JSON instead of the picker/table (for agents/scripts). */
|
|
37
37
|
json?: boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Show the "Synced" column. Default true — the central-storage commands all
|
|
40
|
+
* answer "which agent versions have this?". `agents inspect <repo>` does not:
|
|
41
|
+
* there the repo IS the source, and empty `targets` would render the
|
|
42
|
+
* misleading "no installed versions". Set false to drop the column entirely.
|
|
43
|
+
*/
|
|
44
|
+
showSync?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Cap for the Name column. Defaults to NAME_CAP (22), which suits the
|
|
47
|
+
* central-storage commands. Kinds whose rows have no description — hooks are
|
|
48
|
+
* all script names and no prose — want a wider cap, otherwise four pairs of
|
|
49
|
+
* `00-agent-verify-work-complete…` truncate to the same string while the
|
|
50
|
+
* empty Description column wastes the rest of the terminal.
|
|
51
|
+
*/
|
|
52
|
+
nameCap?: number;
|
|
53
|
+
/** Per-row OSC-8 link target, keyed by row name; makes names clickable. */
|
|
54
|
+
linkFor?: (row: ResourceRow) => string | undefined;
|
|
38
55
|
}
|
|
39
56
|
/** Display a resource list: interactive picker in TTY mode, plain table otherwise. */
|
|
40
57
|
export declare function showResourceList(opts: ResourceViewOptions): Promise<void>;
|