@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/lib/shims.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shim generation and config symlink management for agent version switching.
|
|
3
|
+
*
|
|
4
|
+
* Shims are small shell scripts placed in ~/.agents/shims/ that resolve the
|
|
5
|
+
* active agent version (project-level or user-default), then exec the real
|
|
6
|
+
* binary. Config isolation is achieved by symlinking ~/.{agent} into the
|
|
7
|
+
* per-version home directory. This module also handles versioned aliases
|
|
8
|
+
* (e.g., claude@2.0.65), PATH setup, conflict detection during migration,
|
|
9
|
+
* and resource diffing between versions.
|
|
10
|
+
*/
|
|
1
11
|
import * as fs from 'fs';
|
|
2
12
|
import * as path from 'path';
|
|
3
13
|
import * as os from 'os';
|
|
@@ -130,7 +140,7 @@ export async function promptConflictStrategy(conflictInfos) {
|
|
|
130
140
|
* Generate the shim script content for an agent.
|
|
131
141
|
*
|
|
132
142
|
* The shim resolves the version in order:
|
|
133
|
-
* 1. .
|
|
143
|
+
* 1. agents.yaml in project root (walk up from $PWD, skip ~/.agents/agents.yaml)
|
|
134
144
|
* 2. ~/.agents/agents.yaml default
|
|
135
145
|
*
|
|
136
146
|
* If version is specified but not installed, auto-installs it.
|
|
@@ -150,9 +160,21 @@ export async function promptConflictStrategy(conflictInfos) {
|
|
|
150
160
|
* shim hook for non-@-capable agents.
|
|
151
161
|
* v3 — sync/refresh-memory flag renamed `--version` → `--agent-version`
|
|
152
162
|
* so it no longer collides with commander's top-level `--version`.
|
|
163
|
+
* v4 — project version marker changed from `.agents-version` to a
|
|
164
|
+
* root-level `agents.yaml`; shim now skips ~/.agents/agents.yaml
|
|
165
|
+
* when walking up for a project marker.
|
|
166
|
+
* v5 — emit CODEX_HOME for codex shims so the versioned config (permissions,
|
|
167
|
+
* sandbox_mode, rules/agents-deny.rules) is actually read by the codex
|
|
168
|
+
* binary instead of $HOME/.codex.
|
|
169
|
+
* v6 — hard-disable Codex startup update checks in the generated shims.
|
|
153
170
|
*/
|
|
154
|
-
export const SHIM_SCHEMA_VERSION =
|
|
171
|
+
export const SHIM_SCHEMA_VERSION = 6;
|
|
172
|
+
/** Internal marker string used to embed the schema version in shim scripts. */
|
|
155
173
|
const SHIM_VERSION_MARKER = 'agents-shim-version:';
|
|
174
|
+
/**
|
|
175
|
+
* Generate the full bash shim script for the given agent. The returned string
|
|
176
|
+
* is written to ~/.agents/shims/{cliCommand} and made executable.
|
|
177
|
+
*/
|
|
156
178
|
export function generateShimScript(agent) {
|
|
157
179
|
const agentConfig = AGENTS[agent];
|
|
158
180
|
const cliCommand = agentConfig.cliCommand;
|
|
@@ -164,7 +186,14 @@ export function generateShimScript(agent) {
|
|
|
164
186
|
# live Claude account.
|
|
165
187
|
export CLAUDE_CONFIG_DIR="$VERSION_DIR/home/${configDirName}"
|
|
166
188
|
`
|
|
167
|
-
: ''
|
|
189
|
+
: agent === 'codex'
|
|
190
|
+
? `
|
|
191
|
+
# Codex reads its config (approval_policy, sandbox_mode, MCP servers, rules)
|
|
192
|
+
# from CODEX_HOME. Point it at the versioned home so permissions/rules
|
|
193
|
+
# written by agents-cli actually take effect.
|
|
194
|
+
export CODEX_HOME="$VERSION_DIR/home/${configDirName}"
|
|
195
|
+
`
|
|
196
|
+
: '';
|
|
168
197
|
// Agents that don't natively resolve @-imports in their memory file need
|
|
169
198
|
// agents-cli to recompile when the user edits a rule/preset file. The
|
|
170
199
|
// check is fast (sha256 of ~8 small files) and skips the recompile when
|
|
@@ -177,39 +206,31 @@ export CLAUDE_CONFIG_DIR="$VERSION_DIR/home/${configDirName}"
|
|
|
177
206
|
agents refresh-memory --agent "$AGENT" --agent-version "$VERSION" --quiet 2>/dev/null || true
|
|
178
207
|
`
|
|
179
208
|
: '';
|
|
209
|
+
const launchArgs = agent === 'codex' ? ' -c check_for_update_on_startup=false' : '';
|
|
180
210
|
return `#!/bin/bash
|
|
181
211
|
# Auto-generated by agents-cli - do not edit
|
|
182
212
|
# Shim for ${agentConfig.name}
|
|
183
213
|
# ${SHIM_VERSION_MARKER} ${SHIM_SCHEMA_VERSION}
|
|
184
214
|
|
|
185
|
-
|
|
215
|
+
AGENTS_SYSTEM_DIR="$HOME/.agents-system"
|
|
216
|
+
AGENTS_USER_DIR="$HOME/.agents"
|
|
186
217
|
AGENT="${agent}"
|
|
187
218
|
CLI_COMMAND="${cliCommand}"
|
|
188
219
|
|
|
189
|
-
# Find .
|
|
220
|
+
# Find project agents.yaml walking up from cwd (skip $HOME/.agents-system/agents.yaml)
|
|
190
221
|
find_project_version() {
|
|
191
222
|
local dir="$PWD"
|
|
223
|
+
local user_agents_yaml="$AGENTS_SYSTEM_DIR/agents.yaml"
|
|
192
224
|
while [ "$dir" != "/" ]; do
|
|
193
|
-
|
|
194
|
-
|
|
225
|
+
local candidate="$dir/agents.yaml"
|
|
226
|
+
if [ -f "$candidate" ] && [ "$candidate" != "$user_agents_yaml" ]; then
|
|
227
|
+
# Parse agents: section — same shape as resolve_default_version()
|
|
195
228
|
local version
|
|
196
229
|
version=$(awk -v agent="$AGENT" '
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
print
|
|
202
|
-
exit
|
|
203
|
-
}
|
|
204
|
-
# Value might be on next line (array format)
|
|
205
|
-
getline
|
|
206
|
-
if (/^[[:space:]]+-[[:space:]]/) {
|
|
207
|
-
gsub(/^[[:space:]]+-[[:space:]]*["'"'"']?|["'"'"']?[[:space:]]*$/, "")
|
|
208
|
-
print
|
|
209
|
-
exit
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
' "$dir/.agents-version")
|
|
230
|
+
/^agents:/ { in_agents=1; next }
|
|
231
|
+
in_agents && /^[^ ]/ { in_agents=0 }
|
|
232
|
+
in_agents && $0 ~ "^ " agent ":" { gsub(/.*:[[:space:]]*["'"'"']?|["'"'"']?[[:space:]]*$/, ""); print; exit }
|
|
233
|
+
' "$candidate")
|
|
213
234
|
if [ -n "$version" ]; then
|
|
214
235
|
echo "$version"
|
|
215
236
|
return 0
|
|
@@ -222,7 +243,7 @@ find_project_version() {
|
|
|
222
243
|
|
|
223
244
|
# Resolve version from agents.yaml (user default)
|
|
224
245
|
resolve_default_version() {
|
|
225
|
-
local meta="$
|
|
246
|
+
local meta="$AGENTS_USER_DIR/agents.yaml"
|
|
226
247
|
if [ -f "$meta" ]; then
|
|
227
248
|
awk -v agent="$AGENT" '
|
|
228
249
|
/^agents:/ { in_agents=1; next }
|
|
@@ -232,7 +253,7 @@ resolve_default_version() {
|
|
|
232
253
|
fi
|
|
233
254
|
}
|
|
234
255
|
|
|
235
|
-
# Find project-scoped .agents directory (stop at .
|
|
256
|
+
# Find project-scoped .agents directory (stop at agents.yaml or .git)
|
|
236
257
|
find_project_agents_dir() {
|
|
237
258
|
local dir="$PWD"
|
|
238
259
|
while [ "$dir" != "/" ]; do
|
|
@@ -240,7 +261,7 @@ find_project_agents_dir() {
|
|
|
240
261
|
echo "$dir/.agents"
|
|
241
262
|
return 0
|
|
242
263
|
fi
|
|
243
|
-
if [ -f "$dir
|
|
264
|
+
if [ -f "$dir/agents.yaml" ] || [ -d "$dir/.git" ] || [ -f "$dir/.git" ]; then
|
|
244
265
|
break
|
|
245
266
|
fi
|
|
246
267
|
dir=$(dirname "$dir")
|
|
@@ -262,13 +283,13 @@ if [ -z "$VERSION" ]; then
|
|
|
262
283
|
exit 1
|
|
263
284
|
fi
|
|
264
285
|
|
|
265
|
-
VERSION_DIR="$
|
|
286
|
+
VERSION_DIR="$AGENTS_SYSTEM_DIR/versions/$AGENT/$VERSION"
|
|
266
287
|
BINARY="$VERSION_DIR/node_modules/.bin/$CLI_COMMAND"
|
|
267
288
|
|
|
268
289
|
# Auto-install if not present
|
|
269
290
|
if [ ! -x "$BINARY" ]; then
|
|
270
291
|
if [ "$VERSION_SOURCE" = "project" ]; then
|
|
271
|
-
echo "agents: $AGENT@$VERSION required by .
|
|
292
|
+
echo "agents: $AGENT@$VERSION required by agents.yaml but not installed" >&2
|
|
272
293
|
|
|
273
294
|
# Spinner animation
|
|
274
295
|
spin() {
|
|
@@ -309,7 +330,7 @@ if [ -n "$PROJECT_AGENTS_DIR" ]; then
|
|
|
309
330
|
fi
|
|
310
331
|
${refreshMemoryCall}${managedEnv}
|
|
311
332
|
|
|
312
|
-
exec "$BINARY" "$@"
|
|
333
|
+
exec "$BINARY"${launchArgs} "$@"
|
|
313
334
|
`;
|
|
314
335
|
}
|
|
315
336
|
/**
|
|
@@ -337,25 +358,64 @@ export function removeShim(agent) {
|
|
|
337
358
|
}
|
|
338
359
|
return false;
|
|
339
360
|
}
|
|
361
|
+
/**
|
|
362
|
+
* Current versioned-alias schema. Bump whenever `generateVersionedAliasScript`
|
|
363
|
+
* changes in a way that requires existing on-disk aliases to be regenerated.
|
|
364
|
+
*
|
|
365
|
+
* History:
|
|
366
|
+
* v1 — implicit (no marker); no CLAUDE_CONFIG_DIR export, so direct
|
|
367
|
+
* `claude@X` invocations leaked into ~/.claude (the default version's
|
|
368
|
+
* symlinked home) and `agents view` never saw the login.
|
|
369
|
+
* v2 — emit CLAUDE_CONFIG_DIR for claude aliases so each version has its
|
|
370
|
+
* own isolated config/OAuth slot; stamp a version marker so stale
|
|
371
|
+
* aliases can be detected and regenerated.
|
|
372
|
+
* v3 — emit CODEX_HOME for codex aliases so direct `codex@X` invocations
|
|
373
|
+
* read the versioned permissions/rules instead of $HOME/.codex.
|
|
374
|
+
* v4 — direct aliases read binaries and config homes from ~/.agents-system.
|
|
375
|
+
* v5 — hard-disable Codex startup update checks in versioned aliases.
|
|
376
|
+
*/
|
|
377
|
+
export const VERSIONED_ALIAS_SCHEMA_VERSION = 5;
|
|
378
|
+
/** Internal marker string used to embed the schema version in versioned alias scripts. */
|
|
379
|
+
const VERSIONED_ALIAS_VERSION_MARKER = 'agents-versioned-alias-version:';
|
|
380
|
+
// The version string is interpolated into a generated bash script and into
|
|
381
|
+
// a filename. parseAgentSpec / parseVersion already validates this upstream,
|
|
382
|
+
// but generators are also called from internal code paths (e.g., re-emit on
|
|
383
|
+
// schema bump), so re-check here. Mirrors VERSION_RE in versions.ts.
|
|
384
|
+
const ALIAS_VERSION_RE = /^[A-Za-z0-9._+-]{1,64}$/;
|
|
385
|
+
function assertSafeVersion(version) {
|
|
386
|
+
if (!ALIAS_VERSION_RE.test(version)) {
|
|
387
|
+
throw new Error(`Refusing to generate shim for unsafe version: ${JSON.stringify(version)}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
340
390
|
/**
|
|
341
391
|
* Generate a versioned alias script that directly execs a specific version.
|
|
342
392
|
* e.g., claude@2.0.65 -> directly runs that version's binary
|
|
343
393
|
*/
|
|
344
394
|
export function generateVersionedAliasScript(agent, version) {
|
|
395
|
+
assertSafeVersion(version);
|
|
345
396
|
const agentConfig = AGENTS[agent];
|
|
346
397
|
const configDirName = `.${agent}`;
|
|
347
398
|
const managedEnv = agent === 'claude'
|
|
348
399
|
? `
|
|
349
400
|
# Claude stores OAuth credentials in the macOS keychain. Scope them to this
|
|
350
401
|
# version's config directory so direct aliases also switch the live account.
|
|
351
|
-
export CLAUDE_CONFIG_DIR="$HOME/.agents/versions/${agent}/${version}/home/${configDirName}"
|
|
402
|
+
export CLAUDE_CONFIG_DIR="$HOME/.agents-system/versions/${agent}/${version}/home/${configDirName}"
|
|
352
403
|
`
|
|
353
|
-
: ''
|
|
404
|
+
: agent === 'codex'
|
|
405
|
+
? `
|
|
406
|
+
# Codex reads its config (approval_policy, sandbox_mode, MCP servers, rules)
|
|
407
|
+
# from CODEX_HOME. Point direct aliases at the versioned home so permissions
|
|
408
|
+
# and rules written by agents-cli actually take effect.
|
|
409
|
+
export CODEX_HOME="$HOME/.agents-system/versions/${agent}/${version}/home/${configDirName}"
|
|
410
|
+
`
|
|
411
|
+
: '';
|
|
412
|
+
const launchArgs = agent === 'codex' ? ' -c check_for_update_on_startup=false' : '';
|
|
354
413
|
return `#!/bin/bash
|
|
355
414
|
# Auto-generated by agents-cli - do not edit
|
|
415
|
+
# ${VERSIONED_ALIAS_VERSION_MARKER} ${VERSIONED_ALIAS_SCHEMA_VERSION}
|
|
356
416
|
# Direct alias for ${agentConfig.name}@${version}
|
|
357
417
|
|
|
358
|
-
BINARY="$HOME/.agents/versions/${agent}/${version}/node_modules/.bin/${agentConfig.cliCommand}"
|
|
418
|
+
BINARY="$HOME/.agents-system/versions/${agent}/${version}/node_modules/.bin/${agentConfig.cliCommand}"
|
|
359
419
|
|
|
360
420
|
if [ ! -x "$BINARY" ]; then
|
|
361
421
|
echo "agents: ${agent}@${version} not installed" >&2
|
|
@@ -363,14 +423,64 @@ if [ ! -x "$BINARY" ]; then
|
|
|
363
423
|
fi
|
|
364
424
|
${managedEnv}
|
|
365
425
|
|
|
366
|
-
exec "$BINARY" "$@"
|
|
426
|
+
exec "$BINARY"${launchArgs} "$@"
|
|
367
427
|
`;
|
|
368
428
|
}
|
|
429
|
+
/**
|
|
430
|
+
* Read the schema version of an on-disk versioned alias. Returns null if the
|
|
431
|
+
* alias doesn't exist or is a pre-v2 alias (no marker — treated as stale).
|
|
432
|
+
*/
|
|
433
|
+
export function readVersionedAliasSchemaVersion(agent, version) {
|
|
434
|
+
const aliasPath = getVersionedAliasPath(agent, version);
|
|
435
|
+
if (!fs.existsSync(aliasPath))
|
|
436
|
+
return null;
|
|
437
|
+
try {
|
|
438
|
+
const content = fs.readFileSync(aliasPath, 'utf8');
|
|
439
|
+
const header = content.split('\n', 10).join('\n');
|
|
440
|
+
const match = header.match(new RegExp(VERSIONED_ALIAS_VERSION_MARKER + '\\s*(\\d+)'));
|
|
441
|
+
if (!match)
|
|
442
|
+
return null;
|
|
443
|
+
return Number(match[1]);
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
return null;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* True if the on-disk versioned alias matches the current schema version.
|
|
451
|
+
*/
|
|
452
|
+
export function isVersionedAliasCurrent(agent, version) {
|
|
453
|
+
return readVersionedAliasSchemaVersion(agent, version) === VERSIONED_ALIAS_SCHEMA_VERSION;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Regenerate a versioned alias if missing or stale. Mirrors ensureShimCurrent
|
|
457
|
+
* for the main shim — callers can surface a one-line notice when something
|
|
458
|
+
* was upgraded.
|
|
459
|
+
*/
|
|
460
|
+
export function ensureVersionedAliasCurrent(agent, version) {
|
|
461
|
+
const aliasPath = getVersionedAliasPath(agent, version);
|
|
462
|
+
if (!fs.existsSync(aliasPath)) {
|
|
463
|
+
createVersionedAlias(agent, version);
|
|
464
|
+
return 'created';
|
|
465
|
+
}
|
|
466
|
+
if (!isVersionedAliasCurrent(agent, version)) {
|
|
467
|
+
createVersionedAlias(agent, version);
|
|
468
|
+
return 'updated';
|
|
469
|
+
}
|
|
470
|
+
return 'current';
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Get the filesystem path for a versioned alias script.
|
|
474
|
+
*/
|
|
475
|
+
export function getVersionedAliasPath(agent, version) {
|
|
476
|
+
return path.join(getShimsDir(), `${AGENTS[agent].cliCommand}@${version}`);
|
|
477
|
+
}
|
|
369
478
|
/**
|
|
370
479
|
* Create a versioned alias for a specific agent version.
|
|
371
480
|
* e.g., claude@2.0.65
|
|
372
481
|
*/
|
|
373
482
|
export function createVersionedAlias(agent, version) {
|
|
483
|
+
assertSafeVersion(version);
|
|
374
484
|
ensureAgentsDir();
|
|
375
485
|
const shimsDir = getShimsDir();
|
|
376
486
|
const agentConfig = AGENTS[agent];
|
|
@@ -535,6 +645,15 @@ export function switchHomeFileSymlinks(agent, version) {
|
|
|
535
645
|
const versionsDir = getVersionsDir();
|
|
536
646
|
const switched = [];
|
|
537
647
|
const errors = [];
|
|
648
|
+
// For Claude, Claude's binary reads CLAUDE_CONFIG_DIR/.claude.json (INSIDE
|
|
649
|
+
// the per-version .claude dir) — not the home-level file this function
|
|
650
|
+
// manages. Reconcile all installed Claude versions so INSIDE is a symlink
|
|
651
|
+
// to OUTSIDE, making OUTSIDE the single source of truth.
|
|
652
|
+
if (agent === 'claude') {
|
|
653
|
+
const reconcile = ensureAllClaudeInsideSymlinks();
|
|
654
|
+
for (const e of reconcile.errors)
|
|
655
|
+
errors.push(e);
|
|
656
|
+
}
|
|
538
657
|
for (const fileName of homeFiles) {
|
|
539
658
|
const globalPath = path.join(home, fileName);
|
|
540
659
|
const versionFilePath = path.join(versionsDir, agent, version, 'home', fileName);
|
|
@@ -578,7 +697,14 @@ export function switchHomeFileSymlinks(agent, version) {
|
|
|
578
697
|
else if (stat.isFile()) {
|
|
579
698
|
// Real file — first-time migration
|
|
580
699
|
// Read the global file content
|
|
581
|
-
|
|
700
|
+
let globalContent;
|
|
701
|
+
try {
|
|
702
|
+
globalContent = JSON.parse(fs.readFileSync(globalPath, 'utf-8'));
|
|
703
|
+
}
|
|
704
|
+
catch (err) {
|
|
705
|
+
errors.push(`${fileName}: Could not parse ${globalPath}: ${err.message}`);
|
|
706
|
+
continue;
|
|
707
|
+
}
|
|
582
708
|
// Merge auth into ALL installed version files for this agent
|
|
583
709
|
const agentVersionsDir = path.join(versionsDir, agent);
|
|
584
710
|
if (fs.existsSync(agentVersionsDir)) {
|
|
@@ -623,6 +749,108 @@ export function switchHomeFileSymlinks(agent, version) {
|
|
|
623
749
|
}
|
|
624
750
|
return { switched, errors };
|
|
625
751
|
}
|
|
752
|
+
/**
|
|
753
|
+
* Claude reads `.claude.json` at `$CLAUDE_CONFIG_DIR/.claude.json`. Our shim
|
|
754
|
+
* points CLAUDE_CONFIG_DIR at `<ver>/home/.claude`, so Claude's real config
|
|
755
|
+
* file lives at `<ver>/home/.claude/.claude.json` (INSIDE), while
|
|
756
|
+
* `switchHomeFileSymlinks` manages `<ver>/home/.claude.json` (OUTSIDE).
|
|
757
|
+
*
|
|
758
|
+
* To keep both views consistent we make INSIDE a symlink to OUTSIDE. Claude's
|
|
759
|
+
* atomic write (`Uf6`) resolves symlinks before the tmp+rename cycle, so the
|
|
760
|
+
* symlink survives across writes and OUTSIDE remains the single source of
|
|
761
|
+
* truth that agents-cli's home-file machinery already manages.
|
|
762
|
+
*
|
|
763
|
+
* This function idempotently reconciles one version:
|
|
764
|
+
* - INSIDE missing: create symlink -> `../.claude.json` (create OUTSIDE if needed).
|
|
765
|
+
* - INSIDE already symlink to OUTSIDE: no-op.
|
|
766
|
+
* - INSIDE is a real file: it's the authoritative auth state (Claude was
|
|
767
|
+
* writing to it). Move its content to OUTSIDE (merging with OUTSIDE,
|
|
768
|
+
* INSIDE wins for `oauthAccount`), then replace INSIDE with the symlink.
|
|
769
|
+
* - Symlink points elsewhere: replace it.
|
|
770
|
+
*/
|
|
771
|
+
export function ensureClaudeInsideSymlink(version) {
|
|
772
|
+
const versionsDir = getVersionsDir();
|
|
773
|
+
const versionHome = path.join(versionsDir, 'claude', version, 'home');
|
|
774
|
+
const outsidePath = path.join(versionHome, '.claude.json');
|
|
775
|
+
const insideDir = path.join(versionHome, '.claude');
|
|
776
|
+
const insidePath = path.join(insideDir, '.claude.json');
|
|
777
|
+
const linkTarget = '../.claude.json'; // relative so version dir can be moved
|
|
778
|
+
if (!fs.existsSync(insideDir)) {
|
|
779
|
+
fs.mkdirSync(insideDir, { recursive: true });
|
|
780
|
+
}
|
|
781
|
+
let insideStat = null;
|
|
782
|
+
try {
|
|
783
|
+
insideStat = fs.lstatSync(insidePath);
|
|
784
|
+
}
|
|
785
|
+
catch {
|
|
786
|
+
/* INSIDE does not exist */
|
|
787
|
+
}
|
|
788
|
+
if (insideStat?.isSymbolicLink()) {
|
|
789
|
+
const currentTarget = fs.readlinkSync(insidePath);
|
|
790
|
+
if (currentTarget === linkTarget)
|
|
791
|
+
return;
|
|
792
|
+
// Wrong target — replace.
|
|
793
|
+
if (!fs.existsSync(outsidePath))
|
|
794
|
+
fs.writeFileSync(outsidePath, '{}');
|
|
795
|
+
fs.unlinkSync(insidePath);
|
|
796
|
+
fs.symlinkSync(linkTarget, insidePath);
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
if (insideStat?.isFile()) {
|
|
800
|
+
// INSIDE is the authoritative file — Claude has been reading/writing it.
|
|
801
|
+
// Merge INSIDE into OUTSIDE, with INSIDE winning on every field, then
|
|
802
|
+
// replace INSIDE with a symlink.
|
|
803
|
+
let insideContent = {};
|
|
804
|
+
try {
|
|
805
|
+
insideContent = JSON.parse(fs.readFileSync(insidePath, 'utf-8'));
|
|
806
|
+
}
|
|
807
|
+
catch {
|
|
808
|
+
/* INSIDE corrupt — treat as empty; OUTSIDE preserved as-is */
|
|
809
|
+
}
|
|
810
|
+
let outsideContent = {};
|
|
811
|
+
if (fs.existsSync(outsidePath)) {
|
|
812
|
+
try {
|
|
813
|
+
outsideContent = JSON.parse(fs.readFileSync(outsidePath, 'utf-8'));
|
|
814
|
+
}
|
|
815
|
+
catch {
|
|
816
|
+
/* OUTSIDE corrupt — drop it */
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
const merged = { ...outsideContent, ...insideContent };
|
|
820
|
+
fs.writeFileSync(outsidePath, JSON.stringify(merged, null, 2));
|
|
821
|
+
fs.unlinkSync(insidePath);
|
|
822
|
+
fs.symlinkSync(linkTarget, insidePath);
|
|
823
|
+
return;
|
|
824
|
+
}
|
|
825
|
+
// INSIDE missing — ensure OUTSIDE exists, then create symlink.
|
|
826
|
+
if (!fs.existsSync(outsidePath))
|
|
827
|
+
fs.writeFileSync(outsidePath, '{}');
|
|
828
|
+
fs.symlinkSync(linkTarget, insidePath);
|
|
829
|
+
}
|
|
830
|
+
/**
|
|
831
|
+
* Apply `ensureClaudeInsideSymlink` to every installed Claude version.
|
|
832
|
+
* Safe to call repeatedly; per-version calls are idempotent.
|
|
833
|
+
*/
|
|
834
|
+
export function ensureAllClaudeInsideSymlinks() {
|
|
835
|
+
const versionsDir = getVersionsDir();
|
|
836
|
+
const claudeVersionsDir = path.join(versionsDir, 'claude');
|
|
837
|
+
const migrated = [];
|
|
838
|
+
const errors = [];
|
|
839
|
+
if (!fs.existsSync(claudeVersionsDir))
|
|
840
|
+
return { migrated, errors };
|
|
841
|
+
for (const entry of fs.readdirSync(claudeVersionsDir, { withFileTypes: true })) {
|
|
842
|
+
if (!entry.isDirectory())
|
|
843
|
+
continue;
|
|
844
|
+
try {
|
|
845
|
+
ensureClaudeInsideSymlink(entry.name);
|
|
846
|
+
migrated.push(entry.name);
|
|
847
|
+
}
|
|
848
|
+
catch (err) {
|
|
849
|
+
errors.push(`${entry.name}: ${err.message}`);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
return { migrated, errors };
|
|
853
|
+
}
|
|
626
854
|
/**
|
|
627
855
|
* Get the current config symlink target version, if any.
|
|
628
856
|
*/
|
|
@@ -807,6 +1035,37 @@ export function getPathShadowingExecutable(agent) {
|
|
|
807
1035
|
}
|
|
808
1036
|
return null;
|
|
809
1037
|
}
|
|
1038
|
+
/**
|
|
1039
|
+
* Check if the agent's CLI command is shadowed by a shell alias.
|
|
1040
|
+
*
|
|
1041
|
+
* Shell aliases live in the user's session and aren't visible from a Node.js
|
|
1042
|
+
* child process. We do a best-effort scan of common RC files for `alias
|
|
1043
|
+
* <command>=` patterns. Returns false when detection is inconclusive.
|
|
1044
|
+
*/
|
|
1045
|
+
export function hasAliasShadowingShim(agent) {
|
|
1046
|
+
const cliCommand = AGENTS[agent].cliCommand;
|
|
1047
|
+
const HOME = os.homedir();
|
|
1048
|
+
const rcFiles = [
|
|
1049
|
+
path.join(HOME, '.zshrc'),
|
|
1050
|
+
path.join(HOME, '.bashrc'),
|
|
1051
|
+
path.join(HOME, '.bash_profile'),
|
|
1052
|
+
path.join(HOME, '.profile'),
|
|
1053
|
+
];
|
|
1054
|
+
const pattern = new RegExp(`^\\s*alias\\s+${cliCommand}\\s*=`, 'm');
|
|
1055
|
+
for (const rcFile of rcFiles) {
|
|
1056
|
+
try {
|
|
1057
|
+
if (!fs.existsSync(rcFile))
|
|
1058
|
+
continue;
|
|
1059
|
+
const content = fs.readFileSync(rcFile, 'utf-8');
|
|
1060
|
+
if (pattern.test(content))
|
|
1061
|
+
return true;
|
|
1062
|
+
}
|
|
1063
|
+
catch {
|
|
1064
|
+
// unreadable rc file — skip
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
return false;
|
|
1068
|
+
}
|
|
810
1069
|
/**
|
|
811
1070
|
* Check if shims directory is in PATH.
|
|
812
1071
|
*/
|
|
@@ -815,11 +1074,56 @@ export function isShimsInPath() {
|
|
|
815
1074
|
const pathDirs = (process.env.PATH || '').split(path.delimiter);
|
|
816
1075
|
return pathDirs.some((dir) => path.resolve(dir) === path.resolve(shimsDir));
|
|
817
1076
|
}
|
|
1077
|
+
function isShimPathCommandLine(line, shimsDir) {
|
|
1078
|
+
const trimmed = line.trim();
|
|
1079
|
+
if (trimmed.startsWith('#')) {
|
|
1080
|
+
return false;
|
|
1081
|
+
}
|
|
1082
|
+
const normalized = trimmed.replace(/['"]/g, '');
|
|
1083
|
+
const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
1084
|
+
const exactMarkers = [
|
|
1085
|
+
shimsDir,
|
|
1086
|
+
'$HOME/.agents-system/shims',
|
|
1087
|
+
'${HOME}/.agents-system/shims',
|
|
1088
|
+
'~/.agents-system/shims',
|
|
1089
|
+
'$HOME/.agents/shims',
|
|
1090
|
+
'${HOME}/.agents/shims',
|
|
1091
|
+
'~/.agents/shims',
|
|
1092
|
+
];
|
|
1093
|
+
const markerRegexes = exactMarkers.map((marker) => new RegExp(`${escapeRegex(marker)}(?=$|[:\\s])`));
|
|
1094
|
+
const suffixRegexes = [
|
|
1095
|
+
/\/\.agents-system\/shims(?=$|[:\s])/,
|
|
1096
|
+
/\/\.agents\/shims(?=$|[:\s])/,
|
|
1097
|
+
];
|
|
1098
|
+
const touchesShimPath = [...markerRegexes, ...suffixRegexes].some((pattern) => pattern.test(normalized));
|
|
1099
|
+
if (!touchesShimPath) {
|
|
1100
|
+
return false;
|
|
1101
|
+
}
|
|
1102
|
+
return trimmed.startsWith('export PATH=') || trimmed.startsWith('fish_add_path ');
|
|
1103
|
+
}
|
|
1104
|
+
function stripShimPathLines(content, shimsDir) {
|
|
1105
|
+
const lines = content.split('\n');
|
|
1106
|
+
const kept = [];
|
|
1107
|
+
for (let i = 0; i < lines.length; i++) {
|
|
1108
|
+
const line = lines[i];
|
|
1109
|
+
if (line.trim() === '# agents-cli: version-managed agent CLIs' &&
|
|
1110
|
+
i + 1 < lines.length &&
|
|
1111
|
+
isShimPathCommandLine(lines[i + 1], shimsDir)) {
|
|
1112
|
+
i++;
|
|
1113
|
+
continue;
|
|
1114
|
+
}
|
|
1115
|
+
if (isShimPathCommandLine(line, shimsDir)) {
|
|
1116
|
+
continue;
|
|
1117
|
+
}
|
|
1118
|
+
kept.push(line);
|
|
1119
|
+
}
|
|
1120
|
+
return kept.join('\n').replace(/\n{3,}/g, '\n\n');
|
|
1121
|
+
}
|
|
818
1122
|
/**
|
|
819
1123
|
* Get the shell rc file path for the current shell.
|
|
820
1124
|
*/
|
|
821
|
-
function getShellRcFile() {
|
|
822
|
-
const shell = process.env.SHELL || '/bin/bash';
|
|
1125
|
+
function getShellRcFile(overrides) {
|
|
1126
|
+
const shell = overrides?.shell || process.env.SHELL || '/bin/bash';
|
|
823
1127
|
const shellName = path.basename(shell);
|
|
824
1128
|
let rcFile;
|
|
825
1129
|
switch (shellName) {
|
|
@@ -836,7 +1140,7 @@ function getShellRcFile() {
|
|
|
836
1140
|
}
|
|
837
1141
|
return {
|
|
838
1142
|
rcFile,
|
|
839
|
-
rcPath: path.join(os.homedir(), rcFile),
|
|
1143
|
+
rcPath: path.join(overrides?.homeDir || os.homedir(), rcFile),
|
|
840
1144
|
shell: shellName,
|
|
841
1145
|
};
|
|
842
1146
|
}
|
|
@@ -850,7 +1154,7 @@ export function getPathSetupInstructions() {
|
|
|
850
1154
|
return `Add to ~/.config/fish/config.fish:
|
|
851
1155
|
fish_add_path ${shimsDir}`;
|
|
852
1156
|
}
|
|
853
|
-
return `Add to ~/${rcFile} (
|
|
1157
|
+
return `Add to ~/${rcFile} (AFTER any nvm/node setup):
|
|
854
1158
|
export PATH="${shimsDir}:$PATH"
|
|
855
1159
|
|
|
856
1160
|
IMPORTANT: Shims must come FIRST in PATH to override global installs.
|
|
@@ -862,9 +1166,9 @@ Then restart your shell or run:
|
|
|
862
1166
|
* Add shims directory to shell PATH configuration.
|
|
863
1167
|
* Returns true if added, false if already present or failed.
|
|
864
1168
|
*/
|
|
865
|
-
export function addShimsToPath() {
|
|
866
|
-
const shimsDir = getShimsDir();
|
|
867
|
-
const { rcFile, rcPath, shell } = getShellRcFile();
|
|
1169
|
+
export function addShimsToPath(overrides) {
|
|
1170
|
+
const shimsDir = overrides?.shimsDir || getShimsDir();
|
|
1171
|
+
const { rcFile, rcPath, shell } = getShellRcFile(overrides);
|
|
868
1172
|
// Read current rc file content
|
|
869
1173
|
let content = '';
|
|
870
1174
|
try {
|
|
@@ -875,21 +1179,17 @@ export function addShimsToPath() {
|
|
|
875
1179
|
catch (err) {
|
|
876
1180
|
return { success: false, error: `Could not read ${rcFile}: ${err.message}` };
|
|
877
1181
|
}
|
|
878
|
-
//
|
|
879
|
-
|
|
880
|
-
return { success: true, alreadyPresent: true, rcFile };
|
|
881
|
-
}
|
|
882
|
-
// Generate the export line
|
|
883
|
-
let exportLine;
|
|
1182
|
+
// Generate the canonical PATH block.
|
|
1183
|
+
let exportBlock;
|
|
884
1184
|
if (shell === 'fish') {
|
|
885
|
-
|
|
1185
|
+
exportBlock = `# agents-cli: version-managed agent CLIs\nfish_add_path ${shimsDir}\n`;
|
|
886
1186
|
}
|
|
887
1187
|
else {
|
|
888
|
-
|
|
1188
|
+
exportBlock = `# agents-cli: version-managed agent CLIs\nexport PATH="${shimsDir}:$PATH"\n`;
|
|
889
1189
|
}
|
|
890
|
-
|
|
891
|
-
//
|
|
892
|
-
const
|
|
1190
|
+
const contentWithoutShimLines = stripShimPathLines(content, shimsDir);
|
|
1191
|
+
// Find insertion point - AFTER node/nvm/fnm setup if present, otherwise append.
|
|
1192
|
+
const insertAfterPatterns = [
|
|
893
1193
|
/^export NVM_DIR=/m,
|
|
894
1194
|
/^source.*nvm/m,
|
|
895
1195
|
/^\[ -s.*nvm/m,
|
|
@@ -898,18 +1198,14 @@ export function addShimsToPath() {
|
|
|
898
1198
|
/^export PATH.*npm/m,
|
|
899
1199
|
];
|
|
900
1200
|
let insertIndex = -1;
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
lineStart--;
|
|
908
|
-
}
|
|
909
|
-
if (insertIndex === -1 || lineStart < insertIndex) {
|
|
910
|
-
insertIndex = lineStart;
|
|
911
|
-
}
|
|
1201
|
+
const lines = contentWithoutShimLines.split('\n');
|
|
1202
|
+
let offset = 0;
|
|
1203
|
+
for (const line of lines) {
|
|
1204
|
+
const lineWithNewline = `${line}\n`;
|
|
1205
|
+
if (insertAfterPatterns.some((pattern) => pattern.test(line))) {
|
|
1206
|
+
insertIndex = offset + lineWithNewline.length;
|
|
912
1207
|
}
|
|
1208
|
+
offset += lineWithNewline.length;
|
|
913
1209
|
}
|
|
914
1210
|
// Write the updated content
|
|
915
1211
|
try {
|
|
@@ -920,12 +1216,19 @@ export function addShimsToPath() {
|
|
|
920
1216
|
}
|
|
921
1217
|
let newContent;
|
|
922
1218
|
if (insertIndex >= 0) {
|
|
923
|
-
// Insert
|
|
924
|
-
|
|
1219
|
+
// Insert after the last node/nvm/fnm-related line so our prepend wins.
|
|
1220
|
+
const before = contentWithoutShimLines.slice(0, insertIndex);
|
|
1221
|
+
const separator = before.length > 0 && !before.endsWith('\n\n') ? '\n' : '';
|
|
1222
|
+
newContent = before + separator + exportBlock + contentWithoutShimLines.slice(insertIndex);
|
|
925
1223
|
}
|
|
926
1224
|
else {
|
|
927
1225
|
// Append to end
|
|
928
|
-
|
|
1226
|
+
const separator = contentWithoutShimLines.length > 0 && !contentWithoutShimLines.endsWith('\n') ? '\n' : '';
|
|
1227
|
+
newContent = contentWithoutShimLines + separator + exportBlock;
|
|
1228
|
+
}
|
|
1229
|
+
newContent = newContent.replace(/\n{2,}$/g, '\n');
|
|
1230
|
+
if (newContent === content) {
|
|
1231
|
+
return { success: true, alreadyPresent: true, rcFile };
|
|
929
1232
|
}
|
|
930
1233
|
fs.writeFileSync(rcPath, newContent, 'utf-8');
|
|
931
1234
|
return { success: true, rcFile };
|
|
@@ -934,6 +1237,17 @@ export function addShimsToPath() {
|
|
|
934
1237
|
return { success: false, error: `Could not write ${rcFile}: ${err.message}` };
|
|
935
1238
|
}
|
|
936
1239
|
}
|
|
1240
|
+
export function listAgentsWithInstalledVersions() {
|
|
1241
|
+
const versionsDir = getVersionsDir();
|
|
1242
|
+
if (!fs.existsSync(versionsDir)) {
|
|
1243
|
+
return [];
|
|
1244
|
+
}
|
|
1245
|
+
const entries = fs.readdirSync(versionsDir, { withFileTypes: true });
|
|
1246
|
+
return entries
|
|
1247
|
+
.filter((entry) => entry.isDirectory() && AGENTS[entry.name])
|
|
1248
|
+
.map((entry) => entry.name)
|
|
1249
|
+
.filter((agent) => fs.readdirSync(path.join(versionsDir, agent), { withFileTypes: true }).some((entry) => entry.isDirectory()));
|
|
1250
|
+
}
|
|
937
1251
|
/**
|
|
938
1252
|
* Create shims for all installed agents.
|
|
939
1253
|
*/
|
|
@@ -1116,4 +1430,3 @@ export function copyResourcesToVersion(agent, fromVersion, toVersion, diff) {
|
|
|
1116
1430
|
}
|
|
1117
1431
|
}
|
|
1118
1432
|
}
|
|
1119
|
-
//# sourceMappingURL=shims.js.map
|