@phnx-labs/agents-cli 0.1.0 → 1.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -1
- package/README.md +283 -372
- package/dist/commands/alias.d.ts +11 -0
- package/dist/commands/alias.js +117 -0
- package/dist/commands/beta.d.ts +2 -0
- package/dist/commands/beta.js +53 -0
- package/dist/commands/cloud.d.ts +8 -1
- package/dist/commands/cloud.js +108 -22
- package/dist/commands/commands.d.ts +9 -1
- package/dist/commands/commands.js +24 -172
- package/dist/commands/daemon.d.ts +8 -1
- package/dist/commands/daemon.js +13 -5
- package/dist/commands/doctor.d.ts +15 -0
- package/dist/commands/doctor.js +132 -0
- package/dist/commands/drive.d.ts +8 -1
- package/dist/commands/drive.js +20 -3
- package/dist/commands/exec.d.ts +8 -1
- package/dist/commands/exec.js +96 -27
- package/dist/commands/factory.d.ts +19 -0
- package/dist/commands/factory.js +71 -0
- package/dist/commands/fork.d.ts +8 -1
- package/dist/commands/fork.js +11 -4
- package/dist/commands/hooks.d.ts +9 -1
- package/dist/commands/hooks.js +30 -182
- package/dist/commands/init.d.ts +15 -1
- package/dist/commands/init.js +168 -74
- package/dist/commands/mcp.d.ts +9 -1
- package/dist/commands/mcp.js +11 -7
- package/dist/commands/models.d.ts +8 -1
- package/dist/commands/models.js +16 -4
- package/dist/commands/packages.d.ts +8 -1
- package/dist/commands/packages.js +13 -7
- package/dist/commands/permissions.d.ts +9 -1
- package/dist/commands/permissions.js +3 -3
- package/dist/commands/plugins.d.ts +8 -1
- package/dist/commands/plugins.js +13 -2
- package/dist/commands/profiles.d.ts +9 -1
- package/dist/commands/profiles.js +56 -7
- package/dist/commands/prune.d.ts +22 -0
- package/dist/commands/prune.js +191 -0
- package/dist/commands/pty.d.ts +1 -1
- package/dist/commands/pty.js +2 -1
- package/dist/commands/pull.d.ts +8 -1
- package/dist/commands/pull.js +58 -128
- package/dist/commands/refresh-memory.d.ts +7 -1
- package/dist/commands/refresh-memory.js +7 -1
- package/dist/commands/repo.d.ts +15 -0
- package/dist/commands/repo.js +570 -0
- package/dist/commands/resource-view.d.ts +10 -3
- package/dist/commands/resource-view.js +18 -5
- package/dist/commands/routines.d.ts +8 -1
- package/dist/commands/routines.js +17 -4
- package/dist/commands/rules.d.ts +9 -1
- package/dist/commands/rules.js +16 -11
- package/dist/commands/secrets.d.ts +8 -1
- package/dist/commands/secrets.js +235 -63
- package/dist/commands/sessions-picker.d.ts +2 -1
- package/dist/commands/sessions-picker.js +88 -11
- package/dist/commands/sessions-tail.d.ts +19 -0
- package/dist/commands/sessions-tail.js +235 -0
- package/dist/commands/sessions.d.ts +2 -1
- package/dist/commands/sessions.js +188 -7
- package/dist/commands/skills.d.ts +9 -1
- package/dist/commands/skills.js +28 -178
- package/dist/commands/status.d.ts +7 -1
- package/dist/commands/status.js +7 -1
- package/dist/commands/subagents.d.ts +8 -1
- package/dist/commands/subagents.js +11 -1
- package/dist/commands/sync.d.ts +8 -1
- package/dist/commands/sync.js +8 -1
- package/dist/commands/teams-picker.d.ts +4 -1
- package/dist/commands/teams-picker.js +55 -3
- package/dist/commands/teams.d.ts +15 -1
- package/dist/commands/teams.js +323 -69
- package/dist/commands/usage.d.ts +11 -0
- package/dist/commands/usage.js +60 -0
- package/dist/commands/utils.d.ts +6 -1
- package/dist/commands/utils.js +6 -1
- package/dist/commands/versions.d.ts +8 -1
- package/dist/commands/versions.js +4 -3
- package/dist/commands/view.d.ts +47 -2
- package/dist/commands/view.js +317 -24
- package/dist/index.d.ts +7 -2
- package/dist/index.js +172 -34
- package/dist/lib/acp/client.d.ts +31 -0
- package/dist/lib/acp/client.js +117 -0
- package/dist/lib/acp/harnesses.d.ts +26 -0
- package/dist/lib/acp/harnesses.js +65 -0
- package/dist/lib/acp/run.d.ts +18 -0
- package/dist/lib/acp/run.js +39 -0
- package/dist/lib/agents.d.ts +74 -2
- package/dist/lib/agents.js +197 -21
- package/dist/lib/artifact-actions.d.ts +8 -4
- package/dist/lib/artifact-actions.js +8 -6
- package/dist/lib/auto-pull-worker.d.ts +11 -0
- package/dist/lib/auto-pull-worker.js +121 -0
- package/dist/lib/auto-pull.d.ts +31 -0
- package/dist/lib/auto-pull.js +97 -0
- package/dist/lib/beta.d.ts +23 -0
- package/dist/lib/beta.js +90 -0
- package/dist/lib/capabilities.d.ts +29 -0
- package/dist/lib/capabilities.js +74 -0
- package/dist/lib/cloud/codex.d.ts +9 -3
- package/dist/lib/cloud/codex.js +53 -13
- package/dist/lib/cloud/factory.d.ts +8 -3
- package/dist/lib/cloud/factory.js +19 -3
- package/dist/lib/cloud/registry.d.ts +10 -1
- package/dist/lib/cloud/registry.js +14 -3
- package/dist/lib/cloud/rush.d.ts +63 -3
- package/dist/lib/cloud/rush.js +273 -20
- package/dist/lib/cloud/store.d.ts +13 -1
- package/dist/lib/cloud/store.js +23 -4
- package/dist/lib/cloud/stream.d.ts +6 -1
- package/dist/lib/cloud/stream.js +95 -39
- package/dist/lib/cloud/types.d.ts +153 -8
- package/dist/lib/cloud/types.js +34 -2
- package/dist/lib/command-skills.d.ts +20 -0
- package/dist/lib/command-skills.js +142 -0
- package/dist/lib/commands.d.ts +22 -2
- package/dist/lib/commands.js +51 -11
- package/dist/lib/convert.d.ts +10 -1
- package/dist/lib/convert.js +9 -1
- package/dist/lib/daemon.d.ts +21 -1
- package/dist/lib/daemon.js +97 -4
- package/dist/lib/drive-sync.d.ts +18 -1
- package/dist/lib/drive-sync.js +57 -15
- package/dist/lib/exec.d.ts +23 -6
- package/dist/lib/exec.js +53 -17
- package/dist/lib/fs-walk.d.ts +2 -0
- package/dist/lib/fs-walk.js +40 -0
- package/dist/lib/fuzzy.d.ts +53 -0
- package/dist/lib/fuzzy.js +72 -0
- package/dist/lib/gemini-settings.d.ts +4 -0
- package/dist/lib/gemini-settings.js +33 -0
- package/dist/lib/git.d.ts +12 -2
- package/dist/lib/git.js +17 -6
- package/dist/lib/help.d.ts +20 -1
- package/dist/lib/help.js +45 -6
- package/dist/lib/hooks/match.d.ts +32 -0
- package/dist/lib/hooks/match.js +120 -0
- package/dist/lib/hooks.d.ts +17 -4
- package/dist/lib/hooks.js +119 -101
- package/dist/lib/manifest.d.ts +6 -1
- package/dist/lib/manifest.js +15 -4
- package/dist/lib/markdown.d.ts +0 -1
- package/dist/lib/markdown.js +6 -1
- package/dist/lib/mcp.d.ts +0 -1
- package/dist/lib/mcp.js +29 -33
- package/dist/lib/memory-compile.d.ts +13 -3
- package/dist/lib/memory-compile.js +31 -9
- package/dist/lib/memory.d.ts +14 -7
- package/dist/lib/memory.js +67 -38
- package/dist/lib/migrate.d.ts +8 -0
- package/dist/lib/migrate.js +85 -0
- package/dist/lib/models.d.ts +10 -4
- package/dist/lib/models.js +36 -15
- package/dist/lib/onepassword.d.ts +63 -0
- package/dist/lib/onepassword.js +186 -0
- package/dist/lib/paths.d.ts +8 -0
- package/dist/lib/paths.js +20 -0
- package/dist/lib/permissions.d.ts +24 -2
- package/dist/lib/permissions.js +117 -48
- package/dist/lib/picker.d.ts +10 -1
- package/dist/lib/picker.js +15 -1
- package/dist/lib/plugins.d.ts +7 -1
- package/dist/lib/plugins.js +10 -1
- package/dist/lib/profiles-presets.d.ts +10 -1
- package/dist/lib/profiles-presets.js +9 -1
- package/dist/lib/profiles.d.ts +35 -1
- package/dist/lib/profiles.js +36 -15
- package/dist/lib/pty-client.d.ts +1 -1
- package/dist/lib/pty-client.js +0 -1
- package/dist/lib/pty-server.d.ts +16 -2
- package/dist/lib/pty-server.js +92 -3
- package/dist/lib/registry.d.ts +23 -3
- package/dist/lib/registry.js +153 -8
- package/dist/lib/resources.d.ts +28 -1
- package/dist/lib/resources.js +79 -1
- package/dist/lib/rotate.d.ts +40 -13
- package/dist/lib/rotate.js +238 -40
- package/dist/lib/routines.d.ts +29 -1
- package/dist/lib/routines.js +32 -5
- package/dist/lib/runner.d.ts +14 -1
- package/dist/lib/runner.js +22 -3
- package/dist/lib/sandbox.d.ts +16 -1
- package/dist/lib/sandbox.js +39 -16
- package/dist/lib/scheduler.d.ts +8 -1
- package/dist/lib/scheduler.js +8 -1
- package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
- package/dist/lib/{secrets-bundles.d.ts → secrets/bundles.d.ts} +12 -2
- package/dist/lib/{secrets-bundles.js → secrets/bundles.js} +38 -17
- package/dist/lib/secrets/index.d.ts +55 -0
- package/dist/lib/secrets/index.js +211 -0
- package/dist/lib/secrets/profiles.d.ts +10 -0
- package/dist/lib/secrets/profiles.js +13 -0
- package/dist/lib/session/active.d.ts +43 -0
- package/dist/lib/session/active.js +392 -0
- package/dist/lib/session/artifacts.d.ts +12 -1
- package/dist/lib/session/artifacts.js +25 -5
- package/dist/lib/session/cloud.d.ts +30 -0
- package/dist/lib/session/cloud.js +121 -0
- package/dist/lib/session/db.d.ts +23 -2
- package/dist/lib/session/db.js +76 -12
- package/dist/lib/session/discover.d.ts +19 -4
- package/dist/lib/session/discover.js +344 -48
- package/dist/lib/session/parse.d.ts +28 -1
- package/dist/lib/session/parse.js +267 -9
- package/dist/lib/session/prompt.d.ts +9 -1
- package/dist/lib/session/prompt.js +17 -3
- package/dist/lib/session/render.d.ts +13 -1
- package/dist/lib/session/render.js +20 -1
- package/dist/lib/session/team-filter.d.ts +9 -1
- package/dist/lib/session/team-filter.js +11 -2
- package/dist/lib/session/types.d.ts +16 -2
- package/dist/lib/session/types.js +10 -2
- package/dist/lib/shims.d.ts +64 -5
- package/dist/lib/shims.js +309 -47
- package/dist/lib/skills.d.ts +27 -2
- package/dist/lib/skills.js +127 -65
- package/dist/lib/sqlite.d.ts +43 -0
- package/dist/lib/sqlite.js +94 -0
- package/dist/lib/state.d.ts +112 -27
- package/dist/lib/state.js +320 -148
- package/dist/lib/subagents.d.ts +9 -1
- package/dist/lib/subagents.js +70 -63
- package/dist/lib/sync-manifest.d.ts +81 -0
- package/dist/lib/sync-manifest.js +450 -0
- package/dist/lib/teams/agents.d.ts +103 -5
- package/dist/lib/teams/agents.js +414 -91
- package/dist/lib/teams/api.d.ts +26 -3
- package/dist/lib/teams/api.js +63 -3
- package/dist/lib/teams/debug.d.ts +6 -1
- package/dist/lib/teams/debug.js +6 -1
- package/dist/lib/teams/file_ops.d.ts +7 -1
- package/dist/lib/teams/file_ops.js +7 -1
- package/dist/lib/teams/index.d.ts +15 -0
- package/dist/lib/teams/index.js +14 -0
- package/dist/lib/teams/parsers.d.ts +4 -1
- package/dist/lib/teams/parsers.js +11 -1
- package/dist/lib/teams/persistence.d.ts +15 -1
- package/dist/lib/teams/persistence.js +102 -20
- package/dist/lib/teams/registry.d.ts +12 -1
- package/dist/lib/teams/registry.js +116 -33
- package/dist/lib/teams/summarizer.d.ts +15 -1
- package/dist/lib/teams/summarizer.js +14 -1
- package/dist/lib/teams/supervisor.d.ts +48 -0
- package/dist/lib/teams/supervisor.js +73 -0
- package/dist/lib/template.d.ts +8 -6
- package/dist/lib/template.js +8 -6
- package/dist/lib/types.d.ts +147 -8
- package/dist/lib/types.js +26 -3
- package/dist/lib/usage.d.ts +32 -1
- package/dist/lib/usage.js +70 -6
- package/dist/lib/version-duplicates.d.ts +21 -0
- package/dist/lib/version-duplicates.js +90 -0
- package/dist/lib/versions.d.ts +33 -4
- package/dist/lib/versions.js +376 -108
- package/package.json +32 -17
- package/scripts/postinstall.js +126 -30
- package/dist/commands/__tests__/sessions.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions.test.js +0 -636
- package/dist/commands/__tests__/sessions.test.js.map +0 -1
- package/dist/commands/cloud.d.ts.map +0 -1
- package/dist/commands/cloud.js.map +0 -1
- package/dist/commands/commands.d.ts.map +0 -1
- package/dist/commands/commands.js.map +0 -1
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/fork.d.ts.map +0 -1
- package/dist/commands/fork.js.map +0 -1
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/packages.d.ts.map +0 -1
- package/dist/commands/packages.js.map +0 -1
- package/dist/commands/permissions.d.ts.map +0 -1
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/profiles.d.ts.map +0 -1
- package/dist/commands/profiles.js.map +0 -1
- package/dist/commands/pty.d.ts.map +0 -1
- package/dist/commands/pty.js.map +0 -1
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -3
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -180
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/refresh-memory.d.ts.map +0 -1
- package/dist/commands/refresh-memory.js.map +0 -1
- package/dist/commands/resource-view.d.ts.map +0 -1
- package/dist/commands/resource-view.js.map +0 -1
- package/dist/commands/routines.d.ts.map +0 -1
- package/dist/commands/routines.js.map +0 -1
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/secrets.d.ts.map +0 -1
- package/dist/commands/secrets.js.map +0 -1
- package/dist/commands/sessions-picker.d.ts.map +0 -1
- package/dist/commands/sessions-picker.js.map +0 -1
- package/dist/commands/sessions.d.ts.map +0 -1
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/subagents.d.ts.map +0 -1
- package/dist/commands/subagents.js.map +0 -1
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/teams-picker.d.ts.map +0 -1
- package/dist/commands/teams-picker.js.map +0 -1
- package/dist/commands/teams.d.ts.map +0 -1
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/commands/versions.d.ts.map +0 -1
- package/dist/commands/versions.js.map +0 -1
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
- package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.js +0 -192
- package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
- package/dist/lib/__tests__/exec.test.d.ts +0 -2
- package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
- package/dist/lib/__tests__/exec.test.js +0 -446
- package/dist/lib/__tests__/exec.test.js.map +0 -1
- package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
- package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
- package/dist/lib/__tests__/git-sync.test.js +0 -138
- package/dist/lib/__tests__/git-sync.test.js.map +0 -1
- package/dist/lib/__tests__/hooks.test.d.ts +0 -2
- package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
- package/dist/lib/__tests__/hooks.test.js +0 -203
- package/dist/lib/__tests__/hooks.test.js.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
- package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.js +0 -95
- package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
- package/dist/lib/__tests__/models.test.d.ts +0 -2
- package/dist/lib/__tests__/models.test.d.ts.map +0 -1
- package/dist/lib/__tests__/models.test.js +0 -239
- package/dist/lib/__tests__/models.test.js.map +0 -1
- package/dist/lib/__tests__/rotate.test.d.ts +0 -2
- package/dist/lib/__tests__/rotate.test.d.ts.map +0 -1
- package/dist/lib/__tests__/rotate.test.js +0 -80
- package/dist/lib/__tests__/rotate.test.js.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets-bundles.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets-bundles.test.js +0 -104
- package/dist/lib/__tests__/secrets-bundles.test.js.map +0 -1
- package/dist/lib/__tests__/secrets.test.d.ts +0 -2
- package/dist/lib/__tests__/secrets.test.d.ts.map +0 -1
- package/dist/lib/__tests__/secrets.test.js +0 -90
- package/dist/lib/__tests__/secrets.test.js.map +0 -1
- package/dist/lib/__tests__/shims.test.d.ts +0 -2
- package/dist/lib/__tests__/shims.test.d.ts.map +0 -1
- package/dist/lib/__tests__/shims.test.js +0 -39
- package/dist/lib/__tests__/shims.test.js.map +0 -1
- package/dist/lib/__tests__/usage.test.d.ts +0 -2
- package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
- package/dist/lib/__tests__/usage.test.js +0 -220
- package/dist/lib/__tests__/usage.test.js.map +0 -1
- package/dist/lib/__tests__/versions.test.d.ts +0 -2
- package/dist/lib/__tests__/versions.test.d.ts.map +0 -1
- package/dist/lib/__tests__/versions.test.js +0 -63
- package/dist/lib/__tests__/versions.test.js.map +0 -1
- package/dist/lib/agents.d.ts.map +0 -1
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/artifact-actions.d.ts.map +0 -1
- package/dist/lib/artifact-actions.js.map +0 -1
- package/dist/lib/cloud/codex.d.ts.map +0 -1
- package/dist/lib/cloud/codex.js.map +0 -1
- package/dist/lib/cloud/factory.d.ts.map +0 -1
- package/dist/lib/cloud/factory.js.map +0 -1
- package/dist/lib/cloud/registry.d.ts.map +0 -1
- package/dist/lib/cloud/registry.js.map +0 -1
- package/dist/lib/cloud/rush.d.ts.map +0 -1
- package/dist/lib/cloud/rush.js.map +0 -1
- package/dist/lib/cloud/store.d.ts.map +0 -1
- package/dist/lib/cloud/store.js.map +0 -1
- package/dist/lib/cloud/stream.d.ts.map +0 -1
- package/dist/lib/cloud/stream.js.map +0 -1
- package/dist/lib/cloud/types.d.ts.map +0 -1
- package/dist/lib/cloud/types.js.map +0 -1
- package/dist/lib/commands.d.ts.map +0 -1
- package/dist/lib/commands.js.map +0 -1
- package/dist/lib/convert.d.ts.map +0 -1
- package/dist/lib/convert.js.map +0 -1
- package/dist/lib/daemon.d.ts.map +0 -1
- package/dist/lib/daemon.js.map +0 -1
- package/dist/lib/drive-sync.d.ts.map +0 -1
- package/dist/lib/drive-sync.js.map +0 -1
- package/dist/lib/exec.d.ts.map +0 -1
- package/dist/lib/exec.js.map +0 -1
- package/dist/lib/factory.d.ts +0 -57
- package/dist/lib/factory.d.ts.map +0 -1
- package/dist/lib/factory.js +0 -110
- package/dist/lib/factory.js.map +0 -1
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/help.d.ts.map +0 -1
- package/dist/lib/help.js.map +0 -1
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/manifest.d.ts.map +0 -1
- package/dist/lib/manifest.js.map +0 -1
- package/dist/lib/markdown.d.ts.map +0 -1
- package/dist/lib/markdown.js.map +0 -1
- package/dist/lib/mcp.d.ts.map +0 -1
- package/dist/lib/mcp.js.map +0 -1
- package/dist/lib/memory-compile.d.ts.map +0 -1
- package/dist/lib/memory-compile.js.map +0 -1
- package/dist/lib/memory.d.ts.map +0 -1
- package/dist/lib/memory.js.map +0 -1
- package/dist/lib/models.d.ts.map +0 -1
- package/dist/lib/models.js.map +0 -1
- package/dist/lib/permissions.d.ts.map +0 -1
- package/dist/lib/permissions.js.map +0 -1
- package/dist/lib/picker.d.ts.map +0 -1
- package/dist/lib/picker.js.map +0 -1
- package/dist/lib/plugins.d.ts.map +0 -1
- package/dist/lib/plugins.js.map +0 -1
- package/dist/lib/profiles-keychain.d.ts +0 -3
- package/dist/lib/profiles-keychain.d.ts.map +0 -1
- package/dist/lib/profiles-keychain.js +0 -10
- package/dist/lib/profiles-keychain.js.map +0 -1
- package/dist/lib/profiles-presets.d.ts.map +0 -1
- package/dist/lib/profiles-presets.js.map +0 -1
- package/dist/lib/profiles.d.ts.map +0 -1
- package/dist/lib/profiles.js.map +0 -1
- package/dist/lib/pty-client.d.ts.map +0 -1
- package/dist/lib/pty-client.js.map +0 -1
- package/dist/lib/pty-server.d.ts.map +0 -1
- package/dist/lib/pty-server.js.map +0 -1
- package/dist/lib/registry.d.ts.map +0 -1
- package/dist/lib/registry.js.map +0 -1
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.js.map +0 -1
- package/dist/lib/rotate.d.ts.map +0 -1
- package/dist/lib/rotate.js.map +0 -1
- package/dist/lib/routines.d.ts.map +0 -1
- package/dist/lib/routines.js.map +0 -1
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.js.map +0 -1
- package/dist/lib/sandbox.d.ts.map +0 -1
- package/dist/lib/sandbox.js.map +0 -1
- package/dist/lib/scheduler.d.ts.map +0 -1
- package/dist/lib/scheduler.js.map +0 -1
- package/dist/lib/secrets-bundles.d.ts.map +0 -1
- package/dist/lib/secrets-bundles.js.map +0 -1
- package/dist/lib/secrets.d.ts +0 -27
- package/dist/lib/secrets.d.ts.map +0 -1
- package/dist/lib/secrets.js +0 -127
- package/dist/lib/secrets.js.map +0 -1
- package/dist/lib/session/__tests__/db.test.d.ts +0 -2
- package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/db.test.js +0 -54
- package/dist/lib/session/__tests__/db.test.js.map +0 -1
- package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
- package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/discover.test.js +0 -63
- package/dist/lib/session/__tests__/discover.test.js.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
- package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.js +0 -44
- package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
- package/dist/lib/session/__tests__/render.test.d.ts +0 -2
- package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/render.test.js +0 -602
- package/dist/lib/session/__tests__/render.test.js.map +0 -1
- package/dist/lib/session/artifacts.d.ts.map +0 -1
- package/dist/lib/session/artifacts.js.map +0 -1
- package/dist/lib/session/db.d.ts.map +0 -1
- package/dist/lib/session/db.js.map +0 -1
- package/dist/lib/session/discover.d.ts.map +0 -1
- package/dist/lib/session/discover.js.map +0 -1
- package/dist/lib/session/parse.d.ts.map +0 -1
- package/dist/lib/session/parse.js.map +0 -1
- package/dist/lib/session/prompt.d.ts.map +0 -1
- package/dist/lib/session/prompt.js.map +0 -1
- package/dist/lib/session/prompt.test.d.ts +0 -2
- package/dist/lib/session/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/prompt.test.js +0 -57
- package/dist/lib/session/prompt.test.js.map +0 -1
- package/dist/lib/session/render.d.ts.map +0 -1
- package/dist/lib/session/render.js.map +0 -1
- package/dist/lib/session/team-filter.d.ts.map +0 -1
- package/dist/lib/session/team-filter.js.map +0 -1
- package/dist/lib/session/team-filter.test.d.ts +0 -2
- package/dist/lib/session/team-filter.test.d.ts.map +0 -1
- package/dist/lib/session/team-filter.test.js +0 -157
- package/dist/lib/session/team-filter.test.js.map +0 -1
- package/dist/lib/session/types.d.ts.map +0 -1
- package/dist/lib/session/types.js.map +0 -1
- package/dist/lib/shims.d.ts.map +0 -1
- package/dist/lib/shims.js.map +0 -1
- package/dist/lib/skills.d.ts.map +0 -1
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/subagents.d.ts.map +0 -1
- package/dist/lib/subagents.js.map +0 -1
- package/dist/lib/teams/agents.d.ts.map +0 -1
- package/dist/lib/teams/agents.js.map +0 -1
- package/dist/lib/teams/api.d.ts.map +0 -1
- package/dist/lib/teams/api.js.map +0 -1
- package/dist/lib/teams/cloud.d.ts +0 -11
- package/dist/lib/teams/cloud.d.ts.map +0 -1
- package/dist/lib/teams/cloud.js +0 -169
- package/dist/lib/teams/cloud.js.map +0 -1
- package/dist/lib/teams/debug.d.ts.map +0 -1
- package/dist/lib/teams/debug.js.map +0 -1
- package/dist/lib/teams/file_ops.d.ts.map +0 -1
- package/dist/lib/teams/file_ops.js.map +0 -1
- package/dist/lib/teams/parsers.d.ts.map +0 -1
- package/dist/lib/teams/parsers.js.map +0 -1
- package/dist/lib/teams/persistence.d.ts.map +0 -1
- package/dist/lib/teams/persistence.js.map +0 -1
- package/dist/lib/teams/ralph.d.ts +0 -8
- package/dist/lib/teams/ralph.d.ts.map +0 -1
- package/dist/lib/teams/ralph.js +0 -59
- package/dist/lib/teams/ralph.js.map +0 -1
- package/dist/lib/teams/registry.d.ts.map +0 -1
- package/dist/lib/teams/registry.js.map +0 -1
- package/dist/lib/teams/summarizer.d.ts.map +0 -1
- package/dist/lib/teams/summarizer.js.map +0 -1
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/usage.d.ts.map +0 -1
- package/dist/lib/usage.js.map +0 -1
- package/dist/lib/versions.d.ts.map +0 -1
- package/dist/lib/versions.js.map +0 -1
- package/scripts/rebuild-sqlite.sh +0 -46
package/dist/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';
|
|
@@ -153,9 +163,18 @@ export async function promptConflictStrategy(conflictInfos) {
|
|
|
153
163
|
* v4 — project version marker changed from `.agents-version` to a
|
|
154
164
|
* root-level `agents.yaml`; shim now skips ~/.agents/agents.yaml
|
|
155
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.
|
|
156
170
|
*/
|
|
157
|
-
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. */
|
|
158
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
|
+
*/
|
|
159
178
|
export function generateShimScript(agent) {
|
|
160
179
|
const agentConfig = AGENTS[agent];
|
|
161
180
|
const cliCommand = agentConfig.cliCommand;
|
|
@@ -167,7 +186,14 @@ export function generateShimScript(agent) {
|
|
|
167
186
|
# live Claude account.
|
|
168
187
|
export CLAUDE_CONFIG_DIR="$VERSION_DIR/home/${configDirName}"
|
|
169
188
|
`
|
|
170
|
-
: ''
|
|
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
|
+
: '';
|
|
171
197
|
// Agents that don't natively resolve @-imports in their memory file need
|
|
172
198
|
// agents-cli to recompile when the user edits a rule/preset file. The
|
|
173
199
|
// check is fast (sha256 of ~8 small files) and skips the recompile when
|
|
@@ -180,19 +206,21 @@ export CLAUDE_CONFIG_DIR="$VERSION_DIR/home/${configDirName}"
|
|
|
180
206
|
agents refresh-memory --agent "$AGENT" --agent-version "$VERSION" --quiet 2>/dev/null || true
|
|
181
207
|
`
|
|
182
208
|
: '';
|
|
209
|
+
const launchArgs = agent === 'codex' ? ' -c check_for_update_on_startup=false' : '';
|
|
183
210
|
return `#!/bin/bash
|
|
184
211
|
# Auto-generated by agents-cli - do not edit
|
|
185
212
|
# Shim for ${agentConfig.name}
|
|
186
213
|
# ${SHIM_VERSION_MARKER} ${SHIM_SCHEMA_VERSION}
|
|
187
214
|
|
|
188
|
-
|
|
215
|
+
AGENTS_SYSTEM_DIR="$HOME/.agents-system"
|
|
216
|
+
AGENTS_USER_DIR="$HOME/.agents"
|
|
189
217
|
AGENT="${agent}"
|
|
190
218
|
CLI_COMMAND="${cliCommand}"
|
|
191
219
|
|
|
192
|
-
# Find project agents.yaml walking up from cwd (skip
|
|
220
|
+
# Find project agents.yaml walking up from cwd (skip $HOME/.agents-system/agents.yaml)
|
|
193
221
|
find_project_version() {
|
|
194
222
|
local dir="$PWD"
|
|
195
|
-
local user_agents_yaml="$
|
|
223
|
+
local user_agents_yaml="$AGENTS_SYSTEM_DIR/agents.yaml"
|
|
196
224
|
while [ "$dir" != "/" ]; do
|
|
197
225
|
local candidate="$dir/agents.yaml"
|
|
198
226
|
if [ -f "$candidate" ] && [ "$candidate" != "$user_agents_yaml" ]; then
|
|
@@ -215,7 +243,7 @@ find_project_version() {
|
|
|
215
243
|
|
|
216
244
|
# Resolve version from agents.yaml (user default)
|
|
217
245
|
resolve_default_version() {
|
|
218
|
-
local meta="$
|
|
246
|
+
local meta="$AGENTS_USER_DIR/agents.yaml"
|
|
219
247
|
if [ -f "$meta" ]; then
|
|
220
248
|
awk -v agent="$AGENT" '
|
|
221
249
|
/^agents:/ { in_agents=1; next }
|
|
@@ -255,7 +283,7 @@ if [ -z "$VERSION" ]; then
|
|
|
255
283
|
exit 1
|
|
256
284
|
fi
|
|
257
285
|
|
|
258
|
-
VERSION_DIR="$
|
|
286
|
+
VERSION_DIR="$AGENTS_SYSTEM_DIR/versions/$AGENT/$VERSION"
|
|
259
287
|
BINARY="$VERSION_DIR/node_modules/.bin/$CLI_COMMAND"
|
|
260
288
|
|
|
261
289
|
# Auto-install if not present
|
|
@@ -302,7 +330,7 @@ if [ -n "$PROJECT_AGENTS_DIR" ]; then
|
|
|
302
330
|
fi
|
|
303
331
|
${refreshMemoryCall}${managedEnv}
|
|
304
332
|
|
|
305
|
-
exec "$BINARY" "$@"
|
|
333
|
+
exec "$BINARY"${launchArgs} "$@"
|
|
306
334
|
`;
|
|
307
335
|
}
|
|
308
336
|
/**
|
|
@@ -341,29 +369,53 @@ export function removeShim(agent) {
|
|
|
341
369
|
* v2 — emit CLAUDE_CONFIG_DIR for claude aliases so each version has its
|
|
342
370
|
* own isolated config/OAuth slot; stamp a version marker so stale
|
|
343
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.
|
|
344
376
|
*/
|
|
345
|
-
export const VERSIONED_ALIAS_SCHEMA_VERSION =
|
|
377
|
+
export const VERSIONED_ALIAS_SCHEMA_VERSION = 5;
|
|
378
|
+
/** Internal marker string used to embed the schema version in versioned alias scripts. */
|
|
346
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
|
+
}
|
|
347
390
|
/**
|
|
348
391
|
* Generate a versioned alias script that directly execs a specific version.
|
|
349
392
|
* e.g., claude@2.0.65 -> directly runs that version's binary
|
|
350
393
|
*/
|
|
351
394
|
export function generateVersionedAliasScript(agent, version) {
|
|
395
|
+
assertSafeVersion(version);
|
|
352
396
|
const agentConfig = AGENTS[agent];
|
|
353
397
|
const configDirName = `.${agent}`;
|
|
354
398
|
const managedEnv = agent === 'claude'
|
|
355
399
|
? `
|
|
356
400
|
# Claude stores OAuth credentials in the macOS keychain. Scope them to this
|
|
357
401
|
# version's config directory so direct aliases also switch the live account.
|
|
358
|
-
export CLAUDE_CONFIG_DIR="$HOME/.agents/versions/${agent}/${version}/home/${configDirName}"
|
|
402
|
+
export CLAUDE_CONFIG_DIR="$HOME/.agents-system/versions/${agent}/${version}/home/${configDirName}"
|
|
359
403
|
`
|
|
360
|
-
: ''
|
|
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' : '';
|
|
361
413
|
return `#!/bin/bash
|
|
362
414
|
# Auto-generated by agents-cli - do not edit
|
|
363
415
|
# ${VERSIONED_ALIAS_VERSION_MARKER} ${VERSIONED_ALIAS_SCHEMA_VERSION}
|
|
364
416
|
# Direct alias for ${agentConfig.name}@${version}
|
|
365
417
|
|
|
366
|
-
BINARY="$HOME/.agents/versions/${agent}/${version}/node_modules/.bin/${agentConfig.cliCommand}"
|
|
418
|
+
BINARY="$HOME/.agents-system/versions/${agent}/${version}/node_modules/.bin/${agentConfig.cliCommand}"
|
|
367
419
|
|
|
368
420
|
if [ ! -x "$BINARY" ]; then
|
|
369
421
|
echo "agents: ${agent}@${version} not installed" >&2
|
|
@@ -371,7 +423,7 @@ if [ ! -x "$BINARY" ]; then
|
|
|
371
423
|
fi
|
|
372
424
|
${managedEnv}
|
|
373
425
|
|
|
374
|
-
exec "$BINARY" "$@"
|
|
426
|
+
exec "$BINARY"${launchArgs} "$@"
|
|
375
427
|
`;
|
|
376
428
|
}
|
|
377
429
|
/**
|
|
@@ -394,6 +446,9 @@ export function readVersionedAliasSchemaVersion(agent, version) {
|
|
|
394
446
|
return null;
|
|
395
447
|
}
|
|
396
448
|
}
|
|
449
|
+
/**
|
|
450
|
+
* True if the on-disk versioned alias matches the current schema version.
|
|
451
|
+
*/
|
|
397
452
|
export function isVersionedAliasCurrent(agent, version) {
|
|
398
453
|
return readVersionedAliasSchemaVersion(agent, version) === VERSIONED_ALIAS_SCHEMA_VERSION;
|
|
399
454
|
}
|
|
@@ -414,6 +469,9 @@ export function ensureVersionedAliasCurrent(agent, version) {
|
|
|
414
469
|
}
|
|
415
470
|
return 'current';
|
|
416
471
|
}
|
|
472
|
+
/**
|
|
473
|
+
* Get the filesystem path for a versioned alias script.
|
|
474
|
+
*/
|
|
417
475
|
export function getVersionedAliasPath(agent, version) {
|
|
418
476
|
return path.join(getShimsDir(), `${AGENTS[agent].cliCommand}@${version}`);
|
|
419
477
|
}
|
|
@@ -422,6 +480,7 @@ export function getVersionedAliasPath(agent, version) {
|
|
|
422
480
|
* e.g., claude@2.0.65
|
|
423
481
|
*/
|
|
424
482
|
export function createVersionedAlias(agent, version) {
|
|
483
|
+
assertSafeVersion(version);
|
|
425
484
|
ensureAgentsDir();
|
|
426
485
|
const shimsDir = getShimsDir();
|
|
427
486
|
const agentConfig = AGENTS[agent];
|
|
@@ -586,6 +645,15 @@ export function switchHomeFileSymlinks(agent, version) {
|
|
|
586
645
|
const versionsDir = getVersionsDir();
|
|
587
646
|
const switched = [];
|
|
588
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
|
+
}
|
|
589
657
|
for (const fileName of homeFiles) {
|
|
590
658
|
const globalPath = path.join(home, fileName);
|
|
591
659
|
const versionFilePath = path.join(versionsDir, agent, version, 'home', fileName);
|
|
@@ -629,7 +697,14 @@ export function switchHomeFileSymlinks(agent, version) {
|
|
|
629
697
|
else if (stat.isFile()) {
|
|
630
698
|
// Real file — first-time migration
|
|
631
699
|
// Read the global file content
|
|
632
|
-
|
|
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
|
+
}
|
|
633
708
|
// Merge auth into ALL installed version files for this agent
|
|
634
709
|
const agentVersionsDir = path.join(versionsDir, agent);
|
|
635
710
|
if (fs.existsSync(agentVersionsDir)) {
|
|
@@ -674,6 +749,108 @@ export function switchHomeFileSymlinks(agent, version) {
|
|
|
674
749
|
}
|
|
675
750
|
return { switched, errors };
|
|
676
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
|
+
}
|
|
677
854
|
/**
|
|
678
855
|
* Get the current config symlink target version, if any.
|
|
679
856
|
*/
|
|
@@ -858,6 +1035,37 @@ export function getPathShadowingExecutable(agent) {
|
|
|
858
1035
|
}
|
|
859
1036
|
return null;
|
|
860
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
|
+
}
|
|
861
1069
|
/**
|
|
862
1070
|
* Check if shims directory is in PATH.
|
|
863
1071
|
*/
|
|
@@ -866,11 +1074,56 @@ export function isShimsInPath() {
|
|
|
866
1074
|
const pathDirs = (process.env.PATH || '').split(path.delimiter);
|
|
867
1075
|
return pathDirs.some((dir) => path.resolve(dir) === path.resolve(shimsDir));
|
|
868
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
|
+
}
|
|
869
1122
|
/**
|
|
870
1123
|
* Get the shell rc file path for the current shell.
|
|
871
1124
|
*/
|
|
872
|
-
function getShellRcFile() {
|
|
873
|
-
const shell = process.env.SHELL || '/bin/bash';
|
|
1125
|
+
function getShellRcFile(overrides) {
|
|
1126
|
+
const shell = overrides?.shell || process.env.SHELL || '/bin/bash';
|
|
874
1127
|
const shellName = path.basename(shell);
|
|
875
1128
|
let rcFile;
|
|
876
1129
|
switch (shellName) {
|
|
@@ -887,7 +1140,7 @@ function getShellRcFile() {
|
|
|
887
1140
|
}
|
|
888
1141
|
return {
|
|
889
1142
|
rcFile,
|
|
890
|
-
rcPath: path.join(os.homedir(), rcFile),
|
|
1143
|
+
rcPath: path.join(overrides?.homeDir || os.homedir(), rcFile),
|
|
891
1144
|
shell: shellName,
|
|
892
1145
|
};
|
|
893
1146
|
}
|
|
@@ -901,7 +1154,7 @@ export function getPathSetupInstructions() {
|
|
|
901
1154
|
return `Add to ~/.config/fish/config.fish:
|
|
902
1155
|
fish_add_path ${shimsDir}`;
|
|
903
1156
|
}
|
|
904
|
-
return `Add to ~/${rcFile} (
|
|
1157
|
+
return `Add to ~/${rcFile} (AFTER any nvm/node setup):
|
|
905
1158
|
export PATH="${shimsDir}:$PATH"
|
|
906
1159
|
|
|
907
1160
|
IMPORTANT: Shims must come FIRST in PATH to override global installs.
|
|
@@ -913,9 +1166,9 @@ Then restart your shell or run:
|
|
|
913
1166
|
* Add shims directory to shell PATH configuration.
|
|
914
1167
|
* Returns true if added, false if already present or failed.
|
|
915
1168
|
*/
|
|
916
|
-
export function addShimsToPath() {
|
|
917
|
-
const shimsDir = getShimsDir();
|
|
918
|
-
const { rcFile, rcPath, shell } = getShellRcFile();
|
|
1169
|
+
export function addShimsToPath(overrides) {
|
|
1170
|
+
const shimsDir = overrides?.shimsDir || getShimsDir();
|
|
1171
|
+
const { rcFile, rcPath, shell } = getShellRcFile(overrides);
|
|
919
1172
|
// Read current rc file content
|
|
920
1173
|
let content = '';
|
|
921
1174
|
try {
|
|
@@ -926,21 +1179,17 @@ export function addShimsToPath() {
|
|
|
926
1179
|
catch (err) {
|
|
927
1180
|
return { success: false, error: `Could not read ${rcFile}: ${err.message}` };
|
|
928
1181
|
}
|
|
929
|
-
//
|
|
930
|
-
|
|
931
|
-
return { success: true, alreadyPresent: true, rcFile };
|
|
932
|
-
}
|
|
933
|
-
// Generate the export line
|
|
934
|
-
let exportLine;
|
|
1182
|
+
// Generate the canonical PATH block.
|
|
1183
|
+
let exportBlock;
|
|
935
1184
|
if (shell === 'fish') {
|
|
936
|
-
|
|
1185
|
+
exportBlock = `# agents-cli: version-managed agent CLIs\nfish_add_path ${shimsDir}\n`;
|
|
937
1186
|
}
|
|
938
1187
|
else {
|
|
939
|
-
|
|
1188
|
+
exportBlock = `# agents-cli: version-managed agent CLIs\nexport PATH="${shimsDir}:$PATH"\n`;
|
|
940
1189
|
}
|
|
941
|
-
|
|
942
|
-
//
|
|
943
|
-
const
|
|
1190
|
+
const contentWithoutShimLines = stripShimPathLines(content, shimsDir);
|
|
1191
|
+
// Find insertion point - AFTER node/nvm/fnm setup if present, otherwise append.
|
|
1192
|
+
const insertAfterPatterns = [
|
|
944
1193
|
/^export NVM_DIR=/m,
|
|
945
1194
|
/^source.*nvm/m,
|
|
946
1195
|
/^\[ -s.*nvm/m,
|
|
@@ -949,18 +1198,14 @@ export function addShimsToPath() {
|
|
|
949
1198
|
/^export PATH.*npm/m,
|
|
950
1199
|
];
|
|
951
1200
|
let insertIndex = -1;
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
lineStart--;
|
|
959
|
-
}
|
|
960
|
-
if (insertIndex === -1 || lineStart < insertIndex) {
|
|
961
|
-
insertIndex = lineStart;
|
|
962
|
-
}
|
|
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;
|
|
963
1207
|
}
|
|
1208
|
+
offset += lineWithNewline.length;
|
|
964
1209
|
}
|
|
965
1210
|
// Write the updated content
|
|
966
1211
|
try {
|
|
@@ -971,12 +1216,19 @@ export function addShimsToPath() {
|
|
|
971
1216
|
}
|
|
972
1217
|
let newContent;
|
|
973
1218
|
if (insertIndex >= 0) {
|
|
974
|
-
// Insert
|
|
975
|
-
|
|
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);
|
|
976
1223
|
}
|
|
977
1224
|
else {
|
|
978
1225
|
// Append to end
|
|
979
|
-
|
|
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 };
|
|
980
1232
|
}
|
|
981
1233
|
fs.writeFileSync(rcPath, newContent, 'utf-8');
|
|
982
1234
|
return { success: true, rcFile };
|
|
@@ -985,6 +1237,17 @@ export function addShimsToPath() {
|
|
|
985
1237
|
return { success: false, error: `Could not write ${rcFile}: ${err.message}` };
|
|
986
1238
|
}
|
|
987
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
|
+
}
|
|
988
1251
|
/**
|
|
989
1252
|
* Create shims for all installed agents.
|
|
990
1253
|
*/
|
|
@@ -1167,4 +1430,3 @@ export function copyResourcesToVersion(agent, fromVersion, toVersion, diff) {
|
|
|
1167
1430
|
}
|
|
1168
1431
|
}
|
|
1169
1432
|
}
|
|
1170
|
-
//# sourceMappingURL=shims.js.map
|
package/dist/lib/skills.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill management -- discovery, installation, and syncing of SKILL.md bundles.
|
|
3
|
+
*
|
|
4
|
+
* Skills are knowledge packs stored in ~/.agents/skills/. Each skill directory
|
|
5
|
+
* contains a SKILL.md (with frontmatter metadata) and optional supporting files
|
|
6
|
+
* (rules/, examples/, etc.). This module handles parsing skill metadata,
|
|
7
|
+
* installing skills into agent version homes, and tracking installation state.
|
|
8
|
+
*/
|
|
1
9
|
import type { AgentId, SkillMetadata, InstalledSkill } from './types.js';
|
|
10
|
+
/** User-scoped skills dir (~/.agents/skills/). Used for installs. */
|
|
2
11
|
export declare function getSkillsDir(): string;
|
|
3
12
|
export declare function ensureCentralSkillsDir(): void;
|
|
4
13
|
export declare function getAgentSkillsDir(agentId: AgentId): string;
|
|
@@ -41,6 +50,12 @@ export interface DiscoveredSkill {
|
|
|
41
50
|
ruleCount: number;
|
|
42
51
|
validation: ValidationResult;
|
|
43
52
|
parseError?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Which repo the skill was discovered in. `undefined` means the primary
|
|
55
|
+
* ~/.agents/ repo; otherwise the alias of an extra repo registered via
|
|
56
|
+
* `agents repo add`. Primary wins on name collisions.
|
|
57
|
+
*/
|
|
58
|
+
source?: string;
|
|
44
59
|
}
|
|
45
60
|
export declare function discoverSkillsFromRepo(repoPath: string): DiscoveredSkill[];
|
|
46
61
|
export declare function installSkill(sourcePath: string, skillName: string, agents: AgentId[], method?: 'symlink' | 'copy'): {
|
|
@@ -58,9 +73,20 @@ export declare function skillExists(agentId: AgentId, skillName: string): boolea
|
|
|
58
73
|
*/
|
|
59
74
|
export declare function skillContentMatches(agentId: AgentId, skillName: string, sourcePath: string): boolean;
|
|
60
75
|
/**
|
|
61
|
-
* List skill names
|
|
76
|
+
* List skill names from user (~/.agents/skills/) and system (~/.agents-system/skills/) dirs.
|
|
77
|
+
* User dir takes priority; deduplication preserves first occurrence.
|
|
62
78
|
*/
|
|
63
79
|
export declare function listCentralSkills(): string[];
|
|
80
|
+
/**
|
|
81
|
+
* Resolve a skill name to its source directory. Searches user dir first,
|
|
82
|
+
* then system dir, then extra repos. Returns null if no source has a SKILL.md.
|
|
83
|
+
*/
|
|
84
|
+
export declare function resolveSkillSourcePath(skillName: string): string | null;
|
|
85
|
+
/**
|
|
86
|
+
* Union of skill names available across the primary and all enabled extras.
|
|
87
|
+
* Primary wins on name collision.
|
|
88
|
+
*/
|
|
89
|
+
export declare function listAllSkills(): string[];
|
|
64
90
|
/**
|
|
65
91
|
* Path to the skills dir of a specific version home (not the active one).
|
|
66
92
|
*/
|
|
@@ -131,4 +157,3 @@ export declare function installSkillCentrally(sourcePath: string, skillName: str
|
|
|
131
157
|
error?: string;
|
|
132
158
|
warnings?: string[];
|
|
133
159
|
};
|
|
134
|
-
//# sourceMappingURL=skills.d.ts.map
|