chatroom-cli 1.31.1 → 1.32.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/dist/api.d.ts +61 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +10 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/artifact/deps.d.ts +6 -0
- package/dist/commands/artifact/deps.d.ts.map +1 -0
- package/dist/commands/artifact/deps.js +2 -0
- package/dist/commands/artifact/deps.js.map +1 -0
- package/dist/commands/artifact/index.d.ts +43 -0
- package/dist/commands/artifact/index.d.ts.map +1 -0
- package/dist/commands/artifact/index.js +205 -0
- package/dist/commands/artifact/index.js.map +1 -0
- package/dist/commands/artifact/index.test.d.ts +8 -0
- package/dist/commands/artifact/index.test.d.ts.map +1 -0
- package/dist/commands/artifact/index.test.js +188 -0
- package/dist/commands/artifact/index.test.js.map +1 -0
- package/dist/commands/auth-login/deps.d.ts +50 -0
- package/dist/commands/auth-login/deps.d.ts.map +1 -0
- package/dist/commands/auth-login/deps.js +9 -0
- package/dist/commands/auth-login/deps.js.map +1 -0
- package/dist/commands/auth-login/index.d.ts +22 -0
- package/dist/commands/auth-login/index.d.ts.map +1 -0
- package/dist/commands/auth-login/index.js +246 -0
- package/dist/commands/auth-login/index.js.map +1 -0
- package/dist/commands/auth-login/index.test.d.ts +9 -0
- package/dist/commands/auth-login/index.test.d.ts.map +1 -0
- package/dist/commands/auth-login/index.test.js +297 -0
- package/dist/commands/auth-login/index.test.js.map +1 -0
- package/dist/commands/auth-logout/deps.d.ts +20 -0
- package/dist/commands/auth-logout/deps.d.ts.map +1 -0
- package/dist/commands/auth-logout/deps.js +7 -0
- package/dist/commands/auth-logout/deps.js.map +1 -0
- package/dist/commands/auth-logout/index.d.ts +8 -0
- package/dist/commands/auth-logout/index.d.ts.map +1 -0
- package/dist/commands/auth-logout/index.js +34 -0
- package/dist/commands/auth-logout/index.js.map +1 -0
- package/dist/commands/auth-logout/index.test.d.ts +8 -0
- package/dist/commands/auth-logout/index.test.d.ts.map +1 -0
- package/dist/commands/auth-logout/index.test.js +85 -0
- package/dist/commands/auth-logout/index.test.js.map +1 -0
- package/dist/commands/auth-status/deps.d.ts +35 -0
- package/dist/commands/auth-status/deps.d.ts.map +1 -0
- package/dist/commands/auth-status/deps.js +7 -0
- package/dist/commands/auth-status/deps.js.map +1 -0
- package/dist/commands/auth-status/index.d.ts +8 -0
- package/dist/commands/auth-status/index.d.ts.map +1 -0
- package/dist/commands/auth-status/index.js +80 -0
- package/dist/commands/auth-status/index.js.map +1 -0
- package/dist/commands/auth-status/index.test.d.ts +8 -0
- package/dist/commands/auth-status/index.test.d.ts.map +1 -0
- package/dist/commands/auth-status/index.test.js +116 -0
- package/dist/commands/auth-status/index.test.js.map +1 -0
- package/dist/commands/backlog/deps.d.ts +21 -0
- package/dist/commands/backlog/deps.d.ts.map +1 -0
- package/dist/commands/backlog/deps.js +5 -0
- package/dist/commands/backlog/deps.js.map +1 -0
- package/dist/commands/backlog/index.d.ts +129 -0
- package/dist/commands/backlog/index.d.ts.map +1 -0
- package/dist/commands/backlog/index.js +694 -0
- package/dist/commands/backlog/index.js.map +1 -0
- package/dist/commands/backlog/index.test.d.ts +7 -0
- package/dist/commands/backlog/index.test.d.ts.map +1 -0
- package/dist/commands/backlog/index.test.js +395 -0
- package/dist/commands/backlog/index.test.js.map +1 -0
- package/dist/commands/classify/deps.d.ts +18 -0
- package/dist/commands/classify/deps.d.ts.map +1 -0
- package/dist/commands/classify/deps.js +8 -0
- package/dist/commands/classify/deps.js.map +1 -0
- package/dist/commands/classify/index.d.ts +19 -0
- package/dist/commands/classify/index.d.ts.map +1 -0
- package/dist/commands/classify/index.js +162 -0
- package/dist/commands/classify/index.js.map +1 -0
- package/dist/commands/classify/index.test.d.ts +9 -0
- package/dist/commands/classify/index.test.d.ts.map +1 -0
- package/dist/commands/classify/index.test.js +263 -0
- package/dist/commands/classify/index.test.js.map +1 -0
- package/dist/commands/context/deps.d.ts +6 -0
- package/dist/commands/context/deps.d.ts.map +1 -0
- package/dist/commands/context/deps.js +2 -0
- package/dist/commands/context/deps.js.map +1 -0
- package/dist/commands/context/index.d.ts +42 -0
- package/dist/commands/context/index.d.ts.map +1 -0
- package/dist/commands/context/index.js +324 -0
- package/dist/commands/context/index.js.map +1 -0
- package/dist/commands/context/index.test.d.ts +9 -0
- package/dist/commands/context/index.test.d.ts.map +1 -0
- package/dist/commands/context/index.test.js +272 -0
- package/dist/commands/context/index.test.js.map +1 -0
- package/dist/commands/get-next-task/index.d.ts +20 -0
- package/dist/commands/get-next-task/index.d.ts.map +1 -0
- package/dist/commands/get-next-task/index.js +156 -0
- package/dist/commands/get-next-task/index.js.map +1 -0
- package/dist/commands/get-next-task/index.test.d.ts +9 -0
- package/dist/commands/get-next-task/index.test.d.ts.map +1 -0
- package/dist/commands/get-next-task/index.test.js +125 -0
- package/dist/commands/get-next-task/index.test.js.map +1 -0
- package/dist/commands/get-next-task/session.d.ts +127 -0
- package/dist/commands/get-next-task/session.d.ts.map +1 -0
- package/dist/commands/get-next-task/session.js +335 -0
- package/dist/commands/get-next-task/session.js.map +1 -0
- package/dist/commands/get-next-task/session.test.d.ts +11 -0
- package/dist/commands/get-next-task/session.test.d.ts.map +1 -0
- package/dist/commands/get-next-task/session.test.js +367 -0
- package/dist/commands/get-next-task/session.test.js.map +1 -0
- package/dist/commands/get-system-prompt/deps.d.ts +14 -0
- package/dist/commands/get-system-prompt/deps.d.ts.map +1 -0
- package/dist/commands/get-system-prompt/deps.js +7 -0
- package/dist/commands/get-system-prompt/deps.js.map +1 -0
- package/dist/commands/get-system-prompt/index.d.ts +16 -0
- package/dist/commands/get-system-prompt/index.d.ts.map +1 -0
- package/dist/commands/get-system-prompt/index.js +70 -0
- package/dist/commands/get-system-prompt/index.js.map +1 -0
- package/dist/commands/guidelines/deps.d.ts +14 -0
- package/dist/commands/guidelines/deps.d.ts.map +1 -0
- package/dist/commands/guidelines/deps.js +7 -0
- package/dist/commands/guidelines/deps.js.map +1 -0
- package/dist/commands/guidelines/index.d.ts +19 -0
- package/dist/commands/guidelines/index.d.ts.map +1 -0
- package/dist/commands/guidelines/index.js +92 -0
- package/dist/commands/guidelines/index.js.map +1 -0
- package/dist/commands/guidelines/index.test.d.ts +8 -0
- package/dist/commands/guidelines/index.test.d.ts.map +1 -0
- package/dist/commands/guidelines/index.test.js +140 -0
- package/dist/commands/guidelines/index.test.js.map +1 -0
- package/dist/commands/handoff/deps.d.ts +9 -0
- package/dist/commands/handoff/deps.d.ts.map +1 -0
- package/dist/commands/handoff/deps.js +5 -0
- package/dist/commands/handoff/deps.js.map +1 -0
- package/dist/commands/handoff/index.d.ts +23 -0
- package/dist/commands/handoff/index.d.ts.map +1 -0
- package/dist/commands/handoff/index.js +226 -0
- package/dist/commands/handoff/index.js.map +1 -0
- package/dist/commands/handoff/index.test.d.ts +9 -0
- package/dist/commands/handoff/index.test.d.ts.map +1 -0
- package/dist/commands/handoff/index.test.js +189 -0
- package/dist/commands/handoff/index.test.js.map +1 -0
- package/dist/commands/init/deps.d.ts +21 -0
- package/dist/commands/init/deps.d.ts.map +1 -0
- package/dist/commands/init/deps.js +8 -0
- package/dist/commands/init/deps.js.map +1 -0
- package/dist/commands/init/index.d.ts +22 -0
- package/dist/commands/init/index.d.ts.map +1 -0
- package/dist/commands/init/index.js +181 -0
- package/dist/commands/init/index.js.map +1 -0
- package/dist/commands/init/index.test.d.ts +8 -0
- package/dist/commands/init/index.test.d.ts.map +1 -0
- package/dist/commands/init/index.test.js +170 -0
- package/dist/commands/init/index.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/command-loop.d.ts +15 -0
- package/dist/commands/machine/daemon-start/command-loop.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/command-loop.js +295 -0
- package/dist/commands/machine/daemon-start/command-loop.js.map +1 -0
- package/dist/commands/machine/daemon-start/command-loop.test.d.ts +13 -0
- package/dist/commands/machine/daemon-start/command-loop.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/command-loop.test.js +156 -0
- package/dist/commands/machine/daemon-start/command-loop.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/command-sync-heartbeat.d.ts +12 -0
- package/dist/commands/machine/daemon-start/command-sync-heartbeat.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/command-sync-heartbeat.js +58 -0
- package/dist/commands/machine/daemon-start/command-sync-heartbeat.js.map +1 -0
- package/dist/commands/machine/daemon-start/deps.d.ts +85 -0
- package/dist/commands/machine/daemon-start/deps.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/deps.js +14 -0
- package/dist/commands/machine/daemon-start/deps.js.map +1 -0
- package/dist/commands/machine/daemon-start/event-bus.test.d.ts +2 -0
- package/dist/commands/machine/daemon-start/event-bus.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/event-bus.test.js +100 -0
- package/dist/commands/machine/daemon-start/event-bus.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/event-listeners.test.d.ts +2 -0
- package/dist/commands/machine/daemon-start/event-listeners.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/event-listeners.test.js +155 -0
- package/dist/commands/machine/daemon-start/event-listeners.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/file-content-fulfillment.d.ts +12 -0
- package/dist/commands/machine/daemon-start/file-content-fulfillment.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/file-content-fulfillment.js +120 -0
- package/dist/commands/machine/daemon-start/file-content-fulfillment.js.map +1 -0
- package/dist/commands/machine/daemon-start/file-content-subscription.d.ts +29 -0
- package/dist/commands/machine/daemon-start/file-content-subscription.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/file-content-subscription.js +55 -0
- package/dist/commands/machine/daemon-start/file-content-subscription.js.map +1 -0
- package/dist/commands/machine/daemon-start/file-tree-subscription.d.ts +22 -0
- package/dist/commands/machine/daemon-start/file-tree-subscription.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/file-tree-subscription.js +83 -0
- package/dist/commands/machine/daemon-start/file-tree-subscription.js.map +1 -0
- package/dist/commands/machine/daemon-start/git-heartbeat.d.ts +18 -0
- package/dist/commands/machine/daemon-start/git-heartbeat.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/git-heartbeat.js +218 -0
- package/dist/commands/machine/daemon-start/git-heartbeat.js.map +1 -0
- package/dist/commands/machine/daemon-start/git-subscription.d.ts +60 -0
- package/dist/commands/machine/daemon-start/git-subscription.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/git-subscription.js +389 -0
- package/dist/commands/machine/daemon-start/git-subscription.js.map +1 -0
- package/dist/commands/machine/daemon-start/git-subscription.test.d.ts +2 -0
- package/dist/commands/machine/daemon-start/git-subscription.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/git-subscription.test.js +103 -0
- package/dist/commands/machine/daemon-start/git-subscription.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/command-runner.d.ts +23 -0
- package/dist/commands/machine/daemon-start/handlers/command-runner.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/command-runner.js +236 -0
- package/dist/commands/machine/daemon-start/handlers/command-runner.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/ping.d.ts +6 -0
- package/dist/commands/machine/daemon-start/handlers/ping.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/ping.js +8 -0
- package/dist/commands/machine/daemon-start/handlers/ping.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/ping.test.d.ts +5 -0
- package/dist/commands/machine/daemon-start/handlers/ping.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/ping.test.js +23 -0
- package/dist/commands/machine/daemon-start/handlers/ping.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/shared.d.ts +11 -0
- package/dist/commands/machine/daemon-start/handlers/shared.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/shared.js +25 -0
- package/dist/commands/machine/daemon-start/handlers/shared.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/state-recovery.d.ts +19 -0
- package/dist/commands/machine/daemon-start/handlers/state-recovery.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/state-recovery.js +61 -0
- package/dist/commands/machine/daemon-start/handlers/state-recovery.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/state-recovery.test.d.ts +8 -0
- package/dist/commands/machine/daemon-start/handlers/state-recovery.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/state-recovery.test.js +98 -0
- package/dist/commands/machine/daemon-start/handlers/state-recovery.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/status.d.ts +6 -0
- package/dist/commands/machine/daemon-start/handlers/status.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/status.js +13 -0
- package/dist/commands/machine/daemon-start/handlers/status.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/status.test.d.ts +5 -0
- package/dist/commands/machine/daemon-start/handlers/status.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/status.test.js +51 -0
- package/dist/commands/machine/daemon-start/handlers/status.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/stop-agent.d.ts +21 -0
- package/dist/commands/machine/daemon-start/handlers/stop-agent.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/stop-agent.js +36 -0
- package/dist/commands/machine/daemon-start/handlers/stop-agent.js.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/stop-agent.test.d.ts +7 -0
- package/dist/commands/machine/daemon-start/handlers/stop-agent.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/handlers/stop-agent.test.js +135 -0
- package/dist/commands/machine/daemon-start/handlers/stop-agent.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/index.d.ts +16 -0
- package/dist/commands/machine/daemon-start/index.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/index.js +21 -0
- package/dist/commands/machine/daemon-start/index.js.map +1 -0
- package/dist/commands/machine/daemon-start/init.d.ts +23 -0
- package/dist/commands/machine/daemon-start/init.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/init.js +338 -0
- package/dist/commands/machine/daemon-start/init.js.map +1 -0
- package/dist/commands/machine/daemon-start/init.test.d.ts +8 -0
- package/dist/commands/machine/daemon-start/init.test.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/init.test.js +385 -0
- package/dist/commands/machine/daemon-start/init.test.js.map +1 -0
- package/dist/commands/machine/daemon-start/testing/index.d.ts +5 -0
- package/dist/commands/machine/daemon-start/testing/index.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/testing/index.js +5 -0
- package/dist/commands/machine/daemon-start/testing/index.js.map +1 -0
- package/dist/commands/machine/daemon-start/testing/mock-daemon-deps.d.ts +26 -0
- package/dist/commands/machine/daemon-start/testing/mock-daemon-deps.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/testing/mock-daemon-deps.js +68 -0
- package/dist/commands/machine/daemon-start/testing/mock-daemon-deps.js.map +1 -0
- package/dist/commands/machine/daemon-start/types.d.ts +89 -0
- package/dist/commands/machine/daemon-start/types.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/types.js +5 -0
- package/dist/commands/machine/daemon-start/types.js.map +1 -0
- package/dist/commands/machine/daemon-start/utils.d.ts +8 -0
- package/dist/commands/machine/daemon-start/utils.d.ts.map +1 -0
- package/dist/commands/machine/daemon-start/utils.js +10 -0
- package/dist/commands/machine/daemon-start/utils.js.map +1 -0
- package/dist/commands/machine/daemon-status.d.ts +10 -0
- package/dist/commands/machine/daemon-status.d.ts.map +1 -0
- package/dist/commands/machine/daemon-status.js +23 -0
- package/dist/commands/machine/daemon-status.js.map +1 -0
- package/dist/commands/machine/daemon-stop.d.ts +10 -0
- package/dist/commands/machine/daemon-stop.d.ts.map +1 -0
- package/dist/commands/machine/daemon-stop.js +44 -0
- package/dist/commands/machine/daemon-stop.js.map +1 -0
- package/dist/commands/machine/index.d.ts +9 -0
- package/dist/commands/machine/index.d.ts.map +1 -0
- package/dist/commands/machine/index.js +9 -0
- package/dist/commands/machine/index.js.map +1 -0
- package/dist/commands/machine/pid.d.ts +48 -0
- package/dist/commands/machine/pid.d.ts.map +1 -0
- package/dist/commands/machine/pid.js +141 -0
- package/dist/commands/machine/pid.js.map +1 -0
- package/dist/commands/messages/deps.d.ts +6 -0
- package/dist/commands/messages/deps.d.ts.map +1 -0
- package/dist/commands/messages/deps.js +2 -0
- package/dist/commands/messages/deps.js.map +1 -0
- package/dist/commands/messages/index.d.ts +28 -0
- package/dist/commands/messages/index.d.ts.map +1 -0
- package/dist/commands/messages/index.js +166 -0
- package/dist/commands/messages/index.js.map +1 -0
- package/dist/commands/messages/index.test.d.ts +8 -0
- package/dist/commands/messages/index.test.d.ts.map +1 -0
- package/dist/commands/messages/index.test.js +159 -0
- package/dist/commands/messages/index.test.js.map +1 -0
- package/dist/commands/opencode-install/deps.d.ts +32 -0
- package/dist/commands/opencode-install/deps.d.ts.map +1 -0
- package/dist/commands/opencode-install/deps.js +8 -0
- package/dist/commands/opencode-install/deps.js.map +1 -0
- package/dist/commands/opencode-install/index.d.ts +31 -0
- package/dist/commands/opencode-install/index.d.ts.map +1 -0
- package/dist/commands/opencode-install/index.js +440 -0
- package/dist/commands/opencode-install/index.js.map +1 -0
- package/dist/commands/opencode-install/index.test.d.ts +8 -0
- package/dist/commands/opencode-install/index.test.d.ts.map +1 -0
- package/dist/commands/opencode-install/index.test.js +123 -0
- package/dist/commands/opencode-install/index.test.js.map +1 -0
- package/dist/commands/register-agent/deps.d.ts +12 -0
- package/dist/commands/register-agent/deps.d.ts.map +1 -0
- package/dist/commands/register-agent/deps.js +8 -0
- package/dist/commands/register-agent/deps.js.map +1 -0
- package/dist/commands/register-agent/index.d.ts +15 -0
- package/dist/commands/register-agent/index.d.ts.map +1 -0
- package/dist/commands/register-agent/index.js +118 -0
- package/dist/commands/register-agent/index.js.map +1 -0
- package/dist/commands/register-agent/index.test.d.ts +9 -0
- package/dist/commands/register-agent/index.test.d.ts.map +1 -0
- package/dist/commands/register-agent/index.test.js +204 -0
- package/dist/commands/register-agent/index.test.js.map +1 -0
- package/dist/commands/report-progress/deps.d.ts +9 -0
- package/dist/commands/report-progress/deps.d.ts.map +1 -0
- package/dist/commands/report-progress/deps.js +5 -0
- package/dist/commands/report-progress/deps.js.map +1 -0
- package/dist/commands/report-progress/index.d.ts +14 -0
- package/dist/commands/report-progress/index.d.ts.map +1 -0
- package/dist/commands/report-progress/index.js +110 -0
- package/dist/commands/report-progress/index.js.map +1 -0
- package/dist/commands/report-progress/index.test.d.ts +8 -0
- package/dist/commands/report-progress/index.test.d.ts.map +1 -0
- package/dist/commands/report-progress/index.test.js +114 -0
- package/dist/commands/report-progress/index.test.js.map +1 -0
- package/dist/commands/skill/deps.d.ts +9 -0
- package/dist/commands/skill/deps.d.ts.map +1 -0
- package/dist/commands/skill/deps.js +5 -0
- package/dist/commands/skill/deps.js.map +1 -0
- package/dist/commands/skill/index.d.ts +20 -0
- package/dist/commands/skill/index.d.ts.map +1 -0
- package/dist/commands/skill/index.js +86 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/skill/index.test.d.ts +8 -0
- package/dist/commands/skill/index.test.d.ts.map +1 -0
- package/dist/commands/skill/index.test.js +166 -0
- package/dist/commands/skill/index.test.js.map +1 -0
- package/dist/commands/task/read/deps.d.ts +18 -0
- package/dist/commands/task/read/deps.d.ts.map +1 -0
- package/dist/commands/task/read/deps.js +8 -0
- package/dist/commands/task/read/deps.js.map +1 -0
- package/dist/commands/task/read/index.d.ts +17 -0
- package/dist/commands/task/read/index.d.ts.map +1 -0
- package/dist/commands/task/read/index.js +144 -0
- package/dist/commands/task/read/index.js.map +1 -0
- package/dist/commands/telegram/deps.d.ts +13 -0
- package/dist/commands/telegram/deps.d.ts.map +1 -0
- package/dist/commands/telegram/deps.js +5 -0
- package/dist/commands/telegram/deps.js.map +1 -0
- package/dist/commands/telegram/index.d.ts +18 -0
- package/dist/commands/telegram/index.d.ts.map +1 -0
- package/dist/commands/telegram/index.js +94 -0
- package/dist/commands/telegram/index.js.map +1 -0
- package/dist/commands/update/deps.d.ts +21 -0
- package/dist/commands/update/deps.d.ts.map +1 -0
- package/dist/commands/update/deps.js +8 -0
- package/dist/commands/update/deps.js.map +1 -0
- package/dist/commands/update/index.d.ts +8 -0
- package/dist/commands/update/index.d.ts.map +1 -0
- package/dist/commands/update/index.js +70 -0
- package/dist/commands/update/index.js.map +1 -0
- package/dist/commands/update/index.test.d.ts +8 -0
- package/dist/commands/update/index.test.d.ts.map +1 -0
- package/dist/commands/update/index.test.js +108 -0
- package/dist/commands/update/index.test.js.map +1 -0
- package/dist/commands/workflow/deps.d.ts +9 -0
- package/dist/commands/workflow/deps.d.ts.map +1 -0
- package/dist/commands/workflow/deps.js +5 -0
- package/dist/commands/workflow/deps.js.map +1 -0
- package/dist/commands/workflow/index.d.ts +73 -0
- package/dist/commands/workflow/index.d.ts.map +1 -0
- package/dist/commands/workflow/index.js +545 -0
- package/dist/commands/workflow/index.js.map +1 -0
- package/dist/commands/workflow/index.test.d.ts +7 -0
- package/dist/commands/workflow/index.test.d.ts.map +1 -0
- package/dist/commands/workflow/index.test.js +315 -0
- package/dist/commands/workflow/index.test.js.map +1 -0
- package/dist/config/defaults.d.ts +10 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +79 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +52 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +202 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +50 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +99 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -0
- package/dist/events/daemon/agent/on-agent-exited.d.ts +26 -0
- package/dist/events/daemon/agent/on-agent-exited.d.ts.map +1 -0
- package/dist/events/daemon/agent/on-agent-exited.js +20 -0
- package/dist/events/daemon/agent/on-agent-exited.js.map +1 -0
- package/dist/events/daemon/agent/on-agent-started.d.ts +16 -0
- package/dist/events/daemon/agent/on-agent-started.d.ts.map +1 -0
- package/dist/events/daemon/agent/on-agent-started.js +11 -0
- package/dist/events/daemon/agent/on-agent-started.js.map +1 -0
- package/dist/events/daemon/agent/on-agent-stopped.d.ts +14 -0
- package/dist/events/daemon/agent/on-agent-stopped.d.ts.map +1 -0
- package/dist/events/daemon/agent/on-agent-stopped.js +11 -0
- package/dist/events/daemon/agent/on-agent-stopped.js.map +1 -0
- package/dist/events/daemon/agent/on-request-start-agent.d.ts +19 -0
- package/dist/events/daemon/agent/on-request-start-agent.d.ts.map +1 -0
- package/dist/events/daemon/agent/on-request-start-agent.js +55 -0
- package/dist/events/daemon/agent/on-request-start-agent.js.map +1 -0
- package/dist/events/daemon/agent/on-request-start-agent.test.d.ts +2 -0
- package/dist/events/daemon/agent/on-request-start-agent.test.d.ts.map +1 -0
- package/dist/events/daemon/agent/on-request-start-agent.test.js +96 -0
- package/dist/events/daemon/agent/on-request-start-agent.test.js.map +1 -0
- package/dist/events/daemon/agent/on-request-stop-agent.d.ts +16 -0
- package/dist/events/daemon/agent/on-request-stop-agent.d.ts.map +1 -0
- package/dist/events/daemon/agent/on-request-stop-agent.js +19 -0
- package/dist/events/daemon/agent/on-request-stop-agent.js.map +1 -0
- package/dist/events/daemon/event-bus.d.ts +87 -0
- package/dist/events/daemon/event-bus.d.ts.map +1 -0
- package/dist/events/daemon/event-bus.js +50 -0
- package/dist/events/daemon/event-bus.js.map +1 -0
- package/dist/events/daemon/register-listeners.d.ts +9 -0
- package/dist/events/daemon/register-listeners.d.ts.map +1 -0
- package/dist/events/daemon/register-listeners.js +21 -0
- package/dist/events/daemon/register-listeners.js.map +1 -0
- package/dist/events/lifecycle/on-daemon-shutdown.d.ts +9 -0
- package/dist/events/lifecycle/on-daemon-shutdown.d.ts.map +1 -0
- package/dist/events/lifecycle/on-daemon-shutdown.js +43 -0
- package/dist/events/lifecycle/on-daemon-shutdown.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +210 -25
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/auth/middleware.d.ts +21 -0
- package/dist/infrastructure/auth/middleware.d.ts.map +1 -0
- package/dist/infrastructure/auth/middleware.js +106 -0
- package/dist/infrastructure/auth/middleware.js.map +1 -0
- package/dist/infrastructure/auth/storage.d.ts +59 -0
- package/dist/infrastructure/auth/storage.d.ts.map +1 -0
- package/dist/infrastructure/auth/storage.js +242 -0
- package/dist/infrastructure/auth/storage.js.map +1 -0
- package/dist/infrastructure/convex/client.d.ts +28 -0
- package/dist/infrastructure/convex/client.d.ts.map +1 -0
- package/dist/infrastructure/convex/client.js +77 -0
- package/dist/infrastructure/convex/client.js.map +1 -0
- package/dist/infrastructure/deps/backend.d.ts +13 -0
- package/dist/infrastructure/deps/backend.d.ts.map +1 -0
- package/dist/infrastructure/deps/backend.js +8 -0
- package/dist/infrastructure/deps/backend.js.map +1 -0
- package/dist/infrastructure/deps/clock.d.ts +13 -0
- package/dist/infrastructure/deps/clock.d.ts.map +1 -0
- package/dist/infrastructure/deps/clock.js +8 -0
- package/dist/infrastructure/deps/clock.js.map +1 -0
- package/dist/infrastructure/deps/fs.d.ts +12 -0
- package/dist/infrastructure/deps/fs.d.ts.map +1 -0
- package/dist/infrastructure/deps/fs.js +8 -0
- package/dist/infrastructure/deps/fs.js.map +1 -0
- package/dist/infrastructure/deps/index.d.ts +12 -0
- package/dist/infrastructure/deps/index.d.ts.map +1 -0
- package/dist/infrastructure/deps/index.js +8 -0
- package/dist/infrastructure/deps/index.js.map +1 -0
- package/dist/infrastructure/deps/process.d.ts +11 -0
- package/dist/infrastructure/deps/process.d.ts.map +1 -0
- package/dist/infrastructure/deps/process.js +8 -0
- package/dist/infrastructure/deps/process.js.map +1 -0
- package/dist/infrastructure/deps/session.d.ts +16 -0
- package/dist/infrastructure/deps/session.d.ts.map +1 -0
- package/dist/infrastructure/deps/session.js +8 -0
- package/dist/infrastructure/deps/session.js.map +1 -0
- package/dist/infrastructure/git/git-reader.d.ts +206 -0
- package/dist/infrastructure/git/git-reader.d.ts.map +1 -0
- package/dist/infrastructure/git/git-reader.js +711 -0
- package/dist/infrastructure/git/git-reader.js.map +1 -0
- package/dist/infrastructure/git/git-reader.test.d.ts +8 -0
- package/dist/infrastructure/git/git-reader.test.d.ts.map +1 -0
- package/dist/infrastructure/git/git-reader.test.js +598 -0
- package/dist/infrastructure/git/git-reader.test.js.map +1 -0
- package/dist/infrastructure/git/index.d.ts +9 -0
- package/dist/infrastructure/git/index.d.ts.map +1 -0
- package/dist/infrastructure/git/index.js +8 -0
- package/dist/infrastructure/git/index.js.map +1 -0
- package/dist/infrastructure/git/types.d.ts +102 -0
- package/dist/infrastructure/git/types.d.ts.map +1 -0
- package/dist/infrastructure/git/types.js +20 -0
- package/dist/infrastructure/git/types.js.map +1 -0
- package/dist/infrastructure/history/storage.d.ts +21 -0
- package/dist/infrastructure/history/storage.d.ts.map +1 -0
- package/dist/infrastructure/history/storage.js +56 -0
- package/dist/infrastructure/history/storage.js.map +1 -0
- package/dist/infrastructure/lifecycle-heartbeat.d.ts +18 -0
- package/dist/infrastructure/lifecycle-heartbeat.d.ts.map +1 -0
- package/dist/infrastructure/lifecycle-heartbeat.js +21 -0
- package/dist/infrastructure/lifecycle-heartbeat.js.map +1 -0
- package/dist/infrastructure/local-actions/execute-local-action.d.ts +30 -0
- package/dist/infrastructure/local-actions/execute-local-action.d.ts.map +1 -0
- package/dist/infrastructure/local-actions/execute-local-action.js +76 -0
- package/dist/infrastructure/local-actions/execute-local-action.js.map +1 -0
- package/dist/infrastructure/local-actions/index.d.ts +9 -0
- package/dist/infrastructure/local-actions/index.d.ts.map +1 -0
- package/dist/infrastructure/local-actions/index.js +8 -0
- package/dist/infrastructure/local-actions/index.js.map +1 -0
- package/dist/infrastructure/local-api/cors.d.ts +19 -0
- package/dist/infrastructure/local-api/cors.d.ts.map +1 -0
- package/dist/infrastructure/local-api/cors.js +50 -0
- package/dist/infrastructure/local-api/cors.js.map +1 -0
- package/dist/infrastructure/local-api/identity.test.d.ts +8 -0
- package/dist/infrastructure/local-api/identity.test.d.ts.map +1 -0
- package/dist/infrastructure/local-api/identity.test.js +71 -0
- package/dist/infrastructure/local-api/identity.test.js.map +1 -0
- package/dist/infrastructure/local-api/index.d.ts +10 -0
- package/dist/infrastructure/local-api/index.d.ts.map +1 -0
- package/dist/infrastructure/local-api/index.js +8 -0
- package/dist/infrastructure/local-api/index.js.map +1 -0
- package/dist/infrastructure/local-api/open-finder.test.d.ts +13 -0
- package/dist/infrastructure/local-api/open-finder.test.d.ts.map +1 -0
- package/dist/infrastructure/local-api/open-finder.test.js +112 -0
- package/dist/infrastructure/local-api/open-finder.test.js.map +1 -0
- package/dist/infrastructure/local-api/open-github-desktop.test.d.ts +12 -0
- package/dist/infrastructure/local-api/open-github-desktop.test.d.ts.map +1 -0
- package/dist/infrastructure/local-api/open-github-desktop.test.js +129 -0
- package/dist/infrastructure/local-api/open-github-desktop.test.js.map +1 -0
- package/dist/infrastructure/local-api/open-vscode.test.d.ts +12 -0
- package/dist/infrastructure/local-api/open-vscode.test.d.ts.map +1 -0
- package/dist/infrastructure/local-api/open-vscode.test.js +130 -0
- package/dist/infrastructure/local-api/open-vscode.test.js.map +1 -0
- package/dist/infrastructure/local-api/router.d.ts +28 -0
- package/dist/infrastructure/local-api/router.d.ts.map +1 -0
- package/dist/infrastructure/local-api/router.js +60 -0
- package/dist/infrastructure/local-api/router.js.map +1 -0
- package/dist/infrastructure/local-api/router.test.d.ts +8 -0
- package/dist/infrastructure/local-api/router.test.d.ts.map +1 -0
- package/dist/infrastructure/local-api/router.test.js +142 -0
- package/dist/infrastructure/local-api/router.test.js.map +1 -0
- package/dist/infrastructure/local-api/routes/identity.d.ts +28 -0
- package/dist/infrastructure/local-api/routes/identity.d.ts.map +1 -0
- package/dist/infrastructure/local-api/routes/identity.js +42 -0
- package/dist/infrastructure/local-api/routes/identity.js.map +1 -0
- package/dist/infrastructure/local-api/routes/open-finder.d.ts +25 -0
- package/dist/infrastructure/local-api/routes/open-finder.d.ts.map +1 -0
- package/dist/infrastructure/local-api/routes/open-finder.js +58 -0
- package/dist/infrastructure/local-api/routes/open-finder.js.map +1 -0
- package/dist/infrastructure/local-api/routes/open-github-desktop.d.ts +21 -0
- package/dist/infrastructure/local-api/routes/open-github-desktop.d.ts.map +1 -0
- package/dist/infrastructure/local-api/routes/open-github-desktop.js +43 -0
- package/dist/infrastructure/local-api/routes/open-github-desktop.js.map +1 -0
- package/dist/infrastructure/local-api/routes/open-vscode.d.ts +23 -0
- package/dist/infrastructure/local-api/routes/open-vscode.d.ts.map +1 -0
- package/dist/infrastructure/local-api/routes/open-vscode.js +51 -0
- package/dist/infrastructure/local-api/routes/open-vscode.js.map +1 -0
- package/dist/infrastructure/local-api/routes/shared-utils.d.ts +51 -0
- package/dist/infrastructure/local-api/routes/shared-utils.d.ts.map +1 -0
- package/dist/infrastructure/local-api/routes/shared-utils.js +96 -0
- package/dist/infrastructure/local-api/routes/shared-utils.js.map +1 -0
- package/dist/infrastructure/local-api/server.d.ts +40 -0
- package/dist/infrastructure/local-api/server.d.ts.map +1 -0
- package/dist/infrastructure/local-api/server.js +153 -0
- package/dist/infrastructure/local-api/server.js.map +1 -0
- package/dist/infrastructure/local-api/types.d.ts +48 -0
- package/dist/infrastructure/local-api/types.d.ts.map +1 -0
- package/dist/infrastructure/local-api/types.js +8 -0
- package/dist/infrastructure/local-api/types.js.map +1 -0
- package/dist/infrastructure/machine/crash-loop-tracker.d.ts +69 -0
- package/dist/infrastructure/machine/crash-loop-tracker.d.ts.map +1 -0
- package/dist/infrastructure/machine/crash-loop-tracker.js +116 -0
- package/dist/infrastructure/machine/crash-loop-tracker.js.map +1 -0
- package/dist/infrastructure/machine/crash-loop-tracker.test.d.ts +8 -0
- package/dist/infrastructure/machine/crash-loop-tracker.test.d.ts.map +1 -0
- package/dist/infrastructure/machine/crash-loop-tracker.test.js +210 -0
- package/dist/infrastructure/machine/crash-loop-tracker.test.js.map +1 -0
- package/dist/infrastructure/machine/daemon-state.d.ts +96 -0
- package/dist/infrastructure/machine/daemon-state.d.ts.map +1 -0
- package/dist/infrastructure/machine/daemon-state.js +183 -0
- package/dist/infrastructure/machine/daemon-state.js.map +1 -0
- package/dist/infrastructure/machine/daemon-state.test.d.ts +10 -0
- package/dist/infrastructure/machine/daemon-state.test.d.ts.map +1 -0
- package/dist/infrastructure/machine/daemon-state.test.js +128 -0
- package/dist/infrastructure/machine/daemon-state.test.js.map +1 -0
- package/dist/infrastructure/machine/detection.d.ts +27 -0
- package/dist/infrastructure/machine/detection.d.ts.map +1 -0
- package/dist/infrastructure/machine/detection.js +47 -0
- package/dist/infrastructure/machine/detection.js.map +1 -0
- package/dist/infrastructure/machine/index.d.ts +10 -0
- package/dist/infrastructure/machine/index.d.ts.map +1 -0
- package/dist/infrastructure/machine/index.js +11 -0
- package/dist/infrastructure/machine/index.js.map +1 -0
- package/dist/infrastructure/machine/stop-reason.d.ts +26 -0
- package/dist/infrastructure/machine/stop-reason.d.ts.map +1 -0
- package/dist/infrastructure/machine/stop-reason.js +22 -0
- package/dist/infrastructure/machine/stop-reason.js.map +1 -0
- package/dist/infrastructure/machine/stop-reason.test.d.ts +2 -0
- package/dist/infrastructure/machine/stop-reason.test.d.ts.map +1 -0
- package/dist/infrastructure/machine/stop-reason.test.js +32 -0
- package/dist/infrastructure/machine/stop-reason.test.js.map +1 -0
- package/dist/infrastructure/machine/storage.d.ts +42 -0
- package/dist/infrastructure/machine/storage.d.ts.map +1 -0
- package/dist/infrastructure/machine/storage.js +156 -0
- package/dist/infrastructure/machine/storage.js.map +1 -0
- package/dist/infrastructure/machine/types.d.ts +58 -0
- package/dist/infrastructure/machine/types.d.ts.map +1 -0
- package/dist/infrastructure/machine/types.js +11 -0
- package/dist/infrastructure/machine/types.js.map +1 -0
- package/dist/infrastructure/retry-queue.d.ts +17 -0
- package/dist/infrastructure/retry-queue.d.ts.map +1 -0
- package/dist/infrastructure/retry-queue.js +33 -0
- package/dist/infrastructure/retry-queue.js.map +1 -0
- package/dist/infrastructure/services/agent-process-manager/agent-process-manager.d.ts +142 -0
- package/dist/infrastructure/services/agent-process-manager/agent-process-manager.d.ts.map +1 -0
- package/dist/infrastructure/services/agent-process-manager/agent-process-manager.js +567 -0
- package/dist/infrastructure/services/agent-process-manager/agent-process-manager.js.map +1 -0
- package/dist/infrastructure/services/agent-process-manager/agent-process-manager.test.d.ts +2 -0
- package/dist/infrastructure/services/agent-process-manager/agent-process-manager.test.d.ts.map +1 -0
- package/dist/infrastructure/services/agent-process-manager/agent-process-manager.test.js +692 -0
- package/dist/infrastructure/services/agent-process-manager/agent-process-manager.test.js.map +1 -0
- package/dist/infrastructure/services/harness-spawning/harness-spawning-service.d.ts +47 -0
- package/dist/infrastructure/services/harness-spawning/harness-spawning-service.d.ts.map +1 -0
- package/dist/infrastructure/services/harness-spawning/harness-spawning-service.js +68 -0
- package/dist/infrastructure/services/harness-spawning/harness-spawning-service.js.map +1 -0
- package/dist/infrastructure/services/harness-spawning/harness-spawning-service.test.d.ts +2 -0
- package/dist/infrastructure/services/harness-spawning/harness-spawning-service.test.d.ts.map +1 -0
- package/dist/infrastructure/services/harness-spawning/harness-spawning-service.test.js +149 -0
- package/dist/infrastructure/services/harness-spawning/harness-spawning-service.test.js.map +1 -0
- package/dist/infrastructure/services/harness-spawning/index.d.ts +5 -0
- package/dist/infrastructure/services/harness-spawning/index.d.ts.map +1 -0
- package/dist/infrastructure/services/harness-spawning/index.js +3 -0
- package/dist/infrastructure/services/harness-spawning/index.js.map +1 -0
- package/dist/infrastructure/services/harness-spawning/rate-limiter.d.ts +45 -0
- package/dist/infrastructure/services/harness-spawning/rate-limiter.d.ts.map +1 -0
- package/dist/infrastructure/services/harness-spawning/rate-limiter.js +84 -0
- package/dist/infrastructure/services/harness-spawning/rate-limiter.js.map +1 -0
- package/dist/infrastructure/services/harness-spawning/rate-limiter.test.d.ts +2 -0
- package/dist/infrastructure/services/harness-spawning/rate-limiter.test.d.ts.map +1 -0
- package/dist/infrastructure/services/harness-spawning/rate-limiter.test.js +179 -0
- package/dist/infrastructure/services/harness-spawning/rate-limiter.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/base-cli-agent-service.d.ts +77 -0
- package/dist/infrastructure/services/remote-agents/base-cli-agent-service.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/base-cli-agent-service.js +149 -0
- package/dist/infrastructure/services/remote-agents/base-cli-agent-service.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/base-cli-agent-service.test.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/base-cli-agent-service.test.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/base-cli-agent-service.test.js +273 -0
- package/dist/infrastructure/services/remote-agents/base-cli-agent-service.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/claude/claude-code-agent-service.d.ts +30 -0
- package/dist/infrastructure/services/remote-agents/claude/claude-code-agent-service.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/claude/claude-code-agent-service.js +186 -0
- package/dist/infrastructure/services/remote-agents/claude/claude-code-agent-service.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/claude/claude-stream-reader.d.ts +42 -0
- package/dist/infrastructure/services/remote-agents/claude/claude-stream-reader.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/claude/claude-stream-reader.js +92 -0
- package/dist/infrastructure/services/remote-agents/claude/claude-stream-reader.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/claude/index.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/claude/index.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/claude/index.js +2 -0
- package/dist/infrastructure/services/remote-agents/claude/index.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-agent-service.d.ts +44 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-agent-service.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-agent-service.js +160 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-agent-service.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-stream-reader.d.ts +59 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-stream-reader.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-stream-reader.js +100 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-stream-reader.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-stream-reader.test.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-stream-reader.test.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-stream-reader.test.js +105 -0
- package/dist/infrastructure/services/remote-agents/copilot/copilot-stream-reader.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/copilot/index.d.ts +3 -0
- package/dist/infrastructure/services/remote-agents/copilot/index.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/copilot/index.js +3 -0
- package/dist/infrastructure/services/remote-agents/copilot/index.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-agent-service.d.ts +29 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-agent-service.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-agent-service.js +219 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-agent-service.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-agent-service.test.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-agent-service.test.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-agent-service.test.js +223 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-agent-service.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-stream-reader.d.ts +41 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-stream-reader.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-stream-reader.js +95 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-stream-reader.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-stream-reader.test.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-stream-reader.test.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-stream-reader.test.js +334 -0
- package/dist/infrastructure/services/remote-agents/cursor/cursor-stream-reader.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/index.d.ts +3 -0
- package/dist/infrastructure/services/remote-agents/cursor/index.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/cursor/index.js +2 -0
- package/dist/infrastructure/services/remote-agents/cursor/index.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/index.d.ts +8 -0
- package/dist/infrastructure/services/remote-agents/index.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/index.js +7 -0
- package/dist/infrastructure/services/remote-agents/index.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/init-registry.d.ts +3 -0
- package/dist/infrastructure/services/remote-agents/init-registry.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/init-registry.js +19 -0
- package/dist/infrastructure/services/remote-agents/init-registry.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/index.d.ts +4 -0
- package/dist/infrastructure/services/remote-agents/opencode/index.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/index.js +3 -0
- package/dist/infrastructure/services/remote-agents/opencode/index.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-agent-service.d.ts +32 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-agent-service.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-agent-service.js +225 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-agent-service.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-agent-service.test.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-agent-service.test.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-agent-service.test.js +226 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-agent-service.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-json-reader.d.ts +46 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-json-reader.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-json-reader.js +104 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-json-reader.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-json-reader.test.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-json-reader.test.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-json-reader.test.js +268 -0
- package/dist/infrastructure/services/remote-agents/opencode/opencode-json-reader.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/index.d.ts +3 -0
- package/dist/infrastructure/services/remote-agents/pi/index.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/index.js +2 -0
- package/dist/infrastructure/services/remote-agents/pi/index.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-agent-service.d.ts +35 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-agent-service.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-agent-service.js +253 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-agent-service.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-agent-service.test.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-agent-service.test.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-agent-service.test.js +348 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-agent-service.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-rpc-reader.d.ts +50 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-rpc-reader.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-rpc-reader.js +120 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-rpc-reader.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-rpc-reader.test.d.ts +2 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-rpc-reader.test.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-rpc-reader.test.js +288 -0
- package/dist/infrastructure/services/remote-agents/pi/pi-rpc-reader.test.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/registry.d.ts +8 -0
- package/dist/infrastructure/services/remote-agents/registry.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/registry.js +14 -0
- package/dist/infrastructure/services/remote-agents/registry.js.map +1 -0
- package/dist/infrastructure/services/remote-agents/remote-agent-service.d.ts +79 -0
- package/dist/infrastructure/services/remote-agents/remote-agent-service.d.ts.map +1 -0
- package/dist/infrastructure/services/remote-agents/remote-agent-service.js +9 -0
- package/dist/infrastructure/services/remote-agents/remote-agent-service.js.map +1 -0
- package/dist/infrastructure/services/workspace/command-discovery.d.ts +65 -0
- package/dist/infrastructure/services/workspace/command-discovery.d.ts.map +1 -0
- package/dist/infrastructure/services/workspace/command-discovery.js +193 -0
- package/dist/infrastructure/services/workspace/command-discovery.js.map +1 -0
- package/dist/infrastructure/services/workspace/command-discovery.test.d.ts +7 -0
- package/dist/infrastructure/services/workspace/command-discovery.test.d.ts.map +1 -0
- package/dist/infrastructure/services/workspace/command-discovery.test.js +182 -0
- package/dist/infrastructure/services/workspace/command-discovery.test.js.map +1 -0
- package/dist/infrastructure/services/workspace/file-tree-scanner.d.ts +47 -0
- package/dist/infrastructure/services/workspace/file-tree-scanner.d.ts.map +1 -0
- package/dist/infrastructure/services/workspace/file-tree-scanner.js +159 -0
- package/dist/infrastructure/services/workspace/file-tree-scanner.js.map +1 -0
- package/dist/infrastructure/services/workspace/file-tree-scanner.test.d.ts +2 -0
- package/dist/infrastructure/services/workspace/file-tree-scanner.test.d.ts.map +1 -0
- package/dist/infrastructure/services/workspace/file-tree-scanner.test.js +132 -0
- package/dist/infrastructure/services/workspace/file-tree-scanner.test.js.map +1 -0
- package/dist/infrastructure/services/workspace/workspace-resolver.d.ts +34 -0
- package/dist/infrastructure/services/workspace/workspace-resolver.d.ts.map +1 -0
- package/dist/infrastructure/services/workspace/workspace-resolver.js +187 -0
- package/dist/infrastructure/services/workspace/workspace-resolver.js.map +1 -0
- package/dist/infrastructure/services/workspace/workspace-resolver.test.d.ts +5 -0
- package/dist/infrastructure/services/workspace/workspace-resolver.test.d.ts.map +1 -0
- package/dist/infrastructure/services/workspace/workspace-resolver.test.js +152 -0
- package/dist/infrastructure/services/workspace/workspace-resolver.test.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/output.d.ts +50 -0
- package/dist/tools/output.d.ts.map +1 -0
- package/dist/tools/output.js +78 -0
- package/dist/tools/output.js.map +1 -0
- package/dist/tools/output.test.d.ts +8 -0
- package/dist/tools/output.test.d.ts.map +1 -0
- package/dist/tools/output.test.js +120 -0
- package/dist/tools/output.test.js.map +1 -0
- package/dist/tools/parse-pdf/deps.d.ts +42 -0
- package/dist/tools/parse-pdf/deps.d.ts.map +1 -0
- package/dist/tools/parse-pdf/deps.js +8 -0
- package/dist/tools/parse-pdf/deps.js.map +1 -0
- package/dist/tools/parse-pdf/index.d.ts +18 -0
- package/dist/tools/parse-pdf/index.d.ts.map +1 -0
- package/dist/tools/parse-pdf/index.js +160 -0
- package/dist/tools/parse-pdf/index.js.map +1 -0
- package/dist/tools/parse-pdf/index.test.d.ts +8 -0
- package/dist/tools/parse-pdf/index.test.d.ts.map +1 -0
- package/dist/tools/parse-pdf/index.test.js +183 -0
- package/dist/tools/parse-pdf/index.test.js.map +1 -0
- package/dist/tools/types.d.ts +12 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/convex-error.d.ts +19 -0
- package/dist/utils/convex-error.d.ts.map +1 -0
- package/dist/utils/convex-error.js +38 -0
- package/dist/utils/convex-error.js.map +1 -0
- package/dist/utils/convex-error.test.d.ts +7 -0
- package/dist/utils/convex-error.test.d.ts.map +1 -0
- package/dist/utils/convex-error.test.js +71 -0
- package/dist/utils/convex-error.test.js.map +1 -0
- package/dist/utils/error-formatting.d.ts +33 -0
- package/dist/utils/error-formatting.d.ts.map +1 -0
- package/dist/utils/error-formatting.js +96 -0
- package/dist/utils/error-formatting.js.map +1 -0
- package/dist/utils/file-content.d.ts +24 -0
- package/dist/utils/file-content.d.ts.map +1 -0
- package/dist/utils/file-content.js +35 -0
- package/dist/utils/file-content.js.map +1 -0
- package/dist/utils/serialization/decode/index.d.ts +71 -0
- package/dist/utils/serialization/decode/index.d.ts.map +1 -0
- package/dist/utils/serialization/decode/index.js +167 -0
- package/dist/utils/serialization/decode/index.js.map +1 -0
- package/dist/utils/serialization/decode/index.test.d.ts +5 -0
- package/dist/utils/serialization/decode/index.test.d.ts.map +1 -0
- package/dist/utils/serialization/decode/index.test.js +226 -0
- package/dist/utils/serialization/decode/index.test.js.map +1 -0
- package/dist/utils/stdin.d.ts +6 -0
- package/dist/utils/stdin.d.ts.map +1 -0
- package/dist/utils/stdin.js +19 -0
- package/dist/utils/stdin.js.map +1 -0
- package/dist/utils/terminal-safety.d.ts +7 -0
- package/dist/utils/terminal-safety.d.ts.map +1 -0
- package/dist/utils/terminal-safety.js +17 -0
- package/dist/utils/terminal-safety.js.map +1 -0
- package/dist/version.d.ts +14 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +43 -0
- package/dist/version.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,711 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git command execution wrappers.
|
|
3
|
+
*
|
|
4
|
+
* All functions return discriminated unions — no throws.
|
|
5
|
+
* Errors from git (non-zero exit) or missing git installation are
|
|
6
|
+
* captured and returned as `{ status: 'error' }` or `{ status: 'not_found' }`.
|
|
7
|
+
*/
|
|
8
|
+
import { exec } from 'node:child_process';
|
|
9
|
+
import { promisify } from 'node:util';
|
|
10
|
+
import { FULL_DIFF_MAX_BYTES } from './types.js';
|
|
11
|
+
const execAsync = promisify(exec);
|
|
12
|
+
// ─── Internal Helpers ────────────────────────────────────────────────────────
|
|
13
|
+
/**
|
|
14
|
+
* Run a git command in `cwd`.
|
|
15
|
+
* Returns `{ stdout, stderr }` on success, `{ error }` on failure.
|
|
16
|
+
* Never throws.
|
|
17
|
+
*/
|
|
18
|
+
async function runGit(args, cwd) {
|
|
19
|
+
try {
|
|
20
|
+
const result = await execAsync(`git ${args}`, {
|
|
21
|
+
cwd,
|
|
22
|
+
// Disable paging and colour for scriptable output
|
|
23
|
+
env: { ...process.env, GIT_TERMINAL_PROMPT: '0', GIT_PAGER: 'cat', NO_COLOR: '1' },
|
|
24
|
+
// Increase buffer for large diffs; we'll cap in the caller
|
|
25
|
+
maxBuffer: FULL_DIFF_MAX_BYTES + 64 * 1024,
|
|
26
|
+
});
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
return { error: err };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Returns true if the error message indicates git is not installed. */
|
|
34
|
+
function isGitNotInstalled(message) {
|
|
35
|
+
return (message.includes('command not found') ||
|
|
36
|
+
message.includes('ENOENT') ||
|
|
37
|
+
message.includes('not found') ||
|
|
38
|
+
message.includes("'git' is not recognized"));
|
|
39
|
+
}
|
|
40
|
+
/** Returns true if the error message indicates this is not a git repository. */
|
|
41
|
+
function isNotAGitRepo(message) {
|
|
42
|
+
return message.includes('not a git repository') || message.includes('Not a git repository');
|
|
43
|
+
}
|
|
44
|
+
/** Returns true if the error message indicates permission was denied. */
|
|
45
|
+
function isPermissionDenied(message) {
|
|
46
|
+
return message.includes('Permission denied') || message.includes('EACCES');
|
|
47
|
+
}
|
|
48
|
+
/** Returns true if the error indicates no commits exist yet (empty repo). */
|
|
49
|
+
function isEmptyRepo(stderr) {
|
|
50
|
+
return (stderr.includes('does not have any commits yet') ||
|
|
51
|
+
stderr.includes('no commits yet') ||
|
|
52
|
+
stderr.includes("ambiguous argument 'HEAD'") ||
|
|
53
|
+
stderr.includes('unknown revision or path'));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Classify a git error into a structured result type.
|
|
57
|
+
* Covers: git not installed, not a repo, permission denied, empty repo,
|
|
58
|
+
* or a generic error with the raw message.
|
|
59
|
+
*/
|
|
60
|
+
function classifyError(errMessage) {
|
|
61
|
+
if (isGitNotInstalled(errMessage)) {
|
|
62
|
+
return { status: 'error', message: 'git is not installed or not in PATH' };
|
|
63
|
+
}
|
|
64
|
+
if (isNotAGitRepo(errMessage)) {
|
|
65
|
+
return { status: 'not_found' };
|
|
66
|
+
}
|
|
67
|
+
if (isPermissionDenied(errMessage)) {
|
|
68
|
+
return { status: 'error', message: `Permission denied: ${errMessage}` };
|
|
69
|
+
}
|
|
70
|
+
return { status: 'error', message: errMessage.trim() };
|
|
71
|
+
}
|
|
72
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Returns `true` if `workingDir` is inside a git repository.
|
|
75
|
+
* Returns `false` for non-git directories, missing git, or any error.
|
|
76
|
+
*/
|
|
77
|
+
export async function isGitRepo(workingDir) {
|
|
78
|
+
const result = await runGit('rev-parse --git-dir', workingDir);
|
|
79
|
+
if ('error' in result)
|
|
80
|
+
return false;
|
|
81
|
+
return result.stdout.trim().length > 0;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Returns the current branch name for the repository at `workingDir`.
|
|
85
|
+
*
|
|
86
|
+
* For a detached HEAD, returns `{ status: 'available', branch: 'HEAD' }`.
|
|
87
|
+
* For a non-git directory, returns `{ status: 'not_found' }`.
|
|
88
|
+
*/
|
|
89
|
+
export async function getBranch(workingDir) {
|
|
90
|
+
const result = await runGit('rev-parse --abbrev-ref HEAD', workingDir);
|
|
91
|
+
if ('error' in result) {
|
|
92
|
+
const errMsg = result.error.message;
|
|
93
|
+
// Empty repo: HEAD reference doesn't exist yet
|
|
94
|
+
if (errMsg.includes('unknown revision') ||
|
|
95
|
+
errMsg.includes('No such file or directory') ||
|
|
96
|
+
errMsg.includes('does not have any commits')) {
|
|
97
|
+
return { status: 'available', branch: 'HEAD' };
|
|
98
|
+
}
|
|
99
|
+
return classifyError(errMsg);
|
|
100
|
+
}
|
|
101
|
+
const branch = result.stdout.trim();
|
|
102
|
+
if (!branch) {
|
|
103
|
+
return { status: 'error', message: 'git rev-parse returned empty output' };
|
|
104
|
+
}
|
|
105
|
+
return { status: 'available', branch };
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Returns `true` if the working tree has uncommitted changes (staged or unstaged).
|
|
109
|
+
* Returns `false` for a clean tree, empty repo, or non-git directory.
|
|
110
|
+
*/
|
|
111
|
+
export async function isDirty(workingDir) {
|
|
112
|
+
const result = await runGit('status --porcelain', workingDir);
|
|
113
|
+
if ('error' in result)
|
|
114
|
+
return false;
|
|
115
|
+
return result.stdout.trim().length > 0;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Parses `--stat` output into a `DiffStat`.
|
|
119
|
+
* Input: the summary line, e.g. "3 files changed, 45 insertions(+), 12 deletions(-)"
|
|
120
|
+
* Returns zero values if the tree is clean or the line cannot be parsed.
|
|
121
|
+
*
|
|
122
|
+
* Exported for direct unit testing.
|
|
123
|
+
*/
|
|
124
|
+
export function parseDiffStatLine(statLine) {
|
|
125
|
+
const filesMatch = statLine.match(/(\d+)\s+file/);
|
|
126
|
+
const insertMatch = statLine.match(/(\d+)\s+insertion/);
|
|
127
|
+
const deleteMatch = statLine.match(/(\d+)\s+deletion/);
|
|
128
|
+
return {
|
|
129
|
+
filesChanged: filesMatch ? parseInt(filesMatch[1], 10) : 0,
|
|
130
|
+
insertions: insertMatch ? parseInt(insertMatch[1], 10) : 0,
|
|
131
|
+
deletions: deleteMatch ? parseInt(deleteMatch[1], 10) : 0,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Returns diff statistics (files changed, insertions, deletions) for the current
|
|
136
|
+
* working tree against HEAD (`git diff HEAD --stat`).
|
|
137
|
+
*
|
|
138
|
+
* Returns zero-value stats for a clean tree (no changes).
|
|
139
|
+
*/
|
|
140
|
+
export async function getDiffStat(workingDir) {
|
|
141
|
+
const result = await runGit('diff HEAD --stat', workingDir);
|
|
142
|
+
if ('error' in result) {
|
|
143
|
+
const errMsg = result.error.message;
|
|
144
|
+
if (isEmptyRepo(result.error.message)) {
|
|
145
|
+
return { status: 'no_commits' };
|
|
146
|
+
}
|
|
147
|
+
const classified = classifyError(errMsg);
|
|
148
|
+
if (classified.status === 'not_found')
|
|
149
|
+
return { status: 'not_found' };
|
|
150
|
+
// Also check stderr embedded in error message for empty repo clues
|
|
151
|
+
return classified;
|
|
152
|
+
}
|
|
153
|
+
// git diff exits 0 for both clean and dirty trees
|
|
154
|
+
const output = result.stdout;
|
|
155
|
+
const stderr = result.stderr;
|
|
156
|
+
if (isEmptyRepo(stderr)) {
|
|
157
|
+
return { status: 'no_commits' };
|
|
158
|
+
}
|
|
159
|
+
if (!output.trim()) {
|
|
160
|
+
// Clean tree — zero changes
|
|
161
|
+
return {
|
|
162
|
+
status: 'available',
|
|
163
|
+
diffStat: { filesChanged: 0, insertions: 0, deletions: 0 },
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
// The summary line is the last non-empty line
|
|
167
|
+
const lines = output.trim().split('\n');
|
|
168
|
+
const summaryLine = lines[lines.length - 1] ?? '';
|
|
169
|
+
const diffStat = parseDiffStatLine(summaryLine);
|
|
170
|
+
return { status: 'available', diffStat };
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Returns the full unified diff for the current working tree against HEAD.
|
|
174
|
+
* Content is capped at `FULL_DIFF_MAX_BYTES` (500 KB).
|
|
175
|
+
*
|
|
176
|
+
* Note: Binary files appear as "Binary files differ" in the output — handled
|
|
177
|
+
* transparently (no special treatment needed; output is valid UTF-8 text).
|
|
178
|
+
*/
|
|
179
|
+
export async function getFullDiff(workingDir) {
|
|
180
|
+
const result = await runGit('diff HEAD', workingDir);
|
|
181
|
+
if ('error' in result) {
|
|
182
|
+
const errMsg = result.error.message;
|
|
183
|
+
if (isEmptyRepo(errMsg)) {
|
|
184
|
+
return { status: 'no_commits' };
|
|
185
|
+
}
|
|
186
|
+
const classified = classifyError(errMsg);
|
|
187
|
+
if (classified.status === 'not_found')
|
|
188
|
+
return { status: 'not_found' };
|
|
189
|
+
return classified;
|
|
190
|
+
}
|
|
191
|
+
const stderr = result.stderr;
|
|
192
|
+
if (isEmptyRepo(stderr)) {
|
|
193
|
+
return { status: 'no_commits' };
|
|
194
|
+
}
|
|
195
|
+
const raw = result.stdout;
|
|
196
|
+
const byteLength = Buffer.byteLength(raw, 'utf8');
|
|
197
|
+
if (byteLength > FULL_DIFF_MAX_BYTES) {
|
|
198
|
+
// Truncate at a safe character boundary
|
|
199
|
+
const truncated = Buffer.from(raw, 'utf8').subarray(0, FULL_DIFF_MAX_BYTES).toString('utf8');
|
|
200
|
+
return { status: 'truncated', content: truncated, truncated: true };
|
|
201
|
+
}
|
|
202
|
+
return { status: 'available', content: raw, truncated: false };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Returns diff statistics for a PR (diff between origin/<baseBranch> and HEAD).
|
|
206
|
+
* Uses three-dot syntax to diff from the merge-base.
|
|
207
|
+
*/
|
|
208
|
+
export async function getPRDiffStat(workingDir, baseBranch) {
|
|
209
|
+
const result = await runGit(`diff --stat origin/${baseBranch}...HEAD`, workingDir);
|
|
210
|
+
if ('error' in result) {
|
|
211
|
+
const errMsg = result.error.message;
|
|
212
|
+
if (isEmptyRepo(errMsg)) {
|
|
213
|
+
return { status: 'no_commits' };
|
|
214
|
+
}
|
|
215
|
+
const classified = classifyError(errMsg);
|
|
216
|
+
if (classified.status === 'not_found')
|
|
217
|
+
return { status: 'not_found' };
|
|
218
|
+
return classified;
|
|
219
|
+
}
|
|
220
|
+
const output = result.stdout;
|
|
221
|
+
const stderr = result.stderr;
|
|
222
|
+
if (isEmptyRepo(stderr)) {
|
|
223
|
+
return { status: 'no_commits' };
|
|
224
|
+
}
|
|
225
|
+
if (!output.trim()) {
|
|
226
|
+
return {
|
|
227
|
+
status: 'available',
|
|
228
|
+
diffStat: { filesChanged: 0, insertions: 0, deletions: 0 },
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const lines = output.trim().split('\n');
|
|
232
|
+
const summaryLine = lines[lines.length - 1] ?? '';
|
|
233
|
+
const diffStat = parseDiffStatLine(summaryLine);
|
|
234
|
+
return { status: 'available', diffStat };
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Returns the full unified PR diff (diff between origin/<baseBranch> and HEAD).
|
|
238
|
+
* Uses three-dot syntax to diff from the merge-base.
|
|
239
|
+
* Content is capped at `FULL_DIFF_MAX_BYTES` (500 KB).
|
|
240
|
+
*/
|
|
241
|
+
export async function getPRDiff(workingDir, baseBranch) {
|
|
242
|
+
const result = await runGit(`diff origin/${baseBranch}...HEAD`, workingDir);
|
|
243
|
+
if ('error' in result) {
|
|
244
|
+
const errMsg = result.error.message;
|
|
245
|
+
if (isEmptyRepo(errMsg)) {
|
|
246
|
+
return { status: 'no_commits' };
|
|
247
|
+
}
|
|
248
|
+
const classified = classifyError(errMsg);
|
|
249
|
+
if (classified.status === 'not_found')
|
|
250
|
+
return { status: 'not_found' };
|
|
251
|
+
return classified;
|
|
252
|
+
}
|
|
253
|
+
const stderr = result.stderr;
|
|
254
|
+
if (isEmptyRepo(stderr)) {
|
|
255
|
+
return { status: 'no_commits' };
|
|
256
|
+
}
|
|
257
|
+
const raw = result.stdout;
|
|
258
|
+
const byteLength = Buffer.byteLength(raw, 'utf8');
|
|
259
|
+
if (byteLength > FULL_DIFF_MAX_BYTES) {
|
|
260
|
+
const truncated = Buffer.from(raw, 'utf8').subarray(0, FULL_DIFF_MAX_BYTES).toString('utf8');
|
|
261
|
+
return { status: 'truncated', content: truncated, truncated: true };
|
|
262
|
+
}
|
|
263
|
+
return { status: 'available', content: raw, truncated: false };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Returns the diff for a specific PR by number using `gh pr diff <number>`.
|
|
267
|
+
* Content is capped at `FULL_DIFF_MAX_BYTES` (500 KB).
|
|
268
|
+
*/
|
|
269
|
+
export async function getPRDiffByNumber(cwd, prNumber) {
|
|
270
|
+
const repoSlug = await getOriginRepoSlug(cwd);
|
|
271
|
+
const repoFlag = repoSlug ? ` --repo ${JSON.stringify(repoSlug)}` : '';
|
|
272
|
+
const result = await runCommand(`gh pr diff ${prNumber}${repoFlag}`, cwd);
|
|
273
|
+
if ('error' in result) {
|
|
274
|
+
return { status: 'error', message: result.error.message };
|
|
275
|
+
}
|
|
276
|
+
const raw = result.stdout;
|
|
277
|
+
if (!raw.trim()) {
|
|
278
|
+
return { status: 'available', content: '', truncated: false };
|
|
279
|
+
}
|
|
280
|
+
const byteLength = Buffer.byteLength(raw, 'utf8');
|
|
281
|
+
if (byteLength > FULL_DIFF_MAX_BYTES) {
|
|
282
|
+
const truncated = Buffer.from(raw, 'utf8').subarray(0, FULL_DIFF_MAX_BYTES).toString('utf8');
|
|
283
|
+
return { status: 'truncated', content: truncated, truncated: true };
|
|
284
|
+
}
|
|
285
|
+
return { status: 'available', content: raw, truncated: false };
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Returns up to `count` recent commits from the current branch.
|
|
289
|
+
* Default: 20 commits. Optional `skip` to paginate (0-based offset).
|
|
290
|
+
*
|
|
291
|
+
* Returns an empty array for an empty repository (no commits).
|
|
292
|
+
* Returns an empty array for non-git directories (does not throw).
|
|
293
|
+
*/
|
|
294
|
+
export async function getRecentCommits(workingDir, count = 20, skip = 0) {
|
|
295
|
+
// Use a null-byte separator to safely handle multi-line messages
|
|
296
|
+
const format = '%H%x00%h%x00%s%x00%an%x00%aI';
|
|
297
|
+
const skipArg = skip > 0 ? ` --skip=${skip}` : '';
|
|
298
|
+
const result = await runGit(`log -${count}${skipArg} --format=${format}`, workingDir);
|
|
299
|
+
if ('error' in result) {
|
|
300
|
+
// Empty repo or non-git directory — return empty list, not an error
|
|
301
|
+
return [];
|
|
302
|
+
}
|
|
303
|
+
const output = result.stdout.trim();
|
|
304
|
+
if (!output)
|
|
305
|
+
return [];
|
|
306
|
+
const commits = [];
|
|
307
|
+
for (const line of output.split('\n')) {
|
|
308
|
+
const trimmed = line.trim();
|
|
309
|
+
if (!trimmed)
|
|
310
|
+
continue;
|
|
311
|
+
const parts = trimmed.split('\x00');
|
|
312
|
+
if (parts.length !== 5)
|
|
313
|
+
continue;
|
|
314
|
+
const [sha, shortSha, message, author, date] = parts;
|
|
315
|
+
commits.push({ sha, shortSha, message, author, date });
|
|
316
|
+
}
|
|
317
|
+
return commits;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Returns the full diff for a specific commit SHA (`git show <sha>`).
|
|
321
|
+
* Content is capped at `FULL_DIFF_MAX_BYTES` (500 KB).
|
|
322
|
+
*
|
|
323
|
+
* Returns `{ status: 'not_found' }` if the SHA does not exist in the
|
|
324
|
+
* repository, or if the repository has no commits yet (empty repo).
|
|
325
|
+
*/
|
|
326
|
+
export async function getCommitDetail(workingDir, sha) {
|
|
327
|
+
// --format="" suppresses the commit header; we only want the diff
|
|
328
|
+
const result = await runGit(`show ${sha} --format="" --stat -p`, workingDir);
|
|
329
|
+
if ('error' in result) {
|
|
330
|
+
const errMsg = result.error.message;
|
|
331
|
+
// Non-git directory: return not_found
|
|
332
|
+
const classified = classifyError(errMsg);
|
|
333
|
+
if (classified.status === 'not_found')
|
|
334
|
+
return { status: 'not_found' };
|
|
335
|
+
// Empty repo or non-existent SHA → not_found.
|
|
336
|
+
// Distinguishing "sha doesn't exist" from "no commits yet" is not useful to callers.
|
|
337
|
+
if (isEmptyRepo(errMsg) ||
|
|
338
|
+
errMsg.includes('unknown revision') ||
|
|
339
|
+
errMsg.includes('bad object') ||
|
|
340
|
+
errMsg.includes('does not exist')) {
|
|
341
|
+
return { status: 'not_found' };
|
|
342
|
+
}
|
|
343
|
+
return classified;
|
|
344
|
+
}
|
|
345
|
+
const raw = result.stdout;
|
|
346
|
+
const byteLength = Buffer.byteLength(raw, 'utf8');
|
|
347
|
+
if (byteLength > FULL_DIFF_MAX_BYTES) {
|
|
348
|
+
const truncated = Buffer.from(raw, 'utf8').subarray(0, FULL_DIFF_MAX_BYTES).toString('utf8');
|
|
349
|
+
return { status: 'truncated', content: truncated, truncated: true };
|
|
350
|
+
}
|
|
351
|
+
return { status: 'available', content: raw, truncated: false };
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Returns commit metadata (message, author, date) for a specific SHA.
|
|
355
|
+
*
|
|
356
|
+
* Uses `git log -1 --format=...` with null-byte separators for safe parsing.
|
|
357
|
+
* Returns `null` if the SHA is not found or the directory is not a git repo.
|
|
358
|
+
*/
|
|
359
|
+
export async function getCommitMetadata(workingDir, sha) {
|
|
360
|
+
const format = '%s%x00%an%x00%aI';
|
|
361
|
+
const result = await runGit(`log -1 --format=${format} ${sha}`, workingDir);
|
|
362
|
+
if ('error' in result)
|
|
363
|
+
return null;
|
|
364
|
+
const output = result.stdout.trim();
|
|
365
|
+
if (!output)
|
|
366
|
+
return null;
|
|
367
|
+
const parts = output.split('\x00');
|
|
368
|
+
if (parts.length !== 3)
|
|
369
|
+
return null;
|
|
370
|
+
return { message: parts[0], author: parts[1], date: parts[2] };
|
|
371
|
+
}
|
|
372
|
+
// ─── GitHub CLI Integration ──────────────────────────────────────────────────
|
|
373
|
+
/**
|
|
374
|
+
* Run an arbitrary command in `cwd`.
|
|
375
|
+
* Returns `{ stdout, stderr }` on success, `{ error }` on failure.
|
|
376
|
+
* Never throws.
|
|
377
|
+
*/
|
|
378
|
+
async function runCommand(command, cwd) {
|
|
379
|
+
try {
|
|
380
|
+
const result = await execAsync(command, {
|
|
381
|
+
cwd,
|
|
382
|
+
env: { ...process.env, NO_COLOR: '1' },
|
|
383
|
+
timeout: 15_000, // 15s timeout for gh commands
|
|
384
|
+
});
|
|
385
|
+
return result;
|
|
386
|
+
}
|
|
387
|
+
catch (err) {
|
|
388
|
+
return { error: err };
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Parse a git remote URL into an `owner/repo` slug.
|
|
393
|
+
* Handles both HTTPS and SSH URL formats, with or without `.git` suffix.
|
|
394
|
+
*
|
|
395
|
+
* Examples:
|
|
396
|
+
* https://github.com/owner/repo.git → owner/repo
|
|
397
|
+
* https://github.com/owner/repo → owner/repo
|
|
398
|
+
* git@github.com:owner/repo.git → owner/repo
|
|
399
|
+
* git@github.com:owner/repo → owner/repo
|
|
400
|
+
*
|
|
401
|
+
* Returns `null` if the URL cannot be parsed.
|
|
402
|
+
*
|
|
403
|
+
* Exported for unit testing.
|
|
404
|
+
*/
|
|
405
|
+
export function parseRepoSlug(remoteUrl) {
|
|
406
|
+
const trimmed = remoteUrl.trim();
|
|
407
|
+
// HTTPS format: https://github.com/owner/repo.git or https://github.com/owner/repo
|
|
408
|
+
const httpsMatch = trimmed.match(/https?:\/\/[^/]+\/([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
409
|
+
if (httpsMatch && httpsMatch[1] && httpsMatch[2]) {
|
|
410
|
+
return `${httpsMatch[1]}/${httpsMatch[2]}`;
|
|
411
|
+
}
|
|
412
|
+
// SSH format: git@github.com:owner/repo.git or git@github.com:owner/repo
|
|
413
|
+
const sshMatch = trimmed.match(/git@[^:]+:([^/]+)\/([^/]+?)(?:\.git)?$/);
|
|
414
|
+
if (sshMatch && sshMatch[1] && sshMatch[2]) {
|
|
415
|
+
return `${sshMatch[1]}/${sshMatch[2]}`;
|
|
416
|
+
}
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Get the `owner/repo` slug for the `origin` remote of the repository at `cwd`.
|
|
421
|
+
*
|
|
422
|
+
* Returns `null` if:
|
|
423
|
+
* - The `origin` remote does not exist
|
|
424
|
+
* - The URL cannot be parsed
|
|
425
|
+
* - Any error occurs (graceful degradation)
|
|
426
|
+
*
|
|
427
|
+
* Exported for unit testing.
|
|
428
|
+
*/
|
|
429
|
+
export async function getOriginRepoSlug(cwd) {
|
|
430
|
+
const result = await runGit('remote get-url origin', cwd);
|
|
431
|
+
if ('error' in result)
|
|
432
|
+
return null;
|
|
433
|
+
const url = result.stdout.trim();
|
|
434
|
+
if (!url)
|
|
435
|
+
return null;
|
|
436
|
+
return parseRepoSlug(url);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Get open pull requests for the given branch using `gh pr list`.
|
|
440
|
+
*
|
|
441
|
+
* Returns an empty array if:
|
|
442
|
+
* - The `gh` CLI is not installed
|
|
443
|
+
* - The user is not authenticated with `gh`
|
|
444
|
+
* - There are no open PRs for the branch
|
|
445
|
+
* - Any error occurs (graceful degradation)
|
|
446
|
+
*/
|
|
447
|
+
export async function getOpenPRsForBranch(cwd, branch) {
|
|
448
|
+
// Resolve the origin repo slug to target the correct repository
|
|
449
|
+
const repoSlug = await getOriginRepoSlug(cwd);
|
|
450
|
+
const repoFlag = repoSlug ? ` --repo ${JSON.stringify(repoSlug)}` : '';
|
|
451
|
+
// Extract owner from repo slug (e.g., 'owner/repo' → 'owner')
|
|
452
|
+
const repoOwner = repoSlug?.split('/')[0] ?? null;
|
|
453
|
+
const result = await runCommand(`gh pr list --head ${JSON.stringify(branch)} --state open --author @me --json number,title,url,headRefName,state,headRepositoryOwner --limit 5${repoFlag}`, cwd);
|
|
454
|
+
if ('error' in result) {
|
|
455
|
+
// gh not installed, not authenticated, or other failure — degrade gracefully
|
|
456
|
+
return [];
|
|
457
|
+
}
|
|
458
|
+
const output = result.stdout.trim();
|
|
459
|
+
if (!output)
|
|
460
|
+
return [];
|
|
461
|
+
try {
|
|
462
|
+
const parsed = JSON.parse(output);
|
|
463
|
+
if (!Array.isArray(parsed))
|
|
464
|
+
return [];
|
|
465
|
+
return parsed
|
|
466
|
+
.filter((item) => typeof item === 'object' &&
|
|
467
|
+
item !== null &&
|
|
468
|
+
typeof item.number === 'number' &&
|
|
469
|
+
typeof item.title === 'string' &&
|
|
470
|
+
typeof item.url === 'string' &&
|
|
471
|
+
typeof item.headRefName === 'string' &&
|
|
472
|
+
typeof item.state === 'string')
|
|
473
|
+
.filter((item) => {
|
|
474
|
+
// Filter out cross-fork PRs: only include PRs from the same repo owner
|
|
475
|
+
// This prevents PRs from forks (e.g., fork's main → upstream's main) from showing
|
|
476
|
+
if (!repoOwner || !item.headRepositoryOwner?.login)
|
|
477
|
+
return true;
|
|
478
|
+
return item.headRepositoryOwner.login === repoOwner;
|
|
479
|
+
})
|
|
480
|
+
.map((item) => ({
|
|
481
|
+
number: item.number,
|
|
482
|
+
title: item.title,
|
|
483
|
+
url: item.url,
|
|
484
|
+
headRefName: item.headRefName,
|
|
485
|
+
state: item.state,
|
|
486
|
+
}));
|
|
487
|
+
}
|
|
488
|
+
catch {
|
|
489
|
+
// JSON parse failure — degrade gracefully
|
|
490
|
+
return [];
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
function isGHPRItem(item) {
|
|
494
|
+
return (typeof item === 'object' &&
|
|
495
|
+
item !== null &&
|
|
496
|
+
typeof item.number === 'number' &&
|
|
497
|
+
typeof item.title === 'string');
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Get all pull requests (open, closed, merged) for the repository using `gh pr list`.
|
|
501
|
+
* Returns up to 20 most recent PRs.
|
|
502
|
+
*/
|
|
503
|
+
export async function getAllPRs(cwd) {
|
|
504
|
+
const repoSlug = await getOriginRepoSlug(cwd);
|
|
505
|
+
const repoFlag = repoSlug ? ` --repo ${JSON.stringify(repoSlug)}` : '';
|
|
506
|
+
const result = await runCommand(`gh pr list --limit 20 --state all --json number,title,state,headRefName,baseRefName,url,author,createdAt,updatedAt,mergedAt,closedAt,isDraft${repoFlag}`, cwd);
|
|
507
|
+
if ('error' in result) {
|
|
508
|
+
return [];
|
|
509
|
+
}
|
|
510
|
+
const output = result.stdout.trim();
|
|
511
|
+
if (!output)
|
|
512
|
+
return [];
|
|
513
|
+
try {
|
|
514
|
+
const parsed = JSON.parse(output);
|
|
515
|
+
if (!Array.isArray(parsed))
|
|
516
|
+
return [];
|
|
517
|
+
return parsed
|
|
518
|
+
.filter(isGHPRItem)
|
|
519
|
+
.map((item) => {
|
|
520
|
+
const author = typeof item.author === 'object' && item.author !== null
|
|
521
|
+
? item.author.login
|
|
522
|
+
: undefined;
|
|
523
|
+
return {
|
|
524
|
+
number: item.number,
|
|
525
|
+
title: item.title,
|
|
526
|
+
url: item.url ?? '',
|
|
527
|
+
headRefName: item.headRefName ?? '',
|
|
528
|
+
baseRefName: item.baseRefName ?? 'main',
|
|
529
|
+
state: item.state ?? 'OPEN',
|
|
530
|
+
author,
|
|
531
|
+
createdAt: item.createdAt ?? undefined,
|
|
532
|
+
updatedAt: item.updatedAt ?? undefined,
|
|
533
|
+
mergedAt: item.mergedAt ?? null,
|
|
534
|
+
closedAt: item.closedAt ?? null,
|
|
535
|
+
isDraft: item.isDraft ?? false,
|
|
536
|
+
};
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
catch {
|
|
540
|
+
return [];
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Get the list of commits for a specific PR number.
|
|
545
|
+
* Uses `gh pr view <number> --json commits`.
|
|
546
|
+
*/
|
|
547
|
+
export async function getPRCommits(cwd, prNumber) {
|
|
548
|
+
const repoSlug = await getOriginRepoSlug(cwd);
|
|
549
|
+
const repoFlag = repoSlug ? ` --repo ${JSON.stringify(repoSlug)}` : '';
|
|
550
|
+
const result = await runCommand(`gh pr view ${prNumber} --json commits${repoFlag}`, cwd);
|
|
551
|
+
if ('error' in result) {
|
|
552
|
+
return [];
|
|
553
|
+
}
|
|
554
|
+
const output = result.stdout.trim();
|
|
555
|
+
if (!output)
|
|
556
|
+
return [];
|
|
557
|
+
try {
|
|
558
|
+
const parsed = JSON.parse(output);
|
|
559
|
+
if (typeof parsed !== 'object' || parsed === null || !('commits' in parsed))
|
|
560
|
+
return [];
|
|
561
|
+
const commits = parsed.commits;
|
|
562
|
+
if (!Array.isArray(commits))
|
|
563
|
+
return [];
|
|
564
|
+
return commits.map((c) => {
|
|
565
|
+
const commit = c;
|
|
566
|
+
const oid = typeof commit.oid === 'string' ? commit.oid : '';
|
|
567
|
+
const headline = typeof commit.messageHeadline === 'string' ? commit.messageHeadline : '';
|
|
568
|
+
const date = typeof commit.committedDate === 'string' ? commit.committedDate : '';
|
|
569
|
+
// Authors array
|
|
570
|
+
let authorLogin = '';
|
|
571
|
+
if (Array.isArray(commit.authors) && commit.authors.length > 0) {
|
|
572
|
+
const first = commit.authors[0];
|
|
573
|
+
authorLogin = typeof first.login === 'string' ? first.login : (typeof first.name === 'string' ? first.name : '');
|
|
574
|
+
}
|
|
575
|
+
return {
|
|
576
|
+
sha: oid,
|
|
577
|
+
shortSha: oid.slice(0, 7),
|
|
578
|
+
message: headline,
|
|
579
|
+
author: authorLogin,
|
|
580
|
+
date,
|
|
581
|
+
};
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
catch {
|
|
585
|
+
return [];
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Get all configured git remotes for the repository at `cwd`.
|
|
590
|
+
*
|
|
591
|
+
* Runs `git remote -v` and deduplicates (keeping fetch entries).
|
|
592
|
+
* Returns an empty array if no remotes are configured or the command fails.
|
|
593
|
+
*/
|
|
594
|
+
export async function getRemotes(cwd) {
|
|
595
|
+
const result = await runGit('remote -v', cwd);
|
|
596
|
+
if ('error' in result)
|
|
597
|
+
return [];
|
|
598
|
+
if (!result.stdout.trim())
|
|
599
|
+
return [];
|
|
600
|
+
const lines = result.stdout.trim().split('\n');
|
|
601
|
+
const seen = new Set();
|
|
602
|
+
const remotes = [];
|
|
603
|
+
for (const line of lines) {
|
|
604
|
+
// Format: "origin\thttps://github.com/user/repo.git (fetch)"
|
|
605
|
+
const match = line.match(/^(\S+)\s+(\S+)\s+\((\w+)\)$/);
|
|
606
|
+
if (!match)
|
|
607
|
+
continue;
|
|
608
|
+
const [, name, url, type] = match;
|
|
609
|
+
if (!name || !url)
|
|
610
|
+
continue;
|
|
611
|
+
// Deduplicate — prefer fetch entry (listed first)
|
|
612
|
+
if (type === 'fetch' && !seen.has(name)) {
|
|
613
|
+
seen.add(name);
|
|
614
|
+
remotes.push({ name, url });
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
return remotes;
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Returns the number of commits on the current branch that are ahead of the
|
|
621
|
+
* tracking remote branch (i.e. unpushed commits).
|
|
622
|
+
*
|
|
623
|
+
* Uses `git rev-list --count @{upstream}..HEAD` which counts commits reachable
|
|
624
|
+
* from HEAD but not from the upstream tracking branch.
|
|
625
|
+
*
|
|
626
|
+
* Returns 0 if:
|
|
627
|
+
* - There is no upstream configured for the current branch
|
|
628
|
+
* - The repository has no commits
|
|
629
|
+
* - The directory is not a git repository
|
|
630
|
+
* - Any other error occurs
|
|
631
|
+
*
|
|
632
|
+
* This is intentionally lenient — unpushed count is supplementary info and
|
|
633
|
+
* should never cause the git state push to fail.
|
|
634
|
+
*/
|
|
635
|
+
export async function getCommitsAhead(workingDir) {
|
|
636
|
+
const result = await runGit('rev-list --count @{upstream}..HEAD', workingDir);
|
|
637
|
+
if ('error' in result)
|
|
638
|
+
return 0;
|
|
639
|
+
const count = parseInt(result.stdout.trim(), 10);
|
|
640
|
+
return Number.isNaN(count) ? 0 : count;
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Get CI/CD commit status checks for a given ref (branch or SHA).
|
|
644
|
+
*
|
|
645
|
+
* Uses `gh api` to fetch check runs and combined commit status.
|
|
646
|
+
* Returns null if `gh` is unavailable or any error occurs (non-blocking).
|
|
647
|
+
*/
|
|
648
|
+
export async function getCommitStatusChecks(cwd, ref) {
|
|
649
|
+
const repoSlug = await getOriginRepoSlug(cwd);
|
|
650
|
+
if (!repoSlug)
|
|
651
|
+
return null;
|
|
652
|
+
try {
|
|
653
|
+
// Fetch check runs and combined status in parallel
|
|
654
|
+
const [checkRunsResult, statusResult] = await Promise.all([
|
|
655
|
+
runCommand(`gh api repos/${repoSlug}/commits/${encodeURIComponent(ref)}/check-runs --jq '{check_runs: [.check_runs[] | {name: .name, status: .status, conclusion: .conclusion}], total_count: .total_count}'`, cwd),
|
|
656
|
+
runCommand(`gh api repos/${repoSlug}/commits/${encodeURIComponent(ref)}/status --jq '.state'`, cwd),
|
|
657
|
+
]);
|
|
658
|
+
if ('error' in checkRunsResult || 'error' in statusResult)
|
|
659
|
+
return null;
|
|
660
|
+
const checkRunsData = JSON.parse(checkRunsResult.stdout.trim());
|
|
661
|
+
const combinedState = statusResult.stdout.trim() || 'pending';
|
|
662
|
+
// Determine overall state: prefer check runs conclusion over legacy status API
|
|
663
|
+
let state = combinedState;
|
|
664
|
+
if (checkRunsData.total_count > 0) {
|
|
665
|
+
const conclusions = checkRunsData.check_runs.map((cr) => cr.conclusion);
|
|
666
|
+
if (conclusions.some((c) => c === 'failure' || c === 'timed_out')) {
|
|
667
|
+
state = 'failure';
|
|
668
|
+
}
|
|
669
|
+
else if (conclusions.every((c) => c === 'success' || c === 'skipped' || c === 'neutral')) {
|
|
670
|
+
state = 'success';
|
|
671
|
+
}
|
|
672
|
+
else if (checkRunsData.check_runs.some((cr) => cr.status !== 'completed')) {
|
|
673
|
+
state = 'pending';
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
return {
|
|
677
|
+
state,
|
|
678
|
+
checkRuns: checkRunsData.check_runs.map((cr) => ({
|
|
679
|
+
name: cr.name,
|
|
680
|
+
status: cr.status,
|
|
681
|
+
conclusion: cr.conclusion,
|
|
682
|
+
})),
|
|
683
|
+
totalCount: checkRunsData.total_count,
|
|
684
|
+
};
|
|
685
|
+
}
|
|
686
|
+
catch {
|
|
687
|
+
return null;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* Get the default branch name for the repository (e.g. 'main', 'master').
|
|
692
|
+
*
|
|
693
|
+
* Uses `gh api` to query the repo metadata.
|
|
694
|
+
* Returns null if `gh` is unavailable or any error occurs.
|
|
695
|
+
*/
|
|
696
|
+
export async function getDefaultBranch(cwd) {
|
|
697
|
+
const repoSlug = await getOriginRepoSlug(cwd);
|
|
698
|
+
if (!repoSlug)
|
|
699
|
+
return null;
|
|
700
|
+
try {
|
|
701
|
+
const result = await runCommand(`gh api repos/${repoSlug} --jq '.default_branch'`, cwd);
|
|
702
|
+
if ('error' in result)
|
|
703
|
+
return null;
|
|
704
|
+
const branch = result.stdout.trim();
|
|
705
|
+
return branch || null;
|
|
706
|
+
}
|
|
707
|
+
catch {
|
|
708
|
+
return null;
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
//# sourceMappingURL=git-reader.js.map
|