@phnx-labs/agents-cli 0.1.0 → 1.14.1
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 +7 -1
- package/README.md +283 -372
- package/dist/commands/alias.d.ts +11 -0
- package/dist/commands/alias.js +117 -0
- package/dist/commands/beta.d.ts +2 -0
- package/dist/commands/beta.js +53 -0
- package/dist/commands/cloud.d.ts +8 -1
- package/dist/commands/cloud.js +108 -22
- package/dist/commands/commands.d.ts +9 -1
- package/dist/commands/commands.js +24 -172
- package/dist/commands/daemon.d.ts +8 -1
- package/dist/commands/daemon.js +13 -5
- package/dist/commands/doctor.d.ts +15 -0
- package/dist/commands/doctor.js +132 -0
- package/dist/commands/drive.d.ts +8 -1
- package/dist/commands/drive.js +20 -3
- package/dist/commands/exec.d.ts +8 -1
- package/dist/commands/exec.js +96 -27
- package/dist/commands/factory.d.ts +19 -0
- package/dist/commands/factory.js +71 -0
- package/dist/commands/fork.d.ts +8 -1
- package/dist/commands/fork.js +11 -4
- package/dist/commands/hooks.d.ts +9 -1
- package/dist/commands/hooks.js +30 -182
- package/dist/commands/init.d.ts +15 -1
- package/dist/commands/init.js +168 -74
- package/dist/commands/mcp.d.ts +9 -1
- package/dist/commands/mcp.js +11 -7
- package/dist/commands/models.d.ts +8 -1
- package/dist/commands/models.js +16 -4
- package/dist/commands/packages.d.ts +8 -1
- package/dist/commands/packages.js +13 -7
- package/dist/commands/permissions.d.ts +9 -1
- package/dist/commands/permissions.js +3 -3
- package/dist/commands/plugins.d.ts +8 -1
- package/dist/commands/plugins.js +13 -2
- package/dist/commands/profiles.d.ts +9 -1
- package/dist/commands/profiles.js +56 -7
- package/dist/commands/prune.d.ts +22 -0
- package/dist/commands/prune.js +191 -0
- package/dist/commands/pty.d.ts +1 -1
- package/dist/commands/pty.js +2 -1
- package/dist/commands/pull.d.ts +8 -1
- package/dist/commands/pull.js +58 -128
- package/dist/commands/refresh-memory.d.ts +7 -1
- package/dist/commands/refresh-memory.js +7 -1
- package/dist/commands/repo.d.ts +15 -0
- package/dist/commands/repo.js +570 -0
- package/dist/commands/resource-view.d.ts +10 -3
- package/dist/commands/resource-view.js +18 -5
- package/dist/commands/routines.d.ts +8 -1
- package/dist/commands/routines.js +17 -4
- package/dist/commands/rules.d.ts +9 -1
- package/dist/commands/rules.js +16 -11
- package/dist/commands/secrets.d.ts +8 -1
- package/dist/commands/secrets.js +235 -63
- package/dist/commands/sessions-picker.d.ts +2 -1
- package/dist/commands/sessions-picker.js +88 -11
- package/dist/commands/sessions-tail.d.ts +19 -0
- package/dist/commands/sessions-tail.js +235 -0
- package/dist/commands/sessions.d.ts +2 -1
- package/dist/commands/sessions.js +188 -7
- package/dist/commands/skills.d.ts +9 -1
- package/dist/commands/skills.js +28 -178
- package/dist/commands/status.d.ts +7 -1
- package/dist/commands/status.js +7 -1
- package/dist/commands/subagents.d.ts +8 -1
- package/dist/commands/subagents.js +11 -1
- package/dist/commands/sync.d.ts +8 -1
- package/dist/commands/sync.js +8 -1
- package/dist/commands/teams-picker.d.ts +4 -1
- package/dist/commands/teams-picker.js +55 -3
- package/dist/commands/teams.d.ts +15 -1
- package/dist/commands/teams.js +323 -69
- package/dist/commands/usage.d.ts +11 -0
- package/dist/commands/usage.js +60 -0
- package/dist/commands/utils.d.ts +6 -1
- package/dist/commands/utils.js +6 -1
- package/dist/commands/versions.d.ts +8 -1
- package/dist/commands/versions.js +4 -3
- package/dist/commands/view.d.ts +47 -2
- package/dist/commands/view.js +317 -24
- package/dist/index.d.ts +7 -2
- package/dist/index.js +172 -34
- package/dist/lib/acp/client.d.ts +31 -0
- package/dist/lib/acp/client.js +117 -0
- package/dist/lib/acp/harnesses.d.ts +26 -0
- package/dist/lib/acp/harnesses.js +65 -0
- package/dist/lib/acp/run.d.ts +18 -0
- package/dist/lib/acp/run.js +39 -0
- package/dist/lib/agents.d.ts +74 -2
- package/dist/lib/agents.js +197 -21
- package/dist/lib/artifact-actions.d.ts +8 -4
- package/dist/lib/artifact-actions.js +8 -6
- package/dist/lib/auto-pull-worker.d.ts +11 -0
- package/dist/lib/auto-pull-worker.js +121 -0
- package/dist/lib/auto-pull.d.ts +31 -0
- package/dist/lib/auto-pull.js +97 -0
- package/dist/lib/beta.d.ts +23 -0
- package/dist/lib/beta.js +90 -0
- package/dist/lib/capabilities.d.ts +29 -0
- package/dist/lib/capabilities.js +74 -0
- package/dist/lib/cloud/codex.d.ts +9 -3
- package/dist/lib/cloud/codex.js +53 -13
- package/dist/lib/cloud/factory.d.ts +8 -3
- package/dist/lib/cloud/factory.js +19 -3
- package/dist/lib/cloud/registry.d.ts +10 -1
- package/dist/lib/cloud/registry.js +14 -3
- package/dist/lib/cloud/rush.d.ts +63 -3
- package/dist/lib/cloud/rush.js +273 -20
- package/dist/lib/cloud/store.d.ts +13 -1
- package/dist/lib/cloud/store.js +23 -4
- package/dist/lib/cloud/stream.d.ts +6 -1
- package/dist/lib/cloud/stream.js +95 -39
- package/dist/lib/cloud/types.d.ts +153 -8
- package/dist/lib/cloud/types.js +34 -2
- package/dist/lib/command-skills.d.ts +20 -0
- package/dist/lib/command-skills.js +142 -0
- package/dist/lib/commands.d.ts +22 -2
- package/dist/lib/commands.js +51 -11
- package/dist/lib/convert.d.ts +10 -1
- package/dist/lib/convert.js +9 -1
- package/dist/lib/daemon.d.ts +21 -1
- package/dist/lib/daemon.js +97 -4
- package/dist/lib/drive-sync.d.ts +18 -1
- package/dist/lib/drive-sync.js +57 -15
- package/dist/lib/exec.d.ts +23 -6
- package/dist/lib/exec.js +53 -17
- package/dist/lib/fs-walk.d.ts +2 -0
- package/dist/lib/fs-walk.js +40 -0
- package/dist/lib/fuzzy.d.ts +53 -0
- package/dist/lib/fuzzy.js +72 -0
- package/dist/lib/gemini-settings.d.ts +4 -0
- package/dist/lib/gemini-settings.js +33 -0
- package/dist/lib/git.d.ts +12 -2
- package/dist/lib/git.js +17 -6
- package/dist/lib/help.d.ts +20 -1
- package/dist/lib/help.js +45 -6
- package/dist/lib/hooks/match.d.ts +32 -0
- package/dist/lib/hooks/match.js +120 -0
- package/dist/lib/hooks.d.ts +17 -4
- package/dist/lib/hooks.js +119 -101
- package/dist/lib/manifest.d.ts +6 -1
- package/dist/lib/manifest.js +15 -4
- package/dist/lib/markdown.d.ts +0 -1
- package/dist/lib/markdown.js +6 -1
- package/dist/lib/mcp.d.ts +0 -1
- package/dist/lib/mcp.js +29 -33
- package/dist/lib/memory-compile.d.ts +13 -3
- package/dist/lib/memory-compile.js +31 -9
- package/dist/lib/memory.d.ts +14 -7
- package/dist/lib/memory.js +67 -38
- package/dist/lib/migrate.d.ts +8 -0
- package/dist/lib/migrate.js +85 -0
- package/dist/lib/models.d.ts +10 -4
- package/dist/lib/models.js +36 -15
- package/dist/lib/onepassword.d.ts +63 -0
- package/dist/lib/onepassword.js +186 -0
- package/dist/lib/paths.d.ts +8 -0
- package/dist/lib/paths.js +20 -0
- package/dist/lib/permissions.d.ts +24 -2
- package/dist/lib/permissions.js +117 -48
- package/dist/lib/picker.d.ts +10 -1
- package/dist/lib/picker.js +15 -1
- package/dist/lib/plugins.d.ts +7 -1
- package/dist/lib/plugins.js +10 -1
- package/dist/lib/profiles-presets.d.ts +10 -1
- package/dist/lib/profiles-presets.js +9 -1
- package/dist/lib/profiles.d.ts +35 -1
- package/dist/lib/profiles.js +36 -15
- package/dist/lib/pty-client.d.ts +1 -1
- package/dist/lib/pty-client.js +0 -1
- package/dist/lib/pty-server.d.ts +16 -2
- package/dist/lib/pty-server.js +92 -3
- package/dist/lib/registry.d.ts +23 -3
- package/dist/lib/registry.js +153 -8
- package/dist/lib/resources.d.ts +28 -1
- package/dist/lib/resources.js +79 -1
- package/dist/lib/rotate.d.ts +40 -13
- package/dist/lib/rotate.js +238 -40
- package/dist/lib/routines.d.ts +29 -1
- package/dist/lib/routines.js +32 -5
- package/dist/lib/runner.d.ts +14 -1
- package/dist/lib/runner.js +22 -3
- package/dist/lib/sandbox.d.ts +16 -1
- package/dist/lib/sandbox.js +39 -16
- package/dist/lib/scheduler.d.ts +8 -1
- package/dist/lib/scheduler.js +8 -1
- package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
- package/dist/lib/{secrets-bundles.d.ts → secrets/bundles.d.ts} +12 -2
- package/dist/lib/{secrets-bundles.js → secrets/bundles.js} +38 -17
- package/dist/lib/secrets/index.d.ts +55 -0
- package/dist/lib/secrets/index.js +211 -0
- package/dist/lib/secrets/profiles.d.ts +10 -0
- package/dist/lib/secrets/profiles.js +13 -0
- package/dist/lib/session/active.d.ts +43 -0
- package/dist/lib/session/active.js +392 -0
- package/dist/lib/session/artifacts.d.ts +12 -1
- package/dist/lib/session/artifacts.js +25 -5
- package/dist/lib/session/cloud.d.ts +30 -0
- package/dist/lib/session/cloud.js +121 -0
- package/dist/lib/session/db.d.ts +23 -2
- package/dist/lib/session/db.js +76 -12
- package/dist/lib/session/discover.d.ts +19 -4
- package/dist/lib/session/discover.js +344 -48
- package/dist/lib/session/parse.d.ts +28 -1
- package/dist/lib/session/parse.js +267 -9
- package/dist/lib/session/prompt.d.ts +9 -1
- package/dist/lib/session/prompt.js +17 -3
- package/dist/lib/session/render.d.ts +13 -1
- package/dist/lib/session/render.js +20 -1
- package/dist/lib/session/team-filter.d.ts +9 -1
- package/dist/lib/session/team-filter.js +11 -2
- package/dist/lib/session/types.d.ts +16 -2
- package/dist/lib/session/types.js +10 -2
- package/dist/lib/shims.d.ts +64 -5
- package/dist/lib/shims.js +309 -47
- package/dist/lib/skills.d.ts +27 -2
- package/dist/lib/skills.js +127 -65
- package/dist/lib/sqlite.d.ts +43 -0
- package/dist/lib/sqlite.js +94 -0
- package/dist/lib/state.d.ts +112 -27
- package/dist/lib/state.js +320 -148
- package/dist/lib/subagents.d.ts +9 -1
- package/dist/lib/subagents.js +70 -63
- package/dist/lib/sync-manifest.d.ts +81 -0
- package/dist/lib/sync-manifest.js +450 -0
- package/dist/lib/teams/agents.d.ts +103 -5
- package/dist/lib/teams/agents.js +414 -91
- package/dist/lib/teams/api.d.ts +26 -3
- package/dist/lib/teams/api.js +63 -3
- package/dist/lib/teams/debug.d.ts +6 -1
- package/dist/lib/teams/debug.js +6 -1
- package/dist/lib/teams/file_ops.d.ts +7 -1
- package/dist/lib/teams/file_ops.js +7 -1
- package/dist/lib/teams/index.d.ts +15 -0
- package/dist/lib/teams/index.js +14 -0
- package/dist/lib/teams/parsers.d.ts +4 -1
- package/dist/lib/teams/parsers.js +11 -1
- package/dist/lib/teams/persistence.d.ts +15 -1
- package/dist/lib/teams/persistence.js +102 -20
- package/dist/lib/teams/registry.d.ts +12 -1
- package/dist/lib/teams/registry.js +116 -33
- package/dist/lib/teams/summarizer.d.ts +15 -1
- package/dist/lib/teams/summarizer.js +14 -1
- package/dist/lib/teams/supervisor.d.ts +48 -0
- package/dist/lib/teams/supervisor.js +73 -0
- package/dist/lib/template.d.ts +8 -6
- package/dist/lib/template.js +8 -6
- package/dist/lib/types.d.ts +147 -8
- package/dist/lib/types.js +26 -3
- package/dist/lib/usage.d.ts +32 -1
- package/dist/lib/usage.js +70 -6
- package/dist/lib/version-duplicates.d.ts +21 -0
- package/dist/lib/version-duplicates.js +90 -0
- package/dist/lib/versions.d.ts +33 -4
- package/dist/lib/versions.js +376 -108
- package/package.json +32 -17
- package/scripts/postinstall.js +126 -30
- package/dist/commands/__tests__/sessions.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions.test.js +0 -636
- package/dist/commands/__tests__/sessions.test.js.map +0 -1
- package/dist/commands/cloud.d.ts.map +0 -1
- package/dist/commands/cloud.js.map +0 -1
- package/dist/commands/commands.d.ts.map +0 -1
- package/dist/commands/commands.js.map +0 -1
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/fork.d.ts.map +0 -1
- package/dist/commands/fork.js.map +0 -1
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/packages.d.ts.map +0 -1
- package/dist/commands/packages.js.map +0 -1
- package/dist/commands/permissions.d.ts.map +0 -1
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/profiles.d.ts.map +0 -1
- package/dist/commands/profiles.js.map +0 -1
- package/dist/commands/pty.d.ts.map +0 -1
- package/dist/commands/pty.js.map +0 -1
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -3
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -180
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/refresh-memory.d.ts.map +0 -1
- package/dist/commands/refresh-memory.js.map +0 -1
- package/dist/commands/resource-view.d.ts.map +0 -1
- package/dist/commands/resource-view.js.map +0 -1
- package/dist/commands/routines.d.ts.map +0 -1
- package/dist/commands/routines.js.map +0 -1
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/sessions-picker.d.ts.map +0 -1
- package/dist/commands/sessions-picker.js.map +0 -1
- package/dist/commands/sessions.d.ts.map +0 -1
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/subagents.d.ts.map +0 -1
- package/dist/commands/subagents.js.map +0 -1
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/teams-picker.d.ts.map +0 -1
- package/dist/commands/teams-picker.js.map +0 -1
- package/dist/commands/teams.d.ts.map +0 -1
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/commands/versions.d.ts.map +0 -1
- package/dist/commands/versions.js.map +0 -1
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
- package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.js +0 -192
- package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
- package/dist/lib/__tests__/exec.test.d.ts +0 -2
- package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
- package/dist/lib/__tests__/exec.test.js +0 -446
- package/dist/lib/__tests__/exec.test.js.map +0 -1
- package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
- package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
- package/dist/lib/__tests__/git-sync.test.js +0 -138
- package/dist/lib/__tests__/git-sync.test.js.map +0 -1
- package/dist/lib/__tests__/hooks.test.d.ts +0 -2
- package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
- package/dist/lib/__tests__/hooks.test.js +0 -203
- package/dist/lib/__tests__/hooks.test.js.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
- package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.js +0 -95
- package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
- package/dist/lib/__tests__/models.test.d.ts +0 -2
- package/dist/lib/__tests__/models.test.d.ts.map +0 -1
- package/dist/lib/__tests__/models.test.js +0 -239
- package/dist/lib/__tests__/models.test.js.map +0 -1
- package/dist/lib/__tests__/rotate.test.d.ts +0 -2
- package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
- package/dist/lib/__tests__/rotate.test.js +0 -80
- package/dist/lib/__tests__/rotate.test.js.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
- package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
- package/dist/lib/__tests__/secrets.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets.test.js +0 -90
- package/dist/lib/__tests__/secrets.test.js.map +0 -1
- package/dist/lib/__tests__/shims.test.d.ts +0 -2
- package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
- package/dist/lib/__tests__/shims.test.js +0 -39
- package/dist/lib/__tests__/shims.test.js.map +0 -1
- package/dist/lib/__tests__/usage.test.d.ts +0 -2
- package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
- package/dist/lib/__tests__/usage.test.js +0 -220
- package/dist/lib/__tests__/usage.test.js.map +0 -1
- package/dist/lib/__tests__/versions.test.d.ts +0 -2
- package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
- package/dist/lib/__tests__/versions.test.js +0 -63
- package/dist/lib/__tests__/versions.test.js.map +0 -1
- package/dist/lib/agents.d.ts.map +0 -1
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/artifact-actions.d.ts.map +0 -1
- package/dist/lib/artifact-actions.js.map +0 -1
- package/dist/lib/cloud/codex.d.ts.map +0 -1
- package/dist/lib/cloud/codex.js.map +0 -1
- package/dist/lib/cloud/factory.d.ts.map +0 -1
- package/dist/lib/cloud/factory.js.map +0 -1
- package/dist/lib/cloud/registry.d.ts.map +0 -1
- package/dist/lib/cloud/registry.js.map +0 -1
- package/dist/lib/cloud/rush.d.ts.map +0 -1
- package/dist/lib/cloud/rush.js.map +0 -1
- package/dist/lib/cloud/store.d.ts.map +0 -1
- package/dist/lib/cloud/store.js.map +0 -1
- package/dist/lib/cloud/stream.d.ts.map +0 -1
- package/dist/lib/cloud/stream.js.map +0 -1
- package/dist/lib/cloud/types.d.ts.map +0 -1
- package/dist/lib/cloud/types.js.map +0 -1
- package/dist/lib/commands.d.ts.map +0 -1
- package/dist/lib/commands.js.map +0 -1
- package/dist/lib/convert.d.ts.map +0 -1
- package/dist/lib/convert.js.map +0 -1
- package/dist/lib/daemon.d.ts.map +0 -1
- package/dist/lib/daemon.js.map +0 -1
- package/dist/lib/drive-sync.d.ts.map +0 -1
- package/dist/lib/drive-sync.js.map +0 -1
- package/dist/lib/exec.d.ts.map +0 -1
- package/dist/lib/exec.js.map +0 -1
- package/dist/lib/factory.d.ts +0 -57
- package/dist/lib/factory.d.ts.map +0 -1
- package/dist/lib/factory.js +0 -110
- package/dist/lib/factory.js.map +0 -1
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/help.d.ts.map +0 -1
- package/dist/lib/help.js.map +0 -1
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/manifest.d.ts.map +0 -1
- package/dist/lib/manifest.js.map +0 -1
- package/dist/lib/markdown.d.ts.map +0 -1
- package/dist/lib/markdown.js.map +0 -1
- package/dist/lib/mcp.d.ts.map +0 -1
- package/dist/lib/mcp.js.map +0 -1
- package/dist/lib/memory-compile.d.ts.map +0 -1
- package/dist/lib/memory-compile.js.map +0 -1
- package/dist/lib/memory.d.ts.map +0 -1
- package/dist/lib/memory.js.map +0 -1
- package/dist/lib/models.d.ts.map +0 -1
- package/dist/lib/models.js.map +0 -1
- package/dist/lib/permissions.d.ts.map +0 -1
- package/dist/lib/permissions.js.map +0 -1
- package/dist/lib/picker.d.ts.map +0 -1
- package/dist/lib/picker.js.map +0 -1
- package/dist/lib/plugins.d.ts.map +0 -1
- package/dist/lib/plugins.js.map +0 -1
- package/dist/lib/profiles-keychain.d.ts +0 -3
- package/dist/lib/profiles-keychain.d.ts.map +0 -1
- package/dist/lib/profiles-keychain.js +0 -10
- package/dist/lib/profiles-keychain.js.map +0 -1
- package/dist/lib/profiles-presets.d.ts.map +0 -1
- package/dist/lib/profiles-presets.js.map +0 -1
- package/dist/lib/profiles.d.ts.map +0 -1
- package/dist/lib/profiles.js.map +0 -1
- package/dist/lib/pty-client.d.ts.map +0 -1
- package/dist/lib/pty-client.js.map +0 -1
- package/dist/lib/pty-server.d.ts.map +0 -1
- package/dist/lib/pty-server.js.map +0 -1
- package/dist/lib/registry.d.ts.map +0 -1
- package/dist/lib/registry.js.map +0 -1
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.js.map +0 -1
- package/dist/lib/rotate.d.ts.map +0 -1
- package/dist/lib/rotate.js.map +0 -1
- package/dist/lib/routines.d.ts.map +0 -1
- package/dist/lib/routines.js.map +0 -1
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.js.map +0 -1
- package/dist/lib/sandbox.d.ts.map +0 -1
- package/dist/lib/sandbox.js.map +0 -1
- package/dist/lib/scheduler.d.ts.map +0 -1
- package/dist/lib/scheduler.js.map +0 -1
- package/dist/lib/secrets-bundles.d.ts.map +0 -1
- package/dist/lib/secrets-bundles.js.map +0 -1
- package/dist/lib/secrets.d.ts +0 -27
- package/dist/lib/secrets.d.ts.map +0 -1
- package/dist/lib/secrets.js +0 -127
- package/dist/lib/secrets.js.map +0 -1
- package/dist/lib/session/__tests__/db.test.d.ts +0 -2
- package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/db.test.js +0 -54
- package/dist/lib/session/__tests__/db.test.js.map +0 -1
- package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
- package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/discover.test.js +0 -63
- package/dist/lib/session/__tests__/discover.test.js.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
- package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.js +0 -44
- package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
- package/dist/lib/session/__tests__/render.test.d.ts +0 -2
- package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/render.test.js +0 -602
- package/dist/lib/session/__tests__/render.test.js.map +0 -1
- package/dist/lib/session/artifacts.d.ts.map +0 -1
- package/dist/lib/session/artifacts.js.map +0 -1
- package/dist/lib/session/db.d.ts.map +0 -1
- package/dist/lib/session/db.js.map +0 -1
- package/dist/lib/session/discover.d.ts.map +0 -1
- package/dist/lib/session/discover.js.map +0 -1
- package/dist/lib/session/parse.d.ts.map +0 -1
- package/dist/lib/session/parse.js.map +0 -1
- package/dist/lib/session/prompt.d.ts.map +0 -1
- package/dist/lib/session/prompt.js.map +0 -1
- package/dist/lib/session/prompt.test.d.ts +0 -2
- package/dist/lib/session/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/prompt.test.js +0 -57
- package/dist/lib/session/prompt.test.js.map +0 -1
- package/dist/lib/session/render.d.ts.map +0 -1
- package/dist/lib/session/render.js.map +0 -1
- package/dist/lib/session/team-filter.d.ts.map +0 -1
- package/dist/lib/session/team-filter.js.map +0 -1
- package/dist/lib/session/team-filter.test.d.ts +0 -2
- package/dist/lib/session/team-filter.test.d.ts.map +0 -1
- package/dist/lib/session/team-filter.test.js +0 -157
- package/dist/lib/session/team-filter.test.js.map +0 -1
- package/dist/lib/session/types.d.ts.map +0 -1
- package/dist/lib/session/types.js.map +0 -1
- package/dist/lib/shims.d.ts.map +0 -1
- package/dist/lib/shims.js.map +0 -1
- package/dist/lib/skills.d.ts.map +0 -1
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/subagents.d.ts.map +0 -1
- package/dist/lib/subagents.js.map +0 -1
- package/dist/lib/teams/agents.d.ts.map +0 -1
- package/dist/lib/teams/agents.js.map +0 -1
- package/dist/lib/teams/api.d.ts.map +0 -1
- package/dist/lib/teams/api.js.map +0 -1
- package/dist/lib/teams/cloud.d.ts +0 -11
- package/dist/lib/teams/cloud.d.ts.map +0 -1
- package/dist/lib/teams/cloud.js +0 -169
- package/dist/lib/teams/cloud.js.map +0 -1
- package/dist/lib/teams/debug.d.ts.map +0 -1
- package/dist/lib/teams/debug.js.map +0 -1
- package/dist/lib/teams/file_ops.d.ts.map +0 -1
- package/dist/lib/teams/file_ops.js.map +0 -1
- package/dist/lib/teams/parsers.d.ts.map +0 -1
- package/dist/lib/teams/parsers.js.map +0 -1
- package/dist/lib/teams/persistence.d.ts.map +0 -1
- package/dist/lib/teams/persistence.js.map +0 -1
- package/dist/lib/teams/ralph.d.ts +0 -8
- package/dist/lib/teams/ralph.d.ts.map +0 -1
- package/dist/lib/teams/ralph.js +0 -59
- package/dist/lib/teams/ralph.js.map +0 -1
- package/dist/lib/teams/registry.d.ts.map +0 -1
- package/dist/lib/teams/registry.js.map +0 -1
- package/dist/lib/teams/summarizer.d.ts.map +0 -1
- package/dist/lib/teams/summarizer.js.map +0 -1
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/usage.d.ts.map +0 -1
- package/dist/lib/usage.js.map +0 -1
- package/dist/lib/versions.d.ts.map +0 -1
- package/dist/lib/versions.js.map +0 -1
- package/scripts/rebuild-sqlite.sh +0 -46
package/dist/index.js
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
1
|
+
#!/usr/bin/env -S node --no-warnings=ExperimentalWarning
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for agents-cli.
|
|
4
|
+
*
|
|
5
|
+
* Registers all commands, handles update checks, auto-corrects typos,
|
|
6
|
+
* and launches the first-run interactive init when appropriate.
|
|
7
|
+
*/
|
|
2
8
|
import { Command } from 'commander';
|
|
3
9
|
import chalk from 'chalk';
|
|
4
10
|
import ora from 'ora';
|
|
5
11
|
import * as fs from 'fs';
|
|
6
|
-
import * as os from 'os';
|
|
7
12
|
import * as path from 'path';
|
|
8
13
|
import { fileURLToPath } from 'url';
|
|
9
|
-
import { select } from '@inquirer/prompts';
|
|
14
|
+
import { confirm, select } from '@inquirer/prompts';
|
|
10
15
|
// Force exit on Ctrl+C when no interactive prompt is handling it.
|
|
11
16
|
process.on('SIGINT', () => process.exit(130));
|
|
12
17
|
// Ignore SIGPIPE — prevents exit code 13 crashes in piped environments
|
|
@@ -19,8 +24,7 @@ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
|
19
24
|
const VERSION = packageJson.version;
|
|
20
25
|
// Import command registrations
|
|
21
26
|
import { registerPullCommand } from './commands/pull.js';
|
|
22
|
-
import {
|
|
23
|
-
import { registerForkCommand } from './commands/fork.js';
|
|
27
|
+
import { registerRepoCommands } from './commands/repo.js';
|
|
24
28
|
import { registerInitCommand, runInit } from './commands/init.js';
|
|
25
29
|
import { registerStatusCommand } from './commands/status.js';
|
|
26
30
|
import { registerViewCommand } from './commands/view.js';
|
|
@@ -36,19 +40,26 @@ import { registerDaemonCommands } from './commands/daemon.js';
|
|
|
36
40
|
import { registerRoutinesCommands } from './commands/routines.js';
|
|
37
41
|
import { registerRunCommand } from './commands/exec.js';
|
|
38
42
|
import { registerModelsCommand } from './commands/models.js';
|
|
43
|
+
import { registerPruneCommand } from './commands/prune.js';
|
|
44
|
+
import { registerDoctorCommand } from './commands/doctor.js';
|
|
39
45
|
import { registerSubagentsCommands } from './commands/subagents.js';
|
|
40
46
|
import { registerPluginsCommands } from './commands/plugins.js';
|
|
41
47
|
import { registerSyncCommand } from './commands/sync.js';
|
|
42
48
|
import { registerRefreshMemoryCommand } from './commands/refresh-memory.js';
|
|
43
|
-
import { registerSessionsCommands } from './commands/sessions.js';
|
|
44
49
|
import { registerDriveCommands } from './commands/drive.js';
|
|
45
50
|
import { registerPtyCommands } from './commands/pty.js';
|
|
46
|
-
import { registerTeamsCommands } from './commands/teams.js';
|
|
47
51
|
import { registerProfilesCommands } from './commands/profiles.js';
|
|
48
52
|
import { registerSecretsCommands } from './commands/secrets.js';
|
|
49
|
-
import {
|
|
53
|
+
import { registerFactoryCommands } from './commands/factory.js';
|
|
54
|
+
import { registerUsageCommand } from './commands/usage.js';
|
|
55
|
+
import { registerAliasCommand } from './commands/alias.js';
|
|
56
|
+
import { registerBetaCommands } from './commands/beta.js';
|
|
50
57
|
import { applyGlobalHelpConventions } from './lib/help.js';
|
|
51
58
|
import { isPromptCancelled } from './commands/utils.js';
|
|
59
|
+
import { getAgentsDir } from './lib/state.js';
|
|
60
|
+
import { AGENTS } from './lib/agents.js';
|
|
61
|
+
import { getGlobalDefault } from './lib/versions.js';
|
|
62
|
+
import { addShimsToPath, ensureShimCurrent, getPathShadowingExecutable, getPathSetupInstructions, hasAliasShadowingShim, isShimsInPath, listAgentsWithInstalledVersions, } from './lib/shims.js';
|
|
52
63
|
const program = new Command();
|
|
53
64
|
program
|
|
54
65
|
.name('agents')
|
|
@@ -69,13 +80,13 @@ Quick start:
|
|
|
69
80
|
agents init First-time setup (interactive)
|
|
70
81
|
agents view See what's installed
|
|
71
82
|
agents run <agent> ["prompt"] Run an agent (interactive without prompt, headless with)
|
|
72
|
-
agents cloud run <prompt> Dispatch a task to the cloud (Rush, Codex, Factory)
|
|
73
83
|
agents sessions Browse past sessions across all agents
|
|
74
84
|
|
|
75
85
|
Agent versions:
|
|
76
86
|
add <agent>[@version] Install an agent CLI (e.g. agents add codex)
|
|
77
87
|
remove <agent>[@version] Uninstall a version
|
|
78
88
|
use <agent>@<version> Set the default version
|
|
89
|
+
prune [target] Remove orphan resources (commands/skills/hooks) and/or older duplicate version installs
|
|
79
90
|
view [agent[@version]] List versions, or inspect one in detail
|
|
80
91
|
|
|
81
92
|
Agent configuration (synced across versions):
|
|
@@ -94,7 +105,6 @@ Packages:
|
|
|
94
105
|
|
|
95
106
|
Run agents:
|
|
96
107
|
run <agent|profile> [prompt] Run an agent. Omit prompt for interactive mode.
|
|
97
|
-
cloud Dispatch tasks to cloud providers (Rush, Codex, Factory)
|
|
98
108
|
teams Coordinate multiple agents on shared work
|
|
99
109
|
routines Run agents on a cron schedule (scheduler auto-starts)
|
|
100
110
|
sessions Browse and replay past runs
|
|
@@ -104,6 +114,7 @@ Credentials:
|
|
|
104
114
|
secrets Keychain-backed env bundles injected at spawn
|
|
105
115
|
|
|
106
116
|
Helpers:
|
|
117
|
+
beta Enable preview features like drive and factory
|
|
107
118
|
pty Drive interactive terminal programs (REPLs, TUIs)
|
|
108
119
|
|
|
109
120
|
Automation tips:
|
|
@@ -114,19 +125,20 @@ Automation tips:
|
|
|
114
125
|
Non-TTY shells apply defaults Omitted required selections fail with a plain hint
|
|
115
126
|
|
|
116
127
|
Config sync (portable setup via git):
|
|
117
|
-
pull
|
|
118
|
-
|
|
119
|
-
|
|
128
|
+
pull Clone or pull the system repo at ~/.agents-system/
|
|
129
|
+
repo init --path <dir> Scaffold your own editable repo from a template
|
|
130
|
+
repo add <path|gh:user/repo> Merge an extra repo after the system repo
|
|
120
131
|
|
|
121
132
|
Options:
|
|
122
133
|
-V, --version Show version number
|
|
123
134
|
-h, --help Show help
|
|
124
135
|
|
|
125
|
-
|
|
136
|
+
System config lives in ~/.agents-system/. Run 'agents <command> --help' for details.
|
|
126
137
|
`;
|
|
127
138
|
}
|
|
128
139
|
return originalHelpInformation();
|
|
129
140
|
};
|
|
141
|
+
/** Compare two semver version strings. Returns 1 if a > b, -1 if a < b, 0 if equal. */
|
|
130
142
|
function compareVersions(a, b) {
|
|
131
143
|
const partsA = a.split('.').map(Number);
|
|
132
144
|
const partsB = b.split('.').map(Number);
|
|
@@ -138,6 +150,7 @@ function compareVersions(a, b) {
|
|
|
138
150
|
}
|
|
139
151
|
return 0;
|
|
140
152
|
}
|
|
153
|
+
/** Fetch and display changelog entries between two versions from unpkg. */
|
|
141
154
|
async function showWhatsNew(fromVersion, toVersion) {
|
|
142
155
|
try {
|
|
143
156
|
const response = await fetch(`https://unpkg.com/@phnx-labs/agents-cli@${toVersion}/CHANGELOG.md`);
|
|
@@ -183,7 +196,8 @@ async function showWhatsNew(fromVersion, toVersion) {
|
|
|
183
196
|
}
|
|
184
197
|
}
|
|
185
198
|
const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
186
|
-
const UPDATE_CHECK_FILE = path.join(
|
|
199
|
+
const UPDATE_CHECK_FILE = path.join(getAgentsDir(), '.update-check');
|
|
200
|
+
/** Read the cached update-check state from disk. Returns null if the file is missing or corrupt. */
|
|
187
201
|
function readUpdateCache() {
|
|
188
202
|
try {
|
|
189
203
|
return JSON.parse(fs.readFileSync(UPDATE_CHECK_FILE, 'utf-8'));
|
|
@@ -193,11 +207,13 @@ function readUpdateCache() {
|
|
|
193
207
|
return null;
|
|
194
208
|
}
|
|
195
209
|
}
|
|
210
|
+
/** Determine whether enough time has elapsed since the last registry fetch. */
|
|
196
211
|
function shouldFetchLatest(cache) {
|
|
197
212
|
if (!cache)
|
|
198
213
|
return true;
|
|
199
214
|
return Date.now() - cache.lastCheck > UPDATE_CHECK_INTERVAL_MS;
|
|
200
215
|
}
|
|
216
|
+
/** Persist the latest known version and current timestamp to the update-check cache. */
|
|
201
217
|
function saveUpdateCheck(latestVersion) {
|
|
202
218
|
try {
|
|
203
219
|
const dir = path.dirname(UPDATE_CHECK_FILE);
|
|
@@ -209,6 +225,7 @@ function saveUpdateCheck(latestVersion) {
|
|
|
209
225
|
/* best-effort cache update */
|
|
210
226
|
}
|
|
211
227
|
}
|
|
228
|
+
/** Present an interactive upgrade prompt (TTY) or a one-line hint (non-TTY). */
|
|
212
229
|
async function promptUpgrade(latestVersion) {
|
|
213
230
|
if (!process.stdout.isTTY) {
|
|
214
231
|
console.error(chalk.yellow(`Update available: ${VERSION} -> ${latestVersion}. Run: npm install -g @phnx-labs/agents-cli@latest`));
|
|
@@ -239,19 +256,19 @@ async function promptUpgrade(latestVersion) {
|
|
|
239
256
|
return;
|
|
240
257
|
}
|
|
241
258
|
if (answer === 'now') {
|
|
242
|
-
const {
|
|
259
|
+
const { execFile, spawnSync } = await import('child_process');
|
|
243
260
|
const { promisify } = await import('util');
|
|
244
|
-
const
|
|
261
|
+
const execFileAsync = promisify(execFile);
|
|
245
262
|
const spinner = ora('Upgrading...').start();
|
|
246
263
|
try {
|
|
247
|
-
await
|
|
264
|
+
await execFileAsync('npm', ['install', '-g', '@phnx-labs/agents-cli@latest']);
|
|
248
265
|
spinner.succeed(`Upgraded to ${latestVersion}`);
|
|
249
266
|
await showWhatsNew(VERSION, latestVersion);
|
|
250
267
|
console.log();
|
|
251
268
|
// Re-exec with new version and exit
|
|
252
269
|
const result = spawnSync('agents', process.argv.slice(2), {
|
|
253
270
|
stdio: 'inherit',
|
|
254
|
-
shell:
|
|
271
|
+
shell: false,
|
|
255
272
|
});
|
|
256
273
|
process.exit(result.status ?? 0);
|
|
257
274
|
}
|
|
@@ -277,7 +294,7 @@ function refreshUpdateCacheInBackground() {
|
|
|
277
294
|
/* network error, try again next invocation */
|
|
278
295
|
});
|
|
279
296
|
}
|
|
280
|
-
/**
|
|
297
|
+
/** Check for available updates using the local cache. Triggers a background refresh if stale. */
|
|
281
298
|
async function checkForUpdates() {
|
|
282
299
|
const cache = readUpdateCache();
|
|
283
300
|
// Kick off network refresh in background if stale. Does not block.
|
|
@@ -298,6 +315,75 @@ async function checkForUpdates() {
|
|
|
298
315
|
}
|
|
299
316
|
}
|
|
300
317
|
}
|
|
318
|
+
async function maybeBootstrapShimIntegration(requestedCommand) {
|
|
319
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if (requestedCommand === 'sync' || requestedCommand === 'refresh-memory') {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const installedAgents = listAgentsWithInstalledVersions();
|
|
326
|
+
if (installedAgents.length === 0) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const createdOrUpdated = [];
|
|
330
|
+
for (const agent of installedAgents) {
|
|
331
|
+
const status = ensureShimCurrent(agent);
|
|
332
|
+
if (status !== 'current') {
|
|
333
|
+
createdOrUpdated.push(`${status === 'created' ? 'Created' : 'Updated'} ${AGENTS[agent].cliCommand} shim`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
for (const notice of createdOrUpdated) {
|
|
337
|
+
console.log(chalk.green(notice));
|
|
338
|
+
}
|
|
339
|
+
const defaultAgents = installedAgents.filter((agent) => getGlobalDefault(agent));
|
|
340
|
+
const shadowed = defaultAgents
|
|
341
|
+
.map((agent) => ({ agent, shadowedBy: getPathShadowingExecutable(agent) }))
|
|
342
|
+
.filter((item) => Boolean(item.shadowedBy));
|
|
343
|
+
// Also check for shell aliases that shadow the shim
|
|
344
|
+
const aliased = defaultAgents.filter((agent) => hasAliasShadowingShim(agent));
|
|
345
|
+
// If shims are in PATH and nothing is binary-shadowing, we're done.
|
|
346
|
+
// Shell aliases that call the same command with extra flags are intentional
|
|
347
|
+
// customization and don't break shim integration.
|
|
348
|
+
if (shadowed.length === 0 && isShimsInPath()) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
const affected = [];
|
|
352
|
+
for (const { agent, shadowedBy } of shadowed) {
|
|
353
|
+
affected.push(`${AGENTS[agent].cliCommand} -> ${shadowedBy}`);
|
|
354
|
+
}
|
|
355
|
+
for (const agent of aliased) {
|
|
356
|
+
if (!shadowed.some((s) => s.agent === agent)) {
|
|
357
|
+
affected.push(`${AGENTS[agent].cliCommand} (alias)`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
if (affected.length === 0) {
|
|
361
|
+
// PATH issue - show all installed agents
|
|
362
|
+
affected.push(...installedAgents.map((agent) => AGENTS[agent].cliCommand));
|
|
363
|
+
}
|
|
364
|
+
const shouldRepair = await confirm({
|
|
365
|
+
message: `Repair shim integration now? ${affected.join(', ')}`,
|
|
366
|
+
default: true,
|
|
367
|
+
});
|
|
368
|
+
if (!shouldRepair) {
|
|
369
|
+
console.log(chalk.yellow('Shim integration still needs attention.'));
|
|
370
|
+
console.log(chalk.gray(getPathSetupInstructions()));
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
const pathResult = addShimsToPath();
|
|
374
|
+
if (!pathResult.success) {
|
|
375
|
+
console.log(chalk.yellow('Could not repair shim PATH setup automatically.'));
|
|
376
|
+
console.log(chalk.gray(pathResult.error || getPathSetupInstructions()));
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
if (pathResult.alreadyPresent) {
|
|
380
|
+
console.log(chalk.yellow('Shim PATH entry is already in your shell config, but this shell has not reloaded it yet.'));
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
console.log(chalk.green(`Repaired shim PATH setup in ~/${pathResult.rcFile}`));
|
|
384
|
+
}
|
|
385
|
+
console.log(chalk.gray(getPathSetupInstructions()));
|
|
386
|
+
}
|
|
301
387
|
// Register all commands
|
|
302
388
|
registerViewCommand(program);
|
|
303
389
|
registerStatusCommand(program);
|
|
@@ -337,6 +423,8 @@ registerDaemonCommands(program);
|
|
|
337
423
|
registerRoutinesCommands(program);
|
|
338
424
|
registerRunCommand(program);
|
|
339
425
|
registerModelsCommand(program);
|
|
426
|
+
registerPruneCommand(program);
|
|
427
|
+
registerDoctorCommand(program);
|
|
340
428
|
// Deprecated 'exec' alias for 'run'
|
|
341
429
|
program
|
|
342
430
|
.command('exec', { hidden: true })
|
|
@@ -348,14 +436,15 @@ program
|
|
|
348
436
|
args[0] = 'run';
|
|
349
437
|
await program.parseAsync(['node', 'agents', ...args]);
|
|
350
438
|
});
|
|
351
|
-
registerTeamsCommands(program);
|
|
352
439
|
registerProfilesCommands(program);
|
|
353
440
|
registerSecretsCommands(program);
|
|
354
|
-
|
|
441
|
+
registerBetaCommands(program);
|
|
355
442
|
registerSyncCommand(program);
|
|
356
443
|
registerRefreshMemoryCommand(program);
|
|
357
444
|
registerDriveCommands(program);
|
|
358
|
-
|
|
445
|
+
registerFactoryCommands(program);
|
|
446
|
+
registerUsageCommand(program);
|
|
447
|
+
registerAliasCommand(program);
|
|
359
448
|
registerPtyCommands(program);
|
|
360
449
|
// Deprecated 'jobs' and 'cron' aliases for 'routines'
|
|
361
450
|
for (const alias of ['jobs', 'cron']) {
|
|
@@ -394,10 +483,10 @@ program
|
|
|
394
483
|
return;
|
|
395
484
|
}
|
|
396
485
|
spinner.text = `Upgrading ${VERSION} -> ${latestVersion}...`;
|
|
397
|
-
const {
|
|
486
|
+
const { execFile } = await import('child_process');
|
|
398
487
|
const { promisify } = await import('util');
|
|
399
|
-
const
|
|
400
|
-
await
|
|
488
|
+
const execFileAsync = promisify(execFile);
|
|
489
|
+
await execFileAsync('npm', ['install', '-g', '@phnx-labs/agents-cli@latest']);
|
|
401
490
|
spinner.succeed(`Upgraded to ${latestVersion}`);
|
|
402
491
|
await showWhatsNew(VERSION, latestVersion);
|
|
403
492
|
}
|
|
@@ -407,13 +496,10 @@ program
|
|
|
407
496
|
}
|
|
408
497
|
});
|
|
409
498
|
registerPullCommand(program);
|
|
410
|
-
|
|
411
|
-
registerForkCommand(program);
|
|
499
|
+
registerRepoCommands(program);
|
|
412
500
|
registerInitCommand(program);
|
|
413
501
|
applyGlobalHelpConventions(program);
|
|
414
|
-
/**
|
|
415
|
-
* Calculate Levenshtein edit distance between two strings.
|
|
416
|
-
*/
|
|
502
|
+
/** Calculate the Levenshtein edit distance between two strings. */
|
|
417
503
|
function levenshtein(a, b) {
|
|
418
504
|
const m = a.length;
|
|
419
505
|
const n = b.length;
|
|
@@ -461,10 +547,44 @@ program.on('command:*', (operands) => {
|
|
|
461
547
|
});
|
|
462
548
|
// Run update check on EVERY invocation before parsing
|
|
463
549
|
await checkForUpdates();
|
|
550
|
+
// Surface any "behind upstream" notices from the previous detached sync, then
|
|
551
|
+
// fire-and-forget the next background sync. System repo gets a real fast-forward
|
|
552
|
+
// pull (read-only locally, safe). User repo and extras get fetch-only + a
|
|
553
|
+
// status marker that we'll print on the *next* invocation.
|
|
554
|
+
const { spawnDetachedSync } = await import('./lib/auto-pull.js');
|
|
555
|
+
spawnDetachedSync();
|
|
464
556
|
// First-run experience: no args + no config yet + TTY -> launch interactive init.
|
|
465
557
|
// Skipped when stdin/stdout isn't a terminal (CI, pipes) or when user passes any args.
|
|
466
558
|
const passedArgs = process.argv.slice(2);
|
|
467
|
-
const
|
|
559
|
+
const requestedCommand = passedArgs.find((arg) => !arg.startsWith('-'));
|
|
560
|
+
/**
|
|
561
|
+
* Lazily register command trees that pull in the SQLite-backed session/cloud
|
|
562
|
+
* stack. This keeps lightweight commands like `agents view` from loading the
|
|
563
|
+
* DB layer during CLI startup.
|
|
564
|
+
*/
|
|
565
|
+
async function registerLazyCommands() {
|
|
566
|
+
switch (requestedCommand) {
|
|
567
|
+
case 'sessions': {
|
|
568
|
+
const { registerSessionsCommands } = await import('./commands/sessions.js');
|
|
569
|
+
registerSessionsCommands(program);
|
|
570
|
+
break;
|
|
571
|
+
}
|
|
572
|
+
case 'teams': {
|
|
573
|
+
const { registerTeamsCommands } = await import('./commands/teams.js');
|
|
574
|
+
registerTeamsCommands(program);
|
|
575
|
+
break;
|
|
576
|
+
}
|
|
577
|
+
case 'cloud': {
|
|
578
|
+
const { registerCloudCommands } = await import('./commands/cloud.js');
|
|
579
|
+
registerCloudCommands(program);
|
|
580
|
+
break;
|
|
581
|
+
}
|
|
582
|
+
default:
|
|
583
|
+
break;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
await registerLazyCommands();
|
|
587
|
+
const metaFilePath = path.join(getAgentsDir(), 'agents.yaml');
|
|
468
588
|
const firstRun = passedArgs.length === 0 &&
|
|
469
589
|
!fs.existsSync(metaFilePath) &&
|
|
470
590
|
process.stdin.isTTY &&
|
|
@@ -480,5 +600,23 @@ if (firstRun) {
|
|
|
480
600
|
}
|
|
481
601
|
process.exit(0);
|
|
482
602
|
}
|
|
483
|
-
|
|
484
|
-
|
|
603
|
+
// Commands that require the system repo to be cloned first.
|
|
604
|
+
const SYSTEM_REPO_COMMANDS = new Set([
|
|
605
|
+
'view', 'status', 'skills', 'rules', 'commands', 'hooks',
|
|
606
|
+
'mcp', 'permissions', 'versions', 'packages', 'sync',
|
|
607
|
+
'subagents', 'repo', 'plugins', 'doctor',
|
|
608
|
+
]);
|
|
609
|
+
if (!firstRun && requestedCommand && SYSTEM_REPO_COMMANDS.has(requestedCommand)) {
|
|
610
|
+
const { ensureInitialized } = await import('./commands/init.js');
|
|
611
|
+
await ensureInitialized(program);
|
|
612
|
+
}
|
|
613
|
+
try {
|
|
614
|
+
await maybeBootstrapShimIntegration(requestedCommand);
|
|
615
|
+
await program.parseAsync();
|
|
616
|
+
}
|
|
617
|
+
catch (err) {
|
|
618
|
+
if (err instanceof Error && err.name === 'ExitPromptError') {
|
|
619
|
+
process.exit(130);
|
|
620
|
+
}
|
|
621
|
+
throw err;
|
|
622
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Client Protocol (ACP) client wrapper for agents-cli.
|
|
3
|
+
*
|
|
4
|
+
* Spawns an ACP-capable agent CLI as a stdio subprocess and drives it through
|
|
5
|
+
* initialize -> newSession -> prompt, streaming `session/update` notifications
|
|
6
|
+
* back to the caller as async iterables.
|
|
7
|
+
*
|
|
8
|
+
* Also implements the Client interface (fs read/write, terminal exec) so the
|
|
9
|
+
* agent can request filesystem and shell operations through us. `--mode plan`
|
|
10
|
+
* rejects all write/terminal requests; `edit`/`full` allow them.
|
|
11
|
+
*/
|
|
12
|
+
import { type SessionNotification } from '@zed-industries/agent-client-protocol';
|
|
13
|
+
import type { AgentId } from '../types.js';
|
|
14
|
+
import type { ExecMode } from '../exec.js';
|
|
15
|
+
export interface AcpRunOptions {
|
|
16
|
+
agent: AgentId;
|
|
17
|
+
prompt: string;
|
|
18
|
+
cwd: string;
|
|
19
|
+
mode: ExecMode;
|
|
20
|
+
/** Optional: callback invoked for every session/update notification. */
|
|
21
|
+
onUpdate?: (n: SessionNotification) => void;
|
|
22
|
+
}
|
|
23
|
+
export interface AcpRunResult {
|
|
24
|
+
stopReason: string;
|
|
25
|
+
sessionId: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Runs a single prompt turn against an ACP-capable agent and streams updates
|
|
29
|
+
* to `onUpdate`. Resolves when the turn completes (StopReason is returned).
|
|
30
|
+
*/
|
|
31
|
+
export declare function runAcp(opts: AcpRunOptions): Promise<AcpRunResult>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Client Protocol (ACP) client wrapper for agents-cli.
|
|
3
|
+
*
|
|
4
|
+
* Spawns an ACP-capable agent CLI as a stdio subprocess and drives it through
|
|
5
|
+
* initialize -> newSession -> prompt, streaming `session/update` notifications
|
|
6
|
+
* back to the caller as async iterables.
|
|
7
|
+
*
|
|
8
|
+
* Also implements the Client interface (fs read/write, terminal exec) so the
|
|
9
|
+
* agent can request filesystem and shell operations through us. `--mode plan`
|
|
10
|
+
* rejects all write/terminal requests; `edit`/`full` allow them.
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from 'child_process';
|
|
13
|
+
import { Readable, Writable } from 'stream';
|
|
14
|
+
import { promises as fs } from 'fs';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import { ClientSideConnection, ndJsonStream, } from '@zed-industries/agent-client-protocol';
|
|
17
|
+
import { getAcpSpec, supportsAcp } from './harnesses.js';
|
|
18
|
+
const PROTOCOL_VERSION = 1;
|
|
19
|
+
/**
|
|
20
|
+
* Runs a single prompt turn against an ACP-capable agent and streams updates
|
|
21
|
+
* to `onUpdate`. Resolves when the turn completes (StopReason is returned).
|
|
22
|
+
*/
|
|
23
|
+
export async function runAcp(opts) {
|
|
24
|
+
if (!supportsAcp(opts.agent)) {
|
|
25
|
+
throw new Error(`Agent '${opts.agent}' does not support ACP. Use direct exec instead.`);
|
|
26
|
+
}
|
|
27
|
+
const spec = getAcpSpec(opts.agent);
|
|
28
|
+
const child = spawn(spec.command, spec.args, {
|
|
29
|
+
cwd: opts.cwd,
|
|
30
|
+
stdio: ['pipe', 'pipe', 'inherit'],
|
|
31
|
+
env: process.env,
|
|
32
|
+
});
|
|
33
|
+
const stream = ndJsonStream(Writable.toWeb(child.stdin), Readable.toWeb(child.stdout));
|
|
34
|
+
const client = buildClient(opts);
|
|
35
|
+
const connection = new ClientSideConnection(() => client, stream);
|
|
36
|
+
const initResp = await connection.initialize({
|
|
37
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
38
|
+
clientCapabilities: {
|
|
39
|
+
fs: { readTextFile: true, writeTextFile: true },
|
|
40
|
+
terminal: true,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
if (initResp.protocolVersion < PROTOCOL_VERSION) {
|
|
44
|
+
throw new Error(`Agent '${opts.agent}' speaks ACP protocol v${initResp.protocolVersion}, need v${PROTOCOL_VERSION}.`);
|
|
45
|
+
}
|
|
46
|
+
const session = await connection.newSession({
|
|
47
|
+
cwd: opts.cwd,
|
|
48
|
+
mcpServers: [],
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
const resp = await connection.prompt({
|
|
52
|
+
sessionId: session.sessionId,
|
|
53
|
+
prompt: [{ type: 'text', text: opts.prompt }],
|
|
54
|
+
});
|
|
55
|
+
return { stopReason: resp.stopReason, sessionId: session.sessionId };
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
child.kill('SIGTERM');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function buildClient(opts) {
|
|
62
|
+
const { mode, onUpdate, cwd } = opts;
|
|
63
|
+
const canWrite = mode !== 'plan';
|
|
64
|
+
return {
|
|
65
|
+
async sessionUpdate(params) {
|
|
66
|
+
if (onUpdate)
|
|
67
|
+
onUpdate(params);
|
|
68
|
+
},
|
|
69
|
+
async readTextFile(params) {
|
|
70
|
+
const abs = resolveInCwd(cwd, params.path);
|
|
71
|
+
const content = await fs.readFile(abs, 'utf8');
|
|
72
|
+
const sliced = sliceByLines(content, params.line, params.limit);
|
|
73
|
+
return { content: sliced };
|
|
74
|
+
},
|
|
75
|
+
async writeTextFile(params) {
|
|
76
|
+
if (!canWrite) {
|
|
77
|
+
throw new Error(`File writes are denied in plan mode: ${params.path}`);
|
|
78
|
+
}
|
|
79
|
+
const abs = resolveInCwd(cwd, params.path);
|
|
80
|
+
await fs.mkdir(path.dirname(abs), { recursive: true });
|
|
81
|
+
await fs.writeFile(abs, params.content, 'utf8');
|
|
82
|
+
return {};
|
|
83
|
+
},
|
|
84
|
+
async requestPermission(params) {
|
|
85
|
+
const optionId = mode === 'full'
|
|
86
|
+
? (params.options.find(o => o.kind === 'allow_always')?.optionId
|
|
87
|
+
?? params.options[0]?.optionId)
|
|
88
|
+
: params.options.find(o => o.kind === 'allow_once')?.optionId;
|
|
89
|
+
if (!optionId) {
|
|
90
|
+
return { outcome: { outcome: 'cancelled' } };
|
|
91
|
+
}
|
|
92
|
+
return { outcome: { outcome: 'selected', optionId } };
|
|
93
|
+
},
|
|
94
|
+
async createTerminal(params) {
|
|
95
|
+
if (!canWrite) {
|
|
96
|
+
throw new Error(`Terminal commands are denied in plan mode: ${params.command}`);
|
|
97
|
+
}
|
|
98
|
+
throw new Error('Terminal support not yet implemented in agents-cli ACP client.');
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function resolveInCwd(cwd, target) {
|
|
103
|
+
const abs = path.resolve(cwd, target);
|
|
104
|
+
const rel = path.relative(cwd, abs);
|
|
105
|
+
if (rel.startsWith('..')) {
|
|
106
|
+
throw new Error(`Path '${target}' escapes session cwd '${cwd}'`);
|
|
107
|
+
}
|
|
108
|
+
return abs;
|
|
109
|
+
}
|
|
110
|
+
function sliceByLines(content, startLine, limit) {
|
|
111
|
+
if (startLine == null && limit == null)
|
|
112
|
+
return content;
|
|
113
|
+
const lines = content.split('\n');
|
|
114
|
+
const from = Math.max(0, (startLine ?? 1) - 1);
|
|
115
|
+
const to = limit != null ? from + limit : lines.length;
|
|
116
|
+
return lines.slice(from, to).join('\n');
|
|
117
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-harness spawn configuration for Agent Client Protocol (ACP) mode.
|
|
3
|
+
*
|
|
4
|
+
* Each entry describes how to launch a coding agent CLI as an ACP server
|
|
5
|
+
* (stdio JSON-RPC). Unsupported harnesses (amp, roo, goose-stdio) are omitted;
|
|
6
|
+
* callers should fall back to the legacy direct-exec path for those.
|
|
7
|
+
*
|
|
8
|
+
* Sources: https://agentclientprotocol.com/get-started/agents + vendor docs.
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentId } from '../types.js';
|
|
11
|
+
export interface AcpHarnessSpec {
|
|
12
|
+
/** Command + args to spawn the agent in ACP server mode. */
|
|
13
|
+
command: string;
|
|
14
|
+
args: string[];
|
|
15
|
+
/** Human-hint for `teams doctor` when the spawn fails. */
|
|
16
|
+
installHint: string;
|
|
17
|
+
/** Confidence: "verified" = tested in this repo, "documented" = per vendor docs. */
|
|
18
|
+
confidence: 'verified' | 'documented';
|
|
19
|
+
/** Source URL for the invocation. */
|
|
20
|
+
source: string;
|
|
21
|
+
}
|
|
22
|
+
export declare const ACP_HARNESSES: Partial<Record<AgentId, AcpHarnessSpec>>;
|
|
23
|
+
/** Returns the ACP spawn spec for an agent, or undefined if the harness does not speak ACP. */
|
|
24
|
+
export declare function getAcpSpec(agent: AgentId): AcpHarnessSpec | undefined;
|
|
25
|
+
/** True if the harness is known to support ACP (directly or via adapter). */
|
|
26
|
+
export declare function supportsAcp(agent: AgentId): boolean;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-harness spawn configuration for Agent Client Protocol (ACP) mode.
|
|
3
|
+
*
|
|
4
|
+
* Each entry describes how to launch a coding agent CLI as an ACP server
|
|
5
|
+
* (stdio JSON-RPC). Unsupported harnesses (amp, roo, goose-stdio) are omitted;
|
|
6
|
+
* callers should fall back to the legacy direct-exec path for those.
|
|
7
|
+
*
|
|
8
|
+
* Sources: https://agentclientprotocol.com/get-started/agents + vendor docs.
|
|
9
|
+
*/
|
|
10
|
+
export const ACP_HARNESSES = {
|
|
11
|
+
gemini: {
|
|
12
|
+
command: 'gemini',
|
|
13
|
+
args: ['--experimental-acp'],
|
|
14
|
+
installHint: 'npm i -g @google/gemini-cli',
|
|
15
|
+
confidence: 'documented',
|
|
16
|
+
source: 'https://agentclientprotocol.com/get-started/agents',
|
|
17
|
+
},
|
|
18
|
+
claude: {
|
|
19
|
+
command: 'npx',
|
|
20
|
+
args: ['-y', '@zed-industries/claude-agent-acp'],
|
|
21
|
+
installHint: 'npm i -g @zed-industries/claude-agent-acp',
|
|
22
|
+
confidence: 'documented',
|
|
23
|
+
source: 'https://www.npmjs.com/package/@zed-industries/claude-agent-acp',
|
|
24
|
+
},
|
|
25
|
+
codex: {
|
|
26
|
+
command: 'npx',
|
|
27
|
+
args: ['-y', '@zed-industries/codex-acp'],
|
|
28
|
+
installHint: 'npm i -g @zed-industries/codex-acp',
|
|
29
|
+
confidence: 'documented',
|
|
30
|
+
source: 'https://www.npmjs.com/package/@zed-industries/codex-acp',
|
|
31
|
+
},
|
|
32
|
+
cursor: {
|
|
33
|
+
command: 'cursor-agent',
|
|
34
|
+
args: ['acp'],
|
|
35
|
+
installHint: 'curl https://cursor.com/install -fsS | bash',
|
|
36
|
+
confidence: 'documented',
|
|
37
|
+
source: 'https://cursor.com/docs/cli/acp',
|
|
38
|
+
},
|
|
39
|
+
opencode: {
|
|
40
|
+
command: 'opencode',
|
|
41
|
+
args: ['acp'],
|
|
42
|
+
installHint: 'npm i -g opencode-ai',
|
|
43
|
+
confidence: 'documented',
|
|
44
|
+
source: 'https://opencode.ai/docs/acp/',
|
|
45
|
+
},
|
|
46
|
+
openclaw: {
|
|
47
|
+
command: 'openclaw',
|
|
48
|
+
args: ['acp'],
|
|
49
|
+
installHint: 'see https://docs.openclaw.ai',
|
|
50
|
+
confidence: 'documented',
|
|
51
|
+
source: 'https://docs.openclaw.ai/tools/acp-agents',
|
|
52
|
+
},
|
|
53
|
+
// goose: ACP over HTTP via `goosed`, not a clean stdio subcommand.
|
|
54
|
+
// copilot, kiro: excluded for now (not installed in the reference environment,
|
|
55
|
+
// no local verification possible).
|
|
56
|
+
// amp, roo: not on the ACP agents list.
|
|
57
|
+
};
|
|
58
|
+
/** Returns the ACP spawn spec for an agent, or undefined if the harness does not speak ACP. */
|
|
59
|
+
export function getAcpSpec(agent) {
|
|
60
|
+
return ACP_HARNESSES[agent];
|
|
61
|
+
}
|
|
62
|
+
/** True if the harness is known to support ACP (directly or via adapter). */
|
|
63
|
+
export function supportsAcp(agent) {
|
|
64
|
+
return ACP_HARNESSES[agent] !== undefined;
|
|
65
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless ACP runner.
|
|
3
|
+
*
|
|
4
|
+
* Glue between the `agents run <agent> "prompt" --acp` command and the ACP
|
|
5
|
+
* client. Emits either a human-readable stream of agent messages or newline-
|
|
6
|
+
* delimited JSON events, depending on `--json`.
|
|
7
|
+
*/
|
|
8
|
+
import type { AgentId } from '../types.js';
|
|
9
|
+
import type { ExecMode } from '../exec.js';
|
|
10
|
+
export interface HeadlessAcpOptions {
|
|
11
|
+
agent: AgentId;
|
|
12
|
+
prompt: string;
|
|
13
|
+
cwd: string;
|
|
14
|
+
mode: ExecMode;
|
|
15
|
+
json: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Runs a prompt turn over ACP, streaming output to stdout per `json` mode. */
|
|
18
|
+
export declare function runAcpHeadless(opts: HeadlessAcpOptions): Promise<number>;
|