@phnx-labs/agents-cli 1.22.119 → 1.22.121
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 +236 -0
- package/README.md +19 -2
- package/dist/bootstrap.d.ts +0 -15
- package/dist/bootstrap.js +10 -409
- package/dist/cli/command-registry.d.ts +0 -58
- package/dist/cli/command-registry.js +2 -74
- package/dist/commands/accounts.d.ts +0 -17
- package/dist/commands/accounts.js +1 -52
- package/dist/commands/alias.d.ts +0 -12
- package/dist/commands/alias.js +0 -6
- package/dist/commands/apply.d.ts +0 -15
- package/dist/commands/apply.js +0 -63
- package/dist/commands/audit.d.ts +0 -12
- package/dist/commands/audit.js +0 -13
- package/dist/commands/auth.js +4 -12
- package/dist/commands/beta.d.ts +0 -6
- package/dist/commands/beta.js +2 -6
- package/dist/commands/browser-sessions-picker.d.ts +0 -8
- package/dist/commands/browser-sessions-picker.js +0 -26
- package/dist/commands/browser.d.ts +0 -57
- package/dist/commands/browser.js +0 -80
- package/dist/commands/budget.d.ts +0 -13
- package/dist/commands/budget.js +0 -2
- package/dist/commands/cli.d.ts +0 -12
- package/dist/commands/cli.js +0 -4
- package/dist/commands/cloud.d.ts +0 -9
- package/dist/commands/cloud.js +0 -43
- package/dist/commands/commands.d.ts +0 -9
- package/dist/commands/commands.js +0 -18
- package/dist/commands/computer-sessions-picker.d.ts +0 -11
- package/dist/commands/computer-sessions-picker.js +0 -29
- package/dist/commands/computer.d.ts +0 -62
- package/dist/commands/computer.js +3 -114
- package/dist/commands/config.d.ts +0 -14
- package/dist/commands/config.js +21 -60
- package/dist/commands/cost.d.ts +0 -11
- package/dist/commands/cost.js +1 -17
- package/dist/commands/daemon-test-harness.d.ts +0 -32
- package/dist/commands/daemon-test-harness.js +1 -36
- package/dist/commands/daemon.d.ts +0 -46
- package/dist/commands/daemon.js +8 -255
- package/dist/commands/detach-core.d.ts +0 -28
- package/dist/commands/detach-core.js +0 -30
- package/dist/commands/detach.d.ts +1 -12
- package/dist/commands/detach.js +16 -52
- package/dist/commands/device-config-test-harness.js +0 -12
- package/dist/commands/doctor.d.ts +0 -103
- package/dist/commands/doctor.js +3 -279
- package/dist/commands/events.d.ts +0 -29
- package/dist/commands/events.js +1 -55
- package/dist/commands/exec.d.ts +0 -163
- package/dist/commands/exec.js +15 -964
- package/dist/commands/factory.d.ts +0 -6
- package/dist/commands/factory.js +0 -2
- package/dist/commands/feed-watch.js +0 -20
- package/dist/commands/feed.d.ts +0 -38
- package/dist/commands/feed.js +1 -151
- package/dist/commands/feedback.d.ts +0 -5
- package/dist/commands/feedback.js +0 -5
- package/dist/commands/fleet-capture.d.ts +0 -12
- package/dist/commands/fleet-capture.js +1 -39
- package/dist/commands/focus.d.ts +6 -94
- package/dist/commands/focus.js +13 -183
- package/dist/commands/fork.d.ts +0 -21
- package/dist/commands/fork.js +0 -45
- package/dist/commands/funnel.d.ts +0 -3
- package/dist/commands/go.d.ts +2 -71
- package/dist/commands/go.js +5 -99
- package/dist/commands/harness-hooks.d.ts +0 -41
- package/dist/commands/harness-hooks.js +0 -48
- package/dist/commands/harness-wizard.d.ts +0 -137
- package/dist/commands/harness-wizard.js +0 -109
- package/dist/commands/harness.d.ts +0 -63
- package/dist/commands/harness.js +0 -103
- package/dist/commands/hooks.d.ts +0 -9
- package/dist/commands/hooks.js +0 -26
- package/dist/commands/humans.d.ts +0 -8
- package/dist/commands/humans.js +0 -8
- package/dist/commands/import.d.ts +0 -22
- package/dist/commands/import.js +0 -79
- package/dist/commands/insights.d.ts +0 -37
- package/dist/commands/insights.js +3 -115
- package/dist/commands/inspect.d.ts +0 -117
- package/dist/commands/inspect.js +2 -448
- package/dist/commands/lease.d.ts +0 -28
- package/dist/commands/lease.js +0 -43
- package/dist/commands/logs.d.ts +0 -23
- package/dist/commands/logs.js +0 -30
- package/dist/commands/mailboxes.d.ts +0 -18
- package/dist/commands/mailboxes.js +0 -29
- package/dist/commands/mcp.d.ts +0 -9
- package/dist/commands/mcp.js +0 -53
- package/dist/commands/memory.d.ts +0 -7
- package/dist/commands/memory.js +0 -7
- package/dist/commands/menubar.d.ts +0 -8
- package/dist/commands/menubar.js +0 -24
- package/dist/commands/message.d.ts +0 -23
- package/dist/commands/message.js +0 -50
- package/dist/commands/mine.d.ts +0 -22
- package/dist/commands/mine.js +0 -21
- package/dist/commands/models.d.ts +0 -8
- package/dist/commands/models.js +0 -33
- package/dist/commands/modes.d.ts +0 -10
- package/dist/commands/modes.js +0 -13
- package/dist/commands/monitors.d.ts +0 -9
- package/dist/commands/monitors.js +3 -160
- package/dist/commands/open.d.ts +0 -26
- package/dist/commands/open.js +0 -10
- package/dist/commands/output.d.ts +0 -18
- package/dist/commands/output.js +1 -34
- package/dist/commands/packages-materialize.d.ts +0 -11
- package/dist/commands/packages-materialize.js +0 -3
- package/dist/commands/packages.d.ts +0 -10
- package/dist/commands/packages.js +0 -50
- package/dist/commands/perf.d.ts +0 -41
- package/dist/commands/perf.js +0 -55
- package/dist/commands/permissions.d.ts +0 -9
- package/dist/commands/permissions.js +0 -43
- package/dist/commands/plugins.d.ts +0 -14
- package/dist/commands/plugins.js +2 -55
- package/dist/commands/profiles.d.ts +0 -25
- package/dist/commands/profiles.js +0 -27
- package/dist/commands/projects-todo.d.ts +2 -0
- package/dist/commands/projects-todo.js +132 -0
- package/dist/commands/projects.d.ts +0 -85
- package/dist/commands/projects.js +344 -291
- package/dist/commands/prune.js +0 -30
- package/dist/commands/ps-roster.d.ts +92 -0
- package/dist/commands/ps-roster.js +744 -0
- package/dist/commands/ps.d.ts +6 -0
- package/dist/commands/ps.js +98 -0
- package/dist/commands/refresh-rules.d.ts +0 -13
- package/dist/commands/refresh-rules.js +0 -14
- package/dist/commands/reminders.d.ts +0 -7
- package/dist/commands/repo.d.ts +0 -89
- package/dist/commands/repo.js +7 -205
- package/dist/commands/resource-view.d.ts +0 -33
- package/dist/commands/resource-view.js +0 -49
- package/dist/commands/resume.d.ts +1 -19
- package/dist/commands/resume.js +0 -50
- package/dist/commands/route.d.ts +0 -10
- package/dist/commands/route.js +0 -19
- package/dist/commands/routines.d.ts +0 -42
- package/dist/commands/routines.js +5 -290
- package/dist/commands/routines.test-fixture.d.ts +0 -34
- package/dist/commands/routines.test-fixture.js +4 -100
- package/dist/commands/rules.d.ts +0 -9
- package/dist/commands/rules.js +1 -6
- package/dist/commands/run-account-picker.d.ts +0 -59
- package/dist/commands/run-account-picker.js +0 -71
- package/dist/commands/run-broadcast.d.ts +0 -9
- package/dist/commands/run-broadcast.js +0 -7
- package/dist/commands/run-cloud.d.ts +0 -15
- package/dist/commands/run-cloud.js +0 -37
- package/dist/commands/run-device-picker.d.ts +0 -25
- package/dist/commands/run-device-picker.js +1 -53
- package/dist/commands/secrets-passthrough.d.ts +0 -31
- package/dist/commands/secrets-passthrough.js +0 -10
- package/dist/commands/send.d.ts +0 -20
- package/dist/commands/send.js +14 -18
- package/dist/commands/sessions-backfill.d.ts +0 -7
- package/dist/commands/sessions-backfill.js +1 -16
- package/dist/commands/sessions-backup-setup.js +0 -11
- package/dist/commands/sessions-bookmark.d.ts +0 -8
- package/dist/commands/sessions-bookmark.js +0 -28
- package/dist/commands/sessions-browser.d.ts +2 -117
- package/dist/commands/sessions-browser.js +5 -243
- package/dist/commands/sessions-export.d.ts +1 -26
- package/dist/commands/sessions-export.js +3 -81
- package/dist/commands/sessions-import.d.ts +0 -14
- package/dist/commands/sessions-import.js +0 -59
- package/dist/commands/sessions-inject.d.ts +0 -60
- package/dist/commands/sessions-inject.js +3 -96
- package/dist/commands/sessions-migrate.d.ts +2 -37
- package/dist/commands/sessions-migrate.js +7 -159
- package/dist/commands/sessions-optimize.d.ts +0 -12
- package/dist/commands/sessions-picker-factory.d.ts +0 -7
- package/dist/commands/sessions-picker-factory.js +0 -8
- package/dist/commands/sessions-picker.d.ts +4 -103
- package/dist/commands/sessions-picker.js +13 -352
- package/dist/commands/sessions-render.d.ts +1 -2
- package/dist/commands/sessions-render.js +3 -7
- package/dist/commands/sessions-resume.d.ts +1 -24
- package/dist/commands/sessions-resume.js +2 -65
- package/dist/commands/sessions-share.d.ts +1 -9
- package/dist/commands/sessions-share.js +1 -45
- package/dist/commands/sessions-stats.d.ts +0 -24
- package/dist/commands/sessions-stats.js +0 -49
- package/dist/commands/sessions-stop.d.ts +1 -20
- package/dist/commands/sessions-stop.js +4 -9
- package/dist/commands/sessions-tail.d.ts +1 -19
- package/dist/commands/sessions-tail.js +3 -36
- package/dist/commands/sessions-trace.d.ts +5 -36
- package/dist/commands/sessions-trace.js +7 -82
- package/dist/commands/sessions.d.ts +1 -666
- package/dist/commands/sessions.js +30 -2279
- package/dist/commands/sessions.test-fixture.d.ts +0 -9
- package/dist/commands/sessions.test-fixture.js +8 -23
- package/dist/commands/setup-accounts.d.ts +0 -6
- package/dist/commands/setup-browser.d.ts +0 -23
- package/dist/commands/setup-browser.js +0 -28
- package/dist/commands/setup-computer.d.ts +0 -16
- package/dist/commands/setup-computer.js +0 -28
- package/dist/commands/setup-fleet.d.ts +0 -8
- package/dist/commands/setup-fleet.js +0 -11
- package/dist/commands/setup-mine.d.ts +0 -14
- package/dist/commands/setup-mine.js +0 -25
- package/dist/commands/setup-preferences.d.ts +0 -47
- package/dist/commands/setup-preferences.js +0 -53
- package/dist/commands/setup-secrets.d.ts +2 -24
- package/dist/commands/setup-secrets.js +0 -24
- package/dist/commands/setup-term.d.ts +0 -21
- package/dist/commands/setup-term.js +0 -21
- package/dist/commands/setup-terminal.d.ts +0 -1
- package/dist/commands/setup-terminal.js +0 -1
- package/dist/commands/setup-tools.d.ts +2 -0
- package/dist/commands/setup-tools.js +73 -0
- package/dist/commands/setup.d.ts +0 -20
- package/dist/commands/setup.js +4 -57
- package/dist/commands/skills.d.ts +0 -9
- package/dist/commands/skills.js +1 -22
- package/dist/commands/snapshot.d.ts +0 -9
- package/dist/commands/snapshot.js +0 -10
- package/dist/commands/ssh.d.ts +0 -64
- package/dist/commands/ssh.js +9 -420
- package/dist/commands/status.d.ts +0 -12
- package/dist/commands/status.js +0 -26
- package/dist/commands/subagents.d.ts +0 -8
- package/dist/commands/subagents.js +0 -31
- package/dist/commands/sync.d.ts +0 -37
- package/dist/commands/sync.js +0 -256
- package/dist/commands/teams-picker.d.ts +0 -3
- package/dist/commands/teams-picker.js +0 -34
- package/dist/commands/teams.d.ts +1 -76
- package/dist/commands/teams.js +9 -477
- package/dist/commands/tmux.d.ts +0 -25
- package/dist/commands/tmux.js +0 -46
- package/dist/commands/traces.js +0 -19
- package/dist/commands/trash.d.ts +0 -17
- package/dist/commands/trash.js +1 -11
- package/dist/commands/uninstall.d.ts +0 -9
- package/dist/commands/uninstall.js +0 -6
- package/dist/commands/update.d.ts +0 -22
- package/dist/commands/update.js +0 -44
- package/dist/commands/upgrade.d.ts +0 -1
- package/dist/commands/upgrade.js +0 -1
- package/dist/commands/utils.d.ts +0 -85
- package/dist/commands/utils.js +1 -95
- package/dist/commands/versions.d.ts +0 -16
- package/dist/commands/versions.js +0 -134
- package/dist/commands/view.d.ts +0 -90
- package/dist/commands/view.js +4 -343
- package/dist/commands/watchdog.d.ts +0 -19
- package/dist/commands/watchdog.js +3 -43
- package/dist/commands/webhook.d.ts +0 -8
- package/dist/commands/webhook.js +0 -14
- package/dist/commands/workflows.d.ts +0 -8
- package/dist/commands/workflows.js +0 -6
- package/dist/index.d.ts +0 -25
- package/dist/index.js +5 -119
- package/dist/lib/account-capabilities.d.ts +0 -34
- package/dist/lib/account-capabilities.js +0 -32
- package/dist/lib/account-catalog.d.ts +0 -128
- package/dist/lib/account-catalog.js +8 -154
- package/dist/lib/account-provider-registry.d.ts +0 -14
- package/dist/lib/account-provider-registry.js +0 -8
- package/dist/lib/account-registry.d.ts +0 -74
- package/dist/lib/account-registry.js +14 -189
- package/dist/lib/account-schema.d.ts +0 -19
- package/dist/lib/account-schema.js +0 -43
- package/dist/lib/accounting/account-launch.d.ts +0 -15
- package/dist/lib/accounting/account-launch.js +1 -3
- package/dist/lib/accounting/account-pool-collect.d.ts +0 -26
- package/dist/lib/accounting/account-pool-collect.js +0 -42
- package/dist/lib/accounting/account-pool.d.ts +0 -41
- package/dist/lib/accounting/account-pool.js +0 -17
- package/dist/lib/accounting/capacity.d.ts +0 -32
- package/dist/lib/accounting/capacity.js +0 -32
- package/dist/lib/accounting/rotate.d.ts +0 -518
- package/dist/lib/accounting/rotate.js +4 -598
- package/dist/lib/accounting/usage-ingest.d.ts +0 -1
- package/dist/lib/accounting/usage-ingest.js +0 -44
- package/dist/lib/accounting/usage-sync.d.ts +0 -60
- package/dist/lib/accounting/usage-sync.js +4 -51
- package/dist/lib/accounting/usage.d.ts +0 -632
- package/dist/lib/accounting/usage.js +14 -1055
- package/dist/lib/accounts/add.d.ts +0 -60
- package/dist/lib/accounts/add.js +0 -127
- package/dist/lib/accounts/auth-operation-lock.d.ts +0 -1
- package/dist/lib/accounts/auth-operation-lock.js +0 -4
- package/dist/lib/accounts/migrate.d.ts +0 -9
- package/dist/lib/accounts/migrate.js +3 -42
- package/dist/lib/accounts/slots.d.ts +0 -25
- package/dist/lib/accounts/slots.js +1 -49
- package/dist/lib/acp/client.d.ts +0 -16
- package/dist/lib/acp/client.js +0 -29
- package/dist/lib/acp/harnesses.d.ts +0 -15
- package/dist/lib/acp/harnesses.js +0 -16
- package/dist/lib/acp/run.d.ts +0 -8
- package/dist/lib/acp/run.js +0 -8
- package/dist/lib/actor.d.ts +1 -71
- package/dist/lib/actor.js +1 -99
- package/dist/lib/add-dir.d.ts +0 -46
- package/dist/lib/add-dir.js +1 -70
- package/dist/lib/address.d.ts +0 -17
- package/dist/lib/address.js +0 -15
- package/dist/lib/agent-cli-commands.d.ts +0 -10
- package/dist/lib/agent-cli-commands.js +0 -10
- package/dist/lib/agent-modes.d.ts +0 -29
- package/dist/lib/agent-modes.js +0 -31
- package/dist/lib/agent-spec/agents.d.ts +0 -426
- package/dist/lib/agent-spec/agents.js +37 -924
- package/dist/lib/agent-spec/index.d.ts +0 -5
- package/dist/lib/agent-spec/index.js +0 -14
- package/dist/lib/agent-spec/materialize.d.ts +0 -10
- package/dist/lib/agent-spec/materialize.js +2 -139
- package/dist/lib/agent-spec/package-resolve.d.ts +0 -8
- package/dist/lib/agent-spec/package-resolve.js +1 -44
- package/dist/lib/agent-spec/package-schema.d.ts +0 -2
- package/dist/lib/agent-spec/package-schema.js +0 -11
- package/dist/lib/agent-spec/package-types.d.ts +0 -27
- package/dist/lib/agent-spec/package-types.js +0 -1
- package/dist/lib/agent-spec/primitives.d.ts +0 -18
- package/dist/lib/agent-spec/primitives.js +0 -27
- package/dist/lib/agent-spec/provider.js +0 -2
- package/dist/lib/agent-spec/resolve.d.ts +0 -23
- package/dist/lib/agent-spec/resolve.js +0 -41
- package/dist/lib/agent-spec/types.d.ts +0 -34
- package/dist/lib/agent-spec/types.js +0 -6
- package/dist/lib/agents.d.ts +0 -1
- package/dist/lib/agents.js +0 -1
- package/dist/lib/analytics/mix-commands.d.ts +0 -23
- package/dist/lib/analytics/mix-commands.js +0 -26
- package/dist/lib/analytics/recipes.d.ts +0 -1
- package/dist/lib/analytics/recipes.js +5 -10
- package/dist/lib/analytics/usage-db.js +4 -6
- package/dist/lib/answer-router.d.ts +0 -61
- package/dist/lib/answer-router.js +0 -57
- package/dist/lib/app-bundle-install.d.ts +0 -13
- package/dist/lib/app-bundle-install.js +0 -50
- package/dist/lib/artifact-actions.d.ts +0 -15
- package/dist/lib/artifact-actions.js +0 -18
- package/dist/lib/artifacts-client.d.ts +0 -10
- package/dist/lib/artifacts-client.js +0 -17
- package/dist/lib/ask-classifier.d.ts +0 -38
- package/dist/lib/ask-classifier.js +0 -27
- package/dist/lib/audit/log.d.ts +0 -47
- package/dist/lib/audit/log.js +1 -59
- package/dist/lib/auth-health.d.ts +0 -213
- package/dist/lib/auth-health.js +16 -266
- package/dist/lib/auth-mint.d.ts +0 -83
- package/dist/lib/auth-mint.js +8 -85
- package/dist/lib/auto-pull-worker.d.ts +0 -10
- package/dist/lib/auto-pull-worker.js +3 -48
- package/dist/lib/auto-pull.d.ts +0 -64
- package/dist/lib/auto-pull.js +0 -79
- package/dist/lib/beta.d.ts +0 -9
- package/dist/lib/beta.js +0 -9
- package/dist/lib/binary-shadow.d.ts +0 -22
- package/dist/lib/binary-shadow.js +4 -34
- package/dist/lib/boot-profile.d.ts +0 -10
- package/dist/lib/boot-profile.js +1 -31
- package/dist/lib/brand.d.ts +0 -20
- package/dist/lib/brand.js +0 -50
- package/dist/lib/browser/context.d.ts +0 -54
- package/dist/lib/browser/context.js +0 -49
- package/dist/lib/browser/paths.d.ts +0 -21
- package/dist/lib/browser/paths.js +0 -26
- package/dist/lib/browser/record.d.ts +0 -34
- package/dist/lib/browser/record.js +0 -38
- package/dist/lib/browser/sessions-list.d.ts +1 -79
- package/dist/lib/browser/sessions-list.js +2 -98
- package/dist/lib/browser-client.d.ts +0 -112
- package/dist/lib/browser-client.js +1 -90
- package/dist/lib/budget/config.d.ts +0 -6
- package/dist/lib/budget/config.js +0 -29
- package/dist/lib/budget/enforce.d.ts +0 -50
- package/dist/lib/budget/enforce.js +0 -27
- package/dist/lib/budget/ledger.d.ts +0 -23
- package/dist/lib/budget/ledger.js +0 -28
- package/dist/lib/budget/live-cloud.d.ts +0 -26
- package/dist/lib/budget/live-cloud.js +0 -12
- package/dist/lib/budget/live-team.d.ts +0 -17
- package/dist/lib/budget/live-team.js +1 -35
- package/dist/lib/budget/preflight.d.ts +0 -51
- package/dist/lib/budget/preflight.js +0 -36
- package/dist/lib/byok-usage.d.ts +0 -20
- package/dist/lib/byok-usage.js +1 -24
- package/dist/lib/capabilities.d.ts +0 -24
- package/dist/lib/capabilities.js +0 -29
- package/dist/lib/catchup.d.ts +0 -87
- package/dist/lib/catchup.js +1 -81
- package/dist/lib/channels/owner-forward.d.ts +0 -70
- package/dist/lib/channels/owner-forward.js +1 -43
- package/dist/lib/channels/owner-sink.js +0 -21
- package/dist/lib/channels/providers/desktop.d.ts +0 -37
- package/dist/lib/channels/providers/desktop.js +0 -72
- package/dist/lib/channels/providers/index.d.ts +0 -1
- package/dist/lib/channels/providers/index.js +2 -6
- package/dist/lib/channels/providers/mailbox.js +0 -7
- package/dist/lib/channels/providers/openclaw-telegram.js +0 -8
- package/dist/lib/channels/providers/rush.d.ts +0 -2
- package/dist/lib/channels/providers/rush.js +0 -26
- package/dist/lib/channels/providers/session.d.ts +2 -0
- package/dist/lib/channels/providers/session.js +26 -0
- package/dist/lib/channels/registry.d.ts +0 -27
- package/dist/lib/channels/registry.js +0 -10
- package/dist/lib/channels/resolve.d.ts +0 -19
- package/dist/lib/channels/resolve.js +0 -2
- package/dist/lib/channels/send.d.ts +0 -50
- package/dist/lib/channels/send.js +0 -25
- package/dist/lib/checkpoint.d.ts +0 -36
- package/dist/lib/checkpoint.js +0 -28
- package/dist/lib/claude-account-token.d.ts +0 -98
- package/dist/lib/claude-account-token.js +7 -169
- package/dist/lib/claude-statusline.d.ts +0 -41
- package/dist/lib/claude-statusline.js +0 -68
- package/dist/lib/cli-entry.d.ts +0 -26
- package/dist/lib/cli-entry.js +1 -61
- package/dist/lib/cli-resources.d.ts +31 -89
- package/dist/lib/cli-resources.js +116 -152
- package/dist/lib/cloud/antigravity.d.ts +0 -29
- package/dist/lib/cloud/antigravity.js +0 -36
- package/dist/lib/cloud/codex.d.ts +0 -8
- package/dist/lib/cloud/codex.js +0 -41
- package/dist/lib/cloud/cursor.d.ts +0 -5
- package/dist/lib/cloud/cursor.js +2 -7
- package/dist/lib/cloud/dispatch.d.ts +0 -13
- package/dist/lib/cloud/dispatch.js +1 -48
- package/dist/lib/cloud/factory.d.ts +0 -52
- package/dist/lib/cloud/factory.js +3 -67
- package/dist/lib/cloud/host.d.ts +0 -39
- package/dist/lib/cloud/host.js +5 -48
- package/dist/lib/cloud/registry.d.ts +0 -25
- package/dist/lib/cloud/registry.js +0 -29
- package/dist/lib/cloud/rush.d.ts +0 -47
- package/dist/lib/cloud/rush.js +1 -82
- package/dist/lib/cloud/session-index.d.ts +0 -27
- package/dist/lib/cloud/session-index.js +1 -32
- package/dist/lib/cloud/store.d.ts +0 -18
- package/dist/lib/cloud/store.js +0 -28
- package/dist/lib/cloud/stream.d.ts +0 -14
- package/dist/lib/cloud/stream.js +0 -25
- package/dist/lib/cloud/types.d.ts +0 -168
- package/dist/lib/cloud/types.js +0 -46
- package/dist/lib/cloudflare/creds.d.ts +0 -2
- package/dist/lib/cloudflare/creds.js +0 -14
- package/dist/lib/cloudflare/provision.d.ts +0 -8
- package/dist/lib/cloudflare/provision.js +1 -19
- package/dist/lib/codex-home.d.ts +0 -60
- package/dist/lib/codex-home.js +2 -72
- package/dist/lib/codex-policy.d.ts +0 -10
- package/dist/lib/codex-policy.js +0 -13
- package/dist/lib/command-skills.d.ts +0 -10
- package/dist/lib/command-skills.js +0 -10
- package/dist/lib/commands.d.ts +0 -74
- package/dist/lib/commands.js +0 -112
- package/dist/lib/comms-render.d.ts +0 -5
- package/dist/lib/comms-render.js +0 -5
- package/dist/lib/computer/context.d.ts +0 -23
- package/dist/lib/computer/context.js +0 -14
- package/dist/lib/computer/policy.d.ts +0 -20
- package/dist/lib/computer/policy.js +0 -53
- package/dist/lib/computer/record.d.ts +0 -33
- package/dist/lib/computer/record.js +1 -48
- package/dist/lib/computer/sessions-list.d.ts +1 -128
- package/dist/lib/computer/sessions-list.js +6 -165
- package/dist/lib/computer-client.d.ts +0 -106
- package/dist/lib/computer-client.js +5 -86
- package/dist/lib/concurrency.d.ts +0 -14
- package/dist/lib/concurrency.js +0 -3
- package/dist/lib/config-drift.d.ts +0 -31
- package/dist/lib/config-drift.js +0 -32
- package/dist/lib/config-keys.d.ts +1 -65
- package/dist/lib/config-keys.js +6 -52
- package/dist/lib/config-transfer.d.ts +0 -14
- package/dist/lib/config-transfer.js +0 -26
- package/dist/lib/convert.d.ts +0 -17
- package/dist/lib/convert.js +0 -18
- package/dist/lib/crabbox/cli.d.ts +0 -156
- package/dist/lib/crabbox/cli.js +1 -188
- package/dist/lib/crabbox/config.d.ts +0 -18
- package/dist/lib/crabbox/config.js +1 -19
- package/dist/lib/crabbox/lease.d.ts +0 -93
- package/dist/lib/crabbox/lease.js +4 -148
- package/dist/lib/crabbox/progress.d.ts +0 -56
- package/dist/lib/crabbox/progress.js +2 -49
- package/dist/lib/crabbox/runtimes.d.ts +0 -94
- package/dist/lib/crabbox/runtimes.js +1 -111
- package/dist/lib/crabbox/setup-copy.d.ts +0 -64
- package/dist/lib/crabbox/setup-copy.js +1 -53
- package/dist/lib/daemon/account-state-daemon-service.d.ts +0 -48
- package/dist/lib/daemon/account-state-daemon-service.js +2 -63
- package/dist/lib/daemon/attention-notify-service.d.ts +0 -12
- package/dist/lib/daemon/attention-notify-service.js +1 -24
- package/dist/lib/daemon/auth-sync-service.d.ts +0 -28
- package/dist/lib/daemon/auth-sync-service.js +0 -56
- package/dist/lib/daemon/catchup-service.d.ts +0 -34
- package/dist/lib/daemon/catchup-service.js +0 -30
- package/dist/lib/daemon/daemon.d.ts +0 -374
- package/dist/lib/daemon/daemon.js +44 -1049
- package/dist/lib/daemon/daemon.test-fixture.d.ts +0 -19
- package/dist/lib/daemon/daemon.test-fixture.js +1 -24
- package/dist/lib/daemon/device-probe-service.d.ts +0 -16
- package/dist/lib/daemon/device-probe-service.js +0 -20
- package/dist/lib/daemon/feed-stream-service.d.ts +0 -15
- package/dist/lib/daemon/feed-stream-service.js +0 -20
- package/dist/lib/daemon/harness-update-service.d.ts +2 -61
- package/dist/lib/daemon/harness-update-service.js +6 -86
- package/dist/lib/daemon/heartbeat-service.d.ts +0 -1
- package/dist/lib/daemon/heartbeat-service.js +0 -1
- package/dist/lib/daemon/leaked-daemons.d.ts +0 -46
- package/dist/lib/daemon/leaked-daemons.js +2 -78
- package/dist/lib/daemon/monitor-engine-service.d.ts +0 -13
- package/dist/lib/daemon/monitor-engine-service.js +3 -15
- package/dist/lib/daemon/runner.d.ts +0 -194
- package/dist/lib/daemon/runner.js +39 -760
- package/dist/lib/daemon/self-heal-service.d.ts +18 -17
- package/dist/lib/daemon/self-heal-service.js +83 -37
- package/dist/lib/daemon/self-update-service.d.ts +1 -131
- package/dist/lib/daemon/self-update-service.js +26 -189
- package/dist/lib/daemon/service.d.ts +0 -73
- package/dist/lib/daemon/service.js +0 -34
- package/dist/lib/daemon/session-index-service.d.ts +0 -12
- package/dist/lib/daemon/session-index-service.js +0 -23
- package/dist/lib/daemon/session-state-service.d.ts +0 -8
- package/dist/lib/daemon/session-state-service.js +0 -8
- package/dist/lib/daemon/session-summarizer-service.d.ts +0 -14
- package/dist/lib/daemon/session-summarizer-service.js +1 -19
- package/dist/lib/daemon/session-title-service.d.ts +0 -25
- package/dist/lib/daemon/session-title-service.js +0 -32
- package/dist/lib/daemon/state-dir-check-service.d.ts +0 -24
- package/dist/lib/daemon/state-dir-check-service.js +0 -29
- package/dist/lib/daemon/supervisor.d.ts +0 -112
- package/dist/lib/daemon/supervisor.js +4 -147
- package/dist/lib/daemon/testdata/process-view-daemon.js +0 -2
- package/dist/lib/daemon/testdata/process-view-start.js +0 -5
- package/dist/lib/daemon/tmux-reap-service.d.ts +0 -1
- package/dist/lib/daemon/tmux-reap-service.js +0 -1
- package/dist/lib/daemon/usage-sync-service.d.ts +0 -23
- package/dist/lib/daemon/usage-sync-service.js +0 -26
- package/dist/lib/daemon/watchdog-service.d.ts +0 -9
- package/dist/lib/daemon/watchdog-service.js +0 -13
- package/dist/lib/daemon/webhook-receiver-service.d.ts +0 -1
- package/dist/lib/daemon/webhook-receiver-service.js +0 -1
- package/dist/lib/daemon-health.d.ts +0 -55
- package/dist/lib/daemon-health.js +4 -77
- package/dist/lib/daemon-services.d.ts +0 -36
- package/dist/lib/daemon-services.js +0 -45
- package/dist/lib/daemon-ticks.d.ts +0 -126
- package/dist/lib/daemon-ticks.js +1 -156
- package/dist/lib/daemon-webhooks.d.ts +0 -57
- package/dist/lib/daemon-webhooks.js +2 -54
- package/dist/lib/deeplink/register.d.ts +0 -15
- package/dist/lib/deeplink/register.js +0 -60
- package/dist/lib/deeplink/url.d.ts +0 -24
- package/dist/lib/deeplink/url.js +1 -33
- package/dist/lib/device-config.d.ts +1 -192
- package/dist/lib/device-config.js +86 -240
- package/dist/lib/devices/config-migration.d.ts +0 -43
- package/dist/lib/devices/config-migration.js +7 -127
- package/dist/lib/devices/connect.d.ts +0 -168
- package/dist/lib/devices/connect.js +6 -254
- package/dist/lib/devices/device-docs.d.ts +0 -24
- package/dist/lib/devices/device-docs.js +0 -46
- package/dist/lib/devices/discovery-policy.d.ts +0 -30
- package/dist/lib/devices/discovery-policy.js +3 -34
- package/dist/lib/devices/doctor-findings.d.ts +0 -109
- package/dist/lib/devices/doctor-findings.js +30 -326
- package/dist/lib/devices/doctor-overview-cache.d.ts +0 -33
- package/dist/lib/devices/doctor-overview-cache.js +0 -81
- package/dist/lib/devices/fleet-divergence.d.ts +0 -89
- package/dist/lib/devices/fleet-divergence.js +1 -60
- package/dist/lib/devices/fleet-inventory.d.ts +0 -27
- package/dist/lib/devices/fleet-inventory.js +0 -38
- package/dist/lib/devices/fleet.d.ts +0 -95
- package/dist/lib/devices/fleet.js +0 -79
- package/dist/lib/devices/harness-inventory.d.ts +0 -75
- package/dist/lib/devices/harness-inventory.js +0 -101
- package/dist/lib/devices/health-report.d.ts +0 -37
- package/dist/lib/devices/health-report.js +0 -73
- package/dist/lib/devices/health.d.ts +0 -71
- package/dist/lib/devices/health.js +2 -82
- package/dist/lib/devices/interactive-host.d.ts +0 -10
- package/dist/lib/devices/interactive-host.js +0 -34
- package/dist/lib/devices/known-hosts.d.ts +0 -45
- package/dist/lib/devices/known-hosts.js +0 -77
- package/dist/lib/devices/pending.d.ts +0 -31
- package/dist/lib/devices/pending.js +7 -67
- package/dist/lib/devices/pool.d.ts +0 -36
- package/dist/lib/devices/pool.js +0 -30
- package/dist/lib/devices/reachability.d.ts +0 -25
- package/dist/lib/devices/reachability.js +0 -14
- package/dist/lib/devices/registry.d.ts +0 -141
- package/dist/lib/devices/registry.js +4 -151
- package/dist/lib/devices/resolve-profile.d.ts +0 -18
- package/dist/lib/devices/resolve-profile.js +0 -18
- package/dist/lib/devices/resolve-target.d.ts +0 -20
- package/dist/lib/devices/resolve-target.js +1 -51
- package/dist/lib/devices/rollout-verify.d.ts +1 -81
- package/dist/lib/devices/rollout-verify.js +0 -77
- package/dist/lib/devices/self-host.d.ts +0 -7
- package/dist/lib/devices/self-host.js +1 -29
- package/dist/lib/devices/ssh-config.d.ts +0 -18
- package/dist/lib/devices/ssh-config.js +0 -9
- package/dist/lib/devices/stats-cache.d.ts +0 -48
- package/dist/lib/devices/stats-cache.js +0 -80
- package/dist/lib/devices/sync.d.ts +0 -97
- package/dist/lib/devices/sync.js +0 -88
- package/dist/lib/devices/tailscale.d.ts +0 -18
- package/dist/lib/devices/tailscale.js +1 -38
- package/dist/lib/devices/terminfo.d.ts +0 -27
- package/dist/lib/devices/terminfo.js +2 -64
- package/dist/lib/devices/worker-pick.d.ts +0 -15
- package/dist/lib/devices/worker-pick.js +0 -48
- package/dist/lib/diff-text.d.ts +0 -18
- package/dist/lib/diff-text.js +0 -15
- package/dist/lib/doctor-diff.d.ts +0 -79
- package/dist/lib/doctor-diff.js +2 -181
- package/dist/lib/drift-sync.d.ts +0 -29
- package/dist/lib/drift-sync.js +0 -40
- package/dist/lib/drift.d.ts +0 -43
- package/dist/lib/drift.js +0 -31
- package/dist/lib/event-families.d.ts +0 -17
- package/dist/lib/event-families.js +0 -33
- package/dist/lib/event-provenance.d.ts +0 -4
- package/dist/lib/event-provenance.js +0 -5
- package/dist/lib/event-stream.d.ts +0 -29
- package/dist/lib/event-stream.js +0 -36
- package/dist/lib/events-ingest.d.ts +0 -27
- package/dist/lib/events-ingest.js +0 -54
- package/dist/lib/exec-account-home.d.ts +0 -24
- package/dist/lib/exec-account-home.js +0 -41
- package/dist/lib/exec-bounded.d.ts +1 -37
- package/dist/lib/exec-bounded.js +10 -46
- package/dist/lib/exec.d.ts +3 -583
- package/dist/lib/exec.js +18 -1025
- package/dist/lib/factory/snapshot.js +1 -15
- package/dist/lib/feed/activity-stream.d.ts +0 -27
- package/dist/lib/feed/activity-stream.js +4 -80
- package/dist/lib/feed/activity.d.ts +1 -243
- package/dist/lib/feed/activity.js +8 -273
- package/dist/lib/feed/answer.d.ts +0 -103
- package/dist/lib/feed/answer.js +0 -267
- package/dist/lib/feed/attention.d.ts +0 -56
- package/dist/lib/feed/attention.js +0 -161
- package/dist/lib/feed/envelope.d.ts +2 -17
- package/dist/lib/feed/envelope.js +0 -14
- package/dist/lib/feed/events.d.ts +0 -118
- package/dist/lib/feed/events.js +13 -213
- package/dist/lib/feed/feed.d.ts +1 -250
- package/dist/lib/feed/feed.js +24 -334
- package/dist/lib/feed/hub-server.d.ts +0 -100
- package/dist/lib/feed/hub-server.js +1 -191
- package/dist/lib/feed/hub.d.ts +0 -53
- package/dist/lib/feed/hub.js +0 -89
- package/dist/lib/feed/pr-status.d.ts +1 -19
- package/dist/lib/feed/pr-status.js +0 -18
- package/dist/lib/feed/tool-activity.d.ts +0 -59
- package/dist/lib/feed/tool-activity.js +1 -119
- package/dist/lib/feed/tools.d.ts +0 -100
- package/dist/lib/feed/tools.js +0 -89
- package/dist/lib/feed/watch.d.ts +0 -33
- package/dist/lib/feed/watch.js +2 -94
- package/dist/lib/feed-broadcast.d.ts +0 -148
- package/dist/lib/feed-broadcast.js +1 -283
- package/dist/lib/feed-outcome.d.ts +0 -50
- package/dist/lib/feed-outcome.js +1 -67
- package/dist/lib/feed-policy.d.ts +0 -6
- package/dist/lib/feed-policy.js +1 -27
- package/dist/lib/feed-post.d.ts +0 -61
- package/dist/lib/feed-post.js +4 -61
- package/dist/lib/feed-ranking.d.ts +1 -1
- package/dist/lib/fleet/apply.d.ts +0 -64
- package/dist/lib/fleet/apply.js +0 -125
- package/dist/lib/fleet/auth-sync.d.ts +0 -48
- package/dist/lib/fleet/auth-sync.js +4 -49
- package/dist/lib/fleet/capture.d.ts +0 -26
- package/dist/lib/fleet/capture.js +1 -36
- package/dist/lib/fleet/manifest.d.ts +0 -38
- package/dist/lib/fleet/manifest.js +0 -40
- package/dist/lib/fleet/types.d.ts +1 -138
- package/dist/lib/fleet/types.js +0 -12
- package/dist/lib/fleet-cache.d.ts +0 -12
- package/dist/lib/fleet-cache.js +0 -24
- package/dist/lib/fleet-shared-state.d.ts +6 -59
- package/dist/lib/fleet-shared-state.js +5 -51
- package/dist/lib/fleet-status.d.ts +0 -27
- package/dist/lib/fleet-status.js +0 -48
- package/dist/lib/format.d.ts +0 -74
- package/dist/lib/format.js +3 -77
- package/dist/lib/friction-heuristics.d.ts +0 -20
- package/dist/lib/friction-heuristics.js +0 -8
- package/dist/lib/fs-atomic.d.ts +0 -51
- package/dist/lib/fs-atomic.js +8 -66
- package/dist/lib/fs-walk.d.ts +0 -13
- package/dist/lib/fs-walk.js +0 -22
- package/dist/lib/fuzzy.d.ts +0 -29
- package/dist/lib/fuzzy.js +0 -31
- package/dist/lib/gemini-settings.js +0 -12
- package/dist/lib/git.d.ts +0 -366
- package/dist/lib/git.js +7 -574
- package/dist/lib/github/ci-failure.d.ts +30 -0
- package/dist/lib/github/ci-failure.js +95 -0
- package/dist/lib/github/gh-overload.d.ts +0 -38
- package/dist/lib/github/gh-overload.js +3 -55
- package/dist/lib/github/pr-mergeable.d.ts +3 -34
- package/dist/lib/github/pr-mergeable.js +2 -42
- package/dist/lib/github/pr-verdict.d.ts +0 -44
- package/dist/lib/github/pr-verdict.js +0 -36
- package/dist/lib/github/project-prs.d.ts +135 -105
- package/dist/lib/github/project-prs.js +530 -170
- package/dist/lib/github/release-drift.d.ts +45 -0
- package/dist/lib/github/release-drift.js +91 -0
- package/dist/lib/github/rest.d.ts +0 -50
- package/dist/lib/github/rest.js +0 -49
- package/dist/lib/github/viewer.d.ts +27 -0
- package/dist/lib/github/viewer.js +101 -0
- package/dist/lib/goose-commands.d.ts +0 -29
- package/dist/lib/goose-commands.js +3 -48
- package/dist/lib/harness/adapter.d.ts +0 -151
- package/dist/lib/harness/adapter.js +0 -41
- package/dist/lib/harness/adapters/claude.d.ts +0 -8
- package/dist/lib/harness/adapters/claude.js +0 -89
- package/dist/lib/harness/adapters/codex.js +0 -18
- package/dist/lib/harness/adapters/copilot.js +0 -3
- package/dist/lib/harness/adapters/cursor.js +0 -16
- package/dist/lib/harness/adapters/droid.js +0 -3
- package/dist/lib/harness/adapters/kimi.js +0 -19
- package/dist/lib/harness/adapters/muse.js +0 -9
- package/dist/lib/harness/adapters/opencode.js +0 -2
- package/dist/lib/harness/exec-config-version.d.ts +0 -2
- package/dist/lib/harness/exec-config-version.js +0 -13
- package/dist/lib/harness/index.js +0 -10
- package/dist/lib/harness-auth-capabilities.d.ts +0 -26
- package/dist/lib/harness-auth-capabilities.js +0 -18
- package/dist/lib/harness-connection-test.d.ts +0 -27
- package/dist/lib/harness-connection-test.js +2 -20
- package/dist/lib/heal.d.ts +0 -45
- package/dist/lib/heal.js +2 -82
- package/dist/lib/help.d.ts +0 -32
- package/dist/lib/help.js +0 -41
- package/dist/lib/helper-download.d.ts +0 -85
- package/dist/lib/helper-download.js +0 -95
- package/dist/lib/helper-versions.d.ts +0 -51
- package/dist/lib/helper-versions.js +1 -45
- package/dist/lib/hooks/cache.d.ts +0 -40
- package/dist/lib/hooks/cache.js +8 -122
- package/dist/lib/hooks/install.d.ts +0 -253
- package/dist/lib/hooks/install.js +49 -822
- package/dist/lib/hooks/match.d.ts +0 -24
- package/dist/lib/hooks/match.js +0 -31
- package/dist/lib/hooks/profile.d.ts +0 -21
- package/dist/lib/hooks/profile.js +0 -28
- package/dist/lib/hosts/credential-transport.d.ts +0 -6
- package/dist/lib/hosts/credential-transport.js +0 -17
- package/dist/lib/hosts/credentials.d.ts +0 -35
- package/dist/lib/hosts/credentials.js +0 -38
- package/dist/lib/hosts/dispatch.d.ts +0 -140
- package/dist/lib/hosts/dispatch.js +0 -176
- package/dist/lib/hosts/logs.d.ts +0 -25
- package/dist/lib/hosts/logs.js +1 -51
- package/dist/lib/hosts/option.d.ts +0 -12
- package/dist/lib/hosts/option.js +0 -12
- package/dist/lib/hosts/passthrough.d.ts +0 -129
- package/dist/lib/hosts/passthrough.js +12 -249
- package/dist/lib/hosts/progress.d.ts +0 -90
- package/dist/lib/hosts/progress.js +5 -115
- package/dist/lib/hosts/providers/devices.d.ts +0 -19
- package/dist/lib/hosts/providers/devices.js +1 -34
- package/dist/lib/hosts/providers/local.d.ts +0 -14
- package/dist/lib/hosts/providers/local.js +0 -22
- package/dist/lib/hosts/ready.d.ts +0 -99
- package/dist/lib/hosts/ready.js +0 -101
- package/dist/lib/hosts/reconcile.d.ts +0 -38
- package/dist/lib/hosts/reconcile.js +1 -50
- package/dist/lib/hosts/reconnect.d.ts +0 -75
- package/dist/lib/hosts/reconnect.js +0 -98
- package/dist/lib/hosts/registry.d.ts +0 -74
- package/dist/lib/hosts/registry.js +0 -110
- package/dist/lib/hosts/remote-cmd.d.ts +1 -228
- package/dist/lib/hosts/remote-cmd.js +19 -294
- package/dist/lib/hosts/remote-cmd.test-fixture.d.ts +0 -1
- package/dist/lib/hosts/remote-cmd.test-fixture.js +0 -12
- package/dist/lib/hosts/remote-os.d.ts +0 -19
- package/dist/lib/hosts/remote-os.js +0 -22
- package/dist/lib/hosts/remote-session-id.d.ts +0 -22
- package/dist/lib/hosts/remote-session-id.js +0 -24
- package/dist/lib/hosts/routing-flag.d.ts +0 -21
- package/dist/lib/hosts/routing-flag.js +0 -21
- package/dist/lib/hosts/run-target.d.ts +0 -53
- package/dist/lib/hosts/run-target.js +0 -56
- package/dist/lib/hosts/session-index.d.ts +1 -53
- package/dist/lib/hosts/session-index.js +2 -59
- package/dist/lib/hosts/session-marker.d.ts +0 -31
- package/dist/lib/hosts/session-marker.js +0 -32
- package/dist/lib/hosts/ssh-config.d.ts +0 -25
- package/dist/lib/hosts/ssh-config.js +1 -32
- package/dist/lib/hosts/tasks.d.ts +0 -54
- package/dist/lib/hosts/tasks.js +0 -35
- package/dist/lib/hosts/types.d.ts +0 -39
- package/dist/lib/hosts/types.js +0 -22
- package/dist/lib/humans.d.ts +0 -21
- package/dist/lib/humans.js +0 -30
- package/dist/lib/identity/client.d.ts +1 -35
- package/dist/lib/identity/client.js +3 -29
- package/dist/lib/identity/index.d.ts +3 -27
- package/dist/lib/identity/index.js +8 -24
- package/dist/lib/import.d.ts +0 -104
- package/dist/lib/import.js +1 -137
- package/dist/lib/installations/active-check.d.ts +0 -53
- package/dist/lib/installations/active-check.js +0 -49
- package/dist/lib/installations/index.d.ts +0 -9
- package/dist/lib/installations/index.js +0 -9
- package/dist/lib/installations/installation-lock.js +0 -8
- package/dist/lib/installations/launch-gate.d.ts +0 -56
- package/dist/lib/installations/launch-gate.js +0 -83
- package/dist/lib/installations/migrate.d.ts +0 -100
- package/dist/lib/installations/migrate.js +105 -572
- package/dist/lib/installations/native-command.d.ts +0 -1
- package/dist/lib/installations/native-command.js +0 -6
- package/dist/lib/installations/resolve.d.ts +0 -24
- package/dist/lib/installations/resolve.js +0 -24
- package/dist/lib/installations/shims.d.ts +0 -395
- package/dist/lib/installations/shims.js +30 -957
- package/dist/lib/installations/store.d.ts +0 -199
- package/dist/lib/installations/store.js +1 -297
- package/dist/lib/installations/strategies.d.ts +0 -44
- package/dist/lib/installations/strategies.js +0 -87
- package/dist/lib/installations/types.d.ts +1 -67
- package/dist/lib/installations/types.js +0 -6
- package/dist/lib/installations/update-cancellation.d.ts +0 -74
- package/dist/lib/installations/update-cancellation.js +0 -74
- package/dist/lib/installations/update-policy.d.ts +0 -57
- package/dist/lib/installations/update-policy.js +0 -62
- package/dist/lib/installations/update-runtime.d.ts +0 -88
- package/dist/lib/installations/update-runtime.js +1 -127
- package/dist/lib/installations/update.d.ts +0 -53
- package/dist/lib/installations/update.js +0 -95
- package/dist/lib/installations/versions.d.ts +0 -310
- package/dist/lib/installations/versions.js +14 -837
- package/dist/lib/isolation-boundary-report.d.ts +0 -7
- package/dist/lib/isolation-boundary-report.js +0 -7
- package/dist/lib/launch-identity.d.ts +0 -8
- package/dist/lib/launch-identity.js +0 -8
- package/dist/lib/linear-autoclose.d.ts +0 -25
- package/dist/lib/linear-autoclose.js +0 -19
- package/dist/lib/linear-cache.d.ts +0 -57
- package/dist/lib/linear-cache.js +1 -81
- package/dist/lib/linear-project-counts.d.ts +0 -83
- package/dist/lib/linear-project-counts.js +2 -64
- package/dist/lib/linear-projects.d.ts +0 -62
- package/dist/lib/linear-projects.js +0 -85
- package/dist/lib/linear-rate-limit.d.ts +0 -21
- package/dist/lib/linear-rate-limit.js +1 -93
- package/dist/lib/linux-userns.d.ts +1 -42
- package/dist/lib/linux-userns.js +0 -47
- package/dist/lib/lock-compromise.d.ts +0 -7
- package/dist/lib/lock-compromise.js +0 -7
- package/dist/lib/log-follow.d.ts +0 -2
- package/dist/lib/log-follow.js +5 -15
- package/dist/lib/loop.d.ts +0 -106
- package/dist/lib/loop.js +0 -135
- package/dist/lib/machine-id.d.ts +0 -19
- package/dist/lib/machine-id.js +0 -19
- package/dist/lib/mailbox-gc.d.ts +0 -7
- package/dist/lib/mailbox-gc.js +0 -25
- package/dist/lib/mailbox-target.d.ts +0 -31
- package/dist/lib/mailbox-target.js +0 -27
- package/dist/lib/mailbox.d.ts +0 -77
- package/dist/lib/mailbox.js +5 -105
- package/dist/lib/manifest.d.ts +0 -4
- package/dist/lib/manifest.js +0 -36
- package/dist/lib/markdown.d.ts +0 -3
- package/dist/lib/markdown.js +0 -9
- package/dist/lib/mcp-registry.d.ts +1 -50
- package/dist/lib/mcp-registry.js +0 -64
- package/dist/lib/mcp.d.ts +0 -115
- package/dist/lib/mcp.js +3 -199
- package/dist/lib/memory-cache.d.ts +0 -11
- package/dist/lib/memory-cache.js +0 -9
- package/dist/lib/memory.d.ts +0 -52
- package/dist/lib/memory.js +12 -74
- package/dist/lib/menubar/download-menubar.d.ts +0 -35
- package/dist/lib/menubar/download-menubar.js +0 -38
- package/dist/lib/menubar/install-menubar.d.ts +0 -405
- package/dist/lib/menubar/install-menubar.js +25 -667
- package/dist/lib/menubar/migrate-prefs.d.ts +0 -47
- package/dist/lib/menubar/migrate-prefs.js +1 -70
- package/dist/lib/menubar/notify-desktop.d.ts +0 -82
- package/dist/lib/menubar/notify-desktop.js +0 -68
- package/dist/lib/menubar/resolve-version.d.ts +0 -41
- package/dist/lib/menubar/resolve-version.js +2 -44
- package/dist/lib/menubar/snapshot.d.ts +13 -66
- package/dist/lib/menubar/snapshot.js +45 -39
- package/dist/lib/merged-resources.d.ts +0 -10
- package/dist/lib/merged-resources.js +0 -10
- package/dist/lib/migrate-fold.d.ts +0 -31
- package/dist/lib/migrate-fold.js +6 -38
- package/dist/lib/model-tier-overrides.d.ts +0 -30
- package/dist/lib/model-tier-overrides.js +0 -14
- package/dist/lib/model-tiers.d.ts +0 -43
- package/dist/lib/model-tiers.js +5 -78
- package/dist/lib/models.d.ts +0 -145
- package/dist/lib/models.js +3 -333
- package/dist/lib/monitors/config.d.ts +0 -187
- package/dist/lib/monitors/config.js +4 -101
- package/dist/lib/monitors/dispatch.d.ts +0 -22
- package/dist/lib/monitors/dispatch.js +0 -35
- package/dist/lib/monitors/engine.d.ts +1 -53
- package/dist/lib/monitors/engine.js +17 -106
- package/dist/lib/monitors/fingerprint.d.ts +0 -43
- package/dist/lib/monitors/fingerprint.js +0 -57
- package/dist/lib/monitors/pid-watch.d.ts +0 -31
- package/dist/lib/monitors/pid-watch.js +0 -31
- package/dist/lib/monitors/remote.d.ts +0 -52
- package/dist/lib/monitors/remote.js +0 -42
- package/dist/lib/monitors/sources/command.d.ts +2 -9
- package/dist/lib/monitors/sources/command.js +13 -34
- package/dist/lib/monitors/sources/device.d.ts +0 -10
- package/dist/lib/monitors/sources/device.js +0 -14
- package/dist/lib/monitors/sources/failure.d.ts +0 -27
- package/dist/lib/monitors/sources/failure.js +0 -27
- package/dist/lib/monitors/sources/file.d.ts +0 -10
- package/dist/lib/monitors/sources/file.js +0 -11
- package/dist/lib/monitors/sources/http.d.ts +0 -7
- package/dist/lib/monitors/sources/http.js +0 -9
- package/dist/lib/monitors/sources/index.d.ts +0 -9
- package/dist/lib/monitors/sources/index.js +0 -9
- package/dist/lib/monitors/sources/poll.d.ts +0 -8
- package/dist/lib/monitors/sources/poll.js +0 -8
- package/dist/lib/monitors/sources/types.d.ts +0 -18
- package/dist/lib/monitors/sources/types.js +0 -8
- package/dist/lib/monitors/sources/webhook.d.ts +0 -7
- package/dist/lib/monitors/sources/webhook.js +0 -7
- package/dist/lib/monitors/sources/ws.d.ts +0 -10
- package/dist/lib/monitors/sources/ws.js +3 -13
- package/dist/lib/monitors/state.d.ts +0 -132
- package/dist/lib/monitors/state.js +2 -86
- package/dist/lib/native-accounts.d.ts +0 -32
- package/dist/lib/native-accounts.js +0 -17
- package/dist/lib/net-close.d.ts +0 -9
- package/dist/lib/net-close.js +0 -5
- package/dist/lib/notify.d.ts +0 -47
- package/dist/lib/notify.js +0 -30
- package/dist/lib/onepassword.d.ts +0 -14
- package/dist/lib/onepassword.js +0 -12
- package/dist/lib/open-url.d.ts +0 -38
- package/dist/lib/open-url.js +1 -69
- package/dist/lib/openclaw-keychain.js +2 -7
- package/dist/lib/operator.d.ts +0 -9
- package/dist/lib/operator.js +0 -34
- package/dist/lib/origin-machine.d.ts +0 -16
- package/dist/lib/origin-machine.js +0 -16
- package/dist/lib/output/git-output.d.ts +0 -31
- package/dist/lib/output/git-output.js +4 -43
- package/dist/lib/overdue.d.ts +0 -35
- package/dist/lib/overdue.js +0 -60
- package/dist/lib/owner-message.d.ts +0 -20
- package/dist/lib/owner-message.js +1 -40
- package/dist/lib/packages/output-home.d.ts +0 -28
- package/dist/lib/packages/output-home.js +0 -114
- package/dist/lib/paths.d.ts +0 -26
- package/dist/lib/paths.js +1 -27
- package/dist/lib/percentile.d.ts +0 -11
- package/dist/lib/percentile.js +0 -11
- package/dist/lib/perf/db.d.ts +0 -16
- package/dist/lib/perf/db.js +3 -32
- package/dist/lib/perf/spool.d.ts +0 -12
- package/dist/lib/perf/spool.js +0 -13
- package/dist/lib/perf/types.d.ts +0 -26
- package/dist/lib/perf/types.js +0 -1
- package/dist/lib/permissions-registry.d.ts +0 -48
- package/dist/lib/permissions-registry.js +0 -108
- package/dist/lib/permissions.d.ts +0 -215
- package/dist/lib/permissions.js +4 -407
- package/dist/lib/picker.d.ts +0 -124
- package/dist/lib/picker.js +0 -140
- package/dist/lib/placement.d.ts +0 -57
- package/dist/lib/placement.js +0 -47
- package/dist/lib/platform/exec.d.ts +0 -73
- package/dist/lib/platform/exec.js +0 -80
- package/dist/lib/platform/index.d.ts +0 -14
- package/dist/lib/platform/index.js +0 -14
- package/dist/lib/platform/ipc.d.ts +0 -10
- package/dist/lib/platform/ipc.js +0 -13
- package/dist/lib/platform/links.d.ts +0 -14
- package/dist/lib/platform/links.js +0 -25
- package/dist/lib/platform/paths.d.ts +0 -48
- package/dist/lib/platform/paths.js +0 -52
- package/dist/lib/platform/posixpath.d.ts +0 -18
- package/dist/lib/platform/posixpath.js +0 -62
- package/dist/lib/platform/process.d.ts +0 -67
- package/dist/lib/platform/process.js +5 -99
- package/dist/lib/platform/winpath.d.ts +0 -50
- package/dist/lib/platform/winpath.js +0 -81
- package/dist/lib/plugins/plugin-marketplace.d.ts +0 -165
- package/dist/lib/plugins/plugin-marketplace.js +10 -238
- package/dist/lib/plugins/plugins.d.ts +0 -238
- package/dist/lib/plugins/plugins.js +20 -454
- package/dist/lib/plugins/skills.d.ts +0 -86
- package/dist/lib/plugins/skills.js +1 -139
- package/dist/lib/pr-land-detach.d.ts +0 -17
- package/dist/lib/pr-land-detach.js +0 -30
- package/dist/lib/pricing/cost.d.ts +0 -29
- package/dist/lib/pricing/cost.js +0 -38
- package/dist/lib/pricing/index.d.ts +0 -6
- package/dist/lib/pricing/index.js +0 -6
- package/dist/lib/pricing/table.d.ts +0 -8
- package/dist/lib/pricing/table.js +3 -56
- package/dist/lib/probe.d.ts +0 -5
- package/dist/lib/probe.js +0 -40
- package/dist/lib/profiles-presets.d.ts +0 -20
- package/dist/lib/profiles-presets.js +1 -36
- package/dist/lib/profiles.d.ts +0 -185
- package/dist/lib/profiles.js +1 -158
- package/dist/lib/project-doctor.d.ts +0 -29
- package/dist/lib/project-doctor.js +0 -26
- package/dist/lib/project-focus.d.ts +0 -41
- package/dist/lib/project-focus.js +0 -49
- package/dist/lib/project-import.d.ts +0 -41
- package/dist/lib/project-import.js +0 -36
- package/dist/lib/project-key.d.ts +0 -65
- package/dist/lib/project-key.js +0 -70
- package/dist/lib/project-launch.d.ts +0 -49
- package/dist/lib/project-launch.js +2 -91
- package/dist/lib/project-probe.d.ts +0 -86
- package/dist/lib/project-probe.js +1 -88
- package/dist/lib/project-pull.d.ts +0 -96
- package/dist/lib/project-pull.js +0 -122
- package/dist/lib/project-resources.d.ts +0 -44
- package/dist/lib/project-resources.js +7 -171
- package/dist/lib/project-root.d.ts +0 -95
- package/dist/lib/project-root.js +0 -101
- package/dist/lib/project-schedule.d.ts +0 -43
- package/dist/lib/project-schedule.js +0 -52
- package/dist/lib/project-status.d.ts +0 -108
- package/dist/lib/project-status.js +0 -117
- package/dist/lib/projects.d.ts +0 -197
- package/dist/lib/projects.js +1 -213
- package/dist/lib/pwsh.d.ts +0 -41
- package/dist/lib/pwsh.js +0 -51
- package/dist/lib/quick-todo.d.ts +84 -0
- package/dist/lib/quick-todo.js +243 -0
- package/dist/lib/reconcile-and-repair.d.ts +0 -78
- package/dist/lib/reconcile-and-repair.js +3 -66
- package/dist/lib/redact.d.ts +0 -29
- package/dist/lib/redact.js +0 -54
- package/dist/lib/refresh-coordinator.d.ts +0 -15
- package/dist/lib/refresh-coordinator.js +0 -10
- package/dist/lib/refresh.d.ts +0 -39
- package/dist/lib/refresh.js +0 -45
- package/dist/lib/registry.d.ts +0 -65
- package/dist/lib/registry.js +0 -127
- package/dist/lib/reminders.d.ts +0 -21
- package/dist/lib/reminders.js +0 -30
- package/dist/lib/remote-agents-json.d.ts +0 -44
- package/dist/lib/remote-agents-json.js +1 -44
- package/dist/lib/reserved-stores.d.ts +0 -28
- package/dist/lib/reserved-stores.js +2 -28
- package/dist/lib/resource-aliases.d.ts +0 -12
- package/dist/lib/resource-aliases.js +0 -12
- package/dist/lib/resource-content-diff.d.ts +0 -28
- package/dist/lib/resource-content-diff.js +7 -34
- package/dist/lib/resource-inventory.d.ts +0 -51
- package/dist/lib/resource-inventory.js +0 -45
- package/dist/lib/resource-patterns.d.ts +0 -32
- package/dist/lib/resource-patterns.js +0 -34
- package/dist/lib/resource-profiles.d.ts +0 -7
- package/dist/lib/resource-profiles.js +0 -11
- package/dist/lib/resources/types.d.ts +0 -50
- package/dist/lib/resources/types.js +0 -7
- package/dist/lib/resources/workflows.d.ts +0 -7
- package/dist/lib/resources/workflows.js +0 -13
- package/dist/lib/resources.d.ts +0 -65
- package/dist/lib/resources.js +0 -78
- package/dist/lib/routers.d.ts +0 -67
- package/dist/lib/routers.js +0 -60
- package/dist/lib/routine-activation.d.ts +0 -23
- package/dist/lib/routine-activation.js +0 -24
- package/dist/lib/routine-context.d.ts +1 -91
- package/dist/lib/routine-context.js +0 -107
- package/dist/lib/routine-notify-owner.d.ts +0 -79
- package/dist/lib/routine-notify-owner.js +1 -103
- package/dist/lib/routine-notify.d.ts +0 -70
- package/dist/lib/routine-notify.js +1 -75
- package/dist/lib/routine-process-cleanup.d.ts +0 -1
- package/dist/lib/routine-process-cleanup.js +1 -4
- package/dist/lib/routine-readiness.d.ts +0 -63
- package/dist/lib/routine-readiness.js +4 -86
- package/dist/lib/routines-format.d.ts +0 -40
- package/dist/lib/routines-format.js +0 -67
- package/dist/lib/routines-placement.d.ts +0 -33
- package/dist/lib/routines-placement.js +0 -40
- package/dist/lib/routines-project.d.ts +0 -57
- package/dist/lib/routines-project.js +6 -80
- package/dist/lib/rules/compile.d.ts +0 -66
- package/dist/lib/rules/compile.js +6 -118
- package/dist/lib/rules/compose.d.ts +0 -56
- package/dist/lib/rules/compose.js +2 -83
- package/dist/lib/rules/rules.d.ts +0 -23
- package/dist/lib/rules/rules.js +0 -35
- package/dist/lib/rules/run-sync.d.ts +0 -16
- package/dist/lib/rules/run-sync.js +1 -44
- package/dist/lib/run-config.d.ts +0 -7
- package/dist/lib/run-config.js +0 -8
- package/dist/lib/run-defaults.d.ts +0 -14
- package/dist/lib/run-defaults.js +0 -14
- package/dist/lib/run-notify.d.ts +0 -18
- package/dist/lib/run-notify.js +0 -36
- package/dist/lib/run-trace-sync.d.ts +0 -21
- package/dist/lib/run-trace-sync.js +2 -66
- package/dist/lib/rush-session.d.ts +0 -26
- package/dist/lib/rush-session.js +0 -28
- package/dist/lib/sandbox.d.ts +0 -45
- package/dist/lib/sandbox.js +5 -93
- package/dist/lib/scheduler.d.ts +0 -28
- package/dist/lib/scheduler.js +0 -45
- package/dist/lib/scheduling/routines.d.ts +0 -652
- package/dist/lib/scheduling/routines.js +8 -475
- package/dist/lib/secrets-cli.d.ts +3 -8
- package/dist/lib/secrets-cli.js +1 -19
- package/dist/lib/secrets-client.d.ts +0 -117
- package/dist/lib/secrets-client.js +4 -275
- package/dist/lib/secrets-policy.d.ts +0 -142
- package/dist/lib/secrets-policy.js +4 -237
- package/dist/lib/secrets-types.d.ts +0 -87
- package/dist/lib/secrets-types.js +0 -13
- package/dist/lib/self-heal/checks/hook-manifest.js +0 -25
- package/dist/lib/self-heal/checks/hook-runtime.js +0 -5
- package/dist/lib/self-heal/checks/install-staging.d.ts +0 -1
- package/dist/lib/self-heal/checks/install-staging.js +1 -28
- package/dist/lib/self-heal/checks/menubar-helper.js +0 -5
- package/dist/lib/self-heal/checks/path.js +0 -9
- package/dist/lib/self-heal/checks/resources.js +0 -5
- package/dist/lib/self-heal/checks/shadowing.js +2 -16
- package/dist/lib/self-heal/checks/shims.js +0 -14
- package/dist/lib/self-heal/child.d.ts +12 -0
- package/dist/lib/self-heal/child.js +23 -0
- package/dist/lib/self-heal/registry.d.ts +0 -9
- package/dist/lib/self-heal/registry.js +0 -16
- package/dist/lib/self-heal/types.d.ts +0 -12
- package/dist/lib/self-heal/types.js +0 -15
- package/dist/lib/self-update.d.ts +0 -312
- package/dist/lib/self-update.js +9 -360
- package/dist/lib/service-manifest.d.ts +0 -39
- package/dist/lib/service-manifest.js +0 -72
- package/dist/lib/session/active.d.ts +13 -869
- package/dist/lib/session/active.js +20 -976
- package/dist/lib/session/actor-sidecar.d.ts +1 -32
- package/dist/lib/session/actor-sidecar.js +1 -41
- package/dist/lib/session/bookmarks.d.ts +0 -33
- package/dist/lib/session/bookmarks.js +0 -37
- package/dist/lib/session/bundle.d.ts +0 -86
- package/dist/lib/session/bundle.js +0 -54
- package/dist/lib/session/claude-accounts.d.ts +0 -40
- package/dist/lib/session/claude-accounts.js +0 -49
- package/dist/lib/session/cloud.d.ts +1 -23
- package/dist/lib/session/cloud.js +0 -26
- package/dist/lib/session/db.d.ts +5 -658
- package/dist/lib/session/db.js +22 -1443
- package/dist/lib/session/detached.d.ts +0 -21
- package/dist/lib/session/detached.js +0 -29
- package/dist/lib/session/discover.d.ts +3 -420
- package/dist/lib/session/discover.js +30 -1123
- package/dist/lib/session/fork.d.ts +1 -41
- package/dist/lib/session/fork.js +0 -19
- package/dist/lib/session/ghostty-tabs.d.ts +0 -24
- package/dist/lib/session/ghostty-tabs.js +0 -37
- package/dist/lib/session/glance-files.d.ts +19 -0
- package/dist/lib/session/glance-files.js +258 -0
- package/dist/lib/session/hook-sessions.d.ts +0 -33
- package/dist/lib/session/hook-sessions.js +4 -99
- package/dist/lib/session/host-link.d.ts +1 -94
- package/dist/lib/session/host-link.js +1 -81
- package/dist/lib/session/inject-target.d.ts +8 -0
- package/dist/lib/session/inject-target.js +32 -0
- package/dist/lib/session/inject.d.ts +0 -15
- package/dist/lib/session/inject.js +0 -15
- package/dist/lib/session/live-metadata.d.ts +1 -34
- package/dist/lib/session/live-metadata.js +1 -73
- package/dist/lib/session/local-tmux-attach.d.ts +0 -37
- package/dist/lib/session/local-tmux-attach.js +1 -76
- package/dist/lib/session/migrate-targets.d.ts +0 -46
- package/dist/lib/session/migrate-targets.js +0 -24
- package/dist/lib/session/migrations.d.ts +0 -12
- package/dist/lib/session/migrations.js +1 -20
- package/dist/lib/session/mirror.d.ts +0 -32
- package/dist/lib/session/mirror.js +0 -77
- package/dist/lib/session/origin-machine.js +0 -3
- package/dist/lib/session/pid-registry.d.ts +0 -80
- package/dist/lib/session/pid-registry.js +2 -81
- package/dist/lib/session/presence.d.ts +0 -39
- package/dist/lib/session/presence.js +2 -52
- package/dist/lib/session/process-view.d.ts +0 -11
- package/dist/lib/session/process-view.js +0 -25
- package/dist/lib/session/projection.d.ts +0 -3
- package/dist/lib/session/projection.js +0 -10
- package/dist/lib/session/provenance.d.ts +1 -37
- package/dist/lib/session/provenance.js +0 -69
- package/dist/lib/session/recovery.d.ts +1 -40
- package/dist/lib/session/recovery.js +2 -80
- package/dist/lib/session/relative-time.js +0 -3
- package/dist/lib/session/remote/peer-stream.d.ts +0 -42
- package/dist/lib/session/remote/peer-stream.js +0 -64
- package/dist/lib/session/remote/remote-bundle.d.ts +0 -6
- package/dist/lib/session/remote/remote-bundle.js +0 -21
- package/dist/lib/session/remote/remote-list.d.ts +1 -110
- package/dist/lib/session/remote/remote-list.js +5 -139
- package/dist/lib/session/remote/remote.d.ts +0 -98
- package/dist/lib/session/remote/remote.js +3 -119
- package/dist/lib/session/remote/watch.d.ts +1 -34
- package/dist/lib/session/remote/watch.js +12 -72
- package/dist/lib/session/remote-active.d.ts +0 -35
- package/dist/lib/session/remote-active.js +0 -48
- package/dist/lib/session/remote-bundle.js +0 -2
- package/dist/lib/session/remote-list.js +0 -2
- package/dist/lib/session/remote-preview-cache.d.ts +0 -7
- package/dist/lib/session/remote-preview-cache.js +1 -76
- package/dist/lib/session/remote.js +0 -2
- package/dist/lib/session/resume-command.d.ts +0 -6
- package/dist/lib/session/resume-command.js +0 -6
- package/dist/lib/session/resume-owner.d.ts +1 -52
- package/dist/lib/session/resume-owner.js +0 -56
- package/dist/lib/session/run-names.d.ts +0 -24
- package/dist/lib/session/run-names.js +0 -26
- package/dist/lib/session/session-cache.d.ts +2 -146
- package/dist/lib/session/session-cache.js +26 -203
- package/dist/lib/session/short-id.js +0 -3
- package/dist/lib/session/sync/agents.d.ts +0 -68
- package/dist/lib/session/sync/agents.js +0 -0
- package/dist/lib/session/sync/backend.d.ts +0 -39
- package/dist/lib/session/sync/backend.js +0 -45
- package/dist/lib/session/sync/config.d.ts +0 -27
- package/dist/lib/session/sync/config.js +0 -56
- package/dist/lib/session/sync/managed-config.d.ts +0 -17
- package/dist/lib/session/sync/managed-config.js +0 -17
- package/dist/lib/session/sync/managed-key.d.ts +0 -38
- package/dist/lib/session/sync/managed-key.js +1 -42
- package/dist/lib/session/sync/net-client.d.ts +0 -36
- package/dist/lib/session/sync/net-client.js +0 -30
- package/dist/lib/session/sync/provision.d.ts +0 -2
- package/dist/lib/session/sync/provision.js +0 -13
- package/dist/lib/session/sync/r2.d.ts +0 -20
- package/dist/lib/session/sync/r2.js +0 -20
- package/dist/lib/session/sync/transcript-crypto.d.ts +0 -37
- package/dist/lib/session/sync/transcript-crypto.js +5 -37
- package/dist/lib/session/sync/worker-template.d.ts +0 -5
- package/dist/lib/session/sync/worker-template.js +0 -40
- package/dist/lib/session/testdata/pid-registry-namespace.js +0 -2
- package/dist/lib/session/testdata/process-view-private.js +0 -1
- package/dist/lib/session/throughput.d.ts +0 -24
- package/dist/lib/session/throughput.js +1 -25
- package/dist/lib/session/timeline-pass.d.ts +1 -63
- package/dist/lib/session/timeline-pass.js +161 -148
- package/dist/lib/session/title.d.ts +0 -182
- package/dist/lib/session/title.js +0 -139
- package/dist/lib/session/tool-index.d.ts +2 -21
- package/dist/lib/session/tool-index.js +3 -75
- package/dist/lib/session/tool-store.d.ts +2 -48
- package/dist/lib/session/tool-store.js +1 -33
- package/dist/lib/session/viewing-in.d.ts +0 -67
- package/dist/lib/session/viewing-in.js +1 -71
- package/dist/lib/session/watch.js +0 -2
- package/dist/lib/session/width.js +0 -3
- package/dist/lib/sessions-client.d.ts +0 -46
- package/dist/lib/sessions-client.js +36 -113
- package/dist/lib/settings-manifest.d.ts +1 -17
- package/dist/lib/settings-manifest.js +4 -57
- package/dist/lib/setup-tool-install.d.ts +0 -1
- package/dist/lib/setup-tool-install.js +2 -7
- package/dist/lib/setup-tool-status.d.ts +0 -3
- package/dist/lib/setup-tool-status.js +4 -14
- package/dist/lib/sha256-asset.d.ts +0 -20
- package/dist/lib/sha256-asset.js +0 -20
- package/dist/lib/share-runtime.d.ts +0 -10
- package/dist/lib/share-runtime.js +1 -27
- package/dist/lib/shim-heal.d.ts +0 -15
- package/dist/lib/shim-heal.js +3 -29
- package/dist/lib/signin-badge.d.ts +0 -72
- package/dist/lib/signin-badge.js +0 -86
- package/dist/lib/sink-format.d.ts +0 -32
- package/dist/lib/sink-format.js +0 -14
- package/dist/lib/smart-launch.d.ts +0 -75
- package/dist/lib/smart-launch.js +1 -83
- package/dist/lib/snapshot.d.ts +0 -46
- package/dist/lib/snapshot.js +5 -31
- package/dist/lib/spinner.d.ts +0 -37
- package/dist/lib/spinner.js +0 -37
- package/dist/lib/sqlite.d.ts +0 -13
- package/dist/lib/sqlite.js +3 -71
- package/dist/lib/ssh-exec.d.ts +0 -209
- package/dist/lib/ssh-exec.js +11 -248
- package/dist/lib/ssh-tunnel.d.ts +0 -43
- package/dist/lib/ssh-tunnel.js +2 -48
- package/dist/lib/staleness/checkers/commands.d.ts +0 -4
- package/dist/lib/staleness/checkers/commands.js +0 -4
- package/dist/lib/staleness/checkers/hooks.d.ts +0 -10
- package/dist/lib/staleness/checkers/hooks.js +0 -15
- package/dist/lib/staleness/checkers/mcp.d.ts +0 -9
- package/dist/lib/staleness/checkers/mcp.js +0 -9
- package/dist/lib/staleness/checkers/permissions.d.ts +0 -12
- package/dist/lib/staleness/checkers/permissions.js +0 -13
- package/dist/lib/staleness/checkers/plugins.d.ts +0 -8
- package/dist/lib/staleness/checkers/plugins.js +0 -8
- package/dist/lib/staleness/checkers/rules.d.ts +0 -15
- package/dist/lib/staleness/checkers/rules.js +0 -26
- package/dist/lib/staleness/checkers/skills.d.ts +0 -4
- package/dist/lib/staleness/checkers/skills.js +0 -4
- package/dist/lib/staleness/checkers/subagents.d.ts +0 -9
- package/dist/lib/staleness/checkers/subagents.js +0 -9
- package/dist/lib/staleness/checkers/types.d.ts +0 -34
- package/dist/lib/staleness/checkers/types.js +0 -19
- package/dist/lib/staleness/checkers/workflows.d.ts +0 -7
- package/dist/lib/staleness/checkers/workflows.js +0 -7
- package/dist/lib/staleness/detectors/commands.js +0 -17
- package/dist/lib/staleness/detectors/hooks.js +1 -6
- package/dist/lib/staleness/detectors/mcp.js +0 -4
- package/dist/lib/staleness/detectors/permissions.js +10 -23
- package/dist/lib/staleness/detectors/rules.js +0 -6
- package/dist/lib/staleness/detectors/skills.d.ts +0 -1
- package/dist/lib/staleness/detectors/skills.js +1 -12
- package/dist/lib/staleness/detectors/types.d.ts +0 -10
- package/dist/lib/staleness/fingerprint.d.ts +0 -19
- package/dist/lib/staleness/fingerprint.js +0 -35
- package/dist/lib/staleness/index.d.ts +0 -28
- package/dist/lib/staleness/index.js +1 -45
- package/dist/lib/staleness/layers.d.ts +0 -23
- package/dist/lib/staleness/layers.js +0 -34
- package/dist/lib/staleness/prune.d.ts +0 -71
- package/dist/lib/staleness/prune.js +2 -27
- package/dist/lib/staleness/registry.d.ts +0 -10
- package/dist/lib/staleness/registry.js +3 -33
- package/dist/lib/staleness/types.d.ts +0 -36
- package/dist/lib/staleness/types.js +0 -5
- package/dist/lib/staleness/writers/commands.js +1 -48
- package/dist/lib/staleness/writers/hooks.js +1 -18
- package/dist/lib/staleness/writers/kinds.d.ts +0 -12
- package/dist/lib/staleness/writers/kinds.js +0 -1
- package/dist/lib/staleness/writers/lazy-map.d.ts +0 -11
- package/dist/lib/staleness/writers/mcp.js +0 -13
- package/dist/lib/staleness/writers/plugins.js +0 -4
- package/dist/lib/staleness/writers/rules.d.ts +0 -1
- package/dist/lib/staleness/writers/rules.js +1 -19
- package/dist/lib/staleness/writers/skills.js +3 -14
- package/dist/lib/staleness/writers/sources.d.ts +0 -11
- package/dist/lib/staleness/writers/sources.js +0 -32
- package/dist/lib/staleness/writers/subagents.js +0 -16
- package/dist/lib/staleness/writers/types.d.ts +0 -58
- package/dist/lib/staleness/writers/workflows.js +1 -1
- package/dist/lib/standalone-tools.d.ts +24 -0
- package/dist/lib/standalone-tools.js +58 -0
- package/dist/lib/star-nudge.d.ts +0 -32
- package/dist/lib/star-nudge.js +2 -36
- package/dist/lib/startup/command-registry.d.ts +0 -45
- package/dist/lib/startup/command-registry.js +1 -46
- package/dist/lib/startup/dev-build.d.ts +0 -9
- package/dist/lib/startup/dev-build.js +1 -42
- package/dist/lib/startup/root-command.d.ts +0 -19
- package/dist/lib/startup/root-command.js +0 -19
- package/dist/lib/startup/spellcheck.d.ts +0 -13
- package/dist/lib/startup/spellcheck.js +0 -13
- package/dist/lib/state.d.ts +0 -376
- package/dist/lib/state.js +19 -737
- package/dist/lib/storage/selection.d.ts +0 -40
- package/dist/lib/storage/selection.js +0 -29
- package/dist/lib/subagents-registry.d.ts +0 -56
- package/dist/lib/subagents-registry.js +0 -99
- package/dist/lib/subagents.d.ts +0 -128
- package/dist/lib/subagents.js +1 -158
- package/dist/lib/summarizer/config.d.ts +0 -37
- package/dist/lib/summarizer/config.js +0 -37
- package/dist/lib/summarizer/pass.d.ts +0 -20
- package/dist/lib/summarizer/pass.js +1 -34
- package/dist/lib/summarizer/summarize.d.ts +1 -49
- package/dist/lib/summarizer/summarize.js +0 -35
- package/dist/lib/sync-passphrase.d.ts +0 -16
- package/dist/lib/sync-passphrase.js +1 -18
- package/dist/lib/sync-status.d.ts +0 -72
- package/dist/lib/sync-status.js +0 -55
- package/dist/lib/sync-umbrella.d.ts +0 -54
- package/dist/lib/sync-umbrella.js +0 -48
- package/dist/lib/system-run-sync.d.ts +0 -5
- package/dist/lib/system-run-sync.js +1 -31
- package/dist/lib/teams/agents.d.ts +1 -444
- package/dist/lib/teams/agents.js +11 -871
- package/dist/lib/teams/api.d.ts +2 -52
- package/dist/lib/teams/api.js +4 -63
- package/dist/lib/teams/debug.d.ts +0 -6
- package/dist/lib/teams/debug.js +0 -6
- package/dist/lib/teams/delivery.d.ts +0 -41
- package/dist/lib/teams/delivery.js +0 -32
- package/dist/lib/teams/file_ops.d.ts +0 -11
- package/dist/lib/teams/file_ops.js +0 -11
- package/dist/lib/teams/forEach.d.ts +0 -76
- package/dist/lib/teams/forEach.js +1 -77
- package/dist/lib/teams/index.d.ts +1 -7
- package/dist/lib/teams/index.js +1 -7
- package/dist/lib/teams/parsers.d.ts +0 -4
- package/dist/lib/teams/parsers.js +0 -81
- package/dist/lib/teams/persistence.d.ts +0 -2
- package/dist/lib/teams/persistence.js +0 -12
- package/dist/lib/teams/placement-probe.d.ts +0 -12
- package/dist/lib/teams/placement-probe.js +1 -51
- package/dist/lib/teams/pr-watch.d.ts +0 -107
- package/dist/lib/teams/pr-watch.js +1 -107
- package/dist/lib/teams/registry.d.ts +0 -36
- package/dist/lib/teams/registry.js +0 -47
- package/dist/lib/teams/remoteWorktree.d.ts +0 -50
- package/dist/lib/teams/remoteWorktree.js +1 -96
- package/dist/lib/teams/scheduler.d.ts +0 -111
- package/dist/lib/teams/scheduler.js +2 -125
- package/dist/lib/teams/summarizer.d.ts +0 -22
- package/dist/lib/teams/summarizer.js +6 -50
- package/dist/lib/teams/supervisor.d.ts +0 -38
- package/dist/lib/teams/supervisor.js +0 -21
- package/dist/lib/teams/worktree.d.ts +0 -95
- package/dist/lib/teams/worktree.js +3 -110
- package/dist/lib/template.d.ts +0 -21
- package/dist/lib/template.js +0 -23
- package/dist/lib/term-client.d.ts +0 -26
- package/dist/lib/term-client.js +0 -48
- package/dist/lib/term-driver.d.ts +0 -5
- package/dist/lib/term-driver.js +0 -8
- package/dist/lib/terminal/backends/ghostty.d.ts +0 -2
- package/dist/lib/terminal/backends/ghostty.js +0 -12
- package/dist/lib/terminal/backends/index.d.ts +0 -17
- package/dist/lib/terminal/backends/index.js +0 -15
- package/dist/lib/terminal/backends/iterm.d.ts +0 -2
- package/dist/lib/terminal/backends/iterm.js +0 -10
- package/dist/lib/terminal/backends/terminal-app.d.ts +0 -10
- package/dist/lib/terminal/backends/terminal-app.js +0 -30
- package/dist/lib/terminal/backends/tmux.d.ts +0 -10
- package/dist/lib/terminal/backends/tmux.js +0 -2
- package/dist/lib/terminal/backends/vscodium-agent.d.ts +0 -25
- package/dist/lib/terminal/backends/vscodium-agent.js +0 -36
- package/dist/lib/terminal/engine.d.ts +0 -17
- package/dist/lib/terminal/engine.js +0 -10
- package/dist/lib/terminal/index.d.ts +0 -8
- package/dist/lib/terminal/inject.d.ts +1 -173
- package/dist/lib/terminal/inject.js +0 -146
- package/dist/lib/terminal/policy.d.ts +0 -8
- package/dist/lib/terminal/policy.js +0 -1
- package/dist/lib/terminal/preferred.d.ts +0 -66
- package/dist/lib/terminal/preferred.js +0 -30
- package/dist/lib/terminal/quote.d.ts +0 -8
- package/dist/lib/terminal/quote.js +0 -8
- package/dist/lib/terminal/resolve.d.ts +0 -46
- package/dist/lib/terminal/resolve.js +0 -30
- package/dist/lib/terminal/run-surface.d.ts +0 -56
- package/dist/lib/terminal/run-surface.js +0 -46
- package/dist/lib/terminal/shell.d.ts +0 -3
- package/dist/lib/terminal/shell.js +0 -13
- package/dist/lib/terminal/transport.d.ts +0 -14
- package/dist/lib/terminal/transport.js +1 -30
- package/dist/lib/terminal/types.d.ts +0 -40
- package/dist/lib/terminal/types.js +0 -10
- package/dist/lib/text/relative-time.d.ts +0 -36
- package/dist/lib/text/relative-time.js +0 -43
- package/dist/lib/text/short-id.d.ts +0 -16
- package/dist/lib/text/short-id.js +0 -16
- package/dist/lib/text/width.d.ts +0 -24
- package/dist/lib/text/width.js +10 -52
- package/dist/lib/tmux/binary.d.ts +0 -36
- package/dist/lib/tmux/binary.js +0 -28
- package/dist/lib/tmux/index.d.ts +0 -5
- package/dist/lib/tmux/index.js +0 -5
- package/dist/lib/tmux/orphan-reap.d.ts +0 -253
- package/dist/lib/tmux/orphan-reap.js +3 -299
- package/dist/lib/tmux/paths.d.ts +0 -14
- package/dist/lib/tmux/paths.js +0 -14
- package/dist/lib/tmux/session.d.ts +0 -263
- package/dist/lib/tmux/session.js +6 -344
- package/dist/lib/traces/backend.d.ts +0 -20
- package/dist/lib/traces/backend.js +0 -23
- package/dist/lib/traces/classify.d.ts +0 -20
- package/dist/lib/traces/classify.js +0 -7
- package/dist/lib/traces/insights.d.ts +1 -84
- package/dist/lib/traces/insights.js +0 -126
- package/dist/lib/traces/phenotype.d.ts +0 -69
- package/dist/lib/traces/phenotype.js +0 -150
- package/dist/lib/traces/provision.d.ts +0 -1
- package/dist/lib/traces/provision.js +0 -5
- package/dist/lib/traces/schema2-build.d.ts +3 -60
- package/dist/lib/traces/schema2-build.js +8 -149
- package/dist/lib/traces/schema2-danger.d.ts +0 -30
- package/dist/lib/traces/schema2-danger.js +1 -63
- package/dist/lib/traces/schema2.d.ts +0 -11
- package/dist/lib/traces/segments.d.ts +0 -44
- package/dist/lib/traces/segments.js +0 -65
- package/dist/lib/traces/sync.d.ts +2 -239
- package/dist/lib/traces/sync.js +15 -237
- package/dist/lib/traces/worker-template.d.ts +0 -3
- package/dist/lib/traces/worker-template.js +0 -29
- package/dist/lib/triggers/handlers.d.ts +0 -82
- package/dist/lib/triggers/handlers.js +0 -75
- package/dist/lib/triggers/webhook.d.ts +0 -158
- package/dist/lib/triggers/webhook.js +0 -143
- package/dist/lib/types.d.ts +0 -736
- package/dist/lib/types.js +0 -50
- package/dist/lib/uninstall.d.ts +0 -17
- package/dist/lib/uninstall.js +0 -75
- package/dist/lib/usage-backoff.d.ts +0 -20
- package/dist/lib/usage-backoff.js +3 -60
- package/dist/lib/usage-refresh.d.ts +0 -154
- package/dist/lib/usage-refresh.js +8 -212
- package/dist/lib/verbs.d.ts +0 -12
- package/dist/lib/verbs.js +0 -12
- package/dist/lib/version-duplicates.d.ts +0 -6
- package/dist/lib/version-duplicates.js +0 -6
- package/dist/lib/version.d.ts +0 -55
- package/dist/lib/version.js +1 -58
- package/dist/lib/view-types.d.ts +0 -48
- package/dist/lib/warn-unpushed.d.ts +0 -27
- package/dist/lib/warn-unpushed.js +1 -45
- package/dist/lib/watchdog/history.d.ts +0 -1
- package/dist/lib/watchdog/history.js +0 -3
- package/dist/lib/watchdog/index.js +0 -2
- package/dist/lib/watchdog/log.d.ts +0 -19
- package/dist/lib/watchdog/log.js +0 -34
- package/dist/lib/watchdog/read.d.ts +0 -27
- package/dist/lib/watchdog/read.js +3 -58
- package/dist/lib/watchdog/rotate.d.ts +0 -139
- package/dist/lib/watchdog/rotate.js +2 -151
- package/dist/lib/watchdog/runner.d.ts +0 -125
- package/dist/lib/watchdog/runner.js +3 -223
- package/dist/lib/watchdog/service.d.ts +0 -1
- package/dist/lib/watchdog/service.js +0 -2
- package/dist/lib/watchdog/watchdog-agent.d.ts +0 -31
- package/dist/lib/watchdog/watchdog-agent.js +0 -27
- package/dist/lib/watchdog/watchdog.d.ts +0 -7
- package/dist/lib/watchdog/watchdog.js +0 -10
- package/dist/lib/watchdog/watchdogTail.js +0 -7
- package/dist/lib/whats-new.d.ts +0 -10
- package/dist/lib/whats-new.js +0 -21
- package/dist/lib/workflows-registry.d.ts +0 -45
- package/dist/lib/workflows-registry.js +0 -60
- package/dist/lib/workflows.d.ts +0 -282
- package/dist/lib/workflows.js +3 -213
- package/dist/lib/worktree/held.d.ts +0 -89
- package/dist/lib/worktree/held.js +1 -103
- package/dist/lib/wrap.d.ts +0 -32
- package/dist/lib/wrap.js +0 -32
- package/dist/lib/yaml-io.d.ts +0 -45
- package/dist/lib/yaml-io.js +0 -47
- package/dist/session-tracker/dist/adapters/claude.js +0 -2
- package/dist/session-tracker/dist/hook.sh +4 -37
- package/dist/session-tracker/dist/index.d.ts +0 -7
- package/dist/session-tracker/dist/index.js +0 -5
- package/dist/session-tracker/dist/install-hook.d.ts +0 -5
- package/dist/session-tracker/dist/install-hook.js +1 -15
- package/dist/session-tracker/dist/prune-state.js +0 -4
- package/dist/session-tracker/dist/reader.js +0 -4
- package/dist/session-tracker/dist/state-file.d.ts +0 -3
- package/dist/session-tracker/dist/state-file.js +3 -8
- package/package.json +3 -4
- package/scripts/postinstall.js +8 -116
- package/dist/lib/session/artifacts.d.ts +0 -14
- package/dist/lib/session/artifacts.js +0 -101
- package/dist/lib/session/bash-command.d.ts +0 -63
- package/dist/lib/session/bash-command.js +0 -490
- package/dist/lib/session/digest.d.ts +0 -66
- package/dist/lib/session/digest.js +0 -328
- package/dist/lib/session/highlights.d.ts +0 -151
- package/dist/lib/session/highlights.js +0 -391
- package/dist/lib/session/insights.d.ts +0 -165
- package/dist/lib/session/insights.js +0 -563
- package/dist/lib/session/linear.d.ts +0 -19
- package/dist/lib/session/linear.js +0 -99
- package/dist/lib/session/parse.d.ts +0 -224
- package/dist/lib/session/parse.js +0 -2408
- package/dist/lib/session/prompt.d.ts +0 -213
- package/dist/lib/session/prompt.js +0 -601
- package/dist/lib/session/render.d.ts +0 -133
- package/dist/lib/session/render.js +0 -1047
- package/dist/lib/session/share-html.d.ts +0 -35
- package/dist/lib/session/share-html.js +0 -319
- package/dist/lib/session/shell-programs.d.ts +0 -33
- package/dist/lib/session/shell-programs.js +0 -380
- package/dist/lib/session/state.d.ts +0 -269
- package/dist/lib/session/state.js +0 -777
- package/dist/lib/session/stream-render.d.ts +0 -4
- package/dist/lib/session/stream-render.js +0 -131
- package/dist/lib/session/tail.d.ts +0 -88
- package/dist/lib/session/tail.js +0 -294
- package/dist/lib/session/team-filter.d.ts +0 -129
- package/dist/lib/session/team-filter.js +0 -269
- package/dist/lib/session/timeline.d.ts +0 -172
- package/dist/lib/session/timeline.js +0 -636
- package/dist/lib/session/tool-calls.d.ts +0 -132
- package/dist/lib/session/tool-calls.js +0 -674
- package/dist/lib/session/trajectory-compare.d.ts +0 -48
- package/dist/lib/session/trajectory-compare.js +0 -116
- package/dist/lib/session/trajectory-html.d.ts +0 -19
- package/dist/lib/session/trajectory-html.js +0 -771
- package/dist/lib/session/trajectory-lineage.d.ts +0 -93
- package/dist/lib/session/trajectory-lineage.js +0 -195
- package/dist/lib/session/trajectory-text.d.ts +0 -38
- package/dist/lib/session/trajectory-text.js +0 -284
- package/dist/lib/session/trajectory.d.ts +0 -145
- package/dist/lib/session/trajectory.js +0 -394
- package/dist/lib/session/types.d.ts +0 -627
- package/dist/lib/session/types.js +0 -43
package/dist/lib/git.js
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Git operations for the agents-cli system repo and package repositories.
|
|
3
|
-
*
|
|
4
|
-
* Handles cloning, pulling, syncing, and inspecting git repos used by
|
|
5
|
-
* the agents version management and plugin/package system. Includes
|
|
6
|
-
* source parsing for GitHub shorthand, SSH, HTTPS, and local paths.
|
|
7
|
-
*/
|
|
8
1
|
import simpleGit from 'simple-git';
|
|
9
2
|
import { execFileSync } from 'node:child_process';
|
|
10
3
|
import * as fs from 'fs';
|
|
@@ -13,36 +6,15 @@ import * as path from 'path';
|
|
|
13
6
|
import { IS_WINDOWS, isWindowsAbsolutePath, toNativePath } from './platform/index.js';
|
|
14
7
|
import { getPackageLocalPath } from './state.js';
|
|
15
8
|
import { DEFAULT_SYSTEM_REPO, systemRepoSlug } from './types.js';
|
|
16
|
-
/**
|
|
17
|
-
* Validate that a clone/pull source uses a safe git transport before it is
|
|
18
|
-
* handed to `git`.
|
|
19
|
-
*
|
|
20
|
-
* Git's remote-helper transports (`ext::`, `fd::`, …) execute arbitrary
|
|
21
|
-
* commands at clone time, `file://`/`git://` are unauthenticated, and a source
|
|
22
|
-
* beginning with `-` is parsed by `git` as a command-line flag (option
|
|
23
|
-
* injection). We therefore allow only:
|
|
24
|
-
* - `https://` (encrypted + authenticated)
|
|
25
|
-
* - `ssh://` and SCP-style `git@host:path` / `host:path`
|
|
26
|
-
* - local filesystem paths (callers handle these before reaching `git clone`)
|
|
27
|
-
*
|
|
28
|
-
* Pure string inspection — no filesystem or platform calls — so it behaves
|
|
29
|
-
* identically on Linux, macOS, and Windows.
|
|
30
|
-
*
|
|
31
|
-
* @throws Error if the source uses a disallowed transport.
|
|
32
|
-
*/
|
|
33
9
|
export function assertSafeGitTransport(source) {
|
|
34
10
|
const s = source.trim();
|
|
35
|
-
// A leading dash is interpreted by git as an option, not a source.
|
|
36
11
|
if (s.startsWith('-')) {
|
|
37
12
|
throw new Error(`Refusing to use git source "${source}": a source starting with "-" is interpreted as a git option.`);
|
|
38
13
|
}
|
|
39
|
-
// Remote-helper transports look like "<name>::…" (ext::, fd::, …). SCP-style
|
|
40
|
-
// "git@host:path" uses a single ":" and is intentionally not matched here.
|
|
41
14
|
const helper = s.match(/^[a-zA-Z][a-zA-Z0-9+.-]*::/);
|
|
42
15
|
if (helper) {
|
|
43
16
|
throw new Error(`Refusing to use git source "${source}": git remote-helper transports (ext::, fd::, …) are not allowed.`);
|
|
44
17
|
}
|
|
45
|
-
// Explicit "<scheme>://" URLs: permit only https and ssh.
|
|
46
18
|
const scheme = s.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):\/\//);
|
|
47
19
|
if (scheme) {
|
|
48
20
|
const name = scheme[1].toLowerCase();
|
|
@@ -50,17 +22,7 @@ export function assertSafeGitTransport(source) {
|
|
|
50
22
|
throw new Error(`Refusing to use git source "${source}": "${name}://" is not an allowed transport (use https:// or ssh://).`);
|
|
51
23
|
}
|
|
52
24
|
}
|
|
53
|
-
// No scheme -> SCP-style SSH ("git@host:path") or a local path; both safe.
|
|
54
25
|
}
|
|
55
|
-
/**
|
|
56
|
-
* Validate a branch name before it is passed to `git push` / `git pull`.
|
|
57
|
-
*
|
|
58
|
-
* A name beginning with `-` is parsed by git as a command-line option
|
|
59
|
-
* (e.g. `--mirror`, `--receive-pack=…`), not a ref. Pure string check —
|
|
60
|
-
* identical on every OS, no spawn.
|
|
61
|
-
*
|
|
62
|
-
* @throws Error if the name is empty or would be interpreted as a git option.
|
|
63
|
-
*/
|
|
64
26
|
export function assertValidBranchName(branch) {
|
|
65
27
|
const b = branch.trim();
|
|
66
28
|
if (!b) {
|
|
@@ -70,18 +32,6 @@ export function assertValidBranchName(branch) {
|
|
|
70
32
|
throw new Error(`Invalid branch name ${JSON.stringify(branch)}: a name starting with "-" is interpreted as a git option.`);
|
|
71
33
|
}
|
|
72
34
|
}
|
|
73
|
-
/**
|
|
74
|
-
* `git push origin <branch>` with option-injection hardening:
|
|
75
|
-
* 1. {@link assertValidBranchName} rejects leading `-`
|
|
76
|
-
* 2. `--` ends option parsing so a hostile ref cannot be read as a flag
|
|
77
|
-
*
|
|
78
|
-
* Prefer this over `git.push(remote, branch)` whenever the branch comes from
|
|
79
|
-
* repo state rather than a hard-coded literal.
|
|
80
|
-
*
|
|
81
|
-
* Pass `targetBranch` to push the local `branch` to a differently-named remote
|
|
82
|
-
* branch (`git push origin <branch>:<targetBranch>`) — used when publishing the
|
|
83
|
-
* working tree to a branch other than the checked-out one.
|
|
84
|
-
*/
|
|
85
35
|
export async function pushOrigin(git, branch, targetBranch) {
|
|
86
36
|
assertValidBranchName(branch);
|
|
87
37
|
if (targetBranch && targetBranch !== branch) {
|
|
@@ -91,28 +41,10 @@ export async function pushOrigin(git, branch, targetBranch) {
|
|
|
91
41
|
}
|
|
92
42
|
await git.raw(['push', '--', 'origin', branch]);
|
|
93
43
|
}
|
|
94
|
-
/**
|
|
95
|
-
* Whether installing a cloned/pulled repo's `.githooks/` is enabled.
|
|
96
|
-
*
|
|
97
|
-
* Installing hooks wires those scripts into `.git/hooks/`, so `git` EXECUTES
|
|
98
|
-
* them on the next commit/checkout/merge. A repo added via `agents repo add
|
|
99
|
-
* <source>` is untrusted, so auto-installing its hooks is remote code
|
|
100
|
-
* execution. We require explicit opt-in via `AGENTS_ENABLE_GITHOOKS=1`.
|
|
101
|
-
*/
|
|
102
44
|
function githooksEnabled() {
|
|
103
45
|
const v = process.env.AGENTS_ENABLE_GITHOOKS;
|
|
104
46
|
return v === '1' || v === 'true';
|
|
105
47
|
}
|
|
106
|
-
/**
|
|
107
|
-
* Install hooks from `.githooks/` by symlinking each entry into `.git/hooks/`.
|
|
108
|
-
*
|
|
109
|
-
* Gated behind `AGENTS_ENABLE_GITHOOKS=1` (see {@link githooksEnabled}) because
|
|
110
|
-
* the hooks run code on git operations and the source repo may be untrusted.
|
|
111
|
-
*
|
|
112
|
-
* Why symlinks rather than `git config core.hooksPath`: `core.hooksPath` is a
|
|
113
|
-
* known sandbox-escape vector and is blocked by some sandboxed environments
|
|
114
|
-
* (e.g. Claude Code). Symlinks inside `.git/hooks/` run the same way.
|
|
115
|
-
*/
|
|
116
48
|
function installGithooksSymlinks(repoDir) {
|
|
117
49
|
const githooksDir = path.join(repoDir, '.githooks');
|
|
118
50
|
if (!fs.existsSync(githooksDir))
|
|
@@ -137,44 +69,22 @@ function installGithooksSymlinks(repoDir) {
|
|
|
137
69
|
fs.symlinkSync(target, dest);
|
|
138
70
|
}
|
|
139
71
|
catch (err) {
|
|
140
|
-
// Windows requires Developer Mode or elevated privileges for symlinks; skip gracefully.
|
|
141
72
|
if (err.code !== 'EPERM')
|
|
142
73
|
throw err;
|
|
143
74
|
}
|
|
144
75
|
}
|
|
145
76
|
}
|
|
146
|
-
/**
|
|
147
|
-
* Parse a source string into a GitSource object.
|
|
148
|
-
*
|
|
149
|
-
* Supported formats:
|
|
150
|
-
* gh:owner/repo -> https://github.com/owner/repo.git
|
|
151
|
-
* gh:owner/repo@branch -> https://github.com/owner/repo.git (ref: branch)
|
|
152
|
-
* owner/repo -> https://github.com/owner/repo.git
|
|
153
|
-
* owner/repo@branch -> https://github.com/owner/repo.git (ref: branch)
|
|
154
|
-
* github.com/owner/repo -> https://github.com/owner/repo.git
|
|
155
|
-
* github.com:owner/repo -> https://github.com/owner/repo.git
|
|
156
|
-
* github.com:owner/repo.git -> https://github.com/owner/repo.git
|
|
157
|
-
* git@github.com:owner/repo.git -> https://github.com/owner/repo.git
|
|
158
|
-
* https://github.com/owner/repo -> https://github.com/owner/repo.git
|
|
159
|
-
* https://github.com/owner/repo.git -> https://github.com/owner/repo.git
|
|
160
|
-
* /path/to/local -> local path
|
|
161
|
-
* ./relative/path -> local path
|
|
162
|
-
*/
|
|
163
77
|
export function parseSource(source) {
|
|
164
|
-
// Split off @ref suffix (but not from URLs with @ in them like git@)
|
|
165
78
|
let ref;
|
|
166
79
|
let cleanSource = source;
|
|
167
|
-
// Handle @ref suffix (only if it's at the end and not part of git@)
|
|
168
80
|
const atIndex = source.lastIndexOf('@');
|
|
169
81
|
if (atIndex > 0 && !source.startsWith('git@') && !source.slice(0, atIndex).includes('://')) {
|
|
170
|
-
// Check if what's after @ looks like a ref (no slashes, no dots except in branch names)
|
|
171
82
|
const possibleRef = source.slice(atIndex + 1);
|
|
172
83
|
if (possibleRef && !possibleRef.includes('/') && !possibleRef.includes(':')) {
|
|
173
84
|
ref = possibleRef;
|
|
174
85
|
cleanSource = source.slice(0, atIndex);
|
|
175
86
|
}
|
|
176
87
|
}
|
|
177
|
-
// gh:owner/repo shorthand
|
|
178
88
|
if (cleanSource.startsWith('gh:')) {
|
|
179
89
|
const repo = cleanSource.slice(3).replace(/\.git$/, '');
|
|
180
90
|
return {
|
|
@@ -183,7 +93,6 @@ export function parseSource(source) {
|
|
|
183
93
|
ref: ref || 'main',
|
|
184
94
|
};
|
|
185
95
|
}
|
|
186
|
-
// git@github.com:owner/repo.git (SSH URL)
|
|
187
96
|
if (cleanSource.startsWith('git@github.com:')) {
|
|
188
97
|
const repo = cleanSource.slice(15).replace(/\.git$/, '');
|
|
189
98
|
return {
|
|
@@ -192,7 +101,6 @@ export function parseSource(source) {
|
|
|
192
101
|
ref: ref || 'main',
|
|
193
102
|
};
|
|
194
103
|
}
|
|
195
|
-
// github.com:owner/repo.git (SSH-style without git@)
|
|
196
104
|
if (cleanSource.startsWith('github.com:')) {
|
|
197
105
|
const repo = cleanSource.slice(11).replace(/\.git$/, '');
|
|
198
106
|
return {
|
|
@@ -201,7 +109,6 @@ export function parseSource(source) {
|
|
|
201
109
|
ref: ref || 'main',
|
|
202
110
|
};
|
|
203
111
|
}
|
|
204
|
-
// github.com/owner/repo (domain without protocol)
|
|
205
112
|
if (cleanSource.startsWith('github.com/')) {
|
|
206
113
|
const repo = cleanSource.slice(11).replace(/\.git$/, '');
|
|
207
114
|
return {
|
|
@@ -210,9 +117,7 @@ export function parseSource(source) {
|
|
|
210
117
|
ref: ref || 'main',
|
|
211
118
|
};
|
|
212
119
|
}
|
|
213
|
-
// https:// or http:// URLs
|
|
214
120
|
if (cleanSource.startsWith('http://') || cleanSource.startsWith('https://')) {
|
|
215
|
-
// Check if it's a GitHub URL
|
|
216
121
|
const githubMatch = cleanSource.match(/^https?:\/\/github\.com\/([^/]+\/[^/]+?)(?:\.git)?$/);
|
|
217
122
|
if (githubMatch) {
|
|
218
123
|
return {
|
|
@@ -221,8 +126,6 @@ export function parseSource(source) {
|
|
|
221
126
|
ref: ref || 'main',
|
|
222
127
|
};
|
|
223
128
|
}
|
|
224
|
-
// Generic URL -- must be an encrypted, authenticated transport
|
|
225
|
-
// (rejects http://, file://, git://, ext::, and leading "-").
|
|
226
129
|
assertSafeGitTransport(cleanSource);
|
|
227
130
|
return {
|
|
228
131
|
type: 'url',
|
|
@@ -230,8 +133,6 @@ export function parseSource(source) {
|
|
|
230
133
|
ref,
|
|
231
134
|
};
|
|
232
135
|
}
|
|
233
|
-
// Local path (absolute or relative). On Windows also recognize drive-letter
|
|
234
|
-
// (C:\…) and UNC (\\…) roots, which the POSIX prefixes miss.
|
|
235
136
|
if (cleanSource.startsWith('/') || cleanSource.startsWith('./') || cleanSource.startsWith('../')
|
|
236
137
|
|| (IS_WINDOWS && isWindowsAbsolutePath(cleanSource))) {
|
|
237
138
|
if (fs.existsSync(cleanSource)) {
|
|
@@ -241,14 +142,12 @@ export function parseSource(source) {
|
|
|
241
142
|
};
|
|
242
143
|
}
|
|
243
144
|
}
|
|
244
|
-
// Check if it exists as a local path (could be a directory name without ./)
|
|
245
145
|
if (fs.existsSync(cleanSource)) {
|
|
246
146
|
return {
|
|
247
147
|
type: 'local',
|
|
248
148
|
url: path.resolve(cleanSource),
|
|
249
149
|
};
|
|
250
150
|
}
|
|
251
|
-
// Bare owner/repo format (assumes GitHub)
|
|
252
151
|
if (cleanSource.includes('/') && !cleanSource.includes(':') && !cleanSource.includes('.')) {
|
|
253
152
|
const repo = cleanSource.replace(/\.git$/, '');
|
|
254
153
|
return {
|
|
@@ -257,7 +156,6 @@ export function parseSource(source) {
|
|
|
257
156
|
ref: ref || 'main',
|
|
258
157
|
};
|
|
259
158
|
}
|
|
260
|
-
// Last attempt: treat as GitHub if it looks like owner/repo (with possible .git)
|
|
261
159
|
if (/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_.-]+$/.test(cleanSource)) {
|
|
262
160
|
const repo = cleanSource.replace(/\.git$/, '');
|
|
263
161
|
return {
|
|
@@ -268,7 +166,6 @@ export function parseSource(source) {
|
|
|
268
166
|
}
|
|
269
167
|
throw new Error(`Invalid source: ${source}. Supported formats: gh:owner/repo, owner/repo, github.com/owner/repo, https://github.com/owner/repo, or local path`);
|
|
270
168
|
}
|
|
271
|
-
/** Clone a remote repo or pull updates if it already exists locally. */
|
|
272
169
|
async function cloneOrPull(source, targetDir) {
|
|
273
170
|
const git = simpleGit();
|
|
274
171
|
if (source.type === 'local') {
|
|
@@ -295,7 +192,6 @@ async function cloneOrPull(source, targetDir) {
|
|
|
295
192
|
const log = await repoGit.log({ maxCount: 1 });
|
|
296
193
|
return { isNew: true, commit: log.latest?.hash.slice(0, 8) || 'unknown' };
|
|
297
194
|
}
|
|
298
|
-
/** Clone a repository from a source string, returning the local path and commit hash. */
|
|
299
195
|
export async function cloneRepo(source) {
|
|
300
196
|
const parsed = parseSource(source);
|
|
301
197
|
if (parsed.type === 'local') {
|
|
@@ -313,7 +209,6 @@ export async function cloneRepo(source) {
|
|
|
313
209
|
isNew: result.isNew,
|
|
314
210
|
};
|
|
315
211
|
}
|
|
316
|
-
/** Get the short commit hash (8 chars) of the latest commit in a repo. */
|
|
317
212
|
export async function getRepoCommit(repoPath) {
|
|
318
213
|
try {
|
|
319
214
|
const git = simpleGit(repoPath);
|
|
@@ -321,13 +216,9 @@ export async function getRepoCommit(repoPath) {
|
|
|
321
216
|
return log.latest?.hash.slice(0, 8) || 'unknown';
|
|
322
217
|
}
|
|
323
218
|
catch {
|
|
324
|
-
/* not a git repo or no commits */
|
|
325
219
|
return 'unknown';
|
|
326
220
|
}
|
|
327
221
|
}
|
|
328
|
-
/** Read {@link RepoStateSnapshot} for `repoPath` using plumbing commands so the
|
|
329
|
-
* result is stable across git versions and never mutates the tree. Returns null
|
|
330
|
-
* when the path is not a git worktree. */
|
|
331
222
|
export function readRepoState(repoPath) {
|
|
332
223
|
const runGit = (args) => {
|
|
333
224
|
try {
|
|
@@ -341,33 +232,17 @@ export function readRepoState(repoPath) {
|
|
|
341
232
|
return null;
|
|
342
233
|
}
|
|
343
234
|
};
|
|
344
|
-
// Gate on a real worktree first; `rev-parse --is-inside-work-tree` prints
|
|
345
|
-
// `true` only inside one, and returns non-zero (→ null) otherwise.
|
|
346
235
|
if (runGit(['rev-parse', '--is-inside-work-tree']) !== 'true')
|
|
347
236
|
return null;
|
|
348
237
|
const branchRaw = runGit(['rev-parse', '--abbrev-ref', 'HEAD']);
|
|
349
|
-
const branch = branchRaw && branchRaw !== 'HEAD' ? branchRaw : null;
|
|
238
|
+
const branch = branchRaw && branchRaw !== 'HEAD' ? branchRaw : null;
|
|
350
239
|
const headRaw = runGit(['rev-parse', 'HEAD']);
|
|
351
240
|
const head = headRaw ? headRaw.slice(0, 8) : null;
|
|
352
241
|
const porcelain = runGit(['status', '--porcelain']);
|
|
353
242
|
const dirty = porcelain != null && porcelain.length > 0;
|
|
354
243
|
return { branch, head, dirty };
|
|
355
244
|
}
|
|
356
|
-
/** Memoized per repoRoot — a resolveResource()/listResources()/plugin-discovery
|
|
357
|
-
* call that touches many resources from the SAME DotAgents repo must not shell
|
|
358
|
-
* out to git once per resource. */
|
|
359
245
|
const _snapshotShaCache = new Map();
|
|
360
|
-
/**
|
|
361
|
-
* The short HEAD sha of the git repo at `repoRoot` (`git -C <repoRoot>
|
|
362
|
-
* rev-parse --short HEAD`), for provenance — "which commit of this DotAgents
|
|
363
|
-
* repo was this resource/plugin resolved from". `undefined` when `repoRoot`
|
|
364
|
-
* isn't a git repo (or has no commits yet), never a throw.
|
|
365
|
-
*
|
|
366
|
-
* Deliberately synchronous + resolved once and cached: callers (resources.ts,
|
|
367
|
-
* plugins.ts) attach this as a lazy getter on the resolved object, so a
|
|
368
|
-
* consumer that never inspects provenance never pays for the git shell-out —
|
|
369
|
-
* see {@link ResolvedResource.snapshotSha} / {@link DiscoveredPlugin.snapshotSha}.
|
|
370
|
-
*/
|
|
371
246
|
export function resolveSnapshotSha(repoRoot) {
|
|
372
247
|
const cached = _snapshotShaCache.get(repoRoot);
|
|
373
248
|
if (cached !== undefined || _snapshotShaCache.has(repoRoot))
|
|
@@ -385,13 +260,9 @@ export function resolveSnapshotSha(repoRoot) {
|
|
|
385
260
|
_snapshotShaCache.set(repoRoot, sha);
|
|
386
261
|
return sha;
|
|
387
262
|
}
|
|
388
|
-
/** Test seam: clear the memoized snapshot-sha cache between test cases. */
|
|
389
263
|
export function _resetSnapshotShaCacheForTest() {
|
|
390
264
|
_snapshotShaCache.clear();
|
|
391
265
|
}
|
|
392
|
-
/**
|
|
393
|
-
* Get the remote URL for origin in a git repo.
|
|
394
|
-
*/
|
|
395
266
|
export async function getRemoteUrl(repoPath) {
|
|
396
267
|
try {
|
|
397
268
|
const git = simpleGit(repoPath);
|
|
@@ -400,102 +271,44 @@ export async function getRemoteUrl(repoPath) {
|
|
|
400
271
|
return origin?.refs?.fetch || origin?.refs?.push || null;
|
|
401
272
|
}
|
|
402
273
|
catch {
|
|
403
|
-
/* not a git repo or no remotes */
|
|
404
274
|
return null;
|
|
405
275
|
}
|
|
406
276
|
}
|
|
407
|
-
/**
|
|
408
|
-
* Canonical `host/owner/repo` form of a git remote, transport-agnostic, so the
|
|
409
|
-
* same repo cloned over SSH vs HTTPS compares equal. Strips protocol, any
|
|
410
|
-
* `user@`, a trailing `.git`, and folds the scp-style `host:owner/repo` colon to
|
|
411
|
-
* a slash. Lower-cased. Used to decide whether an existing checkout is "the same
|
|
412
|
-
* repo" as a requested source before adopting it.
|
|
413
|
-
*/
|
|
414
277
|
export function canonicalGitRemote(url) {
|
|
415
278
|
const canonical = url
|
|
416
279
|
.trim()
|
|
417
|
-
.replace(/\/+$/, '')
|
|
280
|
+
.replace(/\/+$/, '')
|
|
418
281
|
.replace(/\.git$/i, '')
|
|
419
|
-
.replace(/^[a-z][a-z0-9+.-]*:\/\//i, '')
|
|
420
|
-
.replace(/^[^@/]+@/, '')
|
|
421
|
-
.replace(':', '/')
|
|
282
|
+
.replace(/^[a-z][a-z0-9+.-]*:\/\//i, '')
|
|
283
|
+
.replace(/^[^@/]+@/, '')
|
|
284
|
+
.replace(':', '/')
|
|
422
285
|
.toLowerCase();
|
|
423
|
-
// Fold a renamed repo's old name onto its new one so both compare equal
|
|
424
|
-
// everywhere (see RENAMED_REMOTE_ALIASES).
|
|
425
286
|
return RENAMED_REMOTE_ALIASES[canonical] ?? canonical;
|
|
426
287
|
}
|
|
427
|
-
/**
|
|
428
|
-
* Git remotes that denote the SAME repository under an old and a new name,
|
|
429
|
-
* keyed by canonical `host/owner/repo`. `phnx-labs/.agents-system` was renamed
|
|
430
|
-
* to `phnx-labs/.agents` on GitHub (PHNX-3394); {@link DEFAULT_SYSTEM_REPO}
|
|
431
|
-
* still points at the pre-rename slug (GitHub's own redirect makes that
|
|
432
|
-
* resolve fine), so folding the new name onto it here means both compare equal
|
|
433
|
-
* everywhere remotes are compared: {@link sameGitRemote} (repo adoption),
|
|
434
|
-
* {@link isSystemRepoRemote} (the system-origin check), and the
|
|
435
|
-
* DotAgents-layer classifier in state.ts.
|
|
436
|
-
*/
|
|
437
288
|
const RENAMED_REMOTE_ALIASES = {
|
|
438
289
|
'github.com/phnx-labs/.agents': 'github.com/phnx-labs/.agents-system',
|
|
439
290
|
};
|
|
440
|
-
/**
|
|
441
|
-
* True when a git remote URL (any transport form: ssh, https, scp-style) points
|
|
442
|
-
* at the system DotAgents repo — {@link DEFAULT_SYSTEM_REPO}'s current slug OR
|
|
443
|
-
* its `phnx-labs/.agents` rename target (PHNX-3394), which
|
|
444
|
-
* {@link canonicalGitRemote} folds onto it via {@link RENAMED_REMOTE_ALIASES}.
|
|
445
|
-
* Pure string check with no git spawn, so it is unit-testable off a live
|
|
446
|
-
* checkout; {@link isSystemRepoOrigin} reads a dir's origin and delegates here.
|
|
447
|
-
*/
|
|
448
291
|
export function isSystemRepoRemote(remote) {
|
|
449
292
|
if (!remote)
|
|
450
293
|
return false;
|
|
451
294
|
const c = canonicalGitRemote(remote);
|
|
452
295
|
return c === canonicalGitRemote(`https://github.com/${systemRepoSlug(DEFAULT_SYSTEM_REPO)}`);
|
|
453
296
|
}
|
|
454
|
-
/**
|
|
455
|
-
* True when `remote` is the origin the system repo is EXPECTED to track on this
|
|
456
|
-
* machine, honouring an operator's `AGENTS_SYSTEM_REPO` override.
|
|
457
|
-
*
|
|
458
|
-
* The system repo ships hooks that register as shell `command` strings run on
|
|
459
|
-
* every tool event, and its checkout auto-fast-forwards from origin — so a
|
|
460
|
-
* fast-forward from an origin the operator never chose is remote code execution
|
|
461
|
-
* on the next command that loads a system resource (PHNX-2957). This is the
|
|
462
|
-
* pinning predicate every auto-pull of the system repo gates on: pull only when
|
|
463
|
-
* origin is the canonical {@link isSystemRepoRemote} repo, or the exact
|
|
464
|
-
* `AGENTS_SYSTEM_REPO` the operator pointed at instead. Anything else — a
|
|
465
|
-
* repointed origin, a fork, an unset-then-swapped remote — is refused, not
|
|
466
|
-
* pulled. Pure string check; no git spawn.
|
|
467
|
-
*/
|
|
468
297
|
export function isExpectedSystemRepoRemote(remote) {
|
|
469
298
|
if (!remote)
|
|
470
299
|
return false;
|
|
471
300
|
const override = process.env.AGENTS_SYSTEM_REPO?.trim();
|
|
472
301
|
if (override) {
|
|
473
|
-
// The override is a source spec (`gh:owner/repo`) or a full clone URL. Match
|
|
474
|
-
// the GitHub-slug form the setup path clones, and the raw spec itself, so a
|
|
475
|
-
// non-GitHub override URL still verifies.
|
|
476
302
|
return (sameGitRemote(remote, `https://github.com/${systemRepoSlug(override)}`) ||
|
|
477
303
|
sameGitRemote(remote, override.replace(/^gh:/, '')));
|
|
478
304
|
}
|
|
479
305
|
return isSystemRepoRemote(remote);
|
|
480
306
|
}
|
|
481
|
-
/** True when two git remote URLs point at the same repo across transport forms. */
|
|
482
307
|
export function sameGitRemote(a, b) {
|
|
483
308
|
if (!a || !b)
|
|
484
309
|
return false;
|
|
485
310
|
return canonicalGitRemote(a) === canonicalGitRemote(b);
|
|
486
311
|
}
|
|
487
|
-
/**
|
|
488
|
-
* Commit (if dirty) and push a repo.
|
|
489
|
-
*
|
|
490
|
-
* Clean tree + local ahead of origin still pushes — "nothing to commit" is not
|
|
491
|
-
* "nothing to push". Reports "already up to date" only when `ahead === 0` and
|
|
492
|
-
* there is nothing to commit.
|
|
493
|
-
*
|
|
494
|
-
* `targetBranch` pushes the working tree to a differently-named remote branch
|
|
495
|
-
* (`<current>:<targetBranch>`) and is reported back as the result `branch`, so
|
|
496
|
-
* callers that print a branch-scoped URL reference where the commit actually
|
|
497
|
-
* landed — not the checked-out branch.
|
|
498
|
-
*/
|
|
499
312
|
export async function commitAndPush(repoPath, message, targetBranch) {
|
|
500
313
|
try {
|
|
501
314
|
const git = simpleGit(repoPath);
|
|
@@ -504,8 +317,6 @@ export async function commitAndPush(repoPath, message, targetBranch) {
|
|
|
504
317
|
assertValidBranchName(branch);
|
|
505
318
|
if (targetBranch)
|
|
506
319
|
assertValidBranchName(targetBranch);
|
|
507
|
-
// The branch the commit ends up on remotely — the checked-out branch unless
|
|
508
|
-
// an explicit target was requested.
|
|
509
320
|
const pushedBranch = targetBranch || branch;
|
|
510
321
|
let committed = false;
|
|
511
322
|
if (status.files.length > 0) {
|
|
@@ -515,9 +326,6 @@ export async function commitAndPush(repoPath, message, targetBranch) {
|
|
|
515
326
|
status = await git.status();
|
|
516
327
|
}
|
|
517
328
|
const ahead = status.ahead ?? 0;
|
|
518
|
-
// A same-branch push short-circuits when there is nothing new; a push to a
|
|
519
|
-
// different target branch must still run even from a clean, non-ahead tree,
|
|
520
|
-
// since the target may not carry these commits yet.
|
|
521
329
|
if (!committed && ahead === 0 && pushedBranch === branch) {
|
|
522
330
|
return {
|
|
523
331
|
success: true,
|
|
@@ -527,13 +335,11 @@ export async function commitAndPush(repoPath, message, targetBranch) {
|
|
|
527
335
|
pushed: false,
|
|
528
336
|
};
|
|
529
337
|
}
|
|
530
|
-
// Capture remote tip before push for a real ref range in the detail string.
|
|
531
338
|
let before = '';
|
|
532
339
|
try {
|
|
533
340
|
before = (await git.raw(['rev-parse', '--short=8', `origin/${pushedBranch}`])).trim();
|
|
534
341
|
}
|
|
535
342
|
catch {
|
|
536
|
-
/* origin/<branch> may not exist yet (first push) */
|
|
537
343
|
}
|
|
538
344
|
await pushOrigin(git, branch, targetBranch);
|
|
539
345
|
let after = '';
|
|
@@ -565,9 +371,6 @@ export async function commitAndPush(repoPath, message, targetBranch) {
|
|
|
565
371
|
return { success: false, error: err.message };
|
|
566
372
|
}
|
|
567
373
|
}
|
|
568
|
-
/**
|
|
569
|
-
* Check if repo has uncommitted changes.
|
|
570
|
-
*/
|
|
571
374
|
export async function hasUncommittedChanges(repoPath) {
|
|
572
375
|
try {
|
|
573
376
|
const git = simpleGit(repoPath);
|
|
@@ -575,66 +378,24 @@ export async function hasUncommittedChanges(repoPath) {
|
|
|
575
378
|
return status.files.length > 0;
|
|
576
379
|
}
|
|
577
380
|
catch {
|
|
578
|
-
/* not a git repo */
|
|
579
381
|
return false;
|
|
580
382
|
}
|
|
581
383
|
}
|
|
582
|
-
/**
|
|
583
|
-
* Check if a directory is a git repository (**synchronous, root-only**).
|
|
584
|
-
*
|
|
585
|
-
* Tests for a `.git` entry directly under `dir`, so it recognizes only a
|
|
586
|
-
* repository *root* — it returns false inside a subdirectory and for linked
|
|
587
|
-
* worktrees (whose `.git` is a file pointing elsewhere is caught, but a nested
|
|
588
|
-
* cwd is not). This is deliberate: the system-repo sync callers here always
|
|
589
|
-
* pass a known root. For the async, worktree-correct predicate used by teams,
|
|
590
|
-
* see `isGitRepo` in `lib/teams/worktree.ts` (which shells out to
|
|
591
|
-
* `git rev-parse --git-dir`). The two are intentionally **not** merged.
|
|
592
|
-
*/
|
|
593
384
|
export function isGitRepo(dir) {
|
|
594
385
|
return fs.existsSync(path.join(dir, '.git'));
|
|
595
386
|
}
|
|
596
|
-
/**
|
|
597
|
-
* Return the absolute path to the git working-tree root containing `dir`.
|
|
598
|
-
*
|
|
599
|
-
* Shells out to `git rev-parse --show-toplevel`, so it resolves correctly from
|
|
600
|
-
* any subdirectory and for linked worktrees (unlike the root-only, synchronous
|
|
601
|
-
* {@link isGitRepo} above). Throws if `dir` is not inside a git repository.
|
|
602
|
-
*
|
|
603
|
-
* Git prints POSIX separators even on Windows (`C:/Users/...`); we fold them to
|
|
604
|
-
* the native separator so the result is a real filesystem path that compares
|
|
605
|
-
* equal to one built with `path.*`. On POSIX this is a no-op.
|
|
606
|
-
*/
|
|
607
387
|
export async function getGitRoot(dir) {
|
|
608
388
|
const root = await simpleGit(dir).revparse(['--show-toplevel']);
|
|
609
389
|
return toNativePath(root.trim());
|
|
610
390
|
}
|
|
611
|
-
/**
|
|
612
|
-
* Return the absolute path to the **main** working-tree root for `dir`.
|
|
613
|
-
*
|
|
614
|
-
* Unlike {@link getGitRoot}, this stays correct when `dir` is inside a *linked*
|
|
615
|
-
* worktree: `--show-toplevel` there returns the worktree's own path, but the
|
|
616
|
-
* common git dir (`--git-common-dir`) always points at the primary repo's
|
|
617
|
-
* `.git`, whose parent is the main checkout. Throws if `dir` is not in a repo.
|
|
618
|
-
*
|
|
619
|
-
* Git prints POSIX separators even on Windows (`C:/Users/...`); we fold them to
|
|
620
|
-
* the native separator so the result is a real filesystem path that compares
|
|
621
|
-
* equal to one built with `path.*`. On POSIX this is a no-op.
|
|
622
|
-
*/
|
|
623
391
|
export async function getMainRepoRoot(dir) {
|
|
624
392
|
const common = await simpleGit(dir).raw(['rev-parse', '--path-format=absolute', '--git-common-dir']);
|
|
625
393
|
return toNativePath(path.dirname(common.trim()));
|
|
626
394
|
}
|
|
627
|
-
/**
|
|
628
|
-
* Initialize a git repo in an existing directory.
|
|
629
|
-
*/
|
|
630
395
|
export async function initRepo(dir) {
|
|
631
396
|
const git = simpleGit(dir);
|
|
632
397
|
await git.init();
|
|
633
398
|
}
|
|
634
|
-
/**
|
|
635
|
-
* Clone a repo into an existing directory (for initializing ~/.agents/).
|
|
636
|
-
* This clones into a temp dir, moves .git, then checks out tracked files.
|
|
637
|
-
*/
|
|
638
399
|
export async function cloneIntoExisting(source, targetDir) {
|
|
639
400
|
const parsed = parseSource(source);
|
|
640
401
|
if (parsed.type === 'local') {
|
|
@@ -644,23 +405,19 @@ export async function cloneIntoExisting(source, targetDir) {
|
|
|
644
405
|
const tempDir = path.join(targetDir, '.git-clone-temp');
|
|
645
406
|
try {
|
|
646
407
|
assertSafeGitTransport(parsed.url);
|
|
647
|
-
// Clone to temp directory
|
|
648
408
|
fs.mkdirSync(tempDir, { recursive: true });
|
|
649
409
|
await git.clone(parsed.url, tempDir);
|
|
650
410
|
const repoGit = simpleGit(tempDir);
|
|
651
411
|
if (parsed.ref) {
|
|
652
412
|
await repoGit.checkout(parsed.ref);
|
|
653
413
|
}
|
|
654
|
-
// Move .git directory to target
|
|
655
414
|
const gitDir = path.join(tempDir, '.git');
|
|
656
415
|
const targetGitDir = path.join(targetDir, '.git');
|
|
657
416
|
if (fs.existsSync(targetGitDir)) {
|
|
658
417
|
fs.rmSync(targetGitDir, { recursive: true });
|
|
659
418
|
}
|
|
660
419
|
fs.renameSync(gitDir, targetGitDir);
|
|
661
|
-
// Clean up temp
|
|
662
420
|
fs.rmSync(tempDir, { recursive: true });
|
|
663
|
-
// Checkout tracked files from git (restores repo files, respects .gitignore)
|
|
664
421
|
const targetGit = simpleGit(targetDir);
|
|
665
422
|
await targetGit.checkout('.');
|
|
666
423
|
installGithooksSymlinks(targetDir);
|
|
@@ -671,45 +428,24 @@ export async function cloneIntoExisting(source, targetDir) {
|
|
|
671
428
|
};
|
|
672
429
|
}
|
|
673
430
|
catch (err) {
|
|
674
|
-
// Clean up temp on error
|
|
675
431
|
if (fs.existsSync(tempDir)) {
|
|
676
432
|
fs.rmSync(tempDir, { recursive: true });
|
|
677
433
|
}
|
|
678
434
|
return { success: false, commit: '', error: err.message };
|
|
679
435
|
}
|
|
680
436
|
}
|
|
681
|
-
/**
|
|
682
|
-
* Git-back an EXISTING, populated directory from a remote — clone it in place
|
|
683
|
-
* without deleting the local files. Turns a plain `~/.agents` folder (which setup
|
|
684
|
-
* creates as a bare `mkdirSync` and never git-clones — see state.ts ensureAgentsDir)
|
|
685
|
-
* into a real clone of the user's config remote, so `agents repo pull/push` and
|
|
686
|
-
* `agents sync` work on a fresh or Windows machine that never got the manual clone.
|
|
687
|
-
*
|
|
688
|
-
* Unlike cloneIntoExisting (which blindly `checkout .`s over local files), this
|
|
689
|
-
* BACKS UP every tracked file whose local copy differs from the remote — into a
|
|
690
|
-
* sibling `<dir>.pre-adopt-backup/` OUTSIDE the repo so it can't be re-committed —
|
|
691
|
-
* before overwriting it. So a box with local edits to agents.yaml/hooks/rules
|
|
692
|
-
* doesn't silently lose them. Untracked runtime state (.cache/.history/.system,
|
|
693
|
-
* all gitignored) is never touched because `checkout .` only restores tracked paths.
|
|
694
|
-
*/
|
|
695
437
|
export async function adoptRepo(source, targetDir) {
|
|
696
438
|
const trimmed = source.trim();
|
|
697
439
|
if (fs.existsSync(path.join(targetDir, '.git'))) {
|
|
698
440
|
return { success: false, commit: '', backedUp: [], error: 'Already a git repo — nothing to adopt' };
|
|
699
441
|
}
|
|
700
|
-
// Preserve the user's transport. `parseSource` THROWS for `ssh://` and any
|
|
701
|
-
// non-github `git@host:` URL, and rewrites `git@github.com:x` → https (breaking
|
|
702
|
-
// SSH-key-only auth — the common config-repo setup — so a private clone hangs on
|
|
703
|
-
// a credential prompt). So for an SSH URL, clone it AS-IS and never call
|
|
704
|
-
// parseSource; for everything else, normalize + reject local via parseSource —
|
|
705
|
-
// inside the try, so a malformed URL returns a graceful error, not a stack trace.
|
|
706
442
|
const isSsh = trimmed.startsWith('git@') || trimmed.startsWith('ssh://');
|
|
707
443
|
const tempDir = path.join(targetDir, '.git-adopt-temp');
|
|
708
444
|
try {
|
|
709
445
|
let cloneUrl;
|
|
710
446
|
let ref;
|
|
711
447
|
if (isSsh) {
|
|
712
|
-
cloneUrl = trimmed;
|
|
448
|
+
cloneUrl = trimmed;
|
|
713
449
|
}
|
|
714
450
|
else {
|
|
715
451
|
const parsed = parseSource(source);
|
|
@@ -721,15 +457,8 @@ export async function adoptRepo(source, targetDir) {
|
|
|
721
457
|
}
|
|
722
458
|
assertSafeGitTransport(cloneUrl);
|
|
723
459
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
724
|
-
// Idempotency: clear a stale temp left by an interrupted prior run.
|
|
725
460
|
if (fs.existsSync(tempDir))
|
|
726
461
|
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
727
|
-
// Clone to temp, then move its .git in so the index == remote HEAD.
|
|
728
|
-
// Fail fast on a missing credential instead of hanging on a prompt: set
|
|
729
|
-
// GIT_TERMINAL_PROMPT=0 on the inherited env directly rather than via
|
|
730
|
-
// simple-git's `.env()`, which validates and rejects command-like vars the
|
|
731
|
-
// harness may set (GIT_EDITOR, PAGER, …) — the child inherits process.env,
|
|
732
|
-
// and non-interactive git is what we always want in the CLI anyway.
|
|
733
462
|
process.env.GIT_TERMINAL_PROMPT = '0';
|
|
734
463
|
await simpleGit().clone(cloneUrl, tempDir);
|
|
735
464
|
const repoGit = simpleGit(tempDir);
|
|
@@ -738,9 +467,6 @@ export async function adoptRepo(source, targetDir) {
|
|
|
738
467
|
fs.renameSync(path.join(tempDir, '.git'), path.join(targetDir, '.git'));
|
|
739
468
|
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
740
469
|
const targetGit = simpleGit(targetDir);
|
|
741
|
-
// Back up any TRACKED file whose local copy differs from the remote before the
|
|
742
|
-
// checkout clobbers it. `diff --name-only` (worktree vs the moved-in index) is
|
|
743
|
-
// exactly that set; a deleted-locally file has nothing to preserve.
|
|
744
470
|
const diff = await targetGit.diff(['--name-only']);
|
|
745
471
|
const clobbered = diff.split('\n').map((s) => s.trim()).filter(Boolean);
|
|
746
472
|
let backupDir;
|
|
@@ -757,8 +483,6 @@ export async function adoptRepo(source, targetDir) {
|
|
|
757
483
|
backedUp.push(rel);
|
|
758
484
|
}
|
|
759
485
|
}
|
|
760
|
-
// Materialize the remote's tracked files (respects .gitignore, so
|
|
761
|
-
// .cache/.history/.system stay put), overwriting the now-backed-up locals.
|
|
762
486
|
await targetGit.checkout('.');
|
|
763
487
|
installGithooksSymlinks(targetDir);
|
|
764
488
|
const log = await targetGit.log({ maxCount: 1 });
|
|
@@ -770,16 +494,9 @@ export async function adoptRepo(source, targetDir) {
|
|
|
770
494
|
return { success: false, commit: '', backedUp: [], error: err.message };
|
|
771
495
|
}
|
|
772
496
|
}
|
|
773
|
-
/**
|
|
774
|
-
* Device-local record of the user config repo's remote URL, kept OUTSIDE the git
|
|
775
|
-
* tree so it survives a lost `.git` (`.history/` is gitignored runtime state).
|
|
776
|
-
* This is what lets `agents repo sync user` adopt-in-place a box that was healthy
|
|
777
|
-
* once and later lost its checkout, without the operator re-typing the URL.
|
|
778
|
-
*/
|
|
779
497
|
function userRepoRemoteRecordPath(dir) {
|
|
780
498
|
return path.join(dir, '.history', 'user-repo-remote.json');
|
|
781
499
|
}
|
|
782
|
-
/** Read an origin remote URL from a git dir, or null when there is none. */
|
|
783
500
|
export function readOriginUrl(dir) {
|
|
784
501
|
if (!isGitRepo(dir))
|
|
785
502
|
return null;
|
|
@@ -793,11 +510,6 @@ export function readOriginUrl(dir) {
|
|
|
793
510
|
return null;
|
|
794
511
|
}
|
|
795
512
|
}
|
|
796
|
-
/**
|
|
797
|
-
* Persist the user repo's remote URL to device-local runtime state so a future
|
|
798
|
-
* adopt-in-place can recover it after a `.git` loss. Best-effort — a write
|
|
799
|
-
* failure never blocks a sync.
|
|
800
|
-
*/
|
|
801
513
|
export function recordUserRepoRemote(dir, url) {
|
|
802
514
|
try {
|
|
803
515
|
const file = userRepoRemoteRecordPath(dir);
|
|
@@ -805,20 +517,8 @@ export function recordUserRepoRemote(dir, url) {
|
|
|
805
517
|
fs.writeFileSync(file, JSON.stringify({ url }, null, 2) + '\n', { mode: 0o600 });
|
|
806
518
|
}
|
|
807
519
|
catch {
|
|
808
|
-
/* runtime cache write is best-effort */
|
|
809
520
|
}
|
|
810
521
|
}
|
|
811
|
-
/**
|
|
812
|
-
* Resolve the user config repo's remote URL WITHOUT hardcoding it, for the
|
|
813
|
-
* adopt-in-place self-heal. In priority order:
|
|
814
|
-
* 1. an existing `origin` remote on the dir (a partial repo that kept its
|
|
815
|
-
* `.git` but drifted) — the same source `agents repo sync` already reads;
|
|
816
|
-
* 2. the `AGENTS_USER_REPO_URL` env override (a fresh/never-cloned box);
|
|
817
|
-
* 3. the device-local record written by a prior healthy sync (a box that lost
|
|
818
|
-
* its `.git` but kept `.history/` runtime state).
|
|
819
|
-
* Returns null when none is known — the caller then guides the operator to
|
|
820
|
-
* `agents repo pull user <git-url>` instead of crashing.
|
|
821
|
-
*/
|
|
822
522
|
export function resolveUserRepoRemoteUrl(dir) {
|
|
823
523
|
const fromOrigin = readOriginUrl(dir);
|
|
824
524
|
if (fromOrigin)
|
|
@@ -833,23 +533,9 @@ export function resolveUserRepoRemoteUrl(dir) {
|
|
|
833
533
|
return url;
|
|
834
534
|
}
|
|
835
535
|
catch {
|
|
836
|
-
/* no record yet */
|
|
837
536
|
}
|
|
838
537
|
return null;
|
|
839
538
|
}
|
|
840
|
-
/**
|
|
841
|
-
* Decide whether a local top-level `agents.yaml` is a stale install stub that
|
|
842
|
-
* should be restored from the committed copy, vs. a legitimately customized file
|
|
843
|
-
* that must be preserved.
|
|
844
|
-
*
|
|
845
|
-
* The stub a partial install leaves behind (createDefaultMeta + a few config
|
|
846
|
-
* writes) is strictly SHORTER than the committed config AND missing whole
|
|
847
|
-
* top-level blocks the committed one carries (`config:` / `hooks:` — the fleet
|
|
848
|
-
* browser hub and hook registrations). Device-specific settings live in
|
|
849
|
-
* `devices/<host>/agents.yaml`, never here, so restoring the top-level file is
|
|
850
|
-
* safe. A file that already carries those blocks (or is longer) is treated as a
|
|
851
|
-
* real local edit and left alone — it surfaces as a modified path instead.
|
|
852
|
-
*/
|
|
853
539
|
export function isStaleAgentsYamlStub(local, committed) {
|
|
854
540
|
if (local.trim() === committed.trim())
|
|
855
541
|
return false;
|
|
@@ -858,30 +544,6 @@ export function isStaleAgentsYamlStub(local, committed) {
|
|
|
858
544
|
(/^hooks:/m.test(committed) && !/^hooks:/m.test(local));
|
|
859
545
|
return shorter && missingBlock;
|
|
860
546
|
}
|
|
861
|
-
/**
|
|
862
|
-
* Adopt an EXISTING, non-git (or origin-less) `~/.agents` directory in place —
|
|
863
|
-
* git-back it against its remote WITHOUT re-cloning and WITHOUT destroying the
|
|
864
|
-
* runtime state it carries (`.cache` / `.history` / `scratch` / `.system`, all
|
|
865
|
-
* gitignored). The self-heal for a partial install (PHNX-3301): the current code
|
|
866
|
-
* hard-fails with "Not a git repo", and the only manual fix is a destructive
|
|
867
|
-
* re-clone that wipes that runtime state.
|
|
868
|
-
*
|
|
869
|
-
* Plumbing-only, so it never trips the fleet git-guard (no `reset` / `checkout
|
|
870
|
-
* <branch>` / `stash` / `git config`):
|
|
871
|
-
* 1. `git init` + point HEAD at `main`.
|
|
872
|
-
* 2. `git remote add origin <url>`.
|
|
873
|
-
* 3. `git fetch origin main`.
|
|
874
|
-
* 4. `git update-ref refs/heads/main origin/main`; set upstream to origin/main.
|
|
875
|
-
* 5. `git read-tree origin/main` — index = origin/main, working tree untouched.
|
|
876
|
-
* 6. Materialize only the tracked files MISSING from the working tree
|
|
877
|
-
* (`checkout-index` on that set) — existing local files are never overwritten.
|
|
878
|
-
* 7. Reconcile the top-level `agents.yaml`: restore it from origin/main only
|
|
879
|
-
* when the local copy is a stale stub ({@link isStaleAgentsYamlStub}).
|
|
880
|
-
*
|
|
881
|
-
* Idempotent: a second run finds the remote/refs already present and simply
|
|
882
|
-
* re-materializes nothing. Any tracked path with real local edits is returned in
|
|
883
|
-
* `localEdits` (surfaced, never clobbered).
|
|
884
|
-
*/
|
|
885
547
|
export async function adoptRepoInPlace(dir, remoteUrl) {
|
|
886
548
|
const empty = {
|
|
887
549
|
success: false,
|
|
@@ -892,48 +554,28 @@ export async function adoptRepoInPlace(dir, remoteUrl) {
|
|
|
892
554
|
};
|
|
893
555
|
const trimmed = remoteUrl.trim();
|
|
894
556
|
try {
|
|
895
|
-
// The URL is always a resolved git remote (origin / env / record), never a
|
|
896
|
-
// `gh:` shorthand — so skip parseSource (which THROWS on ssh:// and rewrites
|
|
897
|
-
// git@github -> https, breaking SSH-key-only auth). assertSafeGitTransport
|
|
898
|
-
// still blocks the dangerous transports (ext::, file://, option injection)
|
|
899
|
-
// while permitting https / ssh / scp-style / a local bare repo.
|
|
900
557
|
assertSafeGitTransport(trimmed);
|
|
901
558
|
if (!fs.existsSync(dir)) {
|
|
902
559
|
return { ...empty, error: `Target directory does not exist: ${dir}` };
|
|
903
560
|
}
|
|
904
|
-
// Non-interactive git — fail fast on a missing credential instead of hanging
|
|
905
|
-
// on a prompt (same rationale as adoptRepo).
|
|
906
561
|
process.env.GIT_TERMINAL_PROMPT = '0';
|
|
907
562
|
const git = simpleGit(dir);
|
|
908
|
-
// 1. init + HEAD -> main (idempotent: init on an existing repo is a no-op).
|
|
909
|
-
// Set HEAD via symbolic-ref rather than `init -b main` so it works on git
|
|
910
|
-
// < 2.28, and lands on `main` even if the repo already initialized as
|
|
911
|
-
// `master`.
|
|
912
563
|
if (!isGitRepo(dir))
|
|
913
564
|
await git.init();
|
|
914
565
|
await git.raw(['symbolic-ref', 'HEAD', 'refs/heads/main']);
|
|
915
|
-
// 2. origin — add only when absent, so a re-run keeps the existing remote.
|
|
916
566
|
const remotes = await git.getRemotes(true);
|
|
917
567
|
if (!remotes.some((r) => r.name === 'origin')) {
|
|
918
568
|
await git.raw(['remote', 'add', 'origin', trimmed]);
|
|
919
569
|
}
|
|
920
|
-
// 3-4. fetch, plant the local main on origin/main, set upstream.
|
|
921
570
|
await git.raw(['fetch', 'origin', 'main']);
|
|
922
571
|
await git.raw(['update-ref', 'refs/heads/main', 'origin/main']);
|
|
923
572
|
await git.raw(['branch', '--set-upstream-to=origin/main', 'main']);
|
|
924
|
-
// 5. index = origin/main, working tree untouched.
|
|
925
573
|
await git.raw(['read-tree', 'origin/main']);
|
|
926
|
-
// 6. Materialize only the tracked files MISSING on disk. Passing the explicit
|
|
927
|
-
// missing set (never `checkout-index -a`) guarantees no existing local
|
|
928
|
-
// file — a stub agents.yaml, a modified rule — is overwritten. Chunked to
|
|
929
|
-
// stay under the argv limit on a cold box where most files are missing.
|
|
930
574
|
const tracked = (await git.raw(['ls-files', '-z'])).split('\0').filter(Boolean);
|
|
931
575
|
const missing = tracked.filter((rel) => !fs.existsSync(path.join(dir, rel)));
|
|
932
576
|
for (let i = 0; i < missing.length; i += 500) {
|
|
933
577
|
await git.raw(['checkout-index', '-f', '--', ...missing.slice(i, i + 500)]);
|
|
934
578
|
}
|
|
935
|
-
// 7. Reconcile a stale-stub top-level agents.yaml from origin/main. `restore`
|
|
936
|
-
// is plumbing the git-guard allows; it rewrites only this one path.
|
|
937
579
|
let reconciledAgentsYaml = false;
|
|
938
580
|
let agentsYamlBackup;
|
|
939
581
|
if (tracked.includes('agents.yaml')) {
|
|
@@ -941,10 +583,6 @@ export async function adoptRepoInPlace(dir, remoteUrl) {
|
|
|
941
583
|
const local = fs.existsSync(abs) ? fs.readFileSync(abs, 'utf-8') : '';
|
|
942
584
|
const committed = await git.raw(['show', 'origin/main:agents.yaml']);
|
|
943
585
|
if (isStaleAgentsYamlStub(local, committed)) {
|
|
944
|
-
// The stub heuristic can't perfectly distinguish a partial-install stub
|
|
945
|
-
// from a user who deliberately removed a whole block, so save the local
|
|
946
|
-
// copy to gitignored runtime state BEFORE restoring — a false positive is
|
|
947
|
-
// then recoverable and surfaced, never silent data loss.
|
|
948
586
|
if (local) {
|
|
949
587
|
agentsYamlBackup = path.join(dir, '.history', 'agents.yaml.pre-adopt.bak');
|
|
950
588
|
fs.mkdirSync(path.dirname(agentsYamlBackup), { recursive: true });
|
|
@@ -954,8 +592,6 @@ export async function adoptRepoInPlace(dir, remoteUrl) {
|
|
|
954
592
|
reconciledAgentsYaml = true;
|
|
955
593
|
}
|
|
956
594
|
}
|
|
957
|
-
// Surface — never silently keep — any tracked path whose local copy still
|
|
958
|
-
// differs from origin/main after the reconcile (real un-gitignored edits).
|
|
959
595
|
const dirty = (await git.raw(['status', '--porcelain', '--untracked-files=no']))
|
|
960
596
|
.split('\n')
|
|
961
597
|
.map((l) => l.slice(3).trim())
|
|
@@ -976,14 +612,6 @@ export async function adoptRepoInPlace(dir, remoteUrl) {
|
|
|
976
612
|
return { ...empty, error: err.message };
|
|
977
613
|
}
|
|
978
614
|
}
|
|
979
|
-
/**
|
|
980
|
-
* Self-heal entry point for the USER config repo: when `dir` is not a git repo
|
|
981
|
-
* (or is a repo with no `origin`), resolve its remote URL and adopt it in place;
|
|
982
|
-
* otherwise return null (nothing to adopt — the normal sync path runs). Returns a
|
|
983
|
-
* failed result carrying `needsUrl` when the URL cannot be resolved, so the
|
|
984
|
-
* caller can print the `agents repo pull user <git-url>` remediation instead of
|
|
985
|
-
* the old "Not a git repo" crash.
|
|
986
|
-
*/
|
|
987
615
|
export async function adoptUserRepoIfNeeded(dir, opts = {}) {
|
|
988
616
|
const hasOrigin = isGitRepo(dir) && readOriginUrl(dir) !== null;
|
|
989
617
|
if (hasOrigin)
|
|
@@ -1002,12 +630,6 @@ export async function adoptUserRepoIfNeeded(dir, opts = {}) {
|
|
|
1002
630
|
}
|
|
1003
631
|
return adoptRepoInPlace(dir, url);
|
|
1004
632
|
}
|
|
1005
|
-
/**
|
|
1006
|
-
* Check if the repo's origin points to the system repo — `phnx-labs/.agents-system`
|
|
1007
|
-
* or its GitHub rename target `phnx-labs/.agents` (PHNX-3394), across any
|
|
1008
|
-
* transport form. Reads the dir's origin and delegates the match to the pure
|
|
1009
|
-
* {@link isSystemRepoRemote}.
|
|
1010
|
-
*/
|
|
1011
633
|
export async function isSystemRepoOrigin(dir) {
|
|
1012
634
|
try {
|
|
1013
635
|
const git = simpleGit(dir);
|
|
@@ -1016,14 +638,9 @@ export async function isSystemRepoOrigin(dir) {
|
|
|
1016
638
|
return isSystemRepoRemote(origin?.refs?.fetch);
|
|
1017
639
|
}
|
|
1018
640
|
catch {
|
|
1019
|
-
/* not a git repo or no remotes */
|
|
1020
641
|
return false;
|
|
1021
642
|
}
|
|
1022
643
|
}
|
|
1023
|
-
/**
|
|
1024
|
-
* Render an absolute path in ~-relative form with forward slashes, matching the
|
|
1025
|
-
* way the rest of the CLI prints home-anchored paths (e.g. `~/.agents/.system`).
|
|
1026
|
-
*/
|
|
1027
644
|
export function displayHomePath(dir) {
|
|
1028
645
|
const home = os.homedir();
|
|
1029
646
|
const rel = dir.startsWith(home) ? '~' + dir.slice(home.length) : dir;
|
|
@@ -1033,14 +650,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1033
650
|
const strict = options.mode === 'default-branch-fast-forward';
|
|
1034
651
|
try {
|
|
1035
652
|
const git = simpleGit(dir);
|
|
1036
|
-
// A rebase left in progress by an earlier run must be reported as itself.
|
|
1037
|
-
// Without this the dirty-tree guard below claims "Blocked by local changes",
|
|
1038
|
-
// which is both wrong and actively harmful advice mid-rebase on a detached
|
|
1039
|
-
// HEAD.
|
|
1040
|
-
// Ask git where the state dirs live rather than assuming `<dir>/.git/` is a
|
|
1041
|
-
// directory. In a worktree `.git` is a FILE containing `gitdir: <path>`, so
|
|
1042
|
-
// path.join(dir, '.git', 'rebase-merge') can never exist and the check would
|
|
1043
|
-
// silently never fire. `rev-parse --git-path` resolves both layouts.
|
|
1044
653
|
const gitPath = async (name) => {
|
|
1045
654
|
try {
|
|
1046
655
|
const raw = (await git.raw(['rev-parse', '--git-path', name])).trim();
|
|
@@ -1067,9 +676,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1067
676
|
};
|
|
1068
677
|
}
|
|
1069
678
|
const status = await git.status();
|
|
1070
|
-
// Strict mode (projects pull): refuse a dirty tree immediately — no fetch
|
|
1071
|
-
// needed to know the answer, and the caller must not risk touching staged
|
|
1072
|
-
// or modified files with an incoming fast-forward.
|
|
1073
679
|
const isDirty = !status.isClean();
|
|
1074
680
|
if (strict && isDirty) {
|
|
1075
681
|
return {
|
|
@@ -1078,12 +684,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1078
684
|
error: `Blocked: dirty working tree. Commit or discard local changes before pulling.\n\n cd ${displayHomePath(dir)} && git status`,
|
|
1079
685
|
};
|
|
1080
686
|
}
|
|
1081
|
-
// A dirty tree is not decided here: whether a fast-forward is safe depends
|
|
1082
|
-
// on what is actually incoming, and that needs a fetched upstream ref. The
|
|
1083
|
-
// gate therefore sits just before the integrate step below. The exception is
|
|
1084
|
-
// a repo with no remote at all — there is nothing to fast-forward from, so
|
|
1085
|
-
// the dirt is the whole answer and the resolution below would only fail
|
|
1086
|
-
// with a less useful message.
|
|
1087
687
|
if (!strict && isDirty && (await git.getRemotes()).length === 0) {
|
|
1088
688
|
return {
|
|
1089
689
|
success: false,
|
|
@@ -1092,11 +692,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1092
692
|
};
|
|
1093
693
|
}
|
|
1094
694
|
const branch = status.current || 'main';
|
|
1095
|
-
// Resolve the upstream ref to fast-forward against.
|
|
1096
|
-
// Strict mode: always fetch origin and resolve its default branch — then
|
|
1097
|
-
// verify the current branch IS the remote default (refuse otherwise).
|
|
1098
|
-
// Preserve-local mode: prefer the local branch's tracking config; only
|
|
1099
|
-
// fetch when no tracking is set.
|
|
1100
695
|
let tracking = status.tracking;
|
|
1101
696
|
if (strict || !tracking) {
|
|
1102
697
|
try {
|
|
@@ -1109,8 +704,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1109
704
|
tracking = `origin/${branch}`;
|
|
1110
705
|
}
|
|
1111
706
|
}
|
|
1112
|
-
// Strict: the checkout must be on the remote default branch — never pull a
|
|
1113
|
-
// feature branch across the fleet unattended.
|
|
1114
707
|
if (strict) {
|
|
1115
708
|
const sep = tracking.indexOf('/');
|
|
1116
709
|
const expectedBranch = sep > 0 ? tracking.slice(sep + 1) : tracking;
|
|
@@ -1122,21 +715,9 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1122
715
|
};
|
|
1123
716
|
}
|
|
1124
717
|
}
|
|
1125
|
-
// Split the remote-tracking ref (<remote>/<branch>) so callers/logs can name
|
|
1126
|
-
// the remote. Branch names may contain slashes, so split on the FIRST
|
|
1127
|
-
// separator only. The integrate step below uses `tracking` directly (not a
|
|
1128
|
-
// second `git pull <remote> <branch>`) so a multi-entry FETCH_HEAD cannot
|
|
1129
|
-
// turn a clean fast-forward into "Cannot rebase onto multiple branches".
|
|
1130
718
|
const sep = tracking.indexOf('/');
|
|
1131
719
|
const remoteBranch = sep > 0 ? tracking.slice(sep + 1) : branch;
|
|
1132
|
-
// Keep branch-name validation on the ref we would have passed to pull —
|
|
1133
|
-
// rejects traversal / flag-smuggling shapes before any integrate command.
|
|
1134
720
|
assertValidBranchName(remoteBranch);
|
|
1135
|
-
// Bare fetch: updates every remote, so the revparse below sees a fresh ref
|
|
1136
|
-
// whichever one the branch tracks. Deliberately argument-less — simple-git's
|
|
1137
|
-
// fetchTask only forwards a remote when BOTH remote and branch are passed,
|
|
1138
|
-
// so `fetch(remoteName)` would silently drop the argument and do exactly
|
|
1139
|
-
// this anyway. Saying so beats an inert argument that reads as targeted.
|
|
1140
721
|
await git.fetch();
|
|
1141
722
|
const localRef = await git.revparse(['HEAD']);
|
|
1142
723
|
const remoteRef = await git.revparse([tracking]).catch(() => null);
|
|
@@ -1151,17 +732,8 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1151
732
|
branch,
|
|
1152
733
|
};
|
|
1153
734
|
}
|
|
1154
|
-
// Behind-only when tracking has commits we lack AND we have none of our own
|
|
1155
|
-
// on top. Use rev-list counts — simple-git does not reject on the exit-1
|
|
1156
|
-
// that `merge-base --is-ancestor` returns for a non-ancestor, so a try/catch
|
|
1157
|
-
// around that call would always report "can ff" (RUSH-2282).
|
|
1158
735
|
const aheadCount = parseInt((await git.raw(['rev-list', '--count', `${tracking}..HEAD`])).trim(), 10);
|
|
1159
736
|
const behindCount = parseInt((await git.raw(['rev-list', '--count', `HEAD..${tracking}`])).trim(), 10);
|
|
1160
|
-
// Both counts are the ONLY inputs to the fast-forward decision, so a count
|
|
1161
|
-
// we cannot read is a refusal, not a reason to guess. Fail here rather than
|
|
1162
|
-
// downstream: an unreadable count used to fall through to the rebase arm in
|
|
1163
|
-
// preserve-local mode, and to a "HEAD diverged" message in strict mode that
|
|
1164
|
-
// named the wrong cause.
|
|
1165
737
|
if (!Number.isFinite(aheadCount) || !Number.isFinite(behindCount)) {
|
|
1166
738
|
return {
|
|
1167
739
|
success: false,
|
|
@@ -1170,8 +742,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1170
742
|
};
|
|
1171
743
|
}
|
|
1172
744
|
const canFastForward = aheadCount === 0 && behindCount > 0;
|
|
1173
|
-
// Strict: block if HEAD has local commits not on the remote — fast-forward
|
|
1174
|
-
// requires the local tip to be an ancestor of the remote tip.
|
|
1175
745
|
if (strict && aheadCount > 0) {
|
|
1176
746
|
return {
|
|
1177
747
|
success: false,
|
|
@@ -1179,9 +749,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1179
749
|
error: `Blocked: HEAD is ${aheadCount} commit${aheadCount === 1 ? '' : 's'} ahead of ${tracking}. Push or discard local commits before pulling.`,
|
|
1180
750
|
};
|
|
1181
751
|
}
|
|
1182
|
-
// Dirty tree (preserve-local only): same rule `syncRepoGit` applies —
|
|
1183
|
-
// a fast-forward that touches nothing the author is holding may proceed; a
|
|
1184
|
-
// rebase or a colliding path may not. Strict mode already refused above.
|
|
1185
752
|
if (!strict && isDirty) {
|
|
1186
753
|
const refusal = await dirtyTreeRefusal(git, status, tracking);
|
|
1187
754
|
if (refusal) {
|
|
@@ -1194,31 +761,13 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1194
761
|
}
|
|
1195
762
|
try {
|
|
1196
763
|
if (canFastForward) {
|
|
1197
|
-
// Integrate the already-fetched tracking ref. No network, no FETCH_HEAD.
|
|
1198
764
|
await git.raw(['merge', '--ff-only', tracking]);
|
|
1199
765
|
}
|
|
1200
766
|
else {
|
|
1201
|
-
// Diverged (or local-only commits). Rebase onto the tracking tip —
|
|
1202
|
-
// same outcome as `git pull --rebase <remote> <branch>` without
|
|
1203
|
-
// re-fetching or consulting FETCH_HEAD.
|
|
1204
|
-
//
|
|
1205
|
-
// PRESERVE-LOCAL ONLY — strict mode can never reach this arm, so the
|
|
1206
|
-
// fleet pull never rewrites history. Strict has already returned for
|
|
1207
|
-
// every case that leaves `canFastForward` false: an identical local and
|
|
1208
|
-
// remote ref, `aheadCount > 0` (which is also what "diverged" means),
|
|
1209
|
-
// and a count that would not parse. That leaves `aheadCount === 0` with
|
|
1210
|
-
// a differing ref, i.e. `behindCount > 0` — a fast-forward. Keep those
|
|
1211
|
-
// three returns above intact if you change this.
|
|
1212
767
|
await git.raw(['rebase', tracking]);
|
|
1213
768
|
}
|
|
1214
769
|
}
|
|
1215
770
|
catch (err) {
|
|
1216
|
-
// Abort so the tree is restored, matching the atomicity --ff-only gave us.
|
|
1217
|
-
// Without this a conflict leaves the repo detached, mid-rebase, with
|
|
1218
|
-
// conflict markers written into live config (this repo is ~/.agents —
|
|
1219
|
-
// agents.yaml and AGENTS.md are in it), and every later pull misreports
|
|
1220
|
-
// the cause. `agents sync` reaches this path unattended across the fleet,
|
|
1221
|
-
// so a wedged checkout would be worse than the bug this fixes.
|
|
1222
771
|
await git.raw(['rebase', '--abort']).catch(() => { });
|
|
1223
772
|
const verb = canFastForward ? 'Fast-forward' : 'Rebase';
|
|
1224
773
|
return {
|
|
@@ -1227,8 +776,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1227
776
|
error: `${verb} onto ${tracking} failed — the pull was rolled back, nothing changed.\n\nResolve the divergence, then pull again:\n\n cd ${displayHomePath(dir)} && git log --oneline HEAD...${tracking}\n\n${err.message}`,
|
|
1228
777
|
};
|
|
1229
778
|
}
|
|
1230
|
-
// Strict mode never installs git hook symlinks — the command is a read-model
|
|
1231
|
-
// operation (update pointers only; never reconfigure the checkout).
|
|
1232
779
|
if (!strict)
|
|
1233
780
|
installGithooksSymlinks(dir);
|
|
1234
781
|
const log = await git.log({ maxCount: 1 });
|
|
@@ -1242,17 +789,6 @@ export async function pullRepo(dir, options = {}) {
|
|
|
1242
789
|
return { success: false, commit: '', error: err.message };
|
|
1243
790
|
}
|
|
1244
791
|
}
|
|
1245
|
-
/**
|
|
1246
|
-
* Every repo-relative path a status reports as locally touched, in one set.
|
|
1247
|
-
*
|
|
1248
|
-
* Reads `status.files`, which `simple-git` documents as "all files" and which is
|
|
1249
|
-
* the same source `isClean()` is computed from — so this set and the decision to
|
|
1250
|
-
* treat the tree as dirty can never disagree. The per-category arrays
|
|
1251
|
-
* (`modified`, `staged`, `not_added`, …) are projections of that list; unioning
|
|
1252
|
-
* them by hand means a category nobody thought of contributes nothing. `from`
|
|
1253
|
-
* carries a rename's original path, and the incoming side may collide with
|
|
1254
|
-
* either end.
|
|
1255
|
-
*/
|
|
1256
792
|
function dirtyPathSet(status) {
|
|
1257
793
|
const out = new Set();
|
|
1258
794
|
for (const f of status.files || []) {
|
|
@@ -1263,27 +799,6 @@ function dirtyPathSet(status) {
|
|
|
1263
799
|
}
|
|
1264
800
|
return out;
|
|
1265
801
|
}
|
|
1266
|
-
/**
|
|
1267
|
-
* Why a dirty working tree must NOT fast-forward to `upstreamRef` — or `null`
|
|
1268
|
-
* when it safely can.
|
|
1269
|
-
*
|
|
1270
|
-
* The single home for that decision: `syncRepoGit` and `pullRepo` both integrate
|
|
1271
|
-
* upstream and both meet dirty trees, and two copies of this rule would drift
|
|
1272
|
-
* into two different answers for one question. Refusing outright is the thing
|
|
1273
|
-
* being replaced — it strands merged changes behind unrelated local files —
|
|
1274
|
-
* so the rule is narrow and stated once:
|
|
1275
|
-
*
|
|
1276
|
-
* - local commits ahead of upstream → refuse (they need a rebase, which
|
|
1277
|
-
* requires a clean tree);
|
|
1278
|
-
* - an incoming path that is also dirty → refuse, and name it;
|
|
1279
|
-
* - otherwise the fast-forward touches nothing the author is holding.
|
|
1280
|
-
*
|
|
1281
|
-
* `-z` on the diff because `git diff --name-only` C-quotes paths containing
|
|
1282
|
-
* unicode or control characters — `café.txt` comes back as `"caf\303\251.txt"`,
|
|
1283
|
-
* while `status.files` reports it raw. Without `-z` the two sides are in
|
|
1284
|
-
* different encodings and a collision on such a path silently misses. (A plain
|
|
1285
|
-
* space does NOT trigger quoting; `my file.txt` is emitted as-is either way.)
|
|
1286
|
-
*/
|
|
1287
802
|
async function dirtyTreeRefusal(git, status, upstreamRef) {
|
|
1288
803
|
const ahead = parseInt((await git.raw(['rev-list', '--count', `${upstreamRef}..HEAD`])).trim(), 10);
|
|
1289
804
|
if (Number.isNaN(ahead))
|
|
@@ -1297,44 +812,12 @@ async function dirtyTreeRefusal(git, status, upstreamRef) {
|
|
|
1297
812
|
.filter(Boolean);
|
|
1298
813
|
const collisions = incoming.filter((p) => dirty.has(p));
|
|
1299
814
|
if (collisions.length > 0) {
|
|
1300
|
-
// Central agents.yaml is AUTHORITATIVE (account labels/rows), not regenerable,
|
|
1301
|
-
// and a dirty copy always equals serializeCentral(current meta) — so no
|
|
1302
|
-
// byte check can tell a stranded real edit from a stale one. Refuse rather
|
|
1303
|
-
// than discard: it is data-safe and self-heals, because commit-on-write
|
|
1304
|
-
// (lib/state.ts) and the daemon's publish tick both commit agents.yaml,
|
|
1305
|
-
// after which the very next pull succeeds normally. See PHNX-3968.
|
|
1306
815
|
const shown = collisions.slice(0, 5).join(', ');
|
|
1307
816
|
const more = collisions.length > 5 ? ` (+${collisions.length - 5} more)` : '';
|
|
1308
817
|
return `incoming changes touch uncommitted paths: ${shown}${more}`;
|
|
1309
818
|
}
|
|
1310
819
|
return null;
|
|
1311
820
|
}
|
|
1312
|
-
/**
|
|
1313
|
-
* Rebase a repo onto its remote, optionally pushing local commits back up.
|
|
1314
|
-
*
|
|
1315
|
-
* The one-repo counterpart to `pullRepo` used by `agents sync <repo>`:
|
|
1316
|
-
* 1. `git fetch origin`.
|
|
1317
|
-
* 2. Clean tree → `git pull --rebase origin <branch>`: rebase, not merge, so a
|
|
1318
|
-
* local commit lands cleanly on top of upstream with no merge bubble.
|
|
1319
|
-
* 3. Dirty tree → fast-forward instead, but only when that is provably safe:
|
|
1320
|
-
* no local commits ahead of upstream, and no incoming path collides with a
|
|
1321
|
-
* dirty one. Otherwise refuse, naming the paths that collided.
|
|
1322
|
-
* 4. When `push` is set, `git push origin <branch>` to send local commits up.
|
|
1323
|
-
*
|
|
1324
|
-
* The branch is read from the repo's current HEAD (falls back to `main`) rather
|
|
1325
|
-
* than hardcoded. System repos pass `push: false` — they are pull-only mirrors
|
|
1326
|
-
* of the npm-shipped upstream.
|
|
1327
|
-
*
|
|
1328
|
-
* Why step 3 exists: refusing on *any* dirt strands merged changes indefinitely.
|
|
1329
|
-
* A DotAgents repo accumulates unrelated local state — a modified `agents.yaml`,
|
|
1330
|
-
* a session's scratch file, a machine-local dotfile — and under the old rule one
|
|
1331
|
-
* such file froze that box's layer forever, silently. Measured 2026-08-10: a
|
|
1332
|
-
* merged fix could not reach three of three boxes, each blocked by files the
|
|
1333
|
-
* incoming commits never touched. A `--ff-only` merge is the safe primitive
|
|
1334
|
-
* here: it cannot rewrite local commits, and git itself aborts rather than
|
|
1335
|
-
* overwrite a modified file, so the path check is belt-and-braces, not the only
|
|
1336
|
-
* guard.
|
|
1337
|
-
*/
|
|
1338
821
|
export async function syncRepoGit(dir, opts) {
|
|
1339
822
|
try {
|
|
1340
823
|
if (!isGitRepo(dir)) {
|
|
@@ -1349,8 +832,6 @@ export async function syncRepoGit(dir, opts) {
|
|
|
1349
832
|
await git.pull('origin', branch, { '--rebase': 'true' });
|
|
1350
833
|
}
|
|
1351
834
|
else {
|
|
1352
|
-
// Dirty tree: a rebase would refuse outright, so fast-forward instead —
|
|
1353
|
-
// but only when nothing local can be lost. One shared rule, see above.
|
|
1354
835
|
const refusal = await dirtyTreeRefusal(git, status, `origin/${branch}`);
|
|
1355
836
|
if (refusal) {
|
|
1356
837
|
return {
|
|
@@ -1375,7 +856,6 @@ export async function syncRepoGit(dir, opts) {
|
|
|
1375
856
|
return { success: false, commit: '', pushed: false, error: err.message };
|
|
1376
857
|
}
|
|
1377
858
|
}
|
|
1378
|
-
/** Compute the sync status of a git repo, optionally scoped to a subdirectory. */
|
|
1379
859
|
export async function getGitSyncStatus(dir, subdir) {
|
|
1380
860
|
if (!isGitRepo(dir)) {
|
|
1381
861
|
return null;
|
|
@@ -1390,19 +870,15 @@ export async function getGitSyncStatus(dir, subdir) {
|
|
|
1390
870
|
staged: [],
|
|
1391
871
|
deleted: [],
|
|
1392
872
|
};
|
|
1393
|
-
// Filter to subdir if specified
|
|
1394
873
|
const filterPath = (file) => {
|
|
1395
874
|
if (!subdir)
|
|
1396
875
|
return true;
|
|
1397
876
|
return file.startsWith(subdir + '/') || file === subdir;
|
|
1398
877
|
};
|
|
1399
|
-
// Get all tracked files in the subdir
|
|
1400
878
|
const trackedOutput = await git.raw(['ls-files', subdir || '.']);
|
|
1401
879
|
const trackedFiles = new Set(trackedOutput.split('\n').filter(Boolean));
|
|
1402
|
-
// Get untracked files in the subdir
|
|
1403
880
|
const untrackedOutput = await git.raw(['ls-files', '--others', '--exclude-standard', subdir || '.']);
|
|
1404
881
|
const untrackedFiles = untrackedOutput.split('\n').filter(Boolean);
|
|
1405
|
-
// Working tree changes (not staged)
|
|
1406
882
|
const changedFiles = new Set();
|
|
1407
883
|
for (const file of status.modified.filter(filterPath)) {
|
|
1408
884
|
result.modified.push(file);
|
|
@@ -1412,7 +888,6 @@ export async function getGitSyncStatus(dir, subdir) {
|
|
|
1412
888
|
result.deleted.push(file);
|
|
1413
889
|
changedFiles.add(file);
|
|
1414
890
|
}
|
|
1415
|
-
// Staged changes (in index, ready to commit)
|
|
1416
891
|
for (const file of status.created.filter(filterPath)) {
|
|
1417
892
|
result.staged.push(file);
|
|
1418
893
|
changedFiles.add(file);
|
|
@@ -1423,11 +898,9 @@ export async function getGitSyncStatus(dir, subdir) {
|
|
|
1423
898
|
changedFiles.add(file);
|
|
1424
899
|
}
|
|
1425
900
|
}
|
|
1426
|
-
// Untracked files (new/local-only)
|
|
1427
901
|
for (const file of untrackedFiles.filter(filterPath)) {
|
|
1428
902
|
result.new.push(file);
|
|
1429
903
|
}
|
|
1430
|
-
// Synced = tracked and not changed
|
|
1431
904
|
for (const file of trackedFiles) {
|
|
1432
905
|
if (filterPath(file) && !changedFiles.has(file)) {
|
|
1433
906
|
result.synced.push(file);
|
|
@@ -1436,13 +909,9 @@ export async function getGitSyncStatus(dir, subdir) {
|
|
|
1436
909
|
return result;
|
|
1437
910
|
}
|
|
1438
911
|
catch {
|
|
1439
|
-
/* git status failed */
|
|
1440
912
|
return null;
|
|
1441
913
|
}
|
|
1442
914
|
}
|
|
1443
|
-
/**
|
|
1444
|
-
* Get list of files tracked by git in a directory.
|
|
1445
|
-
*/
|
|
1446
915
|
export async function getTrackedFiles(dir, subdir) {
|
|
1447
916
|
if (!isGitRepo(dir)) {
|
|
1448
917
|
return [];
|
|
@@ -1453,47 +922,34 @@ export async function getTrackedFiles(dir, subdir) {
|
|
|
1453
922
|
return result.split('\n').filter(Boolean);
|
|
1454
923
|
}
|
|
1455
924
|
catch {
|
|
1456
|
-
/* git ls-files failed */
|
|
1457
925
|
return [];
|
|
1458
926
|
}
|
|
1459
927
|
}
|
|
1460
|
-
/**
|
|
1461
|
-
* Try to auto-pull a git repo if it's clean and has a remote.
|
|
1462
|
-
* Uses --ff-only for safety (fails if diverged instead of creating merge commits).
|
|
1463
|
-
* Returns silently on success, returns error message on failure.
|
|
1464
|
-
*/
|
|
1465
928
|
async function tryAutoPull(dir) {
|
|
1466
|
-
// Must be a git repo
|
|
1467
929
|
if (!isGitRepo(dir)) {
|
|
1468
930
|
return { pulled: false };
|
|
1469
931
|
}
|
|
1470
932
|
try {
|
|
1471
933
|
const git = simpleGit(dir);
|
|
1472
|
-
// Must have origin remote
|
|
1473
934
|
const remotes = await git.getRemotes(true);
|
|
1474
935
|
const origin = remotes.find(r => r.name === 'origin');
|
|
1475
936
|
if (!origin?.refs?.fetch) {
|
|
1476
937
|
return { pulled: false };
|
|
1477
938
|
}
|
|
1478
|
-
// Must be clean (no uncommitted changes)
|
|
1479
939
|
const status = await git.status();
|
|
1480
940
|
if (!status.isClean()) {
|
|
1481
941
|
return { pulled: false, error: 'Has local changes' };
|
|
1482
942
|
}
|
|
1483
|
-
// Fetch and try fast-forward pull
|
|
1484
943
|
await git.fetch('origin');
|
|
1485
|
-
// Check if we're behind
|
|
1486
944
|
const localRef = await git.revparse(['HEAD']);
|
|
1487
945
|
const trackingBranch = status.tracking;
|
|
1488
946
|
if (!trackingBranch) {
|
|
1489
947
|
return { pulled: false };
|
|
1490
948
|
}
|
|
1491
|
-
const remoteRef = await git.revparse([trackingBranch]).catch(() => null
|
|
949
|
+
const remoteRef = await git.revparse([trackingBranch]).catch(() => null);
|
|
1492
950
|
if (!remoteRef || localRef === remoteRef) {
|
|
1493
|
-
// Already up to date
|
|
1494
951
|
return { pulled: false };
|
|
1495
952
|
}
|
|
1496
|
-
// Try fast-forward only pull
|
|
1497
953
|
await git.pull(['--ff-only']);
|
|
1498
954
|
return { pulled: true };
|
|
1499
955
|
}
|
|
@@ -1501,17 +957,6 @@ async function tryAutoPull(dir) {
|
|
|
1501
957
|
return { pulled: false, error: err.message };
|
|
1502
958
|
}
|
|
1503
959
|
}
|
|
1504
|
-
/**
|
|
1505
|
-
* Auto-pull the system repo ONLY after verifying its origin is the expected
|
|
1506
|
-
* system remote (PHNX-2957). The system repo ships hooks that run as shell on
|
|
1507
|
-
* tool events, so fast-forwarding it from an unexpected/repointed origin is
|
|
1508
|
-
* remote code execution. An origin that fails {@link isExpectedSystemRepoRemote}
|
|
1509
|
-
* is REFUSED loud (`refused: true`), never pulled — the canonical system repo
|
|
1510
|
-
* (or an operator's `AGENTS_SYSTEM_REPO`) still fast-forwards exactly as before.
|
|
1511
|
-
*
|
|
1512
|
-
* A system dir with no origin at all is a plain no-op (`pulled: false`), not a
|
|
1513
|
-
* refusal — there is nothing to pull from and nothing to distrust.
|
|
1514
|
-
*/
|
|
1515
960
|
export async function tryAutoPullSystemRepo(dir) {
|
|
1516
961
|
if (!isGitRepo(dir))
|
|
1517
962
|
return { pulled: false };
|
|
@@ -1532,16 +977,6 @@ export async function tryAutoPullSystemRepo(dir) {
|
|
|
1532
977
|
const res = await tryAutoPull(dir);
|
|
1533
978
|
return { ...res, actualRemote: remote };
|
|
1534
979
|
}
|
|
1535
|
-
/**
|
|
1536
|
-
* How many commits `dir`'s checked-out branch is behind its upstream, read from
|
|
1537
|
-
* the LAST-FETCHED remote-tracking ref — no network call. Returns null when the
|
|
1538
|
-
* dir is not a git repo, has no upstream configured, or git errors.
|
|
1539
|
-
*
|
|
1540
|
-
* Used by `agents doctor` to flag a source layer (`~/.agents`, `~/.agents/.system`)
|
|
1541
|
-
* that is reconciled against stale truth. Staleness relative to origin is a
|
|
1542
|
-
* background auto-pull concern; this surfaces the same fact synchronously in the
|
|
1543
|
-
* per-version verdict.
|
|
1544
|
-
*/
|
|
1545
980
|
export function commitsBehindUpstream(dir) {
|
|
1546
981
|
if (!isGitRepo(dir))
|
|
1547
982
|
return null;
|
|
@@ -1556,11 +991,9 @@ export function commitsBehindUpstream(dir) {
|
|
|
1556
991
|
return null;
|
|
1557
992
|
}
|
|
1558
993
|
};
|
|
1559
|
-
// Name of the upstream ref (e.g. `origin/main`) for the human-readable message.
|
|
1560
994
|
const branch = run(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}']);
|
|
1561
995
|
if (!branch)
|
|
1562
996
|
return null;
|
|
1563
|
-
// `--count HEAD..@{upstream}` = commits on upstream not yet in HEAD = behind.
|
|
1564
997
|
const raw = run(['rev-list', '--count', 'HEAD..@{upstream}']);
|
|
1565
998
|
if (raw === null)
|
|
1566
999
|
return null;
|