@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/commands/secrets.js
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
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
|
+
*/
|
|
1
8
|
import chalk from 'chalk';
|
|
2
9
|
import * as fs from 'fs';
|
|
3
|
-
import { bundleExists, deleteBundle, describeBundle, keychainItemsForBundle, keychainRef, listBundles, parseDotenv, readBundle, validateBundleName, validateEnvKey, writeBundle, } from '../lib/secrets
|
|
4
|
-
import { deleteKeychainToken, getKeychainToken, hasKeychainToken, secretsKeychainItem, setKeychainToken, } from '../lib/secrets.js';
|
|
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';
|
|
5
13
|
import { isInteractiveTerminal, isPromptCancelled } from './utils.js';
|
|
14
|
+
/** Prompt the user for a secret value with masked input. Requires an interactive TTY. */
|
|
6
15
|
async function promptForSecret(message) {
|
|
7
16
|
if (!isInteractiveTerminal()) {
|
|
8
17
|
throw new Error('A secret is required but the shell is not interactive. Pass --value, --value-stdin, or run from a TTY.');
|
|
@@ -10,6 +19,79 @@ async function promptForSecret(message) {
|
|
|
10
19
|
const { password } = await import('@inquirer/prompts');
|
|
11
20
|
return await password({ message, mask: true });
|
|
12
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. */
|
|
13
95
|
function readStdinSync() {
|
|
14
96
|
const chunks = [];
|
|
15
97
|
const buf = Buffer.alloc(65536);
|
|
@@ -27,12 +109,14 @@ function readStdinSync() {
|
|
|
27
109
|
}
|
|
28
110
|
return Buffer.concat(chunks).toString('utf-8').trim();
|
|
29
111
|
}
|
|
112
|
+
/** Format a single bundle as a table row for the `secrets list` output. */
|
|
30
113
|
function renderBundleRow(b) {
|
|
31
114
|
const entries = describeBundle(b);
|
|
32
115
|
const keys = entries.length;
|
|
33
116
|
const sensitive = entries.filter((e) => e.kind === 'keychain').length;
|
|
34
117
|
return `${chalk.cyan(b.name.padEnd(20))} ${String(keys).padEnd(6)} ${chalk.yellow(String(sensitive).padEnd(10))} ${chalk.gray(b.description || '')}`;
|
|
35
118
|
}
|
|
119
|
+
/** Colorize a variable source kind (literal, keychain, env, file, exec). */
|
|
36
120
|
function kindLabel(kind) {
|
|
37
121
|
switch (kind) {
|
|
38
122
|
case 'literal': return chalk.gray('literal');
|
|
@@ -43,6 +127,7 @@ function kindLabel(kind) {
|
|
|
43
127
|
default: return kind;
|
|
44
128
|
}
|
|
45
129
|
}
|
|
130
|
+
/** Mask a value with asterisks unless reveal is true. */
|
|
46
131
|
function redact(value, reveal) {
|
|
47
132
|
if (reveal)
|
|
48
133
|
return value;
|
|
@@ -50,10 +135,53 @@ function redact(value, reveal) {
|
|
|
50
135
|
return '';
|
|
51
136
|
return '*'.repeat(Math.min(value.length, 8));
|
|
52
137
|
}
|
|
138
|
+
/** Register the `agents secrets` command tree. */
|
|
53
139
|
export function registerSecretsCommands(program) {
|
|
54
140
|
const cmd = program
|
|
55
141
|
.command('secrets')
|
|
56
|
-
.description('Named bundles of env variables backed by macOS Keychain. Inject into agents via `agents run --secrets <name>`.')
|
|
142
|
+
.description('Named bundles of env variables backed by macOS Keychain. 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
|
+
Examples:
|
|
151
|
+
# Create a bundle for production credentials
|
|
152
|
+
agents secrets create prod --description "Production keys for the api stack"
|
|
153
|
+
|
|
154
|
+
# Add a keychain-backed secret (prompts for the value)
|
|
155
|
+
agents secrets add prod STRIPE_API_KEY
|
|
156
|
+
|
|
157
|
+
# Add a literal (non-sensitive) value
|
|
158
|
+
agents secrets add prod LOG_LEVEL --value info
|
|
159
|
+
|
|
160
|
+
# Import an entire .env file straight into keychain
|
|
161
|
+
agents secrets import prod --from .env.prod
|
|
162
|
+
|
|
163
|
+
# See what's in a bundle (values masked)
|
|
164
|
+
agents secrets view prod
|
|
165
|
+
|
|
166
|
+
# Reveal the real values in an interactive shell
|
|
167
|
+
agents secrets view prod --reveal
|
|
168
|
+
|
|
169
|
+
# Inject the bundle into an agent run
|
|
170
|
+
agents run claude "deploy the worker" --secrets prod
|
|
171
|
+
|
|
172
|
+
# Eval the bundle into your current shell
|
|
173
|
+
eval "$(agents secrets export prod --plaintext)"
|
|
174
|
+
|
|
175
|
+
# Remove one key (purges the keychain item by default)
|
|
176
|
+
agents secrets remove prod STRIPE_API_KEY
|
|
177
|
+
|
|
178
|
+
# Delete the whole bundle and purge every keychain item it owned
|
|
179
|
+
agents secrets delete prod
|
|
180
|
+
`);
|
|
181
|
+
registerCommandGroups(cmd, [
|
|
182
|
+
{ title: 'Bundle commands', names: ['list', 'view', 'create', 'delete'] },
|
|
183
|
+
{ title: 'Secret commands', names: ['add', 'remove', 'import', 'export'] },
|
|
184
|
+
]);
|
|
57
185
|
cmd
|
|
58
186
|
.command('list')
|
|
59
187
|
.alias('ls')
|
|
@@ -62,7 +190,7 @@ export function registerSecretsCommands(program) {
|
|
|
62
190
|
const bundles = listBundles();
|
|
63
191
|
if (bundles.length === 0) {
|
|
64
192
|
console.log(chalk.gray('No secrets bundles configured.'));
|
|
65
|
-
console.log(chalk.gray('Try: agents secrets
|
|
193
|
+
console.log(chalk.gray('Try: agents secrets create <name>'));
|
|
66
194
|
return;
|
|
67
195
|
}
|
|
68
196
|
console.log(chalk.bold(`${'NAME'.padEnd(20)} ${'KEYS'.padEnd(6)} ${'SENSITIVE'.padEnd(10)} DESCRIPTION`));
|
|
@@ -71,20 +199,23 @@ export function registerSecretsCommands(program) {
|
|
|
71
199
|
}
|
|
72
200
|
});
|
|
73
201
|
cmd
|
|
74
|
-
.command('view
|
|
202
|
+
.command('view [name]')
|
|
75
203
|
.alias('show')
|
|
76
204
|
.description('Show a bundle. Keychain values are masked by default — pass --reveal to see them.')
|
|
77
205
|
.option('--reveal', 'Print keychain-backed values in the clear (TTY only unless --plaintext)')
|
|
78
206
|
.option('--plaintext', 'Allow --reveal in non-interactive shells (use with care)')
|
|
79
|
-
.action((name, opts) => {
|
|
207
|
+
.action(async (name, opts) => {
|
|
80
208
|
try {
|
|
81
|
-
const
|
|
209
|
+
const resolvedName = name ?? (await pickBundleName('view'));
|
|
210
|
+
const bundle = readBundle(resolvedName);
|
|
82
211
|
const entries = describeBundle(bundle);
|
|
83
212
|
console.log(chalk.bold(bundle.name));
|
|
84
213
|
if (bundle.description)
|
|
85
214
|
console.log(chalk.gray(bundle.description));
|
|
86
215
|
if (bundle.allow_exec)
|
|
87
216
|
console.log(chalk.yellow('allow_exec: true'));
|
|
217
|
+
if (bundle.icloud_sync)
|
|
218
|
+
console.log(chalk.cyan('icloud_sync: true'));
|
|
88
219
|
console.log();
|
|
89
220
|
if (entries.length === 0) {
|
|
90
221
|
console.log(chalk.gray('(no keys)'));
|
|
@@ -98,12 +229,12 @@ export function registerSecretsCommands(program) {
|
|
|
98
229
|
for (const e of entries) {
|
|
99
230
|
if (e.kind === 'keychain') {
|
|
100
231
|
const item = secretsKeychainItem(bundle.name, e.detail);
|
|
101
|
-
const stored = hasKeychainToken(item);
|
|
232
|
+
const stored = hasKeychainToken(item, bundle.icloud_sync);
|
|
102
233
|
const marker = stored ? chalk.green('stored') : chalk.red('missing');
|
|
103
234
|
let valueCol = `[keychain:${e.detail}] ${marker}`;
|
|
104
235
|
if (reveal && stored) {
|
|
105
236
|
try {
|
|
106
|
-
valueCol = redact(getKeychainToken(item), true);
|
|
237
|
+
valueCol = redact(getKeychainToken(item, bundle.icloud_sync), true);
|
|
107
238
|
}
|
|
108
239
|
catch {
|
|
109
240
|
// fall through to masked
|
|
@@ -124,41 +255,48 @@ export function registerSecretsCommands(program) {
|
|
|
124
255
|
}
|
|
125
256
|
}
|
|
126
257
|
catch (err) {
|
|
258
|
+
if (isPromptCancelled(err))
|
|
259
|
+
return;
|
|
127
260
|
console.error(chalk.red(err.message));
|
|
128
261
|
process.exit(1);
|
|
129
262
|
}
|
|
130
263
|
});
|
|
131
264
|
cmd
|
|
132
|
-
.command('
|
|
265
|
+
.command('create [name]')
|
|
133
266
|
.description('Create an empty bundle')
|
|
134
267
|
.option('--description <text>', 'Free-form description')
|
|
135
268
|
.option('--allow-exec', 'Allow exec: refs in this bundle (off by default)')
|
|
269
|
+
.option('--icloud-sync', 'Store keychain values in iCloud Keychain so they sync across your Macs (requires Xcode CLT)')
|
|
136
270
|
.option('--force', 'Overwrite an existing bundle')
|
|
137
|
-
.action((name, opts) => {
|
|
271
|
+
.action(async (name, opts) => {
|
|
138
272
|
try {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
273
|
+
const resolvedName = name ?? (await promptBundleName());
|
|
274
|
+
validateBundleName(resolvedName);
|
|
275
|
+
if (bundleExists(resolvedName) && !opts.force) {
|
|
276
|
+
console.error(chalk.red(`Bundle '${resolvedName}' already exists. Use --force to overwrite.`));
|
|
142
277
|
process.exit(1);
|
|
143
278
|
}
|
|
144
279
|
const bundle = {
|
|
145
|
-
name,
|
|
280
|
+
name: resolvedName,
|
|
146
281
|
description: opts.description,
|
|
147
282
|
allow_exec: opts.allowExec,
|
|
283
|
+
icloud_sync: opts.icloudSync,
|
|
148
284
|
vars: {},
|
|
149
285
|
};
|
|
150
286
|
writeBundle(bundle);
|
|
151
|
-
console.log(chalk.green(`Bundle '${
|
|
152
|
-
console.log(chalk.gray(`Try: agents secrets
|
|
287
|
+
console.log(chalk.green(`Bundle '${resolvedName}' created.`));
|
|
288
|
+
console.log(chalk.gray(`Try: agents secrets add ${resolvedName} MY_KEY`));
|
|
153
289
|
}
|
|
154
290
|
catch (err) {
|
|
291
|
+
if (isPromptCancelled(err))
|
|
292
|
+
return;
|
|
155
293
|
console.error(chalk.red(err.message));
|
|
156
294
|
process.exit(1);
|
|
157
295
|
}
|
|
158
296
|
});
|
|
159
297
|
cmd
|
|
160
|
-
.command('
|
|
161
|
-
.description('
|
|
298
|
+
.command('add [bundle] [key]')
|
|
299
|
+
.description('Add a variable to a bundle. Defaults to keychain-backed; pass --value for literal, --env/--file/--exec for refs.')
|
|
162
300
|
.option('--value <v>', 'Store as a plaintext literal in the YAML (non-sensitive values only)')
|
|
163
301
|
.option('--value-stdin', 'Read the value from stdin (stored in keychain unless combined with --value)')
|
|
164
302
|
.option('--env <VAR>', 'Store as an env: ref that reads from the parent process.env at run time')
|
|
@@ -166,37 +304,39 @@ export function registerSecretsCommands(program) {
|
|
|
166
304
|
.option('--exec <cmd>', 'Store as an exec: ref that runs a command at run time (requires allow_exec)')
|
|
167
305
|
.action(async (bundleName, key, opts) => {
|
|
168
306
|
try {
|
|
169
|
-
|
|
170
|
-
const bundle = readBundle(
|
|
307
|
+
const resolvedBundleName = bundleName ?? (await pickBundleName('add to'));
|
|
308
|
+
const bundle = readBundle(resolvedBundleName);
|
|
309
|
+
const resolvedKey = key ?? (await promptKeyName(resolvedBundleName));
|
|
310
|
+
validateEnvKey(resolvedKey);
|
|
171
311
|
const sources = [opts.value !== undefined, Boolean(opts.env), Boolean(opts.file), Boolean(opts.exec)].filter(Boolean).length;
|
|
172
312
|
if (sources > 1) {
|
|
173
313
|
throw new Error('Pick one of: --value, --env, --file, --exec.');
|
|
174
314
|
}
|
|
175
315
|
if (opts.env) {
|
|
176
|
-
bundle.vars[
|
|
316
|
+
bundle.vars[resolvedKey] = `env:${opts.env}`;
|
|
177
317
|
writeBundle(bundle);
|
|
178
|
-
console.log(chalk.green(`${
|
|
318
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> env:${opts.env}`));
|
|
179
319
|
return;
|
|
180
320
|
}
|
|
181
321
|
if (opts.file) {
|
|
182
|
-
bundle.vars[
|
|
322
|
+
bundle.vars[resolvedKey] = `file:${opts.file}`;
|
|
183
323
|
writeBundle(bundle);
|
|
184
|
-
console.log(chalk.green(`${
|
|
324
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> file:${opts.file}`));
|
|
185
325
|
return;
|
|
186
326
|
}
|
|
187
327
|
if (opts.exec) {
|
|
188
328
|
if (!bundle.allow_exec) {
|
|
189
|
-
throw new Error(`Bundle '${
|
|
329
|
+
throw new Error(`Bundle '${resolvedBundleName}' does not allow exec refs. Re-create with --allow-exec.`);
|
|
190
330
|
}
|
|
191
|
-
bundle.vars[
|
|
331
|
+
bundle.vars[resolvedKey] = `exec:${opts.exec}`;
|
|
192
332
|
writeBundle(bundle);
|
|
193
|
-
console.log(chalk.green(`${
|
|
333
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} -> exec:${opts.exec}`));
|
|
194
334
|
return;
|
|
195
335
|
}
|
|
196
336
|
if (opts.value !== undefined) {
|
|
197
|
-
bundle.vars[
|
|
337
|
+
bundle.vars[resolvedKey] = { value: opts.value };
|
|
198
338
|
writeBundle(bundle);
|
|
199
|
-
console.log(chalk.green(`${
|
|
339
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} = <literal>`));
|
|
200
340
|
return;
|
|
201
341
|
}
|
|
202
342
|
// Default path: keychain-backed.
|
|
@@ -207,13 +347,14 @@ export function registerSecretsCommands(program) {
|
|
|
207
347
|
throw new Error('No value received on stdin.');
|
|
208
348
|
}
|
|
209
349
|
else {
|
|
210
|
-
secretValue = await promptForSecret(`Enter value for ${
|
|
350
|
+
secretValue = await promptForSecret(`Enter value for ${resolvedBundleName}.${resolvedKey}`);
|
|
211
351
|
}
|
|
212
|
-
const item = secretsKeychainItem(
|
|
213
|
-
setKeychainToken(item, secretValue);
|
|
214
|
-
bundle.vars[
|
|
352
|
+
const item = secretsKeychainItem(resolvedBundleName, resolvedKey);
|
|
353
|
+
setKeychainToken(item, secretValue, bundle.icloud_sync);
|
|
354
|
+
bundle.vars[resolvedKey] = keychainRef(resolvedKey);
|
|
215
355
|
writeBundle(bundle);
|
|
216
|
-
|
|
356
|
+
const where = bundle.icloud_sync ? 'iCloud Keychain' : 'keychain';
|
|
357
|
+
console.log(chalk.green(`${resolvedBundleName}.${resolvedKey} stored in ${where} (${item}).`));
|
|
217
358
|
}
|
|
218
359
|
catch (err) {
|
|
219
360
|
if (isPromptCancelled(err))
|
|
@@ -223,68 +364,95 @@ export function registerSecretsCommands(program) {
|
|
|
223
364
|
}
|
|
224
365
|
});
|
|
225
366
|
cmd
|
|
226
|
-
.command('
|
|
367
|
+
.command('remove [bundle] [key]')
|
|
227
368
|
.description('Remove a key from the bundle. Purges the keychain item if the ref was keychain:. Use --keep-secret to retain it.')
|
|
228
369
|
.option('--keep-secret', 'Leave the keychain item in place after removing the YAML ref')
|
|
229
|
-
.action((bundleName, key, opts) => {
|
|
370
|
+
.action(async (bundleName, key, opts) => {
|
|
230
371
|
try {
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
372
|
+
const resolvedBundleName = bundleName ?? (await pickBundleName('remove from'));
|
|
373
|
+
const bundle = readBundle(resolvedBundleName);
|
|
374
|
+
const resolvedKey = key ?? (await pickKey(bundle, 'remove'));
|
|
375
|
+
if (!(resolvedKey in bundle.vars)) {
|
|
376
|
+
console.error(chalk.red(`Key '${resolvedKey}' not found in bundle '${resolvedBundleName}'.`));
|
|
234
377
|
process.exit(1);
|
|
235
378
|
}
|
|
236
|
-
const raw = bundle.vars[
|
|
237
|
-
delete bundle.vars[
|
|
379
|
+
const raw = bundle.vars[resolvedKey];
|
|
380
|
+
delete bundle.vars[resolvedKey];
|
|
238
381
|
writeBundle(bundle);
|
|
239
382
|
if (!opts.keepSecret && typeof raw === 'string' && raw.startsWith('keychain:')) {
|
|
240
|
-
const item = secretsKeychainItem(
|
|
241
|
-
const removed = deleteKeychainToken(item);
|
|
383
|
+
const item = secretsKeychainItem(resolvedBundleName, raw.slice('keychain:'.length));
|
|
384
|
+
const removed = deleteKeychainToken(item, bundle.icloud_sync);
|
|
242
385
|
if (removed) {
|
|
243
|
-
console.log(chalk.green(`Removed ${
|
|
386
|
+
console.log(chalk.green(`Removed ${resolvedBundleName}.${resolvedKey} and purged keychain item.`));
|
|
244
387
|
return;
|
|
245
388
|
}
|
|
246
389
|
}
|
|
247
|
-
console.log(chalk.green(`Removed ${
|
|
390
|
+
console.log(chalk.green(`Removed ${resolvedBundleName}.${resolvedKey}.`));
|
|
248
391
|
}
|
|
249
392
|
catch (err) {
|
|
393
|
+
if (isPromptCancelled(err))
|
|
394
|
+
return;
|
|
250
395
|
console.error(chalk.red(err.message));
|
|
251
396
|
process.exit(1);
|
|
252
397
|
}
|
|
253
398
|
});
|
|
254
399
|
cmd
|
|
255
|
-
.command('
|
|
256
|
-
.alias('remove')
|
|
400
|
+
.command('delete [name]')
|
|
257
401
|
.description('Delete a bundle and purge all its keychain items (use --keep-secrets to retain them).')
|
|
258
402
|
.option('--keep-secrets', 'Leave keychain items in place after deleting the bundle file')
|
|
259
|
-
.
|
|
403
|
+
.option('-y, --yes', 'Skip the confirmation prompt')
|
|
404
|
+
.action(async (name, opts) => {
|
|
260
405
|
try {
|
|
261
|
-
const
|
|
406
|
+
const resolvedName = name ?? (await pickBundleName('delete'));
|
|
407
|
+
const bundle = readBundle(resolvedName);
|
|
408
|
+
if (!opts.yes) {
|
|
409
|
+
if (!isInteractiveTerminal()) {
|
|
410
|
+
console.error(chalk.red(`Refusing to delete '${resolvedName}' without --yes in a non-interactive shell.`));
|
|
411
|
+
process.exit(1);
|
|
412
|
+
}
|
|
413
|
+
const keychainCount = describeBundle(bundle).filter((e) => e.kind === 'keychain').length;
|
|
414
|
+
const suffix = keychainCount && !opts.keepSecrets
|
|
415
|
+
? ` and purge ${keychainCount} keychain item${keychainCount === 1 ? '' : 's'}`
|
|
416
|
+
: '';
|
|
417
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
418
|
+
const proceed = await confirm({
|
|
419
|
+
message: `Delete bundle '${resolvedName}'${suffix}?`,
|
|
420
|
+
default: false,
|
|
421
|
+
});
|
|
422
|
+
if (!proceed) {
|
|
423
|
+
console.log(chalk.gray('Cancelled.'));
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
262
427
|
if (!opts.keepSecrets) {
|
|
263
428
|
for (const { item } of keychainItemsForBundle(bundle)) {
|
|
264
|
-
deleteKeychainToken(item);
|
|
429
|
+
deleteKeychainToken(item, bundle.icloud_sync);
|
|
265
430
|
}
|
|
266
431
|
}
|
|
267
|
-
const existed = deleteBundle(
|
|
432
|
+
const existed = deleteBundle(resolvedName);
|
|
268
433
|
if (!existed) {
|
|
269
|
-
console.error(chalk.red(`Bundle '${
|
|
434
|
+
console.error(chalk.red(`Bundle '${resolvedName}' not found.`));
|
|
270
435
|
process.exit(1);
|
|
271
436
|
}
|
|
272
|
-
console.log(chalk.green(`Bundle '${
|
|
437
|
+
console.log(chalk.green(`Bundle '${resolvedName}' deleted.`));
|
|
273
438
|
}
|
|
274
439
|
catch (err) {
|
|
440
|
+
if (isPromptCancelled(err))
|
|
441
|
+
return;
|
|
275
442
|
console.error(chalk.red(err.message));
|
|
276
443
|
process.exit(1);
|
|
277
444
|
}
|
|
278
445
|
});
|
|
279
446
|
cmd
|
|
280
|
-
.command('import
|
|
447
|
+
.command('import [bundle]')
|
|
281
448
|
.description('Import keys from a .env file into a bundle. By default every key is stored in keychain.')
|
|
282
449
|
.requiredOption('--from <path>', 'Path to a .env file')
|
|
283
450
|
.option('--all-plaintext', 'Store every imported value as a YAML literal (skip keychain prompts)')
|
|
284
451
|
.option('--force', 'Overwrite an existing key in the bundle')
|
|
285
|
-
.action((bundleName, opts) => {
|
|
452
|
+
.action(async (bundleName, opts) => {
|
|
286
453
|
try {
|
|
287
|
-
const
|
|
454
|
+
const resolvedBundleName = bundleName ?? (await pickBundleName('import into'));
|
|
455
|
+
const bundle = readBundle(resolvedBundleName);
|
|
288
456
|
const raw = fs.readFileSync(opts.from, 'utf-8');
|
|
289
457
|
const pairs = parseDotenv(raw);
|
|
290
458
|
let added = 0;
|
|
@@ -298,8 +466,8 @@ export function registerSecretsCommands(program) {
|
|
|
298
466
|
bundle.vars[key] = { value };
|
|
299
467
|
}
|
|
300
468
|
else {
|
|
301
|
-
const item = secretsKeychainItem(
|
|
302
|
-
setKeychainToken(item, value);
|
|
469
|
+
const item = secretsKeychainItem(resolvedBundleName, key);
|
|
470
|
+
setKeychainToken(item, value, bundle.icloud_sync);
|
|
303
471
|
bundle.vars[key] = keychainRef(key);
|
|
304
472
|
}
|
|
305
473
|
added++;
|
|
@@ -308,18 +476,21 @@ export function registerSecretsCommands(program) {
|
|
|
308
476
|
console.log(chalk.green(`Imported ${added} key(s)${skipped ? `, skipped ${skipped} (already set, pass --force)` : ''}.`));
|
|
309
477
|
}
|
|
310
478
|
catch (err) {
|
|
479
|
+
if (isPromptCancelled(err))
|
|
480
|
+
return;
|
|
311
481
|
console.error(chalk.red(err.message));
|
|
312
482
|
process.exit(1);
|
|
313
483
|
}
|
|
314
484
|
});
|
|
315
485
|
cmd
|
|
316
|
-
.command('export
|
|
486
|
+
.command('export [bundle]')
|
|
317
487
|
.description('Resolve a bundle and print KEY=VALUE lines (for `eval "$(agents secrets export prod)"`). Refuses on a TTY unless --plaintext.')
|
|
318
488
|
.option('--plaintext', 'Acknowledge that the resolved values will be printed in the clear')
|
|
319
489
|
.action(async (bundleName, opts) => {
|
|
320
490
|
try {
|
|
321
|
-
const { resolveBundleEnv } = await import('../lib/secrets
|
|
322
|
-
const
|
|
491
|
+
const { resolveBundleEnv } = await import('../lib/secrets/bundles.js');
|
|
492
|
+
const resolvedBundleName = bundleName ?? (await pickBundleName('export'));
|
|
493
|
+
const bundle = readBundle(resolvedBundleName);
|
|
323
494
|
if (isInteractiveTerminal() && !opts.plaintext) {
|
|
324
495
|
console.error(chalk.red('export to a TTY requires --plaintext (prevents shoulder-surfing).'));
|
|
325
496
|
process.exit(1);
|
|
@@ -331,9 +502,10 @@ export function registerSecretsCommands(program) {
|
|
|
331
502
|
}
|
|
332
503
|
}
|
|
333
504
|
catch (err) {
|
|
505
|
+
if (isPromptCancelled(err))
|
|
506
|
+
return;
|
|
334
507
|
console.error(chalk.red(err.message));
|
|
335
508
|
process.exit(1);
|
|
336
509
|
}
|
|
337
510
|
});
|
|
338
511
|
}
|
|
339
|
-
//# sourceMappingURL=secrets.js.map
|
|
@@ -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
|