@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/exec.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent execution -- command building, process spawning, and rate-limit fallback.
|
|
3
|
+
*
|
|
4
|
+
* Translates high-level ExecOptions into CLI invocations for each supported agent,
|
|
5
|
+
* manages environment isolation per agent, and chains fallback agents on rate limits.
|
|
6
|
+
*/
|
|
1
7
|
import { spawn } from 'child_process';
|
|
2
8
|
import { randomUUID } from 'crypto';
|
|
3
9
|
import * as path from 'path';
|
|
4
10
|
import { parseTimeout } from './routines.js';
|
|
5
11
|
import { getVersionHomePath, isVersionInstalled, resolveVersion } from './versions.js';
|
|
6
12
|
import { resolveModel, buildReasoningFlags } from './models.js';
|
|
13
|
+
/** Pattern for valid environment variable names (C identifier rules). */
|
|
7
14
|
const EXEC_ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
15
|
+
/** Parse a single KEY=VALUE string into a tuple, validating the key name. */
|
|
8
16
|
function parseExecEnvEntry(entry) {
|
|
9
17
|
const separatorIndex = entry.indexOf('=');
|
|
10
18
|
if (separatorIndex <= 0) {
|
|
@@ -17,34 +25,58 @@ function parseExecEnvEntry(entry) {
|
|
|
17
25
|
}
|
|
18
26
|
return [key, value];
|
|
19
27
|
}
|
|
28
|
+
/** Parse an array of KEY=VALUE strings into an env record. Returns undefined for empty input. */
|
|
20
29
|
export function parseExecEnv(entries) {
|
|
21
30
|
if (entries.length === 0) {
|
|
22
31
|
return undefined;
|
|
23
32
|
}
|
|
24
33
|
return Object.fromEntries(entries.map(parseExecEnvEntry));
|
|
25
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Build the process environment for an agent invocation.
|
|
37
|
+
* Pins CLAUDE_CONFIG_DIR for Claude and CODEX_HOME for Codex; strips the
|
|
38
|
+
* other agent's env var so it doesn't leak into unrelated invocations.
|
|
39
|
+
*/
|
|
26
40
|
export function buildExecEnv(options) {
|
|
27
41
|
const result = { ...process.env };
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
// when we are, pin it to the resolved version's home.
|
|
42
|
+
// Config-dir env vars are agent-specific. When the caller is running inside
|
|
43
|
+
// an agent-managed shell, process.env already carries one; spreading into a
|
|
44
|
+
// different agent's env would leak a config pointer the target CLI doesn't
|
|
45
|
+
// understand. Strip foreign vars and pin the right one to the versioned home.
|
|
33
46
|
if (options.agent === 'claude') {
|
|
34
47
|
const cwd = options.cwd || process.cwd();
|
|
35
|
-
const
|
|
36
|
-
|
|
48
|
+
const resolvedVersion = options.version ?? resolveVersion('claude', cwd);
|
|
49
|
+
// Use an explicitly pinned version unconditionally; for auto-resolved versions
|
|
50
|
+
// only inject the path when the version is actually installed on disk.
|
|
51
|
+
const version = options.version
|
|
52
|
+
? resolvedVersion
|
|
53
|
+
: (resolvedVersion && isVersionInstalled('claude', resolvedVersion) ? resolvedVersion : null);
|
|
54
|
+
if (version) {
|
|
37
55
|
result.CLAUDE_CONFIG_DIR = path.join(getVersionHomePath('claude', version), '.claude');
|
|
38
56
|
}
|
|
57
|
+
delete result.CODEX_HOME;
|
|
58
|
+
}
|
|
59
|
+
else if (options.agent === 'codex') {
|
|
60
|
+
const cwd = options.cwd || process.cwd();
|
|
61
|
+
const resolvedVersion = options.version ?? resolveVersion('codex', cwd);
|
|
62
|
+
const version = options.version
|
|
63
|
+
? resolvedVersion
|
|
64
|
+
: (resolvedVersion && isVersionInstalled('codex', resolvedVersion) ? resolvedVersion : null);
|
|
65
|
+
if (version) {
|
|
66
|
+
result.CODEX_HOME = path.join(getVersionHomePath('codex', version), '.codex');
|
|
67
|
+
}
|
|
68
|
+
delete result.CLAUDE_CONFIG_DIR;
|
|
39
69
|
}
|
|
40
70
|
else {
|
|
41
71
|
delete result.CLAUDE_CONFIG_DIR;
|
|
72
|
+
delete result.CODEX_HOME;
|
|
42
73
|
}
|
|
43
74
|
return {
|
|
44
75
|
...result,
|
|
45
76
|
...options.env,
|
|
46
77
|
};
|
|
47
78
|
}
|
|
79
|
+
/** CLI command templates for every supported agent. */
|
|
48
80
|
export const AGENT_COMMANDS = {
|
|
49
81
|
claude: {
|
|
50
82
|
base: ['claude'],
|
|
@@ -164,10 +196,11 @@ export const AGENT_COMMANDS = {
|
|
|
164
196
|
modelFlag: '--model',
|
|
165
197
|
},
|
|
166
198
|
};
|
|
199
|
+
/** Assemble the full CLI argument array for an agent invocation. */
|
|
167
200
|
export function buildExecCommand(options) {
|
|
168
201
|
const template = AGENT_COMMANDS[options.agent];
|
|
169
202
|
const cmd = [...template.base];
|
|
170
|
-
const interactive = options.prompt === undefined;
|
|
203
|
+
const interactive = options.interactive === true || options.prompt === undefined;
|
|
171
204
|
// Use versioned alias if a specific version was requested (e.g., claude@2.1.98)
|
|
172
205
|
if (options.version && cmd.length > 0) {
|
|
173
206
|
cmd[0] = `${cmd[0]}@${options.version}`;
|
|
@@ -191,7 +224,7 @@ export function buildExecCommand(options) {
|
|
|
191
224
|
const modeFlags = template.modeFlags[options.mode];
|
|
192
225
|
cmd.push(...modeFlags);
|
|
193
226
|
// Add print/headless flags only when a prompt is provided. Without a prompt
|
|
194
|
-
// the caller wants an interactive REPL
|
|
227
|
+
// the caller wants an interactive REPL -- passing --print would immediately
|
|
195
228
|
// wait on stdin and never render the TUI.
|
|
196
229
|
if (!interactive && options.headless && template.printFlags) {
|
|
197
230
|
cmd.push(...template.printFlags);
|
|
@@ -225,8 +258,10 @@ export function buildExecCommand(options) {
|
|
|
225
258
|
cmd.push(template.verboseFlag);
|
|
226
259
|
}
|
|
227
260
|
}
|
|
228
|
-
// Add prompt
|
|
229
|
-
|
|
261
|
+
// Add prompt when provided. In pure interactive mode (no prompt) we skip this
|
|
262
|
+
// so the CLI launches its TUI. When --interactive is passed alongside a prompt
|
|
263
|
+
// we still forward the prompt so the agent receives it as the first message.
|
|
264
|
+
if (options.prompt !== undefined) {
|
|
230
265
|
if (template.promptFlag === 'positional') {
|
|
231
266
|
cmd.push(options.prompt);
|
|
232
267
|
}
|
|
@@ -242,6 +277,7 @@ export function buildExecCommand(options) {
|
|
|
242
277
|
}
|
|
243
278
|
return cmd;
|
|
244
279
|
}
|
|
280
|
+
/** Spawn an agent and return its exit code. Convenience wrapper over spawnAgent. */
|
|
245
281
|
export async function execAgent(options) {
|
|
246
282
|
const { exitCode } = await spawnAgent(options);
|
|
247
283
|
return exitCode;
|
|
@@ -250,7 +286,7 @@ export async function execAgent(options) {
|
|
|
250
286
|
* Spawn an agent process and return its exit code plus a tee'd copy of stderr.
|
|
251
287
|
*
|
|
252
288
|
* Stderr is always piped so the caller can inspect it (e.g., for rate-limit
|
|
253
|
-
* detection) while also forwarding every chunk to process.stderr in real time
|
|
289
|
+
* detection) while also forwarding every chunk to process.stderr in real time --
|
|
254
290
|
* the user sees the same output they would with stdio: 'inherit'. Stdout keeps
|
|
255
291
|
* the original behavior: 'pipe' when downstream output is piped (so `agents
|
|
256
292
|
* run ... | ...` composes cleanly), otherwise 'inherit' so TTY output is
|
|
@@ -261,7 +297,7 @@ async function spawnAgent(options) {
|
|
|
261
297
|
const [executable, ...args] = cmd;
|
|
262
298
|
const timeoutMs = options.timeout ? parseTimeout(options.timeout) : undefined;
|
|
263
299
|
const piped = !process.stdout.isTTY;
|
|
264
|
-
const interactive = options.prompt === undefined;
|
|
300
|
+
const interactive = options.interactive === true || options.prompt === undefined;
|
|
265
301
|
return new Promise((resolve, reject) => {
|
|
266
302
|
// Interactive mode inherits all stdio so the CLI owns the TTY (TUI
|
|
267
303
|
// rendering, raw-mode keystrokes, colored output). Headless mode pipes
|
|
@@ -313,7 +349,7 @@ async function spawnAgent(options) {
|
|
|
313
349
|
}
|
|
314
350
|
/**
|
|
315
351
|
* Patterns that indicate a rate/usage limit. Matching is intentionally broad
|
|
316
|
-
* because providers phrase these differently
|
|
352
|
+
* because providers phrase these differently -- Anthropic uses "5-hour limit"
|
|
317
353
|
* and "rate limit", OpenAI surfaces 429s, Google says "quota exceeded".
|
|
318
354
|
* False positives here just trigger a fallback attempt; false negatives leave
|
|
319
355
|
* the original error unhandled, which is worse.
|
|
@@ -328,6 +364,7 @@ export const RATE_LIMIT_PATTERNS = [
|
|
|
328
364
|
/api[\s_-]?overloaded/i,
|
|
329
365
|
/\boverloaded\b/i,
|
|
330
366
|
];
|
|
367
|
+
/** Return true if the text contains any known rate-limit or overload indicator. */
|
|
331
368
|
export function detectRateLimit(text) {
|
|
332
369
|
return RATE_LIMIT_PATTERNS.some(pattern => pattern.test(text));
|
|
333
370
|
}
|
|
@@ -338,7 +375,7 @@ export function detectRateLimit(text) {
|
|
|
338
375
|
* When the prior agent was Claude we pin its session ID via `--session-id` so
|
|
339
376
|
* `prevSessionId` is always defined; for other primaries we pass undefined and
|
|
340
377
|
* get a simpler retry-with-context prompt. Claude understands `/continue <id>`
|
|
341
|
-
* via its shipped skill
|
|
378
|
+
* via its shipped skill -- other agents fall through to an explicit instruction
|
|
342
379
|
* that points at the version-agnostic `agents sessions <id>` reader.
|
|
343
380
|
*/
|
|
344
381
|
export function buildFallbackPrompt(prevAgent, prevSessionId, nextAgent, originalPrompt) {
|
|
@@ -359,7 +396,7 @@ export function buildFallbackPrompt(prevAgent, prevSessionId, nextAgent, origina
|
|
|
359
396
|
*
|
|
360
397
|
* The primary agent gets the original prompt. Subsequent agents get a
|
|
361
398
|
* `/continue <id>`-style handoff (see buildFallbackPrompt) when we can pin a
|
|
362
|
-
* session ID
|
|
399
|
+
* session ID -- which today means Claude as primary (supports `--session-id`).
|
|
363
400
|
* For other primaries, fallbacks run with the original prompt plus a
|
|
364
401
|
* retry-with-context note, since we can't deterministically resolve their
|
|
365
402
|
* auto-generated session IDs.
|
|
@@ -420,4 +457,3 @@ export async function runWithFallback(options) {
|
|
|
420
457
|
}
|
|
421
458
|
return 1;
|
|
422
459
|
}
|
|
423
|
-
//# sourceMappingURL=exec.js.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/** Walk a directory recursively for files with a given extension. */
|
|
4
|
+
export function walkForFiles(dir, ext, limit) {
|
|
5
|
+
const results = [];
|
|
6
|
+
function walk(d, depth) {
|
|
7
|
+
if (depth > 5)
|
|
8
|
+
return;
|
|
9
|
+
let entries;
|
|
10
|
+
try {
|
|
11
|
+
entries = fs.readdirSync(d);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
for (const entry of entries) {
|
|
17
|
+
const full = path.join(d, entry);
|
|
18
|
+
const stat = safeStatSync(full);
|
|
19
|
+
if (!stat)
|
|
20
|
+
continue;
|
|
21
|
+
if (stat.isDirectory()) {
|
|
22
|
+
walk(full, depth + 1);
|
|
23
|
+
}
|
|
24
|
+
else if (entry.endsWith(ext)) {
|
|
25
|
+
results.push({ path: full, mtime: stat.mtimeMs });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
walk(dir, 0);
|
|
30
|
+
results.sort((a, b) => b.mtime - a.mtime);
|
|
31
|
+
return results.slice(0, limit).map(r => r.path);
|
|
32
|
+
}
|
|
33
|
+
function safeStatSync(p) {
|
|
34
|
+
try {
|
|
35
|
+
return fs.statSync(p);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fuzzy string matching for user-provided identifiers.
|
|
3
|
+
* Auto-corrects typos like "cladue" -> "claude" based on Levenshtein distance.
|
|
4
|
+
*/
|
|
5
|
+
/** Levenshtein edit distance between two strings. */
|
|
6
|
+
export declare function levenshtein(a: string, b: string): number;
|
|
7
|
+
export interface FuzzyOptions {
|
|
8
|
+
/** Absolute max edit distance allowed. */
|
|
9
|
+
maxDistance?: number;
|
|
10
|
+
/** Max ratio of distance to input length. If set, effective threshold = min(maxDistance, floor(len * maxRatio)). */
|
|
11
|
+
maxRatio?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Fuzzy match an input string against a list of candidates.
|
|
15
|
+
* Returns the single best match within tolerance, or null if no match or ambiguous.
|
|
16
|
+
*/
|
|
17
|
+
export declare function fuzzyMatch<T extends string>(input: string, candidates: readonly T[], options?: FuzzyOptions): T | null;
|
|
18
|
+
/**
|
|
19
|
+
* Preset configurations for different identifier types.
|
|
20
|
+
* Based on pairwise distance analysis of candidate pools.
|
|
21
|
+
*/
|
|
22
|
+
export declare const FUZZY_PRESETS: {
|
|
23
|
+
/** Agents: min pairwise dist=3 (opencode/openclaw), safe tolerance=2 */
|
|
24
|
+
readonly agents: {
|
|
25
|
+
readonly maxDistance: 2;
|
|
26
|
+
};
|
|
27
|
+
/** Modes: plan/edit/full all at dist=4, lenient */
|
|
28
|
+
readonly modes: {
|
|
29
|
+
readonly maxDistance: 2;
|
|
30
|
+
};
|
|
31
|
+
/** Efforts: high/xhigh at dist=1, must be strict */
|
|
32
|
+
readonly efforts: {
|
|
33
|
+
readonly maxDistance: 1;
|
|
34
|
+
};
|
|
35
|
+
/** Strategies: pinned/available/rotate all far apart */
|
|
36
|
+
readonly strategies: {
|
|
37
|
+
readonly maxDistance: 2;
|
|
38
|
+
};
|
|
39
|
+
/** Beta features: drive/factory at dist=7, lenient */
|
|
40
|
+
readonly beta: {
|
|
41
|
+
readonly maxDistance: 2;
|
|
42
|
+
};
|
|
43
|
+
/** Dynamic/user-defined: profiles, commands, hooks, etc. */
|
|
44
|
+
readonly dynamic: {
|
|
45
|
+
readonly maxDistance: 2;
|
|
46
|
+
readonly maxRatio: 0.3;
|
|
47
|
+
};
|
|
48
|
+
/** Skills: often longer names, slightly more lenient */
|
|
49
|
+
readonly skills: {
|
|
50
|
+
readonly maxDistance: 3;
|
|
51
|
+
readonly maxRatio: 0.3;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fuzzy string matching for user-provided identifiers.
|
|
3
|
+
* Auto-corrects typos like "cladue" -> "claude" based on Levenshtein distance.
|
|
4
|
+
*/
|
|
5
|
+
/** Levenshtein edit distance between two strings. */
|
|
6
|
+
export function levenshtein(a, b) {
|
|
7
|
+
const m = a.length, n = b.length;
|
|
8
|
+
if (m === 0)
|
|
9
|
+
return n;
|
|
10
|
+
if (n === 0)
|
|
11
|
+
return m;
|
|
12
|
+
const dp = Array.from({ length: m + 1 }, (_, i) => Array.from({ length: n + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)));
|
|
13
|
+
for (let i = 1; i <= m; i++) {
|
|
14
|
+
for (let j = 1; j <= n; j++) {
|
|
15
|
+
dp[i][j] = a[i - 1] === b[j - 1]
|
|
16
|
+
? dp[i - 1][j - 1]
|
|
17
|
+
: 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return dp[m][n];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Fuzzy match an input string against a list of candidates.
|
|
24
|
+
* Returns the single best match within tolerance, or null if no match or ambiguous.
|
|
25
|
+
*/
|
|
26
|
+
export function fuzzyMatch(input, candidates, options = {}) {
|
|
27
|
+
const { maxDistance = 2, maxRatio } = options;
|
|
28
|
+
const lower = input.toLowerCase();
|
|
29
|
+
// Reject inputs that are too short - they're too ambiguous
|
|
30
|
+
if (lower.length < 3)
|
|
31
|
+
return null;
|
|
32
|
+
// Compute effective threshold
|
|
33
|
+
const threshold = maxRatio
|
|
34
|
+
? Math.min(maxDistance, Math.floor(lower.length * maxRatio))
|
|
35
|
+
: maxDistance;
|
|
36
|
+
// Find all candidates within threshold (excluding exact matches)
|
|
37
|
+
const matches = [];
|
|
38
|
+
for (const candidate of candidates) {
|
|
39
|
+
const dist = levenshtein(lower, candidate.toLowerCase());
|
|
40
|
+
if (dist > 0 && dist <= threshold) {
|
|
41
|
+
matches.push({ candidate, dist });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (matches.length === 0)
|
|
45
|
+
return null;
|
|
46
|
+
// Sort by distance
|
|
47
|
+
matches.sort((a, b) => a.dist - b.dist);
|
|
48
|
+
// Only return if exactly one candidate at the minimum distance (no ambiguity)
|
|
49
|
+
const minDist = matches[0].dist;
|
|
50
|
+
const atMinDist = matches.filter(m => m.dist === minDist);
|
|
51
|
+
return atMinDist.length === 1 ? atMinDist[0].candidate : null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Preset configurations for different identifier types.
|
|
55
|
+
* Based on pairwise distance analysis of candidate pools.
|
|
56
|
+
*/
|
|
57
|
+
export const FUZZY_PRESETS = {
|
|
58
|
+
/** Agents: min pairwise dist=3 (opencode/openclaw), safe tolerance=2 */
|
|
59
|
+
agents: { maxDistance: 2 },
|
|
60
|
+
/** Modes: plan/edit/full all at dist=4, lenient */
|
|
61
|
+
modes: { maxDistance: 2 },
|
|
62
|
+
/** Efforts: high/xhigh at dist=1, must be strict */
|
|
63
|
+
efforts: { maxDistance: 1 },
|
|
64
|
+
/** Strategies: pinned/available/rotate all far apart */
|
|
65
|
+
strategies: { maxDistance: 2 },
|
|
66
|
+
/** Beta features: drive/factory at dist=7, lenient */
|
|
67
|
+
beta: { maxDistance: 2 },
|
|
68
|
+
/** Dynamic/user-defined: profiles, commands, hooks, etc. */
|
|
69
|
+
dynamic: { maxDistance: 2, maxRatio: 0.3 },
|
|
70
|
+
/** Skills: often longer names, slightly more lenient */
|
|
71
|
+
skills: { maxDistance: 3, maxRatio: 0.3 },
|
|
72
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function readGeminiSettings(settingsPath: string): Record<string, unknown>;
|
|
2
|
+
export declare function writeGeminiSettings(settingsPath: string, settings: Record<string, unknown>): void;
|
|
3
|
+
export declare function updateGeminiSettings(settingsPath: string, mutate: (settings: Record<string, unknown>) => void): Record<string, unknown>;
|
|
4
|
+
export declare function setGeminiAutoUpdateDisabled(settings: Record<string, unknown>): void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
function isRecord(value) {
|
|
4
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
export function readGeminiSettings(settingsPath) {
|
|
7
|
+
if (!fs.existsSync(settingsPath)) {
|
|
8
|
+
return {};
|
|
9
|
+
}
|
|
10
|
+
const raw = fs.readFileSync(settingsPath, 'utf-8');
|
|
11
|
+
const parsed = JSON.parse(raw);
|
|
12
|
+
if (!isRecord(parsed)) {
|
|
13
|
+
throw new Error(`Gemini settings must be a JSON object: ${settingsPath}`);
|
|
14
|
+
}
|
|
15
|
+
return parsed;
|
|
16
|
+
}
|
|
17
|
+
export function writeGeminiSettings(settingsPath, settings) {
|
|
18
|
+
fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
|
|
19
|
+
fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
export function updateGeminiSettings(settingsPath, mutate) {
|
|
22
|
+
const settings = readGeminiSettings(settingsPath);
|
|
23
|
+
mutate(settings);
|
|
24
|
+
writeGeminiSettings(settingsPath, settings);
|
|
25
|
+
return settings;
|
|
26
|
+
}
|
|
27
|
+
export function setGeminiAutoUpdateDisabled(settings) {
|
|
28
|
+
const general = isRecord(settings.general) ? settings.general : {};
|
|
29
|
+
settings.general = {
|
|
30
|
+
...general,
|
|
31
|
+
enableAutoUpdate: false,
|
|
32
|
+
};
|
|
33
|
+
}
|
package/dist/lib/git.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** Parsed representation of a git source string (GitHub, generic URL, or local path). */
|
|
1
2
|
export interface GitSource {
|
|
2
3
|
type: 'github' | 'url' | 'local';
|
|
3
4
|
url: string;
|
|
@@ -21,20 +22,24 @@ export interface GitSource {
|
|
|
21
22
|
* ./relative/path -> local path
|
|
22
23
|
*/
|
|
23
24
|
export declare function parseSource(source: string): GitSource;
|
|
25
|
+
/** Clone a remote repo or pull updates if it already exists locally. */
|
|
24
26
|
export declare function cloneOrPull(source: GitSource, targetDir: string): Promise<{
|
|
25
27
|
isNew: boolean;
|
|
26
28
|
commit: string;
|
|
27
29
|
}>;
|
|
30
|
+
/** Clone a repository from a source string, returning the local path and commit hash. */
|
|
28
31
|
export declare function cloneRepo(source: string): Promise<{
|
|
29
32
|
localPath: string;
|
|
30
33
|
commit: string;
|
|
31
34
|
isNew: boolean;
|
|
32
35
|
}>;
|
|
36
|
+
/** Clone a package from a source string into the packages directory. */
|
|
33
37
|
export declare function clonePackage(source: string): Promise<{
|
|
34
38
|
localPath: string;
|
|
35
39
|
commit: string;
|
|
36
40
|
isNew: boolean;
|
|
37
41
|
}>;
|
|
42
|
+
/** Get the short commit hash (8 chars) of the latest commit in a repo. */
|
|
38
43
|
export declare function getRepoCommit(repoPath: string): Promise<string>;
|
|
39
44
|
/**
|
|
40
45
|
* Get the current GitHub username using gh CLI.
|
|
@@ -91,7 +96,7 @@ export declare function isSystemRepoOrigin(dir: string): Promise<boolean>;
|
|
|
91
96
|
export declare function hasLocalChanges(dir: string): Promise<boolean>;
|
|
92
97
|
/**
|
|
93
98
|
* Pull changes in an existing repo.
|
|
94
|
-
* Refuses to pull if the working tree is dirty
|
|
99
|
+
* Refuses to pull if the working tree is dirty -- user must commit or discard changes first.
|
|
95
100
|
*/
|
|
96
101
|
export declare function pullRepo(dir: string): Promise<{
|
|
97
102
|
success: boolean;
|
|
@@ -103,12 +108,18 @@ export declare function pullRepo(dir: string): Promise<{
|
|
|
103
108
|
* Returns files categorized by their status relative to HEAD.
|
|
104
109
|
*/
|
|
105
110
|
export interface GitSyncStatus {
|
|
111
|
+
/** Tracked and unchanged files. */
|
|
106
112
|
synced: string[];
|
|
113
|
+
/** Modified but not staged files. */
|
|
107
114
|
modified: string[];
|
|
115
|
+
/** Untracked files. */
|
|
108
116
|
new: string[];
|
|
117
|
+
/** Staged for commit. */
|
|
109
118
|
staged: string[];
|
|
119
|
+
/** Deleted files. */
|
|
110
120
|
deleted: string[];
|
|
111
121
|
}
|
|
122
|
+
/** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
|
|
112
123
|
export declare function getGitSyncStatus(dir: string, subdir?: string): Promise<GitSyncStatus | null>;
|
|
113
124
|
/**
|
|
114
125
|
* Get list of files tracked by git in a directory.
|
|
@@ -143,4 +154,3 @@ export declare function tryAutoPull(dir: string): Promise<{
|
|
|
143
154
|
pulled: boolean;
|
|
144
155
|
error?: string;
|
|
145
156
|
}>;
|
|
146
|
-
//# sourceMappingURL=git.d.ts.map
|
package/dist/lib/git.js
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git operations for the agents-cli system repo and package repositories.
|
|
3
|
+
*
|
|
4
|
+
* Handles cloning, pulling, syncing, and inspecting git repos used by
|
|
5
|
+
* the agents version management and plugin/package system. Includes
|
|
6
|
+
* source parsing for GitHub shorthand, SSH, HTTPS, and local paths.
|
|
7
|
+
*/
|
|
1
8
|
import simpleGit from 'simple-git';
|
|
2
9
|
import * as fs from 'fs';
|
|
3
10
|
import * as path from 'path';
|
|
@@ -8,7 +15,7 @@ import { DEFAULT_SYSTEM_REPO, LEGACY_SYSTEM_REPO, systemRepoSlug } from './types
|
|
|
8
15
|
*
|
|
9
16
|
* Why: `git config core.hooksPath` is a known sandbox-escape vector and is
|
|
10
17
|
* blocked by some sandboxed environments (e.g. Claude Code). Symlinks inside
|
|
11
|
-
* `.git/hooks/` sidestep that restriction entirely
|
|
18
|
+
* `.git/hooks/` sidestep that restriction entirely -- Git runs them the same way.
|
|
12
19
|
*/
|
|
13
20
|
function installGithooksSymlinks(repoDir) {
|
|
14
21
|
const githooksDir = path.join(repoDir, '.githooks');
|
|
@@ -149,6 +156,7 @@ export function parseSource(source) {
|
|
|
149
156
|
}
|
|
150
157
|
throw new Error(`Invalid source: ${source}. Supported formats: gh:owner/repo, owner/repo, github.com/owner/repo, https://github.com/owner/repo, or local path`);
|
|
151
158
|
}
|
|
159
|
+
/** Clone a remote repo or pull updates if it already exists locally. */
|
|
152
160
|
export async function cloneOrPull(source, targetDir) {
|
|
153
161
|
const git = simpleGit();
|
|
154
162
|
if (source.type === 'local') {
|
|
@@ -174,6 +182,7 @@ export async function cloneOrPull(source, targetDir) {
|
|
|
174
182
|
const log = await repoGit.log({ maxCount: 1 });
|
|
175
183
|
return { isNew: true, commit: log.latest?.hash.slice(0, 8) || 'unknown' };
|
|
176
184
|
}
|
|
185
|
+
/** Clone a repository from a source string, returning the local path and commit hash. */
|
|
177
186
|
export async function cloneRepo(source) {
|
|
178
187
|
const parsed = parseSource(source);
|
|
179
188
|
if (parsed.type === 'local') {
|
|
@@ -191,6 +200,7 @@ export async function cloneRepo(source) {
|
|
|
191
200
|
isNew: result.isNew,
|
|
192
201
|
};
|
|
193
202
|
}
|
|
203
|
+
/** Clone a package from a source string into the packages directory. */
|
|
194
204
|
export async function clonePackage(source) {
|
|
195
205
|
const parsed = parseSource(source);
|
|
196
206
|
if (parsed.type === 'local') {
|
|
@@ -208,6 +218,7 @@ export async function clonePackage(source) {
|
|
|
208
218
|
isNew: result.isNew,
|
|
209
219
|
};
|
|
210
220
|
}
|
|
221
|
+
/** Get the short commit hash (8 chars) of the latest commit in a repo. */
|
|
211
222
|
export async function getRepoCommit(repoPath) {
|
|
212
223
|
try {
|
|
213
224
|
const git = simpleGit(repoPath);
|
|
@@ -270,10 +281,10 @@ export async function setRemoteUrl(repoPath, url) {
|
|
|
270
281
|
*/
|
|
271
282
|
export async function checkGitHubRepoExists(owner, repo) {
|
|
272
283
|
try {
|
|
273
|
-
const {
|
|
284
|
+
const { execFile } = await import('child_process');
|
|
274
285
|
const { promisify } = await import('util');
|
|
275
|
-
const
|
|
276
|
-
await
|
|
286
|
+
const execFileAsync = promisify(execFile);
|
|
287
|
+
await execFileAsync('gh', ['repo', 'view', `${owner}/${repo}`, '--json', 'name']);
|
|
277
288
|
return true;
|
|
278
289
|
}
|
|
279
290
|
catch {
|
|
@@ -414,7 +425,7 @@ export async function hasLocalChanges(dir) {
|
|
|
414
425
|
}
|
|
415
426
|
/**
|
|
416
427
|
* Pull changes in an existing repo.
|
|
417
|
-
* Refuses to pull if the working tree is dirty
|
|
428
|
+
* Refuses to pull if the working tree is dirty -- user must commit or discard changes first.
|
|
418
429
|
*/
|
|
419
430
|
export async function pullRepo(dir) {
|
|
420
431
|
try {
|
|
@@ -440,6 +451,7 @@ export async function pullRepo(dir) {
|
|
|
440
451
|
return { success: false, commit: '', error: err.message };
|
|
441
452
|
}
|
|
442
453
|
}
|
|
454
|
+
/** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
|
|
443
455
|
export async function getGitSyncStatus(dir, subdir) {
|
|
444
456
|
if (!isGitRepo(dir)) {
|
|
445
457
|
return null;
|
|
@@ -632,4 +644,3 @@ export async function tryAutoPull(dir) {
|
|
|
632
644
|
return { pulled: false, error: err.message };
|
|
633
645
|
}
|
|
634
646
|
}
|
|
635
|
-
//# sourceMappingURL=git.js.map
|
package/dist/lib/help.d.ts
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom help formatting for the CLI.
|
|
3
|
+
*
|
|
4
|
+
* Overrides commander's default help layout to show Commands before Options,
|
|
5
|
+
* and applies consistent conventions (short -h flag, no implicit help subcommand).
|
|
6
|
+
*/
|
|
1
7
|
import type { Command } from 'commander';
|
|
8
|
+
/** Description of a named command group rendered as its own section in help output. */
|
|
9
|
+
export interface CommandGroup {
|
|
10
|
+
/** Section heading, e.g. 'Bundle commands'. */
|
|
11
|
+
title: string;
|
|
12
|
+
/** Subcommand names (in desired display order) that belong to this group. */
|
|
13
|
+
names: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Register named groups for a parent command so its help output splits the
|
|
17
|
+
* Commands section into multiple labeled sections. Subcommands not listed in
|
|
18
|
+
* any group fall back to a plain "Commands:" section below the groups.
|
|
19
|
+
*/
|
|
20
|
+
export declare function registerCommandGroups(parent: Command, groups: readonly CommandGroup[]): void;
|
|
21
|
+
/** Apply standardized help formatting to the root command and all subcommands. */
|
|
2
22
|
export declare function applyGlobalHelpConventions(root: Command): void;
|
|
3
|
-
//# sourceMappingURL=help.d.ts.map
|
package/dist/lib/help.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
const commandGroupRegistry = new WeakMap();
|
|
2
|
+
/**
|
|
3
|
+
* Register named groups for a parent command so its help output splits the
|
|
4
|
+
* Commands section into multiple labeled sections. Subcommands not listed in
|
|
5
|
+
* any group fall back to a plain "Commands:" section below the groups.
|
|
6
|
+
*/
|
|
7
|
+
export function registerCommandGroups(parent, groups) {
|
|
8
|
+
commandGroupRegistry.set(parent, groups);
|
|
9
|
+
}
|
|
10
|
+
/** Format help output with Commands listed before Options for better discoverability. */
|
|
1
11
|
function formatHelpCommandsFirst(cmd, helper) {
|
|
2
12
|
const termWidth = helper.padWidth(cmd, helper);
|
|
3
13
|
const helpWidth = helper.helpWidth || 80;
|
|
@@ -24,11 +34,39 @@ function formatHelpCommandsFirst(cmd, helper) {
|
|
|
24
34
|
if (argumentList.length > 0) {
|
|
25
35
|
output = output.concat(['Arguments:', formatList(argumentList), '']);
|
|
26
36
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
const visibleCommands = helper.visibleCommands(cmd);
|
|
38
|
+
const subcommandTermNoAlias = (sub) => {
|
|
39
|
+
// Mirror commander's default subcommandTerm but drop the |alias suffix.
|
|
40
|
+
const argList = sub.registeredArguments ?? [];
|
|
41
|
+
const args = argList
|
|
42
|
+
.map((a) => {
|
|
43
|
+
const n = a.name() + (a.variadic ? '...' : '');
|
|
44
|
+
return a.required ? `<${n}>` : `[${n}]`;
|
|
45
|
+
})
|
|
46
|
+
.join(' ');
|
|
47
|
+
return sub.name() + (sub.options.length > 0 ? ' [options]' : '') + (args ? ` ${args}` : '');
|
|
48
|
+
};
|
|
49
|
+
const renderCommand = (sub) => formatItem(subcommandTermNoAlias(sub), helper.subcommandDescription(sub));
|
|
50
|
+
const groups = commandGroupRegistry.get(cmd);
|
|
51
|
+
if (groups && groups.length > 0) {
|
|
52
|
+
const byName = new Map(visibleCommands.map((s) => [s.name(), s]));
|
|
53
|
+
const placed = new Set();
|
|
54
|
+
for (const { title, names } of groups) {
|
|
55
|
+
const subs = names
|
|
56
|
+
.map((n) => byName.get(n))
|
|
57
|
+
.filter((s) => s !== undefined);
|
|
58
|
+
if (subs.length === 0)
|
|
59
|
+
continue;
|
|
60
|
+
subs.forEach((s) => placed.add(s.name()));
|
|
61
|
+
output = output.concat([`${title}:`, formatList(subs.map(renderCommand)), '']);
|
|
62
|
+
}
|
|
63
|
+
const remaining = visibleCommands.filter((s) => !placed.has(s.name()));
|
|
64
|
+
if (remaining.length > 0) {
|
|
65
|
+
output = output.concat(['Commands:', formatList(remaining.map(renderCommand)), '']);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (visibleCommands.length > 0) {
|
|
69
|
+
output = output.concat(['Commands:', formatList(visibleCommands.map(renderCommand)), '']);
|
|
32
70
|
}
|
|
33
71
|
const optionList = helper.visibleOptions(cmd).map((option) => {
|
|
34
72
|
return formatItem(helper.optionTerm(option), helper.optionDescription(option));
|
|
@@ -46,6 +84,7 @@ function formatHelpCommandsFirst(cmd, helper) {
|
|
|
46
84
|
}
|
|
47
85
|
return output.join('\n');
|
|
48
86
|
}
|
|
87
|
+
/** Recursively apply help conventions (-h flag, no help subcommand, custom formatter). */
|
|
49
88
|
function applyHelpConventionsRecursive(cmd) {
|
|
50
89
|
cmd
|
|
51
90
|
.helpOption('-h, --help', 'Show help')
|
|
@@ -57,7 +96,7 @@ function applyHelpConventionsRecursive(cmd) {
|
|
|
57
96
|
applyHelpConventionsRecursive(subcommand);
|
|
58
97
|
}
|
|
59
98
|
}
|
|
99
|
+
/** Apply standardized help formatting to the root command and all subcommands. */
|
|
60
100
|
export function applyGlobalHelpConventions(root) {
|
|
61
101
|
applyHelpConventionsRecursive(root);
|
|
62
102
|
}
|
|
63
|
-
//# sourceMappingURL=help.js.map
|