specrails-desktop 2.57.0 → 2.58.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cli/dist/args.js +10 -4
- package/cli/dist/help.js +1 -1
- package/client/dist/assets/{ActivityFeedPage-DdMNmVBk.js → ActivityFeedPage-BQGppIR0.js} +1 -1
- package/client/dist/assets/{AgentBrowserCapture-CeerUf--.js → AgentBrowserCapture-PI-cxyxi.js} +1 -1
- package/client/dist/assets/{AgentModeAnalyticsPane-BjGb-8rh.js → AgentModeAnalyticsPane-mQsOqdXx.js} +2 -2
- package/client/dist/assets/{AgentModeCodePane-8XRkQEo_.js → AgentModeCodePane-BL-vpmlY.js} +2 -2
- package/client/dist/assets/{AgentModeJobsPane-BN3dgJOA.js → AgentModeJobsPane-DR_06oqH.js} +1 -1
- package/client/dist/assets/AgentsPage-BKIKjm_1.js +118 -0
- package/client/dist/assets/{AnalyticsPage-CyfhYiBn.js → AnalyticsPage-069npRVo.js} +1 -1
- package/client/dist/assets/{CodePage-C2Nf-Q5W.js → CodePage-Alitorrv.js} +2 -2
- package/client/dist/assets/DesktopAnalyticsPage-qtWAPM47.js +1 -0
- package/client/dist/assets/{DocsDialog-Br3bczCp.js → DocsDialog-DwL6rgcT.js} +1 -1
- package/client/dist/assets/{DocsPage-BcDr2cBm.js → DocsPage-BA1hiJZ-.js} +1 -1
- package/client/dist/assets/{ExportDropdown-BVGKEgkd.js → ExportDropdown-BcMpvV89.js} +1 -1
- package/client/dist/assets/InteractiveJobComposer-B3H1YHr6.js +19 -0
- package/client/dist/assets/JobDetailModal-XZQ9eAAy.js +1 -0
- package/client/dist/assets/{JobDetailPage-vBbNeRuz.js → JobDetailPage-B-SIaq_q.js} +1 -1
- package/client/dist/assets/{JobsPage-CJCtPhIz.js → JobsPage-iQXAv2mx.js} +1 -1
- package/client/dist/assets/LoopBuilderPage-B_gbFAHn.js +1 -0
- package/client/dist/assets/LoopPreviewModal-je5pSCf-.js +1 -0
- package/client/dist/assets/LoopsPage-BZwcY5cu.js +2 -0
- package/client/dist/assets/{MinimizedChatsContext-D3QzgV0B.js → MinimizedChatsContext-CNx_0bZu.js} +1 -1
- package/client/dist/assets/{PluginsPage-DOpTV75p.js → PluginsPage-DFocnoHX.js} +2 -2
- package/client/dist/assets/{ProjectSettingsDialog-Dkwrn0z1.js → ProjectSettingsDialog-Bh3S6EBB.js} +1 -1
- package/client/dist/assets/{RepositoryDeliveries-Du2UCf1a.js → RepositoryDeliveries-BiwJuS8r.js} +1 -1
- package/client/dist/assets/{RepositoryScopeSelector-hPGZNRBm.js → RepositoryScopeSelector-C2mvWBQ6.js} +1 -1
- package/client/dist/assets/{ReviewPacketPage-DcOq-UTA.js → ReviewPacketPage-CrAf-WDy.js} +2 -2
- package/client/dist/assets/TemplatePreviewModal-C7DordpN.js +1 -0
- package/client/dist/assets/{TicketDetailModalContext-DAK-NoK6.js → TicketDetailModalContext-B-DySpKL.js} +1 -1
- package/client/dist/assets/{Trans-DEbgkuAY.js → Trans-D3AfDylf.js} +1 -1
- package/client/dist/assets/agentRuntime-BeUb3g9g.js +1 -0
- package/client/dist/assets/agentRuntime-Bg9tbmqm.js +1 -0
- package/client/dist/assets/agentRuntime-D-GJVGkj.js +1 -0
- package/client/dist/assets/agentRuntime-D2__CVI_.js +1 -0
- package/client/dist/assets/agentRuntime-D35dGVOP.js +1 -0
- package/client/dist/assets/agentRuntime-DGz_IqKW.js +1 -0
- package/client/dist/assets/agentRuntime-O1liDt6G.js +1 -0
- package/client/dist/assets/agentRuntime-hInH9Fzj.js +1 -0
- package/client/dist/assets/agentstudio-B2CTtQgZ.js +1 -0
- package/client/dist/assets/agentstudio-BWAKeGgB.js +1 -0
- package/client/dist/assets/{agentstudio-DR7doNBV.js → agentstudio-Cja8Sjcp.js} +1 -1
- package/client/dist/assets/agentstudio-DtfPcr99.js +1 -0
- package/client/dist/assets/agentstudio-QdAJIDef.js +1 -0
- package/client/dist/assets/agentstudio-X70BKf6u.js +1 -0
- package/client/dist/assets/agentstudio-fLXpRGIi.js +1 -0
- package/client/dist/assets/agentstudio-qXKqVnWS.js +1 -0
- package/client/dist/assets/{analytics-jzCkOec3.js → analytics-B1DIQd4m.js} +1 -1
- package/client/dist/assets/{analytics-CoEzWPx4.js → analytics-BAIZ9vE_.js} +1 -1
- package/client/dist/assets/{analytics-DjLlE7jS.js → analytics-BTqgmgBd.js} +1 -1
- package/client/dist/assets/analytics-BWynXPEm.js +1 -0
- package/client/dist/assets/{analytics-nZIjjtCc.js → analytics-DGcUsQ44.js} +1 -1
- package/client/dist/assets/{analytics-BNgZ1Nj7.js → analytics-GnSnpJ4W.js} +1 -1
- package/client/dist/assets/{analytics-DFh5lSOl.js → analytics-TWgYaoO0.js} +1 -1
- package/client/dist/assets/{analytics-DZp-DS2U.js → analytics-kJy6Tuko.js} +1 -1
- package/client/dist/assets/builder-C0FyvM83.js +1 -0
- package/client/dist/assets/builder-C1neIYGR.js +1 -0
- package/client/dist/assets/builder-CvnFm0im.js +1 -0
- package/client/dist/assets/builder-CzW5ovyI.js +1 -0
- package/client/dist/assets/builder-D06L7iPy.js +1 -0
- package/client/dist/assets/builder-DGETbtZj.js +1 -0
- package/client/dist/assets/builder-DXEJUlC0.js +1 -0
- package/client/dist/assets/builder-DyQperXU.js +1 -0
- package/client/dist/assets/common-BCK7c9Pv.js +1 -0
- package/client/dist/assets/common-C0BOdeNi.js +1 -0
- package/client/dist/assets/common-C4Yvvhp6.js +1 -0
- package/client/dist/assets/{common-BrlwEnL7.js → common-DmsclwjP.js} +1 -1
- package/client/dist/assets/common-DpLWwgI1.js +1 -0
- package/client/dist/assets/common-OCvl3c8t.js +1 -0
- package/client/dist/assets/common-c0aujEZC.js +1 -0
- package/client/dist/assets/common-od8WThlf.js +1 -0
- package/client/dist/assets/dashboard-B1ndRHuC.js +1 -0
- package/client/dist/assets/dashboard-BX7KXiqA.js +1 -0
- package/client/dist/assets/dashboard-B_BSNxcN.js +1 -0
- package/client/dist/assets/dashboard-CCeFN7-V.js +1 -0
- package/client/dist/assets/dashboard-CRl0WtFJ.js +1 -0
- package/client/dist/assets/dashboard-XGdQ5mjw.js +1 -0
- package/client/dist/assets/dashboard-_oltA6Jd.js +1 -0
- package/client/dist/assets/dashboard-bAuf5KVk.js +1 -0
- package/client/dist/assets/{formatDistanceToNow-Cc2u5FwQ.js → formatDistanceToNow-aBss1Nai.js} +1 -1
- package/client/dist/assets/{getTimezoneOffsetInMilliseconds-BHm2U-w1.js → getTimezoneOffsetInMilliseconds-DOGj1Mfz.js} +1 -1
- package/client/dist/assets/index-BS7KCWkV.css +2 -0
- package/client/dist/assets/{index-Cxb288Rj.js → index-C4Mv6tV6.js} +32 -32
- package/client/dist/assets/{jira-api-DrGxiD9p.js → jira-api-BYbEPlkr.js} +1 -1
- package/client/dist/assets/{jobs-DSp9DoD_.js → jobs-6_-r75yC.js} +1 -1
- package/client/dist/assets/{jobs-C6qmvUAi.js → jobs-B1yqyId5.js} +1 -1
- package/client/dist/assets/{jobs-DoFaEl9g.js → jobs-BFuV7ttH.js} +1 -1
- package/client/dist/assets/{jobs-DTQO08nJ.js → jobs-BKa8LuwA.js} +1 -1
- package/client/dist/assets/{jobs-DrF8Do8s.js → jobs-BKiK-ZWh.js} +1 -1
- package/client/dist/assets/{jobs-DLHdDkHc.js → jobs-DmKV7b7d.js} +1 -1
- package/client/dist/assets/{jobs-C9j2PuwW.js → jobs-KG4Sn12X.js} +1 -1
- package/client/dist/assets/{jobs-Dpw6AEOP.js → jobs-pPv4KWjb.js} +1 -1
- package/client/dist/assets/loop-layout-BF8xMiNv.js +7 -0
- package/client/dist/assets/loops-B4_D-nbg.js +1 -0
- package/client/dist/assets/loops-BJDY9FTh.js +1 -0
- package/client/dist/assets/loops-BO3V8244.js +1 -0
- package/client/dist/assets/loops-C-hZK8pf.js +1 -0
- package/client/dist/assets/loops-CDOWZ0ci.js +1 -0
- package/client/dist/assets/loops-Dv849ckF.js +1 -0
- package/client/dist/assets/loops-Q9LIgGkq.js +1 -0
- package/client/dist/assets/loops-eUnCfLjC.js +1 -0
- package/client/dist/assets/{project-repositories-9Wzs0coQ.js → project-repositories-CSnfzUpg.js} +1 -1
- package/client/dist/assets/settings-3o4Ntzi5.js +1 -0
- package/client/dist/assets/settings-B97jlkwD.js +1 -0
- package/client/dist/assets/settings-BTaT_bsS.js +1 -0
- package/client/dist/assets/settings-CT8w7WiC.js +1 -0
- package/client/dist/assets/settings-Cvr8_tvh.js +1 -0
- package/client/dist/assets/settings-Dn1qgAC8.js +1 -0
- package/client/dist/assets/settings-EShDdg4J.js +1 -0
- package/client/dist/assets/settings-tfLhQZRN.js +1 -0
- package/client/dist/assets/{setup-Dwzt5nO1.js → setup-CBMu3tqH.js} +1 -1
- package/client/dist/assets/{setup-B5FHuxvB.js → setup-CPh-e6J2.js} +1 -1
- package/client/dist/assets/{setup-DpqzaEEA.js → setup-CRKLp_ke.js} +1 -1
- package/client/dist/assets/{setup-CROyqD5N.js → setup-Cy302v4J.js} +1 -1
- package/client/dist/assets/{setup-C9Fy9PKQ.js → setup-D681vTPf.js} +1 -1
- package/client/dist/assets/{setup-BihzXadx.js → setup-DYK0VBkE.js} +1 -1
- package/client/dist/assets/{setup-BtC6Hg4K.js → setup-KAuiIiVs.js} +1 -1
- package/client/dist/assets/{setup-zLEDnG7N.js → setup-OGX-oCfI.js} +1 -1
- package/client/dist/assets/{spending-T5GM7wpn.js → spending-HBSk-6jv.js} +1 -1
- package/client/dist/assets/{useDesktop-QogiN0zR.js → useDesktop-0unHDBJJ.js} +1 -1
- package/client/dist/assets/useRuntimeRuns-BN1rhyEm.js +1 -0
- package/client/dist/assets/{useSharedWebSocket-Dz-HI6De.js → useSharedWebSocket-BZMrX4jr.js} +2 -2
- package/client/dist/index.html +25 -25
- package/docs/agent-live-steering.md +16 -0
- package/docs/cli.md +7 -7
- package/docs/codex.md +2 -2
- package/docs/customizing.md +1 -1
- package/docs/gemini.md +1 -1
- package/docs/getting-started.md +1 -1
- package/docs/guide/de/integrations/7-local-engines.md +1 -1
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +8 -6
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +11 -2
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/de/pipeline/5-the-loop-builder.md +24 -5
- package/docs/guide/en/integrations/7-local-engines.md +1 -1
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +8 -6
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +11 -2
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/en/pipeline/5-the-loop-builder.md +34 -5
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +1 -1
- package/docs/guide/es/integrations/7-local-engines.md +1 -1
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +8 -6
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +11 -2
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/es/pipeline/5-the-loop-builder.md +30 -5
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +1 -2
- package/docs/guide/fr/integrations/7-local-engines.md +1 -1
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +8 -6
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +11 -2
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +24 -5
- package/docs/guide/it/integrations/7-local-engines.md +1 -1
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +8 -6
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +11 -2
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/it/pipeline/5-the-loop-builder.md +24 -5
- package/docs/guide/ja/integrations/7-local-engines.md +1 -1
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +8 -6
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +11 -2
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +24 -5
- package/docs/guide/pt/integrations/7-local-engines.md +1 -1
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +8 -6
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +11 -2
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +24 -5
- package/docs/guide/zh/integrations/7-local-engines.md +1 -1
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +8 -6
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +11 -2
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +2 -2
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +24 -5
- package/docs/internals/api-reference.md +2 -2
- package/docs/internals/ci-performance.md +71 -0
- package/docs/internals/companion-rails-as-loops-contract.md +4 -3
- package/docs/internals/configuration.md +3 -3
- package/docs/internals/core-runtime-updates.md +3 -2
- package/docs/internals/interactive-jobs.md +2 -2
- package/docs/internals/loop-step-log-explorer.md +42 -0
- package/docs/internals/mission-rail-cards.md +1 -1
- package/docs/internals/operations-runbook.md +22 -0
- package/docs/internals/programmatic-agent-runtime.md +130 -7
- package/docs/internals/project-builder.md +35 -16
- package/docs/internals/source-map.md +48 -2
- package/docs/kimi.md +2 -2
- package/docs/local-providers.md +1 -1
- package/docs/running-pipelines.md +26 -18
- package/docs/tracking-cost.md +10 -1
- package/package.json +2 -1
- package/server/dist/core-compat.js +8 -3
- package/server/dist/core-execution.js +49 -3
- package/server/dist/db/migrations.js +101 -0
- package/server/dist/desktop-db.js +28 -0
- package/server/dist/desktop-router.js +2 -0
- package/server/dist/mcp/guide.js +6 -3
- package/server/dist/mcp/tools/jobs.js +14 -1
- package/server/dist/mcp/tools/loops.js +17 -8
- package/server/dist/mcp/tools/rails.js +3 -3
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-bridge.js +313 -9
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls-router.js +34 -1
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-controls.js +203 -21
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-effective-config.js +46 -1
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-engines.js +10 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-loader.js +68 -3
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-metrics.js +16 -8
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-package-gc.js +81 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-package-lock.js +37 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-package.js +30 -24
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-retention-host.js +87 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-retention-quarantine.js +231 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-retention-records.js +32 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-retention.js +102 -0
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings-router.js +12 -7
- package/server/dist/modules/agent-runtime/runtime/agent-runtime-settings.js +57 -13
- package/server/dist/modules/agents/runtime/agent-catalog.js +32 -0
- package/server/dist/modules/agents/runtime/agent-refine-manager.js +12 -0
- package/server/dist/modules/agents/runtime/agent-role-descriptor.js +64 -0
- package/server/dist/modules/agents/runtime/profiles-router.js +26 -34
- package/server/dist/modules/builder/runtime/milestone-chain.js +121 -73
- package/server/dist/modules/delivery/runtime/definition-fork.js +158 -0
- package/server/dist/modules/delivery/runtime/delivery-evidence.js +56 -10
- package/server/dist/modules/delivery/runtime/isolated-settlement-reconstruction.js +99 -0
- package/server/dist/modules/delivery/runtime/isolated-settlement-store.js +53 -0
- package/server/dist/modules/delivery/runtime/multi-repo-execution-store.js +3 -1
- package/server/dist/modules/delivery/runtime/rail-isolated-launch.js +388 -203
- package/server/dist/modules/delivery/runtime/rail-launch-parser.js +3 -2
- package/server/dist/modules/delivery/runtime/rail-pr-store.js +6 -1
- package/server/dist/modules/delivery/runtime/rails-router.js +66 -10
- package/server/dist/modules/execution/runtime/queue-manager.js +11 -2
- package/server/dist/modules/loops/runtime/builtin-loops.js +70 -0
- package/server/dist/modules/loops/runtime/definition-cancellation.js +31 -0
- package/server/dist/modules/loops/runtime/legacy-launch-telemetry.js +78 -0
- package/server/dist/modules/loops/runtime/loop-command-catalog.js +13 -12
- package/server/dist/modules/loops/runtime/loop-compat.js +219 -0
- package/server/dist/modules/loops/runtime/loop-core-factory.js +42 -0
- package/server/dist/modules/loops/runtime/loop-definition-controls.js +48 -0
- package/server/dist/modules/loops/runtime/loop-definition-events.js +145 -0
- package/server/dist/modules/loops/runtime/loop-definition-recovery.js +106 -0
- package/server/dist/modules/loops/runtime/loop-definition-run.js +36 -0
- package/server/dist/modules/loops/runtime/loop-definition.js +246 -0
- package/server/dist/modules/loops/runtime/loop-effect.js +10 -1
- package/server/dist/modules/loops/runtime/loop-executors.js +63 -3
- package/server/dist/modules/loops/runtime/loop-factory.js +35 -15
- package/server/dist/modules/loops/runtime/loop-graph.js +84 -8
- package/server/dist/modules/loops/runtime/loop-migration.js +36 -0
- package/server/dist/modules/loops/runtime/loop-preview.js +10 -0
- package/server/dist/modules/loops/runtime/loop-run-manager.js +206 -13
- package/server/dist/modules/loops/runtime/loop-runs-store.js +271 -7
- package/server/dist/modules/loops/runtime/loop-templates.js +205 -45
- package/server/dist/modules/loops/runtime/loops-router.js +246 -29
- package/server/dist/modules/loops/runtime/loops-store.js +140 -20
- package/server/dist/modules/missions/runtime/agent-operator-prompt.js +14 -11
- package/server/dist/modules/specs/runtime/spec-addenda.js +28 -0
- package/server/dist/project-registry.js +87 -51
- package/server/dist/project-router-jobs.js +17 -6
- package/server/dist/project-router-loop-runs.js +200 -0
- package/server/dist/project-router-spending.js +17 -0
- package/server/dist/project-router.js +8 -6
- package/server/dist/schemas/agent-runtime.schema.json +93 -1
- package/server/dist/schemas/workflow-definition.schema.json +312 -0
- package/server/dist/vitest-setup.js +22 -0
- package/server/dist/worktree-overlay.js +1 -1
- package/client/dist/assets/AgentsPage-DfHWgP_x.js +0 -87
- package/client/dist/assets/DesktopAnalyticsPage-tc0p4jJW.js +0 -1
- package/client/dist/assets/InteractiveJobComposer-DFPpdg2D.js +0 -19
- package/client/dist/assets/JobDetailModal-BdOv-l-M.js +0 -1
- package/client/dist/assets/LoopBuilderPage-BemvUOxy.js +0 -7
- package/client/dist/assets/LoopPreviewModal-C6hNAeYN.js +0 -1
- package/client/dist/assets/LoopsPage-BZr0quvh.js +0 -1
- package/client/dist/assets/TemplatePreviewModal-Cejcquah.js +0 -1
- package/client/dist/assets/agentRuntime-BUimiX__.js +0 -1
- package/client/dist/assets/agentRuntime-BcN97sAB.js +0 -1
- package/client/dist/assets/agentRuntime-Ckyg-ahT.js +0 -1
- package/client/dist/assets/agentRuntime-DJCwyX4t.js +0 -1
- package/client/dist/assets/agentRuntime-DVzPJOl0.js +0 -1
- package/client/dist/assets/agentRuntime-V9AZTG3c.js +0 -1
- package/client/dist/assets/agentRuntime-bAAjw1vw.js +0 -1
- package/client/dist/assets/agentRuntime-v4qKAYH-.js +0 -1
- package/client/dist/assets/agentstudio-BNUth0uj.js +0 -1
- package/client/dist/assets/agentstudio-BNdB5hkr.js +0 -1
- package/client/dist/assets/agentstudio-C7-bt8FO.js +0 -1
- package/client/dist/assets/agentstudio-C8uNchpV.js +0 -1
- package/client/dist/assets/agentstudio-CKabyMlg.js +0 -1
- package/client/dist/assets/agentstudio-CN2pokQu.js +0 -1
- package/client/dist/assets/agentstudio-y2dVDXeM.js +0 -1
- package/client/dist/assets/analytics-BlypLLR6.js +0 -1
- package/client/dist/assets/builder-765NeYTp.js +0 -1
- package/client/dist/assets/builder-8MG3V6ea.js +0 -1
- package/client/dist/assets/builder-B-1UBs5K.js +0 -1
- package/client/dist/assets/builder-BTiGnPT0.js +0 -1
- package/client/dist/assets/builder-Cx9Rz-7u.js +0 -1
- package/client/dist/assets/builder-DKFMELBl.js +0 -1
- package/client/dist/assets/builder-OcmKrC0h.js +0 -1
- package/client/dist/assets/builder-P9qVBXFZ.js +0 -1
- package/client/dist/assets/common-B5AZNYMH.js +0 -1
- package/client/dist/assets/common-BFZ0c_vN.js +0 -1
- package/client/dist/assets/common-BttQx3z4.js +0 -1
- package/client/dist/assets/common-CM65k_-e.js +0 -1
- package/client/dist/assets/common-D4mvFFlu.js +0 -1
- package/client/dist/assets/common-TZ9Ny96S.js +0 -1
- package/client/dist/assets/common-nFpSF4GC.js +0 -1
- package/client/dist/assets/dashboard-B9uWNGO2.js +0 -1
- package/client/dist/assets/dashboard-BIwmO9wc.js +0 -1
- package/client/dist/assets/dashboard-BV4vOZkR.js +0 -1
- package/client/dist/assets/dashboard-Bf6MPVsM.js +0 -1
- package/client/dist/assets/dashboard-C8klWVvZ.js +0 -1
- package/client/dist/assets/dashboard-D1ORhPF0.js +0 -1
- package/client/dist/assets/dashboard-DSubvs9x.js +0 -1
- package/client/dist/assets/dashboard-px_vlRx_.js +0 -1
- package/client/dist/assets/index-C51x61Bz.css +0 -2
- package/client/dist/assets/loops-B7YpGizO.js +0 -1
- package/client/dist/assets/loops-BomD2J-h.js +0 -1
- package/client/dist/assets/loops-BrQHSQw3.js +0 -1
- package/client/dist/assets/loops-BvBwvTPA.js +0 -1
- package/client/dist/assets/loops-CODk6Slz.js +0 -1
- package/client/dist/assets/loops-DC6k-Ym-.js +0 -1
- package/client/dist/assets/loops-DSEg8-uY.js +0 -1
- package/client/dist/assets/loops-DhCoXD_v.js +0 -1
- package/client/dist/assets/settings-BsehKpty.js +0 -1
- package/client/dist/assets/settings-CQWob3SB.js +0 -1
- package/client/dist/assets/settings-CgCl0hzy.js +0 -1
- package/client/dist/assets/settings-DLRLd22L.js +0 -1
- package/client/dist/assets/settings-Dn5prAFl.js +0 -1
- package/client/dist/assets/settings-HZSu-K4l.js +0 -1
- package/client/dist/assets/settings-p4OVIyRh.js +0 -1
- package/client/dist/assets/settings-rddaldUp.js +0 -1
- package/client/dist/assets/useRuntimeRuns-Dqmz9fS9.js +0 -1
- package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +0 -84
- package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +0 -126
- package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +0 -114
- package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +0 -84
- package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +0 -84
- package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +0 -84
- package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +0 -84
- package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +0 -84
- package/server/dist/modules/loops/runtime/loop-templates-ported.js +0 -675
- /package/client/dist/assets/{LoopBuilderPage-DtxX27Jz.css → loop-layout-DtxX27Jz.css} +0 -0
package/client/dist/index.html
CHANGED
|
@@ -204,7 +204,7 @@
|
|
|
204
204
|
.specrails-splash__mark .pill { opacity: 1; }
|
|
205
205
|
}
|
|
206
206
|
</style>
|
|
207
|
-
<script type="module" crossorigin src="/assets/index-
|
|
207
|
+
<script type="module" crossorigin src="/assets/index-C4Mv6tV6.js"></script>
|
|
208
208
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-CNC7AqOf.js">
|
|
209
209
|
<link rel="modulepreload" crossorigin href="/assets/jsx-runtime-zu2_FqZY.js">
|
|
210
210
|
<link rel="modulepreload" crossorigin href="/assets/react-dom-DiWzBDP9.js">
|
|
@@ -213,43 +213,43 @@
|
|
|
213
213
|
<link rel="modulepreload" crossorigin href="/assets/activity-DiyjsgQV.js">
|
|
214
214
|
<link rel="modulepreload" crossorigin href="/assets/addspec-BOvgmcgk.js">
|
|
215
215
|
<link rel="modulepreload" crossorigin href="/assets/agent-aiVhqFW1.js">
|
|
216
|
-
<link rel="modulepreload" crossorigin href="/assets/agentRuntime-
|
|
216
|
+
<link rel="modulepreload" crossorigin href="/assets/agentRuntime-BeUb3g9g.js">
|
|
217
217
|
<link rel="modulepreload" crossorigin href="/assets/agents-CTwbx-fb.js">
|
|
218
|
-
<link rel="modulepreload" crossorigin href="/assets/agentstudio-
|
|
218
|
+
<link rel="modulepreload" crossorigin href="/assets/agentstudio-BWAKeGgB.js">
|
|
219
219
|
<link rel="modulepreload" crossorigin href="/assets/aiedit-iIjz2_Qk.js">
|
|
220
|
-
<link rel="modulepreload" crossorigin href="/assets/analytics-
|
|
220
|
+
<link rel="modulepreload" crossorigin href="/assets/analytics-BWynXPEm.js">
|
|
221
221
|
<link rel="modulepreload" crossorigin href="/assets/attachments-B53PG733.js">
|
|
222
222
|
<link rel="modulepreload" crossorigin href="/assets/browser-CG0PE1j_.js">
|
|
223
|
-
<link rel="modulepreload" crossorigin href="/assets/builder-
|
|
223
|
+
<link rel="modulepreload" crossorigin href="/assets/builder-CzW5ovyI.js">
|
|
224
224
|
<link rel="modulepreload" crossorigin href="/assets/chat-BGD7MXAy.js">
|
|
225
225
|
<link rel="modulepreload" crossorigin href="/assets/code-DaZ-ZwCT.js">
|
|
226
226
|
<link rel="modulepreload" crossorigin href="/assets/commands-BAWSYHjQ.js">
|
|
227
|
-
<link rel="modulepreload" crossorigin href="/assets/common-
|
|
228
|
-
<link rel="modulepreload" crossorigin href="/assets/dashboard-
|
|
227
|
+
<link rel="modulepreload" crossorigin href="/assets/common-DmsclwjP.js">
|
|
228
|
+
<link rel="modulepreload" crossorigin href="/assets/dashboard-XGdQ5mjw.js">
|
|
229
229
|
<link rel="modulepreload" crossorigin href="/assets/explore-DgBACn39.js">
|
|
230
230
|
<link rel="modulepreload" crossorigin href="/assets/integrations-mB-7zoyT.js">
|
|
231
231
|
<link rel="modulepreload" crossorigin href="/assets/jira-CKJg3HZd.js">
|
|
232
|
-
<link rel="modulepreload" crossorigin href="/assets/jobs-
|
|
233
|
-
<link rel="modulepreload" crossorigin href="/assets/loops-
|
|
232
|
+
<link rel="modulepreload" crossorigin href="/assets/jobs-KG4Sn12X.js">
|
|
233
|
+
<link rel="modulepreload" crossorigin href="/assets/loops-B4_D-nbg.js">
|
|
234
234
|
<link rel="modulepreload" crossorigin href="/assets/mcp-CUAN6ORK.js">
|
|
235
235
|
<link rel="modulepreload" crossorigin href="/assets/narration-n3hOA7LY.js">
|
|
236
236
|
<link rel="modulepreload" crossorigin href="/assets/nav-DhPb-Isc.js">
|
|
237
237
|
<link rel="modulepreload" crossorigin href="/assets/packet-B0H15elv.js">
|
|
238
|
-
<link rel="modulepreload" crossorigin href="/assets/settings-
|
|
239
|
-
<link rel="modulepreload" crossorigin href="/assets/setup-
|
|
238
|
+
<link rel="modulepreload" crossorigin href="/assets/settings-tfLhQZRN.js">
|
|
239
|
+
<link rel="modulepreload" crossorigin href="/assets/setup-CRKLp_ke.js">
|
|
240
240
|
<link rel="modulepreload" crossorigin href="/assets/specs-DfIdoU5L.js">
|
|
241
241
|
<link rel="modulepreload" crossorigin href="/assets/terminal-BAzpHtpY.js">
|
|
242
242
|
<link rel="modulepreload" crossorigin href="/assets/tickets-D41ZMQpf.js">
|
|
243
243
|
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-Bjbbp_KS.js">
|
|
244
|
-
<link rel="modulepreload" crossorigin href="/assets/useSharedWebSocket-
|
|
245
|
-
<link rel="modulepreload" crossorigin href="/assets/Trans-
|
|
246
|
-
<link rel="modulepreload" crossorigin href="/assets/useDesktop-
|
|
244
|
+
<link rel="modulepreload" crossorigin href="/assets/useSharedWebSocket-BZMrX4jr.js">
|
|
245
|
+
<link rel="modulepreload" crossorigin href="/assets/Trans-D3AfDylf.js">
|
|
246
|
+
<link rel="modulepreload" crossorigin href="/assets/useDesktop-0unHDBJJ.js">
|
|
247
247
|
<link rel="modulepreload" crossorigin href="/assets/provider-capabilities-Vi1ZGvAK.js">
|
|
248
248
|
<link rel="modulepreload" crossorigin href="/assets/save-B6wGWwBR.js">
|
|
249
|
-
<link rel="modulepreload" crossorigin href="/assets/spending-
|
|
249
|
+
<link rel="modulepreload" crossorigin href="/assets/spending-HBSk-6jv.js">
|
|
250
250
|
<link rel="modulepreload" crossorigin href="/assets/sparkles-DrY8hb0X.js">
|
|
251
251
|
<link rel="modulepreload" crossorigin href="/assets/x-CBMI9ejn.js">
|
|
252
|
-
<link rel="modulepreload" crossorigin href="/assets/MinimizedChatsContext-
|
|
252
|
+
<link rel="modulepreload" crossorigin href="/assets/MinimizedChatsContext-CNx_0bZu.js">
|
|
253
253
|
<link rel="modulepreload" crossorigin href="/assets/zap-CUOlvtT1.js">
|
|
254
254
|
<link rel="modulepreload" crossorigin href="/assets/circle-x-CMYsN4ZH.js">
|
|
255
255
|
<link rel="modulepreload" crossorigin href="/assets/download-CFHyyHcw.js">
|
|
@@ -269,18 +269,18 @@
|
|
|
269
269
|
<link rel="modulepreload" crossorigin href="/assets/utils-BC4DHlz2.js">
|
|
270
270
|
<link rel="modulepreload" crossorigin href="/assets/dialog-xXB2q5HJ.js">
|
|
271
271
|
<link rel="modulepreload" crossorigin href="/assets/lib-CGdyxIWg.js">
|
|
272
|
-
<link rel="modulepreload" crossorigin href="/assets/getTimezoneOffsetInMilliseconds-
|
|
273
|
-
<link rel="modulepreload" crossorigin href="/assets/formatDistanceToNow-
|
|
272
|
+
<link rel="modulepreload" crossorigin href="/assets/getTimezoneOffsetInMilliseconds-DOGj1Mfz.js">
|
|
273
|
+
<link rel="modulepreload" crossorigin href="/assets/formatDistanceToNow-aBss1Nai.js">
|
|
274
274
|
<link rel="modulepreload" crossorigin href="/assets/button-Ccc9Dc-D.js">
|
|
275
|
-
<link rel="modulepreload" crossorigin href="/assets/jira-api-
|
|
276
|
-
<link rel="modulepreload" crossorigin href="/assets/project-repositories-
|
|
277
|
-
<link rel="modulepreload" crossorigin href="/assets/RepositoryScopeSelector-
|
|
278
|
-
<link rel="modulepreload" crossorigin href="/assets/TicketDetailModalContext-
|
|
275
|
+
<link rel="modulepreload" crossorigin href="/assets/jira-api-BYbEPlkr.js">
|
|
276
|
+
<link rel="modulepreload" crossorigin href="/assets/project-repositories-CSnfzUpg.js">
|
|
277
|
+
<link rel="modulepreload" crossorigin href="/assets/RepositoryScopeSelector-C2mvWBQ6.js">
|
|
278
|
+
<link rel="modulepreload" crossorigin href="/assets/TicketDetailModalContext-B-DySpKL.js">
|
|
279
279
|
<link rel="modulepreload" crossorigin href="/assets/core-B3mKBIh5.js">
|
|
280
|
-
<link rel="modulepreload" crossorigin href="/assets/RepositoryDeliveries-
|
|
281
|
-
<link rel="modulepreload" crossorigin href="/assets/useRuntimeRuns-
|
|
280
|
+
<link rel="modulepreload" crossorigin href="/assets/RepositoryDeliveries-BiwJuS8r.js">
|
|
281
|
+
<link rel="modulepreload" crossorigin href="/assets/useRuntimeRuns-BN1rhyEm.js">
|
|
282
282
|
<link rel="modulepreload" crossorigin href="/assets/event-Bt7f3wXe.js">
|
|
283
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
283
|
+
<link rel="stylesheet" crossorigin href="/assets/index-BS7KCWkV.css">
|
|
284
284
|
</head>
|
|
285
285
|
<body>
|
|
286
286
|
<div id="specrails-splash" aria-hidden="false" role="status" aria-label="Loading Specrails">
|
|
@@ -55,3 +55,19 @@ Cada invocación, incluido un reintento por sesión caducada, recibe una capabil
|
|
|
55
55
|
- [Codex app-server](https://learn.chatgpt.com/docs/app-server), contrastado con el esquema generado por Codex 0.153.4.
|
|
56
56
|
- [Gemini model steering](https://geminicli.com/docs/cli/model-steering/) y ACP instalado 0.49.0: la capacidad interactiva no equivale a entrada sin interrupción en su transporte ACP.
|
|
57
57
|
- [Kimi Server API](https://www.kimi.com/code/docs/en/kimi-code-cli/reference/server-api.html): transporte distinto del modo print utilizado actualmente.
|
|
58
|
+
|
|
59
|
+
## Definition engine runs
|
|
60
|
+
|
|
61
|
+
For engine v2, POST `/api/projects/:projectId/agent-runtime/runs/:runId/steer` with `{text, requestId}`. Use a stable request id for transport retries; changing its text is a conflict. Text must contain 1–20,000 characters. Desktop sends it over stdin to the run's retained Core package and original frozen context. The endpoint returns HTTP 202 with `{id, acceptedAt}` after Core commits its inbox transaction.
|
|
62
|
+
|
|
63
|
+
Acceptance does not mean the agent has read the instruction. The next eligible AI attempt consumes it. Runtime status exposes bounded steering receipts with pending/consumed status, consuming attempt and timestamp. The counts cover the whole inbox; at most 512 receipts and 240-character previews are returned. Older retained runtimes may lack this reporting and cannot confirm consumption. Terminal runs reject new controls.
|
|
64
|
+
|
|
65
|
+
The MCP `specrails_jobs` action `runtime_steer` takes `jobId`, `steeringText` and `requestId`; it is a write operation. Inspect `runtime_runs` for consumption. Steering does not replace frozen requirements or grant broader repository permissions.
|
|
66
|
+
|
|
67
|
+
Job details and Settings → Saved executions expose the same instruction inbox.
|
|
68
|
+
The composer preserves its request identity after a failed or lost response;
|
|
69
|
+
editing the text starts a new message. An acceptance receipt remains labelled
|
|
70
|
+
pending until Core reports the consuming attempt. Project switches discard the
|
|
71
|
+
draft and ignore late responses from the previous project. Questions and
|
|
72
|
+
approvals keep their separate explicit actions. All eight interface locales
|
|
73
|
+
include the inbox labels.
|
package/docs/cli.md
CHANGED
|
@@ -98,13 +98,14 @@ specrails-desktop implement "#42"
|
|
|
98
98
|
|
|
99
99
|
This is shorthand for `specrails-desktop /specrails:implement "#42"` — the app queues a rail job that you can monitor in the Dashboard. Token usage and cost are tracked in Analytics.
|
|
100
100
|
|
|
101
|
-
### Implement
|
|
101
|
+
### Implement several specs
|
|
102
102
|
|
|
103
103
|
```bash
|
|
104
|
-
specrails-desktop
|
|
104
|
+
specrails-desktop implement "#40" "#41" "#43"
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
`implement` accepts several specs and runs them in one aggregate job. The old
|
|
108
|
+
`batch-implement` verb was removed; typing it still works and runs `implement`.
|
|
108
109
|
|
|
109
110
|
### Health check
|
|
110
111
|
|
|
@@ -128,8 +129,7 @@ These are all shorthand for `/specrails:<verb>` — the app auto-prefixes:
|
|
|
128
129
|
|
|
129
130
|
| Verb | What it does |
|
|
130
131
|
|------|--------------|
|
|
131
|
-
| `implement` | Queue a rail job for one
|
|
132
|
-
| `batch-implement` | Queue one job that implements many specs |
|
|
132
|
+
| `implement` | Queue a rail job for one or more specs (one aggregate run) |
|
|
133
133
|
| `why` | Explain why a chunk of code looks the way it does |
|
|
134
134
|
| `propose-spec` | Explore an idea and produce a structured spec proposal |
|
|
135
135
|
| `get-backlog-specs` | View the prioritised spec backlog |
|
|
@@ -155,7 +155,7 @@ The app still tracks cost in Analytics under `surface=job`.
|
|
|
155
155
|
|
|
156
156
|
```bash
|
|
157
157
|
specrails-desktop --project my-app implement "#42"
|
|
158
|
-
specrails-desktop --project ~/repos/api-srv
|
|
158
|
+
specrails-desktop --project ~/repos/api-srv implement "#5" "#6"
|
|
159
159
|
```
|
|
160
160
|
|
|
161
161
|
`--project` accepts a project **name** or a **path** (absolute, or relative starting with `.` / `..`). Use it when you want to launch work in a project from outside its directory (e.g. from a CI runner or your home directory). Both `--project` and `--port` may appear **anywhere** in the command, not just at the front.
|
|
@@ -197,7 +197,7 @@ specrails-desktop /opsx:archive # archive to openspec/changes/archive/
|
|
|
197
197
|
|
|
198
198
|
## When the app isn't running
|
|
199
199
|
|
|
200
|
-
If you invoke a command that routes work (`implement`,
|
|
200
|
+
If you invoke a command that routes work (`implement`, a raw prompt, …) while the app is not running, the CLI falls back to spawning the **`claude`** binary directly in the current directory. You'll see:
|
|
201
201
|
|
|
202
202
|
```
|
|
203
203
|
[specrails-desktop] manager not running — invoking claude directly
|
package/docs/codex.md
CHANGED
|
@@ -54,7 +54,7 @@ binary isn't on `PATH`; it shows install commands if you click "More info".
|
|
|
54
54
|
- `.codex/config.toml` — model, reasoning effort, sandbox mode, and
|
|
55
55
|
approval policy (all top-level keys per the codex 0.128.0+ schema).
|
|
56
56
|
- `.codex/skills/sr-*/SKILL.md` — general specrails skills
|
|
57
|
-
(implement,
|
|
57
|
+
(implement, why, compat-check, …).
|
|
58
58
|
- `.codex/skills/rails/sr-*/SKILL.md` — the pipeline rails.
|
|
59
59
|
- `AGENTS.md` — top-level instructions file with a sentinel-protected
|
|
60
60
|
managed block. Anything outside the sentinels is preserved on
|
|
@@ -126,7 +126,7 @@ The table below includes all four registered providers. See the
|
|
|
126
126
|
| **Reasoning efforts** | `low`–`xhigh` | model-dependent | none | `low`/`high`/`max`, K3 only |
|
|
127
127
|
| **Agent format** | `.claude/agents/<id>.md` | `.codex/skills/<id>/SKILL.md` | `.gemini/` target | `.kimi-code/skills/<id>/SKILL.md` |
|
|
128
128
|
| **Agent profiles** | ✅ | legacy | legacy | ✅ provider-scoped |
|
|
129
|
-
| **Implement
|
|
129
|
+
| **Implement** | ✅ | ✅ | ✅ | ✅ |
|
|
130
130
|
| **Freestyle** | ✅ | ❌ | ❌ | ✅ |
|
|
131
131
|
| **Pure-output transforms** | capability-dependent | capability-dependent | capability-dependent | ❌ fail closed |
|
|
132
132
|
| **MCP registration** | `.mcp.json` | isolated `CODEX_HOME` | `.gemini/settings.json` | `.kimi-code/mcp.json` |
|
package/docs/customizing.md
CHANGED
|
@@ -63,7 +63,7 @@ The daily counter is the sum of completed-job cost since midnight, so it resets
|
|
|
63
63
|
|
|
64
64
|
### Rail pre-prompt
|
|
65
65
|
|
|
66
|
-
A custom instruction appended to every **Implement**
|
|
66
|
+
A custom instruction appended to every **Implement** rail job, after the ticket context and before execution. Use it for stable project guidance that should accompany every rail run (e.g. "keep migrations backward compatible, add tests for every change"). Leave it blank for none.
|
|
67
67
|
|
|
68
68
|
### Freestyle pre-prompt
|
|
69
69
|
|
package/docs/gemini.md
CHANGED
|
@@ -15,7 +15,7 @@ Specrails supports **four AI providers**: Anthropic's
|
|
|
15
15
|
|
|
16
16
|
**What works with Gemini:** Explore Spec, Quick spec, AI Edit, the terminal
|
|
17
17
|
"Open AI CLI" launcher, cost analytics, **and the full rails pipeline**
|
|
18
|
-
(`/specrails:implement
|
|
18
|
+
(`/specrails:implement`). Gemini does not advertise
|
|
19
19
|
**Freestyle rails**; choose Claude or Kimi for that autonomous rail mode.
|
|
20
20
|
|
|
21
21
|
## Prerequisites
|
package/docs/getting-started.md
CHANGED
|
@@ -103,7 +103,7 @@ The committed spec lands on your board with status `todo`.
|
|
|
103
103
|
The right pane of the Dashboard is your **Rails** — execution lanes:
|
|
104
104
|
|
|
105
105
|
1. Drag a spec card from the left pane onto a Rail.
|
|
106
|
-
2. Pick a **Loop** in the rail header — start with the built-in **Implement** (the full pipeline). You can also pick **
|
|
106
|
+
2. Pick a **Loop** in the rail header — start with the built-in **Implement** (the full pipeline). You can also pick **Freestyle**, **SDD Quick (OpenSpec)**, or a custom loop you built in the **Loops** section. See [Running pipelines → Loops](running-pipelines.md#loops).
|
|
107
107
|
3. (Optional) pick an **agent profile** from the rail header. This picker only appears once the project has profiles (create them on the **Agents** page); otherwise the rail runs in legacy mode (single orchestrator, no per-agent overrides).
|
|
108
108
|
4. Press **▶ Play** on the rail.
|
|
109
109
|
|
|
@@ -15,7 +15,7 @@ Jede Verbindung hat außerdem die Einstellung **Agenten-Schleife**. **Kompakt**
|
|
|
15
15
|
|
|
16
16
|
## Was du bekommst
|
|
17
17
|
|
|
18
|
-
- Rails (implement,
|
|
18
|
+
- Rails (implement, freestyle, eigene Loops), Explore und Quick-Specs, Chat und Missionen laufen auf dem lokalen Modell.
|
|
19
19
|
- Missionen behalten ihre Specrails-Tools und deine externen MCP-Server.
|
|
20
20
|
- Sitzungen werden über Turns hinweg fortgesetzt; interaktive Jobs funktionieren.
|
|
21
21
|
- Kosten sind ehrlich: Tokens werden erfasst, die Kosten bleiben *unbekannt*, sofern du keine Tarife einträgst (dann als *geschätzt* markiert).
|
|
@@ -18,12 +18,12 @@ SpecsBoard (links) Rails (rechts)
|
|
|
18
18
|
|
|
19
19
|
Eine Rail ist eine **Ausführungsspur**. Du ziehst eine Spec-Karte vom SpecsBoard auf eine Rail und drückst dann **▶ Play**. In Git-Repositories startet die Rail die Pipeline in einem isolierten Git-Worktree, damit die KI Dateien bearbeiten und Tests ausführen kann, ohne deinen aktiven Arbeitsbaum zu berühren. Ist das Projekt noch kein Git-Repo, degradiert Specrails klar sichtbar zur Ausführung im gemeinsamen Ordner und sagt dir, dass keine Branch- oder PR-Karte erscheinen wird.
|
|
20
20
|
|
|
21
|
-
Du kannst mehrere rails anlegen, um deine Arbeit in benannten Spuren zu organisieren (eine für das Feature, an dem du gerade dran bist, eine weitere, die dahinter wartet). Rails sind **dynamisch**: Der **+ Hinzufügen**-Button im Rails-Header erstellt eine neue Spur (bis zu 12 pro Projekt), und leere, inaktive Spuren lassen sich löschen. Jede rail ist server-gestützt — dein Spuren-Set übersteht Reloads und ist für den mobilen Companion und den eingebauten Agenten sichtbar; der Agent kann sogar selbst eine rail anlegen, wenn alle Spuren belegt sind.
|
|
21
|
+
Du kannst mehrere rails anlegen, um deine Arbeit in benannten Spuren zu organisieren (eine für das Feature, an dem du gerade dran bist, eine weitere, die dahinter wartet). Rails sind **dynamisch**: Der **+ Hinzufügen**-Button im Rails-Header erstellt eine neue Spur (bis zu 12 pro Projekt), und leere, inaktive Spuren lassen sich löschen. Jede rail ist server-gestützt — dein Spuren-Set übersteht Reloads und ist für den mobilen Companion und den eingebauten Agenten sichtbar; der Agent kann sogar selbst eine rail anlegen, wenn alle Spuren belegt sind.
|
|
22
22
|
|
|
23
23
|
## Eine Rail auf einer Spec starten
|
|
24
24
|
|
|
25
25
|
1. **Zieh eine Spec-Karte** vom SpecsBoard auf eine rail. Die ID der Spec taucht in der Spec-Liste der rail auf. (Du ziehst lieber nicht? Nutze das **Move to rail**-Popover auf der Spec-Karte — es zeigt pro rail einen Status-Punkt, damit du keine Arbeit auf eine belegte Spur ablegst.)
|
|
26
|
-
2. **Wähle einen Loop** im rail-Header. Eine rail führt einen **Loop** aus — das ist die Arbeit, die sie erledigt. Standard ist der eingebaute `Implement`-Loop; du kannst auch `
|
|
26
|
+
2. **Wähle einen Loop** im rail-Header. Eine rail führt einen **Loop** aus — das ist die Arbeit, die sie erledigt. Standard ist der eingebaute `Implement`-Loop; du kannst auch `Freestyle` oder einen selbst gebauten Loop wählen. Siehe [Der Loop Builder](the-loop-builder).
|
|
27
27
|
3. **Drück ▶ Play.**
|
|
28
28
|
|
|
29
29
|
Das war's. Die rail startet einen KI-CLI-Prozess im richtigen Ausführungskontext und legt mit der Pipeline los.
|
|
@@ -34,25 +34,28 @@ Das war's. Die rail startet einen KI-CLI-Prozess im richtigen Ausführungskontex
|
|
|
34
34
|
|---------|--------------|
|
|
35
35
|
| **Status-Pill** | `idle`, `running` oder `failed`. Es gibt kein eigenes „completed“ — eine rail kehrt auf `idle` zurück, wenn ihr Job sauber durchläuft. |
|
|
36
36
|
| **Spec-Liste** | Die IDs, die dieser rail zugewiesen sind. Zieh weitere hinein oder heraus, um sie wieder zu lösen. |
|
|
37
|
-
| **Loop-Auswahl** | Der Loop, den diese rail ausführt — ein eingebauter (`Implement` / `
|
|
37
|
+
| **Loop-Auswahl** | Der Loop, den diese rail ausführt — ein eingebauter (`Implement` / `Freestyle` / `SDD Quick (OpenSpec)`) oder ein eigener Loop. Siehe Tabelle unten. Pro rail gespeichert. |
|
|
38
38
|
| **Profil-Auswahl** | Welches Provider-Profil läuft (Claude- und Kimi-Rails). |
|
|
39
39
|
| **Engine-Auswahl** | Welcher Provider die Rail ausführt — Claude, Codex, Gemini oder Kimi. |
|
|
40
40
|
| **▶ Play / ■ Stop** | Starten oder abbrechen. |
|
|
41
41
|
|
|
42
42
|
### Was eine rail ausführt: Loops
|
|
43
43
|
|
|
44
|
-
Eine rail führt einen **Loop** aus — das Rezept für die Arbeit.
|
|
44
|
+
Eine rail führt einen **Loop** aus — das Rezept für die Arbeit. Zwei Loops sind **eingebaut** und decken die gängigen Fälle ab:
|
|
45
45
|
|
|
46
46
|
| Eingebauter Loop | Befehl | Was er macht |
|
|
47
47
|
|------|---------|--------------|
|
|
48
48
|
| **Implement** | `/specrails:implement` | Ein Job für alle Specs auf der rail. Durchläuft die komplette Pipeline Architect → Developer → Reviewer → Ship. Der Alltagsstandard. |
|
|
49
|
-
| **Batch** | `/specrails:batch-implement` | Ein Job, der die Specs der rail nacheinander abarbeitet — in abhängigkeitsbewussten Wellen. Ideal für mehrere zusammenhängende Specs. |
|
|
50
49
|
| **Freestyle** | Freestyle | Claude oder Kimi implementiert jede Spec eigenständig und **umgeht** dabei die Pipeline. |
|
|
51
50
|
|
|
51
|
+
Für mehrere Specs legst du zusammengehörige (bis zu 3) auf eine rail — `Implement` führt sie als einen gemeinsamen Job aus — oder verteilst unabhängige Specs auf mehrere rails: Jede git-gestützte rail läuft parallel in ihrem eigenen isolierten Worktree.
|
|
52
|
+
|
|
52
53
|
Freestyle nutzt native Tools und Modelle des Providers. Claude hat persistenten
|
|
53
54
|
interaktiven Transport; Kimi nutzt einen agentischen `kimi -p`-Prozess ohne
|
|
54
55
|
persistentes stdin.
|
|
55
56
|
|
|
57
|
+
Auch die eingebauten Loops sind bearbeitbar: Bearbeite einen im Loop Builder und veröffentliche ihn, dann führt jede rail, die ihn wählt, deine Version aus (mit **Original wiederherstellen** gehst du zurück).
|
|
58
|
+
|
|
56
59
|
Über die eingebauten Loops hinaus kannst du **deine eigenen Loops bauen** — einen verify → fix → verify-Zyklus wiederholen, bis ein Ziel erreicht ist, Shell-Befehle zwischen KI-Schritten verketten und mehr. Diese eigenen Loops erscheinen in derselben Loop-Auswahl. Das ist die nächste große Idee: [Der Loop Builder](the-loop-builder).
|
|
57
60
|
|
|
58
61
|
## Die Job-Queue
|
|
@@ -98,5 +101,4 @@ Wenn etwas nicht stimmt:
|
|
|
98
101
|
|
|
99
102
|
- [Der Loop Builder](the-loop-builder) — was eine rail ausführt und wie du deine eigenen Loops baust.
|
|
100
103
|
- [Die Job-Detail-Ansicht](the-job-detail-view) — Phasen, Live-Metriken, Ticket-Karten.
|
|
101
|
-
- [Batch implement & Multi-Feature](batch-implement-and-multi-feature) — mehrere Specs auf einmal ausführen.
|
|
102
104
|
- [Engine pro Rail wählen](picking-an-engine-per-rail) — Claude, Codex, Gemini oder Kimi.
|
|
@@ -22,7 +22,7 @@ Klick auf eine beliebige Job-Karte auf der **Jobs**-Seite, und du landest hier:
|
|
|
22
22
|
|
|
23
23
|
## Pipeline-Phasen
|
|
24
24
|
|
|
25
|
-
Bei `Implement`-
|
|
25
|
+
Bei `Implement`-Jobs durchläuft der Lauf die Phasen, die der Slash-Befehl definiert — standardmäßig:
|
|
26
26
|
|
|
27
27
|
```
|
|
28
28
|
Architect ──► Developer ──► Reviewer ──► Ship
|
|
@@ -113,5 +113,14 @@ Praktisch, um einen Lauf mit einem Teammitglied zu teilen oder einen präzisen F
|
|
|
113
113
|
## Wie es weitergeht
|
|
114
114
|
|
|
115
115
|
- [Rails & Jobs](rails-and-jobs) — Starten und Einreihen in die Queue.
|
|
116
|
-
- [Batch implement & Multi-Feature](batch-implement-and-multi-feature) — viele Specs, abhängigkeitsbewusste Wellen.
|
|
117
116
|
- [Kosten verfolgen](../analytics/tracking-cost) — aus Kosten pro Job Projekt-Analysen machen.
|
|
117
|
+
|
|
118
|
+
## Nach einem Workflow-Neustart
|
|
119
|
+
|
|
120
|
+
Setze nach einem Absturz den gespeicherten Workflow mit seiner ursprünglichen Konfiguration und seinen ursprünglichen Repositorys fort. Prüfe bei einem unterbrochenen Schreibvorgang zuerst den Worktree-Diff und wähle dann den genauen Versuch aus. Abgeschlossene Schritte bleiben erhalten. Ein Anbieteraufruf mit verlorener Antwort wird weiterhin als unterbrochen mit unbekanntem Verbrauch gezählt, niemals als kostenlos. Lässt sich die ursprüngliche Auslieferung anhand der gespeicherten Daten nicht belegen, zeigt die Wiederherstellung einen Fehler und erhält den Worktree.
|
|
121
|
+
|
|
122
|
+
Wenn ein Entscheidungsschritt wegen einer Frage pausiert, verwendet die Fortsetzung die gespeicherte Entscheidung und gibt die menschliche Antwort an den nächsten Schritt weiter. Das Modell wird für dieselbe Entscheidung nicht erneut aufgerufen. Ein pausierter Prompt kann einen weiteren Modellaufruf benötigen, um Ihre Antwort umzusetzen.
|
|
123
|
+
|
|
124
|
+
## Aufbewahrung des Verlaufs
|
|
125
|
+
|
|
126
|
+
Gespeicherte Ausführungen werden standardmäßig unbegrenzt aufbewahrt. Unter **Gespeicherte Ausführungen → Aufbewahrung des Verlaufs** kann ein Projekt sie stattdessen 1 bis 3650 Tage aufbewahren. Im Hintergrund wird nichts gelöscht: Speichere die Richtlinie, wähle **Bereinigung prüfen** und prüfe jede Ausführung samt Grund, bevor du **Abgelaufenen Verlauf löschen** wählst. Eine Ausführung bleibt geschützt, solange sie aktiv ist, auf deine Antwort oder Freigabe wartet, einen unterbrochenen Schreibvorgang, eine offene Auslieferung oder einen davon abhängigen Fork hat. Entfernt wird nur der Laufzeitverlauf im Specrails-Speicher des Projekts; Repository, Worktrees, Job-Log und Kostendaten bleiben erhalten. Eine abgelaufene Ausführung wird als **Abgelaufen** angezeigt und kann nicht mehr fortgesetzt oder geforkt werden. Core-Versionen, die eine verbleibende Ausführung noch nutzt, bleiben immer erhalten.
|
|
@@ -21,14 +21,14 @@ Die ausgewählte Engine führt jede Phase der Pipeline dieser Rail aus. Ist die
|
|
|
21
21
|
|
|
22
22
|
## Wofür jede Engine gut ist
|
|
23
23
|
|
|
24
|
-
Alle vier führen **Implement**
|
|
24
|
+
Alle vier führen **Implement** aus:
|
|
25
25
|
|
|
26
26
|
| Engine | Greif dazu, wenn… | Hinweise |
|
|
27
27
|
|--------|--------------------|-------|
|
|
28
28
|
| **Claude** | Du native Kosten, persistente Interaktion oder strikte Tool-Policies brauchst. | Profile, Freestyle und strukturierte Transforms. |
|
|
29
29
|
| **Codex** | Du die OpenAI Codex CLI bevorzugst oder Implementierungen über verschiedene Provider hinweg vergleichen willst. | `codex` ≥ 0.128.0. Keine native Kostenmeldung — die App ergänzt die Kosten aus ihrer Preistabelle. Profile gelten nicht. |
|
|
30
30
|
| **Gemini** | Du Googles Gemini CLI, native Telemetrie oder einen günstigeren Lauf für Routine-Specs willst. | `gemini` ≥ 0.11.0 (setze `GEMINI_API_KEY`). Native OTLP-Telemetrie. Profile gelten nicht. |
|
|
31
|
-
| **Kimi** | Du agentisches Kimi für Implement,
|
|
31
|
+
| **Kimi** | Du agentisches Kimi für Implement, Freestyle oder Loops ohne Decider willst. | Externes `kimi` ≥ 0.27.0; Profile/Rollen, Effort nur K3; Tokens/Kosten nicht verfügbar. |
|
|
32
32
|
|
|
33
33
|
### Fähigkeitsunterschiede
|
|
34
34
|
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
# Der Loop Builder
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Core-Workflows
|
|
4
|
+
|
|
5
|
+
Mit einer kompatiblen Core-Engine zeigt ein neuer Canvas die siebzehn Schritte des installierten Katalogs. Klicke auf einen Schritt oder ziehe ihn auf den Canvas und fülle das Formular aus. Anbieter und Rollen stammen aus dem aktiven Projekt. Verbinde jeden benannten Ausgang mit einem weiteren Schritt oder Ende. Jeder Ausgang erlaubt eine Verbindung.
|
|
6
|
+
|
|
7
|
+
Die Formulare unterstützen optionale Felder, Objekte, Listen und Wörterbücher für alle Schritte: KI, Bedingungen, Prüfung, Shell, OpenSpec, Freigaben, Fragen, Pausen, Zuordnung, Zusammenführung, Komponenten und Implementierung. Workflow-Optionen enthalten Token- und Übergangslimits sowie Parallelität. Das Übergangslimit zählt auch Besuche in Komponenten und Zweigen.
|
|
8
|
+
|
|
9
|
+
Erstelle unter **Komponenten** einen wiederverwendbaren Ablauf, deklariere Eingaben und Ausgaben und wähle ihn in Komponente oder Zuordnen. Die Navigation kehrt ohne Datenverlust zum Hauptworkflow zurück. Ein lokales Ende wählt seine Komponentenausgabe optional über `exit`.
|
|
10
|
+
|
|
11
|
+
Beim Veröffentlichen validiert Core den Entwurf und markiert fehlerhafte Schritte. Beim Start wird die Projektkonfiguration erneut geprüft. Aktualisiere Core, wenn die Engine fehlt. Bestehende Desktop-Loops behalten ihren bisherigen Editor und Ablauf; die folgenden Abschnitte beschreiben diese.
|
|
12
|
+
|
|
13
|
+
Eine **rail führt einen Loop aus**. Die eingebauten Loops (`Implement`, `Freestyle`, `SDD Quick (OpenSpec)`) decken die Alltagsfälle ab, aber der **Loop Builder** lässt dich deine eigenen entwerfen — ein visueller Editor im n8n-Stil für Automatisierung, die sich wiederholt, bis ein Ziel erreicht ist. Diese Seite erklärt, was ein Loop ist, wie du einen baust und wie du ihn auf einer rail ausführst.
|
|
4
14
|
|
|
5
15
|
## Loops und rails — die Beziehung
|
|
6
16
|
|
|
@@ -10,9 +20,8 @@ Ein **Loop** ist das *Rezept* für die Arbeit; eine **rail** ist die *Spur*, die
|
|
|
10
20
|
Loop Builder (linke Seitenleiste) Rails (rechts)
|
|
11
21
|
─────────────────────────── ─────────────
|
|
12
22
|
Implement (eingebaut) Rail 1
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Verify-until-green (deiner)
|
|
23
|
+
Freestyle (eingebaut) wählen auf ► Loop: Verify-until-green
|
|
24
|
+
Verify-until-green (deiner) ▶ Play
|
|
16
25
|
```
|
|
17
26
|
|
|
18
27
|
- Loops leben im **Loops**-Bereich (linke Seitenleiste, neben deinen Projekten) — sie sind **global**, projektübergreifend geteilt.
|
|
@@ -25,7 +34,7 @@ Also: Bau einen Loop einmal, dann wähl ihn auf jeder rail in jedem Projekt.
|
|
|
25
34
|
|
|
26
35
|
Klick **Loops** in der linken Seitenleiste, um die Bibliothek zu sehen: die drei eingebauten Loops plus alle deine eigenen. Öffne einen, um ihn anzusehen, oder klick **New loop**, um mit einer leeren Leinwand zu starten.
|
|
27
36
|
|
|
28
|
-
|
|
37
|
+
Eingebaute Loops sind echte, bearbeitbare Loops. Öffne einen mit **Edit** und ändere ihn wie jeden anderen Loop: Beim Speichern wird er zum Entwurf, und **Publish** wendet deine Version auf **jede Rail, jeden Start aus dem Agenten-Chat und jeden Companion-Start an, der diesen eingebauten Loop verwendet**. Solange deine Änderung ein Entwurf ist, führen Rails weiter die zuletzt veröffentlichte Version aus – mitten im Bearbeiten geht also nichts kaputt. **Original wiederherstellen** (auf der Karte oder im Builder) setzt einen eingebauten Loop auf die Standardversion zurück; eingebaute Loops lassen sich nicht löschen. Lieber eine separate Kopie? Nutze **Duplicate** – das erzeugt einen normalen Loop und lässt den eingebauten unverändert.
|
|
29
38
|
|
|
30
39
|
## Woraus ein Loop besteht
|
|
31
40
|
|
|
@@ -93,3 +102,13 @@ Der Lauf streamt live in der **Jobs**-Ansicht, mit denselben Metriken und dersel
|
|
|
93
102
|
- [Rails & Jobs](rails-and-jobs) — rails starten und die Job-Queue.
|
|
94
103
|
- [Die Job-Detail-Ansicht](the-job-detail-view) — einem Lauf live zusehen.
|
|
95
104
|
- [Eine Engine pro Rail wählen](picking-an-engine-per-rail) — die rail (nicht der Loop) wählt den Provider.
|
|
105
|
+
|
|
106
|
+
Wenn die ausgewählte Core-Version Aufruflimits bereitstellt, bieten Prompt-, Rollen- und Decider-Bausteine `timeoutMs` und `idleTimeoutMs` an. Mit `0` deaktivierst du den jeweiligen Timer des Schritts; entfernst du das Feld, wird der Standardwert übernommen. Budgets des gesamten Workflows und der Abbruch bleiben wirksam. Stellt ein Verifizierungsschritt eine blockierende Frage, wartet er auf deine Antwort, bevor er ein erfolgreiches Ergebnis akzeptiert.
|
|
107
|
+
|
|
108
|
+
Wenn ein gespeicherter älterer Graph erstmals durch Core-Bausteine ersetzt wird, bleibt sein ursprünglicher Graph erhalten. Die Bibliothek bietet dann **Ursprünglichen Graphen exportieren** an. Der Export erhält einen eigenen Namen, damit du ihn als separaten Entwurf importieren kannst, ohne den aktuellen Workflow zu ersetzen. Konvertierungen und spätere Änderungen veröffentlichen einen Loop niemals automatisch.
|
|
109
|
+
|
|
110
|
+
Mit **Variablen setzen** bleibt Zustand über eine Pause hinweg erhalten: Setzen Sie typisierte JSON-Werte oder ändern Sie einen bestehenden ganzzahligen Zähler. Dieser Baustein ruft keine KI auf. Alle Änderungen werden gemeinsam gespeichert; ein ungültiger Zähler lässt sämtliche Variablen unverändert. Variablen einer zugeordneten Komponente bleiben auf diese Komponente beschränkt.
|
|
111
|
+
|
|
112
|
+
Beim Decider schützt **Fortsetzen, solange diese Bedingung erfüllt ist** noch offene Pflichtaufgaben. Beispielsweise wandelt `$vars.failedPass == true` einen Stoppvorschlag in eine Fortsetzung um, bis der Workflow das Kennzeichen löscht. Die Entscheidung wird weiterhin ausgeführt; unveränderte Wiederholungen unterliegen weiterhin der Fortschrittsgrenze. Rückfragen pausieren weiterhin bis zur Antwort.
|
|
113
|
+
|
|
114
|
+
Wähle in der Loop-Bibliothek **In Core umwandeln**, um einen gespeicherten Loop der bisherigen Engine zu migrieren. Wähle das ursprüngliche Repository, wenn ein Shell-Schritt keinen expliziten Bereich hat. Die Konvertierung validiert den Graphen und speichert einen Entwurf samt exportierbarer Originalkopie. Prüfe die Verbindungen und veröffentliche ausdrücklich. Laufende Loops können nicht konvertiert werden; gleichzeitige Änderungen bleiben erhalten. Schreibende Schritte benötigen echte Prüfkommandos. Quick SDD nutzt das in Core enthaltene OpenSpec. Aktualisiere Core, falls die Konvertierung nicht verfügbar ist.
|
|
@@ -15,7 +15,7 @@ Each connection also has an **Agent loop** setting. **Compact** (default) drives
|
|
|
15
15
|
|
|
16
16
|
## What you get
|
|
17
17
|
|
|
18
|
-
- Rails (implement,
|
|
18
|
+
- Rails (implement, freestyle, custom loops), Explore and Quick specs, chat and missions all run on the local model.
|
|
19
19
|
- Missions keep their Specrails tools and your external MCP servers.
|
|
20
20
|
- Sessions resume across turns; interactive jobs work.
|
|
21
21
|
- Cost is honest: tokens are recorded, cost stays *unknown* unless you enter rates (then it is marked *estimated*).
|
|
@@ -18,12 +18,12 @@ SpecsBoard (left) Rails (right)
|
|
|
18
18
|
|
|
19
19
|
A rail is an **execution lane**. You drag a spec card from the SpecsBoard onto a rail, then press **▶ Play**. For git repositories, the rail launches the pipeline in an isolated git worktree so the AI can edit files and run tests without touching your active working tree. If the project is not a git repo yet, Specrails clearly degrades to shared-folder execution and tells you that no branch or PR card will appear.
|
|
20
20
|
|
|
21
|
-
You can have several rails to organise work into named lanes (one for the feature you're focused on, another queued behind it). Rails are **dynamic**: the **+ Add** button in the Rails header creates a new lane (up to 12 per project) and idle empty lanes can be deleted. Every rail is server-backed, so your set of lanes survives reloads and is visible to the mobile companion and the in-app agent — the agent can even create a rail itself when all lanes are busy.
|
|
21
|
+
You can have several rails to organise work into named lanes (one for the feature you're focused on, another queued behind it). Rails are **dynamic**: the **+ Add** button in the Rails header creates a new lane (up to 12 per project) and idle empty lanes can be deleted. Every rail is server-backed, so your set of lanes survives reloads and is visible to the mobile companion and the in-app agent — the agent can even create a rail itself when all lanes are busy.
|
|
22
22
|
|
|
23
23
|
## Launching a rail on a spec
|
|
24
24
|
|
|
25
25
|
1. **Drag a spec card** from the SpecsBoard onto a rail. The spec's ID shows up in the rail's spec list. (Prefer not to drag? Use the **Move to rail** popover on the spec card — it shows a status dot per rail so you don't drop work onto a busy lane.)
|
|
26
|
-
2. **Pick a Loop** in the rail header. A rail runs a **Loop** — that's the work it performs. The default is the built-in `Implement` loop; you can also pick `
|
|
26
|
+
2. **Pick a Loop** in the rail header. A rail runs a **Loop** — that's the work it performs. The default is the built-in `Implement` loop; you can also pick `Freestyle`, or a custom loop you built yourself. See [The Loop Builder](the-loop-builder).
|
|
27
27
|
3. **Press ▶ Play.**
|
|
28
28
|
|
|
29
29
|
That's it. The rail spins up an AI CLI process in the right execution context and starts the pipeline.
|
|
@@ -34,27 +34,30 @@ That's it. The rail spins up an AI CLI process in the right execution context an
|
|
|
34
34
|
|---------|--------------|
|
|
35
35
|
| **Status pill** | `idle`, `running`, or `failed`. There's no separate "completed" — a rail returns to `idle` when its job finishes cleanly. |
|
|
36
36
|
| **Spec list** | The IDs assigned to this rail. Drag more in, drag them out to detach. |
|
|
37
|
-
| **Loop picker** | The Loop this rail runs — a built-in (`Implement` / `
|
|
37
|
+
| **Loop picker** | The Loop this rail runs — a built-in (`Implement` / `Freestyle` / `SDD Quick (OpenSpec)`) or a custom loop. See the table below. Persisted per rail. |
|
|
38
38
|
| **Profile picker** | Which provider-scoped agent profile runs (Claude and Kimi rails). Only appears once the effective provider has at least one profile. |
|
|
39
39
|
| **Engine selector** | Which installed provider runs this rail — Claude, Codex, Gemini, or Kimi. Only renders when the project has more than one provider. See [Picking an engine per rail](picking-an-engine-per-rail). |
|
|
40
40
|
| **▶ Play / ■ Stop** | Start or cancel. |
|
|
41
41
|
|
|
42
42
|
### What a rail runs: Loops
|
|
43
43
|
|
|
44
|
-
A rail runs a **Loop** — the recipe for the work.
|
|
44
|
+
A rail runs a **Loop** — the recipe for the work. Two loops are **built in** and cover the common cases:
|
|
45
45
|
|
|
46
46
|
| Built-in loop | Command | What it does |
|
|
47
47
|
|------|---------|--------------|
|
|
48
48
|
| **Implement** | `/specrails:implement` | One job covering all specs on the rail. Runs the full Architect → Developer → Reviewer → Ship pipeline. The everyday default. |
|
|
49
|
-
| **Batch** | `/specrails:batch-implement` | One job that works through the rail's specs sequentially, in dependency-aware waves. Best for several related specs. |
|
|
50
49
|
| **Freestyle** | Freestyle | A capable provider implements each spec autonomously, **bypassing** the pipeline. One independent job per spec. Claude and Kimi support it. |
|
|
51
50
|
|
|
51
|
+
To run several specs, put related ones (up to 3) on one rail — `Implement` runs them as one aggregate job — or spread independent specs across several rails: each git-backed rail runs in parallel in its own isolated worktree.
|
|
52
|
+
|
|
52
53
|
Freestyle is the odd one out: it skips the agent chain and hands the capable
|
|
53
54
|
provider the raw spec to work on with native tools. It's open-ended, so
|
|
54
55
|
pressing Play opens a confirmation first, and its model picker follows that
|
|
55
56
|
provider's catalog. Claude uses its persistent live-session flow; Kimi uses an
|
|
56
57
|
owned agentic `kimi -p` process and has no persistent stdin.
|
|
57
58
|
|
|
59
|
+
The built-ins are editable, too: edit one in the Loop Builder and publish it, and every rail that picks it runs your version (use **Restore original** to go back).
|
|
60
|
+
|
|
58
61
|
Beyond the built-ins, you can **build your own loops** — repeat a verify → fix
|
|
59
62
|
→ verify cycle until a goal is met, chain shell commands between AI steps, and
|
|
60
63
|
more. Kimi runs loops without a Loop Decider; its `-p` transport cannot enforce
|
|
@@ -107,5 +110,4 @@ If something looks wrong:
|
|
|
107
110
|
|
|
108
111
|
- [The Loop Builder](the-loop-builder) — what a rail runs, and how to build your own loops.
|
|
109
112
|
- [The Job Detail view](the-job-detail-view) — phases, live metrics, ticket cards.
|
|
110
|
-
- [Batch implement & multi-feature](batch-implement-and-multi-feature) — run several specs at once.
|
|
111
113
|
- [Picking an engine per rail](picking-an-engine-per-rail) — Claude vs Codex vs Gemini vs Kimi.
|
|
@@ -22,7 +22,7 @@ Two panels sit above the full streaming log; on a running Claude job, a chat com
|
|
|
22
22
|
|
|
23
23
|
## Pipeline phases
|
|
24
24
|
|
|
25
|
-
For `Implement`
|
|
25
|
+
For `Implement` jobs, the run moves through the phases defined by the slash command — by default:
|
|
26
26
|
|
|
27
27
|
```
|
|
28
28
|
Architect ──► Developer ──► Reviewer ──► Ship
|
|
@@ -113,5 +113,14 @@ Handy for sharing a run with a teammate, or filing a precise bug report.
|
|
|
113
113
|
## Where to go next
|
|
114
114
|
|
|
115
115
|
- [Rails & jobs](rails-and-jobs) — launching and queueing.
|
|
116
|
-
- [Batch implement & multi-feature](batch-implement-and-multi-feature) — many specs, dependency waves.
|
|
117
116
|
- [Tracking cost](../analytics/tracking-cost) — turn per-job costs into project analytics.
|
|
117
|
+
|
|
118
|
+
## After a workflow restart
|
|
119
|
+
|
|
120
|
+
After a crash, resume the saved workflow with its original configuration and repositories. An interrupted write requires selecting the exact attempt after inspecting the worktree diff. Completed steps are reused. A provider call whose response was lost remains counted as interrupted with unknown usage; it is never reported as free. If the original delivery cannot be proven from saved records, recovery shows an error and preserves the worktree.
|
|
121
|
+
|
|
122
|
+
When a decision step pauses for a question, resuming reuses its saved decision and sends the human answer to the following step. It does not call the model again for that same decision. A paused prompt can need another model turn to act on your answer.
|
|
123
|
+
|
|
124
|
+
## History retention
|
|
125
|
+
|
|
126
|
+
Saved executions are kept indefinitely by default. In **Saved executions → History retention**, a project can keep them for 1 to 3650 days instead. Nothing is deleted in the background: save the policy, choose **Preview cleanup** and review each run and its reason before **Delete expired history**. A run stays protected while it is active, waiting for your answer or approval, has an interrupted write, has an open delivery or a fork that still depends on it. Only runtime history under the project's Specrails storage is removed; your repository, worktrees, job log and cost records remain. An expired run shows as **Expired** and can no longer be resumed or forked. Core versions still used by a surviving run are always kept.
|
|
@@ -23,14 +23,14 @@ The selected engine runs every phase of that rail's pipeline. If the chosen engi
|
|
|
23
23
|
|
|
24
24
|
## What each engine is good at
|
|
25
25
|
|
|
26
|
-
All four run the standard **Implement**
|
|
26
|
+
All four run the standard **Implement** pipeline. Here's a practical guide to choosing:
|
|
27
27
|
|
|
28
28
|
| Engine | Reach for it when… | Notes |
|
|
29
29
|
|--------|--------------------|-------|
|
|
30
30
|
| **Claude** | You want native billed cost, persistent job interaction, and the richest hard tool-policy controls. | Supports profiles, Freestyle, and structured transforms such as Contract Layer/SMASH. |
|
|
31
31
|
| **Codex** | You prefer the OpenAI Codex CLI or want to compare implementations across providers. | `codex` ≥ 0.128.0. No native cost reporting — the app fills in cost from its rate card. Profiles don't apply. |
|
|
32
32
|
| **Gemini** | You want Google's Gemini CLI, native telemetry, or a cheaper run for routine specs. | `gemini` ≥ 0.11.0 (set `GEMINI_API_KEY`). Native OTLP telemetry. Profiles don't apply. |
|
|
33
|
-
| **Kimi** | You want Kimi Code's autonomous agentic CLI for implementation,
|
|
33
|
+
| **Kimi** | You want Kimi Code's autonomous agentic CLI for implementation, Freestyle, or loops without a Decider. | External `kimi` ≥ 0.27.0. Profiles/manual roles and K3 low/high/max effort are supported; tokens and USD cost are unavailable. |
|
|
34
34
|
|
|
35
35
|
### Capability differences
|
|
36
36
|
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# The Loop Builder
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Core workflows
|
|
4
|
+
|
|
5
|
+
With a compatible Core engine, a new canvas shows the installed catalog of seventeen pieces. Click or drag a piece onto the canvas, select it, and complete its parameter form. Provider and role choices come from the active project. A piece's named output handles show the outcomes it can produce; connect each outcome to another piece or an End. A source outcome can have one connection.
|
|
6
|
+
|
|
7
|
+
The catalog includes prompts, role turns, decisions, conditions, verification, shell, OpenSpec validation and archival, approvals, questions, gates, maps, joins, reusable components, implementation and End. Optional fields, nested objects, arrays and dictionary values are editable through the form. **Workflow options** also exposes token and transition limits and concurrency policies. An explicit transition limit counts all visits inside components and map branches.
|
|
8
|
+
|
|
9
|
+
Create a reusable body under **Components**, declare its input variables and output labels, then select it from a Component or Map piece. The breadcrumb returns to the root canvas without losing edits. A component End has a business outcome and an optional `exit` matching one of the component's output labels.
|
|
10
|
+
|
|
11
|
+
**Publish** sends the draft to Core for validation. Errors appear in the problems panel and highlight the affected nodes. Launch validates the selected project's effective configuration again. The installed Core owns the execution format and its hash. If it is unavailable, update Core to author or publish these workflows; existing Desktop loops keep their original editor and execution behavior.
|
|
12
|
+
|
|
13
|
+
The remaining sections describe the existing Desktop loop nodes and rail behavior.
|
|
14
|
+
|
|
15
|
+
A **rail runs a Loop**. The built-in loops (`Implement`, `Freestyle`, `SDD Quick (OpenSpec)`) cover the everyday cases, but the **Loop Builder** lets you design your own — a visual, n8n-style editor for automation that repeats until a goal is met. This page explains what a loop is, how to build one, and how to run it on a rail.
|
|
4
16
|
|
|
5
17
|
## Loops and rails — the relationship
|
|
6
18
|
|
|
@@ -10,9 +22,8 @@ A **loop** is the *recipe* for the work; a **rail** is the *lane* that runs it a
|
|
|
10
22
|
Loop Builder (left sidebar) Rails (right)
|
|
11
23
|
─────────────────────────── ─────────────
|
|
12
24
|
Implement (built-in) Rail 1
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Verify-until-green (yours)
|
|
25
|
+
Freestyle (built-in) pick on ► Loop: Verify-until-green
|
|
26
|
+
Verify-until-green (yours) ▶ Play
|
|
16
27
|
```
|
|
17
28
|
|
|
18
29
|
- Loops live in the **Loops** section (left sidebar, alongside your projects) — they are **global**, shared across every project.
|
|
@@ -25,7 +36,7 @@ So: build a loop once, then pick it on any rail in any project.
|
|
|
25
36
|
|
|
26
37
|
Click **Loops** in the left sidebar to see the library: the three built-in loops plus any of your own. Open one to view it, or click **New loop** to start from a blank canvas.
|
|
27
38
|
|
|
28
|
-
|
|
39
|
+
Built-in loops are real, editable loops. Open one with **Edit** and change it like any other loop: saving turns it into a Draft, and **Publish** applies your version to **every rail, agent-chat launch and Companion launch that uses that built-in**. While your edit is a Draft, rails keep running the last published version, so nothing breaks mid-edit. **Restore original** (on the card or in the builder) resets a built-in to its default; built-ins cannot be deleted. Prefer a separate copy? Use **Duplicate** — it creates an ordinary loop that leaves the built-in untouched.
|
|
29
40
|
|
|
30
41
|
## What a loop is made of
|
|
31
42
|
|
|
@@ -94,3 +105,21 @@ The run streams live in the **Jobs** view with the same metrics and cost trackin
|
|
|
94
105
|
- [Rails & jobs](rails-and-jobs) — launching rails and the job queue.
|
|
95
106
|
- [The Job Detail view](the-job-detail-view) — watching a run live.
|
|
96
107
|
- [Picking an engine per rail](picking-an-engine-per-rail) — the rail (not the loop) picks the provider.
|
|
108
|
+
|
|
109
|
+
When the selected Core exposes invocation limits, prompt, role and decider
|
|
110
|
+
pieces offer `timeoutMs` and `idleTimeoutMs`. Set a limit to `0` to disable that
|
|
111
|
+
step timer, or remove the field to inherit the default. Whole-workflow budgets
|
|
112
|
+
and cancellation still apply. A verification step that asks a blocking question
|
|
113
|
+
waits for your answer before accepting a success result.
|
|
114
|
+
|
|
115
|
+
When a saved legacy graph is first replaced with Core pieces, its original graph is preserved. The library then offers **Export original graph**. The export has a distinct name so you can import it as a separate draft without replacing the current workflow. Conversion and later edits never publish a loop automatically.
|
|
116
|
+
|
|
117
|
+
Use **Set variables** for state that must survive a pause: set typed JSON values or adjust an existing integer counter. This piece makes no AI call. All updates commit together; an invalid counter leaves every variable unchanged. Variables in a mapped component remain local to that component.
|
|
118
|
+
|
|
119
|
+
For a Decider, **Continue while this condition holds** can protect unfinished required work. For example, `$vars.failedPass == true` converts a stop proposal into continue until the workflow clears that flag. The decision still runs, and repeated unchanged work remains subject to the no-progress limit. Human questions still pause for an answer.
|
|
120
|
+
|
|
121
|
+
To migrate a saved legacy loop, choose **Convert to Core** in the loop library. Select the original repository when a shell step has no explicit scope. Conversion validates the graph and saves a draft with an exportable copy of the original. Review the connected steps and publish explicitly. Running loops cannot be converted; conflicting edits are preserved. Converted writers require real verification commands, and Quick SDD uses the OpenSpec version included in Core. Update Core if conversion is unavailable.
|
|
122
|
+
|
|
123
|
+
To see which saved loops still need attention, open **Core migration check** in the loop library and choose **Check**. It lists loops the installed Core rejects, loops ready to convert and loops that need a repository or other fix. It never converts or publishes anything on its own.
|
|
124
|
+
|
|
125
|
+
A future Core that runs only Core workflows refuses to launch an unconverted loop on a rail. Desktop shows a message that points you to **Convert to Core** instead of starting a run that would fail midway. Runs that already started keep the Core version that created them.
|
|
@@ -52,4 +52,4 @@ Loop history stores a terminal result independently of optional provider telemet
|
|
|
52
52
|
It separates process execution from Core acceptance and delivery, and distinguishes
|
|
53
53
|
steps, decider evaluations and agent turns. Phase durations and attempts come from
|
|
54
54
|
Core's journal; no per-phase cost is inferred from the total. Older runtimes keep
|
|
55
|
-
acceptance evidence unavailable.
|
|
55
|
+
acceptance evidence unavailable.
|
|
@@ -15,7 +15,7 @@ Cada conexión tiene además un ajuste **Bucle del agente**. **Compacto** (por d
|
|
|
15
15
|
|
|
16
16
|
## Qué obtienes
|
|
17
17
|
|
|
18
|
-
- Rails (implement,
|
|
18
|
+
- Rails (implement, freestyle, loops personalizados), Explore y specs Quick, chat y misiones se ejecutan con el modelo local.
|
|
19
19
|
- Las misiones conservan sus herramientas Specrails y tus servidores MCP externos.
|
|
20
20
|
- Las sesiones se reanudan entre turnos; los jobs interactivos funcionan.
|
|
21
21
|
- El coste es honesto: se registran los tokens, el coste queda *desconocido* salvo que indiques tarifas (entonces se marca *estimado*).
|