@repo-os/repoos 0.5.45
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/LICENSE.md +110 -0
- package/README.md +272 -0
- package/dist/.build-info.json +4 -0
- package/dist/.build-stamp.json +3 -0
- package/dist/cli/colors.d.ts +13 -0
- package/dist/cli/colors.js +37 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +221 -0
- package/dist/commands/check.d.ts +170 -0
- package/dist/commands/check.js +1227 -0
- package/dist/commands/docs.d.ts +2 -0
- package/dist/commands/docs.js +70 -0
- package/dist/commands/gc.d.ts +1 -0
- package/dist/commands/gc.js +57 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.js +699 -0
- package/dist/commands/screenshots.d.ts +7 -0
- package/dist/commands/screenshots.js +77 -0
- package/dist/commands/serve.d.ts +55 -0
- package/dist/commands/serve.js +204 -0
- package/dist/commands/status.d.ts +140 -0
- package/dist/commands/status.js +569 -0
- package/dist/commands/stop.d.ts +1 -0
- package/dist/commands/stop.js +59 -0
- package/dist/commands/tasks.d.ts +47 -0
- package/dist/commands/tasks.js +334 -0
- package/dist/commands/tunnel.d.ts +1 -0
- package/dist/commands/tunnel.js +1271 -0
- package/dist/commands/ui-harness.d.ts +53 -0
- package/dist/commands/ui-harness.js +62 -0
- package/dist/commands/ui-smoke.d.ts +6 -0
- package/dist/commands/ui-smoke.js +220 -0
- package/dist/commands/upgrade.d.ts +15 -0
- package/dist/commands/upgrade.js +188 -0
- package/dist/core/auth-store.d.ts +81 -0
- package/dist/core/auth-store.js +530 -0
- package/dist/core/auth.d.ts +75 -0
- package/dist/core/auth.js +124 -0
- package/dist/core/bootstrap.d.ts +41 -0
- package/dist/core/bootstrap.js +236 -0
- package/dist/core/build.d.ts +92 -0
- package/dist/core/build.js +249 -0
- package/dist/core/canary.d.ts +10 -0
- package/dist/core/canary.js +14 -0
- package/dist/core/check-failure-summary.d.ts +10 -0
- package/dist/core/check-failure-summary.js +34 -0
- package/dist/core/config.d.ts +160 -0
- package/dist/core/config.js +1288 -0
- package/dist/core/context-pack.d.ts +74 -0
- package/dist/core/context-pack.js +778 -0
- package/dist/core/db.d.ts +236 -0
- package/dist/core/db.js +747 -0
- package/dist/core/detect.d.ts +69 -0
- package/dist/core/detect.js +251 -0
- package/dist/core/docs.d.ts +76 -0
- package/dist/core/docs.js +225 -0
- package/dist/core/frontmatter.d.ts +29 -0
- package/dist/core/frontmatter.js +215 -0
- package/dist/core/git.d.ts +505 -0
- package/dist/core/git.js +1453 -0
- package/dist/core/indexer.d.ts +33 -0
- package/dist/core/indexer.js +282 -0
- package/dist/core/input.d.ts +66 -0
- package/dist/core/input.js +222 -0
- package/dist/core/logger.d.ts +70 -0
- package/dist/core/logger.js +138 -0
- package/dist/core/models.d.ts +45 -0
- package/dist/core/models.js +291 -0
- package/dist/core/net-probe.d.ts +4 -0
- package/dist/core/net-probe.js +20 -0
- package/dist/core/providers/deepinfra.d.ts +23 -0
- package/dist/core/providers/deepinfra.js +44 -0
- package/dist/core/providers/index.d.ts +24 -0
- package/dist/core/providers/index.js +59 -0
- package/dist/core/providers/openrouter.d.ts +28 -0
- package/dist/core/providers/openrouter.js +82 -0
- package/dist/core/providers/spend.d.ts +86 -0
- package/dist/core/providers/spend.js +286 -0
- package/dist/core/providers/types.d.ts +56 -0
- package/dist/core/providers/types.js +39 -0
- package/dist/core/repoos.d.ts +59 -0
- package/dist/core/repoos.js +221 -0
- package/dist/core/runtime.d.ts +35 -0
- package/dist/core/runtime.js +167 -0
- package/dist/core/skills-registry.d.ts +39 -0
- package/dist/core/skills-registry.js +148 -0
- package/dist/core/skills-registry.test.d.ts +1 -0
- package/dist/core/skills-registry.test.js +52 -0
- package/dist/core/sysmem.d.ts +7 -0
- package/dist/core/sysmem.js +55 -0
- package/dist/core/tailscale.d.ts +2 -0
- package/dist/core/tailscale.js +19 -0
- package/dist/core/task.d.ts +53 -0
- package/dist/core/task.js +310 -0
- package/dist/core/toml-line.d.ts +20 -0
- package/dist/core/toml-line.js +52 -0
- package/dist/core/toml-validate.d.ts +44 -0
- package/dist/core/toml-validate.js +335 -0
- package/dist/core/tunnel-assistant.d.ts +30 -0
- package/dist/core/tunnel-assistant.js +65 -0
- package/dist/core/tunnel-registry.d.ts +96 -0
- package/dist/core/tunnel-registry.js +267 -0
- package/dist/core/tunnel-registry.test.d.ts +1 -0
- package/dist/core/tunnel-registry.test.js +309 -0
- package/dist/core/tunnel.d.ts +103 -0
- package/dist/core/tunnel.js +320 -0
- package/dist/core/types.d.ts +811 -0
- package/dist/core/types.js +27 -0
- package/dist/core/worktree-gc.d.ts +57 -0
- package/dist/core/worktree-gc.js +194 -0
- package/dist/server/__tests__/integration-job.test.d.ts +1 -0
- package/dist/server/__tests__/integration-job.test.js +129 -0
- package/dist/server/agents.d.ts +1020 -0
- package/dist/server/agents.js +4070 -0
- package/dist/server/attachments.d.ts +51 -0
- package/dist/server/attachments.js +130 -0
- package/dist/server/auto-engineering.d.ts +45 -0
- package/dist/server/auto-engineering.js +275 -0
- package/dist/server/branchless-release.d.ts +22 -0
- package/dist/server/branchless-release.js +67 -0
- package/dist/server/built-in-agents.d.ts +305 -0
- package/dist/server/built-in-agents.js +1838 -0
- package/dist/server/cto-monitor.d.ts +35 -0
- package/dist/server/cto-monitor.js +281 -0
- package/dist/server/cto.d.ts +125 -0
- package/dist/server/cto.js +590 -0
- package/dist/server/deployments.d.ts +119 -0
- package/dist/server/deployments.js +325 -0
- package/dist/server/diff-snapshot.d.ts +20 -0
- package/dist/server/diff-snapshot.js +73 -0
- package/dist/server/done.d.ts +160 -0
- package/dist/server/done.js +488 -0
- package/dist/server/freeform.d.ts +55 -0
- package/dist/server/freeform.js +179 -0
- package/dist/server/handoff.d.ts +99 -0
- package/dist/server/handoff.js +575 -0
- package/dist/server/hetzner.d.ts +45 -0
- package/dist/server/hetzner.js +117 -0
- package/dist/server/icons.d.ts +8 -0
- package/dist/server/icons.js +195 -0
- package/dist/server/integration-job.d.ts +75 -0
- package/dist/server/integration-job.js +144 -0
- package/dist/server/integration-orchestrator.d.ts +211 -0
- package/dist/server/integration-orchestrator.js +1299 -0
- package/dist/server/integration-status.d.ts +48 -0
- package/dist/server/integration-status.js +71 -0
- package/dist/server/live-index.d.ts +295 -0
- package/dist/server/live-index.js +452 -0
- package/dist/server/model-test.d.ts +20 -0
- package/dist/server/model-test.js +100 -0
- package/dist/server/ntfy.d.ts +57 -0
- package/dist/server/ntfy.js +112 -0
- package/dist/server/pm-attachments.d.ts +35 -0
- package/dist/server/pm-attachments.js +181 -0
- package/dist/server/pm-runs.d.ts +58 -0
- package/dist/server/pm-runs.js +80 -0
- package/dist/server/preview.d.ts +174 -0
- package/dist/server/preview.js +641 -0
- package/dist/server/release.d.ts +88 -0
- package/dist/server/release.js +449 -0
- package/dist/server/reload.d.ts +194 -0
- package/dist/server/reload.js +586 -0
- package/dist/server/remote-validation.d.ts +132 -0
- package/dist/server/remote-validation.js +478 -0
- package/dist/server/repo-lock.d.ts +36 -0
- package/dist/server/repo-lock.js +141 -0
- package/dist/server/review-guard.d.ts +14 -0
- package/dist/server/review-guard.js +159 -0
- package/dist/server/review.d.ts +243 -0
- package/dist/server/review.js +1211 -0
- package/dist/server/routes/agents.d.ts +6 -0
- package/dist/server/routes/agents.js +28 -0
- package/dist/server/routes/auth.d.ts +60 -0
- package/dist/server/routes/auth.js +755 -0
- package/dist/server/routes/config.d.ts +20 -0
- package/dist/server/routes/config.js +347 -0
- package/dist/server/routes/debugger.d.ts +33 -0
- package/dist/server/routes/debugger.js +360 -0
- package/dist/server/routes/deployments.d.ts +3 -0
- package/dist/server/routes/deployments.js +16 -0
- package/dist/server/routes/docs.d.ts +8 -0
- package/dist/server/routes/docs.js +135 -0
- package/dist/server/routes/helpers.d.ts +21 -0
- package/dist/server/routes/helpers.js +171 -0
- package/dist/server/routes/index.d.ts +19 -0
- package/dist/server/routes/index.js +18 -0
- package/dist/server/routes/info.d.ts +17 -0
- package/dist/server/routes/info.js +177 -0
- package/dist/server/routes/inputs.d.ts +7 -0
- package/dist/server/routes/inputs.js +125 -0
- package/dist/server/routes/model-providers.d.ts +27 -0
- package/dist/server/routes/model-providers.js +94 -0
- package/dist/server/routes/models.d.ts +3 -0
- package/dist/server/routes/models.js +36 -0
- package/dist/server/routes/notify.d.ts +2 -0
- package/dist/server/routes/notify.js +17 -0
- package/dist/server/routes/playground.d.ts +29 -0
- package/dist/server/routes/playground.js +81 -0
- package/dist/server/routes/release.d.ts +20 -0
- package/dist/server/routes/release.js +86 -0
- package/dist/server/routes/router.d.ts +12 -0
- package/dist/server/routes/router.js +32 -0
- package/dist/server/routes/skill-registry.d.ts +5 -0
- package/dist/server/routes/skill-registry.js +51 -0
- package/dist/server/routes/tasks.d.ts +58 -0
- package/dist/server/routes/tasks.js +1442 -0
- package/dist/server/routes/transcribe.d.ts +2 -0
- package/dist/server/routes/transcribe.js +124 -0
- package/dist/server/routes/types.d.ts +68 -0
- package/dist/server/routes/types.js +1 -0
- package/dist/server/routes/ui.d.ts +5 -0
- package/dist/server/routes/ui.js +81 -0
- package/dist/server/routes/utils.d.ts +3 -0
- package/dist/server/routes/utils.js +23 -0
- package/dist/server/serve-reaper.d.ts +135 -0
- package/dist/server/serve-reaper.js +491 -0
- package/dist/server/server.d.ts +49 -0
- package/dist/server/server.js +2171 -0
- package/dist/server/supervisor.d.ts +89 -0
- package/dist/server/supervisor.js +231 -0
- package/dist/server/system.d.ts +198 -0
- package/dist/server/system.js +480 -0
- package/dist/server/task-check.d.ts +45 -0
- package/dist/server/task-check.js +71 -0
- package/dist/server/task-transitions.d.ts +51 -0
- package/dist/server/task-transitions.js +78 -0
- package/dist/server/task-watchdog.d.ts +158 -0
- package/dist/server/task-watchdog.js +681 -0
- package/dist/server/test-run.d.ts +28 -0
- package/dist/server/test-run.js +81 -0
- package/dist/server/watcher.d.ts +21 -0
- package/dist/server/watcher.js +194 -0
- package/dist/server/write.d.ts +94 -0
- package/dist/server/write.js +345 -0
- package/dist/ui/assets/AgentsView-CF4wRvHh.css +1 -0
- package/dist/ui/assets/AgentsView-D-myL-kA.js +1 -0
- package/dist/ui/assets/ContextView-D3TC-RSp.css +1 -0
- package/dist/ui/assets/ContextView-DsOqAdyE.js +4 -0
- package/dist/ui/assets/DashboardView-BOhsIJqO.js +1 -0
- package/dist/ui/assets/DashboardView-Ck9o0RP2.css +1 -0
- package/dist/ui/assets/DeploymentsView--iIUVfEH.css +1 -0
- package/dist/ui/assets/DeploymentsView-DXu_FYR2.js +1 -0
- package/dist/ui/assets/InputsView-24HVbVPk.js +1 -0
- package/dist/ui/assets/InputsView-BLb7GHtx.css +1 -0
- package/dist/ui/assets/LoginView-6QlGg6cx.css +1 -0
- package/dist/ui/assets/LoginView-BqupI0Lt.js +1 -0
- package/dist/ui/assets/ReleasesView-BEG1A0YH.css +1 -0
- package/dist/ui/assets/ReleasesView-CAgMuxpe.js +3 -0
- package/dist/ui/assets/SettingsView-CA-NYSMK.css +1 -0
- package/dist/ui/assets/SettingsView-O3iZSnjg.js +3 -0
- package/dist/ui/assets/WorkView-D8Tl6qwy.js +1 -0
- package/dist/ui/assets/WorkView-DMYL2s3W.css +1 -0
- package/dist/ui/assets/abnfDiagram-VCTEODGH-J5lkSnEE.js +1 -0
- package/dist/ui/assets/arc-BHZnmhhM.js +1 -0
- package/dist/ui/assets/architecture-7GRP2DOG-pLdFt-xS.js +1 -0
- package/dist/ui/assets/architectureDiagram-5GKGNRK7-C3k89uKX.js +36 -0
- package/dist/ui/assets/array-BifhSqXX.js +1 -0
- package/dist/ui/assets/blockDiagram-I7D4REHJ-AWNoBzop.js +129 -0
- package/dist/ui/assets/button-lbikqSph.js +1 -0
- package/dist/ui/assets/c4Diagram-7LVT6UL2-DKG1D5gd.js +38 -0
- package/dist/ui/assets/channel-gA4qBv3A.js +1 -0
- package/dist/ui/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/ui/assets/chunk-4HAMMTFA-D1YR8lF_.js +62 -0
- package/dist/ui/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/ui/assets/chunk-75Z2AOVW-5GuBxfsL.js +2 -0
- package/dist/ui/assets/chunk-DU6HZSFF-DfdNNqwa.js +127 -0
- package/dist/ui/assets/chunk-F27PBJKO-BPZzinQ4.js +1 -0
- package/dist/ui/assets/chunk-FOHPRMQF-l2z4K2jD.js +161 -0
- package/dist/ui/assets/chunk-GMAD6QVW-DGWvSKj5.js +72 -0
- package/dist/ui/assets/chunk-GVQU2GXP-D6Aw75wJ.js +1 -0
- package/dist/ui/assets/chunk-IMKFNOWR-B8mMBKCW.js +231 -0
- package/dist/ui/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/ui/assets/chunk-L3NEJ4N5-D5OJuXYE.js +1 -0
- package/dist/ui/assets/chunk-OSK3NFVY-B7r9w2UW.js +10 -0
- package/dist/ui/assets/chunk-P2QGCYS3-C74X4AQX.js +1 -0
- package/dist/ui/assets/chunk-POPQ4Y6H-C5_u1gUS.js +1 -0
- package/dist/ui/assets/chunk-PWAF6VOD-DfoTLtxn.js +1 -0
- package/dist/ui/assets/chunk-SHT3W25Y-D40m2eqz.js +168 -0
- package/dist/ui/assets/chunk-SVP7TREG-euxi0Kap.js +88 -0
- package/dist/ui/assets/chunk-TICWLB2K-fkdxngzN.js +206 -0
- package/dist/ui/assets/chunk-XXDRQBXY-DFBUG-OT.js +1 -0
- package/dist/ui/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/ui/assets/classDiagram-ZZMXUADV-BzW8bq2P.js +1 -0
- package/dist/ui/assets/classDiagram-v2-VYDZK3BY-BzW8bq2P.js +1 -0
- package/dist/ui/assets/cose-bilkent-JH36ORCC-BTcgMon1.js +1 -0
- package/dist/ui/assets/cynefin-OW5HDTMX-B5m_COsS.js +1 -0
- package/dist/ui/assets/cynefinDiagram-5FMLGOSQ-C-AG6CGe.js +62 -0
- package/dist/ui/assets/cytoscape.esm-FBntH-9t.js +321 -0
- package/dist/ui/assets/dagre-GXQ25YYZ-DDfDnp8L.js +4 -0
- package/dist/ui/assets/dagre-PrKaheQc.js +1 -0
- package/dist/ui/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/ui/assets/diagram-S7CK7UJ4-DjQZAlEY.js +30 -0
- package/dist/ui/assets/diagram-UQ7AKVKN-DAZ9yp1B.js +41 -0
- package/dist/ui/assets/diagram-VSXAHHWV-BWepUKJD.js +3 -0
- package/dist/ui/assets/diagram-VX7I27RA-EcV1J81b.js +24 -0
- package/dist/ui/assets/diagram-Z3DM3KII-Dbz7XU_K.js +24 -0
- package/dist/ui/assets/dist-DTg6UBE_.js +1 -0
- package/dist/ui/assets/ebnfDiagram-PWID7BFC-BUyQw8Mm.js +1 -0
- package/dist/ui/assets/erDiagram-RLTQ6QDP-WVf8ukKt.js +99 -0
- package/dist/ui/assets/eventmodeling-NTZA5JFV-DHqyLOAn.js +1 -0
- package/dist/ui/assets/flowDiagram-HODETNUW-CYk_ze5K.js +1 -0
- package/dist/ui/assets/ganttDiagram-EL5Y4UJY-rB4MZuB-.js +292 -0
- package/dist/ui/assets/gitGraph-4MIJSDKK-BOTWM8dY.js +1 -0
- package/dist/ui/assets/gitGraphDiagram-WWUBYQGX-eYscuhtP.js +106 -0
- package/dist/ui/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/ui/assets/index-BACBfnga.css +1 -0
- package/dist/ui/assets/index-BOQ-ust6.js +26 -0
- package/dist/ui/assets/info-A6RAGUB7-_67wOORe.js +1 -0
- package/dist/ui/assets/infoDiagram-27XIBGKW-XVXbddTA.js +2 -0
- package/dist/ui/assets/init-C-OQMol4.js +1 -0
- package/dist/ui/assets/ishikawaDiagram-5VMMS53U-ClLNiEru.js +70 -0
- package/dist/ui/assets/journeyDiagram-3NMN7TZE-NRawjR6i.js +139 -0
- package/dist/ui/assets/kanban-definition-UXKFOSKX-BgSzBfIx.js +89 -0
- package/dist/ui/assets/katex-DolUETbr.js +257 -0
- package/dist/ui/assets/line-KAyfuul4.js +1 -0
- package/dist/ui/assets/linear-cCCPOpu7.js +1 -0
- package/dist/ui/assets/mermaid-parser.core-CgXZk1iN.js +7 -0
- package/dist/ui/assets/mermaid.core-BUUkChHW.js +44 -0
- package/dist/ui/assets/mindmap-definition-YA3MSWOX-Cpn7vW4r.js +96 -0
- package/dist/ui/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/ui/assets/packet-AYTQ26CC-0lZwM-d6.js +1 -0
- package/dist/ui/assets/path-COt_16Va.js +1 -0
- package/dist/ui/assets/pegDiagram-XKGWAZYB-impy0inn.js +1 -0
- package/dist/ui/assets/pie-WAS4IAKB-CqfdGHYg.js +1 -0
- package/dist/ui/assets/pieDiagram-E7YTZNPT-CxjL4I1h.js +39 -0
- package/dist/ui/assets/quadrantDiagram-AXDQQJYC-Cjd1QMIe.js +7 -0
- package/dist/ui/assets/radar-RG4KPBEZ-CRkQIwiv.js +1 -0
- package/dist/ui/assets/railroad-74A4TZTK-i67XSWTB.js +1 -0
- package/dist/ui/assets/railroad-abnf-HS5TGJTU-Cv9m5aS3.js +1 -0
- package/dist/ui/assets/railroad-ebnf-LZEXJU2U-C5ZIn-Jh.js +1 -0
- package/dist/ui/assets/railroad-peg-WCYAUIDC-CGra9Oq-.js +1 -0
- package/dist/ui/assets/railroadDiagram-O6MQD6OU-_pK0qyaY.js +1 -0
- package/dist/ui/assets/releases-B0WNV-SY.js +1 -0
- package/dist/ui/assets/repoos-cto-square.webp +0 -0
- package/dist/ui/assets/repoos-helpful-pm-square.webp +0 -0
- package/dist/ui/assets/repoos-orchestrator-square.webp +0 -0
- package/dist/ui/assets/repoos-performance-agent-square.webp +0 -0
- package/dist/ui/assets/repoos-ross-from-friends-square.webp +0 -0
- package/dist/ui/assets/repoos-tech-debt-agent-square.webp +0 -0
- package/dist/ui/assets/requirementDiagram-BXWQKSXE-CRrFX-yw.js +84 -0
- package/dist/ui/assets/rough.esm-By172zw-.js +1 -0
- package/dist/ui/assets/sankeyDiagram-P5KCCOFB-X_xFRj9E.js +40 -0
- package/dist/ui/assets/sequenceDiagram-WJ2MYXX4-Byb49lKf.js +162 -0
- package/dist/ui/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/ui/assets/src-BH-TyZbA.js +1 -0
- package/dist/ui/assets/stateDiagram-D77RDMKH-CzaPrqYF.js +1 -0
- package/dist/ui/assets/stateDiagram-v2-MP3YSRHH-BCXckz7K.js +1 -0
- package/dist/ui/assets/swimlanes-42K2YHIH-Cx_1lnqr.js +1 -0
- package/dist/ui/assets/swimlanesDiagram-VR7AAH4N-54qsKi6A.js +8 -0
- package/dist/ui/assets/timeline-definition-24CTP7MA-B1IbZPQ-.js +120 -0
- package/dist/ui/assets/treeView-Q6P3EWNA-DFWhVE3d.js +1 -0
- package/dist/ui/assets/treemap-WGGIJYW6-BmbYPThn.js +1 -0
- package/dist/ui/assets/vendor-ui-DPm7zLxi.js +3 -0
- package/dist/ui/assets/vendor-vue-CobgyEJp.js +1 -0
- package/dist/ui/assets/vennDiagram-4TSXK5OY-Ae2AtRpt.js +34 -0
- package/dist/ui/assets/wardley-WFR3VGLG-BtD4X4tL.js +1 -0
- package/dist/ui/assets/wardleyDiagram-VM6X3IG4-B3YN2fTd.js +78 -0
- package/dist/ui/assets/xychartDiagram-S5SC5T6Z-CIzJfMKA.js +7 -0
- package/dist/ui/favicon.svg +11 -0
- package/dist/ui/index.html +49 -0
- package/dist/ui/sw.js +48 -0
- package/package.json +91 -0
|
@@ -0,0 +1,811 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RepoOS core types.
|
|
3
|
+
*
|
|
4
|
+
* The repo is the source of truth. A "task" is a markdown file with YAML
|
|
5
|
+
* frontmatter living under the configured work directory (default: `work/`).
|
|
6
|
+
* Task *status* is a frontmatter field — files never move between folders.
|
|
7
|
+
*/
|
|
8
|
+
/** Canonical lifecycle states. Order matters: it defines board column order. */
|
|
9
|
+
export declare const STATUSES: readonly ["draft", "inbox", "ready", "active", "review", "done"];
|
|
10
|
+
export type Status = (typeof STATUSES)[number];
|
|
11
|
+
export declare const PRIORITIES: readonly ["p0", "p1", "p2", "p3"];
|
|
12
|
+
export type Priority = (typeof PRIORITIES)[number];
|
|
13
|
+
export declare const TASK_TYPES: readonly ["feature", "bug", "chore", "spec", "refactor"];
|
|
14
|
+
export type TaskType = (typeof TASK_TYPES)[number];
|
|
15
|
+
/** Who a task is assigned to. `ai` is a first-class assignee. */
|
|
16
|
+
export type Assignee = "ai" | "human" | "unassigned";
|
|
17
|
+
/** Theme preference for the web UI. */
|
|
18
|
+
export type Theme = "dark" | "light" | "system";
|
|
19
|
+
/** Visual design language of the web UI. */
|
|
20
|
+
export type UiTheme = "classic" | "clear" | "gen z" | "jelly";
|
|
21
|
+
/** Which flow the New task drawer opens with. */
|
|
22
|
+
export type TaskMode = "freeform" | "manual";
|
|
23
|
+
/**
|
|
24
|
+
* Machine-readable reasons `needsInput` gets set, one per escalation call
|
|
25
|
+
* site. Stored alongside the flag so a later automated success (e.g. a
|
|
26
|
+
* review that finally completes cleanly) can tell whether IT is what the
|
|
27
|
+
* human was waited on for, and clear the flag itself rather than leaving it
|
|
28
|
+
* stuck forever once the underlying problem resolves. A boolean alone can't
|
|
29
|
+
* make that call safely — clearing on every success would just as happily
|
|
30
|
+
* wipe out an unrelated flag (e.g. a CTO policy question) that happened to
|
|
31
|
+
* still be pending.
|
|
32
|
+
*/
|
|
33
|
+
export declare const NEEDS_INPUT_REASONS: readonly ["review-failed", "dev-error", "watchdog-stuck", "cto-escalation"];
|
|
34
|
+
export type NeedsInputReason = (typeof NEEDS_INPUT_REASONS)[number];
|
|
35
|
+
/**
|
|
36
|
+
* The frontmatter we recognise. Unknown keys are preserved in `extra` so we
|
|
37
|
+
* never destroy fields a user (or another tool) added.
|
|
38
|
+
*/
|
|
39
|
+
export interface TaskFrontmatter {
|
|
40
|
+
id?: string;
|
|
41
|
+
title?: string;
|
|
42
|
+
type?: TaskType | string;
|
|
43
|
+
status?: Status | string;
|
|
44
|
+
priority?: Priority | string;
|
|
45
|
+
/** True when the agent is waiting on the human and the task stays `active`. */
|
|
46
|
+
needs_input?: boolean;
|
|
47
|
+
/** Machine-readable reason `needs_input` was set (e.g. "review-failed"), for auto-clearing and UI display. Only meaningful while needs_input is true. */
|
|
48
|
+
needs_input_reason?: string;
|
|
49
|
+
/** True when the task branch has drifted from main and needs a manual merge. */
|
|
50
|
+
needs_merge?: boolean;
|
|
51
|
+
/** True when a legitimate no-op task opts out of the vacuous-handoff rejection. */
|
|
52
|
+
no_source_change?: boolean;
|
|
53
|
+
area?: string;
|
|
54
|
+
assigned_to?: string;
|
|
55
|
+
created_by?: string;
|
|
56
|
+
branch?: string;
|
|
57
|
+
created_at?: string;
|
|
58
|
+
updated_at?: string;
|
|
59
|
+
/** @deprecated use created_at */
|
|
60
|
+
created?: string;
|
|
61
|
+
/** @deprecated use updated_at */
|
|
62
|
+
updated?: string;
|
|
63
|
+
tags?: string[];
|
|
64
|
+
/** Per-task agent name override (e.g. "engineer", "pm", or a custom agent). */
|
|
65
|
+
agent_override?: string;
|
|
66
|
+
/** Per-task CLI override (e.g. "opencode", "claude code"). */
|
|
67
|
+
cli_override?: string;
|
|
68
|
+
/** Per-task model override (e.g. "default", "big pickle"). */
|
|
69
|
+
model_override?: string;
|
|
70
|
+
/** True when this task runs as a hotfix in the main checkout. */
|
|
71
|
+
hotfix?: boolean;
|
|
72
|
+
/** Hotfix merge target: "branch" or "main". */
|
|
73
|
+
hotfix_target?: "branch" | "main";
|
|
74
|
+
[key: string]: unknown;
|
|
75
|
+
}
|
|
76
|
+
/** A fully-resolved task as the rest of the system sees it. */
|
|
77
|
+
export interface Task {
|
|
78
|
+
/** Stable id, e.g. "0012". Derived from frontmatter or filename. */
|
|
79
|
+
id: string;
|
|
80
|
+
title: string;
|
|
81
|
+
type: string;
|
|
82
|
+
status: Status;
|
|
83
|
+
/** True when the agent is waiting on the human. Layered on `active`, never a status. */
|
|
84
|
+
needsInput: boolean;
|
|
85
|
+
/** Machine-readable reason `needsInput` was set — see {@link NeedsInputReason}. Only meaningful while needsInput is true. */
|
|
86
|
+
needsInputReason?: string;
|
|
87
|
+
/** True when the task branch has drifted from main. Layered on `review`, never a status. */
|
|
88
|
+
needsMerge: boolean;
|
|
89
|
+
/** True when a no-op task opts out of the vacuous-handoff rejection. */
|
|
90
|
+
noSourceChange: boolean;
|
|
91
|
+
priority: Priority | string;
|
|
92
|
+
area: string;
|
|
93
|
+
assignee: Assignee;
|
|
94
|
+
/** Raw assigned_to value, e.g. "ai", "nick", "product". */
|
|
95
|
+
assignedTo: string;
|
|
96
|
+
createdBy: string;
|
|
97
|
+
branch: string;
|
|
98
|
+
tags: string[];
|
|
99
|
+
created_at: string | null;
|
|
100
|
+
updated_at: string | null;
|
|
101
|
+
/** ISO timestamp of the successful review-to-done merge, derived from Activity. */
|
|
102
|
+
releasedAt?: string | null;
|
|
103
|
+
/** Path relative to repo root, e.g. "work/0012-company-dashboard.md". */
|
|
104
|
+
path: string;
|
|
105
|
+
/** Absolute path on disk. */
|
|
106
|
+
absPath: string;
|
|
107
|
+
/** The markdown body (everything after frontmatter). */
|
|
108
|
+
body: string;
|
|
109
|
+
/** Frontmatter keys we did not explicitly model. Preserved on write. */
|
|
110
|
+
extra: Record<string, unknown>;
|
|
111
|
+
/** Per-task agent name override, or null when using the default. */
|
|
112
|
+
agentOverride: string | null;
|
|
113
|
+
/** Per-task CLI override, or null when using the agent's default. */
|
|
114
|
+
cliOverride: string | null;
|
|
115
|
+
/** Per-task model override, or null when using the agent's default. */
|
|
116
|
+
modelOverride: string | null;
|
|
117
|
+
/** Per-task PM agent name override, or null when using the default. */
|
|
118
|
+
pmAgentOverride?: string | null;
|
|
119
|
+
/** Per-task PM CLI override, or null when using the agent's default. */
|
|
120
|
+
pmCliOverride?: string | null;
|
|
121
|
+
/** Per-task PM model override, or null when using the agent's default. */
|
|
122
|
+
pmModelOverride?: string | null;
|
|
123
|
+
/** Per-task reviewer agent name override, or null when using the default. */
|
|
124
|
+
reviewAgentOverride?: string | null;
|
|
125
|
+
/** Per-task reviewer CLI override, or null when using the agent's default. */
|
|
126
|
+
reviewCliOverride?: string | null;
|
|
127
|
+
/** Per-task reviewer model override, or null when using the agent's default. */
|
|
128
|
+
reviewModelOverride?: string | null;
|
|
129
|
+
/** True when this task runs as a hotfix in the main checkout. */
|
|
130
|
+
hotfix?: boolean;
|
|
131
|
+
/** Hotfix merge target: "branch" (default) or "main". */
|
|
132
|
+
hotfixTarget?: "branch" | "main";
|
|
133
|
+
/** Live git facts, populated by the git layer (best-effort). */
|
|
134
|
+
git: TaskGitInfo;
|
|
135
|
+
}
|
|
136
|
+
export interface TaskGitInfo {
|
|
137
|
+
/** Does the branch named in frontmatter exist locally? */
|
|
138
|
+
branchExists: boolean;
|
|
139
|
+
/** Does a linked worktree currently have the task's branch checked out? */
|
|
140
|
+
worktreeExists: boolean;
|
|
141
|
+
/** Last commit subject touching this file, if discoverable. */
|
|
142
|
+
lastCommit: string | null;
|
|
143
|
+
/** ISO timestamp of last commit touching this file. */
|
|
144
|
+
lastCommitAt: string | null;
|
|
145
|
+
/** Absolute path of the task's linked worktree, or null when none exists. */
|
|
146
|
+
worktreePath: string | null;
|
|
147
|
+
/**
|
|
148
|
+
* Whether a clean restart would discard prior work: the linked worktree has
|
|
149
|
+
* uncommitted changes, or the branch has commits not in the base branch.
|
|
150
|
+
* Always false when no linked worktree exists.
|
|
151
|
+
*/
|
|
152
|
+
dirty: boolean;
|
|
153
|
+
}
|
|
154
|
+
/** An AI coding agent configurable on the Agents page. */
|
|
155
|
+
export interface Agent {
|
|
156
|
+
/** Agent name — the role key (engineer, reviewer, pm, or a custom name). */
|
|
157
|
+
name: string;
|
|
158
|
+
/** The coding agent CLI used to run this agent. */
|
|
159
|
+
cli: string;
|
|
160
|
+
/** Model name, or "default" to use the coding agent's default. */
|
|
161
|
+
model: string;
|
|
162
|
+
/** When false, the agent is configured but inactive. */
|
|
163
|
+
enabled: boolean;
|
|
164
|
+
/** Optional instructions describing the agent's role and how it should behave. */
|
|
165
|
+
instructions?: string;
|
|
166
|
+
/** Names of repository skills this role is allowed to load for its work. */
|
|
167
|
+
skills?: string[];
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* One entry of an agent session transcript.
|
|
171
|
+
*
|
|
172
|
+
* Legacy entries carry `s`/`d` — plain lines from older sessions or CLI
|
|
173
|
+
* warnings that do not match a structured event. Entries derived
|
|
174
|
+
* from opencode's `--format json` event stream carry a `type` discriminator
|
|
175
|
+
* (`text`/`tool`/`step`/`sys`) so the UI can render them as cards instead of
|
|
176
|
+
* a flat wall of text.
|
|
177
|
+
*/
|
|
178
|
+
export type AgentOutputEntry = (
|
|
179
|
+
/** A complete assistant text part (opencode `text` event). */
|
|
180
|
+
{
|
|
181
|
+
type: "text";
|
|
182
|
+
text: string;
|
|
183
|
+
}
|
|
184
|
+
/** A message sent by the human from the Agent tab follow-up input. */
|
|
185
|
+
| {
|
|
186
|
+
type: "human";
|
|
187
|
+
text: string;
|
|
188
|
+
}
|
|
189
|
+
/** A finished tool call (opencode `tool_use` event). */
|
|
190
|
+
| {
|
|
191
|
+
type: "tool";
|
|
192
|
+
tool: string;
|
|
193
|
+
/** Rendered input (bash -> its command, objects -> pretty JSON). */
|
|
194
|
+
input?: string;
|
|
195
|
+
/** Rendered output, or the error message when the call failed. */
|
|
196
|
+
output?: string;
|
|
197
|
+
/** Tool state: "completed" | "error" (absent when unknown). */
|
|
198
|
+
state?: string;
|
|
199
|
+
}
|
|
200
|
+
/** A step boundary (opencode `step_start` / `step_finish`). */
|
|
201
|
+
| {
|
|
202
|
+
type: "step";
|
|
203
|
+
kind: "start" | "finish";
|
|
204
|
+
reason?: string;
|
|
205
|
+
at?: string;
|
|
206
|
+
}
|
|
207
|
+
/** A system/notice line (open code `error` / `file-update`, or "stopped"). */
|
|
208
|
+
| {
|
|
209
|
+
type: "sys";
|
|
210
|
+
d: string;
|
|
211
|
+
}
|
|
212
|
+
/** A legacy plain line, kept for compatibility and unknown CLI warnings. */
|
|
213
|
+
| {
|
|
214
|
+
s: "out" | "err" | "sys";
|
|
215
|
+
d: string;
|
|
216
|
+
}) & {
|
|
217
|
+
/**
|
|
218
|
+
* ISO timestamp of when the entry was created (0258). Populated by the
|
|
219
|
+
* server on every entry it creates; absent on persisted legacy transcripts.
|
|
220
|
+
*/
|
|
221
|
+
at?: string;
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Live run telemetry for one task's agent session (0080). Best-effort and
|
|
225
|
+
* in-memory only — never persisted across a server restart. Numbers only ever
|
|
226
|
+
* move forward: `null` means "the CLI hasn't reported this," never a
|
|
227
|
+
* fabricated zero.
|
|
228
|
+
*/
|
|
229
|
+
export interface AgentSessionStats {
|
|
230
|
+
/** Cumulative ms across completed turns — excludes any turn in flight. */
|
|
231
|
+
accumulatedMs: number;
|
|
232
|
+
/** ISO timestamp the current turn started, or null when no turn is running. */
|
|
233
|
+
turnStartedAt: string | null;
|
|
234
|
+
/** ISO timestamp of the most recent agent.output line, or null until first output. */
|
|
235
|
+
lastOutputAt: string | null;
|
|
236
|
+
/** Best-effort cumulative token count reported by the CLI, or null if never reported. */
|
|
237
|
+
tokens: number | null;
|
|
238
|
+
/** Best-effort cumulative cost (USD) reported by the CLI, or null if never reported. */
|
|
239
|
+
costUsd: number | null;
|
|
240
|
+
/** True once output has gone stale for the stall window while still running. */
|
|
241
|
+
stalled: boolean;
|
|
242
|
+
}
|
|
243
|
+
/** A skill discovered from the skills dir (skills/<name>/SKILL.md). */
|
|
244
|
+
export interface SkillMeta {
|
|
245
|
+
/** Repo-relative path to the skill file, e.g. "skills/code-review/SKILL.md". */
|
|
246
|
+
path: string;
|
|
247
|
+
/** Skill name from frontmatter (or the folder name). */
|
|
248
|
+
name: string;
|
|
249
|
+
/** One-line description from frontmatter. */
|
|
250
|
+
description: string;
|
|
251
|
+
}
|
|
252
|
+
/** Authentication configuration. Opt-in, disabled by default. */
|
|
253
|
+
export interface AuthConfig {
|
|
254
|
+
/** Whether authentication is enabled. Default false. */
|
|
255
|
+
enabled?: boolean;
|
|
256
|
+
/** Server-side session secret. Never exposed to browser. */
|
|
257
|
+
sessionSecret?: string;
|
|
258
|
+
/** Session lifetime in seconds. Default 604800 (7 days). */
|
|
259
|
+
sessionMaxAge?: number;
|
|
260
|
+
/** Email OTP provider config. */
|
|
261
|
+
emailProvider?: {
|
|
262
|
+
type: "resend";
|
|
263
|
+
apiKey: string;
|
|
264
|
+
fromAddress: string;
|
|
265
|
+
};
|
|
266
|
+
/** Google OAuth config (optional). */
|
|
267
|
+
google?: {
|
|
268
|
+
clientId: string;
|
|
269
|
+
clientSecret: string;
|
|
270
|
+
};
|
|
271
|
+
/** Bootstrap admin email (set on first enable, cleared after bootstrap). */
|
|
272
|
+
bootstrapAdmin?: string;
|
|
273
|
+
/**
|
|
274
|
+
* Static OTP override for local development: `verifyOtp` accepts this code
|
|
275
|
+
* for any allowlisted user instead of requiring the real emailed OTP.
|
|
276
|
+
* Sourced only from `REPOOS_AUTH_DEV_BACKDOOR_CODE` (never from a git-tracked
|
|
277
|
+
* repoos.toml) and only ever honored when `NODE_ENV !== "production"` — see
|
|
278
|
+
* `src/server/routes/auth.ts` `verifyOtp`.
|
|
279
|
+
*/
|
|
280
|
+
devBackdoorCode?: string;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* API keys for model providers with a spend/usage API (0327). Like the [auth]
|
|
284
|
+
* secrets these are env-only — sourced from the gitignored `.env` (via
|
|
285
|
+
* REPOOS_OPENROUTER_API_KEY / REPOOS_OPENCODE_GO_API_KEY) or the process
|
|
286
|
+
* environment, never from a git-tracked repoos.toml key. The Agents page's
|
|
287
|
+
* "Model providers" tab writes them through `setDotEnvSecret`.
|
|
288
|
+
*/
|
|
289
|
+
export interface ModelProviderKeysConfig {
|
|
290
|
+
openrouterApiKey?: string;
|
|
291
|
+
opencodeGoApiKey?: string;
|
|
292
|
+
}
|
|
293
|
+
/** Resolved configuration (after defaults + repoos.toml merge). */
|
|
294
|
+
export interface RepoOSConfig {
|
|
295
|
+
/** Absolute path to the repo root. */
|
|
296
|
+
root: string;
|
|
297
|
+
/** Directory holding task files, relative to root. Default "work". */
|
|
298
|
+
workDir: string;
|
|
299
|
+
/** Directory holding context docs, relative to root. Default "docs". */
|
|
300
|
+
docsDir: string;
|
|
301
|
+
/** Directory holding skills, relative to root. Default "skills". */
|
|
302
|
+
skillsDir: string;
|
|
303
|
+
/** Directory holding human-submitted inputs, relative to root. */
|
|
304
|
+
inputsDir?: string;
|
|
305
|
+
/** Glob-ish: file extensions treated as tasks. Default [".md"]. */
|
|
306
|
+
taskExtensions: string[];
|
|
307
|
+
/** Default status applied to new tasks. */
|
|
308
|
+
defaultStatus: Status;
|
|
309
|
+
/** Default assignee for new tasks. */
|
|
310
|
+
defaultAssignee: Assignee;
|
|
311
|
+
/** Where the derived index cache is written (relative to root). */
|
|
312
|
+
cacheDir: string;
|
|
313
|
+
/** When true, stale builds cause repoos to exit with an error instead of warning. */
|
|
314
|
+
strictBuild?: boolean;
|
|
315
|
+
/** Whether Cloudflare Tunnel controls are surfaced in the web UI. */
|
|
316
|
+
tunnelEnabled?: boolean;
|
|
317
|
+
/** When true, RepoOS publishes task lifecycle events to a ntfy topic. */
|
|
318
|
+
ntfyEnabled?: boolean;
|
|
319
|
+
/** The ntfy topic RepoOS publishes task events to (empty = never send). */
|
|
320
|
+
ntfyTopic?: string;
|
|
321
|
+
/** Base URL of the ntfy server. Defaults to https://ntfy.sh. */
|
|
322
|
+
ntfyBaseUrl?: string;
|
|
323
|
+
/** UI theme preference: dark, light, or system (follow OS). Cosmetic only. */
|
|
324
|
+
theme?: Theme;
|
|
325
|
+
/** UI design language: classic (current) or clear. Cosmetic only. */
|
|
326
|
+
uiTheme?: UiTheme;
|
|
327
|
+
/** New-task drawer mode: freeform (PM agent) or manual form. Default "freeform". */
|
|
328
|
+
defaultTaskMode?: TaskMode;
|
|
329
|
+
/** User-defined agents (defaults are applied at runtime when this is empty). */
|
|
330
|
+
agents?: Agent[];
|
|
331
|
+
/** When true, RepoOS automatically selects and starts ready tasks up to maxActiveTasks. */
|
|
332
|
+
autoEngineeringMode?: boolean;
|
|
333
|
+
/** Maximum number of simultaneously active tasks when auto-engineering mode is enabled. */
|
|
334
|
+
maxActiveTasks?: number;
|
|
335
|
+
/**
|
|
336
|
+
* Maximum number of agent CLI processes (each with its own build/test
|
|
337
|
+
* footprint) the runner will spawn at once, across all tasks and chats.
|
|
338
|
+
* Extra `start`/`send` calls queue and spawn as running agents finish.
|
|
339
|
+
* Unset means "auto" — computed from the host's CPU count at boot so the
|
|
340
|
+
* same repo behaves on a small machine and a big one without tuning.
|
|
341
|
+
*/
|
|
342
|
+
maxConcurrentAgents?: number;
|
|
343
|
+
/**
|
|
344
|
+
* Per-agent state for built-in agents (Tech Debt Agent, …), keyed by agent
|
|
345
|
+
* id: whether it's enabled, its run schedule, and when it last ran. Stored
|
|
346
|
+
* as a JSON sidecar under the cache dir — runtime state, not human-edited
|
|
347
|
+
* configuration.
|
|
348
|
+
*/
|
|
349
|
+
builtInAgents?: Record<string, BuiltInAgentConfig>;
|
|
350
|
+
/** Agent supervisor configuration. */
|
|
351
|
+
supervisor?: SupervisorConfig;
|
|
352
|
+
/** Task watchdog configuration (#0180). */
|
|
353
|
+
watchdog?: WatchdogConfig;
|
|
354
|
+
/** Voice transcription configuration for vibe-coding feature. */
|
|
355
|
+
whisper?: WhisperConfig;
|
|
356
|
+
/** Authentication configuration. */
|
|
357
|
+
auth?: AuthConfig;
|
|
358
|
+
/** Model-provider API keys (0327) — env-only, never a repoos.toml key. */
|
|
359
|
+
modelProviders?: ModelProviderKeysConfig;
|
|
360
|
+
/** Remote validation runner — runs the close-out build+test off this machine. */
|
|
361
|
+
remoteValidation?: RemoteValidationConfig;
|
|
362
|
+
/** Optional product-release integration. Omitted means the Releases UI is hidden. */
|
|
363
|
+
release?: ReleaseConfig;
|
|
364
|
+
/**
|
|
365
|
+
* Per-project opt-in config for `repoos check` steps (tasks #0348, #0351).
|
|
366
|
+
* Omitted means every pluggable step (`ui-smoke`, CSS layering, theme
|
|
367
|
+
* contrast) skips unless the project declares it here or through a
|
|
368
|
+
* well-known `package.json` script.
|
|
369
|
+
*/
|
|
370
|
+
check?: CheckConfig;
|
|
371
|
+
/**
|
|
372
|
+
* Per-project config for task previews (task #0362). A repo declares a
|
|
373
|
+
* command and/or named targets here; those run, selected by the task's
|
|
374
|
+
* `area`. Omitting the section is not an implicit default (#0370): a task
|
|
375
|
+
* with no resolvable target gets a clean, actionable "no preview configured"
|
|
376
|
+
* result rather than booting RepoOS's own board.
|
|
377
|
+
*/
|
|
378
|
+
preview?: PreviewConfig;
|
|
379
|
+
/**
|
|
380
|
+
* Deployment targets (task #0340) — one row per (service, branch). Absent or
|
|
381
|
+
* empty means the Deployments nav item and API stay hidden for this repo.
|
|
382
|
+
*/
|
|
383
|
+
deployments?: DeploymentConfig[];
|
|
384
|
+
/**
|
|
385
|
+
* Advisory ceiling on registered git worktrees (including the main checkout).
|
|
386
|
+
* Above it, the Control page's Codebase card turns amber and the server logs
|
|
387
|
+
* a "run `repoos gc`" warning — never enforced, never blocks a task start.
|
|
388
|
+
* Default 20. Set 0 to disable the warning.
|
|
389
|
+
*/
|
|
390
|
+
worktreeWarnThreshold?: number;
|
|
391
|
+
/**
|
|
392
|
+
* Port `repoos serve` binds by default (overridable with `--port`). Unset
|
|
393
|
+
* means "derive a stable per-repo port from the repo root path" so two
|
|
394
|
+
* checkouts on one machine don't both grab 7171. Pin it here for a repo
|
|
395
|
+
* whose port other tooling hardcodes (e.g. this dogfood repo → 7171).
|
|
396
|
+
*/
|
|
397
|
+
servePort?: number;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* A single configured deployment target: one (service, branch) pair shipped to
|
|
401
|
+
* a provider (task #0340). Unlike [release] — a single versioned artifact — a
|
|
402
|
+
* repo can have N services × M environments, each a row on the Deployments
|
|
403
|
+
* page. Entirely declarative: no live provider API in v1, `provider` is a
|
|
404
|
+
* plain label and every URL is user-supplied. Omitted entirely in most repos,
|
|
405
|
+
* which keeps the Deployments nav item and API dormant.
|
|
406
|
+
*/
|
|
407
|
+
export interface DeploymentConfig {
|
|
408
|
+
/** Human label, e.g. "Landing page (prod)". */
|
|
409
|
+
name: string;
|
|
410
|
+
/**
|
|
411
|
+
* Groups this row with others of the same service across branches (e.g.
|
|
412
|
+
* "Landing page" for both its prod and dev rows), so the Deployments page
|
|
413
|
+
* can render one row per service with a column per branch. Defaults to
|
|
414
|
+
* `name` when absent, so a config with no `service` keys keeps today's
|
|
415
|
+
* ungrouped, one-row-per-config-entry behavior exactly.
|
|
416
|
+
*/
|
|
417
|
+
service?: string;
|
|
418
|
+
/** Branch whose pushes deploy this target (e.g. prod / main). */
|
|
419
|
+
branch: string;
|
|
420
|
+
/** Provider label, e.g. "cloudflare-workers". Informational only. */
|
|
421
|
+
provider?: string;
|
|
422
|
+
/** The live URL for this target — rendered as the row's primary link. */
|
|
423
|
+
url?: string;
|
|
424
|
+
/** Optional provider-dashboard URL (account-specific, pasted in by hand). */
|
|
425
|
+
dashboardUrl?: string;
|
|
426
|
+
/**
|
|
427
|
+
* Repo subdirectory this service lives in, scoping the per-row freshness
|
|
428
|
+
* lookup to `git log -1 <branch> -- <subdir>` so an unrelated push to the
|
|
429
|
+
* branch doesn't read as a deploy of this service. Omit for a branch-wide
|
|
430
|
+
* signal.
|
|
431
|
+
*/
|
|
432
|
+
subdir?: string;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* A deliberately small first release provider. `git-tag` is portable: the
|
|
436
|
+
* repository's own CI/provider decides what a pushed tag means. Additional
|
|
437
|
+
* providers can implement the same status + confirmed-action contract later.
|
|
438
|
+
*/
|
|
439
|
+
export interface ReleaseConfig {
|
|
440
|
+
enabled?: boolean;
|
|
441
|
+
provider?: "git-tag";
|
|
442
|
+
name?: string;
|
|
443
|
+
/** Branch a release must be cut from. Defaults to main. */
|
|
444
|
+
branch?: string;
|
|
445
|
+
/** Project manifest containing the committed semantic version. */
|
|
446
|
+
versionFile?: string;
|
|
447
|
+
/** Prefix prepended to the version for the git tag. Defaults to v. */
|
|
448
|
+
tagPrefix?: string;
|
|
449
|
+
/** Git remote to receive the annotated tag. Defaults to origin. */
|
|
450
|
+
remote?: string;
|
|
451
|
+
/** Optional GitHub owner/repo, used only to link to the resulting release. */
|
|
452
|
+
repository?: string;
|
|
453
|
+
/** Optional workflow path, shown as release context (not executed by RepoOS). */
|
|
454
|
+
workflow?: string;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Remote Validation Runner (#RVR). The close-out gate's expensive half —
|
|
458
|
+
* `bun run build` + `bun run test` — runs on a disposable cloud VM instead of
|
|
459
|
+
* the developer's machine, which is where MTD keeps failing under memory
|
|
460
|
+
* pressure. The cheap static guards (CSS/theme/require/lockfile/UI-smoke) still
|
|
461
|
+
* run locally. Master switch defaults off: enabling it sends repo contents to a
|
|
462
|
+
* third-party host (see docs/remote-validation.md).
|
|
463
|
+
*/
|
|
464
|
+
export interface RemoteValidationConfig {
|
|
465
|
+
/** Master switch. Default false. */
|
|
466
|
+
enabled?: boolean;
|
|
467
|
+
/** Cloud provider. Only "hetzner" is implemented for the MVP. */
|
|
468
|
+
provider?: "hetzner";
|
|
469
|
+
/**
|
|
470
|
+
* Hetzner server type. Default "cax31" (8 vCPU Ampere ARM / 16 GB) — the
|
|
471
|
+
* cheapest type that fills the vitest 8-worker pool; this repo has no native
|
|
472
|
+
* deps so arm64 is safe. Use "cpx41" for an x86 (AMD) snapshot instead.
|
|
473
|
+
* MUST match the architecture the snapshot was built on.
|
|
474
|
+
*/
|
|
475
|
+
serverType?: string;
|
|
476
|
+
/** Hetzner location slug. Default "hil". */
|
|
477
|
+
location?: string;
|
|
478
|
+
/**
|
|
479
|
+
* ID (or name) of the prebuilt Hetzner snapshot the runner boots from — an
|
|
480
|
+
* image with Docker installed and the `repoos-ci` container image preloaded.
|
|
481
|
+
* Built once via scripts/remote-runner/build-snapshot.md.
|
|
482
|
+
*/
|
|
483
|
+
snapshotId?: string;
|
|
484
|
+
/** Name of the SSH key registered in the Hetzner project, injected into the server. */
|
|
485
|
+
sshKeyName?: string;
|
|
486
|
+
/**
|
|
487
|
+
* Keep a warm server alive this long after a job finishes so queued jobs
|
|
488
|
+
* reuse it instead of paying cold-boot each time. Default 8.
|
|
489
|
+
*/
|
|
490
|
+
idleShutdownMinutes?: number;
|
|
491
|
+
/**
|
|
492
|
+
* Hard cost stop-loss: force-delete any runner older than this, even
|
|
493
|
+
* mid-job (the job then fails retryably). Default 120.
|
|
494
|
+
*/
|
|
495
|
+
maxServerLifetimeMinutes?: number;
|
|
496
|
+
/**
|
|
497
|
+
* When the remote runner is unreachable / provisioning fails, fall back to
|
|
498
|
+
* running the full gate locally instead of failing the close-out. Default
|
|
499
|
+
* false — a transient infra failure keeps the task in `review` for retry
|
|
500
|
+
* rather than dropping back onto the contended local machine.
|
|
501
|
+
*/
|
|
502
|
+
fallbackToLocal?: boolean;
|
|
503
|
+
/**
|
|
504
|
+
* Opt a human-watched release cut into the remote runner. Default false.
|
|
505
|
+
* Close-out uses the runner whenever `enabled` is true (it runs unattended,
|
|
506
|
+
* so VM boot/provision latency is invisible); a release is something the
|
|
507
|
+
* operator watches in the Releases modal, where a ~1-2 min remote-provision
|
|
508
|
+
* delay can read as a regression even though it is more reliable, so it is
|
|
509
|
+
* an explicit opt-in rather than inheriting the close-out flag.
|
|
510
|
+
*/
|
|
511
|
+
useForReleases?: boolean;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Per-project `repoos check` step configuration (#0348), from `repoos.toml`'s
|
|
515
|
+
* `[check]` section. `check` is the generic definition-of-done gate every
|
|
516
|
+
* managed project runs, but some of its steps are only meaningful when the
|
|
517
|
+
* project opts into them — `ui-smoke` used to boot RepoOS's own dashboard for
|
|
518
|
+
* every repo, which is wrong for a project with no board UI. Each step is
|
|
519
|
+
* opt-in: absent means the step skips cleanly, exactly like the existing
|
|
520
|
+
* `fmt:check`/`lint`/`tests` steps do when the relevant script is absent.
|
|
521
|
+
*/
|
|
522
|
+
export interface CheckConfig {
|
|
523
|
+
/**
|
|
524
|
+
* Shell command `repoos check` runs for its UI smoke step. When set it
|
|
525
|
+
* overrides a `smoke` script in the project's `package.json` (config wins).
|
|
526
|
+
* Absent and no `smoke` script means the step skips.
|
|
527
|
+
*/
|
|
528
|
+
uiSmoke?: string;
|
|
529
|
+
/**
|
|
530
|
+
* Repo-relative path to the stylesheet the CSS-layering and theme-contrast
|
|
531
|
+
* guards read (#0351). Both guards carry no RepoOS-shaped default path, so
|
|
532
|
+
* absent means both skip cleanly.
|
|
533
|
+
*/
|
|
534
|
+
uiStylesheet?: string;
|
|
535
|
+
/**
|
|
536
|
+
* Theme blocks inside `uiStylesheet`, each mapped to a variant name and the
|
|
537
|
+
* earlier scopes it inherits declarations from — the token vocabulary that
|
|
538
|
+
* used to be hardcoded for RepoOS (#0351). Absent means the theme-contrast
|
|
539
|
+
* guard skips even when `uiStylesheet` is set.
|
|
540
|
+
*/
|
|
541
|
+
themeScopes?: CheckThemeScope[];
|
|
542
|
+
/** Foreground/background token pairs checked for ≥3:1 WCAG contrast (#0351). */
|
|
543
|
+
contrastPairs?: CheckContrastPair[];
|
|
544
|
+
/**
|
|
545
|
+
* Token to composite semi-transparent colors over before measuring their
|
|
546
|
+
* luminance — normally the page background (RepoOS uses `--bg`). Optional:
|
|
547
|
+
* without it the pair's own background token is used, falling back to white.
|
|
548
|
+
* A missing backdrop never skips a pair, it only approximates an alpha
|
|
549
|
+
* channel (#0351).
|
|
550
|
+
*/
|
|
551
|
+
backdropToken?: string;
|
|
552
|
+
/**
|
|
553
|
+
* Tokens consumed as `background-image` (so they must resolve to a gradient,
|
|
554
|
+
* not a solid color — a solid value renders a transparent button) (#0351).
|
|
555
|
+
*/
|
|
556
|
+
gradientTokens?: string[];
|
|
557
|
+
/**
|
|
558
|
+
* Repo-relative source roots the bare-`require()` guard scans (#0352). The
|
|
559
|
+
* guard is generic — a bare `require` in a `"type": "module"` package breaks
|
|
560
|
+
* only in the compiled ESM output — but the directories to scan are not, so
|
|
561
|
+
* they are declared per-project here. Absent, the guard falls back to the
|
|
562
|
+
* repo's `tsconfig` `include`/`files` list (minus its `exclude` list); if
|
|
563
|
+
* neither yields a root it skips with a clear message.
|
|
564
|
+
*/
|
|
565
|
+
bareRequireDirs?: string[];
|
|
566
|
+
/**
|
|
567
|
+
* Repo-relative paths or tsconfig-style globs the bare-`require()` guard
|
|
568
|
+
* skips when scanning `bareRequireDirs` (#0352) — e.g. a generated subtree.
|
|
569
|
+
* Only consulted alongside `bareRequireDirs`; when the roots come from the
|
|
570
|
+
* tsconfig instead, the tsconfig's own `exclude` list is used.
|
|
571
|
+
*/
|
|
572
|
+
bareRequireExcludes?: string[];
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* One theme block `repoos check`'s contrast guard evaluates (#0351): the
|
|
576
|
+
* selector that opens it, a variant name for failure messages, and the earlier
|
|
577
|
+
* scopes whose declarations it inherits (cascade order, later wins). RepoOS's
|
|
578
|
+
* own `:root`/`[data-theme]`/`[data-ui-theme]` blocks are declared this way in
|
|
579
|
+
* its `repoos.toml`; the guard itself knows none of those selector names.
|
|
580
|
+
*/
|
|
581
|
+
export interface CheckThemeScope {
|
|
582
|
+
/** CSS selector opening the block, e.g. `:root[data-ui-theme="clear"]`. */
|
|
583
|
+
selector: string;
|
|
584
|
+
/** Variant name used in failure messages, e.g. `clear-dark`. */
|
|
585
|
+
name: string;
|
|
586
|
+
/**
|
|
587
|
+
* Names of earlier scopes whose declarations this scope inherits, in order
|
|
588
|
+
* (later wins). Defaults to `[name]` — the block stands alone.
|
|
589
|
+
*/
|
|
590
|
+
inherits?: string[];
|
|
591
|
+
}
|
|
592
|
+
/** A (foreground token, background token) pair checked for contrast (#0351). */
|
|
593
|
+
export interface CheckContrastPair {
|
|
594
|
+
fg: string;
|
|
595
|
+
bg: string;
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* A named preview target (#0362): one previewable thing in a repo, selected by
|
|
599
|
+
* matching the task's `area:` frontmatter (case-insensitive). A monorepo can
|
|
600
|
+
* hold a landing page, a docs site, several web apps, etc.; each gets a target
|
|
601
|
+
* whose `areas` list names the task areas it serves.
|
|
602
|
+
*/
|
|
603
|
+
export interface PreviewTargetConfig {
|
|
604
|
+
/** Human label for diagnostics, e.g. "Landing page". */
|
|
605
|
+
name: string;
|
|
606
|
+
/** Task `area:` values this target serves, matched case-insensitively. */
|
|
607
|
+
areas: string[];
|
|
608
|
+
/**
|
|
609
|
+
* Shell command that boots the preview. `{port}` and `{host}` are replaced
|
|
610
|
+
* with the OS-assigned values; `PORT`/`HOST` are also exported into the
|
|
611
|
+
* child's environment. Runs with the worktree root as cwd unless `cwd` is set.
|
|
612
|
+
*/
|
|
613
|
+
command: string;
|
|
614
|
+
/** Optional subdirectory of the worktree to run the command in. */
|
|
615
|
+
cwd?: string;
|
|
616
|
+
/**
|
|
617
|
+
* Optional path polled for readiness (relative to the preview URL). Defaults
|
|
618
|
+
* to `/`.
|
|
619
|
+
*/
|
|
620
|
+
readyPath?: string;
|
|
621
|
+
/**
|
|
622
|
+
* Optional override for how long the manager waits for this target to
|
|
623
|
+
* answer before giving up (milliseconds). Defaults to a value sized for a
|
|
624
|
+
* plain dev-server start; a command that also builds first (`bun run
|
|
625
|
+
* build && ...`) needs this raised, or a cold/unbuilt worktree is killed
|
|
626
|
+
* mid-build and reported as "did not become ready" (#0370).
|
|
627
|
+
*/
|
|
628
|
+
readyTimeoutMs?: number;
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Per-project task-preview configuration (#0362), from `repoos.toml`'s
|
|
632
|
+
* `[preview]` section plus any `[[preview.targets]]` tables. The whole point is
|
|
633
|
+
* that "preview a task" is not hardcoded to RepoOS's own web UI: an adopting
|
|
634
|
+
* repo declares how to boot its own previewable thing.
|
|
635
|
+
*
|
|
636
|
+
* Resolution order for a given task:
|
|
637
|
+
* 1. a `[[preview.targets]]` whose `areas` include the task's `area` wins;
|
|
638
|
+
* 2. else the top-level `command` (a default target for any area);
|
|
639
|
+
* 3. else — nothing matches (or the section is absent entirely) — "no preview
|
|
640
|
+
* configured", returned cleanly with an actionable message rather than
|
|
641
|
+
* attempted (#0370).
|
|
642
|
+
*/
|
|
643
|
+
export interface PreviewConfig {
|
|
644
|
+
/** Default preview command, used when no target matches the task's area. */
|
|
645
|
+
command?: string;
|
|
646
|
+
/** Default subdirectory to run `command` in, relative to the worktree root. */
|
|
647
|
+
cwd?: string;
|
|
648
|
+
/** Default readiness path for `command` (default `/`). */
|
|
649
|
+
readyPath?: string;
|
|
650
|
+
/** Default readiness timeout for `command` — see PreviewTargetConfig.readyTimeoutMs. */
|
|
651
|
+
readyTimeoutMs?: number;
|
|
652
|
+
/** Named targets, selected by the task's `area:` frontmatter. */
|
|
653
|
+
targets?: PreviewTargetConfig[];
|
|
654
|
+
}
|
|
655
|
+
/** Whisper voice transcription configuration. */
|
|
656
|
+
export interface WhisperConfig {
|
|
657
|
+
provider?: "groq" | "openai" | "none";
|
|
658
|
+
apiKey?: string;
|
|
659
|
+
}
|
|
660
|
+
/** How often a built-in agent runs: Daily, Weekly, or only when manually triggered. */
|
|
661
|
+
export type BuiltInAgentSchedule = "daily" | "weekly" | "manual";
|
|
662
|
+
/** Persisted state for one built-in agent. */
|
|
663
|
+
export interface BuiltInAgentConfig {
|
|
664
|
+
enabled?: boolean;
|
|
665
|
+
schedule?: BuiltInAgentSchedule;
|
|
666
|
+
/** ISO timestamp of the last completed run, set by the server. */
|
|
667
|
+
lastRunAt?: string;
|
|
668
|
+
/** Coding agent CLI to use for this built-in agent (e.g., "opencode", "gpt"). */
|
|
669
|
+
cli?: string;
|
|
670
|
+
/** Model to use for this built-in agent. */
|
|
671
|
+
model?: string;
|
|
672
|
+
}
|
|
673
|
+
/** Task watchdog configuration (#0180). */
|
|
674
|
+
export interface WatchdogConfig {
|
|
675
|
+
/** Whether the watchdog runs. Default true. */
|
|
676
|
+
enabled?: boolean;
|
|
677
|
+
/**
|
|
678
|
+
* Milliseconds of silence (no running agent, no task-file activity) before an
|
|
679
|
+
* `active` task is candidate-stuck. Default 5 minutes.
|
|
680
|
+
*/
|
|
681
|
+
stalenessMs?: number;
|
|
682
|
+
/**
|
|
683
|
+
* Whether a stuck task auto-transitions out of `active` — to `review` when
|
|
684
|
+
* its worktree holds work, else back to `ready` — instead of only setting
|
|
685
|
+
* `needsInput`. Default true.
|
|
686
|
+
*/
|
|
687
|
+
autoTransition?: boolean;
|
|
688
|
+
}
|
|
689
|
+
/** Agent supervisor configuration. */
|
|
690
|
+
export interface SupervisorConfig {
|
|
691
|
+
/** Whether supervision is enabled. Default false. */
|
|
692
|
+
enabled?: boolean;
|
|
693
|
+
/** Check interval in seconds. Default 300 (5 minutes). */
|
|
694
|
+
interval?: number;
|
|
695
|
+
/** Supervision mode: "observe" (diagnose only) or "recover" (can apply safe actions). Default "observe". */
|
|
696
|
+
mode?: "observe" | "recover";
|
|
697
|
+
/** Seconds of no output before task is considered quiet. Default 600 (10 minutes). */
|
|
698
|
+
quietThreshold?: number;
|
|
699
|
+
/** Cycles of quiet output before a confirmed stall. Default 3. */
|
|
700
|
+
stallThreshold?: number;
|
|
701
|
+
/** Max automatic restarts per task. Default 2. */
|
|
702
|
+
maxRestarts?: number;
|
|
703
|
+
/** Base cooldown between restart attempts in seconds. Default 60. */
|
|
704
|
+
cooldownSeconds?: number;
|
|
705
|
+
/** Agent name for diagnostic analysis. Optional; if omitted, deterministic classification only. */
|
|
706
|
+
diagnosticAgent?: string;
|
|
707
|
+
/** Ordered list of fallback agent/model combinations to try on repeated failures. */
|
|
708
|
+
fallbacks?: Array<{
|
|
709
|
+
agent?: string;
|
|
710
|
+
model?: string;
|
|
711
|
+
}>;
|
|
712
|
+
}
|
|
713
|
+
/** A classification of a task's health status. */
|
|
714
|
+
export type TaskHealthStatus = "healthy" | "quiet-but-alive" | "progressing-without-output" | "waiting-for-human" | "blocked-on-merge" | "resource-constrained" | "exited-unexpectedly" | "confirmed-stalled" | "orphaned" | "inconsistent" | "unknown";
|
|
715
|
+
/** Supervisor heartbeat report for the Control page. */
|
|
716
|
+
export interface SupervisorHeartbeat {
|
|
717
|
+
/** Unique cycle id. */
|
|
718
|
+
id: string;
|
|
719
|
+
/** When the cycle started (ISO-8601). */
|
|
720
|
+
startedAt: string;
|
|
721
|
+
/** When the cycle completed (ISO-8601). */
|
|
722
|
+
completedAt?: string;
|
|
723
|
+
/** When the next check will run (ISO-8601). */
|
|
724
|
+
nextCheckAt: string;
|
|
725
|
+
/** Current supervisor mode. */
|
|
726
|
+
mode: "observe" | "recover";
|
|
727
|
+
/** Total active tasks. */
|
|
728
|
+
totalActive: number;
|
|
729
|
+
/** Healthy tasks. */
|
|
730
|
+
healthy: number;
|
|
731
|
+
/** Tasks with warnings. */
|
|
732
|
+
warnings: number;
|
|
733
|
+
/** Per-task status entries. */
|
|
734
|
+
tasks: Array<{
|
|
735
|
+
id: string;
|
|
736
|
+
title: string;
|
|
737
|
+
status: TaskHealthStatus;
|
|
738
|
+
lastOutput?: string;
|
|
739
|
+
evidence?: string;
|
|
740
|
+
action?: string;
|
|
741
|
+
}>;
|
|
742
|
+
}
|
|
743
|
+
/** The derived index. Disposable — rebuilt from files at any time. */
|
|
744
|
+
export interface RepoIndex {
|
|
745
|
+
version: number;
|
|
746
|
+
generatedAt: string;
|
|
747
|
+
root: string;
|
|
748
|
+
taskCount: number;
|
|
749
|
+
/** Sorted by (status order, priority, id). */
|
|
750
|
+
tasks: Task[];
|
|
751
|
+
/** Quick counts per status, for dashboards. */
|
|
752
|
+
counts: Record<Status, number>;
|
|
753
|
+
}
|
|
754
|
+
/**
|
|
755
|
+
* Lightweight task view for the board — everything TaskCard.vue renders,
|
|
756
|
+
* without the full body, extra, agent overrides, or activity (saved ~4-5 KB per
|
|
757
|
+
* task at current task counts). Includes a body preview for search and
|
|
758
|
+
* releasedAt for the release timeline.
|
|
759
|
+
*/
|
|
760
|
+
export interface BoardTask {
|
|
761
|
+
id: string;
|
|
762
|
+
title: string;
|
|
763
|
+
type: string;
|
|
764
|
+
status: Status;
|
|
765
|
+
needsInput: boolean;
|
|
766
|
+
needsInputReason?: string;
|
|
767
|
+
needsMerge: boolean;
|
|
768
|
+
priority: Priority | string;
|
|
769
|
+
area: string;
|
|
770
|
+
assignee: Assignee;
|
|
771
|
+
assignedTo: string;
|
|
772
|
+
createdBy: string;
|
|
773
|
+
branch: string;
|
|
774
|
+
tags: string[];
|
|
775
|
+
created_at: string | null;
|
|
776
|
+
updated_at: string | null;
|
|
777
|
+
/** ISO timestamp of the successful review-to-done merge, derived from Activity. */
|
|
778
|
+
releasedAt: string | null;
|
|
779
|
+
/** Truncated body preview for search (first 500 chars). */
|
|
780
|
+
bodyPreview: string;
|
|
781
|
+
path: string;
|
|
782
|
+
absPath: string;
|
|
783
|
+
git: TaskGitInfo;
|
|
784
|
+
/** Always null in the board response — set on the client from SSE events. */
|
|
785
|
+
preview: null;
|
|
786
|
+
/** Automatic check-failure retries used on this task's most recent handoff
|
|
787
|
+
* (see handoff.ts's scheduleCheckFailureRetry, capped at 2). Lets the board
|
|
788
|
+
* distinguish "engineer patching a post-handoff check failure" from
|
|
789
|
+
* ordinary coding once a review-status task shows a running agent. */
|
|
790
|
+
checkRetryCount: number;
|
|
791
|
+
/** Automatic merge-conflict retries used on this task's most recent
|
|
792
|
+
* close-out attempt (see handoff.ts's scheduleMergeConflictRetry, capped
|
|
793
|
+
* at 2, #0271 follow-up). Same purpose as checkRetryCount, one step
|
|
794
|
+
* earlier in the pipeline. */
|
|
795
|
+
mergeConflictRetryCount: number;
|
|
796
|
+
/** Automatic retries after the task-watchdog detected a dead session that
|
|
797
|
+
* exited without a clean handoff (see handoff.ts's
|
|
798
|
+
* scheduleHandoffSignalRetry, capped at 2, #0271 follow-up). The task
|
|
799
|
+
* stays `active` throughout, unlike the other two which stay `review` —
|
|
800
|
+
* lets the board distinguish this from ordinary active-status coding. */
|
|
801
|
+
handoffSignalRetryCount: number;
|
|
802
|
+
}
|
|
803
|
+
/** Board index — like RepoIndex but with BoardTask[] instead of Task[]. */
|
|
804
|
+
export interface BoardIndex {
|
|
805
|
+
version: number;
|
|
806
|
+
generatedAt: string;
|
|
807
|
+
root: string;
|
|
808
|
+
taskCount: number;
|
|
809
|
+
tasks: BoardTask[];
|
|
810
|
+
counts: Record<Status, number>;
|
|
811
|
+
}
|