@phnx-labs/agents-cli 1.12.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 +293 -300
- 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 +511 -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 +79 -0
- package/dist/lib/rotate.js +285 -0
- package/dist/lib/routines.d.ts +29 -1
- package/dist/lib/routines.js +32 -5
- package/dist/lib/runner.d.ts +14 -1
- package/dist/lib/runner.js +22 -3
- package/dist/lib/sandbox.d.ts +16 -1
- package/dist/lib/sandbox.js +39 -16
- package/dist/lib/scheduler.d.ts +8 -1
- package/dist/lib/scheduler.js +8 -1
- package/dist/lib/secrets/AgentsKeychain.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/Info.plist +22 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/MacOS/AgentsKeychain +0 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/_CodeSignature/CodeResources +123 -0
- package/dist/lib/secrets/AgentsKeychain.app/Contents/embedded.provisionprofile +0 -0
- package/dist/lib/secrets/bundles.d.ts +39 -0
- package/dist/lib/secrets/bundles.js +189 -0
- package/dist/lib/secrets/index.d.ts +55 -0
- package/dist/lib/secrets/index.js +211 -0
- package/dist/lib/secrets/profiles.d.ts +10 -0
- package/dist/lib/secrets/profiles.js +13 -0
- package/dist/lib/session/active.d.ts +43 -0
- package/dist/lib/session/active.js +392 -0
- package/dist/lib/session/artifacts.d.ts +16 -0
- package/dist/lib/session/artifacts.js +95 -0
- package/dist/lib/session/cloud.d.ts +30 -0
- package/dist/lib/session/cloud.js +121 -0
- package/dist/lib/session/db.d.ts +23 -2
- package/dist/lib/session/db.js +76 -12
- package/dist/lib/session/discover.d.ts +19 -4
- package/dist/lib/session/discover.js +344 -48
- package/dist/lib/session/parse.d.ts +28 -1
- package/dist/lib/session/parse.js +267 -9
- package/dist/lib/session/prompt.d.ts +9 -1
- package/dist/lib/session/prompt.js +17 -3
- package/dist/lib/session/render.d.ts +13 -1
- package/dist/lib/session/render.js +20 -1
- package/dist/lib/session/team-filter.d.ts +9 -1
- package/dist/lib/session/team-filter.js +11 -2
- package/dist/lib/session/types.d.ts +24 -2
- package/dist/lib/session/types.js +10 -2
- package/dist/lib/shims.d.ts +93 -5
- package/dist/lib/shims.js +380 -67
- package/dist/lib/skills.d.ts +27 -2
- package/dist/lib/skills.js +127 -65
- package/dist/lib/sqlite.d.ts +43 -0
- package/dist/lib/sqlite.js +94 -0
- package/dist/lib/state.d.ts +114 -22
- package/dist/lib/state.js +323 -138
- package/dist/lib/subagents.d.ts +9 -1
- package/dist/lib/subagents.js +70 -63
- package/dist/lib/sync-manifest.d.ts +81 -0
- package/dist/lib/sync-manifest.js +450 -0
- package/dist/lib/teams/agents.d.ts +103 -5
- package/dist/lib/teams/agents.js +414 -91
- package/dist/lib/teams/api.d.ts +26 -3
- package/dist/lib/teams/api.js +63 -3
- package/dist/lib/teams/debug.d.ts +6 -1
- package/dist/lib/teams/debug.js +6 -1
- package/dist/lib/teams/file_ops.d.ts +7 -1
- package/dist/lib/teams/file_ops.js +7 -1
- package/dist/lib/teams/index.d.ts +15 -0
- package/dist/lib/teams/index.js +14 -0
- package/dist/lib/teams/parsers.d.ts +4 -1
- package/dist/lib/teams/parsers.js +11 -1
- package/dist/lib/teams/persistence.d.ts +15 -1
- package/dist/lib/teams/persistence.js +102 -20
- package/dist/lib/teams/registry.d.ts +12 -1
- package/dist/lib/teams/registry.js +116 -33
- package/dist/lib/teams/summarizer.d.ts +15 -1
- package/dist/lib/teams/summarizer.js +14 -1
- package/dist/lib/teams/supervisor.d.ts +48 -0
- package/dist/lib/teams/supervisor.js +73 -0
- package/dist/lib/template.d.ts +8 -6
- package/dist/lib/template.js +8 -6
- package/dist/lib/types.d.ts +147 -8
- package/dist/lib/types.js +26 -3
- package/dist/lib/usage.d.ts +48 -1
- package/dist/lib/usage.js +97 -16
- package/dist/lib/version-duplicates.d.ts +21 -0
- package/dist/lib/version-duplicates.js +90 -0
- package/dist/lib/versions.d.ts +39 -4
- package/dist/lib/versions.js +401 -111
- package/package.json +33 -18
- package/scripts/postinstall.js +126 -30
- package/dist/commands/__tests__/sessions.test.d.ts +0 -2
- package/dist/commands/__tests__/sessions.test.d.ts.map +0 -1
- package/dist/commands/__tests__/sessions.test.js +0 -636
- package/dist/commands/__tests__/sessions.test.js.map +0 -1
- package/dist/commands/commands.d.ts.map +0 -1
- package/dist/commands/commands.js.map +0 -1
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/exec.d.ts.map +0 -1
- package/dist/commands/exec.js.map +0 -1
- package/dist/commands/fork.d.ts.map +0 -1
- package/dist/commands/fork.js.map +0 -1
- package/dist/commands/hooks.d.ts.map +0 -1
- package/dist/commands/hooks.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/packages.d.ts.map +0 -1
- package/dist/commands/packages.js.map +0 -1
- package/dist/commands/permissions.d.ts.map +0 -1
- package/dist/commands/permissions.js.map +0 -1
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/pty.d.ts.map +0 -1
- package/dist/commands/pty.js.map +0 -1
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -3
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -180
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/refresh-memory.d.ts.map +0 -1
- package/dist/commands/refresh-memory.js.map +0 -1
- package/dist/commands/resource-view.d.ts.map +0 -1
- package/dist/commands/resource-view.js.map +0 -1
- package/dist/commands/routines.d.ts.map +0 -1
- package/dist/commands/routines.js.map +0 -1
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/sessions-picker.d.ts.map +0 -1
- package/dist/commands/sessions-picker.js.map +0 -1
- package/dist/commands/sessions.d.ts.map +0 -1
- package/dist/commands/sessions.js.map +0 -1
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/subagents.d.ts.map +0 -1
- package/dist/commands/subagents.js.map +0 -1
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js.map +0 -1
- package/dist/commands/teams-picker.d.ts.map +0 -1
- package/dist/commands/teams-picker.js.map +0 -1
- package/dist/commands/teams.d.ts.map +0 -1
- package/dist/commands/teams.js.map +0 -1
- package/dist/commands/utils.d.ts.map +0 -1
- package/dist/commands/utils.js.map +0 -1
- package/dist/commands/versions.d.ts.map +0 -1
- package/dist/commands/versions.js.map +0 -1
- package/dist/commands/view.d.ts.map +0 -1
- package/dist/commands/view.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.d.ts +0 -2
- package/dist/lib/__tests__/bugfixes.test.d.ts.map +0 -1
- package/dist/lib/__tests__/bugfixes.test.js +0 -192
- package/dist/lib/__tests__/bugfixes.test.js.map +0 -1
- package/dist/lib/__tests__/exec.test.d.ts +0 -2
- package/dist/lib/__tests__/exec.test.d.ts.map +0 -1
- package/dist/lib/__tests__/exec.test.js +0 -446
- package/dist/lib/__tests__/exec.test.js.map +0 -1
- package/dist/lib/__tests__/git-sync.test.d.ts +0 -2
- package/dist/lib/__tests__/git-sync.test.d.ts.map +0 -1
- package/dist/lib/__tests__/git-sync.test.js +0 -138
- package/dist/lib/__tests__/git-sync.test.js.map +0 -1
- package/dist/lib/__tests__/hooks.test.d.ts +0 -2
- package/dist/lib/__tests__/hooks.test.d.ts.map +0 -1
- package/dist/lib/__tests__/hooks.test.js +0 -203
- package/dist/lib/__tests__/hooks.test.js.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.d.ts +0 -2
- package/dist/lib/__tests__/memory-compile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/memory-compile.test.js +0 -95
- package/dist/lib/__tests__/memory-compile.test.js.map +0 -1
- package/dist/lib/__tests__/models.test.d.ts +0 -2
- package/dist/lib/__tests__/models.test.d.ts.map +0 -1
- package/dist/lib/__tests__/models.test.js +0 -184
- package/dist/lib/__tests__/models.test.js.map +0 -1
- package/dist/lib/__tests__/usage.test.d.ts +0 -2
- package/dist/lib/__tests__/usage.test.d.ts.map +0 -1
- package/dist/lib/__tests__/usage.test.js +0 -218
- package/dist/lib/__tests__/usage.test.js.map +0 -1
- package/dist/lib/agents.d.ts.map +0 -1
- package/dist/lib/agents.js.map +0 -1
- package/dist/lib/artifact-actions.d.ts.map +0 -1
- package/dist/lib/artifact-actions.js.map +0 -1
- package/dist/lib/commands.d.ts.map +0 -1
- package/dist/lib/commands.js.map +0 -1
- package/dist/lib/convert.d.ts.map +0 -1
- package/dist/lib/convert.js.map +0 -1
- package/dist/lib/daemon.d.ts.map +0 -1
- package/dist/lib/daemon.js.map +0 -1
- package/dist/lib/drive-sync.d.ts.map +0 -1
- package/dist/lib/drive-sync.js.map +0 -1
- package/dist/lib/exec.d.ts.map +0 -1
- package/dist/lib/exec.js.map +0 -1
- package/dist/lib/factory.d.ts +0 -57
- package/dist/lib/factory.d.ts.map +0 -1
- package/dist/lib/factory.js +0 -110
- package/dist/lib/factory.js.map +0 -1
- package/dist/lib/git.d.ts.map +0 -1
- package/dist/lib/git.js.map +0 -1
- package/dist/lib/help.d.ts.map +0 -1
- package/dist/lib/help.js.map +0 -1
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/lib/hooks.js.map +0 -1
- package/dist/lib/manifest.d.ts.map +0 -1
- package/dist/lib/manifest.js.map +0 -1
- package/dist/lib/markdown.d.ts.map +0 -1
- package/dist/lib/markdown.js.map +0 -1
- package/dist/lib/mcp.d.ts.map +0 -1
- package/dist/lib/mcp.js.map +0 -1
- package/dist/lib/memory-compile.d.ts.map +0 -1
- package/dist/lib/memory-compile.js.map +0 -1
- package/dist/lib/memory.d.ts.map +0 -1
- package/dist/lib/memory.js.map +0 -1
- package/dist/lib/models.d.ts.map +0 -1
- package/dist/lib/models.js.map +0 -1
- package/dist/lib/permissions.d.ts.map +0 -1
- package/dist/lib/permissions.js.map +0 -1
- package/dist/lib/picker.d.ts.map +0 -1
- package/dist/lib/picker.js.map +0 -1
- package/dist/lib/plugins.d.ts.map +0 -1
- package/dist/lib/plugins.js.map +0 -1
- package/dist/lib/pty-client.d.ts.map +0 -1
- package/dist/lib/pty-client.js.map +0 -1
- package/dist/lib/pty-server.d.ts.map +0 -1
- package/dist/lib/pty-server.js.map +0 -1
- package/dist/lib/registry.d.ts.map +0 -1
- package/dist/lib/registry.js.map +0 -1
- package/dist/lib/resources.d.ts.map +0 -1
- package/dist/lib/resources.js.map +0 -1
- package/dist/lib/routines.d.ts.map +0 -1
- package/dist/lib/routines.js.map +0 -1
- package/dist/lib/runner.d.ts.map +0 -1
- package/dist/lib/runner.js.map +0 -1
- package/dist/lib/sandbox.d.ts.map +0 -1
- package/dist/lib/sandbox.js.map +0 -1
- package/dist/lib/scheduler.d.ts.map +0 -1
- package/dist/lib/scheduler.js.map +0 -1
- package/dist/lib/session/__tests__/db.test.d.ts +0 -2
- package/dist/lib/session/__tests__/db.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/db.test.js +0 -54
- package/dist/lib/session/__tests__/db.test.js.map +0 -1
- package/dist/lib/session/__tests__/discover.test.d.ts +0 -2
- package/dist/lib/session/__tests__/discover.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/discover.test.js +0 -63
- package/dist/lib/session/__tests__/discover.test.js.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.d.ts +0 -2
- package/dist/lib/session/__tests__/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/prompt.test.js +0 -44
- package/dist/lib/session/__tests__/prompt.test.js.map +0 -1
- package/dist/lib/session/__tests__/render.test.d.ts +0 -2
- package/dist/lib/session/__tests__/render.test.d.ts.map +0 -1
- package/dist/lib/session/__tests__/render.test.js +0 -602
- package/dist/lib/session/__tests__/render.test.js.map +0 -1
- package/dist/lib/session/db.d.ts.map +0 -1
- package/dist/lib/session/db.js.map +0 -1
- package/dist/lib/session/discover.d.ts.map +0 -1
- package/dist/lib/session/discover.js.map +0 -1
- package/dist/lib/session/parse.d.ts.map +0 -1
- package/dist/lib/session/parse.js.map +0 -1
- package/dist/lib/session/prompt.d.ts.map +0 -1
- package/dist/lib/session/prompt.js.map +0 -1
- package/dist/lib/session/prompt.test.d.ts +0 -2
- package/dist/lib/session/prompt.test.d.ts.map +0 -1
- package/dist/lib/session/prompt.test.js +0 -57
- package/dist/lib/session/prompt.test.js.map +0 -1
- package/dist/lib/session/render.d.ts.map +0 -1
- package/dist/lib/session/render.js.map +0 -1
- package/dist/lib/session/team-filter.d.ts.map +0 -1
- package/dist/lib/session/team-filter.js.map +0 -1
- package/dist/lib/session/team-filter.test.d.ts +0 -2
- package/dist/lib/session/team-filter.test.d.ts.map +0 -1
- package/dist/lib/session/team-filter.test.js +0 -157
- package/dist/lib/session/team-filter.test.js.map +0 -1
- package/dist/lib/session/types.d.ts.map +0 -1
- package/dist/lib/session/types.js.map +0 -1
- package/dist/lib/shims.d.ts.map +0 -1
- package/dist/lib/shims.js.map +0 -1
- package/dist/lib/skills.d.ts.map +0 -1
- package/dist/lib/skills.js.map +0 -1
- package/dist/lib/state.d.ts.map +0 -1
- package/dist/lib/state.js.map +0 -1
- package/dist/lib/subagents.d.ts.map +0 -1
- package/dist/lib/subagents.js.map +0 -1
- package/dist/lib/teams/agents.d.ts.map +0 -1
- package/dist/lib/teams/agents.js.map +0 -1
- package/dist/lib/teams/api.d.ts.map +0 -1
- package/dist/lib/teams/api.js.map +0 -1
- package/dist/lib/teams/cloud.d.ts +0 -11
- package/dist/lib/teams/cloud.d.ts.map +0 -1
- package/dist/lib/teams/cloud.js +0 -169
- package/dist/lib/teams/cloud.js.map +0 -1
- package/dist/lib/teams/debug.d.ts.map +0 -1
- package/dist/lib/teams/debug.js.map +0 -1
- package/dist/lib/teams/file_ops.d.ts.map +0 -1
- package/dist/lib/teams/file_ops.js.map +0 -1
- package/dist/lib/teams/parsers.d.ts.map +0 -1
- package/dist/lib/teams/parsers.js.map +0 -1
- package/dist/lib/teams/persistence.d.ts.map +0 -1
- package/dist/lib/teams/persistence.js.map +0 -1
- package/dist/lib/teams/ralph.d.ts +0 -8
- package/dist/lib/teams/ralph.d.ts.map +0 -1
- package/dist/lib/teams/ralph.js +0 -59
- package/dist/lib/teams/ralph.js.map +0 -1
- package/dist/lib/teams/registry.d.ts.map +0 -1
- package/dist/lib/teams/registry.js.map +0 -1
- package/dist/lib/teams/summarizer.d.ts.map +0 -1
- package/dist/lib/teams/summarizer.js.map +0 -1
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/types.js.map +0 -1
- package/dist/lib/usage.d.ts.map +0 -1
- package/dist/lib/usage.js.map +0 -1
- package/dist/lib/versions.d.ts.map +0 -1
- package/dist/lib/versions.js.map +0 -1
- package/scripts/rebuild-sqlite.sh +0 -46
package/dist/lib/help.d.ts
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom help formatting for the CLI.
|
|
3
|
+
*
|
|
4
|
+
* Overrides commander's default help layout to show Commands before Options,
|
|
5
|
+
* and applies consistent conventions (short -h flag, no implicit help subcommand).
|
|
6
|
+
*/
|
|
1
7
|
import type { Command } from 'commander';
|
|
8
|
+
/** Description of a named command group rendered as its own section in help output. */
|
|
9
|
+
export interface CommandGroup {
|
|
10
|
+
/** Section heading, e.g. 'Bundle commands'. */
|
|
11
|
+
title: string;
|
|
12
|
+
/** Subcommand names (in desired display order) that belong to this group. */
|
|
13
|
+
names: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Register named groups for a parent command so its help output splits the
|
|
17
|
+
* Commands section into multiple labeled sections. Subcommands not listed in
|
|
18
|
+
* any group fall back to a plain "Commands:" section below the groups.
|
|
19
|
+
*/
|
|
20
|
+
export declare function registerCommandGroups(parent: Command, groups: readonly CommandGroup[]): void;
|
|
21
|
+
/** Apply standardized help formatting to the root command and all subcommands. */
|
|
2
22
|
export declare function applyGlobalHelpConventions(root: Command): void;
|
|
3
|
-
//# sourceMappingURL=help.d.ts.map
|
package/dist/lib/help.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
const commandGroupRegistry = new WeakMap();
|
|
2
|
+
/**
|
|
3
|
+
* Register named groups for a parent command so its help output splits the
|
|
4
|
+
* Commands section into multiple labeled sections. Subcommands not listed in
|
|
5
|
+
* any group fall back to a plain "Commands:" section below the groups.
|
|
6
|
+
*/
|
|
7
|
+
export function registerCommandGroups(parent, groups) {
|
|
8
|
+
commandGroupRegistry.set(parent, groups);
|
|
9
|
+
}
|
|
10
|
+
/** Format help output with Commands listed before Options for better discoverability. */
|
|
1
11
|
function formatHelpCommandsFirst(cmd, helper) {
|
|
2
12
|
const termWidth = helper.padWidth(cmd, helper);
|
|
3
13
|
const helpWidth = helper.helpWidth || 80;
|
|
@@ -24,11 +34,39 @@ function formatHelpCommandsFirst(cmd, helper) {
|
|
|
24
34
|
if (argumentList.length > 0) {
|
|
25
35
|
output = output.concat(['Arguments:', formatList(argumentList), '']);
|
|
26
36
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
const visibleCommands = helper.visibleCommands(cmd);
|
|
38
|
+
const subcommandTermNoAlias = (sub) => {
|
|
39
|
+
// Mirror commander's default subcommandTerm but drop the |alias suffix.
|
|
40
|
+
const argList = sub.registeredArguments ?? [];
|
|
41
|
+
const args = argList
|
|
42
|
+
.map((a) => {
|
|
43
|
+
const n = a.name() + (a.variadic ? '...' : '');
|
|
44
|
+
return a.required ? `<${n}>` : `[${n}]`;
|
|
45
|
+
})
|
|
46
|
+
.join(' ');
|
|
47
|
+
return sub.name() + (sub.options.length > 0 ? ' [options]' : '') + (args ? ` ${args}` : '');
|
|
48
|
+
};
|
|
49
|
+
const renderCommand = (sub) => formatItem(subcommandTermNoAlias(sub), helper.subcommandDescription(sub));
|
|
50
|
+
const groups = commandGroupRegistry.get(cmd);
|
|
51
|
+
if (groups && groups.length > 0) {
|
|
52
|
+
const byName = new Map(visibleCommands.map((s) => [s.name(), s]));
|
|
53
|
+
const placed = new Set();
|
|
54
|
+
for (const { title, names } of groups) {
|
|
55
|
+
const subs = names
|
|
56
|
+
.map((n) => byName.get(n))
|
|
57
|
+
.filter((s) => s !== undefined);
|
|
58
|
+
if (subs.length === 0)
|
|
59
|
+
continue;
|
|
60
|
+
subs.forEach((s) => placed.add(s.name()));
|
|
61
|
+
output = output.concat([`${title}:`, formatList(subs.map(renderCommand)), '']);
|
|
62
|
+
}
|
|
63
|
+
const remaining = visibleCommands.filter((s) => !placed.has(s.name()));
|
|
64
|
+
if (remaining.length > 0) {
|
|
65
|
+
output = output.concat(['Commands:', formatList(remaining.map(renderCommand)), '']);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (visibleCommands.length > 0) {
|
|
69
|
+
output = output.concat(['Commands:', formatList(visibleCommands.map(renderCommand)), '']);
|
|
32
70
|
}
|
|
33
71
|
const optionList = helper.visibleOptions(cmd).map((option) => {
|
|
34
72
|
return formatItem(helper.optionTerm(option), helper.optionDescription(option));
|
|
@@ -46,6 +84,7 @@ function formatHelpCommandsFirst(cmd, helper) {
|
|
|
46
84
|
}
|
|
47
85
|
return output.join('\n');
|
|
48
86
|
}
|
|
87
|
+
/** Recursively apply help conventions (-h flag, no help subcommand, custom formatter). */
|
|
49
88
|
function applyHelpConventionsRecursive(cmd) {
|
|
50
89
|
cmd
|
|
51
90
|
.helpOption('-h, --help', 'Show help')
|
|
@@ -57,7 +96,7 @@ function applyHelpConventionsRecursive(cmd) {
|
|
|
57
96
|
applyHelpConventionsRecursive(subcommand);
|
|
58
97
|
}
|
|
59
98
|
}
|
|
99
|
+
/** Apply standardized help formatting to the root command and all subcommands. */
|
|
60
100
|
export function applyGlobalHelpConventions(root) {
|
|
61
101
|
applyHelpConventionsRecursive(root);
|
|
62
102
|
}
|
|
63
|
-
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook predicate evaluator.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates the optional `matches:` block on a hook manifest entry against
|
|
5
|
+
* the runtime input passed by the agent CLI on a hook event. All declared
|
|
6
|
+
* predicates AND together — the hook fires only if every one passes.
|
|
7
|
+
*
|
|
8
|
+
* Empty/missing matches => always passes (backward compat with hooks
|
|
9
|
+
* authored before predicate support).
|
|
10
|
+
*
|
|
11
|
+
* Used at hook-fire time by either:
|
|
12
|
+
* (a) generated hook wrappers we install alongside the script, or
|
|
13
|
+
* (b) the script itself, by calling shouldFire() with parsed JSON input.
|
|
14
|
+
*/
|
|
15
|
+
import type { HookMatches } from '../types.js';
|
|
16
|
+
/** Runtime context passed to a hook by the agent CLI. */
|
|
17
|
+
export interface HookInput {
|
|
18
|
+
hook_event_name?: string;
|
|
19
|
+
prompt?: string;
|
|
20
|
+
tool_name?: string;
|
|
21
|
+
tool_args?: unknown;
|
|
22
|
+
cwd?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Decide whether a hook with the given match config should fire on this input.
|
|
26
|
+
* Pure function — no side effects, no IO except git/cwd checks for predicates
|
|
27
|
+
* that explicitly require them.
|
|
28
|
+
*
|
|
29
|
+
* Returns true if the hook should fire (all declared predicates pass), false
|
|
30
|
+
* if it should be skipped.
|
|
31
|
+
*/
|
|
32
|
+
export declare function shouldFire(matches: HookMatches | undefined, input: HookInput): boolean;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook predicate evaluator.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates the optional `matches:` block on a hook manifest entry against
|
|
5
|
+
* the runtime input passed by the agent CLI on a hook event. All declared
|
|
6
|
+
* predicates AND together — the hook fires only if every one passes.
|
|
7
|
+
*
|
|
8
|
+
* Empty/missing matches => always passes (backward compat with hooks
|
|
9
|
+
* authored before predicate support).
|
|
10
|
+
*
|
|
11
|
+
* Used at hook-fire time by either:
|
|
12
|
+
* (a) generated hook wrappers we install alongside the script, or
|
|
13
|
+
* (b) the script itself, by calling shouldFire() with parsed JSON input.
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'fs';
|
|
16
|
+
import * as path from 'path';
|
|
17
|
+
import { execSync } from 'child_process';
|
|
18
|
+
function arrayOf(v) {
|
|
19
|
+
if (v === undefined)
|
|
20
|
+
return [];
|
|
21
|
+
return Array.isArray(v) ? v : [v];
|
|
22
|
+
}
|
|
23
|
+
function isGitDirty(cwd) {
|
|
24
|
+
try {
|
|
25
|
+
const out = execSync('git status --porcelain', {
|
|
26
|
+
cwd,
|
|
27
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
});
|
|
30
|
+
return out.trim().length > 0;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function findProjectRoot(start) {
|
|
37
|
+
let dir = path.resolve(start);
|
|
38
|
+
while (true) {
|
|
39
|
+
if (fs.existsSync(path.join(dir, '.git')))
|
|
40
|
+
return dir;
|
|
41
|
+
const parent = path.dirname(dir);
|
|
42
|
+
if (parent === dir)
|
|
43
|
+
return null;
|
|
44
|
+
dir = parent;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Decide whether a hook with the given match config should fire on this input.
|
|
49
|
+
* Pure function — no side effects, no IO except git/cwd checks for predicates
|
|
50
|
+
* that explicitly require them.
|
|
51
|
+
*
|
|
52
|
+
* Returns true if the hook should fire (all declared predicates pass), false
|
|
53
|
+
* if it should be skipped.
|
|
54
|
+
*/
|
|
55
|
+
export function shouldFire(matches, input) {
|
|
56
|
+
if (!matches)
|
|
57
|
+
return true;
|
|
58
|
+
const cwd = input.cwd || process.cwd();
|
|
59
|
+
if (matches.prompt_contains !== undefined) {
|
|
60
|
+
const prompt = input.prompt ?? '';
|
|
61
|
+
if (!prompt.includes(matches.prompt_contains))
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (matches.prompt_matches !== undefined) {
|
|
65
|
+
const prompt = input.prompt ?? '';
|
|
66
|
+
let re;
|
|
67
|
+
try {
|
|
68
|
+
re = new RegExp(matches.prompt_matches);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
if (!re.test(prompt))
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (matches.tool_name !== undefined) {
|
|
77
|
+
const allowed = arrayOf(matches.tool_name);
|
|
78
|
+
if (allowed.length > 0) {
|
|
79
|
+
if (!input.tool_name)
|
|
80
|
+
return false;
|
|
81
|
+
if (!allowed.includes(input.tool_name))
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (matches.tool_args_match !== undefined) {
|
|
86
|
+
const serialized = typeof input.tool_args === 'string'
|
|
87
|
+
? input.tool_args
|
|
88
|
+
: JSON.stringify(input.tool_args ?? '');
|
|
89
|
+
let re;
|
|
90
|
+
try {
|
|
91
|
+
re = new RegExp(matches.tool_args_match);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
if (!re.test(serialized))
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (matches.cwd_includes !== undefined) {
|
|
100
|
+
const needles = arrayOf(matches.cwd_includes);
|
|
101
|
+
if (needles.length > 0) {
|
|
102
|
+
const hit = needles.some((n) => cwd.includes(n));
|
|
103
|
+
if (!hit)
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (matches.project_has !== undefined) {
|
|
108
|
+
const root = findProjectRoot(cwd);
|
|
109
|
+
if (!root)
|
|
110
|
+
return false;
|
|
111
|
+
if (!fs.existsSync(path.join(root, matches.project_has)))
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (matches.git_dirty !== undefined) {
|
|
115
|
+
const dirty = isGitDirty(cwd);
|
|
116
|
+
if (matches.git_dirty !== dirty)
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
package/dist/lib/hooks.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook management -- discovery, registration, and syncing of event hooks.
|
|
3
|
+
*
|
|
4
|
+
* Hooks are shell scripts in ~/.agents/hooks/ that fire on agent events
|
|
5
|
+
* (tool calls, session start, etc.). Each hook directory contains a manifest
|
|
6
|
+
* (agents.yaml) declaring events, matchers, and timeout. This module handles
|
|
7
|
+
* parsing those manifests, registering hooks into agent-native settings files,
|
|
8
|
+
* and syncing them across version switches.
|
|
9
|
+
*/
|
|
1
10
|
import type { AgentId, InstalledHook, ManifestHook } from './types.js';
|
|
2
11
|
export type HookEntry = {
|
|
3
12
|
name: string;
|
|
@@ -93,12 +102,17 @@ export declare function installHooksCentrally(source: string): Promise<{
|
|
|
93
102
|
errors: string[];
|
|
94
103
|
}>;
|
|
95
104
|
/**
|
|
96
|
-
* List hooks from
|
|
105
|
+
* List hooks from user (~/.agents/hooks/) and system (~/.agents-system/hooks/) dirs.
|
|
106
|
+
* User dir takes priority; deduplication preserves first occurrence.
|
|
97
107
|
*/
|
|
98
108
|
export declare function listCentralHooks(): HookEntry[];
|
|
99
109
|
/**
|
|
100
|
-
* Parse ~/.agents/hooks.yaml
|
|
101
|
-
*
|
|
110
|
+
* Parse hooks.yaml manifests. Reads BOTH system (~/.agents-system/hooks.yaml)
|
|
111
|
+
* and user (~/.agents/hooks.yaml), merging with user-wins-on-key-collision
|
|
112
|
+
* precedence. A user entry with `enabled: false` disables the system-shipped
|
|
113
|
+
* hook of the same name without forking the system file.
|
|
114
|
+
*
|
|
115
|
+
* Hooks marked `enabled: false` are dropped from the returned map.
|
|
102
116
|
*/
|
|
103
117
|
export declare function parseHookManifest(): Record<string, ManifestHook>;
|
|
104
118
|
/**
|
|
@@ -113,4 +127,3 @@ export declare function registerHooksToSettings(agentId: AgentId, versionHome: s
|
|
|
113
127
|
registered: string[];
|
|
114
128
|
errors: string[];
|
|
115
129
|
};
|
|
116
|
-
//# sourceMappingURL=hooks.d.ts.map
|
package/dist/lib/hooks.js
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook management -- discovery, registration, and syncing of event hooks.
|
|
3
|
+
*
|
|
4
|
+
* Hooks are shell scripts in ~/.agents/hooks/ that fire on agent events
|
|
5
|
+
* (tool calls, session start, etc.). Each hook directory contains a manifest
|
|
6
|
+
* (agents.yaml) declaring events, matchers, and timeout. This module handles
|
|
7
|
+
* parsing those manifests, registering hooks into agent-native settings files,
|
|
8
|
+
* and syncing them across version switches.
|
|
9
|
+
*/
|
|
1
10
|
import * as fs from 'fs';
|
|
2
11
|
import * as path from 'path';
|
|
3
12
|
import * as yaml from 'yaml';
|
|
4
13
|
import * as TOML from 'smol-toml';
|
|
5
14
|
import { AGENTS, HOOKS_CAPABLE_AGENTS } from './agents.js';
|
|
6
|
-
import {
|
|
15
|
+
import { supports, explainSkip } from './capabilities.js';
|
|
16
|
+
import { setGeminiAutoUpdateDisabled, updateGeminiSettings } from './gemini-settings.js';
|
|
17
|
+
import { getAgentsDir, getHooksDir as getSystemHooksDir, getUserHooksDir, getUserAgentsDir, getProjectAgentsDir } from './state.js';
|
|
18
|
+
function getCentralHooksDir() { return getUserHooksDir(); }
|
|
7
19
|
import { getEffectiveHome, getVersionHomePath, listInstalledVersions } from './versions.js';
|
|
8
20
|
const SCRIPT_EXTENSIONS = new Set([
|
|
9
21
|
'.sh',
|
|
@@ -329,6 +341,10 @@ export function diffVersionHooks(agent, version) {
|
|
|
329
341
|
* Install a single hook from central into a specific version home.
|
|
330
342
|
*/
|
|
331
343
|
export function installHookToVersion(agent, version, hookName) {
|
|
344
|
+
const gate = supports(agent, 'hooks', version);
|
|
345
|
+
if (!gate.ok) {
|
|
346
|
+
return { success: false, error: explainSkip(agent, 'hooks', gate, version) };
|
|
347
|
+
}
|
|
332
348
|
const central = listHookEntriesFromDir(getCentralHooksDir()).find((e) => e.name === hookName);
|
|
333
349
|
if (!central) {
|
|
334
350
|
return { success: false, error: `Hook '${hookName}' not found in central` };
|
|
@@ -464,28 +480,56 @@ export async function installHooksCentrally(source) {
|
|
|
464
480
|
return { installed, errors };
|
|
465
481
|
}
|
|
466
482
|
/**
|
|
467
|
-
* List hooks from
|
|
483
|
+
* List hooks from user (~/.agents/hooks/) and system (~/.agents-system/hooks/) dirs.
|
|
484
|
+
* User dir takes priority; deduplication preserves first occurrence.
|
|
468
485
|
*/
|
|
469
486
|
export function listCentralHooks() {
|
|
470
|
-
|
|
487
|
+
const seen = new Set();
|
|
488
|
+
const results = [];
|
|
489
|
+
for (const dir of [getUserHooksDir(), getSystemHooksDir()]) {
|
|
490
|
+
for (const entry of listHookEntriesFromDir(dir)) {
|
|
491
|
+
if (!seen.has(entry.name)) {
|
|
492
|
+
seen.add(entry.name);
|
|
493
|
+
results.push(entry);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return results;
|
|
471
498
|
}
|
|
472
499
|
/**
|
|
473
|
-
* Parse ~/.agents/hooks.yaml
|
|
474
|
-
*
|
|
500
|
+
* Parse hooks.yaml manifests. Reads BOTH system (~/.agents-system/hooks.yaml)
|
|
501
|
+
* and user (~/.agents/hooks.yaml), merging with user-wins-on-key-collision
|
|
502
|
+
* precedence. A user entry with `enabled: false` disables the system-shipped
|
|
503
|
+
* hook of the same name without forking the system file.
|
|
504
|
+
*
|
|
505
|
+
* Hooks marked `enabled: false` are dropped from the returned map.
|
|
475
506
|
*/
|
|
476
507
|
export function parseHookManifest() {
|
|
477
|
-
const
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
508
|
+
const merged = {};
|
|
509
|
+
// System first (lower precedence), user second (overrides).
|
|
510
|
+
for (const dir of [getAgentsDir(), getUserAgentsDir()]) {
|
|
511
|
+
const manifestPath = path.join(dir, 'hooks.yaml');
|
|
512
|
+
if (!fs.existsSync(manifestPath))
|
|
513
|
+
continue;
|
|
514
|
+
try {
|
|
515
|
+
const content = fs.readFileSync(manifestPath, 'utf-8');
|
|
516
|
+
const parsed = yaml.parse(content);
|
|
517
|
+
if (!parsed)
|
|
518
|
+
continue;
|
|
519
|
+
for (const [name, def] of Object.entries(parsed)) {
|
|
520
|
+
merged[name] = def;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
catch {
|
|
524
|
+
/* skip unreadable manifest, keep going */
|
|
525
|
+
}
|
|
485
526
|
}
|
|
486
|
-
|
|
487
|
-
|
|
527
|
+
// Strip disabled hooks so they never reach the registrar.
|
|
528
|
+
for (const [name, def] of Object.entries(merged)) {
|
|
529
|
+
if (def.enabled === false)
|
|
530
|
+
delete merged[name];
|
|
488
531
|
}
|
|
532
|
+
return merged;
|
|
489
533
|
}
|
|
490
534
|
// Codex events that support a matcher field (matches tool name or session type).
|
|
491
535
|
// UserPromptSubmit and Stop never include a matcher.
|
|
@@ -510,8 +554,21 @@ export function registerHooksToSettings(agentId, versionHome, hookManifest, agen
|
|
|
510
554
|
if (agentId === 'codex') {
|
|
511
555
|
return registerHooksForCodex(versionHome, manifest, agentsDir);
|
|
512
556
|
}
|
|
557
|
+
if (agentId === 'gemini') {
|
|
558
|
+
return registerHooksForGemini(versionHome, manifest, agentsDir);
|
|
559
|
+
}
|
|
513
560
|
return { registered: [], errors: [] };
|
|
514
561
|
}
|
|
562
|
+
/**
|
|
563
|
+
* Gemini has no native UserPromptSubmit event — map it to BeforeAgent,
|
|
564
|
+
* the closest lifecycle phase that fires before the model sees the prompt.
|
|
565
|
+
* Note: gemini's BeforeAgent can only APPEND via additionalContext — it
|
|
566
|
+
* cannot replace the prompt. The hook script branches on caller to emit
|
|
567
|
+
* the correct protocol.
|
|
568
|
+
*/
|
|
569
|
+
const GEMINI_EVENT_MAP = {
|
|
570
|
+
UserPromptSubmit: 'BeforeAgent',
|
|
571
|
+
};
|
|
515
572
|
function registerHooksForClaude(versionHome, manifest, agentsDir) {
|
|
516
573
|
const registered = [];
|
|
517
574
|
const errors = [];
|
|
@@ -531,9 +588,33 @@ function registerHooksForClaude(versionHome, manifest, agentsDir) {
|
|
|
531
588
|
config.hooks = {};
|
|
532
589
|
}
|
|
533
590
|
const hooks = config.hooks;
|
|
534
|
-
|
|
535
|
-
|
|
591
|
+
// Build set of all command paths the current manifest will register.
|
|
592
|
+
// Used to garbage-collect stale entries left behind after hook renames.
|
|
593
|
+
const managedHooksPrefix = path.join(agentsDir, 'hooks') + path.sep;
|
|
594
|
+
const currentManifestPaths = new Set();
|
|
595
|
+
for (const hookDef of Object.values(manifest)) {
|
|
596
|
+
if (!hookDef.events || hookDef.events.length === 0)
|
|
536
597
|
continue;
|
|
598
|
+
currentManifestPaths.add(path.join(agentsDir, 'hooks', hookDef.script));
|
|
599
|
+
}
|
|
600
|
+
// Remove stale entries: any hook command under ~/.agents/hooks/ that isn't
|
|
601
|
+
// in the current manifest is a leftover from a renamed/deleted hook script.
|
|
602
|
+
for (const eventEntries of Object.values(hooks)) {
|
|
603
|
+
if (!Array.isArray(eventEntries))
|
|
604
|
+
continue;
|
|
605
|
+
for (const group of eventEntries) {
|
|
606
|
+
if (!group.hooks)
|
|
607
|
+
continue;
|
|
608
|
+
group.hooks = group.hooks.filter((h) => !h.command.startsWith(managedHooksPrefix) || currentManifestPaths.has(h.command));
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
// Remove empty matcher groups left after cleanup
|
|
612
|
+
for (const [event, eventEntries] of Object.entries(hooks)) {
|
|
613
|
+
if (!Array.isArray(eventEntries))
|
|
614
|
+
continue;
|
|
615
|
+
hooks[event] = eventEntries.filter((g) => g.hooks && g.hooks.length > 0);
|
|
616
|
+
}
|
|
617
|
+
for (const [name, hookDef] of Object.entries(manifest)) {
|
|
537
618
|
if (!hookDef.events || hookDef.events.length === 0)
|
|
538
619
|
continue;
|
|
539
620
|
const commandPath = path.join(agentsDir, 'hooks', hookDef.script);
|
|
@@ -600,9 +681,26 @@ function registerHooksForCodex(versionHome, manifest, agentsDir) {
|
|
|
600
681
|
return { registered, errors };
|
|
601
682
|
}
|
|
602
683
|
}
|
|
603
|
-
for
|
|
604
|
-
|
|
684
|
+
// Build set of current manifest command paths for codex to GC stale entries
|
|
685
|
+
const managedHooksPrefix = path.join(agentsDir, 'hooks') + path.sep;
|
|
686
|
+
const currentManifestPaths = new Set();
|
|
687
|
+
for (const hookDef of Object.values(manifest)) {
|
|
688
|
+
if (!hookDef.events || hookDef.events.length === 0)
|
|
605
689
|
continue;
|
|
690
|
+
currentManifestPaths.add(path.join(agentsDir, 'hooks', hookDef.script));
|
|
691
|
+
}
|
|
692
|
+
// Remove stale entries from all event groups
|
|
693
|
+
for (const eventGroups of Object.values(hooksFile.hooks)) {
|
|
694
|
+
for (const group of eventGroups) {
|
|
695
|
+
if (!group.hooks)
|
|
696
|
+
continue;
|
|
697
|
+
group.hooks = group.hooks.filter((h) => !h.command.startsWith(managedHooksPrefix) || currentManifestPaths.has(h.command));
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
for (const [event, eventGroups] of Object.entries(hooksFile.hooks)) {
|
|
701
|
+
hooksFile.hooks[event] = eventGroups.filter((g) => g.hooks && g.hooks.length > 0);
|
|
702
|
+
}
|
|
703
|
+
for (const [name, hookDef] of Object.entries(manifest)) {
|
|
606
704
|
if (!hookDef.events || hookDef.events.length === 0)
|
|
607
705
|
continue;
|
|
608
706
|
const commandPath = path.join(agentsDir, 'hooks', hookDef.script);
|
|
@@ -639,7 +737,6 @@ function registerHooksForCodex(versionHome, manifest, agentsDir) {
|
|
|
639
737
|
if (!group.hooks) {
|
|
640
738
|
group.hooks = [];
|
|
641
739
|
}
|
|
642
|
-
// Add or update by exact command path — never removes other entries
|
|
643
740
|
const existingIdx = group.hooks.findIndex((h) => h.command === commandPath);
|
|
644
741
|
const hookEntry = { type: 'command', command: commandPath, timeout };
|
|
645
742
|
if (existingIdx >= 0) {
|
|
@@ -682,4 +779,77 @@ function registerHooksForCodex(versionHome, manifest, agentsDir) {
|
|
|
682
779
|
}
|
|
683
780
|
return { registered, errors };
|
|
684
781
|
}
|
|
685
|
-
|
|
782
|
+
function registerHooksForGemini(versionHome, manifest, agentsDir) {
|
|
783
|
+
const registered = [];
|
|
784
|
+
const errors = [];
|
|
785
|
+
const settingsPath = path.join(versionHome, '.gemini', 'settings.json');
|
|
786
|
+
try {
|
|
787
|
+
updateGeminiSettings(settingsPath, (config) => {
|
|
788
|
+
setGeminiAutoUpdateDisabled(config);
|
|
789
|
+
if (!config.hooks || typeof config.hooks !== 'object') {
|
|
790
|
+
config.hooks = {};
|
|
791
|
+
}
|
|
792
|
+
const hooks = config.hooks;
|
|
793
|
+
const managedHooksPrefix = path.join(agentsDir, 'hooks') + path.sep;
|
|
794
|
+
const currentManifestPaths = new Set();
|
|
795
|
+
for (const hookDef of Object.values(manifest)) {
|
|
796
|
+
if (!hookDef.events || hookDef.events.length === 0)
|
|
797
|
+
continue;
|
|
798
|
+
currentManifestPaths.add(path.join(agentsDir, 'hooks', hookDef.script));
|
|
799
|
+
}
|
|
800
|
+
for (const eventEntries of Object.values(hooks)) {
|
|
801
|
+
if (!Array.isArray(eventEntries))
|
|
802
|
+
continue;
|
|
803
|
+
for (const group of eventEntries) {
|
|
804
|
+
if (!group.hooks)
|
|
805
|
+
continue;
|
|
806
|
+
group.hooks = group.hooks.filter((h) => !h.command.startsWith(managedHooksPrefix) || currentManifestPaths.has(h.command));
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
for (const [event, eventEntries] of Object.entries(hooks)) {
|
|
810
|
+
if (!Array.isArray(eventEntries))
|
|
811
|
+
continue;
|
|
812
|
+
hooks[event] = eventEntries.filter((g) => g.hooks && g.hooks.length > 0);
|
|
813
|
+
}
|
|
814
|
+
for (const [name, hookDef] of Object.entries(manifest)) {
|
|
815
|
+
if (!hookDef.events || hookDef.events.length === 0)
|
|
816
|
+
continue;
|
|
817
|
+
const commandPath = path.join(agentsDir, 'hooks', hookDef.script);
|
|
818
|
+
if (!fs.existsSync(commandPath)) {
|
|
819
|
+
errors.push(`${name}: script not found at ${commandPath}`);
|
|
820
|
+
continue;
|
|
821
|
+
}
|
|
822
|
+
const timeoutMs = (hookDef.timeout || 600) * 1000;
|
|
823
|
+
for (const event of hookDef.events) {
|
|
824
|
+
const geminiEvent = GEMINI_EVENT_MAP[event] ?? event;
|
|
825
|
+
if (!hooks[geminiEvent]) {
|
|
826
|
+
hooks[geminiEvent] = [];
|
|
827
|
+
}
|
|
828
|
+
const eventEntries = hooks[geminiEvent];
|
|
829
|
+
const matcher = hookDef.matcher || '';
|
|
830
|
+
let matcherGroup = eventEntries.find((e) => (e.matcher || '') === matcher);
|
|
831
|
+
if (!matcherGroup) {
|
|
832
|
+
matcherGroup = { matcher, hooks: [] };
|
|
833
|
+
eventEntries.push(matcherGroup);
|
|
834
|
+
}
|
|
835
|
+
if (!matcherGroup.hooks) {
|
|
836
|
+
matcherGroup.hooks = [];
|
|
837
|
+
}
|
|
838
|
+
const existingIdx = matcherGroup.hooks.findIndex((h) => h.command === commandPath);
|
|
839
|
+
const hookEntry = { name, type: 'command', command: commandPath, timeout: timeoutMs };
|
|
840
|
+
if (existingIdx >= 0) {
|
|
841
|
+
matcherGroup.hooks[existingIdx] = hookEntry;
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
matcherGroup.hooks.push(hookEntry);
|
|
845
|
+
}
|
|
846
|
+
registered.push(`${name} -> ${geminiEvent}`);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
});
|
|
850
|
+
}
|
|
851
|
+
catch (err) {
|
|
852
|
+
errors.push(`Failed to write gemini settings.json: ${err.message}`);
|
|
853
|
+
}
|
|
854
|
+
return { registered, errors };
|
|
855
|
+
}
|
package/dist/lib/manifest.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { Manifest } from './types.js';
|
|
2
|
+
/** Canonical filename for the manifest in any agents repo or project root. */
|
|
2
3
|
export declare const MANIFEST_FILENAME = "agents.yaml";
|
|
4
|
+
/** Parse a YAML string into a typed Manifest object. */
|
|
3
5
|
export declare function parseManifest(content: string): Manifest;
|
|
6
|
+
/** Serialize a Manifest object to a YAML string with 2-space indentation. */
|
|
4
7
|
export declare function serializeManifest(manifest: Manifest): string;
|
|
8
|
+
/** Read and parse agents.yaml from a directory. Returns null if the file does not exist. */
|
|
5
9
|
export declare function readManifest(repoPath: string): Manifest | null;
|
|
10
|
+
/** Write a Manifest object to agents.yaml in the given directory. */
|
|
6
11
|
export declare function writeManifest(repoPath: string, manifest: Manifest): void;
|
|
12
|
+
/** Create a Manifest with sensible defaults for a fresh agents repo. */
|
|
7
13
|
export declare function createDefaultManifest(): Manifest;
|
|
8
|
-
//# sourceMappingURL=manifest.d.ts.map
|
package/dist/lib/manifest.js
CHANGED
|
@@ -1,26 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agents.yaml manifest reading, writing, and serialization.
|
|
3
|
+
*
|
|
4
|
+
* The manifest file (agents.yaml) is the central configuration for version defaults,
|
|
5
|
+
* repository overrides, dependencies, and MCP server declarations.
|
|
6
|
+
*/
|
|
1
7
|
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
8
|
import * as yaml from 'yaml';
|
|
9
|
+
import { safeJoin } from './paths.js';
|
|
10
|
+
/** Canonical filename for the manifest in any agents repo or project root. */
|
|
4
11
|
export const MANIFEST_FILENAME = 'agents.yaml';
|
|
12
|
+
/** Parse a YAML string into a typed Manifest object. */
|
|
5
13
|
export function parseManifest(content) {
|
|
6
14
|
return yaml.parse(content);
|
|
7
15
|
}
|
|
16
|
+
/** Serialize a Manifest object to a YAML string with 2-space indentation. */
|
|
8
17
|
export function serializeManifest(manifest) {
|
|
9
18
|
return yaml.stringify(manifest, { indent: 2 });
|
|
10
19
|
}
|
|
20
|
+
/** Read and parse agents.yaml from a directory. Returns null if the file does not exist. */
|
|
11
21
|
export function readManifest(repoPath) {
|
|
12
|
-
const manifestPath =
|
|
22
|
+
const manifestPath = safeJoin(repoPath, MANIFEST_FILENAME);
|
|
13
23
|
if (!fs.existsSync(manifestPath)) {
|
|
14
24
|
return null;
|
|
15
25
|
}
|
|
16
26
|
const content = fs.readFileSync(manifestPath, 'utf-8');
|
|
17
27
|
return parseManifest(content);
|
|
18
28
|
}
|
|
29
|
+
/** Write a Manifest object to agents.yaml in the given directory. */
|
|
19
30
|
export function writeManifest(repoPath, manifest) {
|
|
20
|
-
const manifestPath =
|
|
31
|
+
const manifestPath = safeJoin(repoPath, MANIFEST_FILENAME);
|
|
21
32
|
const content = serializeManifest(manifest);
|
|
22
33
|
fs.writeFileSync(manifestPath, content, 'utf-8');
|
|
23
34
|
}
|
|
35
|
+
/** Create a Manifest with sensible defaults for a fresh agents repo. */
|
|
24
36
|
export function createDefaultManifest() {
|
|
25
37
|
return {
|
|
26
38
|
agents: {},
|
|
@@ -33,4 +45,3 @@ export function createDefaultManifest() {
|
|
|
33
45
|
},
|
|
34
46
|
};
|
|
35
47
|
}
|
|
36
|
-
//# sourceMappingURL=manifest.js.map
|
package/dist/lib/markdown.d.ts
CHANGED
package/dist/lib/markdown.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal-aware Markdown rendering using marked and marked-terminal.
|
|
3
|
+
*
|
|
4
|
+
* Provides a single function for converting Markdown content into
|
|
5
|
+
* ANSI-formatted text suitable for terminal output.
|
|
6
|
+
*/
|
|
1
7
|
import { marked } from 'marked';
|
|
2
8
|
import { markedTerminal } from 'marked-terminal';
|
|
3
9
|
// @ts-expect-error - marked-terminal types don't match marked's MarkedExtension
|
|
@@ -8,4 +14,3 @@ marked.use(markedTerminal());
|
|
|
8
14
|
export function renderMarkdown(content) {
|
|
9
15
|
return marked.parse(content);
|
|
10
16
|
}
|
|
11
|
-
//# sourceMappingURL=markdown.js.map
|
package/dist/lib/mcp.d.ts
CHANGED