@phnx-labs/agents-cli 1.12.0 → 1.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -1
- package/README.md +308 -297
- package/dist/commands/alias.d.ts +11 -0
- package/dist/commands/alias.js +117 -0
- package/dist/commands/beta.d.ts +2 -0
- package/dist/commands/beta.js +53 -0
- package/dist/commands/cloud.d.ts +10 -0
- package/dist/commands/cloud.js +408 -0
- package/dist/commands/commands.d.ts +9 -1
- package/dist/commands/commands.js +24 -172
- package/dist/commands/daemon.d.ts +8 -1
- package/dist/commands/daemon.js +13 -5
- package/dist/commands/doctor.d.ts +15 -0
- package/dist/commands/doctor.js +132 -0
- package/dist/commands/drive.d.ts +8 -1
- package/dist/commands/drive.js +20 -3
- package/dist/commands/exec.d.ts +8 -1
- package/dist/commands/exec.js +207 -20
- package/dist/commands/factory.d.ts +19 -0
- package/dist/commands/factory.js +71 -0
- package/dist/commands/fork.d.ts +8 -1
- package/dist/commands/fork.js +11 -4
- package/dist/commands/hooks.d.ts +9 -1
- package/dist/commands/hooks.js +30 -182
- package/dist/commands/init.d.ts +15 -1
- package/dist/commands/init.js +168 -74
- package/dist/commands/mcp.d.ts +9 -1
- package/dist/commands/mcp.js +11 -7
- package/dist/commands/models.d.ts +8 -1
- package/dist/commands/models.js +45 -6
- package/dist/commands/packages.d.ts +8 -1
- package/dist/commands/packages.js +13 -7
- package/dist/commands/permissions.d.ts +9 -1
- package/dist/commands/permissions.js +3 -3
- package/dist/commands/plugins.d.ts +8 -1
- package/dist/commands/plugins.js +13 -2
- package/dist/commands/profiles.d.ts +11 -0
- package/dist/commands/profiles.js +291 -0
- package/dist/commands/prune.d.ts +22 -0
- package/dist/commands/prune.js +191 -0
- package/dist/commands/pty.d.ts +1 -1
- package/dist/commands/pty.js +2 -1
- package/dist/commands/pull.d.ts +8 -1
- package/dist/commands/pull.js +93 -129
- package/dist/commands/refresh-memory.d.ts +7 -1
- package/dist/commands/refresh-memory.js +7 -1
- package/dist/commands/repo.d.ts +15 -0
- package/dist/commands/repo.js +570 -0
- package/dist/commands/resource-view.d.ts +10 -3
- package/dist/commands/resource-view.js +18 -5
- package/dist/commands/routines.d.ts +8 -1
- package/dist/commands/routines.js +17 -4
- package/dist/commands/rules.d.ts +9 -1
- package/dist/commands/rules.js +16 -11
- package/dist/commands/secrets.d.ts +10 -0
- package/dist/commands/secrets.js +518 -0
- package/dist/commands/sessions-picker.d.ts +2 -1
- package/dist/commands/sessions-picker.js +88 -11
- package/dist/commands/sessions-tail.d.ts +19 -0
- package/dist/commands/sessions-tail.js +235 -0
- package/dist/commands/sessions.d.ts +2 -1
- package/dist/commands/sessions.js +288 -7
- package/dist/commands/skills.d.ts +9 -1
- package/dist/commands/skills.js +28 -178
- package/dist/commands/status.d.ts +7 -1
- package/dist/commands/status.js +7 -1
- package/dist/commands/subagents.d.ts +8 -1
- package/dist/commands/subagents.js +11 -1
- package/dist/commands/sync.d.ts +8 -1
- package/dist/commands/sync.js +8 -1
- package/dist/commands/teams-picker.d.ts +4 -1
- package/dist/commands/teams-picker.js +55 -3
- package/dist/commands/teams.d.ts +15 -1
- package/dist/commands/teams.js +323 -69
- package/dist/commands/usage.d.ts +11 -0
- package/dist/commands/usage.js +60 -0
- package/dist/commands/utils.d.ts +6 -1
- package/dist/commands/utils.js +6 -1
- package/dist/commands/versions.d.ts +8 -1
- package/dist/commands/versions.js +4 -3
- package/dist/commands/view.d.ts +47 -2
- package/dist/commands/view.js +353 -20
- package/dist/index.d.ts +7 -2
- package/dist/index.js +205 -38
- package/dist/lib/acp/client.d.ts +31 -0
- package/dist/lib/acp/client.js +117 -0
- package/dist/lib/acp/harnesses.d.ts +26 -0
- package/dist/lib/acp/harnesses.js +65 -0
- package/dist/lib/acp/run.d.ts +18 -0
- package/dist/lib/acp/run.js +39 -0
- package/dist/lib/agents.d.ts +74 -2
- package/dist/lib/agents.js +207 -23
- package/dist/lib/artifact-actions.d.ts +8 -4
- package/dist/lib/artifact-actions.js +8 -6
- package/dist/lib/auto-pull-worker.d.ts +11 -0
- package/dist/lib/auto-pull-worker.js +121 -0
- package/dist/lib/auto-pull.d.ts +31 -0
- package/dist/lib/auto-pull.js +97 -0
- package/dist/lib/beta.d.ts +23 -0
- package/dist/lib/beta.js +90 -0
- package/dist/lib/capabilities.d.ts +29 -0
- package/dist/lib/capabilities.js +74 -0
- package/dist/lib/cloud/codex.d.ts +25 -0
- package/dist/lib/cloud/codex.js +250 -0
- package/dist/lib/cloud/factory.d.ts +31 -0
- package/dist/lib/cloud/factory.js +53 -0
- package/dist/lib/cloud/registry.d.ts +15 -0
- package/dist/lib/cloud/registry.js +67 -0
- package/dist/lib/cloud/rush.d.ts +75 -0
- package/dist/lib/cloud/rush.js +438 -0
- package/dist/lib/cloud/store.d.ts +22 -0
- package/dist/lib/cloud/store.js +115 -0
- package/dist/lib/cloud/stream.d.ts +23 -0
- package/dist/lib/cloud/stream.js +194 -0
- package/dist/lib/cloud/types.d.ts +205 -0
- package/dist/lib/cloud/types.js +34 -0
- package/dist/lib/command-skills.d.ts +20 -0
- package/dist/lib/command-skills.js +142 -0
- package/dist/lib/commands.d.ts +22 -2
- package/dist/lib/commands.js +51 -11
- package/dist/lib/convert.d.ts +10 -1
- package/dist/lib/convert.js +9 -1
- package/dist/lib/daemon.d.ts +21 -1
- package/dist/lib/daemon.js +97 -4
- package/dist/lib/drive-sync.d.ts +18 -1
- package/dist/lib/drive-sync.js +57 -15
- package/dist/lib/exec.d.ts +25 -5
- package/dist/lib/exec.js +72 -27
- package/dist/lib/fs-walk.d.ts +2 -0
- package/dist/lib/fs-walk.js +40 -0
- package/dist/lib/fuzzy.d.ts +53 -0
- package/dist/lib/fuzzy.js +72 -0
- package/dist/lib/gemini-settings.d.ts +4 -0
- package/dist/lib/gemini-settings.js +33 -0
- package/dist/lib/git.d.ts +12 -2
- package/dist/lib/git.js +17 -6
- package/dist/lib/help.d.ts +20 -1
- package/dist/lib/help.js +45 -6
- package/dist/lib/hooks/match.d.ts +32 -0
- package/dist/lib/hooks/match.js +120 -0
- package/dist/lib/hooks.d.ts +17 -4
- package/dist/lib/hooks.js +191 -21
- package/dist/lib/manifest.d.ts +6 -1
- package/dist/lib/manifest.js +15 -4
- package/dist/lib/markdown.d.ts +0 -1
- package/dist/lib/markdown.js +6 -1
- package/dist/lib/mcp.d.ts +0 -1
- package/dist/lib/mcp.js +29 -33
- package/dist/lib/memory-compile.d.ts +13 -3
- package/dist/lib/memory-compile.js +31 -9
- package/dist/lib/memory.d.ts +14 -7
- package/dist/lib/memory.js +67 -38
- package/dist/lib/migrate.d.ts +8 -0
- package/dist/lib/migrate.js +85 -0
- package/dist/lib/models.d.ts +25 -11
- package/dist/lib/models.js +405 -16
- package/dist/lib/onepassword.d.ts +63 -0
- package/dist/lib/onepassword.js +186 -0
- package/dist/lib/paths.d.ts +8 -0
- package/dist/lib/paths.js +20 -0
- package/dist/lib/permissions.d.ts +24 -2
- package/dist/lib/permissions.js +117 -48
- package/dist/lib/picker.d.ts +10 -1
- package/dist/lib/picker.js +15 -1
- package/dist/lib/plugins.d.ts +7 -1
- package/dist/lib/plugins.js +10 -1
- package/dist/lib/profiles-presets.d.ts +24 -0
- package/dist/lib/profiles-presets.js +103 -0
- package/dist/lib/profiles.d.ts +69 -0
- package/dist/lib/profiles.js +144 -0
- package/dist/lib/pty-client.d.ts +1 -1
- package/dist/lib/pty-client.js +0 -1
- package/dist/lib/pty-server.d.ts +16 -2
- package/dist/lib/pty-server.js +92 -3
- package/dist/lib/registry.d.ts +23 -3
- package/dist/lib/registry.js +153 -8
- package/dist/lib/resources.d.ts +28 -1
- package/dist/lib/resources.js +79 -1
- package/dist/lib/rotate.d.ts +89 -0
- package/dist/lib/rotate.js +327 -0
- package/dist/lib/routines.d.ts +29 -1
- package/dist/lib/routines.js +32 -5
- package/dist/lib/runner.d.ts +14 -1
- package/dist/lib/runner.js +22 -3
- package/dist/lib/sandbox.d.ts +16 -1
- package/dist/lib/sandbox.js +39 -16
- package/dist/lib/scheduler.d.ts +8 -1
- package/dist/lib/scheduler.js +8 -1
- package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
- package/dist/lib/secrets/bundles.d.ts +39 -0
- package/dist/lib/secrets/bundles.js +189 -0
- package/dist/lib/secrets/index.d.ts +55 -0
- package/dist/lib/secrets/index.js +211 -0
- package/dist/lib/secrets/profiles.d.ts +10 -0
- package/dist/lib/secrets/profiles.js +13 -0
- package/dist/lib/session/active.d.ts +43 -0
- package/dist/lib/session/active.js +392 -0
- package/dist/lib/session/artifacts.d.ts +16 -0
- package/dist/lib/session/artifacts.js +95 -0
- package/dist/lib/session/cloud.d.ts +30 -0
- package/dist/lib/session/cloud.js +121 -0
- package/dist/lib/session/db.d.ts +23 -2
- package/dist/lib/session/db.js +76 -12
- package/dist/lib/session/discover.d.ts +19 -4
- package/dist/lib/session/discover.js +344 -48
- package/dist/lib/session/parse.d.ts +28 -1
- package/dist/lib/session/parse.js +267 -9
- package/dist/lib/session/prompt.d.ts +9 -1
- package/dist/lib/session/prompt.js +17 -3
- package/dist/lib/session/render.d.ts +13 -1
- package/dist/lib/session/render.js +20 -1
- package/dist/lib/session/team-filter.d.ts +9 -1
- package/dist/lib/session/team-filter.js +11 -2
- package/dist/lib/session/types.d.ts +24 -2
- package/dist/lib/session/types.js +10 -2
- package/dist/lib/shims.d.ts +93 -5
- package/dist/lib/shims.js +380 -67
- package/dist/lib/skills.d.ts +27 -2
- package/dist/lib/skills.js +127 -65
- package/dist/lib/sqlite.d.ts +43 -0
- package/dist/lib/sqlite.js +94 -0
- package/dist/lib/state.d.ts +114 -22
- package/dist/lib/state.js +323 -138
- package/dist/lib/subagents.d.ts +9 -1
- package/dist/lib/subagents.js +70 -63
- package/dist/lib/sync-manifest.d.ts +81 -0
- package/dist/lib/sync-manifest.js +450 -0
- package/dist/lib/teams/agents.d.ts +103 -5
- package/dist/lib/teams/agents.js +414 -91
- package/dist/lib/teams/api.d.ts +26 -3
- package/dist/lib/teams/api.js +63 -3
- package/dist/lib/teams/debug.d.ts +6 -1
- package/dist/lib/teams/debug.js +6 -1
- package/dist/lib/teams/file_ops.d.ts +7 -1
- package/dist/lib/teams/file_ops.js +7 -1
- package/dist/lib/teams/index.d.ts +15 -0
- package/dist/lib/teams/index.js +14 -0
- package/dist/lib/teams/parsers.d.ts +4 -1
- package/dist/lib/teams/parsers.js +11 -1
- package/dist/lib/teams/persistence.d.ts +15 -1
- package/dist/lib/teams/persistence.js +102 -20
- package/dist/lib/teams/registry.d.ts +12 -1
- package/dist/lib/teams/registry.js +116 -33
- package/dist/lib/teams/summarizer.d.ts +15 -1
- package/dist/lib/teams/summarizer.js +14 -1
- package/dist/lib/teams/supervisor.d.ts +48 -0
- package/dist/lib/teams/supervisor.js +73 -0
- package/dist/lib/template.d.ts +8 -6
- package/dist/lib/template.js +8 -6
- package/dist/lib/types.d.ts +147 -8
- package/dist/lib/types.js +26 -3
- package/dist/lib/usage.d.ts +48 -1
- package/dist/lib/usage.js +97 -16
- package/dist/lib/version-duplicates.d.ts +21 -0
- package/dist/lib/version-duplicates.js +90 -0
- package/dist/lib/versions.d.ts +39 -4
- package/dist/lib/versions.js +401 -111
- package/package.json +33 -18
- package/scripts/postinstall.js +126 -30
- package/dist/commands/__tests__/sessions.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions.test.js +0 -636
- package/dist/commands/__tests__/sessions.test.js.map +0 -1
- package/dist/commands/commands.d.ts.map +0 -1
- package/dist/commands/commands.js.map +0 -1
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/fork.d.ts.map +0 -1
- package/dist/commands/fork.js.map +0 -1
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/packages.d.ts.map +0 -1
- package/dist/commands/packages.js.map +0 -1
- package/dist/commands/permissions.d.ts.map +0 -1
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/pty.d.ts.map +0 -1
- package/dist/commands/pty.js.map +0 -1
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -3
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -180
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/refresh-memory.d.ts.map +0 -1
- package/dist/commands/refresh-memory.js.map +0 -1
- package/dist/commands/resource-view.d.ts.map +0 -1
- package/dist/commands/resource-view.js.map +0 -1
- package/dist/commands/routines.d.ts.map +0 -1
- package/dist/commands/routines.js.map +0 -1
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/sessions-picker.d.ts.map +0 -1
- package/dist/commands/sessions-picker.js.map +0 -1
- package/dist/commands/sessions.d.ts.map +0 -1
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/subagents.d.ts.map +0 -1
- package/dist/commands/subagents.js.map +0 -1
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/teams-picker.d.ts.map +0 -1
- package/dist/commands/teams-picker.js.map +0 -1
- package/dist/commands/teams.d.ts.map +0 -1
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/commands/versions.d.ts.map +0 -1
- package/dist/commands/versions.js.map +0 -1
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
- package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.js +0 -192
- package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
- package/dist/lib/__tests__/exec.test.d.ts +0 -2
- package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
- package/dist/lib/__tests__/exec.test.js +0 -446
- package/dist/lib/__tests__/exec.test.js.map +0 -1
- package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
- package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
- package/dist/lib/__tests__/git-sync.test.js +0 -138
- package/dist/lib/__tests__/git-sync.test.js.map +0 -1
- package/dist/lib/__tests__/hooks.test.d.ts +0 -2
- package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
- package/dist/lib/__tests__/hooks.test.js +0 -203
- package/dist/lib/__tests__/hooks.test.js.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
- package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.js +0 -95
- package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
- package/dist/lib/__tests__/models.test.d.ts +0 -2
- package/dist/lib/__tests__/models.test.d.ts.map +0 -1
- package/dist/lib/__tests__/models.test.js +0 -184
- package/dist/lib/__tests__/models.test.js.map +0 -1
- package/dist/lib/__tests__/usage.test.d.ts +0 -2
- package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
- package/dist/lib/__tests__/usage.test.js +0 -218
- package/dist/lib/__tests__/usage.test.js.map +0 -1
- package/dist/lib/agents.d.ts.map +0 -1
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/artifact-actions.d.ts.map +0 -1
- package/dist/lib/artifact-actions.js.map +0 -1
- package/dist/lib/commands.d.ts.map +0 -1
- package/dist/lib/commands.js.map +0 -1
- package/dist/lib/convert.d.ts.map +0 -1
- package/dist/lib/convert.js.map +0 -1
- package/dist/lib/daemon.d.ts.map +0 -1
- package/dist/lib/daemon.js.map +0 -1
- package/dist/lib/drive-sync.d.ts.map +0 -1
- package/dist/lib/drive-sync.js.map +0 -1
- package/dist/lib/exec.d.ts.map +0 -1
- package/dist/lib/exec.js.map +0 -1
- package/dist/lib/factory.d.ts +0 -57
- package/dist/lib/factory.d.ts.map +0 -1
- package/dist/lib/factory.js +0 -110
- package/dist/lib/factory.js.map +0 -1
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/help.d.ts.map +0 -1
- package/dist/lib/help.js.map +0 -1
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/manifest.d.ts.map +0 -1
- package/dist/lib/manifest.js.map +0 -1
- package/dist/lib/markdown.d.ts.map +0 -1
- package/dist/lib/markdown.js.map +0 -1
- package/dist/lib/mcp.d.ts.map +0 -1
- package/dist/lib/mcp.js.map +0 -1
- package/dist/lib/memory-compile.d.ts.map +0 -1
- package/dist/lib/memory-compile.js.map +0 -1
- package/dist/lib/memory.d.ts.map +0 -1
- package/dist/lib/memory.js.map +0 -1
- package/dist/lib/models.d.ts.map +0 -1
- package/dist/lib/models.js.map +0 -1
- package/dist/lib/permissions.d.ts.map +0 -1
- package/dist/lib/permissions.js.map +0 -1
- package/dist/lib/picker.d.ts.map +0 -1
- package/dist/lib/picker.js.map +0 -1
- package/dist/lib/plugins.d.ts.map +0 -1
- package/dist/lib/plugins.js.map +0 -1
- package/dist/lib/pty-client.d.ts.map +0 -1
- package/dist/lib/pty-client.js.map +0 -1
- package/dist/lib/pty-server.d.ts.map +0 -1
- package/dist/lib/pty-server.js.map +0 -1
- package/dist/lib/registry.d.ts.map +0 -1
- package/dist/lib/registry.js.map +0 -1
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.js.map +0 -1
- package/dist/lib/routines.d.ts.map +0 -1
- package/dist/lib/routines.js.map +0 -1
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.js.map +0 -1
- package/dist/lib/sandbox.d.ts.map +0 -1
- package/dist/lib/sandbox.js.map +0 -1
- package/dist/lib/scheduler.d.ts.map +0 -1
- package/dist/lib/scheduler.js.map +0 -1
- package/dist/lib/session/__tests__/db.test.d.ts +0 -2
- package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/db.test.js +0 -54
- package/dist/lib/session/__tests__/db.test.js.map +0 -1
- package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
- package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/discover.test.js +0 -63
- package/dist/lib/session/__tests__/discover.test.js.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
- package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.js +0 -44
- package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
- package/dist/lib/session/__tests__/render.test.d.ts +0 -2
- package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/render.test.js +0 -602
- package/dist/lib/session/__tests__/render.test.js.map +0 -1
- package/dist/lib/session/db.d.ts.map +0 -1
- package/dist/lib/session/db.js.map +0 -1
- package/dist/lib/session/discover.d.ts.map +0 -1
- package/dist/lib/session/discover.js.map +0 -1
- package/dist/lib/session/parse.d.ts.map +0 -1
- package/dist/lib/session/parse.js.map +0 -1
- package/dist/lib/session/prompt.d.ts.map +0 -1
- package/dist/lib/session/prompt.js.map +0 -1
- package/dist/lib/session/prompt.test.d.ts +0 -2
- package/dist/lib/session/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/prompt.test.js +0 -57
- package/dist/lib/session/prompt.test.js.map +0 -1
- package/dist/lib/session/render.d.ts.map +0 -1
- package/dist/lib/session/render.js.map +0 -1
- package/dist/lib/session/team-filter.d.ts.map +0 -1
- package/dist/lib/session/team-filter.js.map +0 -1
- package/dist/lib/session/team-filter.test.d.ts +0 -2
- package/dist/lib/session/team-filter.test.d.ts.map +0 -1
- package/dist/lib/session/team-filter.test.js +0 -157
- package/dist/lib/session/team-filter.test.js.map +0 -1
- package/dist/lib/session/types.d.ts.map +0 -1
- package/dist/lib/session/types.js.map +0 -1
- package/dist/lib/shims.d.ts.map +0 -1
- package/dist/lib/shims.js.map +0 -1
- package/dist/lib/skills.d.ts.map +0 -1
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/subagents.d.ts.map +0 -1
- package/dist/lib/subagents.js.map +0 -1
- package/dist/lib/teams/agents.d.ts.map +0 -1
- package/dist/lib/teams/agents.js.map +0 -1
- package/dist/lib/teams/api.d.ts.map +0 -1
- package/dist/lib/teams/api.js.map +0 -1
- package/dist/lib/teams/cloud.d.ts +0 -11
- package/dist/lib/teams/cloud.d.ts.map +0 -1
- package/dist/lib/teams/cloud.js +0 -169
- package/dist/lib/teams/cloud.js.map +0 -1
- package/dist/lib/teams/debug.d.ts.map +0 -1
- package/dist/lib/teams/debug.js.map +0 -1
- package/dist/lib/teams/file_ops.d.ts.map +0 -1
- package/dist/lib/teams/file_ops.js.map +0 -1
- package/dist/lib/teams/parsers.d.ts.map +0 -1
- package/dist/lib/teams/parsers.js.map +0 -1
- package/dist/lib/teams/persistence.d.ts.map +0 -1
- package/dist/lib/teams/persistence.js.map +0 -1
- package/dist/lib/teams/ralph.d.ts +0 -8
- package/dist/lib/teams/ralph.d.ts.map +0 -1
- package/dist/lib/teams/ralph.js +0 -59
- package/dist/lib/teams/ralph.js.map +0 -1
- package/dist/lib/teams/registry.d.ts.map +0 -1
- package/dist/lib/teams/registry.js.map +0 -1
- package/dist/lib/teams/summarizer.d.ts.map +0 -1
- package/dist/lib/teams/summarizer.js.map +0 -1
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/usage.d.ts.map +0 -1
- package/dist/lib/usage.js.map +0 -1
- package/dist/lib/versions.d.ts.map +0 -1
- package/dist/lib/versions.js.map +0 -1
- package/scripts/rebuild-sqlite.sh +0 -46
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets bundle management commands.
|
|
3
|
+
*
|
|
4
|
+
* Registers the `agents secrets` command tree for creating, viewing,
|
|
5
|
+
* and managing named bundles of environment variables backed by macOS
|
|
6
|
+
* Keychain. Bundles are injected at run time via `agents run --secrets`.
|
|
7
|
+
*/
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import { bundleExists, deleteBundle, describeBundle, keychainItemsForBundle, keychainRef, listBundles, parseDotenv, readBundle, validateBundleName, validateEnvKey, writeBundle, } from '../lib/secrets/bundles.js';
|
|
11
|
+
import { deleteKeychainToken, getKeychainToken, hasKeychainToken, secretsKeychainItem, setKeychainToken, } from '../lib/secrets/index.js';
|
|
12
|
+
import { registerCommandGroups } from '../lib/help.js';
|
|
13
|
+
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
14
|
+
/** Prompt the user for a secret value with masked input. Requires an interactive TTY. */
|
|
15
|
+
async function promptForSecret(message) {
|
|
16
|
+
if (!isInteractiveTerminal()) {
|
|
17
|
+
throw new Error('A secret is required but the shell is not interactive. Pass --value, --value-stdin, or run from a TTY.');
|
|
18
|
+
}
|
|
19
|
+
const { password } = await import('@inquirer/prompts');
|
|
20
|
+
return await password({ message, mask: true });
|
|
21
|
+
}
|
|
22
|
+
/** Prompt the user to pick an existing bundle by name. Requires an interactive TTY. */
|
|
23
|
+
async function pickBundleName(action) {
|
|
24
|
+
const bundles = listBundles();
|
|
25
|
+
if (bundles.length === 0) {
|
|
26
|
+
throw new Error('No secrets bundles configured. Try: agents secrets create <name>');
|
|
27
|
+
}
|
|
28
|
+
if (!isInteractiveTerminal()) {
|
|
29
|
+
throw new Error('A bundle name is required. Pass it as an argument or run from a TTY.');
|
|
30
|
+
}
|
|
31
|
+
const { select } = await import('@inquirer/prompts');
|
|
32
|
+
return await select({
|
|
33
|
+
message: `Which bundle to ${action}?`,
|
|
34
|
+
choices: bundles.map((b) => ({
|
|
35
|
+
name: b.name,
|
|
36
|
+
value: b.name,
|
|
37
|
+
description: b.description || undefined,
|
|
38
|
+
})),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Prompt the user to type a new bundle name. Requires an interactive TTY. */
|
|
42
|
+
async function promptBundleName() {
|
|
43
|
+
if (!isInteractiveTerminal()) {
|
|
44
|
+
throw new Error('A bundle name is required. Pass it as an argument or run from a TTY.');
|
|
45
|
+
}
|
|
46
|
+
const { input } = await import('@inquirer/prompts');
|
|
47
|
+
return await input({
|
|
48
|
+
message: 'Bundle name',
|
|
49
|
+
validate: (value) => {
|
|
50
|
+
try {
|
|
51
|
+
validateBundleName(value);
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return err.message;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/** Prompt the user to pick an existing key from a bundle. Requires an interactive TTY. */
|
|
61
|
+
async function pickKey(bundle, action) {
|
|
62
|
+
const keys = Object.keys(bundle.vars);
|
|
63
|
+
if (keys.length === 0) {
|
|
64
|
+
throw new Error(`Bundle '${bundle.name}' has no keys.`);
|
|
65
|
+
}
|
|
66
|
+
if (!isInteractiveTerminal()) {
|
|
67
|
+
throw new Error('A key name is required. Pass it as an argument or run from a TTY.');
|
|
68
|
+
}
|
|
69
|
+
const { select } = await import('@inquirer/prompts');
|
|
70
|
+
return await select({
|
|
71
|
+
message: `Which key to ${action}?`,
|
|
72
|
+
choices: keys.map((k) => ({ name: k, value: k })),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Prompt the user to type a new key name for a bundle. Requires an interactive TTY. */
|
|
76
|
+
async function promptKeyName(bundleName) {
|
|
77
|
+
if (!isInteractiveTerminal()) {
|
|
78
|
+
throw new Error('A key name is required. Pass it as an argument or run from a TTY.');
|
|
79
|
+
}
|
|
80
|
+
const { input } = await import('@inquirer/prompts');
|
|
81
|
+
return await input({
|
|
82
|
+
message: `Key name to add to '${bundleName}'`,
|
|
83
|
+
validate: (value) => {
|
|
84
|
+
try {
|
|
85
|
+
validateEnvKey(value);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return err.message;
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** Read all available data from stdin synchronously, trimmed. */
|
|
95
|
+
function readStdinSync() {
|
|
96
|
+
const chunks = [];
|
|
97
|
+
const buf = Buffer.alloc(65536);
|
|
98
|
+
while (true) {
|
|
99
|
+
let bytesRead;
|
|
100
|
+
try {
|
|
101
|
+
bytesRead = fs.readSync(0, buf, 0, buf.length, null);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
if (bytesRead === 0)
|
|
107
|
+
break;
|
|
108
|
+
chunks.push(Buffer.from(buf.subarray(0, bytesRead)));
|
|
109
|
+
}
|
|
110
|
+
return Buffer.concat(chunks).toString('utf-8').trim();
|
|
111
|
+
}
|
|
112
|
+
/** Format a single bundle as a table row for the `secrets list` output. */
|
|
113
|
+
function renderBundleRow(b) {
|
|
114
|
+
const entries = describeBundle(b);
|
|
115
|
+
const keys = entries.length;
|
|
116
|
+
const sensitive = entries.filter((e) => e.kind === 'keychain').length;
|
|
117
|
+
return `${chalk.cyan(b.name.padEnd(20))} ${String(keys).padEnd(6)} ${chalk.yellow(String(sensitive).padEnd(10))} ${chalk.gray(b.description || '')}`;
|
|
118
|
+
}
|
|
119
|
+
/** Colorize a variable source kind (literal, keychain, env, file, exec). */
|
|
120
|
+
function kindLabel(kind) {
|
|
121
|
+
switch (kind) {
|
|
122
|
+
case 'literal': return chalk.gray('literal');
|
|
123
|
+
case 'keychain': return chalk.green('keychain');
|
|
124
|
+
case 'env': return chalk.blue('env');
|
|
125
|
+
case 'file': return chalk.magenta('file');
|
|
126
|
+
case 'exec': return chalk.red('exec');
|
|
127
|
+
default: return kind;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Mask a value with asterisks unless reveal is true. */
|
|
131
|
+
function redact(value, reveal) {
|
|
132
|
+
if (reveal)
|
|
133
|
+
return value;
|
|
134
|
+
if (!value)
|
|
135
|
+
return '';
|
|
136
|
+
return '*'.repeat(Math.min(value.length, 8));
|
|
137
|
+
}
|
|
138
|
+
/** Register the `agents secrets` command tree. */
|
|
139
|
+
export function registerSecretsCommands(program) {
|
|
140
|
+
const cmd = program
|
|
141
|
+
.command('secrets')
|
|
142
|
+
.description('Named bundles of env variables backed by macOS Keychain (with optional iCloud sync). Inject into agents via `agents run --secrets <name>`.')
|
|
143
|
+
.addHelpText('after', `
|
|
144
|
+
Workflow:
|
|
145
|
+
Bundles are containers; secrets are the variables inside them. Create a
|
|
146
|
+
bundle once, add secrets to it, then inject the whole bundle into any agent
|
|
147
|
+
run with --secrets <name>. Keychain-backed values never touch disk in
|
|
148
|
+
plaintext.
|
|
149
|
+
|
|
150
|
+
Pass --icloud-sync at create time to store values in the iCloud-synced
|
|
151
|
+
keychain so they appear automatically on your other Macs (same iCloud
|
|
152
|
+
account, iCloud Keychain enabled). Without the flag, values are device-local.
|
|
153
|
+
|
|
154
|
+
Examples:
|
|
155
|
+
# Create a bundle for production credentials
|
|
156
|
+
agents secrets create prod --description "Production keys for the api stack"
|
|
157
|
+
|
|
158
|
+
# Create a bundle that syncs to your other Macs via iCloud Keychain
|
|
159
|
+
agents secrets create npm-tokens --icloud-sync
|
|
160
|
+
|
|
161
|
+
# Add a keychain-backed secret (prompts for the value)
|
|
162
|
+
agents secrets add prod STRIPE_API_KEY
|
|
163
|
+
|
|
164
|
+
# Add a literal (non-sensitive) value
|
|
165
|
+
agents secrets add prod LOG_LEVEL --value info
|
|
166
|
+
|
|
167
|
+
# Import an entire .env file straight into keychain
|
|
168
|
+
agents secrets import prod --from .env.prod
|
|
169
|
+
|
|
170
|
+
# See what's in a bundle (values masked)
|
|
171
|
+
agents secrets view prod
|
|
172
|
+
|
|
173
|
+
# Reveal the real values in an interactive shell
|
|
174
|
+
agents secrets view prod --reveal
|
|
175
|
+
|
|
176
|
+
# Inject the bundle into an agent run
|
|
177
|
+
agents run claude "deploy the worker" --secrets prod
|
|
178
|
+
|
|
179
|
+
# Eval the bundle into your current shell
|
|
180
|
+
eval "$(agents secrets export prod --plaintext)"
|
|
181
|
+
|
|
182
|
+
# Remove one key (purges the keychain item by default)
|
|
183
|
+
agents secrets remove prod STRIPE_API_KEY
|
|
184
|
+
|
|
185
|
+
# Delete the whole bundle and purge every keychain item it owned
|
|
186
|
+
agents secrets delete prod
|
|
187
|
+
`);
|
|
188
|
+
registerCommandGroups(cmd, [
|
|
189
|
+
{ title: 'Bundle commands', names: ['list', 'view', 'create', 'delete'] },
|
|
190
|
+
{ title: 'Secret commands', names: ['add', 'remove', 'import', 'export'] },
|
|
191
|
+
]);
|
|
192
|
+
cmd
|
|
193
|
+
.command('list')
|
|
194
|
+
.alias('ls')
|
|
195
|
+
.description('List configured secrets bundles')
|
|
196
|
+
.action(() => {
|
|
197
|
+
const bundles = listBundles();
|
|
198
|
+
if (bundles.length === 0) {
|
|
199
|
+
console.log(chalk.gray('No secrets bundles configured.'));
|
|
200
|
+
console.log(chalk.gray('Try: agents secrets create <name>'));
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
console.log(chalk.bold(`${'NAME'.padEnd(20)} ${'KEYS'.padEnd(6)} ${'SENSITIVE'.padEnd(10)} DESCRIPTION`));
|
|
204
|
+
for (const b of bundles) {
|
|
205
|
+
console.log(renderBundleRow(b));
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
cmd
|
|
209
|
+
.command('view [name]')
|
|
210
|
+
.alias('show')
|
|
211
|
+
.description('Show a bundle. Keychain values are masked by default — pass --reveal to see them.')
|
|
212
|
+
.option('--reveal', 'Print keychain-backed values in the clear (TTY only unless --plaintext)')
|
|
213
|
+
.option('--plaintext', 'Allow --reveal in non-interactive shells (use with care)')
|
|
214
|
+
.action(async (name, opts) => {
|
|
215
|
+
try {
|
|
216
|
+
const resolvedName = name ?? (await pickBundleName('view'));
|
|
217
|
+
const bundle = readBundle(resolvedName);
|
|
218
|
+
const entries = describeBundle(bundle);
|
|
219
|
+
console.log(chalk.bold(bundle.name));
|
|
220
|
+
if (bundle.description)
|
|
221
|
+
console.log(chalk.gray(bundle.description));
|
|
222
|
+
if (bundle.allow_exec)
|
|
223
|
+
console.log(chalk.yellow('allow_exec: true'));
|
|
224
|
+
if (bundle.icloud_sync)
|
|
225
|
+
console.log(chalk.cyan('icloud_sync: true'));
|
|
226
|
+
console.log();
|
|
227
|
+
if (entries.length === 0) {
|
|
228
|
+
console.log(chalk.gray('(no keys)'));
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const reveal = Boolean(opts.reveal);
|
|
232
|
+
if (reveal && !isInteractiveTerminal() && !opts.plaintext) {
|
|
233
|
+
console.error(chalk.red('--reveal in a non-TTY requires --plaintext.'));
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
for (const e of entries) {
|
|
237
|
+
if (e.kind === 'keychain') {
|
|
238
|
+
const item = secretsKeychainItem(bundle.name, e.detail);
|
|
239
|
+
const stored = hasKeychainToken(item, bundle.icloud_sync);
|
|
240
|
+
const marker = stored ? chalk.green('stored') : chalk.red('missing');
|
|
241
|
+
let valueCol = `[keychain:${e.detail}] ${marker}`;
|
|
242
|
+
if (reveal && stored) {
|
|
243
|
+
try {
|
|
244
|
+
valueCol = redact(getKeychainToken(item, bundle.icloud_sync), true);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// fall through to masked
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
console.log(` ${chalk.cyan(e.key.padEnd(28))} ${kindLabel(e.kind).padEnd(18)} ${valueCol}`);
|
|
251
|
+
}
|
|
252
|
+
else if (e.kind === 'literal') {
|
|
253
|
+
const raw = bundle.vars[e.key];
|
|
254
|
+
const literalValue = typeof raw === 'string'
|
|
255
|
+
? raw
|
|
256
|
+
: (raw && typeof raw === 'object' && 'value' in raw ? raw.value : '');
|
|
257
|
+
console.log(` ${chalk.cyan(e.key.padEnd(28))} ${kindLabel(e.kind).padEnd(18)} ${literalValue}`);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.log(` ${chalk.cyan(e.key.padEnd(28))} ${kindLabel(e.kind).padEnd(18)} ${e.detail}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
if (isPromptCancelled(err))
|
|
266
|
+
return;
|
|
267
|
+
console.error(chalk.red(err.message));
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
cmd
|
|
272
|
+
.command('create [name]')
|
|
273
|
+
.description('Create an empty bundle')
|
|
274
|
+
.option('--description <text>', 'Free-form description')
|
|
275
|
+
.option('--allow-exec', 'Allow exec: refs in this bundle (off by default)')
|
|
276
|
+
.option('--icloud-sync', 'Store keychain values in iCloud Keychain so they sync across your Macs (requires Xcode CLT)')
|
|
277
|
+
.option('--force', 'Overwrite an existing bundle')
|
|
278
|
+
.action(async (name, opts) => {
|
|
279
|
+
try {
|
|
280
|
+
const resolvedName = name ?? (await promptBundleName());
|
|
281
|
+
validateBundleName(resolvedName);
|
|
282
|
+
if (bundleExists(resolvedName) && !opts.force) {
|
|
283
|
+
console.error(chalk.red(`Bundle '${resolvedName}' already exists. Use --force to overwrite.`));
|
|
284
|
+
process.exit(1);
|
|
285
|
+
}
|
|
286
|
+
const bundle = {
|
|
287
|
+
name: resolvedName,
|
|
288
|
+
description: opts.description,
|
|
289
|
+
allow_exec: opts.allowExec,
|
|
290
|
+
icloud_sync: opts.icloudSync,
|
|
291
|
+
vars: {},
|
|
292
|
+
};
|
|
293
|
+
writeBundle(bundle);
|
|
294
|
+
console.log(chalk.green(`Bundle '${resolvedName}' created.`));
|
|
295
|
+
console.log(chalk.gray(`Try: agents secrets add ${resolvedName} MY_KEY`));
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
if (isPromptCancelled(err))
|
|
299
|
+
return;
|
|
300
|
+
console.error(chalk.red(err.message));
|
|
301
|
+
process.exit(1);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
cmd
|
|
305
|
+
.command('add [bundle] [key]')
|
|
306
|
+
.description('Add a variable to a bundle. Defaults to keychain-backed; pass --value for literal, --env/--file/--exec for refs.')
|
|
307
|
+
.option('--value <v>', 'Store as a plaintext literal in the YAML (non-sensitive values only)')
|
|
308
|
+
.option('--value-stdin', 'Read the value from stdin (stored in keychain unless combined with --value)')
|
|
309
|
+
.option('--env <VAR>', 'Store as an env: ref that reads from the parent process.env at run time')
|
|
310
|
+
.option('--file <path>', 'Store as a file: ref that reads from a file at run time')
|
|
311
|
+
.option('--exec <cmd>', 'Store as an exec: ref that runs a command at run time (requires allow_exec)')
|
|
312
|
+
.action(async (bundleName, key, opts) => {
|
|
313
|
+
try {
|
|
314
|
+
const resolvedBundleName = bundleName ?? (await pickBundleName('add to'));
|
|
315
|
+
const bundle = readBundle(resolvedBundleName);
|
|
316
|
+
const resolvedKey = key ?? (await promptKeyName(resolvedBundleName));
|
|
317
|
+
validateEnvKey(resolvedKey);
|
|
318
|
+
const sources = [opts.value !== undefined, Boolean(opts.env), Boolean(opts.file), Boolean(opts.exec)].filter(Boolean).length;
|
|
319
|
+
if (sources > 1) {
|
|
320
|
+
throw new Error('Pick one of: --value, --env, --file, --exec.');
|
|
321
|
+
}
|
|
322
|
+
if (opts.env) {
|
|
323
|
+
bundle.vars[resolvedKey] = `env:${opts.env}`;
|
|
324
|
+
writeBundle(bundle);
|
|
325
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> env:${opts.env}`));
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (opts.file) {
|
|
329
|
+
bundle.vars[resolvedKey] = `file:${opts.file}`;
|
|
330
|
+
writeBundle(bundle);
|
|
331
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> file:${opts.file}`));
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
if (opts.exec) {
|
|
335
|
+
if (!bundle.allow_exec) {
|
|
336
|
+
throw new Error(`Bundle '${resolvedBundleName}' does not allow exec refs. Re-create with --allow-exec.`);
|
|
337
|
+
}
|
|
338
|
+
bundle.vars[resolvedKey] = `exec:${opts.exec}`;
|
|
339
|
+
writeBundle(bundle);
|
|
340
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> exec:${opts.exec}`));
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
if (opts.value !== undefined) {
|
|
344
|
+
bundle.vars[resolvedKey] = { value: opts.value };
|
|
345
|
+
writeBundle(bundle);
|
|
346
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} = <literal>`));
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
// Default path: keychain-backed.
|
|
350
|
+
let secretValue;
|
|
351
|
+
if (opts.valueStdin) {
|
|
352
|
+
secretValue = readStdinSync();
|
|
353
|
+
if (!secretValue)
|
|
354
|
+
throw new Error('No value received on stdin.');
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
secretValue = await promptForSecret(`Enter value for ${resolvedBundleName}.${resolvedKey}`);
|
|
358
|
+
}
|
|
359
|
+
const item = secretsKeychainItem(resolvedBundleName, resolvedKey);
|
|
360
|
+
setKeychainToken(item, secretValue, bundle.icloud_sync);
|
|
361
|
+
bundle.vars[resolvedKey] = keychainRef(resolvedKey);
|
|
362
|
+
writeBundle(bundle);
|
|
363
|
+
const where = bundle.icloud_sync ? 'iCloud Keychain' : 'keychain';
|
|
364
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} stored in ${where} (${item}).`));
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
if (isPromptCancelled(err))
|
|
368
|
+
return;
|
|
369
|
+
console.error(chalk.red(err.message));
|
|
370
|
+
process.exit(1);
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
cmd
|
|
374
|
+
.command('remove [bundle] [key]')
|
|
375
|
+
.description('Remove a key from the bundle. Purges the keychain item if the ref was keychain:. Use --keep-secret to retain it.')
|
|
376
|
+
.option('--keep-secret', 'Leave the keychain item in place after removing the YAML ref')
|
|
377
|
+
.action(async (bundleName, key, opts) => {
|
|
378
|
+
try {
|
|
379
|
+
const resolvedBundleName = bundleName ?? (await pickBundleName('remove from'));
|
|
380
|
+
const bundle = readBundle(resolvedBundleName);
|
|
381
|
+
const resolvedKey = key ?? (await pickKey(bundle, 'remove'));
|
|
382
|
+
if (!(resolvedKey in bundle.vars)) {
|
|
383
|
+
console.error(chalk.red(`Key '${resolvedKey}' not found in bundle '${resolvedBundleName}'.`));
|
|
384
|
+
process.exit(1);
|
|
385
|
+
}
|
|
386
|
+
const raw = bundle.vars[resolvedKey];
|
|
387
|
+
delete bundle.vars[resolvedKey];
|
|
388
|
+
writeBundle(bundle);
|
|
389
|
+
if (!opts.keepSecret && typeof raw === 'string' && raw.startsWith('keychain:')) {
|
|
390
|
+
const item = secretsKeychainItem(resolvedBundleName, raw.slice('keychain:'.length));
|
|
391
|
+
const removed = deleteKeychainToken(item, bundle.icloud_sync);
|
|
392
|
+
if (removed) {
|
|
393
|
+
console.log(chalk.green(`Removed ${resolvedBundleName}.${resolvedKey} and purged keychain item.`));
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
console.log(chalk.green(`Removed ${resolvedBundleName}.${resolvedKey}.`));
|
|
398
|
+
}
|
|
399
|
+
catch (err) {
|
|
400
|
+
if (isPromptCancelled(err))
|
|
401
|
+
return;
|
|
402
|
+
console.error(chalk.red(err.message));
|
|
403
|
+
process.exit(1);
|
|
404
|
+
}
|
|
405
|
+
});
|
|
406
|
+
cmd
|
|
407
|
+
.command('delete [name]')
|
|
408
|
+
.description('Delete a bundle and purge all its keychain items (use --keep-secrets to retain them).')
|
|
409
|
+
.option('--keep-secrets', 'Leave keychain items in place after deleting the bundle file')
|
|
410
|
+
.option('-y, --yes', 'Skip the confirmation prompt')
|
|
411
|
+
.action(async (name, opts) => {
|
|
412
|
+
try {
|
|
413
|
+
const resolvedName = name ?? (await pickBundleName('delete'));
|
|
414
|
+
const bundle = readBundle(resolvedName);
|
|
415
|
+
if (!opts.yes) {
|
|
416
|
+
if (!isInteractiveTerminal()) {
|
|
417
|
+
console.error(chalk.red(`Refusing to delete '${resolvedName}' without --yes in a non-interactive shell.`));
|
|
418
|
+
process.exit(1);
|
|
419
|
+
}
|
|
420
|
+
const keychainCount = describeBundle(bundle).filter((e) => e.kind === 'keychain').length;
|
|
421
|
+
const suffix = keychainCount && !opts.keepSecrets
|
|
422
|
+
? ` and purge ${keychainCount} keychain item${keychainCount === 1 ? '' : 's'}`
|
|
423
|
+
: '';
|
|
424
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
425
|
+
const proceed = await confirm({
|
|
426
|
+
message: `Delete bundle '${resolvedName}'${suffix}?`,
|
|
427
|
+
default: false,
|
|
428
|
+
});
|
|
429
|
+
if (!proceed) {
|
|
430
|
+
console.log(chalk.gray('Cancelled.'));
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (!opts.keepSecrets) {
|
|
435
|
+
for (const { item } of keychainItemsForBundle(bundle)) {
|
|
436
|
+
deleteKeychainToken(item, bundle.icloud_sync);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
const existed = deleteBundle(resolvedName);
|
|
440
|
+
if (!existed) {
|
|
441
|
+
console.error(chalk.red(`Bundle '${resolvedName}' not found.`));
|
|
442
|
+
process.exit(1);
|
|
443
|
+
}
|
|
444
|
+
console.log(chalk.green(`Bundle '${resolvedName}' deleted.`));
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
if (isPromptCancelled(err))
|
|
448
|
+
return;
|
|
449
|
+
console.error(chalk.red(err.message));
|
|
450
|
+
process.exit(1);
|
|
451
|
+
}
|
|
452
|
+
});
|
|
453
|
+
cmd
|
|
454
|
+
.command('import [bundle]')
|
|
455
|
+
.description('Import keys from a .env file into a bundle. By default every key is stored in keychain.')
|
|
456
|
+
.requiredOption('--from <path>', 'Path to a .env file')
|
|
457
|
+
.option('--all-plaintext', 'Store every imported value as a YAML literal (skip keychain prompts)')
|
|
458
|
+
.option('--force', 'Overwrite an existing key in the bundle')
|
|
459
|
+
.action(async (bundleName, opts) => {
|
|
460
|
+
try {
|
|
461
|
+
const resolvedBundleName = bundleName ?? (await pickBundleName('import into'));
|
|
462
|
+
const bundle = readBundle(resolvedBundleName);
|
|
463
|
+
const raw = fs.readFileSync(opts.from, 'utf-8');
|
|
464
|
+
const pairs = parseDotenv(raw);
|
|
465
|
+
let added = 0;
|
|
466
|
+
let skipped = 0;
|
|
467
|
+
for (const [key, value] of Object.entries(pairs)) {
|
|
468
|
+
if (!opts.force && key in bundle.vars) {
|
|
469
|
+
skipped++;
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
if (opts.allPlaintext) {
|
|
473
|
+
bundle.vars[key] = { value };
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
const item = secretsKeychainItem(resolvedBundleName, key);
|
|
477
|
+
setKeychainToken(item, value, bundle.icloud_sync);
|
|
478
|
+
bundle.vars[key] = keychainRef(key);
|
|
479
|
+
}
|
|
480
|
+
added++;
|
|
481
|
+
}
|
|
482
|
+
writeBundle(bundle);
|
|
483
|
+
console.log(chalk.green(`Imported ${added} key(s)${skipped ? `, skipped ${skipped} (already set, pass --force)` : ''}.`));
|
|
484
|
+
}
|
|
485
|
+
catch (err) {
|
|
486
|
+
if (isPromptCancelled(err))
|
|
487
|
+
return;
|
|
488
|
+
console.error(chalk.red(err.message));
|
|
489
|
+
process.exit(1);
|
|
490
|
+
}
|
|
491
|
+
});
|
|
492
|
+
cmd
|
|
493
|
+
.command('export [bundle]')
|
|
494
|
+
.description('Resolve a bundle and print KEY=VALUE lines (for `eval "$(agents secrets export prod)"`). Refuses on a TTY unless --plaintext.')
|
|
495
|
+
.option('--plaintext', 'Acknowledge that the resolved values will be printed in the clear')
|
|
496
|
+
.action(async (bundleName, opts) => {
|
|
497
|
+
try {
|
|
498
|
+
const { resolveBundleEnv } = await import('../lib/secrets/bundles.js');
|
|
499
|
+
const resolvedBundleName = bundleName ?? (await pickBundleName('export'));
|
|
500
|
+
const bundle = readBundle(resolvedBundleName);
|
|
501
|
+
if (isInteractiveTerminal() && !opts.plaintext) {
|
|
502
|
+
console.error(chalk.red('export to a TTY requires --plaintext (prevents shoulder-surfing).'));
|
|
503
|
+
process.exit(1);
|
|
504
|
+
}
|
|
505
|
+
const env = resolveBundleEnv(bundle);
|
|
506
|
+
for (const [k, v] of Object.entries(env)) {
|
|
507
|
+
const escaped = v.replace(/'/g, `'\\''`);
|
|
508
|
+
process.stdout.write(`export ${k}='${escaped}'\n`);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
catch (err) {
|
|
512
|
+
if (isPromptCancelled(err))
|
|
513
|
+
return;
|
|
514
|
+
console.error(chalk.red(err.message));
|
|
515
|
+
process.exit(1);
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
}
|
|
@@ -11,6 +11,7 @@ export interface SessionPickerConfig {
|
|
|
11
11
|
pageSize?: number;
|
|
12
12
|
initialSearch?: string;
|
|
13
13
|
}
|
|
14
|
+
/** Build a cached multi-line preview string for display in the session picker. */
|
|
14
15
|
export declare function buildPreview(session: SessionMeta): string;
|
|
16
|
+
/** Show an interactive session picker and return the selected session with its action (resume or view). */
|
|
15
17
|
export declare function sessionPicker(config: SessionPickerConfig): Promise<PickedSession | null>;
|
|
16
|
-
//# sourceMappingURL=sessions-picker.d.ts.map
|