specrails-desktop 2.20.1 → 2.22.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 +3 -2
- package/client/dist/assets/{ActivityFeedPage-3WSqRYVx.js → ActivityFeedPage-roDyKGuv.js} +1 -1
- package/client/dist/assets/AgentBrowserCapture-BsXnWa4j.js +1 -0
- package/client/dist/assets/{AgentModeCodePane-Cnsea6eZ.js → AgentModeCodePane-o97EJvbJ.js} +2 -2
- package/client/dist/assets/AgentModeJobsPane-CLtpPxPM.js +1 -0
- package/client/dist/assets/AgentsPage-eNSo_ZcC.js +86 -0
- package/client/dist/assets/AnalyticsPage-cAJ60_Ex.js +1 -0
- package/client/dist/assets/{BarChart-C6If656N.js → BarChart-NLtK7xAY.js} +1 -1
- package/client/dist/assets/CodePage-B5rum8ZB.js +2 -0
- package/client/dist/assets/DesktopAnalyticsPage-DSuvG6Tq.js +1 -0
- package/client/dist/assets/DocsDialog-Bo38G3Yc.js +11 -0
- package/client/dist/assets/DocsPage-BNkiBBrC.js +11 -0
- package/client/dist/assets/{ExportDropdown-CezTK0EX.js → ExportDropdown-DCV8PN4-.js} +1 -1
- package/client/dist/assets/IntegrationsPage-BMJOzpPz.js +3 -0
- package/client/dist/assets/InteractiveJobComposer-aLduNs5R.js +19 -0
- package/client/dist/assets/JobDetailModal-kpkUWJIS.js +1 -0
- package/client/dist/assets/JobDetailPage-CFeqlrPU.js +1 -0
- package/client/dist/assets/JobsPage-fuwhXy2I.js +1 -0
- package/client/dist/assets/LoopBuilderPage-DP66322C.js +7 -0
- package/client/dist/assets/LoopPreviewModal-CpmBhE31.js +1 -0
- package/client/dist/assets/LoopsPage-CvQ18VUx.js +1 -0
- package/client/dist/assets/ProjectSettingsDialog-Deq4pwvq.js +1 -0
- package/client/dist/assets/TemplatePreviewModal-DziOj2Ct.js +1 -0
- package/client/dist/assets/agent-Csh4kP2S.js +1 -0
- package/client/dist/assets/agent-Cz_jgQX32.js +1 -0
- package/client/dist/assets/agent-D3vcIvaz2.js +1 -0
- package/client/dist/assets/agent-Dnbt0V4e.js +1 -0
- package/client/dist/assets/agent-HolR7QrZ.js +1 -0
- package/client/dist/assets/agent-Ka0rRWJy.js +1 -0
- package/client/dist/assets/agent-Te3yysMd.js +1 -0
- package/client/dist/assets/agent-vM4_iLDk2.js +1 -0
- package/client/dist/assets/{upload-CRtTj4Co.js → brain-kFJuEDNH.js} +1 -1
- package/client/dist/assets/{browser-DEEO-OSi.js → browser-BPkhILSJ.js} +1 -1
- package/client/dist/assets/{browser-BTivfZKE2.js → browser-BijVYG0Y2.js} +1 -1
- package/client/dist/assets/{browser-bpO3onlS.js → browser-BqLqJVVT.js} +1 -1
- package/client/dist/assets/{browser-DlSXtfu5.js → browser-Cc0iDqUi.js} +1 -1
- package/client/dist/assets/browser-CdS6O1Qb.js +1 -0
- package/client/dist/assets/{browser-BKP6hqQC2.js → browser-Cvg-QHvd2.js} +1 -1
- package/client/dist/assets/{browser-INCUyduh.js → browser-FRv8P02E.js} +1 -1
- package/client/dist/assets/{browser-DlKLfT612.js → browser-rWKj-RR_2.js} +1 -1
- package/client/dist/assets/code-BRcDlze52.js +1 -0
- package/client/dist/assets/code-BdMy3Ffq.js +1 -0
- package/client/dist/assets/code-CeQ0FZpC.js +1 -0
- package/client/dist/assets/code-CqCcRThR.js +1 -0
- package/client/dist/assets/code-DgeHz9CB.js +1 -0
- package/client/dist/assets/code-DzC1rMk12.js +1 -0
- package/client/dist/assets/code-UPVvmAKM2.js +1 -0
- package/client/dist/assets/code-thSEptMx.js +1 -0
- package/client/dist/assets/{common-QjVnq9XP2.js → common-BM3LFLCE2.js} +1 -1
- package/client/dist/assets/{common-CeQUwuHt2.js → common-Bwafujnc2.js} +1 -1
- package/client/dist/assets/{common-Bb64s3Bm.js → common-C-vU-j-I.js} +1 -1
- package/client/dist/assets/{common-KbQuTSGg.js → common-C5HKSbbz.js} +1 -1
- package/client/dist/assets/{common-BPQQkgJZ.js → common-CYaT2yHp.js} +1 -1
- package/client/dist/assets/{common-DPxotRK9.js → common-DhWTkocg.js} +1 -1
- package/client/dist/assets/{common-k5MTOHpn.js → common-DiPTT7V_2.js} +1 -1
- package/client/dist/assets/{common-C8ZD5upH2.js → common-DmqBPwZG.js} +1 -1
- package/client/dist/assets/{cssMode-DsArsSCT.js → cssMode-DBHbkBvI.js} +1 -1
- package/client/dist/assets/dashboard-BaStj_a_.js +1 -0
- package/client/dist/assets/dashboard-Bi6ugu5Q.js +1 -0
- package/client/dist/assets/dashboard-BmqTn3L02.js +1 -0
- package/client/dist/assets/dashboard-CvT8lOCT.js +1 -0
- package/client/dist/assets/dashboard-D7Pmeavq2.js +1 -0
- package/client/dist/assets/dashboard-DAnWdAac2.js +1 -0
- package/client/dist/assets/dashboard-JnYy2WLg.js +1 -0
- package/client/dist/assets/dashboard-L47YsFS_.js +1 -0
- package/client/dist/assets/{dist-js-BQn4yxaw.js → dist-js-BZSiJDbG.js} +1 -1
- package/client/dist/assets/{dist-js-BAWSqVtr.js → dist-js-DKpmIJlQ.js} +1 -1
- package/client/dist/assets/{editor.main-G3Sl9C67.js → editor.main-C9J2ikJK.js} +2 -2
- package/client/dist/assets/{freemarker2-pBzQNgFi.js → freemarker2-J5iIIIK-.js} +1 -1
- package/client/dist/assets/{handlebars-CtBTCnBI.js → handlebars-DSw1l_tw.js} +1 -1
- package/client/dist/assets/{html-Dx3DYBzY.js → html-h2-wE1Lj.js} +1 -1
- package/client/dist/assets/{htmlMode-In7frFOo.js → htmlMode-Cc_ij7lW.js} +1 -1
- package/client/dist/assets/index-DM6heiGa.js +155 -0
- package/client/dist/assets/index-DPX6_xIC.css +2 -0
- package/client/dist/assets/{javascript-BKcn-YkN.js → javascript-C1q3xv6N.js} +1 -1
- package/client/dist/assets/jira-B3613-gj.js +1 -0
- package/client/dist/assets/jira-BHAKtc4B.js +1 -0
- package/client/dist/assets/jira-Be369RIR2.js +1 -0
- package/client/dist/assets/jira-CPpgA-5z2.js +1 -0
- package/client/dist/assets/jira-D5efgwp_.js +1 -0
- package/client/dist/assets/jira-DS7ownDy.js +1 -0
- package/client/dist/assets/jira-bDs7Im2C.js +1 -0
- package/client/dist/assets/jira-uNH1gETL2.js +1 -0
- package/client/dist/assets/jobs-1GV2-4zd2.js +1 -0
- package/client/dist/assets/jobs-26F9gGcE.js +1 -0
- package/client/dist/assets/jobs-BgQzB0Sx2.js +1 -0
- package/client/dist/assets/jobs-BqWui9_f.js +1 -0
- package/client/dist/assets/jobs-CE8qeIYj.js +1 -0
- package/client/dist/assets/jobs-D5sZzgLs.js +1 -0
- package/client/dist/assets/jobs-DzeuASRf.js +1 -0
- package/client/dist/assets/jobs-Wh7dn28q2.js +1 -0
- package/client/dist/assets/{jsonMode-jNREoQ3C.js → jsonMode-CeaCdEhr.js} +1 -1
- package/client/dist/assets/{lib-C-g8QbZl.js → lib-B2nCKzmA.js} +1 -1
- package/client/dist/assets/{liquid-CtRkGqBu.js → liquid-eFsVK0V-.js} +1 -1
- package/client/dist/assets/loops-BvEenWBy.js +1 -0
- package/client/dist/assets/loops-CBiWd9Hf.js +1 -0
- package/client/dist/assets/loops-DNGiYKll2.js +1 -0
- package/client/dist/assets/{loops-Y3FQsUCh.js → loops-DjOtVXRo.js} +1 -1
- package/client/dist/assets/loops-HTHf-xu32.js +1 -0
- package/client/dist/assets/loops-YYV2bwjd.js +1 -0
- package/client/dist/assets/loops-hXgncEpF2.js +1 -0
- package/client/dist/assets/loops-kYbydDyN.js +1 -0
- package/client/dist/assets/{lspLanguageFeatures-Cl3gvD_W.js → lspLanguageFeatures-DT3-bbhn.js} +1 -1
- package/client/dist/assets/{mdx-B_nJldHz.js → mdx-Fuwnh1cX.js} +1 -1
- package/client/dist/assets/{monaco.contribution-PUeaZk8T.js → monaco.contribution-Desq7oq4.js} +2 -2
- package/client/dist/assets/{python-DS1Ce-A6.js → python-BgoEs6Cj.js} +1 -1
- package/client/dist/assets/{razor-L41Qg9OK.js → razor-CM1sPMMq.js} +1 -1
- package/client/dist/assets/{settings-BPq9nCJm.js → settings-BOHOmHkb.js} +1 -1
- package/client/dist/assets/{settings-r8Qq2Gzp2.js → settings-BlEA_7h02.js} +1 -1
- package/client/dist/assets/{settings-C-m3yEZ2.js → settings-BsJMsWGc.js} +1 -1
- package/client/dist/assets/{settings-zZr7NzuB.js → settings-D6qY9_UI.js} +1 -1
- package/client/dist/assets/{settings-VgCsjaYf.js → settings-DZJeXoRV.js} +1 -1
- package/client/dist/assets/settings-Mr7MnJbf.js +1 -0
- package/client/dist/assets/{settings-BWHGtmU12.js → settings-TNga5gIF2.js} +1 -1
- package/client/dist/assets/{settings-DZj7Uqy32.js → settings-lFoaYT-s2.js} +1 -1
- package/client/dist/assets/setup-B590KsTX.js +1 -0
- package/client/dist/assets/setup-BkyGoby6.js +1 -0
- package/client/dist/assets/setup-CEj6uY3-2.js +1 -0
- package/client/dist/assets/setup-CbIerFGf2.js +1 -0
- package/client/dist/assets/setup-CmU6bTCV2.js +1 -0
- package/client/dist/assets/setup-D674kWQH.js +1 -0
- package/client/dist/assets/setup-VNqXyB6Y.js +1 -0
- package/client/dist/assets/setup-iY8vH8pB.js +1 -0
- package/client/dist/assets/specs-C9Sd7BhH2.js +1 -0
- package/client/dist/assets/specs-CBDvEYKv.js +1 -0
- package/client/dist/assets/specs-CIPr9reA2.js +1 -0
- package/client/dist/assets/specs-CWtKcVDC.js +1 -0
- package/client/dist/assets/specs-CmEZY57v.js +1 -0
- package/client/dist/assets/specs-D2clrt2c2.js +1 -0
- package/client/dist/assets/specs-DTplt2XM.js +1 -0
- package/client/dist/assets/specs-PozUNhqb.js +1 -0
- package/client/dist/assets/{tsMode-BC1g186U.js → tsMode-BmT8WogI.js} +1 -1
- package/client/dist/assets/{typescript-BGlRGvJW.js → typescript-CQrQPsoW.js} +1 -1
- package/client/dist/assets/upload-CLAzW1mS.js +1 -0
- package/client/dist/assets/{value-D9aLbxw-.js → value-DSwzyyWR.js} +1 -1
- package/client/dist/assets/{workers-CXcXtO3b.js → workers-U0UXyLUf.js} +1 -1
- package/client/dist/assets/{xml-JdZZaIhJ.js → xml-WRxJs8_I.js} +1 -1
- package/client/dist/assets/{yaml-Cm82BVBt.js → yaml-CjpSTjJU.js} +1 -1
- package/client/dist/index.html +14 -14
- package/docs/customizing.md +2 -2
- package/docs/gemini.md +15 -4
- package/docs/guide/de/insights/3-code-explorer.md +6 -0
- package/docs/guide/de/integrations/3-jira-integration.md +1 -1
- package/docs/guide/de/integrations/6-agent-chat.md +5 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/de/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/en/insights/3-code-explorer.md +6 -0
- package/docs/guide/en/integrations/3-jira-integration.md +1 -1
- package/docs/guide/en/integrations/6-agent-chat.md +5 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +10 -4
- package/docs/guide/en/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/es/insights/3-code-explorer.md +6 -0
- package/docs/guide/es/integrations/3-jira-integration.md +1 -1
- package/docs/guide/es/integrations/6-agent-chat.md +5 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/es/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/fr/insights/3-code-explorer.md +6 -0
- package/docs/guide/fr/integrations/3-jira-integration.md +1 -1
- package/docs/guide/fr/integrations/6-agent-chat.md +5 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/fr/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/it/insights/3-code-explorer.md +6 -0
- package/docs/guide/it/integrations/3-jira-integration.md +1 -1
- package/docs/guide/it/integrations/6-agent-chat.md +5 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +10 -6
- package/docs/guide/it/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/ja/insights/3-code-explorer.md +6 -0
- package/docs/guide/ja/integrations/3-jira-integration.md +1 -1
- package/docs/guide/ja/integrations/6-agent-chat.md +5 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/ja/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/pt/insights/3-code-explorer.md +6 -0
- package/docs/guide/pt/integrations/3-jira-integration.md +1 -1
- package/docs/guide/pt/integrations/6-agent-chat.md +5 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +9 -5
- package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/guide/zh/insights/3-code-explorer.md +6 -0
- package/docs/guide/zh/integrations/3-jira-integration.md +1 -1
- package/docs/guide/zh/integrations/6-agent-chat.md +5 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +6 -6
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +27 -2
- package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +10 -6
- package/docs/guide/zh/pipeline/5-the-loop-builder.md +1 -1
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +3 -2
- package/docs/internals/README.md +5 -0
- package/docs/internals/adding-a-provider.md +15 -3
- package/docs/internals/api-reference.md +6 -5
- package/docs/internals/browser-capture-performance.md +93 -0
- package/docs/internals/code-explorer-story.md +135 -0
- package/docs/internals/gemini-mcp-registration.md +53 -0
- package/docs/internals/interactive-jobs.md +212 -0
- package/docs/internals/loop-step-log-explorer.md +146 -0
- package/docs/internals/safe-pr-review-flow.md +367 -0
- package/docs/mcp.md +1 -1
- package/docs/running-pipelines.md +6 -2
- package/package.json +1 -1
- package/server/dist/agent-chat-manager.js +211 -0
- package/server/dist/agent-chat-registry.js +20 -0
- package/server/dist/agent-chat-router.js +22 -0
- package/server/dist/agent-mcp-config.js +45 -4
- package/server/dist/agent-operator-prompt.js +149 -56
- package/server/dist/agent-store.js +25 -0
- package/server/dist/agent-tier.js +6 -1
- package/server/dist/browser-capture-manager.js +184 -34
- package/server/dist/browser-playwright.js +98 -13
- package/server/dist/code-explorer-router.js +92 -0
- package/server/dist/db.js +102 -0
- package/server/dist/file-provenance.js +54 -1
- package/server/dist/file-story-manager.js +170 -0
- package/server/dist/file-story.js +148 -0
- package/server/dist/file-summary-generator.js +5 -4
- package/server/dist/git-guardrails.js +62 -0
- package/server/dist/index.js +5 -0
- package/server/dist/integration-branch.js +63 -0
- package/server/dist/interactive-job-session.js +226 -18
- package/server/dist/jira/jira-adf.js +9 -0
- package/server/dist/jira/jira-materializer.js +27 -4
- package/server/dist/jira/jira-status-resolver.js +12 -4
- package/server/dist/jira/jira-sync-manager.js +130 -2
- package/server/dist/jira-router.js +1 -1
- package/server/dist/loop-effect.js +12 -0
- package/server/dist/loop-executors.js +92 -22
- package/server/dist/loop-run-manager.js +354 -28
- package/server/dist/mcp/guide.js +18 -7
- package/server/dist/mcp/tools/jira.js +1 -1
- package/server/dist/mcp/tools/jobs.js +14 -5
- package/server/dist/mcp/tools/rails.js +137 -12
- package/server/dist/mcp/tools/specs.js +35 -9
- package/server/dist/mcp/tools/types.js +49 -0
- package/server/dist/mobile/mobile-ws.js +4 -0
- package/server/dist/path-resolver.js +46 -0
- package/server/dist/pr-body.js +240 -0
- package/server/dist/pr-naming.js +210 -0
- package/server/dist/pr-publisher.js +68 -0
- package/server/dist/project-registry.js +77 -17
- package/server/dist/project-router-jobs.js +53 -13
- package/server/dist/project-router-settings.js +33 -0
- package/server/dist/project-router-terminals.js +16 -0
- package/server/dist/project-router-tickets.js +57 -3
- package/server/dist/project-router.js +52 -13
- package/server/dist/queue-manager.js +268 -83
- package/server/dist/rail-isolated-launch.js +324 -34
- package/server/dist/rail-isolation.js +32 -5
- package/server/dist/rail-pr-decision.js +519 -0
- package/server/dist/rail-pr-delivery.js +75 -0
- package/server/dist/rail-pr-store.js +175 -0
- package/server/dist/rail-worktrees-store.js +18 -0
- package/server/dist/rails-router.js +241 -17
- package/server/dist/rails-store.js +78 -1
- package/server/dist/setup-prerequisites.js +105 -0
- package/server/dist/smash-runner.js +3 -1
- package/server/dist/ticket-store.js +7 -3
- package/server/dist/workspace-resolution.js +27 -0
- package/server/dist/worktree-manager.js +42 -7
- package/server/dist/worktree-overlay.js +261 -0
- package/client/dist/assets/AgentBrowserCapture-BlGDZahz.js +0 -1
- package/client/dist/assets/AgentModeJobsPane-CyNR-9BO.js +0 -1
- package/client/dist/assets/AgentsPage-dNsEsY_x.js +0 -86
- package/client/dist/assets/AnalyticsPage-BAxmR0HQ.js +0 -1
- package/client/dist/assets/CodePage-Crc4BBQN.js +0 -2
- package/client/dist/assets/DesktopAnalyticsPage-IXSnbCce.js +0 -1
- package/client/dist/assets/DocsDialog-Bc4hx7oW.js +0 -11
- package/client/dist/assets/DocsPage-bEU4t9c6.js +0 -11
- package/client/dist/assets/IntegrationsPage-wq2CezEL.js +0 -3
- package/client/dist/assets/JobDetailPage-BBcPk3j8.js +0 -1
- package/client/dist/assets/JobsPage-DXrSPlwa.js +0 -1
- package/client/dist/assets/LogViewer-BoYbwvbU.js +0 -16
- package/client/dist/assets/LoopBuilderPage-CiUMAuWz.js +0 -7
- package/client/dist/assets/LoopsPage-Xrp6W5XW.js +0 -1
- package/client/dist/assets/ProjectSettingsDialog-BU98L5JD.js +0 -1
- package/client/dist/assets/agent-B7GdHP3Z.js +0 -1
- package/client/dist/assets/agent-BHmcgoJf.js +0 -1
- package/client/dist/assets/agent-BdY_fii4.js +0 -1
- package/client/dist/assets/agent-C32FOi9v.js +0 -1
- package/client/dist/assets/agent-CiFQxoaZ2.js +0 -1
- package/client/dist/assets/agent-CtAag7V6.js +0 -1
- package/client/dist/assets/agent-DE4Mp1fY2.js +0 -1
- package/client/dist/assets/agent-DK8qovyG2.js +0 -1
- package/client/dist/assets/browser-ZB1afzjZ.js +0 -1
- package/client/dist/assets/code-BFxE1Yt62.js +0 -1
- package/client/dist/assets/code-BefYOm5Q.js +0 -1
- package/client/dist/assets/code-BkXpJt99.js +0 -1
- package/client/dist/assets/code-C6Sq7_t8.js +0 -1
- package/client/dist/assets/code-CGj3w-2N.js +0 -1
- package/client/dist/assets/code-Dfsxc9o82.js +0 -1
- package/client/dist/assets/code-Y5urks5s2.js +0 -1
- package/client/dist/assets/code-wtcs0ivb.js +0 -1
- package/client/dist/assets/dashboard-B8032psZ.js +0 -1
- package/client/dist/assets/dashboard-BHGKtxty2.js +0 -1
- package/client/dist/assets/dashboard-CXnoUgN22.js +0 -1
- package/client/dist/assets/dashboard-Ccyxqy7d.js +0 -1
- package/client/dist/assets/dashboard-CoED_41r.js +0 -1
- package/client/dist/assets/dashboard-Dc5ZAgMN.js +0 -1
- package/client/dist/assets/dashboard-JMY8ueD3.js +0 -1
- package/client/dist/assets/dashboard-tkWr1aHD2.js +0 -1
- package/client/dist/assets/index-BHPbzyg6.css +0 -2
- package/client/dist/assets/index-n2PmJGF6.js +0 -152
- package/client/dist/assets/jira-BcZzX9122.js +0 -1
- package/client/dist/assets/jira-CTYs7LA12.js +0 -1
- package/client/dist/assets/jira-D2nN39e92.js +0 -1
- package/client/dist/assets/jira-DJxmIkyr.js +0 -1
- package/client/dist/assets/jira-DXMoAKWD.js +0 -1
- package/client/dist/assets/jira-IhC1ROIc.js +0 -1
- package/client/dist/assets/jira-Iw575fN8.js +0 -1
- package/client/dist/assets/jira-kbWZY7jH.js +0 -1
- package/client/dist/assets/jobs-BqF79kHz2.js +0 -1
- package/client/dist/assets/jobs-C1XM5urS.js +0 -1
- package/client/dist/assets/jobs-C5UjG0262.js +0 -1
- package/client/dist/assets/jobs-DBfaHTxC.js +0 -1
- package/client/dist/assets/jobs-DM4BDPdg.js +0 -1
- package/client/dist/assets/jobs-Da5OkZmf2.js +0 -1
- package/client/dist/assets/jobs-JJdnuQ03.js +0 -1
- package/client/dist/assets/jobs-SI34ML8I.js +0 -1
- package/client/dist/assets/loops-BR4FmOv12.js +0 -1
- package/client/dist/assets/loops-BgX_uudn.js +0 -1
- package/client/dist/assets/loops-Bpl2j2LP.js +0 -1
- package/client/dist/assets/loops-CQuuMlyZ.js +0 -1
- package/client/dist/assets/loops-DW8hSMdS2.js +0 -1
- package/client/dist/assets/loops-Q2muu8hW2.js +0 -1
- package/client/dist/assets/loops-q7CNDvfK.js +0 -1
- package/client/dist/assets/settings-CY8udi0e.js +0 -1
- package/client/dist/assets/setup-CNMdCHHt2.js +0 -1
- package/client/dist/assets/setup-Cag4XrbL2.js +0 -1
- package/client/dist/assets/setup-D9IHGoWU.js +0 -1
- package/client/dist/assets/setup-Dg6Ba3JT.js +0 -1
- package/client/dist/assets/setup-DyK36RIW.js +0 -1
- package/client/dist/assets/setup-G4ZvDKxX.js +0 -1
- package/client/dist/assets/setup-aTlGxuwi2.js +0 -1
- package/client/dist/assets/setup-kWsoAeHQ.js +0 -1
- package/client/dist/assets/specs-BFSUPa122.js +0 -1
- package/client/dist/assets/specs-BMzip1WY2.js +0 -1
- package/client/dist/assets/specs-BYeAbIEy.js +0 -1
- package/client/dist/assets/specs-C-mtLcXw.js +0 -1
- package/client/dist/assets/specs-CAzpvADd2.js +0 -1
- package/client/dist/assets/specs-CyRIw_IR.js +0 -1
- package/client/dist/assets/specs-DMm7gB_l.js +0 -1
- package/client/dist/assets/specs-DuottM0Z.js +0 -1
- /package/client/dist/assets/{abap-CpHUwCVK.js → abap-D0E4FfVW.js} +0 -0
- /package/client/dist/assets/{activity-DemHQS7l.js → activity--iN4Ad2R2.js} +0 -0
- /package/client/dist/assets/{activity-B_71BWg3.js → activity-6hM_ZSg9.js} +0 -0
- /package/client/dist/assets/{activity-DHv2V5Oi.js → activity-BZNfOdiS.js} +0 -0
- /package/client/dist/assets/{activity-D0rfjQzT2.js → activity-BuVo5sPB.js} +0 -0
- /package/client/dist/assets/{activity-BpTTj_PH.js → activity-CIOLxGvh.js} +0 -0
- /package/client/dist/assets/{activity-D2e62vbV2.js → activity-D2r2h3SE2.js} +0 -0
- /package/client/dist/assets/{activity-Ch-wbr0C2.js → activity-DtxrAUMo2.js} +0 -0
- /package/client/dist/assets/{addon-image-Ba-TY3wr.js → addon-image-CwoZj17F.js} +0 -0
- /package/client/dist/assets/{addon-ligatures-T4ARLiuu.js → addon-ligatures-CWDrED80.js} +0 -0
- /package/client/dist/assets/{addon-webgl-Cd73n8eh.js → addon-webgl-DMbGeI_u.js} +0 -0
- /package/client/dist/assets/{addspec-xwRX_Pnf.js → addspec-BMtLZLW62.js} +0 -0
- /package/client/dist/assets/{addspec-l_zU5gla.js → addspec-CP0HRuxY.js} +0 -0
- /package/client/dist/assets/{addspec-Dio-H5z0.js → addspec-CRuvWn8d.js} +0 -0
- /package/client/dist/assets/{addspec-D6L4ZteP.js → addspec-D-JLDsUV.js} +0 -0
- /package/client/dist/assets/{addspec-CrEm6Fzr2.js → addspec-DfhDbg5c.js} +0 -0
- /package/client/dist/assets/{addspec-B6Ns8KU02.js → addspec-bsNDdqRm2.js} +0 -0
- /package/client/dist/assets/{addspec-qGyH7MHy2.js → addspec-mgPOt5q02.js} +0 -0
- /package/client/dist/assets/{agents-OzxCLVW1.js → agents-78bTZGZh.js} +0 -0
- /package/client/dist/assets/{agents-hv3sqmPm2.js → agents-BLhWCmDS2.js} +0 -0
- /package/client/dist/assets/{agents-CHgCudUV.js → agents-BUdEi3-N.js} +0 -0
- /package/client/dist/assets/{agents-Dumx4JiM2.js → agents-BpoUaoW92.js} +0 -0
- /package/client/dist/assets/{agents-CnaPeSyw.js → agents-CWo-KyAB.js} +0 -0
- /package/client/dist/assets/{agents-Xh-zYHUx2.js → agents-DDtCJ5M02.js} +0 -0
- /package/client/dist/assets/{agents-DuhLEaQ_.js → agents-bvyRLczL.js} +0 -0
- /package/client/dist/assets/{agentstudio-CCthUdzR.js → agentstudio-BMQxc_bz.js} +0 -0
- /package/client/dist/assets/{agentstudio-CcH8Ckql2.js → agentstudio-COZriimI2.js} +0 -0
- /package/client/dist/assets/{agentstudio-Bo91kfUd2.js → agentstudio-CWgXG5W52.js} +0 -0
- /package/client/dist/assets/{agentstudio-VJOa_NVO.js → agentstudio-C_Jq8Tl4.js} +0 -0
- /package/client/dist/assets/{agentstudio-BIxikDf_.js → agentstudio-Dtq3dGYk.js} +0 -0
- /package/client/dist/assets/{agentstudio-Bz8cP8_c.js → agentstudio-jKMTdT70.js} +0 -0
- /package/client/dist/assets/{agentstudio-DARgYg5Z2.js → agentstudio-sI27TpBu2.js} +0 -0
- /package/client/dist/assets/{aiedit-5ZXN4cep2.js → aiedit-6CHdb_iv2.js} +0 -0
- /package/client/dist/assets/{aiedit-B7gAJZVC.js → aiedit-B03pD_Na.js} +0 -0
- /package/client/dist/assets/{aiedit-D92V-kUW.js → aiedit-BtRqRxML.js} +0 -0
- /package/client/dist/assets/{aiedit-D9ualLVJ.js → aiedit-eMN4eQPF.js} +0 -0
- /package/client/dist/assets/{aiedit-h48tJU0V2.js → aiedit-hknZlly82.js} +0 -0
- /package/client/dist/assets/{aiedit-xkA_mR2a2.js → aiedit-igmw-ZoZ2.js} +0 -0
- /package/client/dist/assets/{aiedit-7B2dvCv-.js → aiedit-pc5JDUq1.js} +0 -0
- /package/client/dist/assets/{analytics-slx4X1mu2.js → analytics-BWMUZ2Pq2.js} +0 -0
- /package/client/dist/assets/{analytics-uRNP6yAJ.js → analytics-Bj-SmKHa.js} +0 -0
- /package/client/dist/assets/{analytics-WF1I49ln.js → analytics-C5dpiS0o.js} +0 -0
- /package/client/dist/assets/{analytics-CBvaxOId.js → analytics-CCprAqk3.js} +0 -0
- /package/client/dist/assets/{analytics-BakymH7Z2.js → analytics-CR1TJqUi2.js} +0 -0
- /package/client/dist/assets/{analytics-B7bPj6u_2.js → analytics-DfNdXR0y2.js} +0 -0
- /package/client/dist/assets/{analytics-DZ74aQ54.js → analytics-rmHuJv0V.js} +0 -0
- /package/client/dist/assets/{apex-DlD7oJX6.js → apex-D_X_8J4d.js} +0 -0
- /package/client/dist/assets/{atom-one-dark-BrRN8wBy.js → atom-one-dark-BMDPFwRZ.js} +0 -0
- /package/client/dist/assets/{attachments-C11tOKZ_.js → attachments-BgBNSqQd.js} +0 -0
- /package/client/dist/assets/{attachments-Bnbyj2PN.js → attachments-BjyMmrwE.js} +0 -0
- /package/client/dist/assets/{attachments-CIeLa8l12.js → attachments-C9GTTJsx2.js} +0 -0
- /package/client/dist/assets/{attachments-DslHfa-L.js → attachments-DCZOL1RU.js} +0 -0
- /package/client/dist/assets/{attachments-C-gyrCOb.js → attachments-DL-bPy9E.js} +0 -0
- /package/client/dist/assets/{attachments-Cxrs0pyL2.js → attachments-DPCmkFZu2.js} +0 -0
- /package/client/dist/assets/{attachments-TTPsc0a52.js → attachments-rNn1ekRy2.js} +0 -0
- /package/client/dist/assets/{azcli-CmXFAbc-.js → azcli-PZLnZ3jH.js} +0 -0
- /package/client/dist/assets/{bat-DdNJq4hH.js → bat-KlBOxpO4.js} +0 -0
- /package/client/dist/assets/{bicep-Bppz7WOA.js → bicep-CgG9oF3V.js} +0 -0
- /package/client/dist/assets/{cameligo-0MRMdSmg.js → cameligo-6R45j6Ph.js} +0 -0
- /package/client/dist/assets/{chat-BvHrebKC2.js → chat-BgL3zv6x2.js} +0 -0
- /package/client/dist/assets/{chat-CZyiLJvQ.js → chat-Bh3NdgJs.js} +0 -0
- /package/client/dist/assets/{chat-DKYP7NnC.js → chat-Bom6bqK3.js} +0 -0
- /package/client/dist/assets/{chat-5mdg_YIc2.js → chat-DdwZjT8K2.js} +0 -0
- /package/client/dist/assets/{chat-wkTIy9rX.js → chat-Dnwg-NpQ.js} +0 -0
- /package/client/dist/assets/{chat-BpYxnkr4.js → chat-DsbwJhus.js} +0 -0
- /package/client/dist/assets/{chat-BGax2nV62.js → chat-vylxqR0P2.js} +0 -0
- /package/client/dist/assets/{clojure-B5dKj863.js → clojure-CLAAMO7J.js} +0 -0
- /package/client/dist/assets/{clsx-1dnHRn8W.js → clsx-CNmW0Nip.js} +0 -0
- /package/client/dist/assets/{coffee-DSbWjzk7.js → coffee-AruSygo-.js} +0 -0
- /package/client/dist/assets/{commands-uz_uKT242.js → commands-C4Y3C-PF2.js} +0 -0
- /package/client/dist/assets/{commands-Bb7MnPqn2.js → commands-CSDs9q_2.js} +0 -0
- /package/client/dist/assets/{commands-C_7zZwJf.js → commands-DkU0qliq.js} +0 -0
- /package/client/dist/assets/{commands-D_6B8lfU.js → commands-JWMfGDmr.js} +0 -0
- /package/client/dist/assets/{commands-DBc5llLi2.js → commands-RHOchN4n2.js} +0 -0
- /package/client/dist/assets/{commands-CQkdthjF.js → commands-u-4eEHCN.js} +0 -0
- /package/client/dist/assets/{commands-DhZNhSbl.js → commands-xHDDGfcP2.js} +0 -0
- /package/client/dist/assets/{cpp-SBF8SAh9.js → cpp-DEE5r4Pw.js} +0 -0
- /package/client/dist/assets/{csharp-Lzuq_1t-.js → csharp-BVXJUvbK.js} +0 -0
- /package/client/dist/assets/{csp-BEzxZqi1.js → csp-cXOF0JoV.js} +0 -0
- /package/client/dist/assets/{css-C3D3PKln.js → css-C_zQuAoy.js} +0 -0
- /package/client/dist/assets/{cypher-CQ3dEPmv.js → cypher-t95m_Q-O.js} +0 -0
- /package/client/dist/assets/{dart-DCPmxolI.js → dart-B4r1Tg-e.js} +0 -0
- /package/client/dist/assets/{dockerfile-B_2_aaTO.js → dockerfile-6mt7zHQw.js} +0 -0
- /package/client/dist/assets/{ecl-rADUeXsV.js → ecl-DEY_Fz_Q.js} +0 -0
- /package/client/dist/assets/{editor.api2-T7u8kQWG.js → editor.api2-C3B0tp2x.js} +0 -0
- /package/client/dist/assets/{elixir-DOd-TuJO.js → elixir-R6-q1c5t.js} +0 -0
- /package/client/dist/assets/{explore-BHEhNekP2.js → explore-B7fblXBb2.js} +0 -0
- /package/client/dist/assets/{explore-DAsroA482.js → explore-BHtEpoNN2.js} +0 -0
- /package/client/dist/assets/{explore-UwHHj2ux.js → explore-C0k8HrkN.js} +0 -0
- /package/client/dist/assets/{explore-DaXiW9-6.js → explore-CNBzrEPS.js} +0 -0
- /package/client/dist/assets/{explore-CWlAXx0f2.js → explore-D_mWBYCS2.js} +0 -0
- /package/client/dist/assets/{explore-DG1CtYqT.js → explore-Dahc1lOx.js} +0 -0
- /package/client/dist/assets/{explore-DMSGAnhK.js → explore-UvW1jEMa.js} +0 -0
- /package/client/dist/assets/{flow9-Bf7zg_j0.js → flow9-CNQvHBOt.js} +0 -0
- /package/client/dist/assets/{format-command-BHymDa4r.js → format-command-CuWuRvka.js} +0 -0
- /package/client/dist/assets/{fsharp-BqROZjbA.js → fsharp-vPZkFXwv.js} +0 -0
- /package/client/dist/assets/{go-oQTP5uLe.js → go-KUzBMYJ_.js} +0 -0
- /package/client/dist/assets/{graphql-CSHfTU3q.js → graphql-C3W0rCsD.js} +0 -0
- /package/client/dist/assets/{hcl-CeG-RoFJ.js → hcl-BOOMFSNX.js} +0 -0
- /package/client/dist/assets/{ini-B2Dv4ohc.js → ini-CFat1WJr.js} +0 -0
- /package/client/dist/assets/{integrations-CAF21FbQ.js → integrations-4KZnYECp.js} +0 -0
- /package/client/dist/assets/{integrations-CHCgning2.js → integrations-7W266oqF2.js} +0 -0
- /package/client/dist/assets/{integrations-B-JVE1_D.js → integrations-BNuauK3o.js} +0 -0
- /package/client/dist/assets/{integrations-BAujIDoE.js → integrations-CHy8tnpV.js} +0 -0
- /package/client/dist/assets/{integrations-DS5FFMes.js → integrations-Cl_wD5AI.js} +0 -0
- /package/client/dist/assets/{integrations-axZN4--n2.js → integrations-Cy8nZ_dv2.js} +0 -0
- /package/client/dist/assets/{integrations-CtsOpq2D2.js → integrations-zMqY4VU12.js} +0 -0
- /package/client/dist/assets/{java-aUDDeufb.js → java-Dee-CNAM.js} +0 -0
- /package/client/dist/assets/{julia-C5LbruO5.js → julia-CGNlLYuU.js} +0 -0
- /package/client/dist/assets/{kotlin-C6mOuSKk.js → kotlin-CY7lhknJ.js} +0 -0
- /package/client/dist/assets/{less-D5qC3caW.js → less-D0KN7hfJ.js} +0 -0
- /package/client/dist/assets/{lexon-Dr2La-fj.js → lexon-CuRJufPs.js} +0 -0
- /package/client/dist/assets/{lua-Zy6u5z6Z.js → lua-DHvH62Zf.js} +0 -0
- /package/client/dist/assets/{m3-C7XHeDz_.js → m3-tlthQ8Fo.js} +0 -0
- /package/client/dist/assets/{markdown-PiF7r-2h.js → markdown-Dbx1LgUZ.js} +0 -0
- /package/client/dist/assets/{mcp-B_nWlxZa2.js → mcp-CjVKXAhD2.js} +0 -0
- /package/client/dist/assets/{mcp-B8omp_Cd.js → mcp-Dcl-XxkR.js} +0 -0
- /package/client/dist/assets/{mcp-DTCCrYHz2.js → mcp-DtbxuH3V2.js} +0 -0
- /package/client/dist/assets/{mcp-DytBbASZ.js → mcp-H-gnQUdN.js} +0 -0
- /package/client/dist/assets/{mcp-D_oPS6Zc.js → mcp-N1nzp8oL.js} +0 -0
- /package/client/dist/assets/{mcp-Cb2jtHP72.js → mcp-XJNRfxVp2.js} +0 -0
- /package/client/dist/assets/{mcp-DPqm2C8-.js → mcp-sRmWE8WJ.js} +0 -0
- /package/client/dist/assets/{mips-nn07GiyE.js → mips-D_O3IUz_.js} +0 -0
- /package/client/dist/assets/{msdax-DaKFVMST.js → msdax-C_ZmCnRt.js} +0 -0
- /package/client/dist/assets/{mysql-C6d6xrbU.js → mysql-C-dCEYSX.js} +0 -0
- /package/client/dist/assets/{nav-Cibp2KWF.js → nav-40HzpIFb.js} +0 -0
- /package/client/dist/assets/{nav-DtTnF9xd.js → nav-8yPhBn00.js} +0 -0
- /package/client/dist/assets/{nav-Danf5sRf2.js → nav-B6PkGfTk2.js} +0 -0
- /package/client/dist/assets/{nav-Bqhyfbcj2.js → nav-BHqMLrS72.js} +0 -0
- /package/client/dist/assets/{nav-CQb9y1km.js → nav-CGy4yx3C.js} +0 -0
- /package/client/dist/assets/{nav-BAsYcqdw2.js → nav-CXEDcRdv2.js} +0 -0
- /package/client/dist/assets/{nav-BRrNlZkr.js → nav-EI_OhEAo.js} +0 -0
- /package/client/dist/assets/{objective-c-B6KMtI-k.js → objective-c-DZY9Aqxd.js} +0 -0
- /package/client/dist/assets/{pascal-DYr8MPE7.js → pascal-BVHLXoor.js} +0 -0
- /package/client/dist/assets/{pascaligo-B3pd-jJ_.js → pascaligo-XdG_6u3k.js} +0 -0
- /package/client/dist/assets/{perl-z2xUzoaL.js → perl-b9QV0BcD.js} +0 -0
- /package/client/dist/assets/{pgsql-DUvT-09-.js → pgsql-Du5FDOgT.js} +0 -0
- /package/client/dist/assets/{php-CGyOmJfy.js → php-WJD0z2Z_.js} +0 -0
- /package/client/dist/assets/{pla-CMqgvyD0.js → pla-CbciTf2w.js} +0 -0
- /package/client/dist/assets/{postiats-Dx5LUn4Z.js → postiats-C1QxmvVq.js} +0 -0
- /package/client/dist/assets/{powerquery-DazYxvJ6.js → powerquery-BEYDhPLZ.js} +0 -0
- /package/client/dist/assets/{powershell-B3nwlDka.js → powershell-CfaYw4XL.js} +0 -0
- /package/client/dist/assets/{protobuf-BGuu2u2s.js → protobuf-pwZEDOYa.js} +0 -0
- /package/client/dist/assets/{pug-Dbte1MXA.js → pug-5ftqSPVe.js} +0 -0
- /package/client/dist/assets/{qsharp-DJLwBOvG.js → qsharp-uI6qZMq4.js} +0 -0
- /package/client/dist/assets/{r-DmGBRSHj.js → r-BK54P1EG.js} +0 -0
- /package/client/dist/assets/{redis-VvUYn0a4.js → redis-DI0yd7kN.js} +0 -0
- /package/client/dist/assets/{redshift-6GdDrxg3.js → redshift-Dov26eyI.js} +0 -0
- /package/client/dist/assets/{restructuredtext-CfAB8aRU.js → restructuredtext-QqJ_1dC-.js} +0 -0
- /package/client/dist/assets/{ruby-CIYK6MXY.js → ruby-5WjveeVb.js} +0 -0
- /package/client/dist/assets/{rust-CTHZfjj9.js → rust-BzVSfqFH.js} +0 -0
- /package/client/dist/assets/{sb-CkKTdkz_.js → sb-DMIUfT-3.js} +0 -0
- /package/client/dist/assets/{scala-Bx-Wr9TM.js → scala-CSKA7lqt.js} +0 -0
- /package/client/dist/assets/{scheme-Dcfi6f83.js → scheme-CojOP2Qc.js} +0 -0
- /package/client/dist/assets/{scss-ByL-7PFQ.js → scss-DoBZGJG6.js} +0 -0
- /package/client/dist/assets/{shell-Csnb9Yqd.js → shell-YOaE4udl.js} +0 -0
- /package/client/dist/assets/{solidity-Dbw5-0QP.js → solidity-l3jSyVLu.js} +0 -0
- /package/client/dist/assets/{sophia-ZQ3saZQx.js → sophia-BhSGTaQJ.js} +0 -0
- /package/client/dist/assets/{sparql-BEtOel8u.js → sparql-qhk6QD9w.js} +0 -0
- /package/client/dist/assets/{sql-DGPDbzB7.js → sql-DoO3y21-.js} +0 -0
- /package/client/dist/assets/{st-GeW2MOgh.js → st-ChZAY8oG.js} +0 -0
- /package/client/dist/assets/{swift-BVYTN8jq.js → swift-D290Tr7_.js} +0 -0
- /package/client/dist/assets/{systemverilog-Deg2a8Lr.js → systemverilog-DsxzgJ-o.js} +0 -0
- /package/client/dist/assets/{tcl-6DnLmROF.js → tcl-BKDUHAAR.js} +0 -0
- /package/client/dist/assets/{terminal-CDiOAmBd2.js → terminal-BRm03iFA2.js} +0 -0
- /package/client/dist/assets/{terminal-CJN-mQMc.js → terminal-De2Brd23.js} +0 -0
- /package/client/dist/assets/{terminal-CYB4TiAd.js → terminal-DxQWCqSD2.js} +0 -0
- /package/client/dist/assets/{terminal-DsaDTq5N2.js → terminal-WSAvHXoU.js} +0 -0
- /package/client/dist/assets/{terminal-DTQ_dPqi2.js → terminal-Z7KsDM_n.js} +0 -0
- /package/client/dist/assets/{terminal-58ReNaya.js → terminal-cqfd3EDV.js} +0 -0
- /package/client/dist/assets/{terminal-DawP8xNL.js → terminal-xGbCZJHg.js} +0 -0
- /package/client/dist/assets/{tickets-DoRTUYRT.js → tickets-B7zT4IRf.js} +0 -0
- /package/client/dist/assets/{tickets-DBfFePwk2.js → tickets-BoXom7l8.js} +0 -0
- /package/client/dist/assets/{tickets-DvohTziT2.js → tickets-C3b8cHhd2.js} +0 -0
- /package/client/dist/assets/{tickets-Da15iaRw.js → tickets-CFXnJsYF.js} +0 -0
- /package/client/dist/assets/{tickets-CujsZvkf.js → tickets-CWYFvx1W2.js} +0 -0
- /package/client/dist/assets/{tickets-Df6pee-O2.js → tickets-DTHo9c3C.js} +0 -0
- /package/client/dist/assets/{tickets-CNvIilmP.js → tickets-SuX_HkK4.js} +0 -0
- /package/client/dist/assets/{twig-XbbXW9Yz.js → twig-UpZQaM8G.js} +0 -0
- /package/client/dist/assets/{typespec-CRlV8GhI.js → typespec-DzaKvN8i.js} +0 -0
- /package/client/dist/assets/{vb-BHE2izPH.js → vb-CZpbb7tk.js} +0 -0
- /package/client/dist/assets/{wgsl-Bf5vkfmY.js → wgsl-CNt3OIvl.js} +0 -0
|
@@ -40,17 +40,21 @@ Vague 3 : #7 (docs sur l'ensemble) ← attend #4 et #5
|
|
|
40
40
|
|
|
41
41
|
Au sein du job, les specs de chaque vague sont implémentées avant que la vague suivante ne commence. Vous ne configurez rien à la main — l'orchestrateur déduit les vagues à partir des specs elles-mêmes. Regardez-le se dérouler dans la [vue détaillée du job](the-job-detail-view) : le log en streaming raconte sur quelle spec le batch travaille, et l'en-tête de ticket affiche chaque spec touchée par le job.
|
|
42
42
|
|
|
43
|
-
## Isolation par worktree
|
|
43
|
+
## Isolation par worktree et livraison du travail
|
|
44
44
|
|
|
45
|
-
Lorsque plusieurs specs sont implémentées en une seule exécution, le pipeline garde chaque unité de travail isolée pour que les changements concurrents ou séquentiels ne piétinent pas les fichiers des autres. L'
|
|
45
|
+
Lorsque plusieurs specs sont implémentées en une seule exécution, le pipeline garde chaque unité de travail isolée pour que les changements concurrents ou séquentiels ne piétinent pas les fichiers des autres. L'implémentation de chaque spec s'exécute dans son propre **worktree git** propre — un checkout séparé qui partage l'historique de votre dépôt mais ne touche jamais votre arbre de travail pendant que l'IA travaille.
|
|
46
|
+
|
|
47
|
+
Lorsque l'exécution se termine, **rien n'est poussé et aucune pull request n'est encore ouverte**. Le travail reste commité en sécurité sur ses branches isolées, les specs passent à un nouveau statut **En relecture**, et specrails **vous demande d'abord** : une barre de décision persistante apparaît sur le rail avec **Créer la PR** — une seule pull request en brouillon à partir de la branche d'intégration désignée de votre projet (définissez-la dans **Réglages → Branche d'intégration** ; par défaut, c'est la branche par défaut de votre dépôt), combinée à travers toutes les specs du rail — et **Abandonner**. specrails **ne fusionne jamais, et ne commite jamais directement sur votre branche d'intégration** — c'est vous qui décidez si une PR existe tout court, et c'est un humain qui décide de la fusion. C'est le passage de relais sûr : specrails produit la pull request seulement quand vous le décidez, et vos ingénieurs la relisent et la fusionnent dans GitHub comme ils le font déjà.
|
|
46
48
|
|
|
47
49
|
En pratique, cela signifie :
|
|
48
50
|
|
|
49
51
|
- Chaque spec part d'une page blanche pour son implémentation, plutôt que d'hériter des modifications en cours de la spec précédente.
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
+
- Votre arbre de travail n'est jamais modifié pendant que l'exécution est en cours — rien n'est intégré tant que vous ne l'avez pas décidé.
|
|
53
|
+
- Lorsque l'exécution est terminée, les specs affichent un badge **En relecture** et le rail vous pose la question : **Créer la PR** pour ouvrir la pull request en brouillon combinée, ou **Abandonner** pour nettoyer les branches et renvoyer les specs au backlog. Si vous avez lancé le rail depuis le chat de l'agent, la même question apparaît sous forme de carte dans cette conversation — répondez à l'un ou l'autre endroit, les deux restent synchronisés.
|
|
54
|
+
- Une fois créée, **Ouvrir la PR** permet de la consulter, **Publier** l'ouvre à la relecture et la confie au processus de relecture GitHub habituel de votre équipe, et **Vérifier le merge** fait passer les specs à Terminé dès que votre équipe l'a fusionnée.
|
|
55
|
+
- Si les branches isolées ne peuvent pas être combinées proprement au moment de créer la PR, specrails s'arrête en toute sécurité et laisse les branches à un humain — il ne force jamais une fusion cassée sur votre branche de base. Vous pouvez réessayer ou abandonner depuis la même barre.
|
|
52
56
|
|
|
53
|
-
|
|
57
|
+
> Créer la PR nécessite le CLI GitHub (`gh`) authentifié et un dépôt distant configuré. Sans eux, specrails garde quand même le travail commité sur une branche à partir de laquelle vous pouvez ouvrir une pull request vous-même — rien n'est perdu, et la barre de décision vous permet de réessayer. Pour revenir à l'ancien comportement (intégrer en local au lieu de demander), définissez `SPECRAILS_RAIL_DELIVER_PR=0`.
|
|
54
58
|
|
|
55
59
|
## Multi-fonctionnalité entre projets
|
|
56
60
|
|
|
@@ -80,7 +80,7 @@ Pour exécuter un loop personnalisé :
|
|
|
80
80
|
2. Dans l'en-tête du rail, ouvrez le **sélecteur de Loop** et choisissez votre loop publié.
|
|
81
81
|
3. Appuyez sur **▶ Play**.
|
|
82
82
|
|
|
83
|
-
L'exécution se diffuse en direct dans la vue **Jobs**
|
|
83
|
+
L'exécution se diffuse en direct dans la vue **Jobs** avec les mêmes métriques et le même suivi des coûts que n'importe quel job de rail — et son log gagne un **explorateur d'étapes** dédié : une carte en direct de votre graphe avec une boîte repliable par étape, qui suit l'étape en cours à mesure que le loop avance (voir [La vue détaillée du job](the-job-detail-view)). Sur Claude, chaque **Étape IA** est aussi une session en direct : envoyez-lui des messages depuis le composeur de la vue détaillée du job pour la piloter en cours d'étape (entre les étapes, le composeur patiente brièvement, et **Régler cette étape** fait avancer le loop avec ce que l'étape a produit). Un loop qui s'arrête parce qu'il a atteint son plafond d'itérations ou de coût est rapporté avec ce résultat plutôt qu'un simple succès.
|
|
84
84
|
|
|
85
85
|
> **À savoir pendant qu'un loop s'exécute.** Vous ne pouvez pas éditer ni supprimer un loop pendant qu'une de ses exécutions est en cours — arrêtez d'abord l'exécution.
|
|
86
86
|
|
|
@@ -13,7 +13,7 @@ Le tableau propose deux modes d'affichage, basculables depuis un bouton de la ba
|
|
|
13
13
|
- **Vue post-it** (par défaut) — des tuiles façon cartes avec de courts résumés.
|
|
14
14
|
- **Vue liste** — des lignes compactes sur une seule ligne.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Le **sélecteur de statuts** de la barre d'outils affiche chaque statut sous forme de puce avec un compteur en direct — plus deux groupes intelligents : **Actives** (le défaut — tout ce qui bouge encore : brouillons, à faire, en cours et en révision) et **Tous** (tout, avec Terminé épinglé en bas). Votre choix est mémorisé par projet et reflété dans l'URL : un rafraîchissement ou un lien partagé restaure la vue exacte. Sur les projets connectés à Jira, un menu déroulant **statut Jira** supplémentaire apparaît, listant les *vrais* statuts du workflow du board (leurs noms bruts, p. ex. « Code Review », chacun avec son compteur en direct) regroupés sous l'état auquel ils correspondent — il se combine avec les puces de statut. Vous pouvez aussi filtrer par **label**, et trier par **Par défaut**, **Ticket #** ou **Priorité** (chacun avec un sens croissant/décroissant).
|
|
17
17
|
|
|
18
18
|
## Les statuts
|
|
19
19
|
|
|
@@ -24,7 +24,8 @@ Une spec traverse un petit ensemble de statuts. Le tableau donne à chacun un re
|
|
|
24
24
|
| **Brouillon** | Une idée en cours, enregistrée depuis une conversation Explore. Pas encore prête à être mise en œuvre — vous pouvez y revenir et continuer à la façonner. Affiche une pastille `Draft`. |
|
|
25
25
|
| **À faire** | Prête à être prise en charge. C'est là qu'atterrit une spec finalisée lors de sa création. |
|
|
26
26
|
| **En cours** | Le pipeline travaille actuellement dessus (un point bleu qui pulse). |
|
|
27
|
-
| **
|
|
27
|
+
| **En révision** | Implémentée — chaque exécution terminée gare ici ses specs pour votre approbation : fusionnez la PR en brouillon ou déplacez-les vous-même (une pastille ambre). |
|
|
28
|
+
| **Terminé** | Approuvée — sa PR a été fusionnée, ou vous l'avez déplacée ici vous-même (une coche verte). |
|
|
28
29
|
| **Annulé** | Abandonnée (une croix rouge). |
|
|
29
30
|
|
|
30
31
|
Les brouillons vivent dans le même groupe actif que les specs À faire — il n'y a pas de colonne séparée pour eux — mais ils arborent une bordure subtilement teintée et une pastille `Draft` pour être facilement repérables. Voir [Les brouillons et le Contract Layer](drafts-and-contract-layer.md) pour tout savoir sur les brouillons.
|
|
@@ -37,6 +37,12 @@ Un paio di garanzie tengono i costi ragionevoli: la generazione dei riepiloghi a
|
|
|
37
37
|
|
|
38
38
|
Puoi anche scegliere la **lingua dei riepiloghi** (inglese o spagnolo) nelle impostazioni globali, nell'area *Code section*.
|
|
39
39
|
|
|
40
|
+
## La storia di costruzione
|
|
41
|
+
|
|
42
|
+
Sotto il visualizzatore di codice vive la **storia di costruzione**: una linea temporale cronologica di ogni spec e di ogni job che hanno costruito il file che stai guardando. Ogni capitolo è una scheda: quale spec è intervenuta (con il suo stato attuale), quando, se il file è stato creato, modificato o eliminato, e quanto è stato grande il cambiamento (righe aggiunte e rimosse). Fai clic su una scheda per aprire il dettaglio di quella spec. Anche i rail basati sui loop registrano i file che toccano, quindi il lavoro svolto in worktree isolati compare nella storia come i normali job della pipeline.
|
|
43
|
+
|
|
44
|
+
Per qualsiasi capitolo puoi chiedere una spiegazione in linguaggio semplice: premi **Spiega questa modifica** e l'app scrive da una a tre frasi che descrivono cosa quel cambiamento specifico ha apportato al file — senza codice, senza gergo. Le spiegazioni condividono lo stesso budget mensile dei riepiloghi dei file e, finché non ne viene generata una, la scheda si affida ai fatti che conosce: il tipo di modifica, la spec e la data. Preferisci i dati grezzi? Un selettore **Storia / Registro** passa alla classica lista delle modifiche con diff su richiesta. Lo stesso pannello compare nella vista **Files** della modalità Agente.
|
|
45
|
+
|
|
40
46
|
## Collegare il codice alle spec
|
|
41
47
|
|
|
42
48
|
Il legame di provenienza funziona in entrambe le direzioni. All'interno del Code explorer, cliccare il chip di un ticket su un file apre il dettaglio di quel ticket. E dall'altro lato, la vista di **dettaglio del ticket** ha una sezione *File toccati da questo ticket* — clicca un file lì e salti dritto nel Code explorer con quel file aperto. Chiude il cerchio tra "ecco la spec che abbiamo scritto" ed "ecco il codice che ne è uscito".
|
|
@@ -7,7 +7,7 @@ Vuoi che le tue spec vivano su una vera **board Jira** invece che dentro Specrai
|
|
|
7
7
|
Specrails funge da **livello di sincronizzazione** tra Jira e il tuo progetto. L'idea di fondo: il tuo archivio locale delle spec resta l'elemento canonico che la pipeline legge, e Specrails è responsabile di mantenerlo allineato con Jira.
|
|
8
8
|
|
|
9
9
|
- Quando avvii un rail, Specrails sposta il ticket Jira collegato su **In corso**.
|
|
10
|
-
- Quando un job termina, Specrails fa transitare il ticket
|
|
10
|
+
- Quando un job termina, Specrails fa transitare il ticket: in caso di successo passa al tuo stato di **revisione** mappato e arriva su **Fatto** solo quando approvi il lavoro (il merge della PR in bozza pubblica un commento "PR merged"); in caso di fallimento torna su **Da fare** con un commento di completamento (id del job, costo e durata).
|
|
11
11
|
- Periodicamente Specrails interroga (**polling**) Jira per le modifiche apportate da chiunque sulla board e le riporta nelle tue spec.
|
|
12
12
|
|
|
13
13
|
Tutti i riscritti verso Jira passano attraverso un outbox durevole e resistente ai crash, così un'interruzione momentanea di Jira non blocca mai un job — l'aggiornamento viene semplicemente ritentato.
|
|
@@ -53,9 +53,14 @@ Le risposte arrivano fluide e già formattate (titoli, tabelle, elenchi), ciascu
|
|
|
53
53
|
|
|
54
54
|
## Dettagli pratici
|
|
55
55
|
|
|
56
|
+
- **Super spec da una conversazione.** Chiedi all’agente di *dare forma* a una spec insieme a te invece di generarla in un colpo solo: prima legge il codice reale, ti fa qualche domanda e mostra la bozza che evolve come una card dal vivo nella conversazione. Al tuo sì crea la spec e — per impostazione predefinita — la arricchisce in background con un **Contract Layer** (percorsi file esatti, forme dei dati, invarianti) perché gli agenti che implementano non improvvisino. Di’ "senza contract layer" per saltare l’arricchimento.
|
|
57
|
+
- **Clicca ciò che menziona.** In una missione fissata a un progetto, i numeri di spec (`#12`) e gli id di job/run nelle risposte dell'agente sono chip cliccabili: una spec apre il modale di dettaglio della board, un id di job apre la vista del job dal vivo. Se il riferimento non esiste più, compare una discreta nota "non trovato".
|
|
58
|
+
- **La scheda di implementazione resta in vista.** Quando l'agente implementa delle spec, una scheda dal vivo segue il lavoro — e finché ha bisogno di qualcosa da te (creare la PR, pubblicarla, riprovare, scartare) resta **fissata appena sopra la casella dei messaggi**, per quanto scorra la conversazione; al suo posto nella cronologia compare un discreto segnaposto «fissata sopra». Più schede attive si impilano come piccoli chip (cliccane uno per portarla in primo piano), e un chevron riduce la scheda a una barra sottile. Una volta pubblicata la PR — o quando il lavoro viene unito o scartato — la scheda torna al suo posto nella cronologia della conversazione.
|
|
56
59
|
- **Cronologia dei prompt.** Con la casella vuota, premi **↑**/**↓** per scorrere ciò che hai chiesto prima (mostrato attenuato mentre scorri); inizia a scrivere per modificarlo, oppure premi Invio per inviarlo.
|
|
60
|
+
- **Modifica la coda.** Hai inviato altro mentre l'agente era occupato? Finché ci sono messaggi in coda, **↑**/**↓** scorre *quelli*: la casella mostra il selezionato, lo modifichi sul posto e **Invio lo salva di nuovo in coda** (Esc annulla; la tua bozza non inviata torna com'era).
|
|
57
61
|
- **Riduci a icona, senza perdere nulla.** Clicca la ✕ per rimettere il pannello nella bolla — la conversazione continua a girare. Riaprilo e atterri sull'ultimo messaggio; nulla viene riscritto.
|
|
58
62
|
- **Nuova conversazione.** Il pulsante **+** avvia un thread pulito; la cronologia vive a livello di app, sopra qualunque singolo progetto.
|
|
63
|
+
- **Cambia missione.** Il selettore di missioni accanto al selettore di progetto elenca le conversazioni dalla più recente alla più vecchia — un punto pulsante segnala quelle in cui l'agente sta ancora lavorando, e un piccolo badge conta i messaggi in coda. La ricerca compare quando la lista supera le otto voci, e l'icona del cestino su ogni riga elimina una missione dopo una rapida conferma in linea — anche una in corso (prima avvisa, poi ferma l'agente).
|
|
59
64
|
|
|
60
65
|
## Alcune cose da sapere
|
|
61
66
|
|
|
@@ -18,7 +18,7 @@ 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**. Il rail avvia la pipeline e lavora la spec dall'inizio alla fine, direttamente nella cartella di lavoro del tuo progetto — modificando file, eseguendo test, tutto quanto.
|
|
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). Trovi più dettagli su multi-rail e batching in [Batch implement e multi-feature](batch-implement-and-multi-feature).
|
|
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. Trovi più dettagli su multi-rail e batching in [Batch implement e multi-feature](batch-implement-and-multi-feature).
|
|
22
22
|
|
|
23
23
|
## Avviare un rail su una spec
|
|
24
24
|
|
|
@@ -49,7 +49,7 @@ Un rail esegue un **Loop** — la ricetta del lavoro. Tre loop sono **integrati*
|
|
|
49
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
50
|
| **Freestyle** | Freestyle | Claude implementa ogni spec in autonomia, **bypassando** la pipeline. Un job indipendente per ogni spec. Solo Claude. |
|
|
51
51
|
|
|
52
|
-
Freestyle è il caso a sé stante: salta la catena di agenti e affida a Claude la spec grezza, lasciandolo lavorare con i suoi strumenti nativi. È a finalità aperta, quindi premendo Play si apre prima una conferma, e un selettore di modello per rail ti permette di scegliere tra Haiku / Sonnet / Opus. Compare solo quando l'engine del rail è Claude.
|
|
52
|
+
Freestyle è il caso a sé stante: salta la catena di agenti e affida a Claude la spec grezza, lasciandolo lavorare con i suoi strumenti nativi. È a finalità aperta, quindi premendo Play si apre prima una conferma, e un selettore di modello per rail ti permette di scegliere tra Haiku / Sonnet / Opus. Compare solo quando l'engine del rail è Claude. Un'esecuzione Freestyle è anche l'unico job che **resta aperto ad aspettarti**: chatta con lui dal composer del Dettaglio job e clicca **Finalize** quando sei soddisfatto (tutti gli altri job si concludono da soli).
|
|
53
53
|
|
|
54
54
|
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).
|
|
55
55
|
|
|
@@ -57,11 +57,11 @@ Oltre agli integrati, puoi **costruire i tuoi loop** — ripetere un ciclo verif
|
|
|
57
57
|
|
|
58
58
|
Ogni volta che premi Play, l'esecuzione del rail diventa un **job**. La regola più importante da fare propria:
|
|
59
59
|
|
|
60
|
-
> **
|
|
60
|
+
> **I rail girano in parallelo.** Ogni lancio isola il proprio lavoro in un worktree git per spec, quindi più rail possono girare contemporaneamente nello stesso progetto senza pestarsi i piedi — le modifiche di ogni esecuzione tornano come merge o come draft PR quando si conclude.
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
Vuoi far partire tutto insieme? Il pulsante **Lancia tutti** nell'header dei Rails avvia in un colpo solo tutte le corsie pronte, dopo un'unica conferma che inquadra il costo totale (N rail × spesa IA). I rail vuoti, già in esecuzione o in attesa di una decisione PR vengono saltati e riportati in un toast di riepilogo compatto. L'agente integrato ha lo stesso potere tramite `specrails_rails(launch_all)` — e crea un rail nuovo quando non esiste una corsia libera.
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
Solo il percorso legacy (feature Loops disattivata) ricade sulla vecchia coda un-job-alla-volta per progetto, dove i rail extra aspettano dietro quello in esecuzione. Il parallelismo tra progetti non cambia: ogni progetto resta del tutto indipendente.
|
|
65
65
|
|
|
66
66
|
Non c'è una manopola globale di concorrenza da regolare. L'unico freno automatico è basato sul budget: se hai impostato un budget giornaliero (di progetto o per tutta l'app), la coda si mette automaticamente in pausa quando la spesa della giornata raggiunge il limite.
|
|
67
67
|
|
|
@@ -73,7 +73,7 @@ Trovi ogni job in **Job**, nella barra laterale destra del progetto — un elenc
|
|
|
73
73
|
- **Filtro per intervallo di date** — restringi a una finestra temporale.
|
|
74
74
|
- **Confronta** — scegli due job e visualizzali fianco a fianco.
|
|
75
75
|
|
|
76
|
-
Clicca su una scheda qualsiasi per aprire la **vista Dettaglio job**, dove vivono il log in streaming in tempo reale e le metriche live. È la pagina successiva: [La vista Dettaglio job](the-job-detail-view).
|
|
76
|
+
Clicca su una scheda qualsiasi per aprire la **vista Dettaglio job**, dove vivono il log in streaming in tempo reale e le metriche live — e dove, sui job Claude, un composer di chat ti permette di **fare domande all'agente in esecuzione o orientarlo a metà corsa** senza fermare nulla. È la pagina successiva: [La vista Dettaglio job](the-job-detail-view).
|
|
77
77
|
|
|
78
78
|
## Annullare un job
|
|
79
79
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# La vista Dettaglio job
|
|
2
2
|
|
|
3
|
-
Clicca su una qualsiasi scheda job nella pagina **Job** e arrivi qui: la cabina di pilotaggio di una singola esecuzione di rail. È costruita attorno a una promessa — **i numeri live che vedi sono reali, mai ipotesi.** Questa pagina ti accompagna tra le fasi, le metriche live
|
|
3
|
+
Clicca su una qualsiasi scheda job nella pagina **Job** e arrivi qui: la cabina di pilotaggio di una singola esecuzione di rail. È costruita attorno a una promessa — **i numeri live che vedi sono reali, mai ipotesi.** Questa pagina ti accompagna tra le fasi, le metriche live, le schede ticket — e il composer che ti permette di **parlare con il job in esecuzione**.
|
|
4
4
|
|
|
5
5
|
## Il layout
|
|
6
6
|
|
|
7
|
-
Due pannelli stanno sopra il log completo in streaming:
|
|
7
|
+
Due pannelli stanno sopra il log completo in streaming; su un job Claude in esecuzione, un composer di chat sta sotto:
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
┌─────────────────────────────────────────────┐
|
|
@@ -15,6 +15,8 @@ Due pannelli stanno sopra il log completo in streaming:
|
|
|
15
15
|
│ │
|
|
16
16
|
│ Log in streaming (auto-scroll · ricerca · …) │
|
|
17
17
|
│ │
|
|
18
|
+
├─────────────────────────────────────────────┤
|
|
19
|
+
│ Composer (invia un messaggio al job · …) │
|
|
18
20
|
└─────────────────────────────────────────────┘
|
|
19
21
|
```
|
|
20
22
|
|
|
@@ -71,6 +73,29 @@ Sotto i pannelli c'è il log completo dell'esecuzione, trasmesso in tempo reale
|
|
|
71
73
|
|
|
72
74
|
Questa è la verità grezza di ciò che l'AI sta facendo — ogni chiamata a uno strumento, ogni modifica a un file, ogni test eseguito.
|
|
73
75
|
|
|
76
|
+
## Esecuzioni di loop: l'esploratore di passi
|
|
77
|
+
|
|
78
|
+
Quando il job è un'**esecuzione di loop** (vedi [Il Loop Builder](the-loop-builder)), il log piatto lascia il posto a un **esploratore di passi** che rispecchia la forma reale del loop:
|
|
79
|
+
|
|
80
|
+
- **La striscia di panoramica** in alto è la mappa live del loop — un chip per nodo (Passo AI, Shell, Decisore del loop…), nell'ordine in cui scorre il grafo. I chip si accendono man mano che l'esecuzione avanza: attenuati in attesa, pulsanti durante l'esecuzione, poi una spunta o una croce. Il chip di un Decisore mostra anche il verdetto con cui ha instradato — tornare indietro o proseguire — e un contatore di iterazioni (`Iterazione 3/10`) tiene il conto a destra. Clicca un chip qualsiasi per saltare dritto all'ultimo passo di quel nodo.
|
|
81
|
+
- **Una scatola richiudibile per passo.** Ogni passaggio su un nodo diventa una sezione a sé, con il numero del passo, il nome, un badge di iterazione, la durata una volta concluso — e il proprio pulsante di copia, per portarti via esattamente l'output di un passo. (La copia nella barra degli strumenti prende sempre il log intero.) Tutto ciò che viene stampato prima del primo passo — il banner di avvio, l'avviso del worktree — finisce in una sezione **Preparazione**.
|
|
82
|
+
- **La modalità segui** è attiva per default: il passo in esecuzione resta aperto e scorre da solo mentre i precedenti si ripiegano. Nel momento in cui scorri verso l'alto o apri un passo più vecchio, il seguito si mette in pausa per lasciarti leggere — una pillola flottante **Riprendi a seguire** ti riporta al live. **Espandi tutto / Comprimi tutto** vivono nella barra degli strumenti, e la ricerca cerca in tutti i passi contemporaneamente.
|
|
83
|
+
- **Anche i passi interrotti sono onesti.** Un passo che non è mai riuscito a riportare il suo esito — l'esecuzione è stata annullata o l'app si è chiusa a metà passo — viene marcato **Interrotto** con un bordo tratteggiato, invece di fingere di aver finito.
|
|
84
|
+
|
|
85
|
+
Tutto il resto di questa pagina funziona esattamente allo stesso modo per le esecuzioni di loop — le metriche live, le schede ticket, il composer. I job che non sono loop mantengono il classico log in streaming qui sopra.
|
|
86
|
+
|
|
87
|
+
## Parla con il job in esecuzione
|
|
88
|
+
|
|
89
|
+
Ogni job Claude gira di default come una **sessione live**, quindi un composer di chat sta in fondo a questa pagina — e alla modale del job in modalità missione. Usalo per fare una domanda all'agente in esecuzione («perché quel test è fallito?») o per orientarlo a metà esecuzione («salta il refactoring, concentrati sul fix»).
|
|
90
|
+
|
|
91
|
+
Alcune cose che vale la pena sapere:
|
|
92
|
+
|
|
93
|
+
- **I messaggi si accodano, non interrompono.** Invia mentre l'agente sta trasmettendo e il tuo messaggio aspetta il suo turno — viene eseguito come prompt successivo, e il job continua a seguire il suo piano. Un piccolo contatore mostra quanti messaggi sono in coda.
|
|
94
|
+
- **La riga dei totali è reale.** Il composer mostra un riepilogo live `N turni · $X`, sommato dall'uso reale di ogni turno completato — coerente con la promessa di questa pagina di non tirare mai a indovinare.
|
|
95
|
+
- **Due modi in cui una sessione finisce.** La maggior parte dei job **si conclude da sola**: nel momento in cui un turno termina senza messaggi in coda, la sessione si assesta e il job si completa — i tuoi messaggi sono guida opzionale, mai un obbligo. Un'azione discreta **Concludi ora** la chiude prima, con tutto ciò che è stato prodotto fin lì. I job **Freestyle** sono l'eccezione: restano in attesa tra un turno e l'altro finché non clicchi **Finalize** — è il loro design, una sessione botta e risposta che chiudi quando hai finito.
|
|
96
|
+
- **Nelle esecuzioni di loop i messaggi vanno al passo attivo.** Su un loop integrato o personalizzato, il tuo messaggio raggiunge il **passo AI in esecuzione in quel momento**. Tra un passo e l'altro (mentre il Loop Decider riflette, o gira un comando shell) il composer mostra un breve stato *«In attesa del prossimo passo…»* — il testo in bozza viene conservato, e l'invio si riattiva quando parte il prossimo passo AI. **Assesta questo passo** termina il passo corrente in anticipo e lascia che il loop avanzi con ciò che ha prodotto.
|
|
97
|
+
- **Solo Claude, per ora.** I job Codex e Gemini girano one-shot esattamente come prima — non compare alcun composer. (Gli operatori del server possono spegnere l'intera funzionalità con `SPECRAILS_INTERACTIVE_JOBS=false`.)
|
|
98
|
+
|
|
74
99
|
## Esportazione diagnostica
|
|
75
100
|
|
|
76
101
|
Se la [telemetria](../settings/customizing) era abilitata per il job, nell'intestazione compare un pulsante **Esporta diagnostica**. Scarica uno ZIP che contiene:
|
|
@@ -40,17 +40,21 @@ Ondata 3: #7 (docs su tutto) ← attende #4 e #5
|
|
|
40
40
|
|
|
41
41
|
All'interno del job, le spec di ogni ondata vengono implementate prima che inizi l'ondata successiva. Non lo configuri a mano — l'orchestratore ricava le ondate dalle spec stesse. Guarda tutto svolgersi nella [vista Dettaglio job](the-job-detail-view): il log in streaming racconta su quale spec sta lavorando il batch, e l'intestazione ticket mostra ogni spec toccata dal job.
|
|
42
42
|
|
|
43
|
-
## Isolamento worktree
|
|
43
|
+
## Isolamento worktree e come viene consegnato il lavoro
|
|
44
44
|
|
|
45
|
-
Quando più spec vengono implementate in un'unica esecuzione, la pipeline mantiene isolata ogni unità di lavoro, così che le modifiche concorrenti o sequenziali non si calpestino i file a vicenda. L'
|
|
45
|
+
Quando più spec vengono implementate in un'unica esecuzione, la pipeline mantiene isolata ogni unità di lavoro, così che le modifiche concorrenti o sequenziali non si calpestino i file a vicenda. L'implementazione di ogni spec viene eseguita nel suo **git worktree** pulito e dedicato — un checkout separato che condivide la cronologia del tuo repository ma non tocca mai il tuo working tree mentre l'IA lavora.
|
|
46
|
+
|
|
47
|
+
Quando l'esecuzione termina, **non viene fatto alcun push e nessuna pull request viene ancora aperta**. Il lavoro resta committato al sicuro sui suoi branch isolati, le spec passano a un nuovo stato **In revisione**, e specrails **ti chiede prima**: sul rail compare una barra di decisione persistente con **Crea PR** — un'unica pull request in bozza a partire dal ramo di integrazione designato del tuo progetto (impostalo in **Impostazioni → Ramo di integrazione**; per impostazione predefinita corrisponde al ramo predefinito del tuo repository), combinata attraverso tutte le spec del rail — e **Scarta**. specrails **non esegue mai il merge e non committa mai direttamente sul tuo ramo di integrazione** — sei tu a decidere se una PR debba esistere, e il merge resta in mano a una persona. È la consegna sicura: specrails produce la pull request solo quando lo decidi tu, e i tuoi sviluppatori la revisionano e la fondono su GitHub come già fanno.
|
|
46
48
|
|
|
47
49
|
In pratica questo significa:
|
|
48
50
|
|
|
49
|
-
- Ogni spec
|
|
50
|
-
-
|
|
51
|
-
-
|
|
51
|
+
- Ogni spec ottiene una tabula rasa su cui implementare, invece di ereditare a metà corsa le modifiche ancora in corso della spec precedente.
|
|
52
|
+
- Il tuo working tree non viene mai modificato mentre l'esecuzione è in corso — nulla viene applicato finché non sei tu a dirlo.
|
|
53
|
+
- Quando l'esecuzione è terminata le spec mostrano un badge **In revisione** e il rail ti pone la domanda: **Crea PR** per aprire la pull request in bozza combinata, oppure **Scarta** per ripulire i branch e riportare le spec nel backlog. Se hai lanciato il rail dalla chat dell'agente, la stessa domanda compare come card in quella conversazione — rispondi in uno qualsiasi dei due posti, restano sincronizzati.
|
|
54
|
+
- Una volta creata, **Apri PR** la visualizza, **Pubblica** la apre alla revisione e la affida alla normale revisione GitHub del tuo team, e **Verifica merge** porta le spec a Fatto non appena il tuo team l'ha fusa.
|
|
55
|
+
- Se i branch isolati non possono essere combinati in modo pulito quando crei la PR, specrails si ferma in sicurezza e lascia i branch a una persona — non forza mai un merge rotto sul tuo ramo base. Dalla stessa barra puoi riprovare o scartare.
|
|
52
56
|
|
|
53
|
-
|
|
57
|
+
> Creare la PR richiede la GitHub CLI (`gh`) autenticata e un remote configurato. Senza di essi, specrails mantiene comunque il lavoro committato su un branch da cui puoi aprire tu stesso una pull request — non si perde nulla, e la barra di decisione ti permette di riprovare. Per tornare al comportamento precedente (integrazione in locale invece di chiedere), imposta `SPECRAILS_RAIL_DELIVER_PR=0`.
|
|
54
58
|
|
|
55
59
|
## Multi-feature tra progetti
|
|
56
60
|
|
|
@@ -80,7 +80,7 @@ Per eseguire un loop personalizzato:
|
|
|
80
80
|
2. Nell'header del rail, apri il **selettore Loop** e scegli il tuo loop pubblicato.
|
|
81
81
|
3. Premi **▶ Play**.
|
|
82
82
|
|
|
83
|
-
L'esecuzione scorre dal vivo nella vista **Jobs**
|
|
83
|
+
L'esecuzione scorre dal vivo nella vista **Jobs** con le stesse metriche e lo stesso tracciamento del costo di qualsiasi job di rail — e il suo log guadagna un **esploratore di passi** dedicato: una mappa live del tuo grafo con una scatola richiudibile per passo, che segue il passo in esecuzione man mano che il loop avanza (vedi [La vista Dettaglio job](the-job-detail-view)). Su Claude, ogni **Passo AI** è anche una sessione live: mandagli messaggi dal composer del Dettaglio job per orientarlo a metà passo (tra un passo e l'altro il composer attende brevemente, e **Assesta questo passo** fa avanzare il loop con ciò che il passo ha prodotto). Un loop che si ferma perché ha raggiunto il suo tetto di iterazioni o di costo viene riportato con quell'esito anziché con un semplice successo.
|
|
84
84
|
|
|
85
85
|
> **Attenzione mentre un loop gira.** Non puoi modificare o eliminare un loop mentre una delle sue esecuzioni è in corso — ferma prima l'esecuzione.
|
|
86
86
|
|
|
@@ -13,7 +13,7 @@ La board ha due modalità di visualizzazione, che si alternano con un toggle nel
|
|
|
13
13
|
- **Vista post-it** (quella predefinita) — riquadri in stile card con brevi riepiloghi.
|
|
14
14
|
- **Vista elenco** — righe compatte su una sola riga.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Il **selettore di stati** della toolbar mostra ogni stato come chip dedicato con un conteggio in tempo reale — più due gruppi intelligenti: **Attive** (il predefinito — tutto ciò che è ancora in movimento: bozze, da fare, in corso e in revisione) e **Tutti** (tutto, con Completato fissato in fondo). La scelta viene ricordata per progetto e riflessa nell'URL, così un refresh o un link condiviso ripristina esattamente la stessa vista. Nei progetti collegati a Jira compare in più un menu a tendina **stato Jira**, che elenca gli stati *reali* del workflow della board (i nomi grezzi, es. "Code Review", ciascuno con il proprio conteggio in tempo reale) raggruppati sotto lo stato a cui mappano — si combina con i chip di stato. Puoi anche filtrare per **etichetta**, oltre a ordinare per **Predefinito**, **Ticket #** o **Priorità** (ciascuno con un toggle crescente/decrescente).
|
|
17
17
|
|
|
18
18
|
## Stati
|
|
19
19
|
|
|
@@ -24,7 +24,8 @@ Una spec attraversa un piccolo insieme di stati. La board associa a ciascuno un
|
|
|
24
24
|
| **Bozza** | Un'idea in corso salvata da una conversazione in modalità Explore. Non ancora pronta da realizzare — puoi tornarci e continuare a darle forma. Mostra un badge `Draft`. |
|
|
25
25
|
| **Da fare** | Pronta per essere presa in carico. È qui che atterra una spec finita quando la crei. |
|
|
26
26
|
| **In corso** | La pipeline ci sta lavorando in questo momento (un punto blu pulsante). |
|
|
27
|
-
| **
|
|
27
|
+
| **In revisione** | Implementata — ogni esecuzione conclusa parcheggia qui le sue spec per la tua approvazione: fai il merge della PR in bozza o spostale tu stesso (un badge ambra). |
|
|
28
|
+
| **Completato** | Approvata — la sua PR è stata unita, o l'hai spostata qui tu stesso (un segno di spunta verde). |
|
|
28
29
|
| **Annullato** | Abbandonata (una X rossa). |
|
|
29
30
|
|
|
30
31
|
Le bozze vivono nello stesso gruppo attivo delle spec Da fare — non c'è una colonna separata per loro — ma hanno un bordo dalla tinta sottile e un badge `Draft` che le rende facili da individuare. Consulta [Le bozze e il Contract Layer](drafts-and-contract-layer.md) per tutta la storia sulle bozze.
|
|
@@ -37,6 +37,12 @@
|
|
|
37
37
|
|
|
38
38
|
また、グローバル設定の*Code section*の領域で、**要約の言語**(英語またはスペイン語)を選べます。
|
|
39
39
|
|
|
40
|
+
## 構築ストーリー
|
|
41
|
+
|
|
42
|
+
コードビューアの下には**構築ストーリー**があります。いま見ているファイルを築き上げた、すべてのスペックとジョブを時系列に並べたタイムラインです。各章はカードになっており、どのスペックが介入したか(現在のステータス付き)、いつ、ファイルが作成・変更・削除されたのか、そして変更の規模(追加・削除された行数)が分かります。カードをクリックすると、そのスペックの詳細が開きます。ループベースのレールもファイルへの変更を記録するので、分離されたワークツリーで行われた作業も通常のパイプラインジョブと同じようにストーリーに現れます。
|
|
43
|
+
|
|
44
|
+
どの章でも、分かりやすい言葉での説明を求められます。**この変更を説明**を押すと、その具体的な変更がこのファイルに何をもたらしたのかを、アプリが 1〜3 文で書いてくれます。コードも専門用語もありません。説明はファイル要約と同じ月間予算を共有し、まだ生成されていない間は、カードは把握している事実 — 変更の種類、スペック、日付 — に正直にとどまります。生データが好みなら、**ストーリー / ログ**の切り替えで、オンデマンドの diff 付きのクラシックな変更履歴リストに切り替えられます。同じパネルはエージェントモードの **Files** ペインにも表示されます。
|
|
45
|
+
|
|
40
46
|
## コードをスペックへ結びつける
|
|
41
47
|
|
|
42
48
|
来歴のリンクは双方向に機能します。Code エクスプローラーの中で、ファイル上のチケットチップをクリックすると、そのチケットの詳細が開きます。逆方向では、**チケット詳細**ビューに*このチケットが変更したファイル*セクションがあり — そこでファイルをクリックすると、そのファイルが開いた状態の Code エクスプローラーへ直接ジャンプします。「これが私たちの書いたスペック」と「これがそこから生まれたコード」の間のループを、きちんと閉じてくれます。
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
Specrails は、Jira とプロジェクトのあいだの**同期レイヤー**として動きます。大きな考え方はこうです。パイプラインが読み込む正本はあくまでローカルのスペックストアであり、それと Jira を一致させ続ける責任を Specrails が担います。
|
|
8
8
|
|
|
9
9
|
- レールを起動すると、Specrails はリンクされた Jira の課題を **In Progress** に移動します。
|
|
10
|
-
- ジョブが終わると、Specrails
|
|
10
|
+
- ジョブが終わると、Specrails は課題を遷移させます。成功した場合はマッピングされた**レビュー**ステータスへ移り、作業を承認して初めて **Done** に到達します(ドラフト PR をマージすると「PR merged」コメントが投稿されます)。失敗した場合は **To Do** へ戻り、ジョブ ID・コスト・所要時間を含む完了コメントが投稿されます。
|
|
11
11
|
- Specrails は定期的に Jira を**ポーリング**し、ボード上で誰かが行った変更を取り込んで、スペックに反映します。
|
|
12
12
|
|
|
13
13
|
すべての書き戻しは、耐久性があってクラッシュに強いアウトボックスを通ります。そのため、一時的な Jira の不調がジョブを壊すことはなく、更新は再試行されるだけです。
|
|
@@ -53,9 +53,14 @@ Agent Chat は組み込みの **Specrails MCP サーバー**を通じてアプ
|
|
|
53
53
|
|
|
54
54
|
## 気の利いた工夫
|
|
55
55
|
|
|
56
|
+
- **会話からスーパースペックを。** 一発生成ではなく、エージェントと一緒にスペックを*磨き上げて*みてください。まず実際のコードを読み、手短に質問し、進化していく下書きを会話内のライブカードとして表示します。あなたが承認するとスペックを作成し、デフォルトでバックグラウンドの **Contract Layer**(正確なファイルパス、データ形状、不変条件)で充実させるため、実装エージェントが即興に頼ることがなくなります。「contract layer なし」と言えば省略できます。
|
|
57
|
+
- **言及されたものをクリック。** プロジェクトに固定されたミッションでは、エージェントの返信内のスペック番号(`#12`)やジョブ/実行の id はクリック可能なチップです——スペックはボードの詳細モーダルを、ジョブ id はライブのジョブビューを開きます。参照がもう存在しない場合は、控えめな「見つかりません」の通知が表示されます。
|
|
58
|
+
- **実装カードは常に見える位置に。** エージェントがスペックを実装すると、ライブカードが作業を追跡します——あなたの判断(PR の作成、公開、再試行、破棄)を待っている間、カードは会話がどれだけスクロールしても**メッセージ欄のすぐ上にピン留め**されたままです。履歴上の元の位置には「上部にピン留め中」の控えめなマーカーが表示されます。複数のカードがアクティブな場合は小さなチップとして積み重なり(クリックで前面に表示)、シェブロンでカードを細いバーに最小化できます。PR が公開されるか、作業がマージまたは破棄されると、カードは会話履歴の元の位置に戻ります。
|
|
56
59
|
- **プロンプト履歴。** 入力欄が空のとき、**↑**/**↓** を押すと以前に頼んだ内容をたどれます(スクロール中は薄く表示されます)。入力を始めれば編集でき、Enter で送信できます。
|
|
60
|
+
- **キューを編集。** エージェントが作業中にさらに送信しましたか?メッセージがキューにある間、**↑**/**↓** は*それら*の間を移動します——入力欄に選択したメッセージが表示され、その場で編集でき、**Enter でキューへ保存し直せます**(Esc でキャンセル。未送信の下書きはそのまま戻ってきます)。
|
|
57
61
|
- **最小化しても失わない。** ✕ をクリックするとパネルはバブルへ戻ります——会話はそのまま動き続けます。開き直すと最新のメッセージに着地します。何も打ち直す必要はありません。
|
|
58
62
|
- **新しい会話。** **+** ボタンでまっさらなスレッドを始めます。履歴はアプリ全体にわたって存在し、個々のプロジェクトの上位にあります。
|
|
63
|
+
- **ミッションの切り替え。** プロジェクトセレクターの隣にあるミッションセレクターは、会話を新しい順に一覧表示します — 点滅するドットはエージェントがまだ作業中の会話を示し、小さなバッジはキュー内のメッセージ数を表します。リストが 8 件を超えると検索欄が現れます。各行のゴミ箱アイコンは、行内のクイック確認のあとにミッションを削除します — 実行中のものでも可能です(先に警告し、その後エージェントを停止します)。
|
|
59
64
|
|
|
60
65
|
## 知っておくとよいこと
|
|
61
66
|
|
|
@@ -18,7 +18,7 @@ SpecsBoard(左) レール(右)
|
|
|
18
18
|
|
|
19
19
|
レールは**実行レーン**です。SpecsBoard からスペックカードをレールにドラッグし、**▶ Play** を押します。するとレールがパイプラインを起動し、あなたのプロジェクトの作業ディレクトリの中で、ファイルの編集やテストの実行まで含めて、スペックを最初から最後までやり遂げます。
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
レールは複数持てるので、名前付きのレーンとして作業を整理できます(いま集中している機能用のレールと、その後ろに控えさせておくレールといった具合に)。レールは**動的**です。レールヘッダーの **+ 追加** ボタンで新しいレーンを作成でき(1 プロジェクトあたり最大 12 本)、空のアイドルなレーンは削除できます。すべてのレールはサーバーに裏付けられているので、レーンの構成はリロード後も保持され、モバイルコンパニオンやアプリ内エージェントからも見えます — レーンがすべて塞がっているときは、エージェントが自分でレールを作ることさえできます。複数レールやバッチ処理については [バッチ実装とマルチフィーチャー](batch-implement-and-multi-feature) で詳しく説明します。
|
|
22
22
|
|
|
23
23
|
## スペックでレールを起動する
|
|
24
24
|
|
|
@@ -49,7 +49,7 @@ SpecsBoard(左) レール(右)
|
|
|
49
49
|
| **Batch** | `/specrails:batch-implement` | レール上のスペックを、依存関係を考慮したウェーブで順番に処理する 1 つのジョブ。関連する複数のスペックに最適です。 |
|
|
50
50
|
| **Freestyle** | Freestyle | Claude が各スペックをパイプラインを**バイパス**して自律的に実装します。スペックごとに独立したジョブが 1 つずつ作られます。Claude 専用。 |
|
|
51
51
|
|
|
52
|
-
Freestyle は少し毛色が違います。エージェントチェーンを飛ばし、生のスペックを Claude に渡してネイティブツールで作業させます。自由度が高いぶん、Play を押すとまず確認ダイアログが開き、レールごとのモデルピッカーで Haiku / Sonnet / Opus を選べます。Freestyle はレールのエンジンが Claude
|
|
52
|
+
Freestyle は少し毛色が違います。エージェントチェーンを飛ばし、生のスペックを Claude に渡してネイティブツールで作業させます。自由度が高いぶん、Play を押すとまず確認ダイアログが開き、レールごとのモデルピッカーで Haiku / Sonnet / Opus を選べます。Freestyle はレールのエンジンが Claude のときだけ表示されます。さらに Freestyle の実行は、**あなたを待って開き続ける**唯一のジョブでもあります。ジョブ詳細のコンポーザーから会話し、満足したら **Finalize** をクリックしてください(それ以外のジョブはすべて自分で締めくくります)。
|
|
53
53
|
|
|
54
54
|
組み込みのほかにも、**自分だけの Loop を作る** ことができます — verify → fix → verify のサイクルを目標が達成されるまで繰り返したり、AI ステップの間にシェルコマンドを連ねたり、さらにいろいろなことができます。そうしたカスタム Loop は同じ Loop ピッカーに表示されます。それが次の大きなアイデア、[Loop Builder](the-loop-builder) です。
|
|
55
55
|
|
|
@@ -57,11 +57,11 @@ Freestyle は少し毛色が違います。エージェントチェーンを飛
|
|
|
57
57
|
|
|
58
58
|
Play を押すたびに、そのレールの実行は **ジョブ** になります。ぜひ頭に入れておいてほしい一番大事なルールがこれです。
|
|
59
59
|
|
|
60
|
-
>
|
|
60
|
+
> **レールは並列に実行されます。** すべての起動は作業をスペックごとの git worktree に隔離するので、同じプロジェクト内でも複数のレールを同時に走らせて衝突することはありません — 各実行の変更は、完了時にマージまたはドラフト PR として戻ってきます。
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
すべてを一斉に動かしたいときは、レールヘッダーの **すべて起動** ボタンが準備完了のレーンをまとめて起動します。確認は 1 回だけで、そこで総コスト(レール数 × AI 支出)が提示されます。空のレール、実行中のレール、PR の判断待ちのレールはスキップされ、コンパクトなサマリートーストで報告されます。アプリ内エージェントも `specrails_rails(launch_all)` で同じことができ、空きレーンがなければ自分で新しいレールを作ります。
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
旧来の 1 プロジェクト 1 ジョブのキューに戻るのは、レガシー経路(Loops 機能を無効化した場合)だけです。その場合、追加のレールは実行中のレールの後ろで待機します。プロジェクトをまたぐ並列性は従来どおりで、各プロジェクトは完全に独立しています。
|
|
65
65
|
|
|
66
66
|
調整できるグローバルな同時実行のつまみはありません。唯一の自動スロットルは予算ベースのものです。1 日の予算(プロジェクト単位またはアプリ全体)を設定していれば、その日の支出が上限に達した時点でキューが自動的に一時停止します。
|
|
67
67
|
|
|
@@ -73,7 +73,7 @@ Play を押すたびに、そのレールの実行は **ジョブ** になりま
|
|
|
73
73
|
- **日付範囲フィルター** — 期間で絞り込みます。
|
|
74
74
|
- **比較** — 2 つのジョブを選んで並べて表示します。
|
|
75
75
|
|
|
76
|
-
どれかのカードをクリックすると **ジョブ詳細ビュー**
|
|
76
|
+
どれかのカードをクリックすると **ジョブ詳細ビュー** が開きます。ここにライブのストリーミングログとライブのメトリクスがあり、Claude のジョブならチャットコンポーザーから、何も止めずに**実行中のエージェントへ質問したり、途中で舵取りしたり**できます。それが次のページ、[ジョブ詳細ビュー](the-job-detail-view) です。
|
|
77
77
|
|
|
78
78
|
## ジョブをキャンセルする
|
|
79
79
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# ジョブ詳細ビュー
|
|
2
2
|
|
|
3
|
-
**ジョブ** ページでどれかのジョブカードをクリックすると、ここにたどり着きます。1 回のレール実行のためのコックピットです。このビューはたった 1 つの約束を軸に作られています — **あなたが目にするライブの数値は本物であり、決して推測ではありません。**
|
|
3
|
+
**ジョブ** ページでどれかのジョブカードをクリックすると、ここにたどり着きます。1 回のレール実行のためのコックピットです。このビューはたった 1 つの約束を軸に作られています — **あなたが目にするライブの数値は本物であり、決して推測ではありません。** このページでは、フェーズ、ライブメトリクス、チケットカード、そして**実行中のジョブと会話できる**コンポーザーをひととおり見ていきます。
|
|
4
4
|
|
|
5
5
|
## レイアウト
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
ストリーミングログ全体の上に 2 つのパネルが並び、実行中の Claude ジョブではその下にチャットコンポーザーが表示されます。
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
┌─────────────────────────────────────────────┐
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
│ │
|
|
16
16
|
│ ストリーミングログ (自動スクロール · 検索 · …) │
|
|
17
17
|
│ │
|
|
18
|
+
├─────────────────────────────────────────────┤
|
|
19
|
+
│ コンポーザー (ジョブにメッセージを送る · …) │
|
|
18
20
|
└─────────────────────────────────────────────┘
|
|
19
21
|
```
|
|
20
22
|
|
|
@@ -71,6 +73,29 @@ Architect ──► Developer ──► Reviewer ──► Ship
|
|
|
71
73
|
|
|
72
74
|
これは AI が何をしているかの生の真実です — すべてのツール呼び出し、すべてのファイル編集、すべてのテスト実行が映ります。
|
|
73
75
|
|
|
76
|
+
## Loop の実行: ステップエクスプローラー
|
|
77
|
+
|
|
78
|
+
ジョブが **Loop の実行**([Loop Builder](the-loop-builder) を参照)の場合、フラットなログの代わりに、Loop の実際の形をなぞる**ステップエクスプローラー**が表示されます。
|
|
79
|
+
|
|
80
|
+
- 上部の**オーバービューストリップ**は Loop のライブマップです — ノードごとにひとつのチップ(AI ステップ、シェル、ループ判定…)が、グラフの流れる順に並びます。チップは実行の進行に合わせて灯っていきます: 待機中は薄く、実行中は脈動し、終わればチェックかバツが付きます。判定ノードのチップには実際に採った裁定 — ループに戻るか、先へ進むか — も表示され、右側の反復カウンター(`反復 3/10`)が回数を刻みます。チップをクリックすると、そのノードの最新のステップへ直接ジャンプします。
|
|
81
|
+
- **ステップごとに折りたたみ可能なボックス。** ノードを通るたびにそれぞれ独立したセクションになり、ステップ番号、名前、反復バッジ、完了後の所要時間 — さらに専用のコピーボタンが付くので、ひとつのステップの出力だけを正確に持ち出せます。(ツールバーのコピーは従来どおりログ全体を対象にします。)最初のステップより前に出力されたもの — 実行バナーや worktree の通知 — は**セットアップ**セクションにまとめられます。
|
|
82
|
+
- **追従モード**はデフォルトでオンです: 実行中のステップは開いたまま自動スクロールし、前のステップは折りたたまれて道を空けます。上へスクロールしたり古いステップを開いたりした瞬間、読めるように追従は一時停止します — フローティングの**追従を再開**ピルでライブに戻れます。**すべて展開 / すべて折りたたむ**はツールバーにあり、検索ボックスに入力するとすべてのステップを横断して検索します。
|
|
83
|
+
- **中断されたステップも誠実です。** 結果を報告できないまま終わったステップ — 実行がキャンセルされた、あるいはステップの途中でアプリが落ちた — は、終わったふりをせず、破線の枠で**中断**と印付けされます。
|
|
84
|
+
|
|
85
|
+
このページのそれ以外はすべて、Loop の実行でもまったく同じに動きます — ライブメトリクス、チケットカード、コンポーザー。Loop ではないジョブは、上の従来のストリーミングログのままです。
|
|
86
|
+
|
|
87
|
+
## 実行中のジョブと会話する
|
|
88
|
+
|
|
89
|
+
すべての Claude ジョブはデフォルトで**ライブセッション**として実行されるため、このページの下部 — そしてミッションモードのジョブモーダルの下部 — にチャットコンポーザーが表示されます。実行中のエージェントに質問したり(「あのテストはなぜ失敗した?」)、実行の途中で方向を示したり(「リファクタは飛ばして、修正に集中して」)するのに使えます。
|
|
90
|
+
|
|
91
|
+
知っておくと便利なポイント:
|
|
92
|
+
|
|
93
|
+
- **メッセージはキューに入り、割り込みません。** エージェントがストリーミング中に送信しても、メッセージは順番を待ちます — 次のプロンプトとして実行され、ジョブは自分の計画を進め続けます。小さなカウンターが、待機中のメッセージ数を表示します。
|
|
94
|
+
- **合計の行は本物です。** コンポーザーはライブの `N ターン · $X` サマリーを表示します。完了した各ターンの実際の使用量を合算したもので、このページの「推測しない」という約束と一貫しています。
|
|
95
|
+
- **セッションの終わり方は 2 通り。** ほとんどのジョブは**自分で締めくくります**。キューにメッセージが残っていない状態でターンが終わった瞬間、セッションは自ら落ち着き、ジョブは完了します — あなたのメッセージは任意の舵取りであって、義務ではありません。控えめな**今すぐ締めくくる**アクションで、それまでの成果を保ったまま早めに終わらせることもできます。**Freestyle** ジョブだけは例外です。ターンの合間で待機し、あなたが **Finalize** をクリックするまで開き続けます — あなたが閉じる往復のセッション、それが Freestyle の設計です。
|
|
96
|
+
- **Loop 実行では、メッセージはアクティブなステップに届きます。** 組み込みでもカスタムでも、Loop 上ではメッセージは**いままさに実行中の AI ステップ**に届きます。ステップの合間(Loop Decider が考えている間や、シェルコマンドの実行中)には、コンポーザーは*「次のステップを待っています…」*という短い待機状態を表示します — 下書きのテキストは保持され、次の AI ステップが始まると送信が再び有効になります。**このステップを確定**すると現在のステップを早めに終わらせ、その成果とともに Loop を先へ進められます。
|
|
97
|
+
- **今のところ Claude のみ。** Codex と Gemini のジョブは従来どおりワンショットで実行されます — コンポーザーは表示されません。(サーバー運用者は `SPECRAILS_INTERACTIVE_JOBS=false` で機能全体を無効化できます。)
|
|
98
|
+
|
|
74
99
|
## 診断のエクスポート
|
|
75
100
|
|
|
76
101
|
そのジョブで [テレメトリ](../settings/customizing) が有効になっていた場合、ヘッダーに **診断をエクスポート** ボタンが表示されます。クリックすると次のものを含む ZIP がダウンロードされます。
|
|
@@ -40,17 +40,21 @@
|
|
|
40
40
|
|
|
41
41
|
ジョブ内では、各ウェーブのスペックが実装されてから次のウェーブが始まります。これを手で設定する必要はありません — オーケストレーターがスペックそのものからウェーブを導き出します。その様子は [ジョブ詳細ビュー](the-job-detail-view) で見られます。ストリーミングログがバッチがいまどのスペックに取り組んでいるかを語り、チケットヘッダーがジョブの触れたすべてのスペックを表示します。
|
|
42
42
|
|
|
43
|
-
##
|
|
43
|
+
## ワークツリーの隔離と成果物の届け方
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
複数のスペックを 1 回の実行で実装するとき、パイプラインは各作業単位を隔離し、同時または逐次の変更が互いのファイルを踏み荒らさないようにします。各スペックの実装は、それ専用のクリーンな **git ワークツリー** の中で走ります — これはリポジトリの履歴を共有しつつも、AI が作業している間はあなたのワークツリーには一切触れない、独立したチェックアウトです。
|
|
46
|
+
|
|
47
|
+
実行が終わっても、**何もプッシュされず、プルリクエストもまだ開かれません**。成果は隔離された各ブランチに安全にコミットされたまま残り、スペックは新しい **レビュー中(On review)** ステータスへ移り、specrails が **まずあなたに尋ねます**。レール上に常設の決定バーが現れ、**PR を作成** — プロジェクトで指定した統合ブランチ(**設定 → 統合ブランチ** で指定します。既定ではリポジトリのデフォルトブランチになります)を起点に、レール上のすべてのスペックをまとめた 1 つのドラフトのプルリクエストを開く — と **破棄** の選択肢を提示します。specrails が **マージすることはなく、統合ブランチへ直接コミットすることもありません** — そもそも PR を作るかどうかを決めるのはあなたであり、マージの責任は人間が持ちます。これは安全な引き渡しです。specrails はあなたが承認したときにだけプルリクエストを用意し、あなたのエンジニアがふだんどおり GitHub でレビューしてマージします。
|
|
46
48
|
|
|
47
49
|
実際のところ、これは次を意味します。
|
|
48
50
|
|
|
49
51
|
- 各スペックは、前のスペックの進行中の編集を途中から引き継ぐのではなく、まっさらな状態から実装に取りかかれます。
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
+
- 実行中にあなたのワークツリーが変更されることはありません — あなたが承認するまで、何も反映されません。
|
|
53
|
+
- 実行が終わると、スペックに **レビュー中** のバッジが付き、レールがあなたに問いかけます。**PR を作成** でまとめられたドラフトのプルリクエストを開くか、**破棄** でブランチを片付けてスペックをバックログへ戻します。レールをエージェントチャットから起動していた場合は、同じ質問がその会話の中にカードとして現れます — どちらで答えても、両者は同期し続けます。
|
|
54
|
+
- 作成後は、**PR を開く** で内容を確認し、**公開** でチームのレビューに公開してふだんどおりの GitHub レビューへ引き渡し、**マージを確認** で、チームがマージを終えた時点でスペックが完了(Done)へ切り替わります。
|
|
55
|
+
- PR の作成時に隔離されたブランチをきれいに統合できない場合、specrails は安全に停止し、ブランチを人間のために残します — 壊れたマージをベースへ無理やり押し込むことは決してありません。同じバーから再試行も破棄もできます。
|
|
52
56
|
|
|
53
|
-
|
|
57
|
+
> PR を作成するには、認証済みの GitHub CLI(`gh`)とリモートの設定が必要です。それらがなくても、成果はあなた自身がプルリクエストを開けるブランチへコミットされたまま残ります — 何も失われませんし、決定バーから再試行できます。以前の挙動(尋ねずにローカルで統合する)に戻すには、`SPECRAILS_RAIL_DELIVER_PR=0` を設定してください。
|
|
54
58
|
|
|
55
59
|
## プロジェクトをまたいだマルチフィーチャー
|
|
56
60
|
|
|
@@ -80,7 +80,7 @@ Loop は最初は **Draft** です。グラフが有効になったら **Publish
|
|
|
80
80
|
2. レールヘッダーで **Loop ピッカー** を開き、公開したあなたの Loop を選びます。
|
|
81
81
|
3. **▶ Play** を押します。
|
|
82
82
|
|
|
83
|
-
実行は **ジョブ**
|
|
83
|
+
実行は **ジョブ** ビューで、他のレールジョブと同じメトリクスとコストトラッキングとともにライブでストリーミングされます — さらにそのログには専用の**ステップエクスプローラー**が付きます。グラフのライブマップの下にステップごとの折りたたみボックスが並び、Loop が進むにつれて実行中のステップを追従します([ジョブ詳細ビュー](the-job-detail-view) を参照)。Claude では各 **AI ステップ**もライブセッションです。ジョブ詳細のコンポーザーからメッセージを送ってステップの途中で舵取りできます(ステップの合間はコンポーザーが少し待機し、**このステップを確定**すればその成果とともに Loop が先へ進みます)。反復回数やコストの上限に達して停止した Loop は、ただの成功ではなく、その結果とともに報告されます。
|
|
84
84
|
|
|
85
85
|
> **Loop の実行中の注意点。** いずれかの実行が動いている間は、その Loop を編集したり削除したりできません — 先に実行を止めてください。
|
|
86
86
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
- **付箋表示**(デフォルト)— 短い概要が添えられたカード形式のタイル。
|
|
14
14
|
- **リスト表示** — 1 行ずつのコンパクトな表示。
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
ツールバーの**ステータスセレクター**は、各ステータスをライブカウント付きの独立したチップとして表示します。さらに 2 つのスマートグループがあります:**アクティブ**(デフォルト — まだ動いているものすべて:下書き、Todo、進行中、レビュー中)と**すべて**(全部を表示し、完了は一番下に固定)。選択はプロジェクトごとに記憶され URL にも反映されるため、リロードや共有リンクでもまったく同じビューが復元されます。Jira に接続したプロジェクトでは、さらに **Jira ステータス**のドロップダウンが現れ、ボードの*実際の*ワークフローステータス(生の名前、例:「Code Review」、それぞれライブカウント付き)を、対応する状態ごとにグループ化して一覧します — ステータスチップと組み合わせて使えます。さらに**ラベル**で絞り込んだり、**デフォルト**・**チケット #**・**優先度**で並べ替えたり(それぞれ昇順/降順を切り替え可能)できます。
|
|
17
17
|
|
|
18
18
|
## ステータス
|
|
19
19
|
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
| **下書き** | Explore の会話から保存した、作りかけのアイデア。まだ実装の準備はできていません。あとから戻ってきて、引き続き形にしていけます。`Draft` のピルが表示されます。 |
|
|
25
25
|
| **Todo** | これから着手できる状態。スペックを作り終えると、ここに着地します。 |
|
|
26
26
|
| **進行中** | パイプラインが現在作業中です(青い点が点滅します)。 |
|
|
27
|
-
|
|
|
27
|
+
| **レビュー中** | 実装済み — 実行が終わるとスペックはここで承認待ちになります。ドラフト PR をマージするか、自分で先へ移動してください(琥珀色のピル)。 |
|
|
28
|
+
| **完了** | 承認済み — PR がマージされたか、自分でここへ移動しました(緑のチェックマーク)。 |
|
|
28
29
|
| **キャンセル** | 取りやめになりました(赤い X)。 |
|
|
29
30
|
|
|
30
31
|
下書きは Todo のスペックと同じアクティブな枠に並びます(専用の列はありません)が、ほんのり色づいたボーダーと `Draft` ピルが付いているので、すぐに見分けられます。下書きについての詳しい話は[下書きと Contract Layer](drafts-and-contract-layer.md)をご覧ください。
|
|
@@ -37,6 +37,12 @@ Algumas salvaguardas mantêm os custos sob controlo: a geração de resumos corr
|
|
|
37
37
|
|
|
38
38
|
Pode também escolher o **idioma do resumo** (inglês ou espanhol) nas definições globais, na área da *secção Code*.
|
|
39
39
|
|
|
40
|
+
## A história de construção
|
|
41
|
+
|
|
42
|
+
Por baixo do visualizador de código vive a **história de construção** — uma linha do tempo cronológica de cada spec e cada job que construíram o ficheiro que estás a ver. Cada capítulo é um cartão: que spec interveio (com o seu estado atual), quando, se o ficheiro foi criado, modificado ou eliminado, e o tamanho da mudança (linhas adicionadas e removidas). Clica num cartão para abrir o detalhe dessa spec. Os rails baseados em loops também registam os ficheiros que tocam, por isso o trabalho feito em worktrees isolados aparece na história tal como os jobs normais do pipeline.
|
|
43
|
+
|
|
44
|
+
Para qualquer capítulo podes pedir uma explicação em linguagem simples: carrega em **Explicar esta alteração** e a app escreve uma a três frases a descrever o que essa mudança concreta contribuiu para o ficheiro — sem código, sem jargão. As explicações partilham o mesmo orçamento mensal dos resumos de ficheiros e, enquanto nenhuma for gerada, o cartão recorre aos factos que conhece: o tipo de mudança, a spec e a data. Preferes os dados em bruto? Um seletor **História / Registro** muda para a lista clássica de alterações com diffs a pedido. O mesmo painel aparece na vista **Files** do modo Agente.
|
|
45
|
+
|
|
40
46
|
## Ligar o código de volta às specs
|
|
41
47
|
|
|
42
48
|
A ligação de proveniência funciona nos dois sentidos. Dentro do Code explorer, clicar na etiqueta de um ticket num ficheiro abre o detalhe desse ticket. E no sentido inverso, a vista de **detalhe do ticket** tem uma secção *Ficheiros alterados por este ticket* — clique aí num ficheiro e salta diretamente para o Code explorer com ele aberto. Fecha o ciclo entre "aqui está a spec que escrevemos" e "aqui está o código que daí saiu".
|
|
@@ -7,7 +7,7 @@ Quer que as suas specs vivam num **quadro Jira** real em vez de dentro do Specra
|
|
|
7
7
|
O Specrails atua como uma **camada de sincronização** entre o Jira e o seu projeto. A ideia central: o seu repositório local de specs continua a ser a fonte canónica que o pipeline lê, e o Specrails é responsável por mantê-lo de acordo com o Jira.
|
|
8
8
|
|
|
9
9
|
- Quando lança um rail, o Specrails move a issue Jira associada para **Em curso**.
|
|
10
|
-
- Quando um trabalho termina, o Specrails transita a issue
|
|
10
|
+
- Quando um trabalho termina, o Specrails transita a issue: em caso de sucesso, move-a para o seu estado de **revisão** mapeado e só chega a **Concluído** quando aprova o trabalho (o merge da PR em rascunho publica um comentário "PR merged"); em caso de falha, volta a **A fazer** com um comentário de conclusão (id do trabalho, custo e duração).
|
|
11
11
|
- Periodicamente, o Specrails faz **polling** ao Jira em busca de alterações que alguém tenha feito no quadro e reflete-as de volta nas suas specs.
|
|
12
12
|
|
|
13
13
|
Todas as escritas de retorno passam por uma fila de saída (outbox) durável e resistente a falhas, por isso um soluço momentâneo do Jira nunca quebra um trabalho — a atualização simplesmente volta a tentar.
|
|
@@ -53,9 +53,14 @@ As respostas chegam de forma fluida e já formatadas (títulos, tabelas, listas)
|
|
|
53
53
|
|
|
54
54
|
## Detalhes práticos
|
|
55
55
|
|
|
56
|
+
- **Super specs a partir de uma conversa.** Peça ao agente para *moldar* uma spec com você em vez de gerá-la de uma vez: ele lê primeiro o código real, faz algumas perguntas e mostra o rascunho em evolução como um cartão ao vivo dentro da conversa. Quando você diz sim, ele cria a spec e — por padrão — a enriquece em segundo plano com uma **Contract Layer** (caminhos de arquivo exatos, formas de dados, invariantes) para que os agentes que implementam não improvisem. Diga "sem contract layer" para pular o enriquecimento.
|
|
57
|
+
- **Clique no que ele menciona.** Em uma missão fixada a um projeto, os números de spec (`#12`) e os ids de job/execução nas respostas do agente são chips clicáveis: uma spec abre o modal de detalhe do quadro e um id de job abre a visão do job ao vivo. Se a referência não existir mais, você verá um aviso discreto de "não encontrado".
|
|
58
|
+
- **O cartão de implementação, sempre à vista.** Quando o agente implementa specs, um cartão ao vivo acompanha o trabalho — e enquanto ele precisar de algo de você (criar a PR, publicá-la, tentar de novo, descartar) fica **fixado logo acima da caixa de mensagem**, por mais que a conversa role; no lugar dele no histórico aparece um marcador discreto de "fixado acima". Vários cartões ativos se empilham como pequenos chips (clique em um para trazê-lo à frente), e um chevron minimiza o cartão para uma barra fina. Quando a PR é publicada — ou o trabalho é mesclado ou descartado — o cartão volta ao seu lugar no histórico da conversa.
|
|
56
59
|
- **Histórico de prompts.** Com a caixa vazia, pressione **↑**/**↓** para percorrer o que você perguntou antes (mostrado esmaecido enquanto rola); comece a digitar para editar, ou pressione Enter para enviar.
|
|
60
|
+
- **Edite a fila.** Enviou mais enquanto o agente estava ocupado? Enquanto houver mensagens na fila, **↑**/**↓** percorre *essas* mensagens: a caixa mostra a selecionada, você a edita ali mesmo e **Enter a salva de volta na fila** (Esc cancela; seu rascunho não enviado volta intacto).
|
|
57
61
|
- **Minimize sem perder nada.** Clique no ✕ para devolver o painel à bolha — a conversa continua rodando. Reabra e você chega na mensagem mais recente; nada é redigitado.
|
|
58
62
|
- **Nova conversa.** O botão **+** inicia um fio limpo; o histórico vive no nível da aplicação, acima de qualquer projeto individual.
|
|
63
|
+
- **Troque de missão.** O seletor de missões ao lado do seletor de projeto lista suas conversas da mais recente para a mais antiga — um ponto pulsante marca aquelas em que o agente ainda está trabalhando, e um pequeno selo conta as mensagens na fila. A busca aparece quando a lista passa de oito, e o ícone de lixeira de cada linha exclui uma missão após uma confirmação rápida em linha — mesmo uma em andamento (ele avisa primeiro e depois para o agente).
|
|
59
64
|
|
|
60
65
|
## Algumas coisas para saber
|
|
61
66
|
|