borgmcp 1.1.15 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +15 -0
- package/LICENSE +201 -33
- package/NOTICE +2 -0
- package/README.md +85 -36
- package/SECURITY.md +7 -0
- package/dist/agent-runtime.d.ts.map +1 -0
- package/dist/agent-runtime.js +63 -1
- package/dist/agent-runtime.js.map +1 -0
- package/dist/assimilate-cmd.d.ts +96 -17
- package/dist/assimilate-cmd.d.ts.map +1 -0
- package/dist/assimilate-cmd.js +1396 -48
- package/dist/assimilate-cmd.js.map +1 -0
- package/dist/assimilate-deps.d.ts.map +1 -0
- package/dist/assimilate-deps.js +384 -3
- package/dist/assimilate-deps.js.map +1 -0
- package/dist/assimilate-guard.d.ts +5 -7
- package/dist/assimilate-guard.d.ts.map +1 -0
- package/dist/assimilate-guard.js +60 -2
- package/dist/assimilate-guard.js.map +1 -0
- package/dist/assimilate-welcome.d.ts +1 -1
- package/dist/assimilate-welcome.d.ts.map +1 -0
- package/dist/assimilate-welcome.js +32 -2
- package/dist/assimilate-welcome.js.map +1 -0
- package/dist/auth-env.d.ts +7 -50
- package/dist/auth-env.d.ts.map +1 -0
- package/dist/auth-env.js +22 -1
- package/dist/auth-env.js.map +1 -0
- package/dist/backends/launch-all-pastelist.d.ts.map +1 -0
- package/dist/backends/launch-all-pastelist.js +11 -4
- package/dist/backends/launch-all-pastelist.js.map +1 -0
- package/dist/backends/launch-all-tmux.d.ts.map +1 -0
- package/dist/backends/launch-all-tmux.js +49 -1
- package/dist/backends/launch-all-tmux.js.map +1 -0
- package/dist/backends/launch-all-windows.d.ts.map +1 -0
- package/dist/backends/launch-all-windows.js +86 -12
- package/dist/backends/launch-all-windows.js.map +1 -0
- package/dist/bare-launch-menu.d.ts.map +1 -0
- package/dist/bare-launch-menu.js +83 -6
- package/dist/bare-launch-menu.js.map +1 -0
- package/dist/claude-launch-args.d.ts.map +1 -0
- package/dist/claude-launch-args.js +34 -1
- package/dist/claude-launch-args.js.map +1 -0
- package/dist/claude.d.ts.map +1 -0
- package/dist/claude.js +486 -14
- package/dist/claude.js.map +1 -0
- package/dist/cleanup-cmd.d.ts +5 -5
- package/dist/cleanup-cmd.d.ts.map +1 -0
- package/dist/cleanup-cmd.js +453 -14
- package/dist/cleanup-cmd.js.map +1 -0
- package/dist/clear-rewake-core.d.ts.map +1 -0
- package/dist/clear-rewake-core.js +23 -2
- package/dist/clear-rewake-core.js.map +1 -0
- package/dist/clear-rewake.d.ts.map +1 -0
- package/dist/clear-rewake.js +19 -1
- package/dist/clear-rewake.js.map +1 -0
- package/dist/cli-help.d.ts +5 -0
- package/dist/cli-help.d.ts.map +1 -0
- package/dist/cli-help.js +104 -56
- package/dist/cli-help.js.map +1 -0
- package/dist/cli-platform.d.ts.map +1 -0
- package/dist/cli-platform.js +106 -4
- package/dist/cli-platform.js.map +1 -0
- package/dist/cli-tool-approval.d.ts +84 -0
- package/dist/cli-tool-approval.d.ts.map +1 -0
- package/dist/cli-tool-approval.js +583 -0
- package/dist/cli-tool-approval.js.map +1 -0
- package/dist/codex-app-server.d.ts.map +1 -0
- package/dist/codex-app-server.js +228 -4
- package/dist/codex-app-server.js.map +1 -0
- package/dist/codex-app-wake.d.ts.map +1 -0
- package/dist/codex-app-wake.js +432 -2
- package/dist/codex-app-wake.js.map +1 -0
- package/dist/codex-launch.d.ts.map +1 -0
- package/dist/codex-launch.js +102 -2
- package/dist/codex-launch.js.map +1 -0
- package/dist/codex-remote.d.ts +6 -1
- package/dist/codex-remote.d.ts.map +1 -0
- package/dist/codex-remote.js +394 -1
- package/dist/codex-remote.js.map +1 -0
- package/dist/codex-wake-resolve.d.ts.map +1 -0
- package/dist/codex-wake-resolve.js +127 -1
- package/dist/codex-wake-resolve.js.map +1 -0
- package/dist/config-utils.d.ts +2 -2
- package/dist/config-utils.d.ts.map +1 -0
- package/dist/config-utils.js +766 -3
- package/dist/config-utils.js.map +1 -0
- package/dist/config.d.ts +98 -61
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +426 -1
- package/dist/config.js.map +1 -0
- package/dist/console-prefix.d.ts.map +1 -0
- package/dist/console-prefix.js +96 -1
- package/dist/console-prefix.js.map +1 -0
- package/dist/cube-name.d.ts.map +1 -0
- package/dist/cube-name.js +67 -1
- package/dist/cube-name.js.map +1 -0
- package/dist/cubes.d.ts +126 -18
- package/dist/cubes.d.ts.map +1 -0
- package/dist/cubes.js +412 -4
- package/dist/cubes.js.map +1 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +71 -1
- package/dist/debug.js.map +1 -0
- package/dist/direct-log.d.ts.map +1 -0
- package/dist/direct-log.js +11 -1
- package/dist/direct-log.js.map +1 -0
- package/dist/docs-sections.d.ts +11 -10
- package/dist/docs-sections.d.ts.map +1 -0
- package/dist/docs-sections.js +113 -3
- package/dist/docs-sections.js.map +1 -0
- package/dist/drone-lifecycle.d.ts +5 -21
- package/dist/drone-lifecycle.d.ts.map +1 -0
- package/dist/drone-lifecycle.js +57 -8
- package/dist/drone-lifecycle.js.map +1 -0
- package/dist/drone-management.d.ts +29 -0
- package/dist/drone-management.d.ts.map +1 -0
- package/dist/drone-management.js +109 -0
- package/dist/drone-management.js.map +1 -0
- package/dist/ensure-mcp-config.d.ts.map +1 -0
- package/dist/ensure-mcp-config.js +36 -1
- package/dist/ensure-mcp-config.js.map +1 -0
- package/dist/evict-drone.d.ts +10 -2
- package/dist/evict-drone.d.ts.map +1 -0
- package/dist/evict-drone.js +60 -1
- package/dist/evict-drone.js.map +1 -0
- package/dist/gc-orphan-inboxes.d.ts.map +1 -0
- package/dist/gc-orphan-inboxes.js +177 -1
- package/dist/gc-orphan-inboxes.js.map +1 -0
- package/dist/inbox-monitor.d.ts +1 -1
- package/dist/inbox-monitor.d.ts.map +1 -0
- package/dist/inbox-monitor.js +856 -3
- package/dist/inbox-monitor.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1034 -37
- package/dist/index.js.map +1 -0
- package/dist/launch-all-cmd.d.ts.map +1 -0
- package/dist/launch-all-cmd.js +377 -37
- package/dist/launch-all-cmd.js.map +1 -0
- package/dist/launch-all-command.d.ts.map +1 -0
- package/dist/launch-all-command.js +24 -1
- package/dist/launch-all-command.js.map +1 -0
- package/dist/launch-all-deps.d.ts +3 -8
- package/dist/launch-all-deps.d.ts.map +1 -0
- package/dist/launch-all-deps.js +99 -1
- package/dist/launch-all-deps.js.map +1 -0
- package/dist/launch-all-discovery.d.ts +1 -0
- package/dist/launch-all-discovery.d.ts.map +1 -0
- package/dist/launch-all-discovery.js +90 -4
- package/dist/launch-all-discovery.js.map +1 -0
- package/dist/launch-all-locks.d.ts.map +1 -0
- package/dist/launch-all-locks.js +54 -1
- package/dist/launch-all-locks.js.map +1 -0
- package/dist/launch-gate.d.ts +2 -2
- package/dist/launch-gate.d.ts.map +1 -0
- package/dist/launch-gate.js +73 -1
- package/dist/launch-gate.js.map +1 -0
- package/dist/lifecycle-log-guard.d.ts.map +1 -0
- package/dist/lifecycle-log-guard.js +93 -2
- package/dist/lifecycle-log-guard.js.map +1 -0
- package/dist/list-roles-render.d.ts.map +1 -0
- package/dist/list-roles-render.js +40 -6
- package/dist/list-roles-render.js.map +1 -0
- package/dist/local-log-routing.d.ts +19 -0
- package/dist/local-log-routing.d.ts.map +1 -0
- package/dist/local-log-routing.js +67 -0
- package/dist/local-log-routing.js.map +1 -0
- package/dist/local-manage-tool-result.d.ts +8 -0
- package/dist/local-manage-tool-result.d.ts.map +1 -0
- package/dist/local-manage-tool-result.js +10 -0
- package/dist/local-manage-tool-result.js.map +1 -0
- package/dist/local-server-cursor.d.ts +34 -0
- package/dist/local-server-cursor.d.ts.map +1 -0
- package/dist/local-server-cursor.js +151 -0
- package/dist/local-server-cursor.js.map +1 -0
- package/dist/log-audit.d.ts.map +1 -0
- package/dist/log-audit.js +194 -3
- package/dist/log-audit.js.map +1 -0
- package/dist/log-stream.d.ts +31 -18
- package/dist/log-stream.d.ts.map +1 -0
- package/dist/log-stream.js +1214 -12
- package/dist/log-stream.js.map +1 -0
- package/dist/model-presets.d.ts.map +1 -0
- package/dist/model-presets.js +19 -1
- package/dist/model-presets.js.map +1 -0
- package/dist/name-validator.d.ts.map +1 -0
- package/dist/name-validator.js +22 -1
- package/dist/name-validator.js.map +1 -0
- package/dist/opencode-drone.d.ts.map +1 -0
- package/dist/opencode-drone.js +438 -4
- package/dist/opencode-drone.js.map +1 -0
- package/dist/opencode-plugin.d.ts +1 -1
- package/dist/opencode-plugin.d.ts.map +1 -0
- package/dist/opencode-plugin.js +29 -4
- package/dist/opencode-plugin.js.map +1 -0
- package/dist/parse-assimilate-args.d.ts +1 -1
- package/dist/parse-assimilate-args.d.ts.map +1 -0
- package/dist/parse-assimilate-args.js +125 -1
- package/dist/parse-assimilate-args.js.map +1 -0
- package/dist/parse-launch-all-args.d.ts.map +1 -0
- package/dist/parse-launch-all-args.js +70 -1
- package/dist/parse-launch-all-args.js.map +1 -0
- package/dist/postinstall-banner.d.ts.map +1 -0
- package/dist/postinstall-banner.js +27 -2
- package/dist/postinstall-banner.js.map +1 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +32 -5
- package/dist/postinstall.js.map +1 -0
- package/dist/readiness-probe.d.ts.map +1 -0
- package/dist/readiness-probe.js +9 -1
- package/dist/readiness-probe.js.map +1 -0
- package/dist/regen-format.d.ts.map +1 -0
- package/dist/regen-format.js +545 -13
- package/dist/regen-format.js.map +1 -0
- package/dist/regen.d.ts.map +1 -0
- package/dist/regen.js +141 -5
- package/dist/regen.js.map +1 -0
- package/dist/remote-client.d.ts +65 -175
- package/dist/remote-client.d.ts.map +1 -0
- package/dist/remote-client.js +942 -1
- package/dist/remote-client.js.map +1 -0
- package/dist/reset-local-seat-cmd.d.ts +50 -0
- package/dist/reset-local-seat-cmd.d.ts.map +1 -0
- package/dist/reset-local-seat-cmd.js +169 -0
- package/dist/reset-local-seat-cmd.js.map +1 -0
- package/dist/role-match.d.ts.map +1 -0
- package/dist/role-match.js +23 -1
- package/dist/role-match.js.map +1 -0
- package/dist/role-resolver.d.ts.map +1 -0
- package/dist/role-resolver.js +60 -1
- package/dist/role-resolver.js.map +1 -0
- package/dist/roster-render.d.ts.map +1 -0
- package/dist/roster-render.js +121 -3
- package/dist/roster-render.js.map +1 -0
- package/dist/seat-probe.d.ts +32 -13
- package/dist/seat-probe.d.ts.map +1 -0
- package/dist/seat-probe.js +78 -1
- package/dist/seat-probe.js.map +1 -0
- package/dist/seat-store.d.ts +76 -0
- package/dist/seat-store.d.ts.map +1 -0
- package/dist/seat-store.js +309 -0
- package/dist/seat-store.js.map +1 -0
- package/dist/seats.d.ts +303 -0
- package/dist/seats.d.ts.map +1 -0
- package/dist/seats.js +551 -0
- package/dist/seats.js.map +1 -0
- package/dist/self-path.d.ts +27 -0
- package/dist/self-path.d.ts.map +1 -0
- package/dist/self-path.js +43 -0
- package/dist/self-path.js.map +1 -0
- package/dist/server-endpoint.d.ts +9 -0
- package/dist/server-endpoint.d.ts.map +1 -0
- package/dist/server-endpoint.js +38 -0
- package/dist/server-endpoint.js.map +1 -0
- package/dist/server-errors.d.ts +50 -0
- package/dist/server-errors.d.ts.map +1 -0
- package/dist/server-errors.js +79 -0
- package/dist/server-errors.js.map +1 -0
- package/dist/server-handshake.d.ts +197 -0
- package/dist/server-handshake.d.ts.map +1 -0
- package/dist/server-handshake.js +505 -0
- package/dist/server-handshake.js.map +1 -0
- package/dist/server-response.d.ts +3 -0
- package/dist/server-response.d.ts.map +1 -0
- package/dist/server-response.js +67 -0
- package/dist/server-response.js.map +1 -0
- package/dist/server-trust.d.ts +14 -0
- package/dist/server-trust.d.ts.map +1 -0
- package/dist/server-trust.js +225 -0
- package/dist/server-trust.js.map +1 -0
- package/dist/setup-confirm.d.ts +3 -3
- package/dist/setup-confirm.d.ts.map +1 -0
- package/dist/setup-confirm.js +126 -2
- package/dist/setup-confirm.js.map +1 -0
- package/dist/setup.d.ts +5 -3
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +169 -46
- package/dist/setup.js.map +1 -0
- package/dist/shell-escape.d.ts.map +1 -0
- package/dist/shell-escape.js +22 -1
- package/dist/shell-escape.js.map +1 -0
- package/dist/spawn.d.ts +2 -2
- package/dist/spawn.d.ts.map +1 -0
- package/dist/spawn.js +29 -10
- package/dist/spawn.js.map +1 -0
- package/dist/startup-services.d.ts +0 -1
- package/dist/startup-services.d.ts.map +1 -0
- package/dist/startup-services.js +26 -1
- package/dist/startup-services.js.map +1 -0
- package/dist/stream-owner.d.ts +6 -2
- package/dist/stream-owner.d.ts.map +1 -0
- package/dist/stream-owner.js +547 -2
- package/dist/stream-owner.js.map +1 -0
- package/dist/stream-status.d.ts +1 -1
- package/dist/stream-status.d.ts.map +1 -0
- package/dist/stream-status.js +268 -3
- package/dist/stream-status.js.map +1 -0
- package/dist/sync-roles-render.d.ts.map +1 -0
- package/dist/sync-roles-render.js +118 -3
- package/dist/sync-roles-render.js.map +1 -0
- package/dist/sync.d.ts +1 -1
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +286 -22
- package/dist/sync.js.map +1 -0
- package/dist/terminal-title.d.ts.map +1 -0
- package/dist/terminal-title.js +68 -1
- package/dist/terminal-title.js.map +1 -0
- package/dist/token-store.d.ts +17 -111
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +81 -1
- package/dist/token-store.js.map +1 -0
- package/dist/tool-manifest.d.ts +4 -8
- package/dist/tool-manifest.d.ts.map +1 -0
- package/dist/tool-manifest.js +554 -1
- package/dist/tool-manifest.js.map +1 -0
- package/dist/tool-scope.d.ts +8 -12
- package/dist/tool-scope.d.ts.map +1 -0
- package/dist/tool-scope.js +97 -1
- package/dist/tool-scope.js.map +1 -0
- package/dist/types.d.ts +1 -5
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/unknown-subcommand.d.ts +1 -1
- package/dist/unknown-subcommand.d.ts.map +1 -0
- package/dist/unknown-subcommand.js +37 -1
- package/dist/unknown-subcommand.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +78 -2
- package/dist/version.js.map +1 -0
- package/dist/working-repo.d.ts.map +1 -0
- package/dist/working-repo.js +81 -1
- package/dist/working-repo.js.map +1 -0
- package/dist/worktree-lifecycle.d.ts.map +1 -0
- package/dist/worktree-lifecycle.js +205 -2
- package/dist/worktree-lifecycle.js.map +1 -0
- package/docs/EXTRACTION_PROVENANCE.md +40 -0
- package/docs/LOCAL_SERVER.md +103 -0
- package/docs/RELEASING.md +120 -0
- package/package.json +52 -34
- package/src/agent-runtime.ts +69 -0
- package/src/assimilate-cmd.ts +1864 -0
- package/src/assimilate-deps.ts +444 -0
- package/src/assimilate-guard.ts +84 -0
- package/src/assimilate-welcome.ts +39 -0
- package/src/auth-env.ts +21 -0
- package/src/backends/launch-all-pastelist.ts +18 -0
- package/src/backends/launch-all-tmux.ts +75 -0
- package/src/backends/launch-all-windows.ts +110 -0
- package/src/bare-launch-menu.ts +148 -0
- package/src/claude-launch-args.ts +35 -0
- package/src/claude.ts +561 -0
- package/src/cleanup-cmd.ts +581 -0
- package/src/clear-rewake-core.ts +34 -0
- package/src/clear-rewake.ts +18 -0
- package/src/cli-help.ts +116 -0
- package/src/cli-platform.ts +127 -0
- package/src/cli-tool-approval.ts +716 -0
- package/src/codex-app-server.ts +238 -0
- package/src/codex-app-wake.ts +512 -0
- package/src/codex-launch.ts +140 -0
- package/src/codex-remote.ts +500 -0
- package/src/codex-wake-resolve.ts +155 -0
- package/src/config-utils.ts +811 -0
- package/src/config.ts +595 -0
- package/src/console-prefix.ts +99 -0
- package/src/cube-name.ts +69 -0
- package/src/cubes.ts +583 -0
- package/src/debug.ts +73 -0
- package/src/direct-log.ts +9 -0
- package/src/docs-sections.ts +129 -0
- package/src/drone-lifecycle.ts +62 -0
- package/src/drone-management.ts +162 -0
- package/src/ensure-mcp-config.ts +54 -0
- package/src/evict-drone.ts +82 -0
- package/src/gc-orphan-inboxes.ts +229 -0
- package/src/inbox-monitor.ts +1005 -0
- package/src/index.ts +1201 -0
- package/src/launch-all-cmd.ts +450 -0
- package/src/launch-all-command.ts +30 -0
- package/src/launch-all-deps.ts +188 -0
- package/src/launch-all-discovery.ts +118 -0
- package/src/launch-all-locks.ts +74 -0
- package/src/launch-gate.ts +80 -0
- package/src/lifecycle-log-guard.ts +144 -0
- package/src/list-roles-render.ts +52 -0
- package/src/local-log-routing.ts +106 -0
- package/src/local-manage-tool-result.ts +10 -0
- package/src/local-server-cursor.ts +188 -0
- package/src/log-audit.ts +207 -0
- package/src/log-stream.ts +1505 -0
- package/src/model-presets.ts +22 -0
- package/src/name-validator.ts +23 -0
- package/src/opencode-drone.ts +528 -0
- package/src/opencode-plugin.ts +38 -0
- package/src/parse-assimilate-args.ts +125 -0
- package/src/parse-launch-all-args.ts +100 -0
- package/src/postinstall-banner.ts +37 -0
- package/src/postinstall.ts +36 -0
- package/src/readiness-probe.ts +12 -0
- package/src/regen-format.ts +651 -0
- package/src/regen.ts +150 -0
- package/src/remote-client.ts +1379 -0
- package/src/reset-local-seat-cmd.ts +227 -0
- package/src/role-match.ts +29 -0
- package/src/role-resolver.ts +93 -0
- package/src/roster-render.ts +196 -0
- package/src/seat-probe.ts +115 -0
- package/src/seat-store.ts +333 -0
- package/src/seats.ts +741 -0
- package/src/self-path.ts +51 -0
- package/src/server-endpoint.ts +38 -0
- package/src/server-errors.ts +93 -0
- package/src/server-handshake.ts +783 -0
- package/src/server-response.ts +76 -0
- package/src/server-trust.ts +245 -0
- package/src/setup-confirm.ts +171 -0
- package/src/setup.ts +186 -0
- package/src/shell-escape.ts +22 -0
- package/src/spawn.ts +31 -0
- package/src/startup-services.ts +36 -0
- package/src/stream-owner.ts +686 -0
- package/src/stream-status.ts +337 -0
- package/src/sync-roles-render.ts +163 -0
- package/src/sync.ts +363 -0
- package/src/terminal-title.ts +76 -0
- package/src/token-store.ts +102 -0
- package/src/tool-manifest.ts +610 -0
- package/src/tool-scope.ts +110 -0
- package/src/types.ts +5 -0
- package/src/unknown-subcommand.ts +35 -0
- package/src/version.ts +82 -0
- package/src/working-repo.ts +99 -0
- package/src/worktree-lifecycle.ts +254 -0
- package/dist/auth-recovery.d.ts +0 -33
- package/dist/auth-recovery.js +0 -1
- package/dist/auth.d.ts +0 -103
- package/dist/auth.js +0 -39
- package/dist/device-auth.d.ts +0 -75
- package/dist/device-auth.js +0 -1
- package/dist/drone-address.d.ts +0 -26
- package/dist/drone-address.js +0 -1
- package/dist/get-started.d.ts +0 -20
- package/dist/get-started.js +0 -2
- package/dist/health-beat.d.ts +0 -134
- package/dist/health-beat.js +0 -1
- package/dist/role-section.d.ts +0 -110
- package/dist/role-section.js +0 -8
- package/dist/setup-action.d.ts +0 -20
- package/dist/setup-action.js +0 -1
- package/dist/stale-version-check.d.ts +0 -40
- package/dist/stale-version-check.js +0 -1
- package/dist/subscription-retry.d.ts +0 -40
- package/dist/subscription-retry.js +0 -1
- package/dist/templates.d.ts +0 -107
- package/dist/templates.js +0 -359
- package/dist/token-crypto.d.ts +0 -50
- package/dist/token-crypto.js +0 -1
package/dist/stream-status.js
CHANGED
|
@@ -1,3 +1,268 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Renderer + inbox-Monitor liveness probe for `borg_stream-status`.
|
|
3
|
+
*
|
|
4
|
+
* Split out from `index.ts` so the 5-state precedence logic and the
|
|
5
|
+
* `pgrep`-based liveness check can be unit-tested without spinning up
|
|
6
|
+
* the MCP server. drone-4's 18:30:51 UX contract is the spec for the
|
|
7
|
+
* rendered output shape; this module is the implementation surface.
|
|
8
|
+
*
|
|
9
|
+
* Top-line states (drone-4 contract):
|
|
10
|
+
* 1. Stream not started.
|
|
11
|
+
* 2. Stream connected, awaiting first content event.
|
|
12
|
+
* 3. Stream connected, last content <X> ago.
|
|
13
|
+
* 4. Stream disconnected (reconnect attempt N).
|
|
14
|
+
* 5. Stream connected (no inbox-Monitor — wake path broken).
|
|
15
|
+
*
|
|
16
|
+
* Precedence when both `disconnected` and `no inbox-Monitor` apply:
|
|
17
|
+
* prefer (4) — wire-disconnect is the upstream cause and resolves
|
|
18
|
+
* automatically when the wire comes back up; State 5 only matters
|
|
19
|
+
* when the wire is healthy but the file-watch isn't.
|
|
20
|
+
*/
|
|
21
|
+
import { spawnSync } from 'node:child_process';
|
|
22
|
+
import { statSync } from 'node:fs';
|
|
23
|
+
import { heartbeatPathFor, legacyHeartbeatPathFor, HEARTBEAT_STALE_MS, } from './inbox-monitor.js';
|
|
24
|
+
import { shellEscape } from './shell-escape.js';
|
|
25
|
+
/**
|
|
26
|
+
* Best-effort check: is a process tailing this inbox file?
|
|
27
|
+
*
|
|
28
|
+
* Returns:
|
|
29
|
+
* - true: at least one process matches `tail.*<inboxPath>` in pgrep
|
|
30
|
+
* - false: pgrep ran cleanly and found no match
|
|
31
|
+
* - null: cannot determine (pgrep unavailable, spawn error, no inbox path)
|
|
32
|
+
*
|
|
33
|
+
* The null case is informative — it means we don't know, so the
|
|
34
|
+
* renderer must NOT fire State 5 (which would be misleading). State 5
|
|
35
|
+
* only fires when we positively know the wake path is broken.
|
|
36
|
+
*
|
|
37
|
+
* Why `pgrep` and not a more elegant check: Claude Code Monitors are
|
|
38
|
+
* tail-based subprocesses spawned by the harness, completely opaque to
|
|
39
|
+
* the MCP server. The MCP server has no IPC channel into the harness's
|
|
40
|
+
* task table. The cheapest reliable signal we can get from inside the
|
|
41
|
+
* MCP server is "is there a tail subprocess open against this path?"
|
|
42
|
+
* — which is what `pgrep -f` answers.
|
|
43
|
+
*
|
|
44
|
+
* macOS + Linux ship `pgrep`. Windows doesn't (borgmcp targets Mac /
|
|
45
|
+
* Linux per package.json `os` field; the null branch handles other
|
|
46
|
+
* platforms gracefully).
|
|
47
|
+
*/
|
|
48
|
+
export function checkInboxMonitorHealthy(inboxPath, monitorStateRoot) {
|
|
49
|
+
if (!inboxPath)
|
|
50
|
+
return null;
|
|
51
|
+
try {
|
|
52
|
+
// `-f` matches against the full command line so we catch the
|
|
53
|
+
// `tail -n 0 -F <inboxPath>` form. `-l` lists matches; we only
|
|
54
|
+
// need the exit code (0 = match, 1 = no match) and a sanity check
|
|
55
|
+
// on stdout (some pgrep variants exit 0 with empty stdout under
|
|
56
|
+
// permission errors — treat empty stdout as "no match" for safety).
|
|
57
|
+
const res = spawnSync('pgrep', ['-f', inboxPath], {
|
|
58
|
+
encoding: 'utf-8',
|
|
59
|
+
timeout: 2_000,
|
|
60
|
+
});
|
|
61
|
+
if (res.error)
|
|
62
|
+
return null;
|
|
63
|
+
if (res.status === 0 && res.stdout.trim().length > 0) {
|
|
64
|
+
// gh#822: a tail PROCESS is present — but presence ≠ health (a hung tail
|
|
65
|
+
// still matches pgrep). Upgrade presence→health via the holder heartbeat
|
|
66
|
+
// sidecar: if it exists and is STALE past the conservative threshold, the
|
|
67
|
+
// holder is wedged → wake path broken (false). If it's fresh → healthy.
|
|
68
|
+
// If it's ABSENT, fall back to presence (an old pre-#822 monitor, or a
|
|
69
|
+
// #822 monitor armed <1 tick ago that hasn't written its first heartbeat)
|
|
70
|
+
// → report healthy; never false-flag a monitor that simply lacks the
|
|
71
|
+
// sidecar (conservative — err toward NOT warning).
|
|
72
|
+
return !isHeartbeatStale(inboxPath, monitorStateRoot);
|
|
73
|
+
}
|
|
74
|
+
if (res.status === 1)
|
|
75
|
+
return false;
|
|
76
|
+
// pgrep exits 2 for syntax error, 3 for fatal — treat as unknown.
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* gh#822: are all present holder heartbeat sidecars stale past the threshold?
|
|
85
|
+
* A fresh legacy sidecar wins during migration; absent sidecars (old monitor /
|
|
86
|
+
* just-armed) still fall back to process presence. Only present-and-all-stale
|
|
87
|
+
* state is a wedged-holder signal.
|
|
88
|
+
*/
|
|
89
|
+
export function isHeartbeatStale(inboxPath, monitorStateRoot) {
|
|
90
|
+
const paths = [heartbeatPathFor(inboxPath, monitorStateRoot)];
|
|
91
|
+
if (monitorStateRoot)
|
|
92
|
+
paths.push(legacyHeartbeatPathFor(inboxPath));
|
|
93
|
+
let sawHeartbeat = false;
|
|
94
|
+
for (const path of new Set(paths)) {
|
|
95
|
+
try {
|
|
96
|
+
const mtimeMs = statSync(path).mtimeMs;
|
|
97
|
+
sawHeartbeat = true;
|
|
98
|
+
if (Date.now() - mtimeMs <= HEARTBEAT_STALE_MS)
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// absent / unreadable → keep evaluating the migration counterpart
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return sawHeartbeat;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Render the `borg_stream-status` markdown body per drone-4's 18:30:51
|
|
109
|
+
* contract. Pure function — no I/O, no clock reads. Caller assembles
|
|
110
|
+
* the inputs.
|
|
111
|
+
*/
|
|
112
|
+
export function renderStreamStatus(inputs) {
|
|
113
|
+
const { status, inboxMonitorHealthy, inboxPath, monitorStateRoot, droneLabel, cubeName, humanAgo } = inputs;
|
|
114
|
+
const isNotStarted = status.reconnectAttempts === 0 &&
|
|
115
|
+
status.lastWireActivityAt === null &&
|
|
116
|
+
!status.connected;
|
|
117
|
+
const ownedByOther = status.ownership?.state === 'owned-by-other-process';
|
|
118
|
+
const orphanedInitialization = status.ownership?.state === 'orphaned-initialization';
|
|
119
|
+
const ownershipInitializing = status.ownership?.state === 'initializing';
|
|
120
|
+
// Top-line verdict — 5 states + override per drone-4 contract.
|
|
121
|
+
// Precedence: disconnected > no-inbox-Monitor (wire-down upstream
|
|
122
|
+
// cause; State 5 only applies when wire is healthy).
|
|
123
|
+
let summary;
|
|
124
|
+
if (orphanedInitialization) {
|
|
125
|
+
summary = '**Stream blocked by an orphaned initialization lock.**';
|
|
126
|
+
}
|
|
127
|
+
else if (ownedByOther) {
|
|
128
|
+
summary = '**Stream owned by another Borg MCP process.**';
|
|
129
|
+
}
|
|
130
|
+
else if (isNotStarted) {
|
|
131
|
+
summary = '**Stream not started.**';
|
|
132
|
+
}
|
|
133
|
+
else if (!status.connected) {
|
|
134
|
+
summary = `**Stream disconnected (reconnect attempt ${status.reconnectAttempts}).**`;
|
|
135
|
+
}
|
|
136
|
+
else if (inboxMonitorHealthy === false) {
|
|
137
|
+
summary = '**Stream connected (no inbox-Monitor — wake path broken).**';
|
|
138
|
+
}
|
|
139
|
+
else if (status.lastContentEventAt === null) {
|
|
140
|
+
// State 2: wire works, no content yet. Collapses two underlying
|
|
141
|
+
// conditions per drone-4 contract — fresh connect pre-first-content
|
|
142
|
+
// and quiet cube post-reconnect. The body's heartbeat field
|
|
143
|
+
// distinguishes them (populated vs `_(none)_`).
|
|
144
|
+
summary = '**Stream connected, awaiting first content event.**';
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
summary = `**Stream connected, last content ${humanAgo(new Date(status.lastContentEventAt))}.**`;
|
|
148
|
+
}
|
|
149
|
+
const lines = [];
|
|
150
|
+
lines.push(summary);
|
|
151
|
+
lines.push('');
|
|
152
|
+
lines.push('# Log-stream status');
|
|
153
|
+
lines.push('');
|
|
154
|
+
if (orphanedInitialization) {
|
|
155
|
+
lines.push('- **state**: _(orphaned stream-owner initialization)_');
|
|
156
|
+
}
|
|
157
|
+
else if (ownershipInitializing) {
|
|
158
|
+
lines.push('- **state**: _(stream-owner initialization in progress)_');
|
|
159
|
+
}
|
|
160
|
+
else if (ownedByOther) {
|
|
161
|
+
lines.push('- **state**: _(stream owner is another local process)_');
|
|
162
|
+
}
|
|
163
|
+
else if (isNotStarted) {
|
|
164
|
+
lines.push('- **state**: _(stream not started)_');
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
lines.push(`- **connected**: ${status.connected}`);
|
|
168
|
+
}
|
|
169
|
+
// Body shape per drone-4 contract: three timestamp lines (content,
|
|
170
|
+
// heartbeat, wire) — looks redundant in the common case where they
|
|
171
|
+
// coincide, but the asymmetric "content quiet, heartbeats alive" case
|
|
172
|
+
// is exactly the diagnostic scenario this surface exists to support.
|
|
173
|
+
lines.push(`- **last content event**: ${status.lastContentEventAt
|
|
174
|
+
? `${status.lastContentEventAt} (${humanAgo(new Date(status.lastContentEventAt))})`
|
|
175
|
+
: '_(none yet)_'}`);
|
|
176
|
+
lines.push(`- **last heartbeat at**: ${status.lastHeartbeatAt
|
|
177
|
+
? `${status.lastHeartbeatAt} (${humanAgo(new Date(status.lastHeartbeatAt))})`
|
|
178
|
+
: '_(none)_'}`);
|
|
179
|
+
lines.push(`- **last wire activity**: ${status.lastWireActivityAt
|
|
180
|
+
? `${status.lastWireActivityAt} (${humanAgo(new Date(status.lastWireActivityAt))})`
|
|
181
|
+
: '_(none)_'}`);
|
|
182
|
+
lines.push(`- **last persisted event id**: ${status.lastPersistedEventId ?? '_(none)_'}`);
|
|
183
|
+
lines.push(`- **reconnect attempts**: ${status.reconnectAttempts}`);
|
|
184
|
+
lines.push(`- **run-loop restarts**: ${status.runLoopRestartCount}`);
|
|
185
|
+
lines.push(`- **stream ownership**: ${status.ownership?.state ?? '_(unknown)_'}`);
|
|
186
|
+
if (status.ownership?.lockPath) {
|
|
187
|
+
lines.push(`- **ownership lock path**: ${status.ownership.lockPath}`);
|
|
188
|
+
}
|
|
189
|
+
if (ownedByOther) {
|
|
190
|
+
const owner = status.ownership;
|
|
191
|
+
lines.push(`- **stream owner pid**: ${owner.pid ?? '_(unknown)_'}`);
|
|
192
|
+
lines.push(`- **stream owner cwd**: ${owner.cwd ?? '_(unknown)_'}`);
|
|
193
|
+
lines.push(`- **stream owner heartbeat age**: ${typeof owner.ageMs === 'number' && Number.isFinite(owner.ageMs)
|
|
194
|
+
? `${Math.max(0, Math.round(owner.ageMs / 1000))}s`
|
|
195
|
+
: '_(unknown)_'}`);
|
|
196
|
+
}
|
|
197
|
+
// State-5 body line + self-arm instruction. Only fires when we
|
|
198
|
+
// POSITIVELY detected wake-path breakage AND the wire is up — the
|
|
199
|
+
// disconnected case takes precedence above and would never reach
|
|
200
|
+
// here. When `inboxMonitorHealthy === null` (couldn't determine) we
|
|
201
|
+
// stay silent; surfacing an uncertain failure mode is worse UX than
|
|
202
|
+
// omitting it.
|
|
203
|
+
if (status.connected && inboxMonitorHealthy === false) {
|
|
204
|
+
lines.push(`- **inbox-monitor**: _(no watcher detected — wake path broken)_`);
|
|
205
|
+
if (inboxPath && droneLabel && cubeName) {
|
|
206
|
+
lines.push('');
|
|
207
|
+
lines.push('## Real-time wake-up (do this now)');
|
|
208
|
+
lines.push('No process is tailing this drone\'s inbox file — this session won\'t wake on real-time cube activity, only on its fallback timer, and will miss live coordination from other drones. Arm an inbox Monitor:');
|
|
209
|
+
lines.push('');
|
|
210
|
+
lines.push(`> Monitor command: \`${monitorCommand(inboxPath, monitorStateRoot)}\` — persistent, 1h timeout, description "borg inbox for ${droneLabel} on cube ${cubeName}".`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return lines.join('\n');
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Gate predicate for the regen wake-path warning (gh#51 — extracted
|
|
217
|
+
* from the inline ternary in `src/index.ts` for direct unit-test
|
|
218
|
+
* coverage of the (connected × healthy) cross-product).
|
|
219
|
+
*
|
|
220
|
+
* Returns true ONLY when the wire is up AND we positively detected a
|
|
221
|
+
* dead inbox Monitor (`=== false` strict). The `null` branch
|
|
222
|
+
* (couldn't determine) stays silent — surfacing an uncertain failure
|
|
223
|
+
* mode is worse UX than omitting it (mirrors the State-5 precedence
|
|
224
|
+
* rule in `renderStreamStatus`). When disconnected, the wire-down case
|
|
225
|
+
* is the upstream cause and takes precedence; no point warning about
|
|
226
|
+
* the wake path when the wake-path's input has no events to deliver.
|
|
227
|
+
*/
|
|
228
|
+
export function shouldShowWakePathWarning(streamStatus, inboxMonitorHealthy) {
|
|
229
|
+
return streamStatus.connected && inboxMonitorHealthy === false;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Wake-path-broken prefix for `borg_regen` output (gh#43).
|
|
233
|
+
*
|
|
234
|
+
* Pure function — caller decides whether to call (gates on
|
|
235
|
+
* `shouldShowWakePathWarning`). Returns an empty string when called
|
|
236
|
+
* with insufficient context to render the Monitor command (e.g., no
|
|
237
|
+
* inbox path on a no-active-cube path), so callers can always prepend
|
|
238
|
+
* the result unconditionally.
|
|
239
|
+
*
|
|
240
|
+
* Mirrors the State-5 self-arm instruction shape in
|
|
241
|
+
* `renderStreamStatus` so a drone sees the same Monitor command via
|
|
242
|
+
* both `borg_stream-status` and `borg_regen`. The differentiator: regen
|
|
243
|
+
* runs on every /loop iteration, so the prefix gives passive
|
|
244
|
+
* self-healing (worst-case latency = the /loop fallback heartbeat),
|
|
245
|
+
* whereas stream-status only surfaces the warning when actively
|
|
246
|
+
* called.
|
|
247
|
+
*/
|
|
248
|
+
export function formatWakePathPrefix(inputs) {
|
|
249
|
+
const { inboxPath, monitorStateRoot, droneLabel, cubeName } = inputs;
|
|
250
|
+
if (!inboxPath || !droneLabel || !cubeName)
|
|
251
|
+
return '';
|
|
252
|
+
return [
|
|
253
|
+
`## ⚠ Wake path broken — arm Monitor NOW`,
|
|
254
|
+
``,
|
|
255
|
+
`No process is tailing this drone's inbox file. SSE delivery is healthy (entries reach disk), but Claude Code has no event source to wake on. Until you arm a Monitor, this session only wakes on the /loop fallback heartbeat and will miss live coordination from other drones:`,
|
|
256
|
+
``,
|
|
257
|
+
`> Monitor command: \`${monitorCommand(inboxPath, monitorStateRoot)}\` — persistent, 1h timeout, description "borg inbox for ${droneLabel} on cube ${cubeName}".`,
|
|
258
|
+
``,
|
|
259
|
+
`---`,
|
|
260
|
+
``,
|
|
261
|
+
].join('\n');
|
|
262
|
+
}
|
|
263
|
+
function monitorCommand(inboxPath, monitorStateRoot) {
|
|
264
|
+
return monitorStateRoot
|
|
265
|
+
? `borg-inbox-monitor --state-root ${shellEscape(monitorStateRoot)} ${shellEscape(inboxPath)}`
|
|
266
|
+
: `borg-inbox-monitor ${shellEscape(inboxPath)}`;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=stream-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-status.js","sourceRoot":"","sources":["../src/stream-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-roles-render.d.ts","sourceRoot":"","sources":["../src/sync-roles-render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,gBAAgB,CAAC;QAC9C,SAAS,EAAE,YAAY,EAAE,CAAC;KAC3B,CAAC,CAAC;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC1D,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAG5B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AASD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,oBAAoB,EAC5B,YAAY,EAAE,MAAM,GACnB,MAAM,CA2GR"}
|
|
@@ -1,3 +1,118 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* gh#473 PR2 — non-clobbering sync output rendering.
|
|
3
|
+
*
|
|
4
|
+
* The dry-run output is UX-LOAD-BEARING: it must CLEARLY communicate each
|
|
5
|
+
* conflict (which role/section or taxonomy class, cube-current vs
|
|
6
|
+
* template-new, and how to accept) so the operator SEES what would be
|
|
7
|
+
* clobbered. Pure string logic (mirrors `roster-render.ts` /
|
|
8
|
+
* `list-roles-render.ts`) so it is unit-testable without the MCP runtime.
|
|
9
|
+
*
|
|
10
|
+
* The shape mirrors the worker's `NonClobberSyncResult`.
|
|
11
|
+
*/
|
|
12
|
+
/** Truncate long fragment bodies for at-a-glance diffs. */
|
|
13
|
+
function trunc(s, n = 200) {
|
|
14
|
+
if (s == null)
|
|
15
|
+
return '(absent)';
|
|
16
|
+
const flat = s.replace(/\n/g, '⏎');
|
|
17
|
+
return flat.length > n ? flat.slice(0, n) + '…' : flat;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Render a `NonClobberSyncResult` as an operator-facing markdown report.
|
|
21
|
+
*
|
|
22
|
+
* Conflicts are the headline: each is surfaced with both sides + its
|
|
23
|
+
* stable accept key, and the report states explicitly that conflicts are
|
|
24
|
+
* KEPT (the cube's version) unless accepted. ADDs are reported as safe
|
|
25
|
+
* auto-applies. Custom roles are reported untouched.
|
|
26
|
+
*/
|
|
27
|
+
export function renderSyncRolesResult(result, templateName) {
|
|
28
|
+
// Defensive guard against client/worker deploy skew (gh#9 class). A
|
|
29
|
+
// pre-#473 worker returns the legacy sync-roles shape
|
|
30
|
+
// ({ updated, added, unchanged, skipped, dryRun }) with no `roles[]`, so
|
|
31
|
+
// `result.roles.flatMap(...)` below would throw `undefined.flatMap`.
|
|
32
|
+
// Detect the legacy shape and render an actionable message instead of
|
|
33
|
+
// crashing — the skew window (0.9.47+ client + pre-#473 worker) becomes a
|
|
34
|
+
// clean "redeploy the worker" prompt, not an exception.
|
|
35
|
+
const maybeLegacy = result;
|
|
36
|
+
if (maybeLegacy.roles === undefined && 'updated' in maybeLegacy) {
|
|
37
|
+
return [
|
|
38
|
+
`## borg_sync-roles — unavailable (server out of date)`,
|
|
39
|
+
``,
|
|
40
|
+
`The borg server returned the legacy sync-roles response shape — it is running a version older than #473, which the non-clobbering sync view does not support.`,
|
|
41
|
+
``,
|
|
42
|
+
`**Action:** a server (worker) deploy is pending. Retry \`borg_sync-roles\` once it lands.`,
|
|
43
|
+
].join('\n');
|
|
44
|
+
}
|
|
45
|
+
const mode = result.dryRun
|
|
46
|
+
? '**DRY RUN** (review conflicts below; re-run with `apply: true` + a `decisions` map to commit)'
|
|
47
|
+
: '**APPLIED**';
|
|
48
|
+
const lines = [`## borg_sync-roles — ${mode}`, `Template: ${templateName}`, ''];
|
|
49
|
+
// Gather all fragments across roles + taxonomy for tallying.
|
|
50
|
+
const allFragments = [
|
|
51
|
+
...result.roles.flatMap((r) => r.fragments),
|
|
52
|
+
...result.taxonomy,
|
|
53
|
+
];
|
|
54
|
+
const conflicts = allFragments.filter((f) => f.kind === 'conflict');
|
|
55
|
+
const adds = allFragments.filter((f) => f.kind === 'add');
|
|
56
|
+
const newRoles = result.roles.filter((r) => r.status === 'new');
|
|
57
|
+
const customRoles = result.roles.filter((r) => r.status === 'custom-skipped');
|
|
58
|
+
// ── Conflicts (the headline — what would be clobbered) ──
|
|
59
|
+
if (conflicts.length > 0) {
|
|
60
|
+
lines.push(`### ⚠ ${conflicts.length} CONFLICT(s) — these fragments differ between your cube and the template`);
|
|
61
|
+
if (result.dryRun) {
|
|
62
|
+
lines.push('These differ between your cube and the template — may be because you evolved them, or because the template changed them. ' +
|
|
63
|
+
'Surfaced for review, never silently overwritten. Each defaults to **KEEP (reject)** — your version survives. ' +
|
|
64
|
+
'To take the template version of a specific fragment, pass its key in `decisions` as `"<key>": "accept"`.');
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
lines.push('Unless explicitly accepted, each conflict was KEPT (your version preserved).');
|
|
68
|
+
}
|
|
69
|
+
lines.push('');
|
|
70
|
+
for (const f of conflicts) {
|
|
71
|
+
const applied = result.applied.acceptedConflicts.includes(f.key);
|
|
72
|
+
const status = result.dryRun
|
|
73
|
+
? '(would KEEP your version)'
|
|
74
|
+
: applied
|
|
75
|
+
? '✓ accepted — template version applied'
|
|
76
|
+
: '↩ kept your version';
|
|
77
|
+
lines.push(`- **${f.label}** \`${f.key}\` ${status}`);
|
|
78
|
+
lines.push(` - cube (current): "${trunc(f.cubeValue)}"`);
|
|
79
|
+
lines.push(` - template (new): "${trunc(f.templateValue)}"`);
|
|
80
|
+
}
|
|
81
|
+
lines.push('');
|
|
82
|
+
}
|
|
83
|
+
// ── Unmatched decision keys (typo'd / stale — intended accept dropped) ──
|
|
84
|
+
const unmatched = result.unmatchedDecisions ?? [];
|
|
85
|
+
if (unmatched.length > 0) {
|
|
86
|
+
lines.push(`### ⚠ ${unmatched.length} decision key(s) matched no conflict and were ignored`);
|
|
87
|
+
lines.push('These keys in your `decisions` map did not correspond to any classified conflict this run ' +
|
|
88
|
+
'(typo or stale key) — their intended accept had NO effect. Check the exact keys against the conflicts above:');
|
|
89
|
+
for (const k of unmatched) {
|
|
90
|
+
lines.push(`- \`${k}\``);
|
|
91
|
+
}
|
|
92
|
+
lines.push('');
|
|
93
|
+
}
|
|
94
|
+
// ── Additions (safe auto-apply, zero clobber risk) ──
|
|
95
|
+
if (newRoles.length > 0 || adds.length > 0) {
|
|
96
|
+
lines.push(`### Additions (safe — auto-applied, zero clobber risk)`);
|
|
97
|
+
for (const r of newRoles) {
|
|
98
|
+
const note = result.dryRun ? '(new role — would be created)' : '✓ created';
|
|
99
|
+
lines.push(`- new role **${r.name}** ${note}`);
|
|
100
|
+
}
|
|
101
|
+
for (const f of adds) {
|
|
102
|
+
const note = result.dryRun ? '(would be added)' : '✓ added';
|
|
103
|
+
lines.push(`- **${f.label}** \`${f.key}\` ${note}`);
|
|
104
|
+
}
|
|
105
|
+
lines.push('');
|
|
106
|
+
}
|
|
107
|
+
// ── Custom roles (never touched) ──
|
|
108
|
+
if (customRoles.length > 0) {
|
|
109
|
+
lines.push(`### Custom roles (untouched): ${customRoles.map((r) => r.name).join(', ')}`);
|
|
110
|
+
lines.push('');
|
|
111
|
+
}
|
|
112
|
+
// ── Clean no-op ──
|
|
113
|
+
if (conflicts.length === 0 && adds.length === 0 && newRoles.length === 0) {
|
|
114
|
+
lines.push('✓ Cube roles + taxonomy are **up to date** with the template (no changes).');
|
|
115
|
+
}
|
|
116
|
+
return lines.join('\n').trimEnd();
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=sync-roles-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-roles-render.js","sourceRoot":"","sources":["../src/sync-roles-render.ts"],"names":[],"mappings":"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"}
|
package/dist/sync.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* as a checkout.
|
|
13
13
|
*
|
|
14
14
|
* All git mutation/decision logic is delegated to
|
|
15
|
-
* `
|
|
15
|
+
* `src/worktree-lifecycle.ts` (the seam PR-A added:
|
|
16
16
|
* `adoptWorktree`, `syncWorktree`, `cleanupMerged`, `isMerged`,
|
|
17
17
|
* `localBranchExists`) so the never-discard guards (dirty / unmerged
|
|
18
18
|
* HEAD / unmerged target wt- branch) and the args-array subprocess
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAKH,OAAO,EAML,KAAK,OAAO,EACb,MAAM,yBAAyB,CAAC;AAMjC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,2CAA2C;IAC3C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,KAAK,EAAE,OAAO,CAAC;CAChB;AAsBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,GACpB,MAAM,CAaR;AAMD,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjF;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS,CAgE/D;AAMD,wBAAsB,OAAO,CAAC,IAAI,GAAE,QAAa,EAAE,IAAI,GAAE,WAA8B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiFxG;AAiCD,MAAM,MAAM,WAAW,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5F;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,CAa5D"}
|