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
|
@@ -18,12 +18,12 @@ SpecsBoard (izquierda) Rails (derecha)
|
|
|
18
18
|
|
|
19
19
|
Un rail es un **carril de ejecución**. Arrastras una tarjeta de spec desde el SpecsBoard hasta un rail y luego pulsas **▶ Play**. En repositorios git, el rail lanza el pipeline en un git worktree aislado para que la IA pueda editar archivos y ejecutar tests sin tocar tu árbol de trabajo activo. Si el proyecto todavía no es un repo git, Specrails degrada claramente a ejecución en la carpeta compartida y te avisa de que no habrá rama ni tarjeta de PR.
|
|
20
20
|
|
|
21
|
-
Puedes tener varios rails para organizar el trabajo en carriles con nombre (uno para la funcionalidad en la que estás centrado, otro en cola detrás). Los rails son **dinámicos**: el botón **+ Añadir** de la cabecera de Rails crea un carril nuevo (hasta 12 por proyecto) y los carriles vacíos e inactivos se pueden borrar. Cada rail está respaldado por el servidor, así que tu conjunto de carriles sobrevive a las recargas y es visible para el companion móvil y el agente integrado — el agente incluso puede crear un rail por sí mismo cuando todos los carriles están ocupados.
|
|
21
|
+
Puedes tener varios rails para organizar el trabajo en carriles con nombre (uno para la funcionalidad en la que estás centrado, otro en cola detrás). Los rails son **dinámicos**: el botón **+ Añadir** de la cabecera de Rails crea un carril nuevo (hasta 12 por proyecto) y los carriles vacíos e inactivos se pueden borrar. Cada rail está respaldado por el servidor, así que tu conjunto de carriles sobrevive a las recargas y es visible para el companion móvil y el agente integrado — el agente incluso puede crear un rail por sí mismo cuando todos los carriles están ocupados.
|
|
22
22
|
|
|
23
23
|
## Lanzar un rail sobre una spec
|
|
24
24
|
|
|
25
25
|
1. **Arrastra una tarjeta de spec** desde el SpecsBoard hasta un rail. El ID de la spec aparece en la lista de specs del rail. (¿Prefieres no arrastrar? Usa el popover **Mover a rail** en la tarjeta de la spec — muestra un punto de estado por cada rail para que no dejes trabajo en un carril ocupado.)
|
|
26
|
-
2. **Elige un Loop** en la cabecera del rail. Un rail ejecuta un **Loop** — eso es el trabajo que realiza. El predeterminado es el loop `Implement` integrado; también puedes elegir `
|
|
26
|
+
2. **Elige un Loop** en la cabecera del rail. Un rail ejecuta un **Loop** — eso es el trabajo que realiza. El predeterminado es el loop `Implement` integrado; también puedes elegir `Freestyle` o un loop personalizado que hayas construido tú mismo. Mira [El Loop Builder](the-loop-builder).
|
|
27
27
|
3. **Pulsa ▶ Play.**
|
|
28
28
|
|
|
29
29
|
Eso es todo. El rail arranca un proceso de la CLI de IA en el contexto de ejecución correcto y empieza el pipeline.
|
|
@@ -34,25 +34,28 @@ Eso es todo. El rail arranca un proceso de la CLI de IA en el contexto de ejecuc
|
|
|
34
34
|
|---------|--------------|
|
|
35
35
|
| **Pastilla de estado** | `idle`, `running` o `failed`. No hay un estado "completed" aparte — un rail vuelve a `idle` cuando su job termina limpiamente. |
|
|
36
36
|
| **Lista de specs** | Los IDs asignados a este rail. Arrastra más para añadirlas, o sácalas para desvincularlas. |
|
|
37
|
-
| **Selector de Loop** | El Loop que ejecuta este rail — uno integrado (`Implement` / `
|
|
37
|
+
| **Selector de Loop** | El Loop que ejecuta este rail — uno integrado (`Implement` / `Freestyle` / `SDD Quick (OpenSpec)`) o un loop personalizado. Mira la tabla de más abajo. Se recuerda por rail. |
|
|
38
38
|
| **Selector de perfil** | Qué perfil del proveedor se ejecuta (rails Claude y Kimi). |
|
|
39
39
|
| **Selector de motor** | Qué proveedor ejecuta el rail — Claude, Codex, Gemini o Kimi. |
|
|
40
40
|
| **▶ Play / ■ Stop** | Iniciar o cancelar. |
|
|
41
41
|
|
|
42
42
|
### Qué ejecuta un rail: Loops
|
|
43
43
|
|
|
44
|
-
Un rail ejecuta un **Loop** — la receta del trabajo.
|
|
44
|
+
Un rail ejecuta un **Loop** — la receta del trabajo. Dos loops están **integrados** y cubren los casos comunes:
|
|
45
45
|
|
|
46
46
|
| Loop integrado | Comando | Qué hace |
|
|
47
47
|
|------|---------|--------------|
|
|
48
48
|
| **Implement** | `/specrails:implement` | Un job que cubre todas las specs del rail. Ejecuta el pipeline completo Architect → Developer → Reviewer → Ship. El predeterminado del día a día. |
|
|
49
|
-
| **Batch** | `/specrails:batch-implement` | Un job que recorre las specs del rail de forma secuencial, en oleadas según sus dependencias. Lo mejor para varias specs relacionadas. |
|
|
50
49
|
| **Freestyle** | Freestyle | Claude o Kimi implementan cada spec de forma autónoma, **saltándose** el pipeline. |
|
|
51
50
|
|
|
51
|
+
Para ejecutar varias specs, pon las relacionadas (hasta 3) en un mismo rail — `Implement` las ejecuta como un único job conjunto — o reparte las independientes entre varios rails: cada rail con git se ejecuta en paralelo en su propio worktree aislado.
|
|
52
|
+
|
|
52
53
|
Freestyle usa las herramientas nativas y el catálogo de modelos del proveedor.
|
|
53
54
|
Claude tiene transporte interactivo persistente; Kimi usa un proceso agentic
|
|
54
55
|
`kimi -p` sin stdin persistente.
|
|
55
56
|
|
|
57
|
+
Los integrados también se pueden editar: edita uno en el Loop Builder y publícalo, y todos los rails que lo eligen ejecutan tu versión (usa **Restaurar original** para volver atrás).
|
|
58
|
+
|
|
56
59
|
Más allá de los integrados, puedes **construir tus propios loops** — repetir un ciclo verify → fix → verify hasta cumplir un objetivo, encadenar comandos de shell entre pasos de IA y más. Esos loops personalizados aparecen en el mismo selector de Loop. Esa es la siguiente gran idea: [El Loop Builder](the-loop-builder).
|
|
57
60
|
|
|
58
61
|
## La cola de jobs
|
|
@@ -98,5 +101,4 @@ Si algo parece ir mal:
|
|
|
98
101
|
|
|
99
102
|
- [El Loop Builder](the-loop-builder) — qué ejecuta un rail y cómo construir tus propios loops.
|
|
100
103
|
- [La vista de detalle del job](the-job-detail-view) — fases, métricas en vivo, tarjetas de ticket.
|
|
101
|
-
- [Batch implement y multifuncionalidad](batch-implement-and-multi-feature) — ejecuta varias specs a la vez.
|
|
102
104
|
- [Elegir un motor por rail](picking-an-engine-per-rail) — Claude, Codex, Gemini o Kimi.
|
|
@@ -22,7 +22,7 @@ Dos paneles se sitúan encima del log completo en streaming; en un job de Claude
|
|
|
22
22
|
|
|
23
23
|
## Fases del pipeline
|
|
24
24
|
|
|
25
|
-
Para los jobs `Implement
|
|
25
|
+
Para los jobs `Implement`, la ejecución avanza por las fases que define el slash command — por defecto:
|
|
26
26
|
|
|
27
27
|
```
|
|
28
28
|
Architect ──► Developer ──► Reviewer ──► Ship
|
|
@@ -113,5 +113,14 @@ Práctico para compartir una ejecución con un compañero o para abrir un inform
|
|
|
113
113
|
## A dónde ir después
|
|
114
114
|
|
|
115
115
|
- [Rails y jobs](rails-and-jobs) — lanzamiento y encolado.
|
|
116
|
-
- [Batch implement y multifuncionalidad](batch-implement-and-multi-feature) — muchas specs, oleadas por dependencias.
|
|
117
116
|
- [Seguimiento de costes](../analytics/tracking-cost) — convierte los costes por job en analíticas de proyecto.
|
|
117
|
+
|
|
118
|
+
## Después de reiniciar un workflow
|
|
119
|
+
|
|
120
|
+
Tras una caída, reanuda el workflow guardado con su configuración y repositorios originales. Una escritura interrumpida exige seleccionar el intento exacto después de revisar el diff del worktree. Los pasos completados se conservan. Una llamada al proveedor cuya respuesta se perdió sigue contabilizada como interrumpida y con consumo desconocido; nunca se presenta como gratuita. Si los registros guardados no permiten demostrar la entrega original, la recuperación muestra un error y conserva el worktree.
|
|
121
|
+
|
|
122
|
+
Cuando un paso de decisión se detiene para preguntar, la reanudación reutiliza la decisión guardada y transmite la respuesta humana al siguiente paso. No vuelve a llamar al modelo para esa misma decisión. Un prompt pausado sí puede necesitar otro turno del modelo para aplicar tu respuesta.
|
|
123
|
+
|
|
124
|
+
## Conservación del historial
|
|
125
|
+
|
|
126
|
+
Las ejecuciones guardadas se conservan indefinidamente por defecto. En **Ejecuciones guardadas → Conservación del historial**, un proyecto puede conservarlas entre 1 y 3650 días. Nada se borra en segundo plano: guarda la política, elige **Previsualizar limpieza** y revisa cada ejecución y su motivo antes de **Eliminar historial caducado**. Una ejecución sigue protegida mientras está activa, espera tu respuesta o aprobación, tiene una escritura interrumpida, una entrega abierta o un fork que aún depende de ella. Solo se elimina el historial de ejecución dentro del almacenamiento de Specrails del proyecto; tu repositorio, los worktrees, el log del job y los registros de coste se conservan. Una ejecución caducada aparece como **Caducado** y ya no se puede reanudar ni bifurcar. Las versiones de Core que aún usa una ejecución conservada nunca se eliminan.
|
|
@@ -22,14 +22,14 @@ El motor seleccionado ejecuta cada fase del pipeline de ese rail. Si la CLI del
|
|
|
22
22
|
|
|
23
23
|
## En qué destaca cada motor
|
|
24
24
|
|
|
25
|
-
Los cuatro ejecutan **Implement
|
|
25
|
+
Los cuatro ejecutan **Implement**:
|
|
26
26
|
|
|
27
27
|
| Motor | Recurre a él cuando… | Notas |
|
|
28
28
|
|--------|--------------------|-------|
|
|
29
29
|
| **Claude** | Necesitas coste nativo, interacción persistente o políticas de tools estrictas. | Perfiles, Freestyle y transforms estructurados. |
|
|
30
30
|
| **Codex** | Prefieres la CLI de OpenAI Codex o quieres comparar implementaciones entre proveedores. | `codex` ≥ 0.128.0. Sin reporte de coste nativo — la app rellena el coste desde su tarifario. Los perfiles no aplican. |
|
|
31
31
|
| **Gemini** | Quieres la CLI de Gemini de Google, telemetría nativa o una ejecución más barata para specs rutinarias. | `gemini` ≥ 0.11.0 (define `GEMINI_API_KEY`). Telemetría OTLP nativa. Los perfiles no aplican. |
|
|
32
|
-
| **Kimi** | Quieres Kimi agentic para Implement,
|
|
32
|
+
| **Kimi** | Quieres Kimi agentic para Implement, Freestyle o loops sin Decider. | `kimi` ≥ 0.27.0 externo; perfiles/roles y effort low/high/max solo para K3; tokens/coste no disponibles. |
|
|
33
33
|
|
|
34
34
|
### Diferencias de capacidad
|
|
35
35
|
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
# El Loop Builder
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Workflows de Core
|
|
4
|
+
|
|
5
|
+
Con un motor de Core compatible, un canvas nuevo muestra las diecisiete piezas del catálogo instalado. Haz clic o arrastra una pieza al canvas, selecciónala y completa su formulario. Los proveedores y roles pertenecen al proyecto activo. Cada salida indica un resultado posible: conéctala a otra pieza o a Fin. Cada resultado admite una conexión.
|
|
6
|
+
|
|
7
|
+
El catálogo incluye prompts, turnos de rol, decisiones, condiciones, verificación, shell, validación y archivo de OpenSpec, aprobaciones, preguntas, pausas, mapas, uniones, componentes, implementación y Fin. Los formularios permiten editar campos opcionales, objetos, listas y diccionarios. **Opciones del workflow** incluye límites de tokens y transiciones y políticas de concurrencia. El límite explícito de transiciones cuenta también las visitas dentro de componentes y ramas.
|
|
8
|
+
|
|
9
|
+
Crea un cuerpo reutilizable en **Componentes**, declara sus variables de entrada y resultados y selecciónalo en una pieza Componente o Mapear. La navegación vuelve al canvas principal sin perder cambios. El Fin de un componente tiene un resultado de negocio y un `exit` opcional que coincide con una salida declarada.
|
|
10
|
+
|
|
11
|
+
**Publicar** envía el borrador a Core. Los errores aparecen en el panel de problemas y señalan los nodos afectados. El lanzamiento vuelve a validar la configuración efectiva del proyecto. Core controla el formato y su hash. Si no está disponible, actualiza Core; los loops antiguos conservan su editor y ejecución.
|
|
12
|
+
|
|
13
|
+
Las secciones siguientes describen los nodos antiguos de Desktop y su uso en rails.
|
|
14
|
+
|
|
15
|
+
Un **rail ejecuta un Loop**. Los loops integrados (`Implement`, `Freestyle`, `SDD Quick (OpenSpec)`) cubren los casos del día a día, pero el **Loop Builder** te permite diseñar el tuyo propio — un editor visual al estilo n8n para automatizaciones que se repiten hasta cumplir un objetivo. Esta página explica qué es un loop, cómo construir uno y cómo ejecutarlo en un rail.
|
|
4
16
|
|
|
5
17
|
## Loops y rails — la relación
|
|
6
18
|
|
|
@@ -10,9 +22,8 @@ Un **loop** es la *receta* del trabajo; un **rail** es el *carril* que la ejecut
|
|
|
10
22
|
Loop Builder (barra lateral izq.) Rails (derecha)
|
|
11
23
|
─────────────────────────── ─────────────
|
|
12
24
|
Implement (integrado) Rail 1
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Verify-until-green (tuyo)
|
|
25
|
+
Freestyle (integrado) elige en ► Loop: Verify-until-green
|
|
26
|
+
Verify-until-green (tuyo) ▶ Play
|
|
16
27
|
```
|
|
17
28
|
|
|
18
29
|
- Los loops viven en la sección **Loops** (barra lateral izquierda, junto a tus proyectos) — son **globales**, compartidos entre todos los proyectos.
|
|
@@ -25,7 +36,7 @@ Así que: construye un loop una vez y luego elígelo en cualquier rail de cualqu
|
|
|
25
36
|
|
|
26
37
|
Pulsa **Loops** en la barra lateral izquierda para ver la biblioteca: los tres loops integrados más los tuyos. Abre uno para verlo, o pulsa **New loop** para empezar desde un lienzo en blanco.
|
|
27
38
|
|
|
28
|
-
|
|
39
|
+
Los loops integrados son loops reales y editables. Ábrelo con **Edit** y cámbialo como cualquier otro loop: al guardar pasa a Borrador y **Publish** aplica tu versión en **todos los rails, lanzamientos desde el chat del agente y Companion que usan ese integrado**. Mientras tu edición sea un Borrador, los rails siguen ejecutando la última versión publicada, así que nada se rompe a mitad de edición. **Restaurar original** (en la tarjeta o en el builder) devuelve el integrado a su versión por defecto; los integrados no se pueden borrar. ¿Prefieres una copia aparte? Usa **Duplicate**: crea un loop normal y deja el integrado intacto.
|
|
29
40
|
|
|
30
41
|
## De qué se compone un loop
|
|
31
42
|
|
|
@@ -93,3 +104,17 @@ La ejecución se transmite en vivo en la vista **Jobs** con las mismas métricas
|
|
|
93
104
|
- [Rails y trabajos](rails-and-jobs) — lanzar rails y la cola de trabajos.
|
|
94
105
|
- [La vista de Detalle del trabajo](the-job-detail-view) — ver una ejecución en vivo.
|
|
95
106
|
- [Elegir un motor por rail](picking-an-engine-per-rail) — el rail (no el loop) elige el proveedor.
|
|
107
|
+
|
|
108
|
+
Cuando el Core seleccionado expone límites por invocación, las piezas de prompt, rol y decider ofrecen `timeoutMs` e `idleTimeoutMs`. Usa `0` para desactivar ese temporizador del paso, o elimina el campo para heredar el valor predeterminado. Los presupuestos del workflow completo y la cancelación siguen activos. Si una verificación plantea una pregunta bloqueante, espera tu respuesta antes de aceptar un resultado correcto.
|
|
109
|
+
|
|
110
|
+
Cuando un grafo antiguo guardado se sustituye por primera vez por piezas de Core, se conserva el grafo original. La biblioteca ofrece entonces **Exportar grafo original**. La exportación tiene un nombre distinto para poder importarla como un borrador independiente sin sustituir el workflow actual. La conversión y las ediciones posteriores nunca publican el loop automáticamente.
|
|
111
|
+
|
|
112
|
+
Usa **Asignar variables** para conservar estado durante una pausa: asigna valores JSON tipados o ajusta un contador entero existente. Esta pieza no realiza llamadas a la IA. Las actualizaciones se guardan juntas; un contador inválido deja todas las variables intactas. Las variables de un componente mapeado permanecen dentro de ese componente.
|
|
113
|
+
|
|
114
|
+
En un Decider, **Continuar mientras se cumpla esta condición** protege el trabajo obligatorio pendiente. Por ejemplo, `$vars.failedPass == true` convierte una propuesta de detenerse en continuar hasta que el workflow quite esa marca. La decisión se ejecuta igualmente y el trabajo repetido sin cambios sigue sujeto al límite de falta de progreso. Las preguntas humanas siguen pausando la ejecución hasta recibir respuesta.
|
|
115
|
+
|
|
116
|
+
Para migrar un loop guardado del motor anterior, elige **Convertir a Core** en la biblioteca. Selecciona el repositorio original si un paso shell no tiene un ámbito explícito. La conversión valida el grafo y guarda un borrador con una copia exportable del original. Revisa las conexiones y publica explícitamente. No se pueden convertir loops en ejecución; se conservan las ediciones en conflicto. Los pasos que escriben requieren comandos reales de verificación y Quick SDD utiliza el OpenSpec incluido en Core. Actualiza Core si la conversión no está disponible.
|
|
117
|
+
|
|
118
|
+
Para ver qué loops guardados necesitan atención, abre **Comprobación de migración a Core** en la biblioteca de loops y elige **Comprobar**. Muestra los loops que el Core instalado rechaza, los que están listos para convertir y los que necesitan un repositorio u otro arreglo. Nunca convierte ni publica nada por su cuenta.
|
|
119
|
+
|
|
120
|
+
Un Core futuro que solo ejecute flujos de Core no lanzará en un rail un loop sin convertir. Desktop muestra un mensaje que te lleva a **Convertir a Core**, en vez de empezar una ejecución que fallaría a mitad. Las ejecuciones ya iniciadas conservan la versión de Core que las creó.
|
|
@@ -52,5 +52,4 @@ El historial del loop conserva el resultado final independientemente de la telem
|
|
|
52
52
|
opcional del proveedor. Separa ejecución, aceptación de Core y entrega, y distingue
|
|
53
53
|
pasos, evaluaciones del decider y turnos del agente. Los tiempos e intentos por fase
|
|
54
54
|
proceden del registro de Core; no se deduce un coste por fase a partir del total. Con
|
|
55
|
-
runtimes antiguos, la evidencia queda como no disponible.
|
|
56
|
-
Implement en la guía de ejecución por lotes.
|
|
55
|
+
runtimes antiguos, la evidencia queda como no disponible.
|
|
@@ -15,7 +15,7 @@ Chaque connexion possède aussi un réglage **Boucle de l'agent**. **Compacte**
|
|
|
15
15
|
|
|
16
16
|
## Ce que vous obtenez
|
|
17
17
|
|
|
18
|
-
- Rails (implement,
|
|
18
|
+
- Rails (implement, freestyle, boucles personnalisées), Explore et specs Quick, chat et missions s'exécutent sur le modèle local.
|
|
19
19
|
- Les missions conservent leurs outils Specrails et vos serveurs MCP externes.
|
|
20
20
|
- Les sessions reprennent d'un tour à l'autre ; les jobs interactifs fonctionnent.
|
|
21
21
|
- Le coût est honnête : les tokens sont enregistrés, le coût reste *inconnu* sauf si vous saisissez des tarifs (il est alors marqué *estimé*).
|
|
@@ -18,12 +18,12 @@ SpecsBoard (gauche) Rails (droite)
|
|
|
18
18
|
|
|
19
19
|
Un rail est une **voie d'exécution**. Vous glissez une carte de spec depuis le SpecsBoard sur un rail, puis vous appuyez sur **▶ Play**. Pour les dépôts git, le rail lance le pipeline dans un worktree git isolé afin que l'IA puisse modifier des fichiers et lancer des tests sans toucher à votre arbre de travail actif. Si le projet n'est pas encore un dépôt git, Specrails dégrade clairement vers une exécution dans le dossier partagé et vous indique qu'aucune branche ni carte de PR n'apparaîtra.
|
|
20
20
|
|
|
21
|
-
Vous pouvez avoir plusieurs rails pour organiser le travail en voies nommées (une pour la fonctionnalité sur laquelle vous êtes concentré, une autre en attente derrière). Les rails sont **dynamiques** : le bouton **+ Ajouter** de l'en-tête Rails crée une nouvelle voie (jusqu'à 12 par projet) et les voies vides et inactives peuvent être supprimées. Chaque rail est adossé au serveur, donc votre ensemble de voies survit aux rechargements et reste visible pour le companion mobile et l'agent intégré — l'agent peut même créer un rail lui-même quand toutes les voies sont occupées.
|
|
21
|
+
Vous pouvez avoir plusieurs rails pour organiser le travail en voies nommées (une pour la fonctionnalité sur laquelle vous êtes concentré, une autre en attente derrière). Les rails sont **dynamiques** : le bouton **+ Ajouter** de l'en-tête Rails crée une nouvelle voie (jusqu'à 12 par projet) et les voies vides et inactives peuvent être supprimées. Chaque rail est adossé au serveur, donc votre ensemble de voies survit aux rechargements et reste visible pour le companion mobile et l'agent intégré — l'agent peut même créer un rail lui-même quand toutes les voies sont occupées.
|
|
22
22
|
|
|
23
23
|
## Lancer un rail sur un spec
|
|
24
24
|
|
|
25
25
|
1. **Glissez une carte de spec** depuis le SpecsBoard sur un rail. L'ID du spec apparaît dans la liste de specs du rail. (Vous préférez ne pas glisser ? Utilisez le popover **Move to rail** sur la carte de spec — il affiche un point de statut par rail pour que vous ne déposiez pas de travail sur une voie occupée.)
|
|
26
|
-
2. **Choisissez un Loop** dans l'en-tête du rail. Un rail exécute un **Loop** — c'est le travail qu'il effectue. Par défaut, c'est le Loop intégré `Implement` ; vous pouvez aussi choisir `
|
|
26
|
+
2. **Choisissez un Loop** dans l'en-tête du rail. Un rail exécute un **Loop** — c'est le travail qu'il effectue. Par défaut, c'est le Loop intégré `Implement` ; vous pouvez aussi choisir `Freestyle`, ou un loop personnalisé que vous avez construit vous-même. Voir [Le Loop Builder](the-loop-builder).
|
|
27
27
|
3. **Appuyez sur ▶ Play.**
|
|
28
28
|
|
|
29
29
|
Voilà. Le rail démarre un processus AI CLI dans le bon contexte d'exécution et lance le pipeline.
|
|
@@ -34,25 +34,28 @@ Voilà. Le rail démarre un processus AI CLI dans le bon contexte d'exécution e
|
|
|
34
34
|
|---------|--------------|
|
|
35
35
|
| **Pastille de statut** | `idle`, `running`, ou `failed`. Il n'y a pas de « completed » séparé — un rail revient à `idle` quand son job se termine proprement. |
|
|
36
36
|
| **Liste de specs** | Les IDs assignés à ce rail. Glissez-en d'autres, retirez-les pour les détacher. |
|
|
37
|
-
| **Sélecteur de Loop** | Le Loop que ce rail exécute — un intégré (`Implement` / `
|
|
37
|
+
| **Sélecteur de Loop** | Le Loop que ce rail exécute — un intégré (`Implement` / `Freestyle` / `SDD Quick (OpenSpec)`) ou un loop personnalisé. Voir le tableau ci-dessous. Persisté par rail. |
|
|
38
38
|
| **Sélecteur de profil** | Quel profil fournisseur s'exécute (rails Claude et Kimi). |
|
|
39
39
|
| **Sélecteur de moteur** | Quel provider exécute ce rail — Claude, Codex, Gemini ou Kimi. |
|
|
40
40
|
| **▶ Play / ■ Stop** | Démarrer ou annuler. |
|
|
41
41
|
|
|
42
42
|
### Ce qu'un rail exécute : les Loops
|
|
43
43
|
|
|
44
|
-
Un rail exécute un **Loop** — la recette du travail.
|
|
44
|
+
Un rail exécute un **Loop** — la recette du travail. Deux loops sont **intégrés** et couvrent les cas courants :
|
|
45
45
|
|
|
46
46
|
| Loop intégré | Commande | Ce qu'il fait |
|
|
47
47
|
|------|---------|--------------|
|
|
48
48
|
| **Implement** | `/specrails:implement` | Un seul job couvrant tous les specs du rail. Exécute tout le pipeline Architect → Developer → Reviewer → Ship. Le choix par défaut au quotidien. |
|
|
49
|
-
| **Batch** | `/specrails:batch-implement` | Un seul job qui traite les specs du rail séquentiellement, en vagues tenant compte des dépendances. Idéal pour plusieurs specs liés. |
|
|
50
49
|
| **Freestyle** | Freestyle | Claude ou Kimi implémente chaque spec de manière autonome, en **contournant** le pipeline. |
|
|
51
50
|
|
|
51
|
+
Pour exécuter plusieurs specs, placez les specs liées (jusqu'à 3) sur un même rail — `Implement` les exécute en un seul job commun — ou répartissez les specs indépendantes sur plusieurs rails : chaque rail adossé à git s'exécute en parallèle dans son propre worktree isolé.
|
|
52
|
+
|
|
52
53
|
Freestyle utilise les outils et modèles natifs du fournisseur. Claude possède
|
|
53
54
|
un transport interactif persistant ; Kimi utilise un processus agentic
|
|
54
55
|
`kimi -p` sans stdin persistant.
|
|
55
56
|
|
|
57
|
+
Les loops intégrés sont aussi modifiables : éditez-en un dans le Loop Builder et publiez-le, et chaque rail qui le choisit exécute votre version (utilisez **Restaurer l'original** pour revenir en arrière).
|
|
58
|
+
|
|
56
59
|
Au-delà des intégrés, vous pouvez **construire vos propres loops** — répéter un cycle verify → fix → verify jusqu'à ce qu'un objectif soit atteint, enchaîner des commandes shell entre les étapes IA, et plus encore. Ces loops personnalisés apparaissent dans le même sélecteur de Loop. C'est la prochaine grande idée : [Le Loop Builder](the-loop-builder).
|
|
57
60
|
|
|
58
61
|
## La file d'attente des jobs
|
|
@@ -98,5 +101,4 @@ Si quelque chose semble anormal :
|
|
|
98
101
|
|
|
99
102
|
- [Le Loop Builder](the-loop-builder) — ce qu'un rail exécute, et comment construire vos propres loops.
|
|
100
103
|
- [La vue détaillée du job](the-job-detail-view) — phases, métriques en direct, cartes de ticket.
|
|
101
|
-
- [Batch implement et multi-fonctionnalité](batch-implement-and-multi-feature) — exécutez plusieurs specs à la fois.
|
|
102
104
|
- [Choisir un moteur par rail](picking-an-engine-per-rail) — Claude, Codex, Gemini ou Kimi.
|
|
@@ -22,7 +22,7 @@ Deux panneaux se trouvent au-dessus du log en streaming complet ; sur un job Cla
|
|
|
22
22
|
|
|
23
23
|
## Les phases du pipeline
|
|
24
24
|
|
|
25
|
-
Pour les jobs `Implement
|
|
25
|
+
Pour les jobs `Implement`, l'exécution traverse les phases définies par la slash command — par défaut :
|
|
26
26
|
|
|
27
27
|
```
|
|
28
28
|
Architect ──► Developer ──► Reviewer ──► Ship
|
|
@@ -113,5 +113,14 @@ Pratique pour partager une exécution avec un coéquipier, ou pour déposer un r
|
|
|
113
113
|
## Où aller ensuite
|
|
114
114
|
|
|
115
115
|
- [Rails et jobs](rails-and-jobs) — lancement et mise en file.
|
|
116
|
-
- [Batch implement et multi-fonctionnalité](batch-implement-and-multi-feature) — plusieurs specs, vagues de dépendances.
|
|
117
116
|
- [Suivre le coût](../analytics/tracking-cost) — transformer les coûts par job en analytics de projet.
|
|
117
|
+
|
|
118
|
+
## Après le redémarrage d’un workflow
|
|
119
|
+
|
|
120
|
+
Après un arrêt brutal, reprenez le workflow enregistré avec sa configuration et ses dépôts d’origine. Une écriture interrompue exige de sélectionner la tentative exacte après avoir examiné le diff du worktree. Les étapes terminées sont conservées. Un appel au fournisseur dont la réponse a été perdue reste comptabilisé comme interrompu, avec une consommation inconnue ; il n’est jamais présenté comme gratuit. Si les données enregistrées ne permettent pas de prouver la livraison d’origine, la récupération affiche une erreur et conserve le worktree.
|
|
121
|
+
|
|
122
|
+
Quand une étape de décision pose une question, la reprise réutilise la décision enregistrée et transmet la réponse humaine à l’étape suivante. Elle ne rappelle pas le modèle pour cette même décision. Un prompt en pause peut nécessiter un nouveau tour du modèle pour appliquer votre réponse.
|
|
123
|
+
|
|
124
|
+
## Conservation de l’historique
|
|
125
|
+
|
|
126
|
+
Les exécutions enregistrées sont conservées indéfiniment par défaut. Dans **Exécutions enregistrées → Conservation de l’historique**, un projet peut les conserver de 1 à 3650 jours. Rien n’est supprimé en arrière-plan : enregistrez la politique, choisissez **Aperçu du nettoyage** et examinez chaque exécution et sa raison avant **Supprimer les historiques expirés**. Une exécution reste protégée tant qu’elle est active, attend votre réponse ou approbation, a une écriture interrompue, une livraison ouverte ou un fork qui en dépend encore. Seul l’historique d’exécution dans le stockage Specrails du projet est supprimé ; votre dépôt, les worktrees, le journal du job et les coûts sont conservés. Une exécution expirée apparaît comme **Expiré** et ne peut plus être reprise ni forkée. Les versions de Core encore utilisées par une exécution conservée sont toujours gardées.
|
|
@@ -22,14 +22,14 @@ Le moteur sélectionné exécute chaque phase du pipeline de ce rail. Si la CLI
|
|
|
22
22
|
|
|
23
23
|
## Les points forts de chaque moteur
|
|
24
24
|
|
|
25
|
-
Les quatre exécutent **Implement**
|
|
25
|
+
Les quatre exécutent **Implement** :
|
|
26
26
|
|
|
27
27
|
| Moteur | À privilégier quand… | Notes |
|
|
28
28
|
|--------|--------------------|-------|
|
|
29
29
|
| **Claude** | Vous avez besoin du coût natif, de l'interaction persistante ou de politiques d'outils strictes. | Profils, Freestyle et transforms structurés. |
|
|
30
30
|
| **Codex** | Vous préférez la CLI Codex d'OpenAI ou vous voulez comparer les implémentations entre fournisseurs. | `codex` ≥ 0.128.0. Pas de rapport de coût natif — l'application complète le coût à partir de sa table de tarifs. Les profils ne s'appliquent pas. |
|
|
31
31
|
| **Gemini** | Vous voulez la CLI Gemini de Google, la télémétrie native, ou une exécution moins chère pour les specs de routine. | `gemini` ≥ 0.11.0 (définissez `GEMINI_API_KEY`). Télémétrie OTLP native. Les profils ne s'appliquent pas. |
|
|
32
|
-
| **Kimi** | Vous voulez Kimi agentic pour Implement,
|
|
32
|
+
| **Kimi** | Vous voulez Kimi agentic pour Implement, Freestyle ou loops sans Decider. | `kimi` ≥ 0.27.0 externe ; profils/rôles, effort K3 seulement ; tokens/coût indisponibles. |
|
|
33
33
|
|
|
34
34
|
### Différences de capacité
|
|
35
35
|
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
# Le Loop Builder
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Workflows Core
|
|
4
|
+
|
|
5
|
+
Avec un moteur Core compatible, un nouveau canevas affiche les dix-sept étapes du catalogue installé. Cliquez sur une étape ou faites-la glisser, puis remplissez son formulaire. Les fournisseurs et rôles proviennent du projet actif. Reliez chaque sortie nommée à une autre étape ou à Fin ; une sortie accepte une seule connexion.
|
|
6
|
+
|
|
7
|
+
Les formulaires couvrent les champs facultatifs, objets, listes et dictionnaires de toutes les étapes : IA, conditions, vérification, shell, OpenSpec, approbation, question, pause, parcours, regroupement, composants et implémentation. Les options exposent les limites de jetons et de transitions et la concurrence. Les visites internes aux composants comptent dans la limite.
|
|
8
|
+
|
|
9
|
+
Créez un corps réutilisable dans **Composants**, déclarez ses entrées et sorties, puis sélectionnez-le dans une étape Composant ou Parcourir. Le fil de navigation revient au canevas principal sans perdre les modifications. Une étape Fin peut choisir une sortie locale avec `exit`.
|
|
10
|
+
|
|
11
|
+
La publication demande à Core de valider le brouillon et affiche les erreurs sur les étapes concernées. Le lancement valide à nouveau la configuration du projet. Si le moteur est indisponible, mettez Core à jour. Les anciennes boucles conservent leur éditeur et leur exécution ; les sections suivantes les décrivent.
|
|
12
|
+
|
|
13
|
+
Un **rail exécute un Loop**. Les loops intégrés (`Implement`, `Freestyle`, `SDD Quick (OpenSpec)`) couvrent les cas du quotidien, mais le **Loop Builder** vous laisse concevoir les vôtres — un éditeur visuel, de style n8n, pour de l'automatisation qui se répète jusqu'à ce qu'un objectif soit atteint. Cette page explique ce qu'est un loop, comment en construire un, et comment l'exécuter sur un rail.
|
|
4
14
|
|
|
5
15
|
## Loops et rails — la relation
|
|
6
16
|
|
|
@@ -10,9 +20,8 @@ Un **loop** est la *recette* du travail ; un **rail** est la *voie* qui l'exécu
|
|
|
10
20
|
Loop Builder (barre latérale gauche) Rails (droite)
|
|
11
21
|
─────────────────────────── ─────────────
|
|
12
22
|
Implement (intégré) Rail 1
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Verify-until-green (le vôtre)
|
|
23
|
+
Freestyle (intégré) choisir ► Loop: Verify-until-green
|
|
24
|
+
Verify-until-green (le vôtre) ▶ Play
|
|
16
25
|
```
|
|
17
26
|
|
|
18
27
|
- Les loops vivent dans la section **Loops** (barre latérale gauche, à côté de vos projets) — ils sont **globaux**, partagés entre tous les projets.
|
|
@@ -25,7 +34,7 @@ Donc : construisez un loop une fois, puis choisissez-le sur n'importe quel rail
|
|
|
25
34
|
|
|
26
35
|
Cliquez sur **Loops** dans la barre latérale gauche pour voir la bibliothèque : les trois loops intégrés plus les vôtres. Ouvrez-en un pour le visualiser, ou cliquez sur **New loop** pour partir d'un canevas vierge.
|
|
27
36
|
|
|
28
|
-
|
|
37
|
+
Les loops intégrés sont de vrais loops éditables. Ouvrez-en un avec **Edit** et modifiez-le comme n'importe quel loop : l'enregistrement le repasse en brouillon, et **Publish** applique votre version à **chaque rail, lancement depuis le chat de l'agent et lancement Companion qui utilise ce loop intégré**. Tant que votre modification est un brouillon, les rails continuent d'exécuter la dernière version publiée : rien ne casse en cours d'édition. **Restaurer l'original** (sur la carte ou dans le builder) remet un loop intégré à sa version par défaut ; les loops intégrés ne peuvent pas être supprimés. Vous préférez une copie séparée ? Utilisez **Duplicate** : cela crée un loop ordinaire et laisse le loop intégré intact.
|
|
29
38
|
|
|
30
39
|
## De quoi un loop est constitué
|
|
31
40
|
|
|
@@ -93,3 +102,13 @@ L'exécution se diffuse en direct dans la vue **Jobs** avec les mêmes métrique
|
|
|
93
102
|
- [Rails et jobs](rails-and-jobs) — lancer des rails et la file d'attente des jobs.
|
|
94
103
|
- [La vue détaillée du job](the-job-detail-view) — suivre une exécution en direct.
|
|
95
104
|
- [Choisir un moteur par rail](picking-an-engine-per-rail) — c'est le rail (pas le loop) qui choisit le provider.
|
|
105
|
+
|
|
106
|
+
Lorsque la version de Core sélectionnée expose les limites par invocation, les blocs prompt, rôle et decider proposent `timeoutMs` et `idleTimeoutMs`. La valeur `0` désactive le temporisateur correspondant pour cette étape ; supprimer le champ rétablit la valeur héritée. Les budgets du workflow complet et son annulation restent actifs. Une étape de vérification qui pose une question bloquante attend votre réponse avant d’accepter un résultat réussi.
|
|
107
|
+
|
|
108
|
+
Lorsqu’un ancien graphe enregistré est remplacé pour la première fois par des blocs Core, le graphe d’origine est conservé. La bibliothèque propose alors **Exporter le graphe d’origine**. L’export porte un nom distinct pour pouvoir être importé comme brouillon séparé sans remplacer le workflow actuel. La conversion et les modifications ultérieures ne publient jamais automatiquement une boucle.
|
|
109
|
+
|
|
110
|
+
Utilisez **Définir les variables** pour conserver un état pendant une pause : définissez des valeurs JSON typées ou ajustez un compteur entier existant. Cette pièce ne fait aucun appel à l’IA. Toutes les modifications sont enregistrées ensemble ; un compteur invalide laisse toutes les variables inchangées. Les variables d’un composant mappé restent locales à ce composant.
|
|
111
|
+
|
|
112
|
+
Pour un Decider, **Continuer tant que cette condition est remplie** protège les tâches obligatoires restantes. Par exemple, `$vars.failedPass == true` transforme une proposition d’arrêt en poursuite jusqu’à ce que le workflow efface cet indicateur. La décision est tout de même exécutée et les répétitions sans changement restent soumises à la limite de progression. Les questions humaines attendent toujours une réponse.
|
|
113
|
+
|
|
114
|
+
Pour migrer une boucle enregistrée de l’ancien moteur, choisissez **Convertir vers Core** dans la bibliothèque. Sélectionnez le dépôt d’origine si une étape shell n’a pas de périmètre explicite. La conversion valide le graphe et enregistre un brouillon avec une copie exportable de l’original. Vérifiez les connexions puis publiez explicitement. Les boucles en cours ne peuvent pas être converties et les modifications concurrentes sont préservées. Les étapes d’écriture exigent de vraies commandes de vérification ; Quick SDD utilise OpenSpec inclus dans Core. Mettez Core à jour si la conversion est indisponible.
|
|
@@ -15,7 +15,7 @@ Ogni connessione ha anche l'impostazione **Loop dell'agente**. **Compatto** (pre
|
|
|
15
15
|
|
|
16
16
|
## Cosa ottieni
|
|
17
17
|
|
|
18
|
-
- Rails (implement,
|
|
18
|
+
- Rails (implement, freestyle, loop personalizzati), Explore e spec Quick, chat e missioni girano sul modello locale.
|
|
19
19
|
- Le missioni mantengono i loro strumenti Specrails e i tuoi server MCP esterni.
|
|
20
20
|
- Le sessioni riprendono tra un turno e l'altro; i job interattivi funzionano.
|
|
21
21
|
- Il costo è onesto: i token vengono registrati, il costo resta *sconosciuto* a meno che tu non inserisca tariffe (allora è contrassegnato come *stimato*).
|
|
@@ -18,12 +18,12 @@ SpecsBoard (sinistra) Rail (destra)
|
|
|
18
18
|
|
|
19
19
|
Un rail è una **corsia di esecuzione**. Trascini una scheda spec dalla SpecsBoard su un rail e poi premi **▶ Play**. Nei repository git, il rail avvia la pipeline in un git worktree isolato, così l'IA può modificare file ed eseguire test senza toccare il tuo working tree attivo. Se il progetto non è ancora un repo git, Specrails degrada chiaramente all'esecuzione nella cartella condivisa e ti avvisa che non compariranno né branch né card PR.
|
|
20
20
|
|
|
21
|
-
Puoi avere diversi rail per organizzare il lavoro in corsie con un nome (una per la feature su cui sei concentrato, un'altra in attesa dietro). I rail sono **dinamici**: il pulsante **+ Aggiungi** nell'header dei Rails crea una nuova corsia (fino a 12 per progetto) e le corsie vuote e inattive si possono eliminare. Ogni rail è ancorato al server, quindi il tuo set di corsie sopravvive ai ricaricamenti ed è visibile al companion mobile e all'agente integrato — l'agente può persino creare un rail da solo quando tutte le corsie sono occupate.
|
|
21
|
+
Puoi avere diversi rail per organizzare il lavoro in corsie con un nome (una per la feature su cui sei concentrato, un'altra in attesa dietro). I rail sono **dinamici**: il pulsante **+ Aggiungi** nell'header dei Rails crea una nuova corsia (fino a 12 per progetto) e le corsie vuote e inattive si possono eliminare. Ogni rail è ancorato al server, quindi il tuo set di corsie sopravvive ai ricaricamenti ed è visibile al companion mobile e all'agente integrato — l'agente può persino creare un rail da solo quando tutte le corsie sono occupate.
|
|
22
22
|
|
|
23
23
|
## Avviare un rail su una spec
|
|
24
24
|
|
|
25
25
|
1. **Trascina una scheda spec** dalla SpecsBoard su un rail. L'ID della spec compare nell'elenco di spec del rail. (Preferisci non trascinare? Usa il popover **Sposta su un rail** sulla scheda spec — mostra un pallino di stato per ogni rail, così non scarichi del lavoro su una corsia già occupata.)
|
|
26
|
-
2. **Scegli un Loop** nell'intestazione del rail. Un rail esegue un **Loop** — è il lavoro che svolge. Quello predefinito è il Loop `Implement` integrato; puoi anche scegliere `
|
|
26
|
+
2. **Scegli un Loop** nell'intestazione del rail. Un rail esegue un **Loop** — è il lavoro che svolge. Quello predefinito è il Loop `Implement` integrato; puoi anche scegliere `Freestyle` o un loop personalizzato che hai costruito tu. Vedi [Il Loop Builder](the-loop-builder).
|
|
27
27
|
3. **Premi ▶ Play.**
|
|
28
28
|
|
|
29
29
|
Tutto qui. Il rail avvia un processo CLI AI nel contesto di esecuzione corretto e dà il via alla pipeline.
|
|
@@ -34,25 +34,28 @@ Tutto qui. Il rail avvia un processo CLI AI nel contesto di esecuzione corretto
|
|
|
34
34
|
|---------|--------------|
|
|
35
35
|
| **Pillola di stato** | `idle`, `running` o `failed`. Non esiste uno stato "completed" separato — un rail torna a `idle` quando il suo job termina senza errori. |
|
|
36
36
|
| **Elenco spec** | Gli ID assegnati a questo rail. Trascinane altri dentro, oppure fuori per staccarli. |
|
|
37
|
-
| **Selettore Loop** | Il Loop che questo rail esegue — uno integrato (`Implement` / `
|
|
37
|
+
| **Selettore Loop** | Il Loop che questo rail esegue — uno integrato (`Implement` / `Freestyle` / `SDD Quick (OpenSpec)`) o un loop personalizzato. Vedi la tabella più sotto. Viene salvato per ogni rail. |
|
|
38
38
|
| **Selettore profilo** | Quale profilo del provider viene eseguito (rail Claude e Kimi). |
|
|
39
39
|
| **Selettore engine** | Quale provider esegue il rail — Claude, Codex, Gemini o Kimi. |
|
|
40
40
|
| **▶ Play / ■ Stop** | Avvia o annulla. |
|
|
41
41
|
|
|
42
42
|
### Cosa esegue un rail: i Loop
|
|
43
43
|
|
|
44
|
-
Un rail esegue un **Loop** — la ricetta del lavoro.
|
|
44
|
+
Un rail esegue un **Loop** — la ricetta del lavoro. Due loop sono **integrati** e coprono i casi più comuni:
|
|
45
45
|
|
|
46
46
|
| Loop integrato | Comando | Cosa fa |
|
|
47
47
|
|------|---------|--------------|
|
|
48
48
|
| **Implement** | `/specrails:implement` | Un unico job che copre tutte le spec sul rail. Esegue l'intera pipeline Architect → Developer → Reviewer → Ship. L'impostazione predefinita di tutti i giorni. |
|
|
49
|
-
| **Batch** | `/specrails:batch-implement` | Un unico job che lavora le spec del rail in sequenza, in ondate consapevoli delle dipendenze. Ideale per più spec correlate. |
|
|
50
49
|
| **Freestyle** | Freestyle | Claude o Kimi implementa ogni spec in autonomia, **bypassando** la pipeline. |
|
|
51
50
|
|
|
51
|
+
Per eseguire più spec, metti quelle correlate (fino a 3) su un unico rail — `Implement` le esegue come un solo job aggregato — oppure distribuisci le spec indipendenti su più rail: ogni rail con git gira in parallelo nel proprio worktree isolato.
|
|
52
|
+
|
|
52
53
|
Freestyle usa strumenti e modelli nativi del provider. Claude ha un transport
|
|
53
54
|
interattivo persistente; Kimi usa un processo agentic `kimi -p` senza stdin
|
|
54
55
|
persistente.
|
|
55
56
|
|
|
57
|
+
Anche i loop integrati sono modificabili: modificane uno nel Loop Builder e pubblicalo, e ogni rail che lo sceglie esegue la tua versione (usa **Ripristina originale** per tornare indietro).
|
|
58
|
+
|
|
56
59
|
Oltre agli integrati, puoi **costruire i tuoi loop** — ripetere un ciclo verify → fix → verify finché un obiettivo non è raggiunto, concatenare comandi shell tra gli AI Step e altro ancora. Quei loop personalizzati compaiono nello stesso selettore Loop. È la prossima grande idea: [Il Loop Builder](the-loop-builder).
|
|
57
60
|
|
|
58
61
|
## La coda dei job
|
|
@@ -98,5 +101,4 @@ Se qualcosa sembra non andare:
|
|
|
98
101
|
|
|
99
102
|
- [Il Loop Builder](the-loop-builder) — cosa esegue un rail e come costruire i tuoi loop.
|
|
100
103
|
- [La vista Dettaglio job](the-job-detail-view) — fasi, metriche live, schede ticket.
|
|
101
|
-
- [Batch implement e multi-feature](batch-implement-and-multi-feature) — esegui più spec insieme.
|
|
102
104
|
- [Scegliere un engine per ogni rail](picking-an-engine-per-rail) — Claude, Codex, Gemini o Kimi.
|
|
@@ -22,7 +22,7 @@ Due pannelli stanno sopra il log completo in streaming; su un job Claude in esec
|
|
|
22
22
|
|
|
23
23
|
## Fasi della pipeline
|
|
24
24
|
|
|
25
|
-
Per i job `Implement
|
|
25
|
+
Per i job `Implement`, l'esecuzione attraversa le fasi definite dallo slash command — per impostazione predefinita:
|
|
26
26
|
|
|
27
27
|
```
|
|
28
28
|
Architect ──► Developer ──► Reviewer ──► Ship
|
|
@@ -113,5 +113,14 @@ Comodo per condividere un'esecuzione con un collega, o per inviare una segnalazi
|
|
|
113
113
|
## Dove andare ora
|
|
114
114
|
|
|
115
115
|
- [Rail e job](rails-and-jobs) — avvio e accodamento.
|
|
116
|
-
- [Batch implement e multi-feature](batch-implement-and-multi-feature) — molte spec, ondate di dipendenze.
|
|
117
116
|
- [Tracciare i costi](../analytics/tracking-cost) — trasforma i costi per job in analytics di progetto.
|
|
117
|
+
|
|
118
|
+
## Dopo il riavvio di un workflow
|
|
119
|
+
|
|
120
|
+
Dopo un arresto improvviso, riprendi il workflow salvato con la configurazione e i repository originali. Una scrittura interrotta richiede di selezionare il tentativo esatto dopo aver esaminato il diff del worktree. I passaggi completati vengono conservati. Una chiamata al provider la cui risposta è andata persa resta conteggiata come interrotta, con consumo sconosciuto; non viene mai presentata come gratuita. Se i dati salvati non consentono di dimostrare la consegna originale, il recupero mostra un errore e conserva il worktree.
|
|
121
|
+
|
|
122
|
+
Quando un passaggio decisionale si interrompe per una domanda, la ripresa riutilizza la decisione salvata e trasmette la risposta umana al passaggio successivo. Non richiama il modello per la stessa decisione. Un prompt in pausa può richiedere un altro turno del modello per applicare la risposta.
|
|
123
|
+
|
|
124
|
+
## Conservazione della cronologia
|
|
125
|
+
|
|
126
|
+
Le esecuzioni salvate sono conservate indefinitamente per impostazione predefinita. In **Esecuzioni salvate → Conservazione della cronologia**, un progetto può conservarle da 1 a 3650 giorni. Nulla viene eliminato in background: salva la regola, scegli **Anteprima pulizia** e controlla ogni esecuzione e il suo motivo prima di **Elimina cronologia scaduta**. Un’esecuzione resta protetta finché è attiva, attende una tua risposta o approvazione, ha una scrittura interrotta, una consegna aperta o un fork che ne dipende ancora. Viene rimossa solo la cronologia di esecuzione nello spazio Specrails del progetto; repository, worktree, log del job e costi restano. Un’esecuzione scaduta appare come **Scaduto** e non può più essere ripresa né forkata. Le versioni di Core ancora usate da un’esecuzione conservata non vengono mai rimosse.
|
|
@@ -21,14 +21,14 @@ L'engine selezionato esegue ogni fase della pipeline di quel rail. Se la CLI del
|
|
|
21
21
|
|
|
22
22
|
## In cosa è bravo ciascun engine
|
|
23
23
|
|
|
24
|
-
Tutti e quattro eseguono **Implement
|
|
24
|
+
Tutti e quattro eseguono **Implement**:
|
|
25
25
|
|
|
26
26
|
| Engine | Scegli questo quando… | Note |
|
|
27
27
|
|--------|--------------------|-------|
|
|
28
28
|
| **Claude** | Servono costi nativi, interazione persistente o tool policy rigorose. | Profili, Freestyle e transform strutturati. |
|
|
29
29
|
| **Codex** | Preferisci la CLI Codex di OpenAI o vuoi confrontare le implementazioni tra provider diversi. | `codex` ≥ 0.128.0. Nessuna reportistica nativa dei costi — l'app ricava il costo dalla sua tabella prezzi. I profili non si applicano. |
|
|
30
30
|
| **Gemini** | Vuoi la CLI Gemini di Google, telemetria nativa o un'esecuzione più economica per le spec di routine. | `gemini` ≥ 0.11.0 (imposta `GEMINI_API_KEY`). Telemetria OTLP nativa. I profili non si applicano. |
|
|
31
|
-
| **Kimi** | Vuoi Kimi agentic per Implement,
|
|
31
|
+
| **Kimi** | Vuoi Kimi agentic per Implement, Freestyle o loop senza Decider. | `kimi` ≥ 0.27.0 esterno; profili/ruoli, effort solo K3; token/costo non disponibili. |
|
|
32
32
|
|
|
33
33
|
### Differenze di capability
|
|
34
34
|
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
# Il Loop Builder
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Workflow Core
|
|
4
|
+
|
|
5
|
+
Con un motore Core compatibile, un nuovo canvas mostra i diciassette passaggi del catalogo installato. Fai clic o trascina un passaggio e compila il modulo. Provider e ruoli appartengono al progetto attivo. Collega ogni uscita denominata a un altro passaggio o a Fine; ciascuna uscita ammette una connessione.
|
|
6
|
+
|
|
7
|
+
I moduli coprono campi facoltativi, oggetti, elenchi e dizionari per IA, condizioni, verifica, shell, OpenSpec, approvazioni, domande, pause, mappe, unioni, componenti e implementazione. Le opzioni includono limiti di token e transizioni e concorrenza. Anche i passaggi interni ai componenti contano nel limite.
|
|
8
|
+
|
|
9
|
+
Crea un corpo riutilizzabile in **Componenti**, dichiara ingressi e uscite e selezionalo in un passaggio Componente o Mappa. La navigazione torna al canvas principale senza perdere le modifiche. Un Fine locale può scegliere un'uscita tramite `exit`.
|
|
10
|
+
|
|
11
|
+
La pubblicazione invia la bozza a Core e mostra gli errori sui passaggi interessati. L'avvio convalida nuovamente la configurazione del progetto. Aggiorna Core se il motore non è disponibile. I loop precedenti conservano editor ed esecuzione; le sezioni seguenti li descrivono.
|
|
12
|
+
|
|
13
|
+
Un **rail esegue un Loop**. I loop integrati (`Implement`, `Freestyle`, `SDD Quick (OpenSpec)`) coprono i casi di tutti i giorni, ma il **Loop Builder** ti permette di progettare i tuoi — un editor visuale in stile n8n per automazioni che si ripetono finché un obiettivo non è raggiunto. Questa pagina spiega cos'è un loop, come costruirne uno e come eseguirlo su un rail.
|
|
4
14
|
|
|
5
15
|
## Loop e rail — la relazione
|
|
6
16
|
|
|
@@ -10,9 +20,8 @@ Un **loop** è la *ricetta* del lavoro; un **rail** è la *corsia* che lo esegue
|
|
|
10
20
|
Loop Builder (sidebar sinistra) Rail (destra)
|
|
11
21
|
─────────────────────────── ─────────────
|
|
12
22
|
Implement (integrato) Rail 1
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Verify-until-green (tuo)
|
|
23
|
+
Freestyle (integrato) scegli su ► Loop: Verify-until-green
|
|
24
|
+
Verify-until-green (tuo) ▶ Play
|
|
16
25
|
```
|
|
17
26
|
|
|
18
27
|
- I loop vivono nella sezione **Loops** (sidebar sinistra, accanto ai tuoi progetti) — sono **globali**, condivisi tra tutti i progetti.
|
|
@@ -25,7 +34,7 @@ Quindi: costruisci un loop una volta, poi scegli quel loop su qualsiasi rail in
|
|
|
25
34
|
|
|
26
35
|
Clicca **Loops** nella sidebar sinistra per vedere la libreria: i tre loop integrati più tutti i tuoi. Aprine uno per visualizzarlo, oppure clicca **New loop** per partire da una tela bianca.
|
|
27
36
|
|
|
28
|
-
|
|
37
|
+
I loop integrati sono loop veri e modificabili. Aprine uno con **Edit** e cambialo come qualsiasi altro loop: salvando torna in bozza, e **Publish** applica la tua versione a **ogni rail, avvio dalla chat dell'agente e avvio da Companion che usa quel loop integrato**. Finché la modifica è una bozza, i rail continuano a eseguire l'ultima versione pubblicata, quindi nulla si rompe a metà modifica. **Ripristina originale** (sulla card o nel builder) riporta un loop integrato alla versione predefinita; i loop integrati non si possono eliminare. Preferisci una copia separata? Usa **Duplicate**: crea un loop normale e lascia intatto quello integrato.
|
|
29
38
|
|
|
30
39
|
## Di cosa è fatto un loop
|
|
31
40
|
|
|
@@ -93,3 +102,13 @@ L'esecuzione scorre dal vivo nella vista **Jobs** con le stesse metriche e lo st
|
|
|
93
102
|
- [Rail e job](rails-and-jobs) — avviare i rail e la coda dei job.
|
|
94
103
|
- [La vista Dettaglio job](the-job-detail-view) — seguire un'esecuzione dal vivo.
|
|
95
104
|
- [Scegliere un engine per rail](picking-an-engine-per-rail) — è il rail (non il loop) a scegliere il provider.
|
|
105
|
+
|
|
106
|
+
Quando la versione di Core selezionata espone i limiti per invocazione, i blocchi prompt, ruolo e decider offrono `timeoutMs` e `idleTimeoutMs`. Imposta `0` per disattivare quel timer del passaggio oppure rimuovi il campo per ereditare il valore predefinito. I budget dell’intero workflow e l’annullamento restano attivi. Un passaggio di verifica che pone una domanda bloccante attende la tua risposta prima di accettare un risultato positivo.
|
|
107
|
+
|
|
108
|
+
Quando un grafo precedente salvato viene sostituito per la prima volta con blocchi Core, il grafo originale viene conservato. La libreria offre quindi **Esporta il grafo originale**. L’esportazione ha un nome distinto, così puoi importarla come bozza separata senza sostituire il workflow attuale. La conversione e le modifiche successive non pubblicano mai automaticamente un loop.
|
|
109
|
+
|
|
110
|
+
Usa **Imposta variabili** per conservare lo stato durante una pausa: imposta valori JSON tipizzati o modifica un contatore intero esistente. Questo blocco non chiama l’IA. Gli aggiornamenti vengono salvati insieme; un contatore non valido lascia tutte le variabili invariate. Le variabili di un componente mappato restano locali a quel componente.
|
|
111
|
+
|
|
112
|
+
Nel Decider, **Continua finché questa condizione è vera** protegge il lavoro obbligatorio ancora aperto. Ad esempio, `$vars.failedPass == true` trasforma una proposta di arresto in continuazione finché il workflow non azzera il flag. La decisione viene comunque eseguita e le ripetizioni senza modifiche restano soggette al limite di mancato progresso. Le domande umane attendono sempre una risposta.
|
|
113
|
+
|
|
114
|
+
Per migrare un loop salvato del motore precedente, scegli **Converti in Core** nella libreria. Seleziona il repository originale se un passo shell non ha un ambito esplicito. La conversione convalida il grafo e salva una bozza con una copia esportabile dell’originale. Controlla i collegamenti e pubblica esplicitamente. I loop in esecuzione non possono essere convertiti; le modifiche concorrenti vengono conservate. I passi di scrittura richiedono veri comandi di verifica e Quick SDD usa OpenSpec incluso in Core. Aggiorna Core se la conversione non è disponibile.
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## できること
|
|
17
17
|
|
|
18
|
-
- レール(implement、
|
|
18
|
+
- レール(implement、freestyle、カスタムループ)、Explore と Quick スペック、チャット、ミッションがローカルモデルで動作します。
|
|
19
19
|
- ミッションは Specrails ツールと外部 MCP サーバーをそのまま使えます。
|
|
20
20
|
- セッションはターンをまたいで再開でき、インタラクティブジョブも動作します。
|
|
21
21
|
- コストは正直です。トークンは記録され、レートを入力しない限りコストは*不明*のまま(入力すると*推定*と表示)。
|
|
@@ -18,12 +18,12 @@ SpecsBoard(左) レール(右)
|
|
|
18
18
|
|
|
19
19
|
レールは**実行レーン**です。SpecsBoard からスペックカードをレールにドラッグし、**▶ Play** を押します。git リポジトリでは、レールは隔離された git worktree の中でパイプラインを起動するため、AI はあなたの現在のワークツリーに触れずにファイル編集やテスト実行を行えます。プロジェクトがまだ git リポジトリでない場合、Specrails は共有フォルダでの実行へ明確にフォールバックし、ブランチや PR カードが出ないことを知らせます。
|
|
20
20
|
|
|
21
|
-
レールは複数持てるので、名前付きのレーンとして作業を整理できます(いま集中している機能用のレールと、その後ろに控えさせておくレールといった具合に)。レールは**動的**です。レールヘッダーの **+ 追加** ボタンで新しいレーンを作成でき(1 プロジェクトあたり最大 12 本)、空のアイドルなレーンは削除できます。すべてのレールはサーバーに裏付けられているので、レーンの構成はリロード後も保持され、モバイルコンパニオンやアプリ内エージェントからも見えます —
|
|
21
|
+
レールは複数持てるので、名前付きのレーンとして作業を整理できます(いま集中している機能用のレールと、その後ろに控えさせておくレールといった具合に)。レールは**動的**です。レールヘッダーの **+ 追加** ボタンで新しいレーンを作成でき(1 プロジェクトあたり最大 12 本)、空のアイドルなレーンは削除できます。すべてのレールはサーバーに裏付けられているので、レーンの構成はリロード後も保持され、モバイルコンパニオンやアプリ内エージェントからも見えます — レーンがすべて塞がっているときは、エージェントが自分でレールを作ることさえできます。
|
|
22
22
|
|
|
23
23
|
## スペックでレールを起動する
|
|
24
24
|
|
|
25
25
|
1. **スペックカードをドラッグ**して、SpecsBoard からレールへ移します。スペックの ID がそのレールのスペック一覧に表示されます。(ドラッグが苦手ですか? スペックカードの **レールに移動** ポップオーバーを使えば、レールごとにステータスのドットが表示されるので、ふさがっているレーンに作業を落としてしまう心配がありません。)
|
|
26
|
-
2. レールヘッダーで **Loop を選びます**。レールは **Loop** を実行します — それがレールの行う作業そのものです。デフォルトは組み込みの `Implement` Loop ですが、`
|
|
26
|
+
2. レールヘッダーで **Loop を選びます**。レールは **Loop** を実行します — それがレールの行う作業そのものです。デフォルトは組み込みの `Implement` Loop ですが、`Freestyle`、あるいは自分で作ったカスタム Loop を選ぶこともできます。[Loop Builder](the-loop-builder) を参照してください。
|
|
27
27
|
3. **▶ Play を押します。**
|
|
28
28
|
|
|
29
29
|
これだけです。レールが適切な実行コンテキストで AI CLI プロセスを立ち上げ、パイプラインを開始します。
|
|
@@ -34,25 +34,28 @@ SpecsBoard(左) レール(右)
|
|
|
34
34
|
|---------|--------------|
|
|
35
35
|
| **ステータスピル** | `idle`、`running`、`failed` のいずれか。「completed」という別ステータスはありません — ジョブがきれいに完了すると、レールは `idle` に戻ります。 |
|
|
36
36
|
| **スペック一覧** | このレールに割り当てられた ID。さらにドラッグして追加したり、ドラッグして外したりできます。 |
|
|
37
|
-
| **Loop ピッカー** | このレールが実行する Loop — 組み込み(`Implement` / `
|
|
37
|
+
| **Loop ピッカー** | このレールが実行する Loop — 組み込み(`Implement` / `Freestyle` / `SDD Quick (OpenSpec)`)かカスタム Loop。下の表を参照してください。レールごとに保持されます。 |
|
|
38
38
|
| **プロファイルピッカー** | 実行する provider profile(Claude/Kimi rail)。 |
|
|
39
39
|
| **エンジンセレクター** | rail を実行する provider — Claude、Codex、Gemini、Kimi。 |
|
|
40
40
|
| **▶ Play / ■ Stop** | 開始またはキャンセル。 |
|
|
41
41
|
|
|
42
42
|
### レールが実行するもの: Loop
|
|
43
43
|
|
|
44
|
-
レールは **Loop** を実行します — それが作業のレシピです。
|
|
44
|
+
レールは **Loop** を実行します — それが作業のレシピです。2 つの Loop が **組み込み** で、よくあるケースをカバーします。
|
|
45
45
|
|
|
46
46
|
| 組み込み Loop | コマンド | 役割 |
|
|
47
47
|
|------|---------|--------------|
|
|
48
48
|
| **Implement** | `/specrails:implement` | レール上のすべてのスペックをまとめた 1 つのジョブ。Architect → Developer → Reviewer → Ship のフルパイプラインを実行します。日常的に使うデフォルトです。 |
|
|
49
|
-
| **Batch** | `/specrails:batch-implement` | レール上のスペックを、依存関係を考慮したウェーブで順番に処理する 1 つのジョブ。関連する複数のスペックに最適です。 |
|
|
50
49
|
| **Freestyle** | Freestyle | Claude または Kimi が pipeline を**バイパス**して自律的に実装します。 |
|
|
51
50
|
|
|
51
|
+
複数のスペックを実行するには、関連するもの(最大 3 件)を 1 本のレールに載せる(`Implement` がまとめて 1 つのジョブとして実行します)か、独立したスペックを複数のレールに分けます。git 管理のレールはそれぞれ専用の分離された worktree で並行して動きます。
|
|
52
|
+
|
|
52
53
|
Freestyle は provider の native tool/model を使います。Claude は
|
|
53
54
|
persistent interactive transport、Kimi は persistent stdin のない agentic
|
|
54
55
|
`kimi -p` process を使います。
|
|
55
56
|
|
|
57
|
+
組み込み Loop も編集できます。Loop Builder で編集して公開すると、それを選んでいるすべてのレールがあなたのバージョンを実行します(戻すには **元に戻す** を使います)。
|
|
58
|
+
|
|
56
59
|
組み込みのほかにも、**自分だけの Loop を作る** ことができます — verify → fix → verify のサイクルを目標が達成されるまで繰り返したり、AI ステップの間にシェルコマンドを連ねたり、さらにいろいろなことができます。そうしたカスタム Loop は同じ Loop ピッカーに表示されます。それが次の大きなアイデア、[Loop Builder](the-loop-builder) です。
|
|
57
60
|
|
|
58
61
|
## ジョブのキュー
|
|
@@ -98,5 +101,4 @@ git のないプロジェクトでは worktree 隔離も PR 継続も使えま
|
|
|
98
101
|
|
|
99
102
|
- [Loop Builder](the-loop-builder) — レールが実行するもの、そして自分だけの Loop を作る方法。
|
|
100
103
|
- [ジョブ詳細ビュー](the-job-detail-view) — フェーズ、ライブメトリクス、チケットカード。
|
|
101
|
-
- [バッチ実装とマルチフィーチャー](batch-implement-and-multi-feature) — 複数のスペックをまとめて実行する。
|
|
102
104
|
- [レールごとのエンジン選択](picking-an-engine-per-rail) — Claude / Codex / Gemini / Kimi。
|