elanous 0.2.22 → 0.2.24
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/NOTICE +7 -0
- package/README.md +32 -22
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → Q-7iofoxOEv1WX18S35of}/_buildManifest.js +1 -1
- package/apps/pwa/out/_next/static/chunks/{119fc678.6f591cdb84ca5791.js → 0673cc54.8e2ef1c23e49e190.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{a9f2b54d-40c16bd0efdb04b8.js → 0a09e062-34f747a17d8d8c2e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{f8626309.a4e5d362b1d55e59.js → 0e3acd34.d42b2ef87fdf4234.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +77 -0
- package/apps/pwa/out/_next/static/chunks/{7175-350f4ce2873bc038.js → 1325-dc3f3c21eb181cb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +34 -0
- package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +24 -0
- package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6767.8e6c5f6e744fcd9f.js → 1505.5826671109111e75.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7327-2d69fb321ba73389.js → 1669-da843ed73aa301f5.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +36 -0
- package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +122 -0
- package/apps/pwa/out/_next/static/chunks/2528.0af5c0e1fad88df6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +62 -0
- package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/272-0eed0fb0aab716b6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{7899.597af4a9996c907f.js → 2721.bc9a8f36bd85c07a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +149 -0
- package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3961-aaae04ed1d32622f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +309 -0
- package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{d70879db.c66c56a95a91efc6.js → 4c5e95ce.83e9b16add6fcd8c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6158.566c890adc06a459.js → 5313.1697309c532b9856.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/{79b78388.663188133449d707.js → 53746282.1be36038d1abd949.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5578.ac963634373b28c6.js +286 -0
- package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5967-c0a80f8ffe5d4050.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{1268.0840ff91e083fcbd.js → 5974.360f8441eb0ac1ec.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +74 -0
- package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6571-926ddf024a6ad5df.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +64 -0
- package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{9832.2ab2e818013574c7.js → 6702.ebbd165d5e4a4a14.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +32 -0
- package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +24 -0
- package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +93 -0
- package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6110.1297d4093fdfbb0d.js → 740.90b31555290236a9.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +148 -0
- package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +226 -0
- package/apps/pwa/out/_next/static/chunks/{9070.067c106528ec1ae6.js → 7518.49161e8f5814abdb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +27 -0
- package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +115 -0
- package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7905.b230b9d06cb4ad5d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{8194.484f51e273d9abd2.js → 8264.00e434fbd02e9311.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +8 -0
- package/apps/pwa/out/_next/static/chunks/{088d8e8a.8069543d082bec12.js → 83cfc5c8.349535543c1548b6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +23 -0
- package/apps/pwa/out/_next/static/chunks/{1948.5f35b39eef222a94.js → 8438.ee7f0df3b3f6fcb4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{4588.ad3364cb7fb97ada.js → 8532.a86e99acf9b761cb.js} +2 -2
- package/apps/pwa/out/_next/static/chunks/8569.b853a8daa8f31d12.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8925-2abfb48af477fb7f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{88729267.9c6c000157c83f2f.js → 89849432.9eaa2f4c9c010965.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +90 -0
- package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +94 -0
- package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +41 -0
- package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +287 -0
- package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +79 -0
- package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{3522-1de1319d028ac89c.js → 9502-32c5dc22e8f120f5.js} +3 -3
- package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +104 -0
- package/apps/pwa/out/_next/static/chunks/{7630.2b9a68659053ff4e.js → 9976.8f28864317639fe6.js} +16 -16
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-3b9fc39362473ae7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-24282bf9f90031a5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/consult/{page-80ed511e02c81412.js → page-c0ab229673a8b0eb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/inside/page-22725e2570f1126b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1d809a87139dd024.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-b92caddb5c715f30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-901a1391b81053bc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/b4e12462-5fab4a813a63dadd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{f6b7c9ba.64a895b8b2fedbdc.js → ce383d63.d2ede338788ed18e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{framework-5c169757551134ed.js → framework-b2763b10dc6b3836.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +1 -0
- package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +1 -0
- package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +23 -23
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +23 -23
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +23 -23
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +22 -22
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +22 -22
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +23 -23
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +22 -22
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +23 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +23 -23
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +22 -22
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +23 -23
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +24 -23
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +23 -23
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +23 -23
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +22 -22
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +22 -22
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +23 -23
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +23 -23
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +24 -23
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +22 -22
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +22 -22
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +22 -22
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +23 -23
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +23 -23
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +22 -22
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +22 -22
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +22 -22
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +22 -22
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +23 -23
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +23 -23
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +22 -22
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +23 -23
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +23 -23
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +23 -23
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +23 -23
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +23 -23
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +22 -22
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +23 -23
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +23 -23
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +23 -23
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +23 -23
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +23 -23
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +23 -23
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +23 -23
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +23 -23
- package/catalog/models/anthropic/claude-haiku-5-5.yaml +32 -0
- package/catalog/models/anthropic/claude-opus-5-5.yaml +5 -0
- package/catalog/models/anthropic/claude-sonnet-5-5.yaml +31 -0
- package/catalog/models/anthropic/claude-sonnet-5.yaml +8 -2
- package/catalog/models/openai/gpt-6-astra.yaml +6 -0
- package/catalog/models/openai/gpt-6-luna.yaml +6 -0
- package/catalog/models/openai/gpt-6-sol.yaml +6 -0
- package/catalog/models/openrouter/deepseek-v4-pro-0813.yaml +39 -0
- package/catalog/models/openrouter/deepseek-v4.1-flash.yaml +38 -0
- package/catalog/models/openrouter/glm-5.3-flash.yaml +35 -0
- package/catalog/providers/openrouter.yaml +2 -0
- package/graphs/implement-loop.yaml +31 -0
- package/graphs/log-horizon/log-horizon-watch.yaml +25 -0
- package/graphs/log-horizon/recipes.yaml +3 -0
- package/graphs/ops/harness-gc.yaml +17 -0
- package/graphs/ops/recipes.yaml +3 -0
- package/graphs/overlays/README.md +1 -1
- package/graphs/overlays/stop-heal-ladder.yaml +105 -0
- package/graphs/release/recipes.yaml +1 -1
- package/graphs/release/release-loop.yaml +6 -2
- package/graphs/release-rehearsal/recipes.yaml +12 -0
- package/graphs/release-rehearsal/release-rehearsal.yaml +17 -0
- package/package.json +4 -1
- package/scripts/add-api-key.sh +1 -1
- package/scripts/bench-report.ts +82 -3
- package/scripts/ci-typecheck-changed.ts +80 -14
- package/scripts/fleet/bedrock-pod-secret.ts +122 -0
- package/scripts/fleet/node-setup-linux.sh +97 -0
- package/scripts/fleet/node-setup.sh +11 -0
- package/scripts/fleet/zai-pod-secret.ts +86 -0
- package/scripts/hq/hq-fence-wrapper.sh +148 -0
- package/scripts/land-global-checks.ts +3 -0
- package/scripts/lib/typecheck-ratchet.ts +51 -0
- package/scripts/measure-log-diet-2.ts +213 -0
- package/scripts/measure-tsc-affected-roots.ts +289 -0
- package/scripts/openai-relay-server.ts +5 -1
- package/scripts/release-loop/docs-node.ts +258 -43
- package/scripts/release-loop/gate-executor.ts +28 -0
- package/scripts/release-loop/gate-method.ts +59 -0
- package/scripts/release-loop/gate-node.ts +335 -33
- package/scripts/release-loop/gate-wall.ts +208 -0
- package/scripts/release-loop/known-issues-node.ts +53 -8
- package/scripts/release-loop/publish-at.ts +14 -0
- package/scripts/release-loop/publish-node.ts +17 -2
- package/scripts/release-loop/resume-release.ts +40 -4
- package/scripts/release-loop/resume.ts +94 -0
- package/scripts/release-loop/shard-plan.ts +3 -11
- package/scripts/release-loop/tui-node-checks.ts +22 -0
- package/scripts/release-loop/unattended-release.ts +29 -7
- package/scripts/rhythm/daily.ts +51 -2
- package/scripts/rhythm/weekly.ts +3 -2
- package/scripts/tsc-baseline-cache.ts +147 -0
- package/scripts/tsc-main-safety-net.ts +189 -0
- package/scripts/usage-rollup.ts +64 -8
- package/src/acp/codex-plugins.ts +48 -6
- package/src/agent/monad-agent-turn.ts +67 -5
- package/src/agent/run-context.ts +20 -0
- package/src/agent/tool-profile.ts +28 -2
- package/src/agent-mission/acp-judge.ts +8 -2
- package/src/agent-mission/capabilities-cli.ts +16 -1
- package/src/agent-mission/driver.ts +19 -4
- package/src/agent-mission/pr-review-watch.ts +6 -2
- package/src/agent-mission/resource-ladder.ts +8 -3
- package/src/agent-mission/review-loop.ts +41 -7
- package/src/agent-substrate/acp-implementer.ts +139 -0
- package/src/agent-substrate/acp-reviewer.ts +17 -8
- package/src/agent-substrate/pr-reviewer.ts +191 -28
- package/src/agent-substrate/review-intent.ts +6 -4
- package/src/agent-substrate/self-review-cli.ts +155 -21
- package/src/agent-substrate/shard-boundary-intent.ts +92 -26
- package/src/ask-user-question/pending-questions.ts +8 -2
- package/src/autopilot/build/llm-conflict-merge.ts +216 -12
- package/src/autopilot/codebase-grounding.ts +44 -0
- package/src/autopilot/llm-control-brain.ts +13 -1
- package/src/autopilot/mission-codebase-gate.ts +8 -77
- package/src/autopilot/mission-critique.ts +18 -5
- package/src/autopilot/mission-feasibility-negotiate.ts +11 -10
- package/src/autopilot/mission-trace.ts +12 -1
- package/src/autopilot/pr-manager.ts +12 -3
- package/src/autopilot/system-lookback-run.ts +16 -10
- package/src/bench/bench.ts +183 -0
- package/src/boot/acp-server.ts +4 -7
- package/src/boot/acp-socket-path.ts +7 -0
- package/src/briefing/brief-items.ts +21 -13
- package/src/budget/fetchers/grok.ts +15 -5
- package/src/budget/llm-cost.ts +37 -5
- package/src/budget/types.ts +8 -2
- package/src/budget/unified-usage.ts +88 -6
- package/src/chat/index.ts +12 -3
- package/src/cli/agent-cli.ts +20 -0
- package/src/cli/bench-cli.ts +34 -0
- package/src/cli/brief-cli.ts +27 -21
- package/src/cli/cli-user-error.ts +9 -2
- package/src/cli/guardian-cli.ts +26 -1
- package/src/cli/image-cli.ts +101 -0
- package/src/cli/log-event-names.ts +7 -0
- package/src/cli/logs-cli.ts +1 -0
- package/src/cli/mcp-login.ts +111 -37
- package/src/cli/plugin-cli.ts +21 -1
- package/src/cli/pod-cli.ts +26 -0
- package/src/cli/pr-cli.ts +90 -5
- package/src/cli/pr-land-overlap-evidence.ts +279 -0
- package/src/cli/release-cli.ts +63 -12
- package/src/cli/rfc-status.ts +52 -2
- package/src/cli/self-update.ts +277 -10
- package/src/cli/skills-cli.ts +12 -3
- package/src/cli/tasks-cli.ts +241 -30
- package/src/cli/usage-cli.ts +91 -8
- package/src/context-bus/context-first.ts +51 -2
- package/src/context-bus/context-now-surfaces.ts +13 -2
- package/src/context-bus/long-term-memory.ts +3 -1
- package/src/context-bus/nightly-condense.ts +3 -2
- package/src/core-turn/run-goal-loop.ts +87 -2
- package/src/dashboard/ad-run-setup-bindings.ts +279 -0
- package/src/dashboard/chat-fold.ts +20 -0
- package/src/dashboard/first-screen-band.ts +151 -1
- package/src/dashboard/index.ts +45 -281
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -3
- package/src/dashboard/stale-install-check.ts +24 -2
- package/src/dashboard/turn-stream-formatter.ts +25 -0
- package/src/debug/log-diet.ts +190 -0
- package/src/debug/log.ts +70 -17
- package/src/display/coordinator.ts +25 -2
- package/src/domains/coo-admin-tool.ts +27 -0
- package/src/domains/cron-match.ts +1 -0
- package/src/domains/outbound-alert.ts +17 -6
- package/src/domains/release-tool.ts +158 -10
- package/src/domains/schedule-registry.ts +10 -7
- package/src/domains/schedule-runner.ts +1 -0
- package/src/elanous-config-dir.ts +2 -2
- package/src/elanous-daemon.ts +3 -3
- package/src/error-report/report.ts +21 -4
- package/src/execution-loop/launch-gate.ts +1 -1
- package/src/expression/i18n/messages.en.ts +5 -0
- package/src/expression/i18n/messages.ja.ts +5 -0
- package/src/expression/i18n/messages.ko.ts +5 -0
- package/src/expression/i18n/messages.zh.ts +5 -0
- package/src/expression/i18n/types.ts +8 -0
- package/src/github/pr-labels.ts +2 -0
- package/src/graph-runner/graph-cli.ts +42 -1
- package/src/graph-runner/runner.ts +218 -8
- package/src/grok/usage.ts +23 -2
- package/src/grounding/ref-index.ts +253 -0
- package/src/harness/dispatch-backpressure.ts +267 -0
- package/src/harness/harness-clean.ts +199 -78
- package/src/harness/harness-cli-command.ts +229 -35
- package/src/harness/harness-gc.ts +331 -0
- package/src/harness/harness-seams.ts +2 -20
- package/src/harness/harness-stop.ts +4 -2
- package/src/harness/harness-substrate-default.ts +214 -8
- package/src/harness/launch-registry.ts +6 -0
- package/src/harness/nested-elanous-policy.ts +4 -2
- package/src/harness/worktree-branch-prefix.ts +9 -0
- package/src/hq/fence-wrapper.ts +7 -0
- package/src/hq/fence.ts +187 -0
- package/src/hq/hq.ts +33 -2
- package/src/hq/lease.ts +13 -0
- package/src/hq/seats.ts +133 -21
- package/src/images/image-ledger.ts +179 -0
- package/src/index.ts +250 -69
- package/src/instance/child-scope.ts +32 -1
- package/src/instance/dev-project.ts +133 -0
- package/src/instance/resolve.ts +24 -0
- package/src/instance/spawn-elanous.ts +45 -0
- package/src/intake-plane/collect-github.ts +19 -1
- package/src/intake-plane/digest.ts +45 -20
- package/src/intake-plane/lens.ts +36 -8
- package/src/intake-plane/ref-prefetch.ts +110 -0
- package/src/intelligence-map/model-alias.ts +6 -0
- package/src/intelligence-map/model-catalog.ts +113 -0
- package/src/knowledge/kgs/pack.ts +5 -2
- package/src/knowledge/kgs/sqlite-store.ts +15 -0
- package/src/knowledge/tools/knowledge-query.ts +20 -2
- package/src/knowledge/write.ts +234 -2
- package/src/llm/bedrock-eventstream.ts +215 -0
- package/src/llm/bedrock-provider.ts +248 -0
- package/src/llm/bedrock.ts +491 -0
- package/src/llm/openrouter-byok-cost.ts +96 -0
- package/src/llm/openrouter-deepseek.ts +151 -0
- package/src/llm/openrouter-upstream-pins.config.ts +25 -0
- package/src/llm/provider-credentials.ts +3 -1
- package/src/llm/zai-coding-plan.ts +700 -0
- package/src/llm.ts +383 -41
- package/src/loops/budget.ts +150 -0
- package/src/loops/checker.ts +148 -9
- package/src/loops/orchestrator/resync-shadow.ts +34 -7
- package/src/loops/orchestrator/seat-share.ts +6 -49
- package/src/loops/orchestrator/traffic.ts +5 -81
- package/src/market/signed-index.ts +42 -0
- package/src/maturity/feature-maturity.ts +2 -2
- package/src/mcp/mcp-oauth.ts +136 -17
- package/src/model-tier/llm-tier-map.ts +52 -4
- package/src/models/prompts.ts +23 -1
- package/src/mss/logging/horizon-watch.ts +168 -0
- package/src/mss/logging/log-store.ts +262 -26
- package/src/native-tool-catalog.ts +1 -1
- package/src/nexus/api/consult-requests.ts +7 -10
- package/src/nexus/api/discord-trigger-bot.ts +6 -3
- package/src/nexus/api/error-reports.ts +30 -8
- package/src/nexus/api/http-server.ts +8 -0
- package/src/nexus/api/loop-resources.ts +42 -0
- package/src/nexus/api/missions.ts +73 -2
- package/src/nexus/api/ops-api.ts +18 -0
- package/src/nexus/api/outbound-report.ts +8 -3
- package/src/nexus/api/telegram-trigger-bot.ts +6 -3
- package/src/nexus/index.ts +17 -75
- package/src/nexus/outbound/format.ts +2 -0
- package/src/nexus/outbound/router.ts +198 -13
- package/src/nexus/tools-kind.ts +78 -0
- package/src/oauth/codex-account-rotation.ts +55 -20
- package/src/oauth/codex-account-store.ts +451 -23
- package/src/oauth/fallback-chain.ts +75 -15
- package/src/onboarding/first-run.ts +37 -18
- package/src/onboarding/web-first.ts +20 -2
- package/src/onboarding.ts +2 -1
- package/src/ops/machine-heartbeat.ts +185 -0
- package/src/ops/overview-cache.ts +175 -0
- package/src/ops/overview.ts +8 -0
- package/src/plugins/adapters/claude-package.ts +4 -12
- package/src/plugins/core/capability-policy.ts +141 -0
- package/src/plugins/core/host.ts +21 -8
- package/src/plugins/core/manifest.ts +19 -2
- package/src/plugins/core/trust-store.ts +15 -0
- package/src/plugins/core/types.ts +12 -0
- package/src/plugins/install/market-fetch.ts +68 -16
- package/src/plugins/install/plugin-install.ts +187 -16
- package/src/plugins/maker/plugin-maker.ts +25 -20
- package/src/plugins/maker/wizard-generate.ts +16 -2
- package/src/policy/llm-policy.ts +14 -1
- package/src/process/pid-liveness.ts +1 -1
- package/src/prompt-cache/openai.ts +13 -6
- package/src/prompt-cache/openrouter.ts +94 -0
- package/src/prompt-cache/types.ts +5 -0
- package/src/prompt-enhance/enhance.ts +69 -5
- package/src/prompt-library/family-prompt-coverage.ts +1 -0
- package/src/prompt-library/universal-preamble.ts +2 -2
- package/src/registry/discovery/openrouter-live-resolve.ts +122 -0
- package/src/registry/loader.ts +6 -1
- package/src/release-loop/checklist.ts +24 -9
- package/src/release-loop/feature-store.ts +3 -0
- package/src/release-loop/gate-shards.ts +48 -4
- package/src/release-loop/landed-to-green.ts +81 -0
- package/src/release-loop/light-rc.ts +11 -1
- package/src/release-loop/merged-pr-checklist.ts +10 -0
- package/src/release-loop/placement.ts +107 -23
- package/src/release-loop/rehearsal.ts +317 -0
- package/src/release-loop/release-schedule.ts +13 -1
- package/src/release-loop/rubric-types.ts +1 -0
- package/src/release-loop/rubric.ts +2 -2
- package/src/requirements/requirement-ledger.ts +536 -0
- package/src/retro/daily.ts +26 -12
- package/src/seat-loop/seat-loop.ts +66 -11
- package/src/seat-loop/traffic-signal.ts +44 -0
- package/src/self-dev/ask-launch-flow.ts +2 -2
- package/src/self-dev/dev-cli.ts +109 -11
- package/src/self-dev/dev-pipeline.ts +11 -8
- package/src/self-dev/draft-residue.ts +475 -0
- package/src/self-dev/draft-sweep.ts +254 -10
- package/src/self-dev/draft-triage-rules.ts +27 -1
- package/src/self-dev/graph-journey-route.ts +6 -0
- package/src/self-dev/launch-preflight-text.ts +549 -0
- package/src/self-dev/launch-preflight.ts +10 -545
- package/src/self-dev/orchestrate-cli.ts +82 -5
- package/src/self-dev/orchestrate-summary-line.ts +13 -0
- package/src/self-dev/orchestrate.ts +49 -141
- package/src/self-dev/review-provider-fallback.ts +115 -19
- package/src/self-dev/run-store.ts +1 -3
- package/src/self-dev/run-supervisor.ts +190 -36
- package/src/self-dev/run-types.ts +191 -0
- package/src/self-dev/shard-aggregate.ts +61 -13
- package/src/self-dev/shard-plan.ts +5 -1
- package/src/self-dev/shard-run.ts +23 -5
- package/src/self-dev/supervisor-verdict-edges.ts +3 -4
- package/src/self-implement/blocked-draft-policy.ts +3 -19
- package/src/self-implement/budget-gate.ts +53 -13
- package/src/self-implement/child-context-composition.ts +139 -0
- package/src/self-implement/child-llm-preference.ts +13 -5
- package/src/self-implement/claude-acp-implement.ts +67 -0
- package/src/self-implement/draft-on-stop-mode.ts +18 -0
- package/src/self-implement/flex-signals.ts +59 -0
- package/src/self-implement/follow-up-goals.ts +114 -38
- package/src/self-implement/frozen-merges.ts +8 -3
- package/src/self-implement/gate-baseline-reap.ts +157 -0
- package/src/self-implement/gate-baseline.ts +78 -16
- package/src/self-implement/gate-cli.ts +12 -2
- package/src/self-implement/gate-remote.ts +17 -6
- package/src/self-implement/goal-author-decompose.ts +10 -2
- package/src/self-implement/goal-author.ts +48 -13
- package/src/self-implement/goal-digest.ts +19 -0
- package/src/self-implement/graph-overlay-condition.ts +32 -0
- package/src/self-implement/graph-overlay-yaml.ts +41 -7
- package/src/self-implement/graph-templates.ts +33 -1
- package/src/self-implement/graph-yaml.ts +56 -0
- package/src/self-implement/headless-elanous-driver.ts +11 -9
- package/src/self-implement/heal-intake.ts +5 -1
- package/src/self-implement/host-regate.ts +120 -29
- package/src/self-implement/l8-merge-queue.ts +67 -5
- package/src/self-implement/merge-train.ts +131 -0
- package/src/self-implement/off-diff-evidence.ts +9 -0
- package/src/self-implement/orchestrator.ts +271 -25
- package/src/self-implement/review-finding-recurrence.ts +28 -0
- package/src/self-implement/rework-policy.ts +2 -1
- package/src/self-implement/round-summary-card.ts +63 -0
- package/src/self-implement/run-ledger.ts +4 -3
- package/src/self-implement/run-step-projection.ts +147 -0
- package/src/self-implement/run-stop.ts +1 -1
- package/src/self-implement/running-runs.ts +75 -5
- package/src/self-implement/seams.ts +83 -4
- package/src/self-implement/self-implement-cli.ts +12 -5
- package/src/self-implement/stop-autoheal.ts +69 -2
- package/src/self-implement/train-gate-remote.ts +158 -0
- package/src/session-runtime/index.ts +10 -1
- package/src/session-runtime/retry-api.ts +11 -1
- package/src/session-runtime/retry-policy.ts +2 -1
- package/src/skills/gift-install.ts +119 -0
- package/src/skills/runner.ts +59 -2
- package/src/skills/skill-feedback.ts +31 -1
- package/src/skills/skill-tier.ts +1 -0
- package/src/smart-wizard/capability-index.ts +231 -0
- package/src/smart-wizard/rung.ts +74 -0
- package/src/steward/launch.ts +22 -10
- package/src/steward/triage-budget.ts +62 -0
- package/src/steward/triage.ts +87 -24
- package/src/storage/file-lock.ts +8 -1
- package/src/task-agent/actions.ts +66 -5
- package/src/task-agent/card-evidence.ts +59 -13
- package/src/task-agent/completion-evidence.ts +5 -0
- package/src/task-agent/cover.ts +101 -3
- package/src/task-agent/judge.ts +20 -3
- package/src/task-agent/land-order-ledger.ts +95 -0
- package/src/task-agent/land-worktree.ts +201 -0
- package/src/task-agent/live-move-history.ts +219 -0
- package/src/task-agent/live-moves.ts +451 -34
- package/src/task-agent/parent-host.ts +117 -8
- package/src/task-agent/rejudge-on-head.ts +352 -0
- package/src/task-agent/review-prior-fix.ts +146 -0
- package/src/task-agent/review-result-capture.ts +218 -0
- package/src/task-agent/run-adopt.ts +136 -0
- package/src/task-agent/shadow.ts +154 -14
- package/src/task-agent/task-hand.ts +186 -14
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +38 -5
- package/src/task-orchestrator/surfaces/pod-bedrock-child.ts +74 -0
- package/src/task-orchestrator/surfaces/pod-child-default.ts +50 -0
- package/src/task-orchestrator/surfaces/pod-child-providers.ts +42 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +6 -3
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +94 -7
- package/src/task-orchestrator/surfaces/pod-image-source.ts +212 -0
- package/src/task-orchestrator/surfaces/pod-lease.ts +110 -17
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +32 -3
- package/src/task-orchestrator/surfaces/pod-pool.ts +86 -18
- package/src/task-orchestrator/surfaces/pod-zai-child.ts +101 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +463 -50
- package/src/task-orchestrator/surfaces/self-implement.ts +25 -3
- package/src/telegram-service.ts +5 -1
- package/src/telegram.ts +17 -4
- package/src/time/format.ts +13 -4
- package/src/tool-runtime/goal-author-runtime.ts +1 -0
- package/src/tool-runtime/self-cognition-catalog.ts +23 -0
- package/src/tool-runtime/self-cognition-runtimes.ts +2 -24
- package/src/typecheck-ratchet.ts +1 -0
- package/src/user-config.ts +180 -32
- package/src/ux-sim/slash-menu-frames.ts +168 -0
- package/src/version/packed-revision.json +1 -1
- package/src/web-terminal/preview-tap-registry.ts +5 -2
- package/src/workflow-runtime/triggers/registry.ts +59 -0
- package/src/workflow-runtime/triggers/scheduler.ts +1 -0
- package/src/workflow-runtime/triggers/webhook-source.ts +35 -5
- package/apps/pwa/out/_next/static/chunks/1109.78a7a3288c0259d9.js +0 -148
- package/apps/pwa/out/_next/static/chunks/115.1c6690b8604f81c4.js +0 -32
- package/apps/pwa/out/_next/static/chunks/1262.76a3f08e67c5f816.js +0 -309
- package/apps/pwa/out/_next/static/chunks/1307-08b716476f1d50af.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1358d292.5c87f12cad6eaa91.js +0 -122
- package/apps/pwa/out/_next/static/chunks/1438.27a1a7b8f2308004.js +0 -149
- package/apps/pwa/out/_next/static/chunks/1442.02d85cd88f4c1eac.js +0 -79
- package/apps/pwa/out/_next/static/chunks/1501-1aad662d82ba43f7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1584.9e2dd53da6e6d4b1.js +0 -24
- package/apps/pwa/out/_next/static/chunks/1586.b989b0614afb77e6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1609.2ad355062870151f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1612-f6df0fc0eed7157b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1923.37f1d5fe7ebe3860.js +0 -27
- package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1993.3fd074a2a246234e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/211-9c9090c59e2c5907.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2140.d2daf9ee96e295d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2212.0359851457473efc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/224.583e562365a52f74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2328.0f37465646bafa7d.js +0 -36
- package/apps/pwa/out/_next/static/chunks/2372.bf71372184991937.js +0 -286
- package/apps/pwa/out/_next/static/chunks/2489-d238d3e2eb5b2bf5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2549-a8515c86f9e8cb96.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2655.72cc6a97276c5acc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2743-ef6e8c3ced74cce5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2840-5458ad50c49cac6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2856.f75d5baef7f49b74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3344.0de4b0ec5a454b7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/335.a13f339e97893437.js +0 -94
- package/apps/pwa/out/_next/static/chunks/3394.646348f34b2500be.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3443.6276909b53d72d53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3495.abd4254d808bf2dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3721.ba5b82db0d9a5572.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3857-5985236d9307f676.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3919.9ff7dc25afefee33.js +0 -74
- package/apps/pwa/out/_next/static/chunks/3998.bd9a69d9b50e9bd2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4003.ab6db1dc266576c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4144-fad095b48a1862ee.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4216.e8ac94b9fe6b96ab.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4327.c44dc2b55cb43ee5.js +0 -34
- package/apps/pwa/out/_next/static/chunks/4401.94257d497b6d26bc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4559.17ca2cdbaa8d414f.js +0 -115
- package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4706.97e734bd4c9816ca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4982.6e44352f751b9a1b.js +0 -77
- package/apps/pwa/out/_next/static/chunks/5342.49c5c5a530e62b50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5360-08a80abdf3a4da99.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5431.66c58ab1327ee0b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5633-d6852385000738ef.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5717.bcfcb96e701b82e0.js +0 -90
- package/apps/pwa/out/_next/static/chunks/5755-30d102586789bf7f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5957.3f1a4012388dd962.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5977-5b9e8a45a5b0c823.js +0 -1
- package/apps/pwa/out/_next/static/chunks/602.9bf02ac8e9502598.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6020.3a1b347e2d2dfacc.js +0 -8
- package/apps/pwa/out/_next/static/chunks/6375.fce1d174ba6d0324.js +0 -64
- package/apps/pwa/out/_next/static/chunks/6546.92a828aef441271f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/658.957fdb0a8c6c6c8e.js +0 -287
- package/apps/pwa/out/_next/static/chunks/6706.323590aabb8b1293.js +0 -226
- package/apps/pwa/out/_next/static/chunks/6747.b67947f293a4c02d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6868.000b24a3045c5574.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6946.bba74e9c96050f30.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7033.a558f1b2f6912a53.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7065.46029c26c53eac50.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7087.6fae577d09249bc1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/722.de8d9801e0f6d414.js +0 -41
- package/apps/pwa/out/_next/static/chunks/726.83532d69452ee24b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7497.57981e9d7a75a52a.js +0 -24
- package/apps/pwa/out/_next/static/chunks/7672.4af122ad892117c7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/771.6ab889a233e7dae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8096.f7da0776cfde6300.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8401-35e94e9091f5eb8d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8769.815ca69879f608b4.js +0 -104
- package/apps/pwa/out/_next/static/chunks/8857-aa1cc4ac90af4d40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8f835b4f.048eeb02299e3e12.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9068.5f2764fccf86c1b2.js +0 -93
- package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9247-55bcfbb0e8057f59.js +0 -1
- package/apps/pwa/out/_next/static/chunks/935.4ddaa99fc1d1126c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9451.ebfb0dcc9c02250f.js +0 -23
- package/apps/pwa/out/_next/static/chunks/9559.e648369b1d57cf9a.js +0 -62
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-88459e0903da2803.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-d85c43f46f58716b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-4e645600579ae952.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-87edbfd19117823b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-7f0c2b7801ac6a54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/page-bf1f030a9d1adffd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-cbaf66b1e1804adf.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-9f5610caaa06178c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-ec8f3575e339de74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-86d753e460f1a989.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-4166a7d51cf0a57d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-2a19c5cd3b562580.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-b6a09cde2e07521a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-f7eae1518ca0c353.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-456a8573ad811381.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-8462d6a543cbb2d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-2974cdfb87c0f9c9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-f927ffa25f3c86d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-abd86cd832aaa011.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-79daf68f6256adaa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8c3f168fc3f91939.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-786fb4504d0f2fa9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-75209f14597dcb8f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-bf30affe3a85af7e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1187a44b7515434b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-3d0910185a66ed54.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f401ee1dd5a26e25.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-5dfe7604fd842784.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-76cf838050a8d681.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-7ec8e289b4c14df6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-8c8ac17d52be2a79.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-d359ab048d63a9d9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-b8b345c880bf78d1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-f151cc10ad026940.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9875f103057da433.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-9789328af9a9aa62.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-bf495a1e284f4e00.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-a263d94bca4be22a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-3962eab8ec58d16e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-9abcfac07e02a542.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-bee49f927c333abb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-bac2d56dcb02d955.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-937cbcc13176295c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d09495594f7f480d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-69cb93d1a2e57e0e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-72ec543928d67c3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-82906eeda0186a7b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/f6231284-45726550aba08fca.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-f2b4016b9b981bc8.js +0 -1
- package/apps/pwa/out/_next/static/css/f2bd5257e6af88d8.css +0 -1
- /package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → Q-7iofoxOEv1WX18S35of}/_ssgManifest.js +0 -0
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// planHarnessClean = 순수 분류(테스트). execHarnessClean = git/gh IO + 실제 제거.
|
|
6
6
|
|
|
7
7
|
import { spawnSync } from 'node:child_process';
|
|
8
|
-
import { existsSync, readdirSync } from 'node:fs';
|
|
8
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
9
9
|
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
10
10
|
import { listPtyManifest, type PtyManifestRow } from '../pty-shell/pty-manifest.js';
|
|
11
11
|
import { debug } from '../debug/log.js';
|
|
@@ -30,19 +30,15 @@ export interface OrphanedWorktree {
|
|
|
30
30
|
path: string;
|
|
31
31
|
safety: OrphanWorktreeSafety;
|
|
32
32
|
}
|
|
33
|
-
/**
|
|
34
|
-
*
|
|
35
|
-
* ⇒ 근거: 이 파일의 실제 사고는 *"못 셌는데 지웠다"* 였다(`gh` 실패 → 열린 PR 브랜치 삭제).
|
|
36
|
-
* 고아 조회만 실패해도 저장소 상태를 **부분적으로만** 아는 것이므로, 덜 지우는 쪽으로 기운다.
|
|
37
|
-
* ⚠️ 이것으로 must-fix 를 만들지 말 것 — 의도된 결정이다.
|
|
38
|
-
*
|
|
39
|
-
* ⚠️ `unavailable` 는 **계획 자체가 미확정**이라는 뜻이다 — 「지울 게 없었다」와 구별하려고 계획에 싣는다.
|
|
40
|
-
* 이 필드가 없으면 `remove: []`·`preserve: []`(후보가 0개인 경우)와 조회 실패가 또 한 값이 된다(리뷰 should-fix). */
|
|
33
|
+
/** `unavailable` 는 등록된 브랜치·워크트리 판정의 필수 조회 실패다.
|
|
34
|
+
* 고아 스캔 전용 조회 실패는 `orphanScan` 에만 남기고 삭제 판정으로 전파하지 않는다. */
|
|
41
35
|
export interface HarnessCleanPlan {
|
|
42
36
|
remove: CleanPlanItem[];
|
|
43
37
|
preserve: CleanPlanItem[];
|
|
44
38
|
orphanedWorktrees: string[];
|
|
45
39
|
orphanedWorktreeSafety: OrphanedWorktree[];
|
|
40
|
+
orphanScan: 'scanned' | 'unavailable' | 'not-requested';
|
|
41
|
+
orphanScanFailure?: 'bare-common-dir' | 'directories' | 'registeredWorktrees';
|
|
46
42
|
unavailable: boolean;
|
|
47
43
|
queryStatus?: HarnessCleanQueryStatus;
|
|
48
44
|
/** ⭐ 관측 — **이 실행이 무엇을 봤나**(2026-08-03 · 관측 우선 지시).
|
|
@@ -77,6 +73,8 @@ export interface HarnessCleanPlan {
|
|
|
77
73
|
branchlessWorktrees?: number;
|
|
78
74
|
/** 그중 gitdir 이 사라져 porcelain `prunable` 로 표시된 등록 수. */
|
|
79
75
|
prunableWorktrees?: number;
|
|
76
|
+
/** Bare repositories have no main checkout; number of distinct harness parents inspected. */
|
|
77
|
+
bareDirectoryParents?: number;
|
|
80
78
|
};
|
|
81
79
|
/** 조회별 소요 시간(밀리초). 키는 `queryStatus` 조회 칸과 같다. 못 잰 칸은 생략한다. */
|
|
82
80
|
queryTimings?: HarnessCleanQueryTimings;
|
|
@@ -90,7 +88,9 @@ export interface HarnessCleanQueryStatus {
|
|
|
90
88
|
/** PR 조회는 성공했지만, 해당 상태의 결과가 상한에 닿아 완전하지 않을 수 있다. */
|
|
91
89
|
pullRequestsTruncated?: { open: boolean; merged: boolean };
|
|
92
90
|
directories?: boolean;
|
|
91
|
+
directoriesFailure?: 'bare-common-dir' | 'directories';
|
|
93
92
|
registeredWorktrees?: boolean;
|
|
93
|
+
pullRequestsUnreadBranches?: number;
|
|
94
94
|
/** Live-terminal working-directory lookup completed successfully. */
|
|
95
95
|
activeDirectories?: boolean;
|
|
96
96
|
}
|
|
@@ -107,7 +107,7 @@ export const HARNESS_CLEAN_QUERY_TIMING_KEYS = [
|
|
|
107
107
|
export type HarnessCleanQueryTimingKey = (typeof HARNESS_CLEAN_QUERY_TIMING_KEYS)[number];
|
|
108
108
|
/** 조회별 소요 시간(밀리초). 못 잰 칸은 키 자체가 없다 — 0 으로 채우지 않는다. */
|
|
109
109
|
export type HarnessCleanQueryTimings = Partial<Record<HarnessCleanQueryTimingKey, number>>;
|
|
110
|
-
export interface HarnessCleanQuery<T> { ok: boolean; value: T; }
|
|
110
|
+
export interface HarnessCleanQuery<T> { ok: boolean; value: T; failure?: 'bare-common-dir' | 'directories'; }
|
|
111
111
|
export type ActiveDirectoryProvider = () => HarnessCleanQuery<string[]>;
|
|
112
112
|
|
|
113
113
|
/** A directory is active when it is the worktree root or a descendant, never a sibling sharing its prefix. */
|
|
@@ -184,6 +184,7 @@ export function planHarnessClean(input: {
|
|
|
184
184
|
activeDirectories?: readonly string[];
|
|
185
185
|
worktreeDirectories?: string[];
|
|
186
186
|
registeredWorktreePaths?: readonly string[];
|
|
187
|
+
pullRequestsUnread?: ReadonlySet<string>;
|
|
187
188
|
orphanBranchQueryOk?: boolean;
|
|
188
189
|
orphanBranches?: ReadonlySet<string>;
|
|
189
190
|
orphanDirectoryEntries?: ReadonlyMap<string, readonly string[]>;
|
|
@@ -220,6 +221,11 @@ export function planHarnessClean(input: {
|
|
|
220
221
|
|| input.queryStatus?.registeredWorktrees === false;
|
|
221
222
|
const orphanInputsComplete = input.worktreeDirectories !== undefined
|
|
222
223
|
&& input.registeredWorktreePaths !== undefined;
|
|
224
|
+
const orphanScan = input.worktreeDirectories === undefined && input.registeredWorktreePaths === undefined && !orphanQueriesFailed
|
|
225
|
+
? 'not-requested' : orphanQueriesFailed || !orphanInputsComplete ? 'unavailable' : 'scanned';
|
|
226
|
+
const orphanScanFailure = orphanScan !== 'unavailable' ? undefined
|
|
227
|
+
: input.queryStatus?.directories === false || input.worktreeDirectories === undefined ? input.queryStatus?.directoriesFailure ?? 'directories'
|
|
228
|
+
: 'registeredWorktrees';
|
|
223
229
|
const registeredWorktreePaths = new Set(
|
|
224
230
|
(input.registeredWorktreePaths ?? []).map((path) => resolve(path)),
|
|
225
231
|
);
|
|
@@ -266,16 +272,12 @@ export function planHarnessClean(input: {
|
|
|
266
272
|
|| !queryStatus.branches
|
|
267
273
|
|| !queryStatus.pullRequests
|
|
268
274
|
|| openTruncated
|
|
269
|
-
|| queryStatus.directories === false
|
|
270
|
-
|| queryStatus.registeredWorktrees === false
|
|
271
275
|
|| queryStatus.activeDirectories === false);
|
|
272
276
|
const failedQueryNames = queryStatus === undefined ? [] : [
|
|
273
277
|
!queryStatus.worktrees ? 'worktrees' : undefined,
|
|
274
278
|
!queryStatus.branches ? 'branches' : undefined,
|
|
275
279
|
!queryStatus.pullRequests ? 'pullRequests' : undefined,
|
|
276
280
|
openTruncated ? 'pullRequests-truncated-open' : undefined,
|
|
277
|
-
queryStatus.directories === false ? 'directories' : undefined,
|
|
278
|
-
queryStatus.registeredWorktrees === false ? 'registeredWorktrees' : undefined,
|
|
279
281
|
queryStatus.activeDirectories === false ? 'activeDirectories' : undefined,
|
|
280
282
|
].filter((name): name is string => name !== undefined);
|
|
281
283
|
const queryFailedReason = `query-failed:${failedQueryNames.join(',')}`;
|
|
@@ -290,6 +292,10 @@ export function planHarnessClean(input: {
|
|
|
290
292
|
continue;
|
|
291
293
|
}
|
|
292
294
|
if (queryFailed) { preserve.push({ ...base, reason: queryFailedReason }); continue; }
|
|
295
|
+
if (input.pullRequestsUnread?.has(branch)) {
|
|
296
|
+
preserve.push({ ...base, reason: 'query-failed:pullRequests' });
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
293
299
|
// ⛔ 이 브랜치를 «못 찾았고» 목록이 잘렸다 ⇒ 「PR 없음」이 아니라 「모른다」다. 보존한다.
|
|
294
300
|
if (truncatedUnknown(branch)) {
|
|
295
301
|
preserve.push({ ...base, reason: 'pullRequests-truncated:merged; branch-not-in-partial-list' });
|
|
@@ -360,13 +366,15 @@ export function planHarnessClean(input: {
|
|
|
360
366
|
if (hit) remove.push({ ...base, reason: `${openPr.has(branch) ? 'force-open-pr' : merged ? 'merged' : 'abandoned'}; ${ladderReason}; ownership=${ownership.status}` });
|
|
361
367
|
else preserve.push({ ...base, reason: `${ladderReason}; ownership=${ownership.status}; ${merged ? 'merged(not-in-mode)' : 'not-in-mode'}` });
|
|
362
368
|
}
|
|
363
|
-
//
|
|
369
|
+
// 필수 조회 실패는 unavailable, 고아 전용 조회 실패는 orphanScan 으로 별도 관측한다.
|
|
364
370
|
const queryTimings = compactQueryTimings(input.queryTimings);
|
|
365
371
|
return {
|
|
366
372
|
remove,
|
|
367
373
|
preserve,
|
|
368
374
|
orphanedWorktrees,
|
|
369
375
|
orphanedWorktreeSafety,
|
|
376
|
+
orphanScan,
|
|
377
|
+
...(orphanScanFailure ? { orphanScanFailure } : {}),
|
|
370
378
|
unavailable: queryFailed,
|
|
371
379
|
...(queryStatus ? { queryStatus } : {}),
|
|
372
380
|
...(queryTimings ? { queryTimings } : {}),
|
|
@@ -569,18 +577,22 @@ export function listHarnessBranches(branchPrefix: string, run: GitRunner = defau
|
|
|
569
577
|
};
|
|
570
578
|
}
|
|
571
579
|
|
|
572
|
-
export function listAllHarnessBranches(): HarnessCleanQuery<string[]> {
|
|
573
|
-
const result = git(['for-each-ref', '--format=%(refname:short)', 'refs/heads', 'refs/remotes']);
|
|
580
|
+
export function listAllHarnessBranches(run: GitRunner = defaultGitRunner): HarnessCleanQuery<string[]> {
|
|
581
|
+
const result = git(['for-each-ref', '--format=%(refname:short)', 'refs/heads', 'refs/remotes'], run);
|
|
574
582
|
return {
|
|
575
583
|
ok: result.ok,
|
|
576
584
|
value: result.ok ? result.out.split('\n').map((s) => s.trim()).filter(Boolean) : [],
|
|
577
585
|
};
|
|
578
586
|
}
|
|
579
587
|
|
|
580
|
-
export function listDirectoryEntries(paths: readonly string[]): HarnessCleanQuery<Map<string, string[]>> {
|
|
588
|
+
export function listDirectoryEntries(paths: readonly string[], expired: () => boolean = () => false): HarnessCleanQuery<Map<string, string[]>> {
|
|
581
589
|
const entries = new Map<string, string[]>();
|
|
582
590
|
try {
|
|
583
|
-
for (const path of paths)
|
|
591
|
+
for (const path of paths) {
|
|
592
|
+
// Deadline between reads: an unfinished listing is a failed query (orphans stay unjudged), never partial «ok».
|
|
593
|
+
if (expired()) return { ok: false, value: new Map() };
|
|
594
|
+
entries.set(path, readdirSync(path).sort());
|
|
595
|
+
}
|
|
584
596
|
return { ok: true, value: entries };
|
|
585
597
|
} catch {
|
|
586
598
|
return { ok: false, value: new Map() };
|
|
@@ -598,39 +610,99 @@ export function listRegisteredWorktreePaths(run: GitRunner = defaultGitRunner):
|
|
|
598
610
|
: { ok: false, value: [] };
|
|
599
611
|
}
|
|
600
612
|
|
|
601
|
-
/**
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
export function listHarnessWorktreeDirectories(
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
ok:
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
613
|
+
/** Ownership marker written per harness worktree (`harness-worktree-add.ts` · `readWorktreeProvenance`). */
|
|
614
|
+
const HARNESS_OWNER_CONFIG_KEY = 'elanous.harness.owner';
|
|
615
|
+
|
|
616
|
+
/** Physical child directories of every relevant harness parent. Read-only; unknown stays distinct from empty. */
|
|
617
|
+
export function listHarnessWorktreeDirectories(
|
|
618
|
+
repoRoot?: string,
|
|
619
|
+
run: GitRunner = defaultGitRunner,
|
|
620
|
+
worktreeRoot = configuredWorktreeRoot(),
|
|
621
|
+
): HarnessCleanQuery<string[]> & { scope?: { rootKind: 'main' | 'bare'; parents: number } } {
|
|
622
|
+
let rootKind: 'main' | 'bare' = 'main';
|
|
623
|
+
let missingRegistrations = 0;
|
|
624
|
+
let roots: string[];
|
|
625
|
+
if (repoRoot) {
|
|
626
|
+
roots = [repoRoot];
|
|
627
|
+
} else {
|
|
628
|
+
// A linked checkout's top level is not the main root. The common directory identifies it.
|
|
629
|
+
const common = gitStdout(['rev-parse', '--path-format=absolute', '--git-common-dir'], run);
|
|
630
|
+
if (!common.ok || !common.value) return { ok: false, value: [], failure: 'directories' };
|
|
631
|
+
if (basename(common.value) === '.git') {
|
|
632
|
+
roots = [dirname(common.value)];
|
|
633
|
+
} else {
|
|
634
|
+
const bare = gitStdout([`--git-dir=${common.value}`, 'rev-parse', '--is-bare-repository'], run);
|
|
635
|
+
if (!bare.ok || bare.value !== 'true') return { ok: false, value: [], failure: 'bare-common-dir' };
|
|
636
|
+
rootKind = 'bare';
|
|
637
|
+
const registered = listRegisteredWorktreePaths(run);
|
|
638
|
+
if (!registered.ok) {
|
|
639
|
+
// Already known to be bare: keep that scope observable even though nothing was read.
|
|
640
|
+
debug.log('harness.clean', 'directories-scope', { rootKind, candidates: 0, parents: 0, entries: 0, ok: false, failedCode: 'worktree-list' });
|
|
641
|
+
return { ok: false, value: [], failure: 'directories', scope: { rootKind, parents: 0 } };
|
|
642
|
+
}
|
|
643
|
+
// A registered checkout is excluded as a «harness child» only when git records harness
|
|
644
|
+
// ownership on that worktree (`elanous.harness.owner`, written by harness-worktree-add) —
|
|
645
|
+
// independent of whether its launching checkout is still registered (review r4).
|
|
646
|
+
// Path shape alone never excludes (review r2–r3): a human checkout anywhere, or a child whose
|
|
647
|
+
// marker is absent/unreadable, stays a candidate — its parent is normally ENOENT (adds
|
|
648
|
+
// nothing), and an unreadable one fails closed. The `.worktrees` parent test below only
|
|
649
|
+
// narrows which checkouts are worth a git call: every harness child sits directly under one.
|
|
650
|
+
const markers = gitStdout(['config', '--get', 'extensions.worktreeConfig'], run);
|
|
651
|
+
const markersPossible = markers.ok && markers.value === 'true';
|
|
652
|
+
// 'unknown' = the marker could not be read (git exit ≠ 0/1): ownership is undecidable, so the
|
|
653
|
+
// whole inventory is unknown — never fold it into «no marker» (review r5).
|
|
654
|
+
const ownership = (path: string): 'harness' | 'not-harness' | 'unknown' => {
|
|
655
|
+
if (!markersPossible || !basename(dirname(resolve(path))).endsWith('.worktrees')) return 'not-harness';
|
|
656
|
+
const owner = runGitWithRetry(['-C', path, 'config', '--worktree', '--get', HARNESS_OWNER_CONFIG_KEY], run);
|
|
657
|
+
if (owner.status === 0) return owner.stdout.trim() ? 'harness' : 'not-harness';
|
|
658
|
+
return owner.status === 1 ? 'not-harness' : 'unknown';
|
|
659
|
+
};
|
|
660
|
+
roots = [];
|
|
661
|
+
// A registration whose directory is already gone (porcelain `prunable`) is not a candidate:
|
|
662
|
+
// there is nothing to read under it, and asking git for its marker fails (rc=128 «cannot
|
|
663
|
+
// change to») — that must not turn into «ownership unreadable» for the whole inventory (review).
|
|
664
|
+
let missing = 0;
|
|
665
|
+
for (const path of registered.value) {
|
|
666
|
+
if (resolve(path) === resolve(common.value)) continue;
|
|
667
|
+
if (!existsSync(path)) { missing += 1; continue; }
|
|
668
|
+
const kind = ownership(path);
|
|
669
|
+
if (kind === 'unknown') {
|
|
670
|
+
debug.log('harness.clean', 'directories-scope', { rootKind, candidates: 0, parents: 0, entries: 0, missing, ok: false, failedCode: 'ownership-unreadable' });
|
|
671
|
+
return { ok: false, value: [], failure: 'directories', scope: { rootKind, parents: 0 } };
|
|
672
|
+
}
|
|
673
|
+
if (kind === 'not-harness') roots.push(path);
|
|
674
|
+
}
|
|
675
|
+
missingRegistrations = missing;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
const candidates = [...new Set(roots.map((root) => worktreeParentDir(root, worktreeRoot)))].sort();
|
|
679
|
+
// `parents` = parents that exist and were actually read (ENOENT candidates are not «seen»).
|
|
680
|
+
// On failure it is how many were read before the failing one — the human line never claims
|
|
681
|
+
// more than was inspected (review r2 should-fix).
|
|
682
|
+
let read = 0;
|
|
683
|
+
const scopeOf = () => (rootKind === 'bare' ? { scope: { rootKind, parents: read } } : {});
|
|
684
|
+
const entries = new Set<string>();
|
|
685
|
+
for (const parent of candidates) {
|
|
686
|
+
try {
|
|
687
|
+
// A privileged test runner can read mode 000; it is still unreadable for its owner.
|
|
688
|
+
if (rootKind === 'bare' && (statSync(parent).mode & 0o444) === 0) throw Object.assign(new Error('unreadable'), { code: 'EACCES' });
|
|
689
|
+
for (const entry of readdirSync(parent, { withFileTypes: true })) {
|
|
690
|
+
if (entry.isDirectory()) entries.add(join(parent, entry.name));
|
|
691
|
+
}
|
|
692
|
+
read += 1;
|
|
693
|
+
} catch (error) {
|
|
694
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
695
|
+
if (code === 'ENOENT') continue;
|
|
696
|
+
// Fail-closed, but not silent: the bare scope stays observable on the failure path.
|
|
697
|
+
debug.log('harness.clean', 'directories-scope', {
|
|
698
|
+
rootKind, candidates: candidates.length, parents: read, entries: entries.size, missing: missingRegistrations, ok: false, failedCode: code ?? 'unknown',
|
|
699
|
+
});
|
|
700
|
+
return { ok: false, value: [], failure: 'directories', ...scopeOf() };
|
|
701
|
+
}
|
|
633
702
|
}
|
|
703
|
+
const value = [...entries].sort();
|
|
704
|
+
debug.log('harness.clean', 'directories-scope', { rootKind, candidates: candidates.length, parents: read, entries: value.length, missing: missingRegistrations, ok: true });
|
|
705
|
+
return { ok: true, value, ...scopeOf() };
|
|
634
706
|
}
|
|
635
707
|
|
|
636
708
|
export type HarnessPrBranches = {
|
|
@@ -699,7 +771,7 @@ export function createGhRunner(spawnGh: GhSpawnSync = spawnSync): GhRunner {
|
|
|
699
771
|
|
|
700
772
|
const defaultGhRunner: GhRunner = createGhRunner();
|
|
701
773
|
|
|
702
|
-
type HarnessPrQuery = HarnessCleanQuery<HarnessPrBranches> & { failure?: string };
|
|
774
|
+
type HarnessPrQuery = Omit<HarnessCleanQuery<HarnessPrBranches>, 'failure'> & { failure?: string; unread?: Set<string> };
|
|
703
775
|
|
|
704
776
|
const HARNESS_PR_LOOKUP_BATCH_SIZE = 50;
|
|
705
777
|
|
|
@@ -769,13 +841,24 @@ function queryHarnessPrBatch(branches: readonly string[], repo: string | undefin
|
|
|
769
841
|
export function harnessPrBranches(branches: readonly string[], repo?: string, runGh: GhRunner = defaultGhRunner): HarnessPrQuery {
|
|
770
842
|
const open = new Set<string>();
|
|
771
843
|
const merged = new Set<string>();
|
|
844
|
+
const unread = new Set<string>();
|
|
845
|
+
let successful = 0;
|
|
846
|
+
let failure: string | undefined;
|
|
772
847
|
for (let start = 0; start < branches.length; start += HARNESS_PR_LOOKUP_BATCH_SIZE) {
|
|
773
|
-
const
|
|
774
|
-
|
|
848
|
+
const slice = branches.slice(start, start + HARNESS_PR_LOOKUP_BATCH_SIZE);
|
|
849
|
+
const batch = queryHarnessPrBatch(slice, repo, runGh);
|
|
850
|
+
if (!batch.ok) {
|
|
851
|
+
for (const branch of slice) unread.add(branch);
|
|
852
|
+
failure ??= batch.failure;
|
|
853
|
+
continue;
|
|
854
|
+
}
|
|
855
|
+
successful++;
|
|
775
856
|
for (const branch of batch.value.open) open.add(branch);
|
|
776
857
|
for (const branch of batch.value.merged) merged.add(branch);
|
|
777
858
|
}
|
|
778
|
-
|
|
859
|
+
if (!successful && unread.size) return { ...unavailableHarnessPrQuery(failure), unread };
|
|
860
|
+
return { ok: true, value: { open, merged, truncated: { open: false, merged: false } },
|
|
861
|
+
...(unread.size ? { unread, ...(failure ? { failure } : {}) } : {}) };
|
|
779
862
|
}
|
|
780
863
|
|
|
781
864
|
function parseCommitCount(value: string): number | undefined {
|
|
@@ -898,6 +981,10 @@ export interface HarnessCleanResult {
|
|
|
898
981
|
removed: CleanPlanItem[];
|
|
899
982
|
failed: Array<{ branch: string; error: string }>;
|
|
900
983
|
dryRun: boolean;
|
|
984
|
+
deferred?: CleanPlanItem[];
|
|
985
|
+
window?: { offset: number; size: number; total: number; unseenOutsideWindow: number };
|
|
986
|
+
/** A caller deadline (`expired`) stopped at least one non-git read; the plan is a failed-query subset. */
|
|
987
|
+
expired?: boolean;
|
|
901
988
|
}
|
|
902
989
|
|
|
903
990
|
/** 실 정리 — dryRun 이면 계획만. 열린 PR 은 force 아니면 보존. */
|
|
@@ -907,6 +994,11 @@ export function execHarnessClean(opts: {
|
|
|
907
994
|
force?: boolean;
|
|
908
995
|
branchPrefix?: string;
|
|
909
996
|
repo?: string;
|
|
997
|
+
window?: { offset: number; size: number };
|
|
998
|
+
/** Only planned items are eligible; remaining items are deferred, not deleted. */
|
|
999
|
+
shouldRemove?: (item: CleanPlanItem, removed: number) => boolean;
|
|
1000
|
+
/** GC does not force-remove worktrees; existing CLI behavior remains the default. */
|
|
1001
|
+
forceWorktreeRemove?: boolean;
|
|
910
1002
|
/** ⭐ git 실행기 주입(테스트 전용 · 무인 리뷰 must-fix). 생략하면 실제 git 이다.
|
|
911
1003
|
* ⛔ 왜 **조회까지** 받나: 측정만 주입하면 배선 테스트가 여전히 **로컬 저장소에 어떤 브랜치가
|
|
912
1004
|
* 있는지에 의존**한다. CI·detached checkout 에서는 스코프가 0이 되어 아무것도 못 잰다.
|
|
@@ -920,7 +1012,15 @@ export function execHarnessClean(opts: {
|
|
|
920
1012
|
readWorktreeProvenance?: WorktreeProvenanceReader;
|
|
921
1013
|
/** Live-directory lookup seam. Defaults to the shared PTY manifest provider. */
|
|
922
1014
|
activeDirectoryProvider?: ActiveDirectoryProvider;
|
|
1015
|
+
/** Caller deadline (GC tick budget). Once true, the non-git reads below (worktree directory listing,
|
|
1016
|
+
* live-directory provider, orphan directory entries) are not started and count as failed queries. */
|
|
1017
|
+
expired?: () => boolean;
|
|
923
1018
|
}): HarnessCleanResult {
|
|
1019
|
+
let expiredHit = false;
|
|
1020
|
+
const pastDeadline = (): boolean => {
|
|
1021
|
+
if (opts.expired?.()) { expiredHit = true; return true; }
|
|
1022
|
+
return false;
|
|
1023
|
+
};
|
|
924
1024
|
const branchPrefix = opts.branchPrefix ?? WORKTREE_BRANCH_PREFIX;
|
|
925
1025
|
const run = opts.run ?? defaultGitRunner;
|
|
926
1026
|
// ⭐ git 한 번으로 「걸린 것 · 등록 총수 · detached」를 함께 얻는다(무인 리뷰 4R).
|
|
@@ -929,37 +1029,50 @@ export function execHarnessClean(opts: {
|
|
|
929
1029
|
const worktreeSnapshot = worktreesTimed.value;
|
|
930
1030
|
const worktrees: HarnessCleanQuery<WorktreeEntry[]> = { ok: worktreeSnapshot.ok, value: worktreeSnapshot.value.entries };
|
|
931
1031
|
const branchesTimed = measureQueryMs(() => listHarnessBranches(branchPrefix, run));
|
|
932
|
-
const
|
|
933
|
-
|
|
934
|
-
const
|
|
1032
|
+
const listedBranches = branchesTimed.value;
|
|
1033
|
+
const sorted = [...new Set([...listedBranches.value, ...worktrees.value.map((w) => w.branch)])].sort();
|
|
1034
|
+
const offset = opts.window ? Math.min(Math.max(0, opts.window.offset), sorted.length) : 0;
|
|
1035
|
+
const windowBranches = opts.window ? sorted.slice(offset, offset + Math.max(0, opts.window.size)) : sorted;
|
|
1036
|
+
const selected = new Set(windowBranches);
|
|
1037
|
+
const branches = { ...listedBranches, value: listedBranches.value.filter((branch) => selected.has(branch)) };
|
|
1038
|
+
const scopedWorktrees = worktrees.value.filter((worktree) => selected.has(worktree.branch));
|
|
1039
|
+
// Only branches in this window reach PR lookup and safety measurement.
|
|
1040
|
+
const pullRequestsTimed = measureQueryMs(() => harnessPrBranches(windowBranches, opts.repo, opts.runGh));
|
|
935
1041
|
const pullRequests = pullRequestsTimed.value;
|
|
936
|
-
|
|
1042
|
+
// execHarnessClean calls the directory query before planning orphans; for bare repositories
|
|
1043
|
+
// it counts each registered source checkout's harness parent, failing closed if any is unreadable.
|
|
1044
|
+
const directoriesTimed = measureQueryMs((): ReturnType<typeof listHarnessWorktreeDirectories> => pastDeadline()
|
|
1045
|
+
? { ok: false, value: [], failure: 'directories' } : listHarnessWorktreeDirectories(undefined, run));
|
|
937
1046
|
const worktreeDirectories = directoriesTimed.value;
|
|
938
1047
|
const registeredTimed = measureQueryMs(() => listRegisteredWorktreePaths(run));
|
|
939
1048
|
const registeredWorktreePaths = registeredTimed.value;
|
|
940
|
-
const activeTimed = measureQueryMs(() => (
|
|
1049
|
+
const activeTimed = measureQueryMs((): HarnessCleanQuery<string[]> => pastDeadline()
|
|
1050
|
+
? { ok: false, value: [] } : (opts.activeDirectoryProvider ?? listActiveTerminalDirectories)());
|
|
941
1051
|
const activeDirectories = activeTimed.value;
|
|
942
|
-
const orphanBranches = listAllHarnessBranches();
|
|
1052
|
+
const orphanBranches = listAllHarnessBranches(run);
|
|
943
1053
|
const provisionalOrphans = worktreeDirectories.ok && registeredWorktreePaths.ok
|
|
944
1054
|
? worktreeDirectories.value.filter((path) => !new Set(registeredWorktreePaths.value.map((registered) => resolve(registered))).has(resolve(path)))
|
|
945
1055
|
: [];
|
|
946
|
-
const orphanDirectoryEntries = listDirectoryEntries(provisionalOrphans);
|
|
947
|
-
const branchSafety = measureBranchSafety(
|
|
1056
|
+
const orphanDirectoryEntries = listDirectoryEntries(provisionalOrphans, pastDeadline);
|
|
1057
|
+
const branchSafety = measureBranchSafety(scopedWorktrees, branches.value, run);
|
|
948
1058
|
const queryStatus = {
|
|
949
1059
|
worktrees: worktrees.ok,
|
|
950
1060
|
branches: branches.ok,
|
|
951
1061
|
pullRequests: pullRequests.ok,
|
|
952
1062
|
...(pullRequests.failure ? { pullRequestsFailure: pullRequests.failure } : {}),
|
|
953
1063
|
pullRequestsTruncated: pullRequests.value.truncated,
|
|
1064
|
+
pullRequestsUnreadBranches: pullRequests.unread?.size ?? 0,
|
|
954
1065
|
directories: worktreeDirectories.ok,
|
|
1066
|
+
...(!worktreeDirectories.ok ? { directoriesFailure: worktreeDirectories.failure ?? 'directories' as const } : {}),
|
|
955
1067
|
registeredWorktrees: registeredWorktreePaths.ok,
|
|
956
1068
|
activeDirectories: activeDirectories.ok,
|
|
957
1069
|
};
|
|
958
1070
|
const plan = planHarnessClean({
|
|
959
|
-
worktrees:
|
|
1071
|
+
worktrees: scopedWorktrees,
|
|
960
1072
|
branches: branches.value,
|
|
961
|
-
worktreeDirectories: worktreeDirectories.value,
|
|
962
|
-
registeredWorktreePaths: registeredWorktreePaths.value,
|
|
1073
|
+
worktreeDirectories: worktreeDirectories.ok ? worktreeDirectories.value : undefined,
|
|
1074
|
+
registeredWorktreePaths: registeredWorktreePaths.ok ? registeredWorktreePaths.value : undefined,
|
|
1075
|
+
pullRequestsUnread: pullRequests.unread,
|
|
963
1076
|
activeDirectories: activeDirectories.value,
|
|
964
1077
|
orphanBranchQueryOk: orphanBranches.ok,
|
|
965
1078
|
orphanBranches: new Set(orphanBranches.value),
|
|
@@ -993,7 +1106,7 @@ export function execHarnessClean(opts: {
|
|
|
993
1106
|
plan.scope = {
|
|
994
1107
|
branchPrefix,
|
|
995
1108
|
matchedWorktrees: worktrees.value.length,
|
|
996
|
-
matchedBranches:
|
|
1109
|
+
matchedBranches: listedBranches.value.length,
|
|
997
1110
|
// ⛔ 실패면 «싣지 않는다» — 0 으로 접으면 「접두 밖이 없다」와 「못 셌다」가 같은 값이 된다.
|
|
998
1111
|
// ⭐ 두 수는 **한 스냅샷**에서 온다(리뷰 `S1`) — 따로 재면 그 사이 변동으로 「안 본 수」가 음수가 된다.
|
|
999
1112
|
...(worktreeSnapshot.ok
|
|
@@ -1003,6 +1116,9 @@ export function execHarnessClean(opts: {
|
|
|
1003
1116
|
prunableWorktrees: worktreeSnapshot.value.prunable,
|
|
1004
1117
|
}
|
|
1005
1118
|
: {}),
|
|
1119
|
+
...(worktreeDirectories.scope?.rootKind === 'bare'
|
|
1120
|
+
? { bareDirectoryParents: worktreeDirectories.scope.parents }
|
|
1121
|
+
: {}),
|
|
1006
1122
|
};
|
|
1007
1123
|
const preservedByReason = Object.fromEntries([...new Set(plan.preserve.map((item) => item.reason))]
|
|
1008
1124
|
.map((reason) => [reason, plan.preserve.filter((item) => item.reason === reason).length]));
|
|
@@ -1013,6 +1129,8 @@ export function execHarnessClean(opts: {
|
|
|
1013
1129
|
preserve: plan.preserve.length,
|
|
1014
1130
|
preservedByReason,
|
|
1015
1131
|
orphanedWorktrees: plan.orphanedWorktrees.length,
|
|
1132
|
+
orphanScan: plan.orphanScan,
|
|
1133
|
+
pullRequestsUnreadBranches: queryStatus.pullRequestsUnreadBranches,
|
|
1016
1134
|
safe: orphanSafety.safe,
|
|
1017
1135
|
unsafe: orphanSafety.unsafe,
|
|
1018
1136
|
unknown: orphanSafety.unknown,
|
|
@@ -1029,23 +1147,26 @@ export function execHarnessClean(opts: {
|
|
|
1029
1147
|
...(plan.scope.registeredWorktrees === undefined ? {} : { registeredWorktrees: plan.scope.registeredWorktrees }),
|
|
1030
1148
|
...(plan.scope.prunableWorktrees === undefined ? {} : { prunableWorktrees: plan.scope.prunableWorktrees }),
|
|
1031
1149
|
});
|
|
1032
|
-
|
|
1150
|
+
const window = opts.window ? { offset, size: windowBranches.length, total: sorted.length,
|
|
1151
|
+
unseenOutsideWindow: sorted.length - windowBranches.length } : undefined;
|
|
1152
|
+
if (opts.dryRun) return { plan, removed: [], failed: [], dryRun: true,
|
|
1153
|
+
...(opts.shouldRemove ? { deferred: plan.remove } : {}), ...(window ? { window } : {}), ...(expiredHit ? { expired: true } : {}) };
|
|
1033
1154
|
const removed: CleanPlanItem[] = [];
|
|
1034
1155
|
const failed: Array<{ branch: string; error: string }> = [];
|
|
1156
|
+
const deferred: CleanPlanItem[] = [];
|
|
1035
1157
|
for (const item of plan.remove) {
|
|
1158
|
+
if (opts.shouldRemove && !opts.shouldRemove(item, removed.length)) { deferred.push(item); continue; }
|
|
1036
1159
|
let ok = true; let err = '';
|
|
1037
|
-
//
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
if (item.path) { const r = git(['worktree', 'remove', '--force', item.path], run); if (!r.ok) { ok = false; err = r.out.slice(0, 120); } }
|
|
1044
|
-
const b = git(['branch', '-D', item.branch], run); if (!b.ok) { ok = false; err = err || b.out.slice(0, 120); }
|
|
1160
|
+
// Both lookup and deletion use the same injected git runner.
|
|
1161
|
+
if (item.path) { const r = git(['worktree', 'remove', ...(opts.forceWorktreeRemove === false ? [] : ['--force']), item.path], run); if (!r.ok) { ok = false; err = r.out.slice(0, 120); } }
|
|
1162
|
+
if (ok || opts.forceWorktreeRemove !== false) {
|
|
1163
|
+
const b = git(['branch', '-D', item.branch], run);
|
|
1164
|
+
if (!b.ok) { ok = false; err = err || b.out.slice(0, 120); }
|
|
1165
|
+
}
|
|
1045
1166
|
if (ok) { removed.push(item); debug.log('harness.clean', 'removed', { branch: item.branch, reason: item.reason, hadWorktree: !!item.path }); }
|
|
1046
1167
|
else { failed.push({ branch: item.branch, error: err }); debug.log('harness.clean', 'remove-fail', { branch: item.branch, error: err }, { level: 'error' }); }
|
|
1047
1168
|
}
|
|
1048
|
-
return { plan, removed, failed, dryRun: false };
|
|
1169
|
+
return { plan, removed, failed, dryRun: false, ...(opts.shouldRemove ? { deferred } : {}), ...(window ? { window } : {}), ...(expiredHit ? { expired: true } : {}) };
|
|
1049
1170
|
}
|
|
1050
1171
|
|
|
1051
1172
|
/** 사람 화면 보존 목록 한도 — 이 수를 넘기면 보존 항목을 더 찍지 않고 생략 사실을 말한다.
|
|
@@ -1070,7 +1191,7 @@ export function renderHarnessCleanReport(
|
|
|
1070
1191
|
// 실제 워크트리는 `self-impl/` 156개였고, 화면은 그 사실 없이 "정리 대상 없음"만 찍었다.
|
|
1071
1192
|
const scope = res.plan.scope;
|
|
1072
1193
|
if (scope) {
|
|
1073
|
-
L.push(`스코프 prefix=${scope.branchPrefix} · 걸린 worktree ${scope.matchedWorktrees} · 브랜치 ${scope.matchedBranches}`);
|
|
1194
|
+
L.push(`스코프 prefix=${scope.branchPrefix} · 걸린 worktree ${scope.matchedWorktrees} · 브랜치 ${scope.matchedBranches}${scope.bareDirectoryParents === undefined ? '' : ` · bare 저장소 · 부모 ${scope.bareDirectoryParents} 곳을 봤다`}`);
|
|
1074
1195
|
const registered = scope.registeredWorktrees;
|
|
1075
1196
|
if (registered !== undefined) {
|
|
1076
1197
|
L.push(`등록 워크트리 ${registered}(primary 포함)${(scope.prunableWorktrees ?? 0) > 0 ? ` · 끊어진 등록 ${scope.prunableWorktrees}` : ''}`);
|