@phnx-labs/agents-cli 1.12.0 → 1.14.2
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 +308 -297
- 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 +10 -0
- package/dist/commands/cloud.js +408 -0
- 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 +207 -20
- 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 +45 -6
- 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 +11 -0
- package/dist/commands/profiles.js +291 -0
- 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 +93 -129
- 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 +10 -0
- package/dist/commands/secrets.js +518 -0
- 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 +288 -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 +353 -20
- package/dist/index.d.ts +7 -2
- package/dist/index.js +205 -38
- 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 +207 -23
- 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 +25 -0
- package/dist/lib/cloud/codex.js +250 -0
- package/dist/lib/cloud/factory.d.ts +31 -0
- package/dist/lib/cloud/factory.js +53 -0
- package/dist/lib/cloud/registry.d.ts +15 -0
- package/dist/lib/cloud/registry.js +67 -0
- package/dist/lib/cloud/rush.d.ts +75 -0
- package/dist/lib/cloud/rush.js +438 -0
- package/dist/lib/cloud/store.d.ts +22 -0
- package/dist/lib/cloud/store.js +115 -0
- package/dist/lib/cloud/stream.d.ts +23 -0
- package/dist/lib/cloud/stream.js +194 -0
- package/dist/lib/cloud/types.d.ts +205 -0
- package/dist/lib/cloud/types.js +34 -0
- 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 +25 -5
- package/dist/lib/exec.js +72 -27
- 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 +191 -21
- 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 +25 -11
- package/dist/lib/models.js +405 -16
- 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 +24 -0
- package/dist/lib/profiles-presets.js +103 -0
- package/dist/lib/profiles.d.ts +69 -0
- package/dist/lib/profiles.js +144 -0
- 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 +89 -0
- package/dist/lib/rotate.js +327 -0
- 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 +39 -0
- package/dist/lib/secrets/bundles.js +189 -0
- 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 +16 -0
- package/dist/lib/session/artifacts.js +95 -0
- 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 +24 -2
- package/dist/lib/session/types.js +10 -2
- package/dist/lib/shims.d.ts +93 -5
- package/dist/lib/shims.js +380 -67
- 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 +114 -22
- package/dist/lib/state.js +323 -138
- 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 +48 -1
- package/dist/lib/usage.js +97 -16
- package/dist/lib/version-duplicates.d.ts +21 -0
- package/dist/lib/version-duplicates.js +90 -0
- package/dist/lib/versions.d.ts +39 -4
- package/dist/lib/versions.js +401 -111
- package/package.json +33 -18
- 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/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/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/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 -184
- package/dist/lib/__tests__/models.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 -218
- package/dist/lib/__tests__/usage.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/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/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/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/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/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,16 +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 {
|
|
51
|
+
import { registerProfilesCommands } from './commands/profiles.js';
|
|
52
|
+
import { registerSecretsCommands } from './commands/secrets.js';
|
|
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';
|
|
47
57
|
import { applyGlobalHelpConventions } from './lib/help.js';
|
|
48
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';
|
|
49
63
|
const program = new Command();
|
|
50
64
|
program
|
|
51
65
|
.name('agents')
|
|
@@ -59,19 +73,20 @@ program.helpInformation = function () {
|
|
|
59
73
|
if (this.name() === 'agents' && !this.parent) {
|
|
60
74
|
return `Usage: agents [command] [options]
|
|
61
75
|
|
|
62
|
-
Install, configure, and
|
|
63
|
-
Works with Claude, Codex, Gemini, Cursor, OpenCode, and
|
|
76
|
+
Install, configure, run, and dispatch AI coding agents from one place.
|
|
77
|
+
Works with Claude, Codex, Gemini, Cursor, OpenCode, OpenClaw, and Droid.
|
|
64
78
|
|
|
65
79
|
Quick start:
|
|
66
80
|
agents init First-time setup (interactive)
|
|
67
81
|
agents view See what's installed
|
|
68
|
-
agents run <agent> "prompt"
|
|
82
|
+
agents run <agent> ["prompt"] Run an agent (interactive without prompt, headless with)
|
|
69
83
|
agents sessions Browse past sessions across all agents
|
|
70
84
|
|
|
71
85
|
Agent versions:
|
|
72
86
|
add <agent>[@version] Install an agent CLI (e.g. agents add codex)
|
|
73
87
|
remove <agent>[@version] Uninstall a version
|
|
74
88
|
use <agent>@<version> Set the default version
|
|
89
|
+
prune [target] Remove orphan resources (commands/skills/hooks) and/or older duplicate version installs
|
|
75
90
|
view [agent[@version]] List versions, or inspect one in detail
|
|
76
91
|
|
|
77
92
|
Agent configuration (synced across versions):
|
|
@@ -89,14 +104,17 @@ Packages:
|
|
|
89
104
|
install <pkg> Install from registry (mcp:name, skill:user/repo)
|
|
90
105
|
|
|
91
106
|
Run agents:
|
|
92
|
-
run <agent>
|
|
107
|
+
run <agent|profile> [prompt] Run an agent. Omit prompt for interactive mode.
|
|
93
108
|
teams Coordinate multiple agents on shared work
|
|
109
|
+
routines Run agents on a cron schedule (scheduler auto-starts)
|
|
94
110
|
sessions Browse and replay past runs
|
|
95
111
|
|
|
96
|
-
|
|
97
|
-
|
|
112
|
+
Credentials:
|
|
113
|
+
profiles Bundles of (host CLI, endpoint, model, auth)
|
|
114
|
+
secrets Keychain-backed env bundles injected at spawn
|
|
98
115
|
|
|
99
116
|
Helpers:
|
|
117
|
+
beta Enable preview features like drive and factory
|
|
100
118
|
pty Drive interactive terminal programs (REPLs, TUIs)
|
|
101
119
|
|
|
102
120
|
Automation tips:
|
|
@@ -107,19 +125,20 @@ Automation tips:
|
|
|
107
125
|
Non-TTY shells apply defaults Omitted required selections fail with a plain hint
|
|
108
126
|
|
|
109
127
|
Config sync (portable setup via git):
|
|
110
|
-
pull
|
|
111
|
-
|
|
112
|
-
|
|
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
|
|
113
131
|
|
|
114
132
|
Options:
|
|
115
133
|
-V, --version Show version number
|
|
116
134
|
-h, --help Show help
|
|
117
135
|
|
|
118
|
-
|
|
136
|
+
System config lives in ~/.agents-system/. Run 'agents <command> --help' for details.
|
|
119
137
|
`;
|
|
120
138
|
}
|
|
121
139
|
return originalHelpInformation();
|
|
122
140
|
};
|
|
141
|
+
/** Compare two semver version strings. Returns 1 if a > b, -1 if a < b, 0 if equal. */
|
|
123
142
|
function compareVersions(a, b) {
|
|
124
143
|
const partsA = a.split('.').map(Number);
|
|
125
144
|
const partsB = b.split('.').map(Number);
|
|
@@ -131,6 +150,7 @@ function compareVersions(a, b) {
|
|
|
131
150
|
}
|
|
132
151
|
return 0;
|
|
133
152
|
}
|
|
153
|
+
/** Fetch and display changelog entries between two versions from unpkg. */
|
|
134
154
|
async function showWhatsNew(fromVersion, toVersion) {
|
|
135
155
|
try {
|
|
136
156
|
const response = await fetch(`https://unpkg.com/@phnx-labs/agents-cli@${toVersion}/CHANGELOG.md`);
|
|
@@ -176,7 +196,8 @@ async function showWhatsNew(fromVersion, toVersion) {
|
|
|
176
196
|
}
|
|
177
197
|
}
|
|
178
198
|
const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
179
|
-
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. */
|
|
180
201
|
function readUpdateCache() {
|
|
181
202
|
try {
|
|
182
203
|
return JSON.parse(fs.readFileSync(UPDATE_CHECK_FILE, 'utf-8'));
|
|
@@ -186,11 +207,13 @@ function readUpdateCache() {
|
|
|
186
207
|
return null;
|
|
187
208
|
}
|
|
188
209
|
}
|
|
210
|
+
/** Determine whether enough time has elapsed since the last registry fetch. */
|
|
189
211
|
function shouldFetchLatest(cache) {
|
|
190
212
|
if (!cache)
|
|
191
213
|
return true;
|
|
192
214
|
return Date.now() - cache.lastCheck > UPDATE_CHECK_INTERVAL_MS;
|
|
193
215
|
}
|
|
216
|
+
/** Persist the latest known version and current timestamp to the update-check cache. */
|
|
194
217
|
function saveUpdateCheck(latestVersion) {
|
|
195
218
|
try {
|
|
196
219
|
const dir = path.dirname(UPDATE_CHECK_FILE);
|
|
@@ -202,6 +225,7 @@ function saveUpdateCheck(latestVersion) {
|
|
|
202
225
|
/* best-effort cache update */
|
|
203
226
|
}
|
|
204
227
|
}
|
|
228
|
+
/** Present an interactive upgrade prompt (TTY) or a one-line hint (non-TTY). */
|
|
205
229
|
async function promptUpgrade(latestVersion) {
|
|
206
230
|
if (!process.stdout.isTTY) {
|
|
207
231
|
console.error(chalk.yellow(`Update available: ${VERSION} -> ${latestVersion}. Run: npm install -g @phnx-labs/agents-cli@latest`));
|
|
@@ -212,22 +236,39 @@ async function promptUpgrade(latestVersion) {
|
|
|
212
236
|
choices: [
|
|
213
237
|
{ value: 'now', name: 'Upgrade now' },
|
|
214
238
|
{ value: 'later', name: 'Later' },
|
|
239
|
+
{ value: 'dismiss', name: `Skip ${latestVersion}` },
|
|
215
240
|
],
|
|
216
241
|
});
|
|
242
|
+
if (answer === 'dismiss') {
|
|
243
|
+
try {
|
|
244
|
+
const dir = path.dirname(UPDATE_CHECK_FILE);
|
|
245
|
+
if (!fs.existsSync(dir))
|
|
246
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
247
|
+
const existing = readUpdateCache();
|
|
248
|
+
fs.writeFileSync(UPDATE_CHECK_FILE, JSON.stringify({
|
|
249
|
+
...existing,
|
|
250
|
+
lastCheck: existing?.lastCheck ?? Date.now(),
|
|
251
|
+
latestVersion,
|
|
252
|
+
dismissed: latestVersion,
|
|
253
|
+
}));
|
|
254
|
+
}
|
|
255
|
+
catch { /* best-effort */ }
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
217
258
|
if (answer === 'now') {
|
|
218
|
-
const {
|
|
259
|
+
const { execFile, spawnSync } = await import('child_process');
|
|
219
260
|
const { promisify } = await import('util');
|
|
220
|
-
const
|
|
261
|
+
const execFileAsync = promisify(execFile);
|
|
221
262
|
const spinner = ora('Upgrading...').start();
|
|
222
263
|
try {
|
|
223
|
-
await
|
|
264
|
+
await execFileAsync('npm', ['install', '-g', '@phnx-labs/agents-cli@latest']);
|
|
224
265
|
spinner.succeed(`Upgraded to ${latestVersion}`);
|
|
225
266
|
await showWhatsNew(VERSION, latestVersion);
|
|
226
267
|
console.log();
|
|
227
268
|
// Re-exec with new version and exit
|
|
228
269
|
const result = spawnSync('agents', process.argv.slice(2), {
|
|
229
270
|
stdio: 'inherit',
|
|
230
|
-
shell:
|
|
271
|
+
shell: false,
|
|
231
272
|
});
|
|
232
273
|
process.exit(result.status ?? 0);
|
|
233
274
|
}
|
|
@@ -253,15 +294,17 @@ function refreshUpdateCacheInBackground() {
|
|
|
253
294
|
/* network error, try again next invocation */
|
|
254
295
|
});
|
|
255
296
|
}
|
|
256
|
-
/**
|
|
297
|
+
/** Check for available updates using the local cache. Triggers a background refresh if stale. */
|
|
257
298
|
async function checkForUpdates() {
|
|
258
299
|
const cache = readUpdateCache();
|
|
259
300
|
// Kick off network refresh in background if stale. Does not block.
|
|
260
301
|
if (shouldFetchLatest(cache)) {
|
|
261
302
|
refreshUpdateCacheInBackground();
|
|
262
303
|
}
|
|
263
|
-
// Prompt based on current cache (may be from a previous run's background refresh)
|
|
264
|
-
if
|
|
304
|
+
// Prompt based on current cache (may be from a previous run's background refresh).
|
|
305
|
+
// Skip if the user dismissed this exact version — they'll be prompted again when
|
|
306
|
+
// a newer version appears.
|
|
307
|
+
if (cache?.latestVersion && cache.latestVersion !== VERSION && compareVersions(cache.latestVersion, VERSION) > 0 && cache.latestVersion !== cache.dismissed) {
|
|
265
308
|
try {
|
|
266
309
|
await promptUpgrade(cache.latestVersion);
|
|
267
310
|
}
|
|
@@ -272,6 +315,75 @@ async function checkForUpdates() {
|
|
|
272
315
|
}
|
|
273
316
|
}
|
|
274
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
|
+
}
|
|
275
387
|
// Register all commands
|
|
276
388
|
registerViewCommand(program);
|
|
277
389
|
registerStatusCommand(program);
|
|
@@ -311,6 +423,8 @@ registerDaemonCommands(program);
|
|
|
311
423
|
registerRoutinesCommands(program);
|
|
312
424
|
registerRunCommand(program);
|
|
313
425
|
registerModelsCommand(program);
|
|
426
|
+
registerPruneCommand(program);
|
|
427
|
+
registerDoctorCommand(program);
|
|
314
428
|
// Deprecated 'exec' alias for 'run'
|
|
315
429
|
program
|
|
316
430
|
.command('exec', { hidden: true })
|
|
@@ -322,11 +436,15 @@ program
|
|
|
322
436
|
args[0] = 'run';
|
|
323
437
|
await program.parseAsync(['node', 'agents', ...args]);
|
|
324
438
|
});
|
|
325
|
-
|
|
326
|
-
|
|
439
|
+
registerProfilesCommands(program);
|
|
440
|
+
registerSecretsCommands(program);
|
|
441
|
+
registerBetaCommands(program);
|
|
327
442
|
registerSyncCommand(program);
|
|
328
443
|
registerRefreshMemoryCommand(program);
|
|
329
444
|
registerDriveCommands(program);
|
|
445
|
+
registerFactoryCommands(program);
|
|
446
|
+
registerUsageCommand(program);
|
|
447
|
+
registerAliasCommand(program);
|
|
330
448
|
registerPtyCommands(program);
|
|
331
449
|
// Deprecated 'jobs' and 'cron' aliases for 'routines'
|
|
332
450
|
for (const alias of ['jobs', 'cron']) {
|
|
@@ -365,10 +483,10 @@ program
|
|
|
365
483
|
return;
|
|
366
484
|
}
|
|
367
485
|
spinner.text = `Upgrading ${VERSION} -> ${latestVersion}...`;
|
|
368
|
-
const {
|
|
486
|
+
const { execFile } = await import('child_process');
|
|
369
487
|
const { promisify } = await import('util');
|
|
370
|
-
const
|
|
371
|
-
await
|
|
488
|
+
const execFileAsync = promisify(execFile);
|
|
489
|
+
await execFileAsync('npm', ['install', '-g', '@phnx-labs/agents-cli@latest']);
|
|
372
490
|
spinner.succeed(`Upgraded to ${latestVersion}`);
|
|
373
491
|
await showWhatsNew(VERSION, latestVersion);
|
|
374
492
|
}
|
|
@@ -378,13 +496,10 @@ program
|
|
|
378
496
|
}
|
|
379
497
|
});
|
|
380
498
|
registerPullCommand(program);
|
|
381
|
-
|
|
382
|
-
registerForkCommand(program);
|
|
499
|
+
registerRepoCommands(program);
|
|
383
500
|
registerInitCommand(program);
|
|
384
501
|
applyGlobalHelpConventions(program);
|
|
385
|
-
/**
|
|
386
|
-
* Calculate Levenshtein edit distance between two strings.
|
|
387
|
-
*/
|
|
502
|
+
/** Calculate the Levenshtein edit distance between two strings. */
|
|
388
503
|
function levenshtein(a, b) {
|
|
389
504
|
const m = a.length;
|
|
390
505
|
const n = b.length;
|
|
@@ -432,10 +547,44 @@ program.on('command:*', (operands) => {
|
|
|
432
547
|
});
|
|
433
548
|
// Run update check on EVERY invocation before parsing
|
|
434
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();
|
|
435
556
|
// First-run experience: no args + no config yet + TTY -> launch interactive init.
|
|
436
557
|
// Skipped when stdin/stdout isn't a terminal (CI, pipes) or when user passes any args.
|
|
437
558
|
const passedArgs = process.argv.slice(2);
|
|
438
|
-
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');
|
|
439
588
|
const firstRun = passedArgs.length === 0 &&
|
|
440
589
|
!fs.existsSync(metaFilePath) &&
|
|
441
590
|
process.stdin.isTTY &&
|
|
@@ -451,5 +600,23 @@ if (firstRun) {
|
|
|
451
600
|
}
|
|
452
601
|
process.exit(0);
|
|
453
602
|
}
|
|
454
|
-
|
|
455
|
-
|
|
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
|
+
}
|