specrails-desktop 2.36.0 → 2.42.2
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/README.md +94 -247
- package/client/dist/assets/ActivityFeedPage-DoEMumQS.js +1 -0
- package/client/dist/assets/AgentBrowserCapture-DIh4K0gh.js +1 -0
- package/client/dist/assets/AgentModeAnalyticsPane-mbq4WEoO.js +2 -0
- package/client/dist/assets/AgentModeCodePane-CKh7zuA4.js +2 -0
- package/client/dist/assets/AgentModeJobsPane-BDokPiLJ.js +1 -0
- package/client/dist/assets/AgentsPage-BFVAZbBj.js +87 -0
- package/client/dist/assets/AnalyticsPage-3Y9LuWwz.js +1 -0
- package/client/dist/assets/CodePage-C9KyuV_C.js +3 -0
- package/client/dist/assets/DesktopAnalyticsPage-Bhi54bXQ.js +1 -0
- package/client/dist/assets/{DocsDialog-C76VdBJC.js → DocsDialog-Dj6mt4ga.js} +2 -2
- package/client/dist/assets/{DocsPage-ziMlj6B6.js → DocsPage-24yWglNI.js} +1 -1
- package/client/dist/assets/ExportDropdown-ophapHrT.js +1 -0
- package/client/dist/assets/InteractiveJobComposer-C1ucmxQh.js +19 -0
- package/client/dist/assets/JobDetailModal-DNWmgVHD.js +1 -0
- package/client/dist/assets/JobDetailPage-BcajZyuu.js +1 -0
- package/client/dist/assets/JobsPage-B9nTZw6e.js +1 -0
- package/client/dist/assets/LoopBuilderPage-Oc48iOFW.js +7 -0
- package/client/dist/assets/LoopPreviewModal-ae0Fr6SU.js +1 -0
- package/client/dist/assets/LoopsPage-CUEqzUBI.js +1 -0
- package/client/dist/assets/MinimizedChatsContext-Deg39peL.js +1 -0
- package/client/dist/assets/PluginsPage-C1xtARIx.js +2 -0
- package/client/dist/assets/ProjectSettingsDialog-JZzrXFBN.js +1 -0
- package/client/dist/assets/RepositoryDeliveries-CSDsiVUz.js +5 -0
- package/client/dist/assets/RepositoryScopeSelector-D-RCaknl.js +1 -0
- package/client/dist/assets/ReviewPacketPage-x5EfGTiL.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-BSyuZxGq.js +1 -0
- package/client/dist/assets/TicketDetailModalContext-DqyF0so-.js +14 -0
- package/client/dist/assets/Trans-SnMX4MhW.js +1 -0
- package/client/dist/assets/agent-BdT0SB1D.js +1 -0
- package/client/dist/assets/agent-Bh9K7iEt.js +1 -0
- package/client/dist/assets/agent-C4ibdFk9.js +1 -0
- package/client/dist/assets/agent-CSFY22Zo.js +1 -0
- package/client/dist/assets/agent-DAnqxUn8.js +1 -0
- package/client/dist/assets/agent-DTQiu0Mi.js +1 -0
- package/client/dist/assets/agent-T54WuR_Y.js +1 -0
- package/client/dist/assets/agent-i75WDZOA.js +1 -0
- package/client/dist/assets/browser-05vRDg_y.js +1 -0
- package/client/dist/assets/browser-Bulb-cB1.js +1 -0
- package/client/dist/assets/browser-C7f-Jsg1.js +1 -0
- package/client/dist/assets/browser-CG0PE1j_.js +1 -0
- package/client/dist/assets/browser-CMzaqAjo.js +1 -0
- package/client/dist/assets/browser-DMajYdNX.js +1 -0
- package/client/dist/assets/browser-DxcOHrdP.js +1 -0
- package/client/dist/assets/browser-ObE7xVo3.js +1 -0
- package/client/dist/assets/builder-765NeYTp.js +1 -0
- package/client/dist/assets/builder-8MG3V6ea.js +1 -0
- package/client/dist/assets/builder-B-1UBs5K.js +1 -0
- package/client/dist/assets/builder-BTiGnPT0.js +1 -0
- package/client/dist/assets/builder-Cx9Rz-7u.js +1 -0
- package/client/dist/assets/builder-DKFMELBl.js +1 -0
- package/client/dist/assets/builder-OcmKrC0h.js +1 -0
- package/client/dist/assets/builder-P9qVBXFZ.js +1 -0
- package/client/dist/assets/{button-CJqFnUOL.js → button-DCBqEaZl.js} +1 -1
- package/client/dist/assets/{code-CkUuW4m9.js → code-B37GRg9C.js} +1 -1
- package/client/dist/assets/{code-B0O8-p8k.js → code-BBOEZbf9.js} +1 -1
- package/client/dist/assets/{code-B1VLZDhS.js → code-BRm-jcyx.js} +1 -1
- package/client/dist/assets/{code-Bpj4Ddml.js → code-CF7w62CR.js} +1 -1
- package/client/dist/assets/{code-BykBZ5-e.js → code-CLuvJt2r.js} +1 -1
- package/client/dist/assets/{code-B86IMAfz.js → code-D0RCm59f.js} +1 -1
- package/client/dist/assets/code-DaZ-ZwCT.js +1 -0
- package/client/dist/assets/{code-cAqaqMTx.js → code-iIHkGaCL.js} +1 -1
- package/client/dist/assets/commands-0XjAftla.js +1 -0
- package/client/dist/assets/commands-BAWSYHjQ.js +1 -0
- package/client/dist/assets/commands-BBwowgiE.js +1 -0
- package/client/dist/assets/commands-BacjIZLN.js +1 -0
- package/client/dist/assets/commands-Bs62IAZ3.js +1 -0
- package/client/dist/assets/commands-CLPdh-Hh.js +1 -0
- package/client/dist/assets/commands-DlbFzgrp.js +1 -0
- package/client/dist/assets/commands-LjPSsi5F.js +1 -0
- package/client/dist/assets/common-B5AZNYMH.js +1 -0
- package/client/dist/assets/common-BFZ0c_vN.js +1 -0
- package/client/dist/assets/common-BrlwEnL7.js +1 -0
- package/client/dist/assets/common-BttQx3z4.js +1 -0
- package/client/dist/assets/common-CM65k_-e.js +1 -0
- package/client/dist/assets/common-D4mvFFlu.js +1 -0
- package/client/dist/assets/common-TZ9Ny96S.js +1 -0
- package/client/dist/assets/common-nFpSF4GC.js +1 -0
- package/client/dist/assets/dashboard-B14uYXkG.js +1 -0
- package/client/dist/assets/dashboard-BK_mez-z.js +1 -0
- package/client/dist/assets/dashboard-BfBir_6o.js +1 -0
- package/client/dist/assets/dashboard-Bt0cCzeG.js +1 -0
- package/client/dist/assets/dashboard-BwkjxI6H.js +1 -0
- package/client/dist/assets/{dashboard-C8WOEiPu.js → dashboard-C3bDKf7s.js} +1 -1
- package/client/dist/assets/dashboard-CdvjGfog.js +1 -0
- package/client/dist/assets/dashboard-fRrP0Kv0.js +1 -0
- package/client/dist/assets/dialog-SRw01_QU.js +45 -0
- package/client/dist/assets/dist-js-CJ_2XX1Y.js +1 -0
- package/client/dist/assets/formatDistanceToNow-DSj5DprF.js +1 -0
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-YhD8rIEs.js +1 -0
- package/client/dist/assets/index-DwAmL7m5.css +2 -0
- package/client/dist/assets/index-EzrkUb8B.js +76 -0
- package/client/dist/assets/{jira-api-B1-MUehg.js → jira-api-CSCqGr-Q.js} +1 -1
- package/client/dist/assets/{jobs-CN_zv4Gr.js → jobs-B8rrzfyZ.js} +1 -1
- package/client/dist/assets/{jobs-DUlWSYq2.js → jobs-BS6RTurf.js} +1 -1
- package/client/dist/assets/{jobs-Bpks6doU.js → jobs-BTT0Bsks.js} +1 -1
- package/client/dist/assets/{jobs-Bgq-PZkC.js → jobs-CezU69AE.js} +1 -1
- package/client/dist/assets/{jobs-SwYS2M-B.js → jobs-ClFJae0s.js} +1 -1
- package/client/dist/assets/{jobs-BAls3bWq.js → jobs-DJSFIFVy.js} +1 -1
- package/client/dist/assets/{jobs-DhxKgWFq.js → jobs-DhgGr8vm.js} +1 -1
- package/client/dist/assets/{jobs-B_TeSQxb.js → jobs-DzMjUcaN.js} +1 -1
- package/client/dist/assets/mcp-6rMoZfEO.js +1 -0
- package/client/dist/assets/mcp-BD8sL5mP.js +1 -0
- package/client/dist/assets/mcp-BkcA3I5s.js +1 -0
- package/client/dist/assets/mcp-CCpSelOh.js +1 -0
- package/client/dist/assets/mcp-CUAN6ORK.js +1 -0
- package/client/dist/assets/mcp-CqbRxRTE.js +1 -0
- package/client/dist/assets/mcp-DP2YfVhO.js +1 -0
- package/client/dist/assets/mcp-DUVQamDz.js +1 -0
- package/client/dist/assets/narration-B-ynWTpn.js +1 -0
- package/client/dist/assets/narration-Bj_laZwg.js +1 -0
- package/client/dist/assets/narration-BxHpmMv_.js +1 -0
- package/client/dist/assets/narration-C1Px0-0j.js +1 -0
- package/client/dist/assets/narration-CAXhGbzM.js +1 -0
- package/client/dist/assets/narration-DQ1l_Kq6.js +1 -0
- package/client/dist/assets/narration-XISXwqZd.js +1 -0
- package/client/dist/assets/narration-kwzfglQo.js +1 -0
- package/client/dist/assets/nav-1-Hh2kOz.js +1 -0
- package/client/dist/assets/nav-B34QkESm.js +1 -0
- package/client/dist/assets/nav-Bap_UXAq.js +1 -0
- package/client/dist/assets/{nav-pYuXq7sf.js → nav-BwxXIB24.js} +1 -1
- package/client/dist/assets/nav-Ch-zHBG5.js +1 -0
- package/client/dist/assets/nav-CygC_WN-.js +1 -0
- package/client/dist/assets/{nav-iwjCg5FR.js → nav-KnnLQtOQ.js} +1 -1
- package/client/dist/assets/nav-m00uxYUG.js +1 -0
- package/client/dist/assets/packet-BQ2tXfJI.js +1 -0
- package/client/dist/assets/packet-BdpOJ1Cy.js +1 -0
- package/client/dist/assets/packet-C3Ievb9R.js +1 -0
- package/client/dist/assets/packet-C4zJIG0Y.js +1 -0
- package/client/dist/assets/packet-Cx-zRuWn.js +1 -0
- package/client/dist/assets/packet-DUTGX52M.js +1 -0
- package/client/dist/assets/packet-DhsKtUPB.js +1 -0
- package/client/dist/assets/packet-z3LJ8Zyy.js +1 -0
- package/client/dist/assets/project-repositories-DYhTvwQ1.js +1 -0
- package/client/dist/assets/provider-capabilities-B-wOHfLP.js +1 -0
- package/client/dist/assets/settings-BBt2xtDQ.js +1 -0
- package/client/dist/assets/settings-BJB9RKJj.js +1 -0
- package/client/dist/assets/settings-CHwQR2rB.js +1 -0
- package/client/dist/assets/settings-CrMi3kSi.js +1 -0
- package/client/dist/assets/settings-DKyhDGD1.js +1 -0
- package/client/dist/assets/settings-Deupji9c.js +1 -0
- package/client/dist/assets/settings-DqRMmwAM.js +1 -0
- package/client/dist/assets/settings-J4rj6vo-.js +1 -0
- package/client/dist/assets/setup-2xGgu4Sk.js +1 -0
- package/client/dist/assets/setup-Ba11l2JA.js +1 -0
- package/client/dist/assets/setup-BzW4kMok.js +1 -0
- package/client/dist/assets/setup-COzwYhkJ.js +1 -0
- package/client/dist/assets/setup-CRVULhtF.js +1 -0
- package/client/dist/assets/setup-DgvlxwpE.js +1 -0
- package/client/dist/assets/setup-Dw_wYeEY.js +1 -0
- package/client/dist/assets/setup-ZPtEeJPW.js +1 -0
- package/client/dist/assets/spending-BqbdPm_4.js +1 -0
- package/client/dist/assets/square-Ci-PFcFe.js +1 -0
- package/client/dist/assets/{terminal-BFRZnMPP.js → terminal-BAzpHtpY.js} +1 -1
- package/client/dist/assets/{terminal-IahE4LW9.js → terminal-C7dHeR3x.js} +1 -1
- package/client/dist/assets/{terminal-tITa81iz.js → terminal-CMla5Qsz.js} +1 -1
- package/client/dist/assets/{terminal-BZiIu3rf.js → terminal-CdNXH-n9.js} +1 -1
- package/client/dist/assets/{terminal-ScjyXNxQ.js → terminal-Cw5bZsmV.js} +1 -1
- package/client/dist/assets/{terminal-C2NAd7BW.js → terminal-DFUP4eNv.js} +1 -1
- package/client/dist/assets/{terminal-d7GadXbN.js → terminal-DGqljeK_.js} +1 -1
- package/client/dist/assets/{terminal-QpXZU2Bn.js → terminal-cU70NodO.js} +1 -1
- package/client/dist/assets/useDesktop-RSMTyy7V.js +1 -0
- package/client/dist/assets/useSharedWebSocket-BOdS5_Iz.js +2 -0
- package/client/dist/index.html +34 -35
- package/docs/README.md +3 -0
- package/docs/agent-live-steering.md +57 -0
- package/docs/ci-cd.md +57 -0
- package/docs/code-explorer.md +48 -0
- package/docs/codex.md +12 -1
- package/docs/features/detachable-mission-windows.md +59 -0
- package/docs/guide/de/integrations/5-mcp-server.md +13 -9
- package/docs/guide/de/integrations/6-agent-chat.md +1 -0
- package/docs/guide/en/integrations/5-mcp-server.md +13 -9
- package/docs/guide/en/integrations/6-agent-chat.md +1 -0
- package/docs/guide/es/integrations/5-mcp-server.md +13 -9
- package/docs/guide/es/integrations/6-agent-chat.md +1 -0
- package/docs/guide/fr/integrations/5-mcp-server.md +13 -9
- package/docs/guide/fr/integrations/6-agent-chat.md +1 -0
- package/docs/guide/it/integrations/5-mcp-server.md +13 -9
- package/docs/guide/it/integrations/6-agent-chat.md +1 -0
- package/docs/guide/ja/integrations/5-mcp-server.md +13 -9
- package/docs/guide/ja/integrations/6-agent-chat.md +1 -0
- package/docs/guide/pt/integrations/5-mcp-server.md +13 -9
- package/docs/guide/pt/integrations/6-agent-chat.md +1 -0
- package/docs/guide/zh/integrations/5-mcp-server.md +13 -9
- package/docs/guide/zh/integrations/6-agent-chat.md +1 -0
- package/docs/internals/README.md +1 -0
- package/docs/internals/browser-capture-performance.md +55 -3
- package/docs/internals/browser-login-popups.md +45 -0
- package/docs/internals/browser-native-retina-audit.md +39 -0
- package/docs/internals/ci-cd-audit.md +39 -0
- package/docs/internals/core-runtime-updates.md +68 -0
- package/docs/internals/embedded-browser-native-webview-evaluation.md +2 -0
- package/docs/internals/implementation-reliability-audit.md +93 -0
- package/docs/internals/interactive-jobs.md +110 -6
- package/docs/internals/mcp-mission-audit.md +76 -0
- package/docs/internals/project-builder.md +404 -42
- package/docs/internals/safe-pr-review-flow.md +52 -10
- package/docs/internals/startup-recovery-audit.md +58 -0
- package/docs/mcp.md +74 -41
- package/docs/mission-processes.md +59 -0
- package/docs/multi-repo-projects.md +51 -0
- package/docs/platforms/windows-parity.md +70 -0
- package/docs/platforms/windows.md +13 -11
- package/docs/running-pipelines.md +14 -0
- package/mcp-bridge/dist/specrails-mcp.js +7186 -0
- package/package.json +9 -4
- package/server/dist/agent-chat-manager.js +537 -68
- package/server/dist/agent-chat-router.js +87 -6
- package/server/dist/agent-context-resolver.js +129 -25
- package/server/dist/agent-defaults.js +19 -11
- package/server/dist/agent-input-store.js +206 -0
- package/server/dist/agent-mcp-config.js +54 -15
- package/server/dist/agent-operator-prompt.js +255 -65
- package/server/dist/agent-spec-framing.js +202 -0
- package/server/dist/agent-steering.js +218 -0
- package/server/dist/agent-store.js +153 -0
- package/server/dist/api-not-found.js +8 -0
- package/server/dist/background-process-control.js +164 -0
- package/server/dist/background-process-service.js +61 -0
- package/server/dist/background-process-store.js +242 -0
- package/server/dist/background-windows-bootstrap.js +238 -0
- package/server/dist/blueprint-chat-manager.js +476 -62
- package/server/dist/blueprint-commit.js +21 -1
- package/server/dist/blueprint-draft-parser.js +122 -17
- package/server/dist/blueprint-generation.js +238 -0
- package/server/dist/blueprint-operator-prompt.js +91 -63
- package/server/dist/blueprint-router.js +55 -3
- package/server/dist/blueprint-spec-fixtures.js +85 -0
- package/server/dist/blueprint-spec-quality.js +57 -16
- package/server/dist/blueprint-store.js +92 -1
- package/server/dist/browser-capture-manager.js +86 -30
- package/server/dist/browser-playwright.js +168 -45
- package/server/dist/browser-viewport.js +26 -0
- package/server/dist/chat-manager.js +23 -15
- package/server/dist/chromium-archive.cjs +83 -0
- package/server/dist/chromium-resolver.js +72 -64
- package/server/dist/code-activity.js +145 -0
- package/server/dist/code-explorer-router.js +714 -114
- package/server/dist/core-compat.js +28 -1
- package/server/dist/core-execution.js +111 -0
- package/server/dist/core-package.js +4 -16
- package/server/dist/core-runtime.js +202 -0
- package/server/dist/core-update-manager.js +161 -60
- package/server/dist/core-update-state.js +29 -0
- package/server/dist/db.js +66 -35
- package/server/dist/delivery-evidence.js +142 -39
- package/server/dist/desktop-db.js +239 -43
- package/server/dist/desktop-router.js +109 -9
- package/server/dist/dev-ports.js +8 -3
- package/server/dist/file-provenance.js +34 -22
- package/server/dist/file-story-manager.js +62 -64
- package/server/dist/file-story.js +118 -35
- package/server/dist/file-summary-generator.js +46 -5
- package/server/dist/file-summary-manager.js +355 -106
- package/server/dist/framework-manager.js +98 -110
- package/server/dist/framework-reseed.js +76 -10
- package/server/dist/git-diagnostics.js +2 -2
- package/server/dist/headroom-manager.js +38 -3
- package/server/dist/host-control.js +52 -0
- package/server/dist/index.js +43 -2
- package/server/dist/interactive-job-session.js +149 -16
- package/server/dist/internal-api.js +48 -0
- package/server/dist/jira/jira-materializer.js +1 -0
- package/server/dist/json-tolerant.js +174 -0
- package/server/dist/legacy-migration.js +4 -2
- package/server/dist/loop-command-catalog.js +83 -21
- package/server/dist/loop-constants.js +6 -1
- package/server/dist/loop-decider.js +11 -1
- package/server/dist/loop-executors.js +194 -45
- package/server/dist/loop-factory.js +11 -4
- package/server/dist/loop-graph.js +90 -4
- package/server/dist/loop-run-manager.js +301 -69
- package/server/dist/loop-shell-invocation.js +21 -0
- package/server/dist/loop-step-idle.js +55 -0
- package/server/dist/loop-templates.js +31 -7
- package/server/dist/mcp/agent-capability.js +37 -4
- package/server/dist/mcp/guide.js +149 -36
- package/server/dist/mcp/mcp-admin-router.js +20 -4
- package/server/dist/mcp/mcp-server.js +89 -43
- package/server/dist/mcp/mcp-tiers.js +6 -5
- package/server/dist/mcp/mcp-token.js +3 -1
- package/server/dist/mcp/resources.js +5 -4
- package/server/dist/mcp/tools/catalog.js +4 -0
- package/server/dist/mcp/tools/code.js +125 -14
- package/server/dist/mcp/tools/context.js +153 -0
- package/server/dist/mcp/tools/git.js +15 -5
- package/server/dist/mcp/tools/jobs.js +84 -71
- package/server/dist/mcp/tools/loops.js +17 -6
- package/server/dist/mcp/tools/meta.js +74 -27
- package/server/dist/mcp/tools/mission.js +29 -0
- package/server/dist/mcp/tools/projects.js +22 -6
- package/server/dist/mcp/tools/rails.js +48 -11
- package/server/dist/mcp/tools/specs.js +86 -14
- package/server/dist/mcp/tools/support.js +1 -1
- package/server/dist/mcp/tools/types.js +117 -43
- package/server/dist/mcp/tools/watch.js +144 -51
- package/server/dist/milestone-chain-store.js +164 -0
- package/server/dist/milestone-chain.js +487 -0
- package/server/dist/milestone-progress.js +348 -0
- package/server/dist/mobile/mobile-devices.js +10 -7
- package/server/dist/mobile/mobile-gateway.js +2 -0
- package/server/dist/mobile/mobile-missions.js +214 -0
- package/server/dist/mobile/mobile-redact.js +17 -3
- package/server/dist/mobile/mobile-router.js +46 -4
- package/server/dist/mobile/mobile-ws.js +49 -4
- package/server/dist/multi-repo-bases.js +56 -0
- package/server/dist/multi-repo-checkout.js +101 -0
- package/server/dist/multi-repo-delivery.js +100 -0
- package/server/dist/multi-repo-execution-store.js +65 -0
- package/server/dist/multi-repo-execution.js +453 -0
- package/server/dist/offline-assemble.js +10 -8
- package/server/dist/openspec-runtime-plugin-commands.json +18 -0
- package/server/dist/openspec-runtime-plugin.js +120 -0
- package/server/dist/plugins/codex-spawn.js +49 -0
- package/server/dist/plugins/serena/manifest.js +2 -2
- package/server/dist/plugins/serena/templates/instructions.md +16 -0
- package/server/dist/pr-publisher.js +1 -1
- package/server/dist/profiles-router.js +3 -18
- package/server/dist/project-code-discovery.js +142 -0
- package/server/dist/project-git.js +19 -21
- package/server/dist/project-registry.js +272 -20
- package/server/dist/project-repositories.js +157 -0
- package/server/dist/project-repository-provenance.js +31 -0
- package/server/dist/project-router-background-processes.js +105 -0
- package/server/dist/project-router-git.js +75 -16
- package/server/dist/project-router-jobs.js +2 -126
- package/server/dist/project-router-loop-runs.js +72 -2
- package/server/dist/project-router-tickets.js +53 -8
- package/server/dist/project-router.js +239 -38
- package/server/dist/provider-detection.js +18 -6
- package/server/dist/provider-limit.js +64 -0
- package/server/dist/providers/claude-adapter.js +26 -1
- package/server/dist/providers/claude-background-tasks.js +18 -0
- package/server/dist/providers/claude-live-session.js +383 -0
- package/server/dist/providers/codex-adapter.js +19 -0
- package/server/dist/providers/codex-live-session.js +545 -0
- package/server/dist/providers/gemini-adapter.js +1 -0
- package/server/dist/providers/live-session-types.js +12 -0
- package/server/dist/providers/live-session.js +13 -0
- package/server/dist/providers/terminal-result.js +24 -0
- package/server/dist/queue-manager.js +2 -0
- package/server/dist/rail-isolated-launch.js +141 -16
- package/server/dist/rail-pr-decision.js +364 -99
- package/server/dist/rail-pr-store.js +24 -10
- package/server/dist/rail-worktree-release.js +34 -2
- package/server/dist/rail-worktrees-store.js +4 -4
- package/server/dist/rails-router.js +249 -55
- package/server/dist/repo-lock.js +92 -17
- package/server/dist/review-packet.js +23 -13
- package/server/dist/schemas/file-summary.v1.json +59 -59
- package/server/dist/schemas/profile.v1.json +137 -137
- package/server/dist/setup-manager.js +52 -8
- package/server/dist/shell-integration/bash-shim.bash +45 -0
- package/server/dist/shell-integration/fish-shim.fish +36 -0
- package/server/dist/shell-integration/powershell-shim.ps1 +48 -0
- package/server/dist/shell-integration/zsh-shim.zsh +47 -0
- package/server/dist/smash-runner.js +1 -0
- package/server/dist/spawn-lifecycle.js +44 -27
- package/server/dist/spec-contract-prompt.js +143 -0
- package/server/dist/spec-draft-parser.js +6 -1
- package/server/dist/spec-models.js +1 -0
- package/server/dist/stuck-run-detector.js +1 -0
- package/server/dist/terminal-manager.js +21 -1
- package/server/dist/terminal-shell-integration.js +4 -1
- package/server/dist/transient-children.js +619 -230
- package/server/dist/util/cli-prompt.js +78 -5
- package/server/dist/util/sqlite-migrations.js +20 -0
- package/server/dist/util/win-spawn.js +18 -3
- package/server/dist/util/windows-provider-shell.js +29 -0
- package/server/dist/verification-sentinel.js +14 -0
- package/server/dist/vitest-setup.js +2 -0
- package/server/dist/windows-job-supervisor.js +133 -0
- package/server/dist/workspace-manager.js +9 -30
- package/server/dist/worktree-manager.js +17 -2
- package/server/dist/worktree-overlay.js +3 -1
- package/client/dist/assets/ActivityFeedPage-tAQcWs1R.js +0 -1
- package/client/dist/assets/AgentBrowserCapture-BX8BNae5.js +0 -1
- package/client/dist/assets/AgentModeAnalyticsPane-BVAqCL0K.js +0 -2
- package/client/dist/assets/AgentModeCodePane-9XfqQc9c.js +0 -2
- package/client/dist/assets/AgentModeJobsPane-BCjLsPhc.js +0 -1
- package/client/dist/assets/AgentsPage-C8J_42sm.js +0 -87
- package/client/dist/assets/AnalyticsPage-BtQuyfJm.js +0 -1
- package/client/dist/assets/CodePage-BZ2MwdCu.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-Bh_29V4g.js +0 -1
- package/client/dist/assets/ExportDropdown-BrtfWzEG.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-BCZiSfzc.js +0 -19
- package/client/dist/assets/JobDetailModal-NAJmuYIT.js +0 -1
- package/client/dist/assets/JobDetailPage-fE0ZycUX.js +0 -1
- package/client/dist/assets/JobsPage-z5M_HVJG.js +0 -1
- package/client/dist/assets/LoopBuilderPage-j1FQS47c.js +0 -7
- package/client/dist/assets/LoopPreviewModal-DhDJjdCe.js +0 -1
- package/client/dist/assets/LoopsPage-Ll7zORZb.js +0 -1
- package/client/dist/assets/MinimizedChatsContext-Bd3OqR_S.js +0 -1
- package/client/dist/assets/PluginsPage-DN4kGvJt.js +0 -2
- package/client/dist/assets/ProjectSettingsDialog-OgsgxjzF.js +0 -1
- package/client/dist/assets/ReviewPacketPage-DFog4sXn.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-L2XxqiOD.js +0 -1
- package/client/dist/assets/TicketDetailModal-CsF-AWZX.js +0 -14
- package/client/dist/assets/Trans-Bsz9_gyq.js +0 -1
- package/client/dist/assets/agent-BQgKv_2F.js +0 -1
- package/client/dist/assets/agent-C1NRDJqL.js +0 -1
- package/client/dist/assets/agent-CLNleiy6.js +0 -1
- package/client/dist/assets/agent-CmceArkQ.js +0 -1
- package/client/dist/assets/agent-D3UxQ3SR.js +0 -1
- package/client/dist/assets/agent-DB1JeE64.js +0 -1
- package/client/dist/assets/agent-DXkHcQ-D.js +0 -1
- package/client/dist/assets/agent-DjJJJ2M8.js +0 -1
- package/client/dist/assets/auth-D_5bQv5W.js +0 -1
- package/client/dist/assets/ban-E4EaZe3a.js +0 -1
- package/client/dist/assets/bot-DzuuuC5R.js +0 -1
- package/client/dist/assets/browser-BgqHDMXP.js +0 -1
- package/client/dist/assets/browser-CsKJtrpv.js +0 -1
- package/client/dist/assets/browser-Cu58EpZU.js +0 -1
- package/client/dist/assets/browser-CvXOJm-j.js +0 -1
- package/client/dist/assets/browser-DOrFh1c7.js +0 -1
- package/client/dist/assets/browser-DQv_Jo7x.js +0 -1
- package/client/dist/assets/browser-LPgxvJu2.js +0 -1
- package/client/dist/assets/browser-eL-3MIEI.js +0 -1
- package/client/dist/assets/builder-0IWtosUm.js +0 -1
- package/client/dist/assets/builder-Bf2N6XWn.js +0 -1
- package/client/dist/assets/builder-BnqaaBkT.js +0 -1
- package/client/dist/assets/builder-BxxfGgAO.js +0 -1
- package/client/dist/assets/builder-C5IIgWsq.js +0 -1
- package/client/dist/assets/builder-CHuahItu.js +0 -1
- package/client/dist/assets/builder-CjWosXL_.js +0 -1
- package/client/dist/assets/builder-CpCIOoKj.js +0 -1
- package/client/dist/assets/code-CHPkOkDS.js +0 -1
- package/client/dist/assets/commands-6tYQih5m.js +0 -1
- package/client/dist/assets/commands-BK2QinXN.js +0 -1
- package/client/dist/assets/commands-C2Nca76h.js +0 -1
- package/client/dist/assets/commands-CKdLihNX.js +0 -1
- package/client/dist/assets/commands-CYIBTAlc.js +0 -1
- package/client/dist/assets/commands-CjUtYJIM.js +0 -1
- package/client/dist/assets/commands-Cq_u_8y9.js +0 -1
- package/client/dist/assets/commands-D_ZHYQug.js +0 -1
- package/client/dist/assets/common-6MLbD-jM.js +0 -1
- package/client/dist/assets/common-BKGEu4rm.js +0 -1
- package/client/dist/assets/common-BNbnv8cE.js +0 -1
- package/client/dist/assets/common-BqGWtDbt.js +0 -1
- package/client/dist/assets/common-DBtTzeYm.js +0 -1
- package/client/dist/assets/common-DEW3Nr8n.js +0 -1
- package/client/dist/assets/common-DHsv9N5d.js +0 -1
- package/client/dist/assets/common-mkrEcW-Y.js +0 -1
- package/client/dist/assets/dashboard-B9GhC5ku.js +0 -1
- package/client/dist/assets/dashboard-CBnv6zOI.js +0 -1
- package/client/dist/assets/dashboard-CaP0fU87.js +0 -1
- package/client/dist/assets/dashboard-D4ZZ4x84.js +0 -1
- package/client/dist/assets/dashboard-DmuTQBX8.js +0 -1
- package/client/dist/assets/dashboard-DynLYj3d.js +0 -1
- package/client/dist/assets/dashboard-zj4gGFJ1.js +0 -1
- package/client/dist/assets/dialog-CdWCb02j.js +0 -45
- package/client/dist/assets/dist-bVqfYmby.js +0 -1
- package/client/dist/assets/dist-js-CWeUdf5Z.js +0 -1
- package/client/dist/assets/formatDistanceToNow-DQCvMgUc.js +0 -1
- package/client/dist/assets/getTimezoneOffsetInMilliseconds-C16cxSe1.js +0 -1
- package/client/dist/assets/git-refresh-wTW0rO0Z.js +0 -1
- package/client/dist/assets/i18n-hnX2DPmo.js +0 -2
- package/client/dist/assets/index-DIhMEAVw.js +0 -66
- package/client/dist/assets/index-DwygcU7s.css +0 -2
- package/client/dist/assets/mcp-B8X8wBLu.js +0 -1
- package/client/dist/assets/mcp-C2AojZZN.js +0 -1
- package/client/dist/assets/mcp-D8BT78_L.js +0 -1
- package/client/dist/assets/mcp-Df5RWBNk.js +0 -1
- package/client/dist/assets/mcp-Dj7BgMQW.js +0 -1
- package/client/dist/assets/mcp-Q7iT7rcz.js +0 -1
- package/client/dist/assets/mcp-YlvNvJbW.js +0 -1
- package/client/dist/assets/mcp-mKFpTSRb.js +0 -1
- package/client/dist/assets/narration-4Z2VUhZw.js +0 -1
- package/client/dist/assets/narration-BGuiEDj3.js +0 -1
- package/client/dist/assets/narration-BuSoqRmv.js +0 -1
- package/client/dist/assets/narration-CB9t29fy.js +0 -1
- package/client/dist/assets/narration-CU3x8FHD.js +0 -1
- package/client/dist/assets/narration-CWeXhfP5.js +0 -1
- package/client/dist/assets/narration-DRaDnhT5.js +0 -1
- package/client/dist/assets/narration-DtEbQgCw.js +0 -1
- package/client/dist/assets/nav-ApJVg3xu.js +0 -1
- package/client/dist/assets/nav-BKNky1Bg.js +0 -1
- package/client/dist/assets/nav-C6vWWKYx.js +0 -1
- package/client/dist/assets/nav-CXJ6Aw89.js +0 -1
- package/client/dist/assets/nav-CsmFBIDf.js +0 -1
- package/client/dist/assets/nav-DjkmQJjd.js +0 -1
- package/client/dist/assets/packet-B1IxaL5f.js +0 -1
- package/client/dist/assets/packet-Bh5kkbiB.js +0 -1
- package/client/dist/assets/packet-By8fqYxW.js +0 -1
- package/client/dist/assets/packet-CZdvA44E.js +0 -1
- package/client/dist/assets/packet-CrjHRQCP.js +0 -1
- package/client/dist/assets/packet-Dwi2pTtx.js +0 -1
- package/client/dist/assets/packet-_-ZIa0IR.js +0 -1
- package/client/dist/assets/packet-n0W6E1Hn.js +0 -1
- package/client/dist/assets/play-DNlrawbS.js +0 -1
- package/client/dist/assets/provider-capabilities-Doej9lfa.js +0 -1
- package/client/dist/assets/settings-Bd0x4TBa.js +0 -1
- package/client/dist/assets/settings-C1-7cXzC.js +0 -1
- package/client/dist/assets/settings-CAFaT38b.js +0 -1
- package/client/dist/assets/settings-Ct3v1nW2.js +0 -1
- package/client/dist/assets/settings-DHh7_IF5.js +0 -1
- package/client/dist/assets/settings-DQXAmdcv.js +0 -1
- package/client/dist/assets/settings-guzlhpup.js +0 -1
- package/client/dist/assets/settings-sZfTPMEH.js +0 -1
- package/client/dist/assets/setup-3jWaoVUO.js +0 -1
- package/client/dist/assets/setup-BjgRneb2.js +0 -1
- package/client/dist/assets/setup-BzFIjv-f.js +0 -1
- package/client/dist/assets/setup-C4VfQsxE.js +0 -1
- package/client/dist/assets/setup-DfUkpDbN.js +0 -1
- package/client/dist/assets/setup-ECe90Pmu.js +0 -1
- package/client/dist/assets/setup-dlqC4Jmm.js +0 -1
- package/client/dist/assets/setup-jwfLMiM2.js +0 -1
- package/client/dist/assets/spending-EC9xqio-.js +0 -1
- package/client/dist/assets/useDesktop-BQVt8lFd.js +0 -1
|
@@ -29,6 +29,7 @@ exports.toPrDeliverySnapshot = toPrDeliverySnapshot;
|
|
|
29
29
|
exports.toRailPrStateMessage = toRailPrStateMessage;
|
|
30
30
|
exports.toPrDecisionCardEnvelope = toPrDecisionCardEnvelope;
|
|
31
31
|
const ids_1 = require("./ids");
|
|
32
|
+
const multi_repo_execution_store_1 = require("./multi-repo-execution-store");
|
|
32
33
|
/** Defensive per-ticket cap; contract-layer specs run long but bounded. */
|
|
33
34
|
const SPEC_SNAPSHOT_DESCRIPTION_CAP = 32_768;
|
|
34
35
|
function boundSpecSnapshot(entries) {
|
|
@@ -85,11 +86,11 @@ function createPrDelivery(db, input) {
|
|
|
85
86
|
loop_name, origin_surface, origin_conversation_id,
|
|
86
87
|
implementation_outcome, delivery_outcome, status_code,
|
|
87
88
|
is_continuation, supersedes_delivery_id, spec_snapshot,
|
|
88
|
-
revision_note, revision_of
|
|
89
|
+
revision_note, revision_of, parent_delivery_id, repository_id, repository_path
|
|
89
90
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', 'pending',
|
|
90
|
-
'implementation_running', ?, ?, ?, ?, ?)`).run(id, input.railIndex, input.loopId ?? null, input.railKey, JSON.stringify(input.ticketIds), input.baseBranch, input.loopName, input.originSurface, input.originConversationId ?? null, input.isContinuation ? 1 : 0, input.supersedesDeliveryId ?? null, input.specSnapshot && input.specSnapshot.length > 0
|
|
91
|
+
'implementation_running', ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.railIndex, input.loopId ?? null, input.railKey, JSON.stringify(input.ticketIds), input.baseBranch, input.loopName, input.originSurface, input.originConversationId ?? null, input.isContinuation ? 1 : 0, input.supersedesDeliveryId ?? null, input.specSnapshot && input.specSnapshot.length > 0
|
|
91
92
|
? JSON.stringify(boundSpecSnapshot(input.specSnapshot))
|
|
92
|
-
: null, input.revisionNote ? boundRevisionNote(input.revisionNote) : null, input.revisionOf ?? null);
|
|
93
|
+
: null, input.revisionNote ? boundRevisionNote(input.revisionNote) : null, input.revisionOf ?? null, input.parentDeliveryId ?? null, input.repositoryId ?? null, input.repositoryPath ?? null);
|
|
93
94
|
return getPrDelivery(db, id);
|
|
94
95
|
}
|
|
95
96
|
class PrDeliveryGenerationConflict extends Error {
|
|
@@ -119,6 +120,12 @@ END`;
|
|
|
119
120
|
* not merely a router convention. Pass null for a genuinely fresh launch. */
|
|
120
121
|
function createPrDeliveryGeneration(db, input, expectedActive) {
|
|
121
122
|
return db.transaction(() => {
|
|
123
|
+
if (input.parentDeliveryId) {
|
|
124
|
+
const parent = getPrDelivery(db, input.parentDeliveryId);
|
|
125
|
+
if (!parent || parent.decision !== 'building' || parent.parent_delivery_id)
|
|
126
|
+
throw new PrDeliveryGenerationConflict(parent?.id ?? null);
|
|
127
|
+
return { delivery: createPrDelivery(db, input), superseded: null };
|
|
128
|
+
}
|
|
122
129
|
const current = getActivePrDeliveryByRail(db, input.railIndex);
|
|
123
130
|
if (expectedActive === null) {
|
|
124
131
|
if (current)
|
|
@@ -189,7 +196,7 @@ function getPrDelivery(db, id) {
|
|
|
189
196
|
function getActivePrDeliveryByRail(db, railIndex) {
|
|
190
197
|
return db
|
|
191
198
|
.prepare(`SELECT * FROM rail_pr_deliveries
|
|
192
|
-
WHERE rail_index = ? AND decision NOT IN ('completed','merged','discarded','superseded')
|
|
199
|
+
WHERE parent_delivery_id IS NULL AND rail_index = ? AND decision NOT IN ('completed','merged','discarded','superseded')
|
|
193
200
|
ORDER BY created_at DESC, rowid DESC LIMIT 1`)
|
|
194
201
|
.get(railIndex);
|
|
195
202
|
}
|
|
@@ -197,7 +204,7 @@ function getActivePrDeliveryByRail(db, railIndex) {
|
|
|
197
204
|
function listActivePrDeliveries(db) {
|
|
198
205
|
return db
|
|
199
206
|
.prepare(`SELECT * FROM rail_pr_deliveries
|
|
200
|
-
WHERE decision NOT IN ('completed','merged','discarded','superseded')
|
|
207
|
+
WHERE parent_delivery_id IS NULL AND decision NOT IN ('completed','merged','discarded','superseded')
|
|
201
208
|
ORDER BY rail_index, created_at DESC, rowid DESC`)
|
|
202
209
|
.all();
|
|
203
210
|
}
|
|
@@ -207,7 +214,7 @@ function listActivePrDeliveries(db) {
|
|
|
207
214
|
function listTerminalPrDeliveries(db) {
|
|
208
215
|
return db
|
|
209
216
|
.prepare(`SELECT * FROM rail_pr_deliveries
|
|
210
|
-
WHERE decision IN ('completed','merged','discarded','superseded')
|
|
217
|
+
WHERE parent_delivery_id IS NULL AND decision IN ('completed','merged','discarded','superseded')
|
|
211
218
|
ORDER BY created_at DESC, rowid DESC`)
|
|
212
219
|
.all();
|
|
213
220
|
}
|
|
@@ -253,10 +260,12 @@ function listOriginLinkedPrDeliveries(db) {
|
|
|
253
260
|
*/
|
|
254
261
|
function reconcileFailedBuildingPrDeliveries(db, opts = {}) {
|
|
255
262
|
const rows = db
|
|
256
|
-
.prepare(`SELECT * FROM rail_pr_deliveries WHERE decision = 'building' ORDER BY created_at ASC, rowid ASC`)
|
|
263
|
+
.prepare(`SELECT * FROM rail_pr_deliveries WHERE decision = 'building' AND (execution_manifest IS NULL OR parent_delivery_id IS NOT NULL) ORDER BY created_at ASC, rowid ASC`)
|
|
257
264
|
.all();
|
|
258
265
|
const reconciled = [];
|
|
259
266
|
for (const row of rows) {
|
|
267
|
+
if (opts.repositoryPath && (row.repository_path ?? opts.legacyRepositoryPath) !== opts.repositoryPath)
|
|
268
|
+
continue;
|
|
260
269
|
const runIds = parseJsonArray(row.run_ids ?? '[]');
|
|
261
270
|
if (runIds.length === 0) {
|
|
262
271
|
if (!opts.startup)
|
|
@@ -310,9 +319,9 @@ function reconcileFailedBuildingPrDeliveries(db, opts = {}) {
|
|
|
310
319
|
const worktrees = db.prepare(`
|
|
311
320
|
SELECT id, ticket_id, run_id, branch, merge_state
|
|
312
321
|
FROM rail_worktrees
|
|
313
|
-
WHERE run_id IN (${placeholdersForWorktrees})
|
|
322
|
+
WHERE run_id IN (${placeholdersForWorktrees}) AND repository_id IS ?
|
|
314
323
|
ORDER BY created_at ASC, rowid ASC
|
|
315
|
-
`).all(...uniqueRunIds);
|
|
324
|
+
`).all(...uniqueRunIds, row.repository_id ?? null);
|
|
316
325
|
const reconstructed = worktrees.map((worktree) => {
|
|
317
326
|
const implementationSucceeded = worktree.run_id != null && successfulRunIds.has(worktree.run_id);
|
|
318
327
|
const deliveryReady = implementationSucceeded && ['built', 'released'].includes(worktree.merge_state);
|
|
@@ -360,6 +369,8 @@ function reconcileFailedBuildingPrDeliveries(db, opts = {}) {
|
|
|
360
369
|
// them to prevent any future caller injecting SQL via an object key (values
|
|
361
370
|
// are always parameterized). Mirrors loop-runs-store's COUNTER_COLUMNS.
|
|
362
371
|
const PATCH_COLUMNS = {
|
|
372
|
+
executionManifest: 'execution_manifest',
|
|
373
|
+
repositoryDeliveries: 'repository_deliveries',
|
|
363
374
|
branch: 'branch',
|
|
364
375
|
prUrl: 'pr_url',
|
|
365
376
|
prNumber: 'pr_number',
|
|
@@ -393,7 +404,7 @@ function patchValue(key, patch) {
|
|
|
393
404
|
return raw == null ? null : boundPrDiagnostic(String(raw));
|
|
394
405
|
if (key === 'isContinuation')
|
|
395
406
|
return raw ? 1 : 0;
|
|
396
|
-
if (key === 'settleEvidence')
|
|
407
|
+
if (key === 'settleEvidence' || key === 'executionManifest' || key === 'repositoryDeliveries')
|
|
397
408
|
return raw == null ? null : JSON.stringify(raw);
|
|
398
409
|
return raw;
|
|
399
410
|
}
|
|
@@ -549,6 +560,7 @@ function parseJsonArray(raw) {
|
|
|
549
560
|
function toPrDeliverySnapshot(row) {
|
|
550
561
|
const units = parseJsonArray(row.branches);
|
|
551
562
|
return {
|
|
563
|
+
...(row.execution_manifest ? { executionManifest: (0, multi_repo_execution_store_1.readExecutionManifest)(row.execution_manifest), repositoryDeliveries: parseJsonArray(row.repository_deliveries ?? '[]') } : {}),
|
|
552
564
|
id: row.id,
|
|
553
565
|
railIndex: row.rail_index,
|
|
554
566
|
loopId: row.loop_id,
|
|
@@ -597,6 +609,7 @@ function toRailPrStateMessage(projectId, snap) {
|
|
|
597
609
|
prDeliveryId: snap.id,
|
|
598
610
|
railKey: snap.railKey,
|
|
599
611
|
ticketIds: snap.ticketIds,
|
|
612
|
+
...(snap.executionManifest ? { executionManifest: snap.executionManifest, repositoryDeliveries: snap.repositoryDeliveries } : {}),
|
|
600
613
|
baseBranch: snap.baseBranch,
|
|
601
614
|
branch: snap.branch,
|
|
602
615
|
prUrl: snap.prUrl,
|
|
@@ -635,6 +648,7 @@ function toPrDecisionCardEnvelope(projectId, snap) {
|
|
|
635
648
|
projectId,
|
|
636
649
|
baseBranch: snap.baseBranch,
|
|
637
650
|
ticketIds: snap.ticketIds,
|
|
651
|
+
...(snap.executionManifest ? { executionManifest: snap.executionManifest, repositoryDeliveries: snap.repositoryDeliveries } : {}),
|
|
638
652
|
decision: snap.decision,
|
|
639
653
|
implementationOutcome: snap.implementationOutcome,
|
|
640
654
|
deliveryOutcome: snap.deliveryOutcome,
|
|
@@ -37,6 +37,7 @@ exports.durableBranchHeads = durableBranchHeads;
|
|
|
37
37
|
exports.durableOverlayCleanupEvidence = durableOverlayCleanupEvidence;
|
|
38
38
|
exports.durableSettlementIgnoredPaths = durableSettlementIgnoredPaths;
|
|
39
39
|
exports.releaseRailWorktrees = releaseRailWorktrees;
|
|
40
|
+
const repo_lock_1 = require("./repo-lock");
|
|
40
41
|
const rail_worktrees_store_1 = require("./rail-worktrees-store");
|
|
41
42
|
const worktree_manager_1 = require("./worktree-manager");
|
|
42
43
|
const path = __importStar(require("path"));
|
|
@@ -205,6 +206,23 @@ async function verifyReleaseEvidence(input, worktree) {
|
|
|
205
206
|
if (uncovered.length > 0) {
|
|
206
207
|
return { failure: `the worktree contains ignored paths that appeared after settlement (${uncovered.slice(0, 3).join(', ')})`, overlayEntries: [] };
|
|
207
208
|
}
|
|
209
|
+
// A snapshot records names, not bytes. Files under an existing ignored
|
|
210
|
+
// directory may have been edited or added since settlement. Git's
|
|
211
|
+
// non-force worktree removal still deletes ignored content, so preserve
|
|
212
|
+
// every authorized ignored root in the same lossless quarantine used
|
|
213
|
+
// for overlays before releasing the mount.
|
|
214
|
+
for (const ignoredPath of ignoredPaths) {
|
|
215
|
+
const relative = safeRelativeOverlayPath(ignoredPath.replace(/\/$/, ''));
|
|
216
|
+
if (!relative)
|
|
217
|
+
return { failure: 'Git reported an unsafe ignored path', overlayEntries: [] };
|
|
218
|
+
const target = path.join(worktree.worktree_path, ...relative.split('/'));
|
|
219
|
+
if (!pathStillExists(target))
|
|
220
|
+
continue;
|
|
221
|
+
const fingerprint = (0, worktree_overlay_1.fingerprintOverlayCleanupPath)(target);
|
|
222
|
+
if (!fingerprint)
|
|
223
|
+
return { failure: `could not preserve ignored path ${relative}`, overlayEntries: [] };
|
|
224
|
+
overlayEntries.push({ path: relative, ...fingerprint });
|
|
225
|
+
}
|
|
208
226
|
}
|
|
209
227
|
const [head, branchRef] = await Promise.all([
|
|
210
228
|
input.git.run(['rev-parse', '--verify', 'HEAD'], worktree.worktree_path),
|
|
@@ -352,6 +370,20 @@ async function releaseRailWorktrees(input) {
|
|
|
352
370
|
const wt = (0, rail_worktrees_store_1.getRailWorktree)(input.db, wtId);
|
|
353
371
|
if (!wt)
|
|
354
372
|
continue;
|
|
373
|
+
if (wt.repository_path && (0, repo_lock_1.repositoryLockKey)(wt.repository_path) !== (0, repo_lock_1.repositoryLockKey)(input.repoDir)) {
|
|
374
|
+
warnings.push(`worktree ${wtId} belongs to a different repository; preserved`);
|
|
375
|
+
continue;
|
|
376
|
+
}
|
|
377
|
+
const recordRemoved = () => {
|
|
378
|
+
input.db.transaction(() => {
|
|
379
|
+
(0, rail_worktrees_store_1.updateRailWorktreeState)(input.db, wt.id, state);
|
|
380
|
+
// Revisions can borrow the same mount under a new ledger id. Once Git
|
|
381
|
+
// proves that mount removed, older records must not pin membership forever.
|
|
382
|
+
input.db.prepare(`UPDATE rail_worktrees SET merge_state = 'released', updated_at = datetime('now')
|
|
383
|
+
WHERE id <> ? AND worktree_path = ? AND repository_id IS ?
|
|
384
|
+
AND merge_state IN ('building','built','merging','needs-review')`).run(wt.id, wt.worktree_path, wt.repository_id ?? null);
|
|
385
|
+
})();
|
|
386
|
+
};
|
|
355
387
|
// Successful removal already terminalized these rows. Re-running `git
|
|
356
388
|
// worktree remove` against their now-missing paths turns ordinary Publish /
|
|
357
389
|
// Poll / Discard follow-ups into false cleanup_incomplete warnings.
|
|
@@ -370,7 +402,7 @@ async function releaseRailWorktrees(input) {
|
|
|
370
402
|
await input.git.run(['worktree', 'prune'], input.repoDir);
|
|
371
403
|
}
|
|
372
404
|
catch { /* a leftover registration surfaces at checkout with git's own error */ }
|
|
373
|
-
(
|
|
405
|
+
recordRemoved();
|
|
374
406
|
continue;
|
|
375
407
|
}
|
|
376
408
|
if (evidence.failure) {
|
|
@@ -428,7 +460,7 @@ async function releaseRailWorktrees(input) {
|
|
|
428
460
|
continue;
|
|
429
461
|
}
|
|
430
462
|
if (wt.merge_state === 'needs-review' || !(0, rail_worktrees_store_1.isTerminalMergeState)(wt.merge_state)) {
|
|
431
|
-
(
|
|
463
|
+
recordRemoved();
|
|
432
464
|
}
|
|
433
465
|
}
|
|
434
466
|
return warnings;
|
|
@@ -17,8 +17,8 @@ function isTerminalMergeState(s) {
|
|
|
17
17
|
return exports.TERMINAL_MERGE_STATES.has(s);
|
|
18
18
|
}
|
|
19
19
|
function createRailWorktree(db, input) {
|
|
20
|
-
db.prepare(`INSERT INTO rail_worktrees (id, rail_index, ticket_id, run_id, branch, worktree_path, overlay_path, merge_state)
|
|
21
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(input.id, input.railIndex, input.ticketId, input.runId ?? null, input.branch, input.worktreePath, input.overlayPath ?? null, input.mergeState ?? 'building');
|
|
20
|
+
db.prepare(`INSERT INTO rail_worktrees (id, rail_index, ticket_id, run_id, branch, worktree_path, overlay_path, merge_state, repository_id, repository_path)
|
|
21
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.id, input.railIndex, input.ticketId, input.runId ?? null, input.branch, input.worktreePath, input.overlayPath ?? null, input.mergeState ?? 'building', input.repositoryId ?? null, input.repositoryPath ?? null);
|
|
22
22
|
return getRailWorktree(db, input.id);
|
|
23
23
|
}
|
|
24
24
|
function getRailWorktree(db, id) {
|
|
@@ -64,7 +64,7 @@ function listRailWorktreesForTicket(db, ticketId) {
|
|
|
64
64
|
/** True when a prior rail allocation for this ticket used exactly this branch —
|
|
65
65
|
* i.e. an existing branch of that name is OURS to resume (partial work from a
|
|
66
66
|
* stopped run), not a foreign collision to suffix away from. */
|
|
67
|
-
function railWorktreeBranchExistsForTicket(db, ticketId, branch) {
|
|
68
|
-
return (db.prepare('SELECT 1 FROM rail_worktrees WHERE ticket_id = ? AND branch = ? LIMIT 1').get(ticketId, branch) !==
|
|
67
|
+
function railWorktreeBranchExistsForTicket(db, ticketId, branch, repositoryId) {
|
|
68
|
+
return (db.prepare('SELECT 1 FROM rail_worktrees WHERE ticket_id = ? AND branch = ? AND repository_id IS ? LIMIT 1').get(ticketId, branch, repositoryId ?? null) !==
|
|
69
69
|
undefined);
|
|
70
70
|
}
|