specrails-desktop 2.8.0 → 2.9.1
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 +23 -19
- package/client/dist/assets/{ActivityFeedPage-LKqd18-G.js → ActivityFeedPage-DpQzYMBz.js} +1 -1
- package/client/dist/assets/{AgentsPage-Cb-b-6Ot.js → AgentsPage-29fCY8qV.js} +1 -1
- package/client/dist/assets/{AnalyticsPage-HVxQQ1wy.js → AnalyticsPage-BwGtS6Hf.js} +1 -1
- package/client/dist/assets/{BarChart-BOyHB0dw.js → BarChart-CTR97DVC.js} +1 -1
- package/client/dist/assets/{CodePage-DnOnwKGB.js → CodePage-yAAxKasA.js} +1 -1
- package/client/dist/assets/{DesktopAnalyticsPage-D2auU39x.js → DesktopAnalyticsPage-BdK_XpsD.js} +1 -1
- package/client/dist/assets/{DocsDialog-CTuDX3GK.js → DocsDialog-BaE0cLlL.js} +2 -2
- package/client/dist/assets/{DocsPage-DRyMmu0Z.js → DocsPage-c1FgZX8_.js} +2 -2
- package/client/dist/assets/{ExportDropdown-DO-GGiMh.js → ExportDropdown-lPv_yDen.js} +1 -1
- package/client/dist/assets/{IntegrationsPage-BhbO4jFT.js → IntegrationsPage-DOpxRe7G.js} +1 -1
- package/client/dist/assets/{JobDetailPage-DJooEg1s.js → JobDetailPage-5ExzXY-F.js} +1 -1
- package/client/dist/assets/{JobsPage-BbaC-YOg.js → JobsPage-iW7WuPAc.js} +1 -1
- package/client/dist/assets/{dist-js-Xc2lRKp2.js → dist-js-A8aSaLng.js} +1 -1
- package/client/dist/assets/{dist-js-CiIVMsx3.js → dist-js-CD_m3Xj5.js} +1 -1
- package/client/dist/assets/index-D6BaYRRU.css +2 -0
- package/client/dist/assets/{index-DK214dak.js → index-DRhFPNAv.js} +44 -44
- package/client/dist/assets/{integrations-2C7MkGT0.js → integrations-7YyTBuU9.js} +1 -1
- package/client/dist/assets/{integrations-CX4p_bij.js → integrations-B9CEpNF0.js} +1 -1
- package/client/dist/assets/{integrations-C2jQtv-s.js → integrations-BlvAdewo.js} +1 -1
- package/client/dist/assets/{integrations-eQPHAYsE.js → integrations-Bw8UM9Xd.js} +1 -1
- package/client/dist/assets/{integrations-BDC670cg.js → integrations-C5SxNKnG.js} +1 -1
- package/client/dist/assets/{integrations-BqUmRUef.js → integrations-CJQKMmdW.js} +1 -1
- package/client/dist/assets/{integrations-CB98NeH5.js → integrations-DWz1eU_K.js} +1 -1
- package/client/dist/assets/{integrations-_SuVeQIG.js → integrations-DiPR8Fzp.js} +1 -1
- package/client/dist/assets/{lib-Bo5s6xpe.js → lib-1vkTuLY7.js} +1 -1
- package/client/dist/assets/setup-B6egeeTM.js +1 -0
- package/client/dist/assets/setup-BHroXlke.js +1 -0
- package/client/dist/assets/setup-BIXsWUp1.js +1 -0
- package/client/dist/assets/setup-BJRdg1iE.js +1 -0
- package/client/dist/assets/setup-C0rVGnCy.js +1 -0
- package/client/dist/assets/setup-Cpu17hJv.js +1 -0
- package/client/dist/assets/setup-D-1r0uSx.js +1 -0
- package/client/dist/assets/setup-Dn2-veYO.js +1 -0
- package/client/dist/assets/{tickets-9kdPXInd.js → tickets-CG_mo-Bg.js} +1 -1
- package/client/dist/assets/{tickets-n23kDqJT.js → tickets-CVJQ-vRm.js} +1 -1
- package/client/dist/assets/{tickets-tGx5AR5b.js → tickets-D5MSAPe_.js} +1 -1
- package/client/dist/assets/{tickets-1UIGf_oA.js → tickets-DBV3wgQZ.js} +1 -1
- package/client/dist/assets/{tickets-DNmXcAwu.js → tickets-Q0_pONEh.js} +1 -1
- package/client/dist/assets/{tickets-C6pwZwt4.js → tickets-RZ0LyeQe.js} +1 -1
- package/client/dist/assets/{tickets-DAjtxAVb.js → tickets-d1A6EOHa.js} +1 -1
- package/client/dist/assets/{tickets-0rM0lIXd.js → tickets-r4-oNV0R.js} +1 -1
- package/client/dist/assets/{useProjectCache-DVNypkmR.js → useProjectCache-CSi2xHri.js} +1 -1
- package/client/dist/index.html +5 -5
- package/docs/README.md +5 -2
- package/docs/agy-cli-provider-study.md +78 -0
- package/docs/cli.md +23 -4
- package/docs/codex.md +116 -58
- package/docs/creating-specs.md +19 -5
- package/docs/customizing.md +27 -6
- package/docs/gemini.md +225 -73
- package/docs/getting-started.md +18 -9
- package/docs/guide/de/agents/1-meet-the-agents.md +38 -0
- package/docs/guide/de/agents/2-profiles-and-the-balanced-default.md +45 -0
- package/docs/guide/de/agents/3-customizing-models-per-agent.md +60 -0
- package/docs/guide/de/agents/4-custom-agents-catalog.md +43 -0
- package/docs/guide/de/getting-started/1-what-is-specrails.md +49 -0
- package/docs/guide/de/getting-started/2-installing-and-first-run.md +42 -0
- package/docs/guide/de/getting-started/3-adding-your-first-project.md +58 -0
- package/docs/guide/de/getting-started/4-the-dashboard-tour.md +53 -0
- package/docs/guide/de/insights/1-analytics-and-cost-tracking.md +78 -0
- package/docs/guide/de/insights/2-the-integrated-terminal.md +46 -0
- package/docs/guide/de/insights/3-code-explorer.md +50 -0
- package/docs/guide/de/integrations/1-ai-providers.md +64 -0
- package/docs/guide/de/integrations/2-plugins.md +44 -0
- package/docs/guide/de/integrations/3-jira-integration.md +71 -0
- package/docs/guide/de/integrations/4-mobile-companion.md +38 -0
- package/docs/guide/de/pipeline/1-rails-and-jobs.md +94 -0
- package/docs/guide/de/pipeline/2-the-job-detail-view.md +90 -0
- package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +78 -0
- package/docs/guide/de/pipeline/4-picking-an-engine-per-rail.md +60 -0
- package/docs/guide/de/settings/1-themes.md +37 -0
- package/docs/guide/de/settings/2-language.md +39 -0
- package/docs/guide/de/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
- package/docs/guide/de/settings/4-where-your-data-lives.md +48 -0
- package/docs/guide/de/specs/1-specs-and-the-backlog.md +52 -0
- package/docs/guide/de/specs/2-add-spec-quick-mode.md +45 -0
- package/docs/guide/de/specs/3-add-spec-explore-mode.md +68 -0
- package/docs/guide/de/specs/4-drafts-and-contract-layer.md +81 -0
- package/docs/guide/en/agents/1-meet-the-agents.md +38 -0
- package/docs/guide/en/agents/2-profiles-and-the-balanced-default.md +45 -0
- package/docs/guide/en/agents/3-customizing-models-per-agent.md +60 -0
- package/docs/guide/en/agents/4-custom-agents-catalog.md +43 -0
- package/docs/guide/en/getting-started/1-what-is-specrails.md +49 -0
- package/docs/guide/en/getting-started/2-installing-and-first-run.md +42 -0
- package/docs/guide/en/getting-started/3-adding-your-first-project.md +58 -0
- package/docs/guide/en/getting-started/4-the-dashboard-tour.md +53 -0
- package/docs/guide/en/insights/1-analytics-and-cost-tracking.md +78 -0
- package/docs/guide/en/insights/2-the-integrated-terminal.md +46 -0
- package/docs/guide/en/insights/3-code-explorer.md +50 -0
- package/docs/guide/en/integrations/1-ai-providers.md +64 -0
- package/docs/guide/en/integrations/2-plugins.md +44 -0
- package/docs/guide/en/integrations/3-jira-integration.md +71 -0
- package/docs/guide/en/integrations/4-mobile-companion.md +38 -0
- package/docs/guide/en/pipeline/1-rails-and-jobs.md +94 -0
- package/docs/guide/en/pipeline/2-the-job-detail-view.md +90 -0
- package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +78 -0
- package/docs/guide/en/pipeline/4-picking-an-engine-per-rail.md +60 -0
- package/docs/guide/en/settings/1-themes.md +37 -0
- package/docs/guide/en/settings/2-language.md +39 -0
- package/docs/guide/en/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
- package/docs/guide/en/settings/4-where-your-data-lives.md +48 -0
- package/docs/guide/en/specs/1-specs-and-the-backlog.md +52 -0
- package/docs/guide/en/specs/2-add-spec-quick-mode.md +45 -0
- package/docs/guide/en/specs/3-add-spec-explore-mode.md +68 -0
- package/docs/guide/en/specs/4-drafts-and-contract-layer.md +81 -0
- package/docs/guide/es/agents/1-meet-the-agents.md +38 -0
- package/docs/guide/es/agents/2-profiles-and-the-balanced-default.md +45 -0
- package/docs/guide/es/agents/3-customizing-models-per-agent.md +60 -0
- package/docs/guide/es/agents/4-custom-agents-catalog.md +43 -0
- package/docs/guide/es/getting-started/1-what-is-specrails.md +49 -0
- package/docs/guide/es/getting-started/2-installing-and-first-run.md +42 -0
- package/docs/guide/es/getting-started/3-adding-your-first-project.md +58 -0
- package/docs/guide/es/getting-started/4-the-dashboard-tour.md +53 -0
- package/docs/guide/es/insights/1-analytics-and-cost-tracking.md +78 -0
- package/docs/guide/es/insights/2-the-integrated-terminal.md +46 -0
- package/docs/guide/es/insights/3-code-explorer.md +50 -0
- package/docs/guide/es/integrations/1-ai-providers.md +64 -0
- package/docs/guide/es/integrations/2-plugins.md +44 -0
- package/docs/guide/es/integrations/3-jira-integration.md +71 -0
- package/docs/guide/es/integrations/4-mobile-companion.md +38 -0
- package/docs/guide/es/pipeline/1-rails-and-jobs.md +94 -0
- package/docs/guide/es/pipeline/2-the-job-detail-view.md +90 -0
- package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +78 -0
- package/docs/guide/es/pipeline/4-picking-an-engine-per-rail.md +60 -0
- package/docs/guide/es/settings/1-themes.md +37 -0
- package/docs/guide/es/settings/2-language.md +39 -0
- package/docs/guide/es/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
- package/docs/guide/es/settings/4-where-your-data-lives.md +48 -0
- package/docs/guide/es/specs/1-specs-and-the-backlog.md +52 -0
- package/docs/guide/es/specs/2-add-spec-quick-mode.md +45 -0
- package/docs/guide/es/specs/3-add-spec-explore-mode.md +68 -0
- package/docs/guide/es/specs/4-drafts-and-contract-layer.md +81 -0
- package/docs/guide/fr/agents/1-meet-the-agents.md +38 -0
- package/docs/guide/fr/agents/2-profiles-and-the-balanced-default.md +45 -0
- package/docs/guide/fr/agents/3-customizing-models-per-agent.md +60 -0
- package/docs/guide/fr/agents/4-custom-agents-catalog.md +43 -0
- package/docs/guide/fr/getting-started/1-what-is-specrails.md +49 -0
- package/docs/guide/fr/getting-started/2-installing-and-first-run.md +42 -0
- package/docs/guide/fr/getting-started/3-adding-your-first-project.md +58 -0
- package/docs/guide/fr/getting-started/4-the-dashboard-tour.md +53 -0
- package/docs/guide/fr/insights/1-analytics-and-cost-tracking.md +78 -0
- package/docs/guide/fr/insights/2-the-integrated-terminal.md +46 -0
- package/docs/guide/fr/insights/3-code-explorer.md +50 -0
- package/docs/guide/fr/integrations/1-ai-providers.md +64 -0
- package/docs/guide/fr/integrations/2-plugins.md +44 -0
- package/docs/guide/fr/integrations/3-jira-integration.md +71 -0
- package/docs/guide/fr/integrations/4-mobile-companion.md +38 -0
- package/docs/guide/fr/pipeline/1-rails-and-jobs.md +94 -0
- package/docs/guide/fr/pipeline/2-the-job-detail-view.md +90 -0
- package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +78 -0
- package/docs/guide/fr/pipeline/4-picking-an-engine-per-rail.md +60 -0
- package/docs/guide/fr/settings/1-themes.md +37 -0
- package/docs/guide/fr/settings/2-language.md +39 -0
- package/docs/guide/fr/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
- package/docs/guide/fr/settings/4-where-your-data-lives.md +48 -0
- package/docs/guide/fr/specs/1-specs-and-the-backlog.md +52 -0
- package/docs/guide/fr/specs/2-add-spec-quick-mode.md +45 -0
- package/docs/guide/fr/specs/3-add-spec-explore-mode.md +68 -0
- package/docs/guide/fr/specs/4-drafts-and-contract-layer.md +81 -0
- package/docs/guide/it/agents/1-meet-the-agents.md +38 -0
- package/docs/guide/it/agents/2-profiles-and-the-balanced-default.md +45 -0
- package/docs/guide/it/agents/3-customizing-models-per-agent.md +60 -0
- package/docs/guide/it/agents/4-custom-agents-catalog.md +43 -0
- package/docs/guide/it/getting-started/1-what-is-specrails.md +49 -0
- package/docs/guide/it/getting-started/2-installing-and-first-run.md +42 -0
- package/docs/guide/it/getting-started/3-adding-your-first-project.md +58 -0
- package/docs/guide/it/getting-started/4-the-dashboard-tour.md +53 -0
- package/docs/guide/it/insights/1-analytics-and-cost-tracking.md +78 -0
- package/docs/guide/it/insights/2-the-integrated-terminal.md +46 -0
- package/docs/guide/it/insights/3-code-explorer.md +50 -0
- package/docs/guide/it/integrations/1-ai-providers.md +64 -0
- package/docs/guide/it/integrations/2-plugins.md +44 -0
- package/docs/guide/it/integrations/3-jira-integration.md +71 -0
- package/docs/guide/it/integrations/4-mobile-companion.md +38 -0
- package/docs/guide/it/pipeline/1-rails-and-jobs.md +94 -0
- package/docs/guide/it/pipeline/2-the-job-detail-view.md +90 -0
- package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +78 -0
- package/docs/guide/it/pipeline/4-picking-an-engine-per-rail.md +60 -0
- package/docs/guide/it/settings/1-themes.md +37 -0
- package/docs/guide/it/settings/2-language.md +39 -0
- package/docs/guide/it/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
- package/docs/guide/it/settings/4-where-your-data-lives.md +48 -0
- package/docs/guide/it/specs/1-specs-and-the-backlog.md +52 -0
- package/docs/guide/it/specs/2-add-spec-quick-mode.md +45 -0
- package/docs/guide/it/specs/3-add-spec-explore-mode.md +68 -0
- package/docs/guide/it/specs/4-drafts-and-contract-layer.md +81 -0
- package/docs/guide/ja/agents/1-meet-the-agents.md +38 -0
- package/docs/guide/ja/agents/2-profiles-and-the-balanced-default.md +45 -0
- package/docs/guide/ja/agents/3-customizing-models-per-agent.md +60 -0
- package/docs/guide/ja/agents/4-custom-agents-catalog.md +43 -0
- package/docs/guide/ja/getting-started/1-what-is-specrails.md +49 -0
- package/docs/guide/ja/getting-started/2-installing-and-first-run.md +42 -0
- package/docs/guide/ja/getting-started/3-adding-your-first-project.md +58 -0
- package/docs/guide/ja/getting-started/4-the-dashboard-tour.md +53 -0
- package/docs/guide/ja/insights/1-analytics-and-cost-tracking.md +78 -0
- package/docs/guide/ja/insights/2-the-integrated-terminal.md +46 -0
- package/docs/guide/ja/insights/3-code-explorer.md +50 -0
- package/docs/guide/ja/integrations/1-ai-providers.md +64 -0
- package/docs/guide/ja/integrations/2-plugins.md +44 -0
- package/docs/guide/ja/integrations/3-jira-integration.md +71 -0
- package/docs/guide/ja/integrations/4-mobile-companion.md +38 -0
- package/docs/guide/ja/pipeline/1-rails-and-jobs.md +94 -0
- package/docs/guide/ja/pipeline/2-the-job-detail-view.md +90 -0
- package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +78 -0
- package/docs/guide/ja/pipeline/4-picking-an-engine-per-rail.md +60 -0
- package/docs/guide/ja/settings/1-themes.md +37 -0
- package/docs/guide/ja/settings/2-language.md +39 -0
- package/docs/guide/ja/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
- package/docs/guide/ja/settings/4-where-your-data-lives.md +48 -0
- package/docs/guide/ja/specs/1-specs-and-the-backlog.md +52 -0
- package/docs/guide/ja/specs/2-add-spec-quick-mode.md +45 -0
- package/docs/guide/ja/specs/3-add-spec-explore-mode.md +68 -0
- package/docs/guide/ja/specs/4-drafts-and-contract-layer.md +81 -0
- package/docs/guide/pt/agents/1-meet-the-agents.md +38 -0
- package/docs/guide/pt/agents/2-profiles-and-the-balanced-default.md +45 -0
- package/docs/guide/pt/agents/3-customizing-models-per-agent.md +60 -0
- package/docs/guide/pt/agents/4-custom-agents-catalog.md +43 -0
- package/docs/guide/pt/getting-started/1-what-is-specrails.md +49 -0
- package/docs/guide/pt/getting-started/2-installing-and-first-run.md +42 -0
- package/docs/guide/pt/getting-started/3-adding-your-first-project.md +58 -0
- package/docs/guide/pt/getting-started/4-the-dashboard-tour.md +53 -0
- package/docs/guide/pt/insights/1-analytics-and-cost-tracking.md +78 -0
- package/docs/guide/pt/insights/2-the-integrated-terminal.md +46 -0
- package/docs/guide/pt/insights/3-code-explorer.md +50 -0
- package/docs/guide/pt/integrations/1-ai-providers.md +64 -0
- package/docs/guide/pt/integrations/2-plugins.md +44 -0
- package/docs/guide/pt/integrations/3-jira-integration.md +71 -0
- package/docs/guide/pt/integrations/4-mobile-companion.md +38 -0
- package/docs/guide/pt/pipeline/1-rails-and-jobs.md +94 -0
- package/docs/guide/pt/pipeline/2-the-job-detail-view.md +90 -0
- package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +78 -0
- package/docs/guide/pt/pipeline/4-picking-an-engine-per-rail.md +60 -0
- package/docs/guide/pt/settings/1-themes.md +37 -0
- package/docs/guide/pt/settings/2-language.md +39 -0
- package/docs/guide/pt/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
- package/docs/guide/pt/settings/4-where-your-data-lives.md +48 -0
- package/docs/guide/pt/specs/1-specs-and-the-backlog.md +52 -0
- package/docs/guide/pt/specs/2-add-spec-quick-mode.md +45 -0
- package/docs/guide/pt/specs/3-add-spec-explore-mode.md +68 -0
- package/docs/guide/pt/specs/4-drafts-and-contract-layer.md +81 -0
- package/docs/guide/zh/agents/1-meet-the-agents.md +38 -0
- package/docs/guide/zh/agents/2-profiles-and-the-balanced-default.md +45 -0
- package/docs/guide/zh/agents/3-customizing-models-per-agent.md +60 -0
- package/docs/guide/zh/agents/4-custom-agents-catalog.md +43 -0
- package/docs/guide/zh/getting-started/1-what-is-specrails.md +49 -0
- package/docs/guide/zh/getting-started/2-installing-and-first-run.md +42 -0
- package/docs/guide/zh/getting-started/3-adding-your-first-project.md +58 -0
- package/docs/guide/zh/getting-started/4-the-dashboard-tour.md +53 -0
- package/docs/guide/zh/insights/1-analytics-and-cost-tracking.md +78 -0
- package/docs/guide/zh/insights/2-the-integrated-terminal.md +46 -0
- package/docs/guide/zh/insights/3-code-explorer.md +50 -0
- package/docs/guide/zh/integrations/1-ai-providers.md +64 -0
- package/docs/guide/zh/integrations/2-plugins.md +44 -0
- package/docs/guide/zh/integrations/3-jira-integration.md +71 -0
- package/docs/guide/zh/integrations/4-mobile-companion.md +38 -0
- package/docs/guide/zh/pipeline/1-rails-and-jobs.md +94 -0
- package/docs/guide/zh/pipeline/2-the-job-detail-view.md +90 -0
- package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +78 -0
- package/docs/guide/zh/pipeline/4-picking-an-engine-per-rail.md +60 -0
- package/docs/guide/zh/settings/1-themes.md +37 -0
- package/docs/guide/zh/settings/2-language.md +39 -0
- package/docs/guide/zh/settings/3-pipeline-telemetry-and-diagnostics.md +46 -0
- package/docs/guide/zh/settings/4-where-your-data-lives.md +48 -0
- package/docs/guide/zh/specs/1-specs-and-the-backlog.md +52 -0
- package/docs/guide/zh/specs/2-add-spec-quick-mode.md +45 -0
- package/docs/guide/zh/specs/3-add-spec-explore-mode.md +68 -0
- package/docs/guide/zh/specs/4-drafts-and-contract-layer.md +81 -0
- package/docs/internals/README.md +1 -1
- package/docs/internals/adding-a-provider.md +192 -59
- package/docs/internals/api-reference.md +130 -21
- package/docs/internals/architecture.md +22 -9
- package/docs/internals/bundled-framework-build-plan.md +264 -0
- package/docs/internals/configuration.md +33 -8
- package/docs/internals/global-artifacts-alignment-contract.md +486 -0
- package/docs/internals/global-artifacts-relocation-evaluation.md +294 -0
- package/docs/internals/operations-runbook.md +16 -5
- package/docs/internals/profiles.md +42 -14
- package/docs/platforms/macos.md +27 -8
- package/docs/platforms/windows.md +20 -6
- package/docs/running-pipelines.md +17 -9
- package/docs/terminal.md +9 -3
- package/docs/tracking-cost.md +17 -11
- package/package.json +1 -1
- package/server/dist/agent-refine-manager.js +20 -5
- package/server/dist/artifact-registry.js +468 -0
- package/server/dist/attachment-manager.js +5 -8
- package/server/dist/browser-capture-manager.js +4 -4
- package/server/dist/bundled-core.js +72 -0
- package/server/dist/bundled-openspec.js +58 -0
- package/server/dist/chat-manager.js +42 -5
- package/server/dist/code-explorer-router.js +10 -7
- package/server/dist/config.js +7 -2
- package/server/dist/context-budget.js +17 -6
- package/server/dist/context-scope.js +6 -2
- package/server/dist/contract-refine-runner.js +31 -9
- package/server/dist/desktop-router.js +24 -1
- package/server/dist/docs-router.js +210 -132
- package/server/dist/file-summary-manager.js +41 -16
- package/server/dist/framework-manager.js +248 -0
- package/server/dist/framework-migration.js +308 -0
- package/server/dist/index.js +30 -0
- package/server/dist/install-config-path.js +73 -0
- package/server/dist/jira/jira-sync-manager.js +23 -11
- package/server/dist/openspec-shim.js +153 -0
- package/server/dist/plugins-router.js +19 -8
- package/server/dist/profiles-router.js +38 -16
- package/server/dist/project-registry.js +101 -3
- package/server/dist/project-router-chat.js +1 -1
- package/server/dist/project-router-helpers.js +25 -12
- package/server/dist/project-router-jobs.js +3 -3
- package/server/dist/project-router-settings.js +8 -6
- package/server/dist/project-router-setup.js +27 -10
- package/server/dist/project-router-spending.js +6 -1
- package/server/dist/project-router-tickets.js +30 -10
- package/server/dist/project-router.js +16 -1
- package/server/dist/queue-manager.js +149 -18
- package/server/dist/setup-manager.js +131 -29
- package/server/dist/smash-runner.js +21 -6
- package/server/dist/ticket-store.js +6 -2
- package/server/dist/ticket-watcher.js +5 -1
- package/server/dist/vitest-setup.js +25 -0
- package/server/dist/workspace-manager.js +199 -0
- package/server/dist/workspace-resolution.js +147 -0
- package/client/dist/assets/index-DgKfQFcf.css +0 -2
- package/client/dist/assets/setup-BIIkb-_K.js +0 -1
- package/client/dist/assets/setup-BeQxu9kD.js +0 -1
- package/client/dist/assets/setup-CPa6GnlI.js +0 -1
- package/client/dist/assets/setup-CZl4OEJx.js +0 -1
- package/client/dist/assets/setup-ChpodNfn.js +0 -1
- package/client/dist/assets/setup-D_fjJH6u.js +0 -1
- package/client/dist/assets/setup-YzD8DX4O.js +0 -1
- package/client/dist/assets/setup-fRpDozmq.js +0 -1
- package/docs/adding-a-provider.md +0 -107
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# The integrated terminal
|
|
2
|
+
|
|
3
|
+
Specrails has a real terminal built right in — the panel that slides up from the bottom of the window, just like the one in VS Code or Cursor. It runs your actual shell, in your actual project directory, so you can run `git`, `npm`, tests, or anything else without leaving the app.
|
|
4
|
+
|
|
5
|
+
## Opening and closing it
|
|
6
|
+
|
|
7
|
+
The fastest way is the keyboard: **Cmd+J** (macOS) or **Ctrl+J** (Windows/Linux) toggles the panel open and closed, and focuses the terminal the moment it appears so you can start typing immediately. You can also use the chevron in the status bar.
|
|
8
|
+
|
|
9
|
+
The panel has three states:
|
|
10
|
+
|
|
11
|
+
- **Hidden** — tucked away.
|
|
12
|
+
- **Restored** — the normal split-height panel.
|
|
13
|
+
- **Maximized** — taking over the work area when you need room to read output.
|
|
14
|
+
|
|
15
|
+
Minimizing the panel (the chevron) does **not** stop anything — your shells keep running in the background. The only thing that actually ends a session is closing it (the trash icon, or the per-tab ✕).
|
|
16
|
+
|
|
17
|
+
## Multiple sessions
|
|
18
|
+
|
|
19
|
+
You can run several terminals at once in the same project — up to ten. Each gets its own tab; you can rename them so "dev server" and "tests" don't get confused. They all start in your project folder and load your shell profile (`.zshrc`, `.bashrc`, and so on), so your aliases and PATH are exactly what you'd expect.
|
|
20
|
+
|
|
21
|
+
Here's the important part: your terminals **survive switching projects and tabs**. Specrails keeps each session alive and intact behind the scenes — scrollback, running processes, everything — so flipping over to Analytics and back doesn't reset your shell or interrupt a long-running command. Sessions only end when you explicitly close them (or when you remove the whole project).
|
|
22
|
+
|
|
23
|
+
## Per-project, remembered
|
|
24
|
+
|
|
25
|
+
Whether the panel is open, how tall you've dragged it, which tabs exist — all of that is remembered **per project**. Come back to a project and it's set up the way you left it.
|
|
26
|
+
|
|
27
|
+
## The premium features
|
|
28
|
+
|
|
29
|
+
This isn't a bare-bones console. The terminal ships with the niceties you'd want from a first-class one:
|
|
30
|
+
|
|
31
|
+
- **Fast, crisp rendering** via WebGL (with an automatic fallback so it never breaks), full Unicode width handling, and font ligatures.
|
|
32
|
+
- **Search your scrollback** with **Cmd+F** — great for finding that error buried 500 lines up.
|
|
33
|
+
- **Font zoom** with **Cmd+=**, **Cmd+-**, and **Cmd+0** to reset.
|
|
34
|
+
- **Clipboard shortcuts** — Cmd+C / Cmd+V to copy and paste, Cmd+K to clear — plus a right-click context menu.
|
|
35
|
+
- **Drag-and-drop file paths** (in the desktop app): drop a file onto the terminal and its path is inserted, correctly quoted for your shell.
|
|
36
|
+
- **Smooth resizing** — dragging the panel height or collapsing the sidebar won't make the output jitter.
|
|
37
|
+
- **Inline images** — terminals that emit Sixel or iTerm2-style images render them right in place.
|
|
38
|
+
- **Shell integration** — Specrails knows where each command starts and ends, so it can track your command history and notify you when a long-running command finishes (a desktop notification, with a browser fallback). If your shell can't be instrumented for some reason, it degrades quietly and tells you once.
|
|
39
|
+
|
|
40
|
+
## Settings
|
|
41
|
+
|
|
42
|
+
Terminal preferences live in two layers: an app-wide default and an optional per-project override. The per-project setting wins when present, so you can keep a global look-and-feel while tweaking one project that needs something different.
|
|
43
|
+
|
|
44
|
+
## Turning it off
|
|
45
|
+
|
|
46
|
+
The terminal is on by default. If you'd rather not have it, it can be disabled via the `VITE_FEATURE_TERMINAL_PANEL` (client) or `SPECRAILS_TERMINAL_PANEL` (server) flags — set either to `false`. Most people will simply leave it on.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Code explorer
|
|
2
|
+
|
|
3
|
+
The **Code** section gives you a friendly, read-only window into your repository — designed especially for people who want to understand what the AI has been building without living in an editor. You get a file tree on the left, a code viewer on the right, and, above the code, a plain-language summary of what each file actually does.
|
|
4
|
+
|
|
5
|
+
It's strictly read-only in this version: nothing you do here changes your files. Think of it as a reading room, not a workshop.
|
|
6
|
+
|
|
7
|
+
Open it from the right sidebar (**Code**), and like everything else it's scoped to your current project.
|
|
8
|
+
|
|
9
|
+
## The file tree
|
|
10
|
+
|
|
11
|
+
The left pane is a virtualised tree of your project's files — fast even on large repos. It respects your `.gitignore` and a built-in deny-list, so you see the files that matter, not a sea of build artifacts and `node_modules`.
|
|
12
|
+
|
|
13
|
+
Next to files you'll notice **provenance chips** — little markers that tell you a file was *touched by AI*. This is the heart of the Code explorer: Specrails records which files each pipeline job created or modified, and ties them back to the ticket that prompted the work. So you can answer, at a glance, "did the AI write this, or did I?"
|
|
14
|
+
|
|
15
|
+
At the top of the tree there's a filter:
|
|
16
|
+
|
|
17
|
+
- **Tocado por IA / Touched by AI** (the default) — only files the AI has changed.
|
|
18
|
+
- **All files** — the full tree.
|
|
19
|
+
|
|
20
|
+
Your choice is remembered per project, so if you mostly care about AI-authored changes you'll see them first every time.
|
|
21
|
+
|
|
22
|
+
## The code viewer
|
|
23
|
+
|
|
24
|
+
Click a file and it opens in a full-featured viewer (powered by Monaco, the same engine as VS Code) with proper syntax highlighting that matches your chosen app theme. A few sensible limits keep things smooth: binary files are politely refused, and very large files (over 2 MB) won't load.
|
|
25
|
+
|
|
26
|
+
Your current file is saved in the page URL, so you can bookmark or share a link straight to a specific file.
|
|
27
|
+
|
|
28
|
+
Since editing isn't part of this version, the viewer offers an **Edit in external editor** button that copies the file's absolute path — paste it into your editor of choice and pick up there.
|
|
29
|
+
|
|
30
|
+
## AI summaries
|
|
31
|
+
|
|
32
|
+
Above the code you'll see a **plain-language summary** of the file — what it's for, what it does — written so a non-developer can follow along. These are generated for you and cached, so opening a file you've looked at before is instant.
|
|
33
|
+
|
|
34
|
+
Summaries are smart about staying fresh: they're keyed to the file's contents, so when a file genuinely changes the summary is regenerated, but unchanged files don't get re-summarised needlessly. If you edit a file yourself, its summary is marked as stale rather than silently regenerated — you stay in control of when it's refreshed. There's a **regenerate** action when you want a fresh take on demand.
|
|
35
|
+
|
|
36
|
+
A couple of guardrails keep costs sane: summary generation runs within a **monthly budget** (a few dollars by default, configurable in Settings), and there are caps on how many summaries a single job will kick off. If a summary is skipped, the app tells you why — budget reached, a per-job cap, or the file simply not being found.
|
|
37
|
+
|
|
38
|
+
You can also choose the **summary language** (English or Spanish) in the global settings under the *Code section* area.
|
|
39
|
+
|
|
40
|
+
## Connecting code back to specs
|
|
41
|
+
|
|
42
|
+
The provenance link runs both ways. Inside the Code explorer, clicking a ticket chip on a file opens that ticket's detail. And from the other direction, the **ticket detail** view has a *Files touched by this ticket* section — click a file there and you jump straight into the Code explorer with it open. It closes the loop between "here's the spec we wrote" and "here's the code that came out of it."
|
|
43
|
+
|
|
44
|
+
## What it doesn't do (yet)
|
|
45
|
+
|
|
46
|
+
To set expectations clearly, this first version intentionally leaves a few things out: in-app editing, per-symbol or directory-level summaries, a narrative diff view, and conversational "ask the AI about this file." Provenance attributes a file to its primary ticket only. These are the kinds of things that may grow over time.
|
|
47
|
+
|
|
48
|
+
## Turning it off
|
|
49
|
+
|
|
50
|
+
The Code explorer is on by default. It can be disabled with the `VITE_FEATURE_CODE_EXPLORER` (client) or `SPECRAILS_CODE_EXPLORER` (server) flags — set either to `false`. Turning it off leaves all your recorded data and summaries safely on disk, untouched, in case you switch it back on.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# AI providers (Claude, Codex, Gemini)
|
|
2
|
+
|
|
3
|
+
Specrails isn't tied to a single AI. Every part of the app that talks to an AI — Explore Spec, Quick spec, rails, chat, AI Edit, the terminal's "Open AI CLI" button — can run through any of three first-class providers. You pick which ones a project uses, and you can even switch on a per-task basis.
|
|
4
|
+
|
|
5
|
+
## The three providers
|
|
6
|
+
|
|
7
|
+
| Provider | CLI | Made by | Notes |
|
|
8
|
+
|---|---|---|---|
|
|
9
|
+
| **Claude** | `claude` | Anthropic | The most fully featured. The only provider for Agents (profiles) and Ultracode rails, and for Contract Refine. |
|
|
10
|
+
| **Codex** | `codex` | OpenAI | Needs codex `0.128.0+`. Reads its MCP servers from your global `~/.codex/config.toml`. |
|
|
11
|
+
| **Gemini** | `gemini` | Google | Needs gemini `0.11.0+`. Uses native telemetry and a `GEMINI.md` instructions file. |
|
|
12
|
+
|
|
13
|
+
All three are **enabled by default**. A provider shows up in **Add Project** whenever its CLI is installed and on your `PATH`. So the first step is always the same: install the CLI you want and log in with it, exactly as that tool's own docs describe. Once `claude --version` (or `codex`, or `gemini`) works in your terminal, Specrails can use it.
|
|
14
|
+
|
|
15
|
+
## Installing one provider for a project
|
|
16
|
+
|
|
17
|
+
When you add a project, the setup wizard asks which provider(s) to install. Pick one, click through the install step, and you're done. From there on the project just *has* that provider — you never have to think about it again. Specs, rails, chat, and analytics all work the same regardless of which one you chose.
|
|
18
|
+
|
|
19
|
+
If a CLI you want isn't offered in Add Project, it's almost always because the CLI isn't installed or isn't on your `PATH`. Install it, then reopen Add Project.
|
|
20
|
+
|
|
21
|
+
## Installing several providers for one project
|
|
22
|
+
|
|
23
|
+
You can install **more than one** provider into the same project — for example Claude *and* Gemini. In **Add Project**, the provider list becomes a set of checkboxes; tick everything you want. The first one you select becomes the project's **primary** (default) provider; the rest are available as alternatives.
|
|
24
|
+
|
|
25
|
+
A few things worth knowing about multi-provider projects:
|
|
26
|
+
|
|
27
|
+
- **One provider behaves exactly like before.** If a project has just a single provider, you'll never see a provider picker anywhere — the app stays clean and simple.
|
|
28
|
+
- **The right sidebar only shows sections every installed provider supports.** Because Agents (profiles) is a Claude-only concept, the **Agents** section disappears the moment a project includes any non-Claude provider. Everything else (Specs, Code, Analytics, Integrations, Terminal, Chat) stays.
|
|
29
|
+
- **Provider choice is locked after creation.** In this version you choose your providers when you add the project and they can't be changed later from Settings. If you need a different mix, that's a fresh project.
|
|
30
|
+
|
|
31
|
+
## Picking a provider per invocation
|
|
32
|
+
|
|
33
|
+
The real payoff of a multi-provider project is choosing the right AI for each task — without changing any global setting. Wherever an AI runs, a small provider picker appears (only when the project has more than one):
|
|
34
|
+
|
|
35
|
+
- **Add Spec** — an engine selector lets you Explore or Quick-generate a spec with whichever provider you like.
|
|
36
|
+
- **Rail header** — pick the engine for that specific rail before launching it.
|
|
37
|
+
- **Terminal** — the "Open AI CLI" (Sparkles) button opens a provider menu so you can drop into any installed CLI in that project's directory.
|
|
38
|
+
|
|
39
|
+
Your choice is remembered per project, defaulting to the primary provider, so you don't have to re-pick every time.
|
|
40
|
+
|
|
41
|
+
## What only Claude can do
|
|
42
|
+
|
|
43
|
+
A handful of features are Claude-specific by nature, so they're either hidden or skipped when another provider is in play:
|
|
44
|
+
|
|
45
|
+
- **Agents (profiles)** — the per-project agent catalog and model routing. Hidden on any project that includes a non-Claude provider.
|
|
46
|
+
- **Ultracode rails** — always run on Claude.
|
|
47
|
+
- **Contract Refine** — the extra "Contract Layer" pass on a committed spec runs only when the conversation's provider is Claude.
|
|
48
|
+
- **Add Spec advanced modes** (SMASH / Contract Layer) — hidden for non-Claude engines.
|
|
49
|
+
|
|
50
|
+
Everything else — Explore, Quick spec, the full rails pipeline, AI Edit, chat, cost analytics — works across all three.
|
|
51
|
+
|
|
52
|
+
## Cost tracking across providers
|
|
53
|
+
|
|
54
|
+
The **Analytics** page tracks every billable invocation regardless of provider. On multi-provider projects it adds engine filter chips so you can compare spend by provider. Claude reports its own exact cost; for Codex and Gemini, Specrails estimates cost from a built-in rate card, so the numbers are close approximations rather than billed amounts.
|
|
55
|
+
|
|
56
|
+
## Troubleshooting
|
|
57
|
+
|
|
58
|
+
- **A provider I installed isn't offered.** Confirm the CLI is on your `PATH` (try `claude --version` / `codex --version` / `gemini --version` in a fresh terminal). The app probes provider CLIs through your system `PATH`.
|
|
59
|
+
- **Codex MCP servers aren't loading in chat.** Codex reads MCP servers from your global `~/.codex/config.toml` — register them there with `codex mcp add`.
|
|
60
|
+
- **Emergency disable.** A provider can be turned off app-wide via an environment variable (`SPECRAILS_CODEX_BETA=0` or `SPECRAILS_GEMINI_BETA=0`). This only hides the provider from *selection*; it's rarely needed.
|
|
61
|
+
|
|
62
|
+
## See also
|
|
63
|
+
|
|
64
|
+
The dedicated provider guides go deeper on each CLI: the Codex guide and the Gemini guide each cover setup, what works, and provider-specific quirks.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Plugins (Integrations)
|
|
2
|
+
|
|
3
|
+
The **Integrations** section is a per-project marketplace of optional add-ons that extend what the AI can do. Each project decides independently which plugins it wants — installing a plugin in one project never touches another.
|
|
4
|
+
|
|
5
|
+
Plugins work by quietly registering an **MCP server** (Model Context Protocol) into your project, giving the AI new tools to call during rails and chat. You don't have to understand MCP to use them — install, and they're available the next time a rail runs.
|
|
6
|
+
|
|
7
|
+
## What's available today
|
|
8
|
+
|
|
9
|
+
This version ships **bundled-only**: the plugins you can install are the ones built into the app. There's no remote registry, no user-uploaded plugins, and no third-party code loading — so everything in the catalog is vetted and shipped with Specrails.
|
|
10
|
+
|
|
11
|
+
The headline plugin is:
|
|
12
|
+
|
|
13
|
+
- **Serena** — semantic code navigation. It gives the AI language-server-backed understanding of your codebase (jump-to-definition, find references, symbol-aware search) instead of plain text matching. Great for larger or unfamiliar repos where you want the agent to reason about real symbols.
|
|
14
|
+
|
|
15
|
+
Serena requires the `uv` tool on your `PATH` (it runs via `uvx`). The app auto-detects whether `uv` is present and tells you if it's missing.
|
|
16
|
+
|
|
17
|
+
## Installing a plugin
|
|
18
|
+
|
|
19
|
+
1. Open **Integrations** from the right sidebar.
|
|
20
|
+
2. Find the plugin in the catalog. Each card shows a status: **Not installed**, **Installed**, **Degraded**, or **Orphan**.
|
|
21
|
+
3. Click into the plugin to **preview the install** — this shows you exactly what files will change before anything happens.
|
|
22
|
+
4. Click **Install**. You'll see live progress as it sets up.
|
|
23
|
+
|
|
24
|
+
Under the hood the install is *surgical and additive*: it only adds its own entries to your project's `.mcp.json` (and, for some plugins, a fragment file in the protected `.claude/agents/` namespace). It never rewrites your config wholesale, and adding a second plugin can never disturb the first. If the install can't verify itself as healthy, it rolls back cleanly.
|
|
25
|
+
|
|
26
|
+
## Managing installed plugins
|
|
27
|
+
|
|
28
|
+
- **Health.** Each plugin has an on-demand health check. A plugin that installs fine but later can't start up is marked **Degraded** — it won't block your rails, you'll just see the badge and a reason.
|
|
29
|
+
- **Uninstall.** Removing a plugin surgically deletes only the entries it owns, leaving the rest of your config untouched.
|
|
30
|
+
- **Orphans.** If a plugin's files are left behind without proper state (for example after an interrupted change), it shows as an **Orphan** and you can clean it up with one click.
|
|
31
|
+
|
|
32
|
+
## How plugins show up in your work
|
|
33
|
+
|
|
34
|
+
- **Rails.** Before a rail runs, Specrails checks which plugins are installed and healthy, and makes those tools available to the agent for that job. A degraded plugin is simply skipped for that run — the rail still launches normally. Each job records a snapshot of which plugins were active, which you can see in the job's diagnostic export.
|
|
35
|
+
- **Chat.** Chat automatically picks up your project's MCP config, so installed plugins are available there too.
|
|
36
|
+
- **Setup.** Plugins are ignored while a project is still being set up — they come into play once the project is ready.
|
|
37
|
+
|
|
38
|
+
## Provider notes
|
|
39
|
+
|
|
40
|
+
Plugins are provider-aware. Serena and similar MCP plugins resolve for providers that register MCP through the project's `.mcp.json` (Claude and Gemini). For Codex projects, MCP servers are managed through Codex's own global config instead, so plugin entries in **Integrations** are filtered accordingly. The Jira card in Integrations is provider-agnostic and shows for everyone — see the Jira guide.
|
|
41
|
+
|
|
42
|
+
## Reserved files
|
|
43
|
+
|
|
44
|
+
Plugins manage a small, well-defined set of files in your project: your `.mcp.json` (merged surgically), some state under `.specrails/plugins/`, and per-plugin agent fragments at `.claude/agents/custom-<plugin>.md`. These are committable team assets if you want to share an integration with your teammates — the app never blindly overwrites them.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Jira integration
|
|
2
|
+
|
|
3
|
+
Want your specs to live on a real **Jira board** instead of inside Specrails? The Jira integration backs a project's specs with Jira issues, keeps statuses in sync as rails run, and stays out of the way the rest of the time. Each project syncs with **its own** Jira board.
|
|
4
|
+
|
|
5
|
+
## How it works (the short version)
|
|
6
|
+
|
|
7
|
+
Specrails acts as a **sync layer** between Jira and your project. The big idea: your local spec store stays the canonical thing the pipeline reads, and Specrails is responsible for keeping it and Jira in agreement.
|
|
8
|
+
|
|
9
|
+
- When you launch a rail, Specrails moves the linked Jira issue to **In Progress**.
|
|
10
|
+
- When a job finishes, Specrails transitions the issue (to **Done**, or back to **To Do** if it failed) and posts a completion comment with the job id, cost, and duration.
|
|
11
|
+
- Periodically Specrails **polls** Jira for changes anyone made on the board and reflects them back into your specs.
|
|
12
|
+
|
|
13
|
+
All write-backs go through a durable, crash-safe outbox, so a momentary Jira hiccup never breaks a job — the update just retries.
|
|
14
|
+
|
|
15
|
+
## Connecting a board
|
|
16
|
+
|
|
17
|
+
You connect from a project's **Settings** page (there's also an optional "Configure Jira" step at the end of the Add-Project wizard). The connect wizard walks you through:
|
|
18
|
+
|
|
19
|
+
1. **Test** — enter your Jira URL and credentials, and Specrails verifies the connection.
|
|
20
|
+
2. **Pick a project** — choose which Jira project to sync with.
|
|
21
|
+
3. **Status map (optional)** — map your Jira workflow statuses onto Specrails' states if the automatic detection needs a hand (more below).
|
|
22
|
+
4. **Connect** — done. Your specs now mirror that board.
|
|
23
|
+
|
|
24
|
+
### Authentication
|
|
25
|
+
|
|
26
|
+
This version uses **token-paste** auth — quick, on-device, and with no backend involved:
|
|
27
|
+
|
|
28
|
+
- **Jira Cloud:** your account email plus an API token.
|
|
29
|
+
- **Jira Data Center / Server:** a Personal Access Token (PAT).
|
|
30
|
+
|
|
31
|
+
Your token is stored **encrypted on your own machine** and never leaves it. The app shows only whether a token is present, never the token itself.
|
|
32
|
+
|
|
33
|
+
## Status mapping
|
|
34
|
+
|
|
35
|
+
The trickiest part of any Jira sync is matching *your* workflow to Specrails' simple states (To Do / In Progress / Done, plus cancel/ship variants). Specrails resolves this in two tiers:
|
|
36
|
+
|
|
37
|
+
1. **Your explicit status map**, if you set one in the wizard — always wins.
|
|
38
|
+
2. **Automatic detection** from each status's category (new / in-progress / done) plus smart matching for cancel and ship-style statuses.
|
|
39
|
+
|
|
40
|
+
When it needs to move an issue across a workflow that has gated transitions, it finds a valid path step by step and fills in any required fields (like a resolution) along the way. If a status genuinely can't be reached, the operation is parked as a dead-letter and surfaced to you rather than silently failing — you'll see a **degraded** indicator and can retry.
|
|
41
|
+
|
|
42
|
+
## Hot-swap: turn it on and off safely
|
|
43
|
+
|
|
44
|
+
The Jira link is **per spec**, captured at the moment you launch a rail — not a global, all-or-nothing switch on the board. That makes it safe to toggle:
|
|
45
|
+
|
|
46
|
+
- **Enabling or disabling** the integration never re-homes your existing specs.
|
|
47
|
+
- **Disconnecting** restores your project to normal local-spec behavior.
|
|
48
|
+
- Specs that already have a Jira link keep their write-back; specs that don't are left alone.
|
|
49
|
+
|
|
50
|
+
So you can experiment freely — flip it on, run a few rails, flip it off — without scrambling your board or your local specs.
|
|
51
|
+
|
|
52
|
+
## Day-to-day
|
|
53
|
+
|
|
54
|
+
Once connected, the project's Settings page shows a **connected card** where you can:
|
|
55
|
+
|
|
56
|
+
- **Sync now** — force an immediate poll instead of waiting for the timer.
|
|
57
|
+
- **Retry dead-letters** — re-run any write-backs that got stuck.
|
|
58
|
+
- **Hot-swap toggle** — temporarily pause/resume the integration.
|
|
59
|
+
- **Disconnect** — cleanly detach the board.
|
|
60
|
+
|
|
61
|
+
Specs backed by Jira show a **Jira key badge** (like `PROJ-123`) on their card, and clicking through links back to the issue. You'll also get small notifications when a sync completes, when an auth token expires (so you can refresh it), or when the integration enters a degraded state.
|
|
62
|
+
|
|
63
|
+
## Things to keep in mind
|
|
64
|
+
|
|
65
|
+
- **Polling, not webhooks.** Because Specrails runs locally, it polls Jira for inbound changes rather than receiving push notifications. Changes appear within the poll interval, not instantly.
|
|
66
|
+
- **One board per project.** Different projects can sync with different boards; a single project syncs with exactly one.
|
|
67
|
+
- **Last-write-wins on conflicts** for the rare case where two tabs edit the same draft simultaneously.
|
|
68
|
+
|
|
69
|
+
## Turning it off
|
|
70
|
+
|
|
71
|
+
If you ever want to fully back out, just **Disconnect** from Settings. Your specs return to local-only behavior, and the Jira metadata simply sits unused — nothing is destroyed.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# The mobile companion
|
|
2
|
+
|
|
3
|
+
Specrails has a companion phone app so you can keep an eye on your rails while you're away from your desk — watch jobs run, see them finish, and stay in the loop without sitting in front of the dashboard.
|
|
4
|
+
|
|
5
|
+
## What it's for
|
|
6
|
+
|
|
7
|
+
The companion is a **monitoring** surface. It connects to your running Specrails desktop app over your local network and mirrors live project and job activity to your phone. Think of it as a glanceable window into the same rails you'd otherwise watch on the dashboard.
|
|
8
|
+
|
|
9
|
+
## Pairing your phone
|
|
10
|
+
|
|
11
|
+
Pairing is built around a **QR code** so you don't have to type anything fiddly:
|
|
12
|
+
|
|
13
|
+
1. Make sure your desktop Specrails app is running and your phone is on the **same local network** (same Wi-Fi).
|
|
14
|
+
2. In the desktop app, open the pairing screen to display a QR code.
|
|
15
|
+
3. In the companion app on your phone, scan that code.
|
|
16
|
+
4. The phone discovers the desktop app on the network and connects.
|
|
17
|
+
|
|
18
|
+
From then on the companion keeps a live connection and streams project lists and job updates as they happen.
|
|
19
|
+
|
|
20
|
+
## How the connection works
|
|
21
|
+
|
|
22
|
+
The desktop app advertises itself on your local network so the phone can find it, and the QR code carries the details the phone needs to connect securely. Everything stays on your local network — the companion talks directly to your machine, not through any cloud service.
|
|
23
|
+
|
|
24
|
+
Because it's local-network based, the two devices need to be reachable to each other. If pairing doesn't take:
|
|
25
|
+
|
|
26
|
+
- Confirm both devices are on the **same Wi-Fi** (and that the network doesn't isolate clients from each other).
|
|
27
|
+
- Make sure the desktop app is **running** when you scan.
|
|
28
|
+
- Re-open the pairing screen to refresh the QR code and try scanning again.
|
|
29
|
+
|
|
30
|
+
## What you'll see
|
|
31
|
+
|
|
32
|
+
Once paired, the companion surfaces your projects and their live job activity, so you get the same real-time rail updates that flow into the desktop dashboard — pushed to your phone as they occur. It's the easiest way to know the moment a long-running rail wraps up.
|
|
33
|
+
|
|
34
|
+
## Good to know
|
|
35
|
+
|
|
36
|
+
- **Monitoring first.** The companion is designed for keeping tabs on rails, not for driving the full desktop workflow from your phone.
|
|
37
|
+
- **Local only.** No account, no cloud relay — your machine and your phone, on your network.
|
|
38
|
+
- **Keep the desktop awake.** The companion mirrors a running desktop app; if your machine sleeps or the app closes, live updates pause until it's back.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Rails & jobs
|
|
2
|
+
|
|
3
|
+
You've got specs on the board. This is where they turn into code. A **rail** is the lane that drives a spec through the full pipeline — Architect → Developer → Reviewer → Ship — running real AI agents inside your project directory. This page covers launching a rail, the job queue, and watching the work happen live.
|
|
4
|
+
|
|
5
|
+
## What a rail is
|
|
6
|
+
|
|
7
|
+
Think of your screen split in two:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
SpecsBoard (left) Rails (right)
|
|
11
|
+
───────────────── ─────────────────
|
|
12
|
+
#1 Login flow ─┐
|
|
13
|
+
#2 Webhook retry │ drag onto
|
|
14
|
+
#3 Cost limits │ ────────────► Rail 1 ▶ Play
|
|
15
|
+
#4 Audit log │
|
|
16
|
+
└────────────► Rail 2 ▶ Play
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
A rail is an **execution lane**. You drag a spec card from the SpecsBoard onto a rail, then press **▶ Play**. The rail launches the pipeline and works the spec end to end, right in your project's working directory — editing files, running tests, the works.
|
|
20
|
+
|
|
21
|
+
You can have several rails to organise work into named lanes (one for the feature you're focused on, another queued behind it). More on multi-rail and batching in [Batch implement & multi-feature](batch-implement-and-multi-feature).
|
|
22
|
+
|
|
23
|
+
## Launching a rail on a spec
|
|
24
|
+
|
|
25
|
+
1. **Drag a spec card** from the SpecsBoard onto a rail. The spec's ID shows up in the rail's spec list. (Prefer not to drag? Use the **Move to rail** popover on the spec card — it shows a status dot per rail so you don't drop work onto a busy lane.)
|
|
26
|
+
2. **Pick a mode** if you want something other than the default — the segmented control in the rail header offers `Implement`, `Batch`, and (Claude rails only) `Ultra`.
|
|
27
|
+
3. **Press ▶ Play.**
|
|
28
|
+
|
|
29
|
+
That's it. The rail spins up an AI CLI process in your project and starts the pipeline.
|
|
30
|
+
|
|
31
|
+
### What's in a rail header
|
|
32
|
+
|
|
33
|
+
| Control | What it does |
|
|
34
|
+
|---------|--------------|
|
|
35
|
+
| **Status pill** | `idle`, `running`, or `failed`. There's no separate "completed" — a rail returns to `idle` when its job finishes cleanly. |
|
|
36
|
+
| **Spec list** | The IDs assigned to this rail. Drag more in, drag them out to detach. |
|
|
37
|
+
| **Mode control** | `Implement` / `Batch` / `Ultra` — see the table below. Persisted per rail. |
|
|
38
|
+
| **Profile picker** | Which agent profile runs (Claude rails only). Only appears once the project has at least one profile. |
|
|
39
|
+
| **Engine selector** | Which installed provider runs this rail — Claude, Codex, or Gemini. Only renders when the project has more than one provider. See [Picking an engine per rail](picking-an-engine-per-rail). |
|
|
40
|
+
| **▶ Play / ■ Stop** | Start or cancel. |
|
|
41
|
+
|
|
42
|
+
### The three rail modes
|
|
43
|
+
|
|
44
|
+
| Mode | Command | What it does |
|
|
45
|
+
|------|---------|--------------|
|
|
46
|
+
| **Implement** | `/specrails:implement` | One job covering all specs on the rail. Runs the full Architect → Developer → Reviewer → Ship pipeline. The everyday default. |
|
|
47
|
+
| **Batch** | `/specrails:batch-implement` | One job that works through the rail's specs sequentially, in dependency-aware waves. Best for several related specs. |
|
|
48
|
+
| **Ultra** | Ultracode | Claude implements each spec autonomously, **bypassing** the pipeline. One independent job per spec. Claude only. |
|
|
49
|
+
|
|
50
|
+
Ultra is the odd one out: it skips the agent chain and hands Claude the raw spec to work on with its native tools. It's open-ended, so pressing Play opens a confirmation first, and a per-rail model picker lets you choose Haiku / Sonnet / Opus. It only appears when the rail's engine is Claude.
|
|
51
|
+
|
|
52
|
+
## The job queue
|
|
53
|
+
|
|
54
|
+
Every time you press Play, the rail run becomes a **job**. The most important rule to internalise:
|
|
55
|
+
|
|
56
|
+
> **One job at a time, per project.** Each project has a single queue. Within one project only one rail job runs at a time — the rest queue behind it and start automatically as slots free up.
|
|
57
|
+
|
|
58
|
+
This surprises people who add three rails expecting them to run in parallel. They won't — not inside the same project. Adding rails *organises* your work into lanes; it doesn't make those lanes run concurrently.
|
|
59
|
+
|
|
60
|
+
**Real parallelism is across projects.** Each project has its own independent queue, so a rail in Project A and a rail in Project B run at the same time without contending. Want more throughput? Open more projects.
|
|
61
|
+
|
|
62
|
+
There's no global concurrency knob to tune. The only automatic throttle is budget-based: if you've set a daily budget (project or app-wide), the queue auto-pauses once that day's spend hits the cap.
|
|
63
|
+
|
|
64
|
+
## Watching it run
|
|
65
|
+
|
|
66
|
+
Find every job under **Jobs** in the project's right sidebar — a card list, newest first. Each card shows a status badge, the profile badge, a priority badge, duration, cost, and the launched command. Above the list:
|
|
67
|
+
|
|
68
|
+
- **Status filter chips** — show only jobs in a given status.
|
|
69
|
+
- **Date-range filter** — narrow to a time window.
|
|
70
|
+
- **Compare** — pick two jobs and view them side by side.
|
|
71
|
+
|
|
72
|
+
Click any card to open the **Job Detail view**, where the live streaming log and the live metrics live. That's the next page: [The Job Detail view](the-job-detail-view).
|
|
73
|
+
|
|
74
|
+
## Cancelling a job
|
|
75
|
+
|
|
76
|
+
Click **■ Stop** on the rail header. The app sends `SIGTERM` to the subprocess, waits **5 seconds** for a clean exit, then `SIGKILL`s it. Nothing is left half-spawned.
|
|
77
|
+
|
|
78
|
+
## If a rail won't launch
|
|
79
|
+
|
|
80
|
+
If you pick an engine whose CLI isn't installed on your machine, the launch **fails fast** instead of starting a broken job — nothing spawns. Install the missing provider CLI ([Using Codex](../integrations/using-codex), [Using Gemini](../integrations/using-gemini)) and launch again. Missing Claude or Codex gives a precise "*<provider> CLI not found*" message; missing Gemini surfaces a generic launch error today, but the outcome is the same.
|
|
81
|
+
|
|
82
|
+
## Stopping everything
|
|
83
|
+
|
|
84
|
+
If something looks wrong:
|
|
85
|
+
|
|
86
|
+
- **One rail** — click **■ Stop** on its header.
|
|
87
|
+
- **Auto-pause on budget** — set a daily budget and the queue pauses itself when that day's spend hits the cap.
|
|
88
|
+
- **Everything** — quit the desktop app, or run `specrails-desktop stop`.
|
|
89
|
+
|
|
90
|
+
## Where to go next
|
|
91
|
+
|
|
92
|
+
- [The Job Detail view](the-job-detail-view) — phases, live metrics, ticket cards.
|
|
93
|
+
- [Batch implement & multi-feature](batch-implement-and-multi-feature) — run several specs at once.
|
|
94
|
+
- [Picking an engine per rail](picking-an-engine-per-rail) — Claude vs Codex vs Gemini.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# The Job Detail view
|
|
2
|
+
|
|
3
|
+
Click any job card on the **Jobs** page and you land here: the cockpit for a single rail run. It's built around one promise — **the live numbers you see are real, never guesses.** This page walks through the phases, the live metrics, and the ticket cards.
|
|
4
|
+
|
|
5
|
+
## The layout
|
|
6
|
+
|
|
7
|
+
Two panels sit above the full streaming log:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────────┐
|
|
11
|
+
│ Status header (icon · live duration · …) │
|
|
12
|
+
├─────────────────────────────────────────────┤
|
|
13
|
+
│ Ticket header ( #12 #14 #15 ) │
|
|
14
|
+
├─────────────────────────────────────────────┤
|
|
15
|
+
│ │
|
|
16
|
+
│ Streaming log (auto-scroll · search · …) │
|
|
17
|
+
│ │
|
|
18
|
+
└─────────────────────────────────────────────┘
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Pipeline phases
|
|
22
|
+
|
|
23
|
+
For `Implement` and `Batch` jobs, the run moves through the phases defined by the slash command — by default:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Architect ──► Developer ──► Reviewer ──► Ship
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Each phase is a specialised agent the rail's engine invokes in your project directory:
|
|
30
|
+
|
|
31
|
+
| Phase | Agent | What it does |
|
|
32
|
+
|-------|-------|--------------|
|
|
33
|
+
| **Architect** | `sr-architect` | Plans the implementation. |
|
|
34
|
+
| **Developer** | `sr-developer` | Writes the code. |
|
|
35
|
+
| **Reviewer** | `sr-reviewer` | Reviews the output. |
|
|
36
|
+
| **Ship** | (varies) | Final wrap-up: tests, commit, PR draft. |
|
|
37
|
+
|
|
38
|
+
Which agent handles each phase is decided by the project's **agent profile**. The baseline trio (`sr-architect`, `sr-developer`, `sr-reviewer`) is always present; routing rules in a profile can add agents or swap which one runs a phase. The phase progress bar only appears when the command actually defines phases — Ultracode jobs (which bypass the pipeline) won't show one.
|
|
39
|
+
|
|
40
|
+
## Live metrics — honest by design
|
|
41
|
+
|
|
42
|
+
The status header is the headline. It shows a status icon, an activity line describing what the job is doing *right now*, a count of steps taken, and a row of metrics:
|
|
43
|
+
|
|
44
|
+
| Metric | When you see the real value |
|
|
45
|
+
|--------|------------------------------|
|
|
46
|
+
| **Duration** | **Live.** A 1-second ticker counts up while the job runs — this is the one genuinely live number. |
|
|
47
|
+
| **Turns** | Derived incrementally from streamed assistant events as they arrive. |
|
|
48
|
+
| **Tokens** | Aggregated incrementally from the same stream (tolerant of events missing usage fields). |
|
|
49
|
+
| **Cost** | Shown as `—` until the job exits, then revealed as the authoritative `total_cost_usd`. |
|
|
50
|
+
|
|
51
|
+
The design principle: **no approximate or estimated mid-run numbers.** Duration is real because it's just a clock. Turns and tokens are accumulated from actual streamed activity. Cost is deliberately *not* estimated while running — it shows as pending and only resolves to its final, authoritative figure when the provider reports it at job exit. If a number looks like it's waiting, that's intentional — you're being shown truth, not a projection.
|
|
52
|
+
|
|
53
|
+
The header label and icon map to the job's status, and the panel renders for `running`, `completed`, and `failed` jobs alike — so a finished job's detail view shows the same metrics frozen at their final values.
|
|
54
|
+
|
|
55
|
+
## The ticket cards
|
|
56
|
+
|
|
57
|
+
The **ticket header** sits between the status header and the log. It's a premium identity card showing a chip for every spec the job touched — matched from the launched command, so it reflects exactly which tickets this run was about.
|
|
58
|
+
|
|
59
|
+
- **2–3 tickets** — shown as a list of chips.
|
|
60
|
+
- **4 or more** — collapse into a compact `+ N more` mode with an expand chevron, so the header stays tidy.
|
|
61
|
+
|
|
62
|
+
Clicking a chip opens that spec's detail **over the job page** — you don't lose your place or change route. It's a quick way to re-read what a job is supposed to deliver while you watch it work. (On tablet-width screens you can even drag a ticket modal aside to compare two specs side by side.)
|
|
63
|
+
|
|
64
|
+
## The streaming log
|
|
65
|
+
|
|
66
|
+
Below the panels is the full log of the run, streamed in real time over the WebSocket:
|
|
67
|
+
|
|
68
|
+
- **Auto-scroll** keeps the newest output in view (scroll up and it pauses so you can read).
|
|
69
|
+
- **Search** to jump to a phrase.
|
|
70
|
+
- **Copy** to grab the whole log.
|
|
71
|
+
|
|
72
|
+
This is the raw truth of what the AI is doing — every tool call, every file edit, every test run.
|
|
73
|
+
|
|
74
|
+
## Diagnostic export
|
|
75
|
+
|
|
76
|
+
If [telemetry](../settings/customizing) was enabled for the job, an **Export diagnostic** button appears in the header. It downloads a ZIP containing:
|
|
77
|
+
|
|
78
|
+
- `job-metadata.json` — command, status, profile, plugins.
|
|
79
|
+
- `telemetry.ndjson` — uncompressed OTLP/JSON signals.
|
|
80
|
+
- `logs.txt` — the full streaming log.
|
|
81
|
+
- `summary.md` — human-readable highlights.
|
|
82
|
+
- `profile.json`, `plugins.json` — exact snapshots of what ran (when present).
|
|
83
|
+
|
|
84
|
+
Handy for sharing a run with a teammate, or filing a precise bug report.
|
|
85
|
+
|
|
86
|
+
## Where to go next
|
|
87
|
+
|
|
88
|
+
- [Rails & jobs](rails-and-jobs) — launching and queueing.
|
|
89
|
+
- [Batch implement & multi-feature](batch-implement-and-multi-feature) — many specs, dependency waves.
|
|
90
|
+
- [Tracking cost](../analytics/tracking-cost) — turn per-job costs into project analytics.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Batch implement & multi-feature
|
|
2
|
+
|
|
3
|
+
One spec at a time is fine, but a lot of real work comes in clusters — a feature plus its tests plus its migration, or a backlog you want cleared in one sitting. This page covers running several specs together: Batch mode, dependency waves, and how the pipeline keeps concurrent work from colliding.
|
|
4
|
+
|
|
5
|
+
## Running several specs at once
|
|
6
|
+
|
|
7
|
+
The simplest way to run a pile of specs from one rail is **Batch** mode:
|
|
8
|
+
|
|
9
|
+
1. **Drag all the specs** you want onto a single rail. They stack up in that rail's spec list.
|
|
10
|
+
2. **Switch the rail's mode to Batch** (the segmented control in the rail header).
|
|
11
|
+
3. **Press ▶ Play.**
|
|
12
|
+
|
|
13
|
+
The rail launches **one** `/specrails:batch-implement` job that works through every assigned spec. Monitor it like any other job on the Jobs page — it's a single job covering the whole set, not one job per spec.
|
|
14
|
+
|
|
15
|
+
This matters because of the **one-job-per-project queue**. Since a project runs only one rail job at a time, Batch mode is also the cleanest way to *chain* a list of specs without juggling multiple rails and waiting for each to drain.
|
|
16
|
+
|
|
17
|
+
### Implement vs Batch — which mode?
|
|
18
|
+
|
|
19
|
+
| | **Implement** | **Batch** |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| Command | `/specrails:implement` | `/specrails:batch-implement` |
|
|
22
|
+
| Specs per job | All on the rail, treated as one unit of work | All on the rail, worked **sequentially** |
|
|
23
|
+
| Best for | A tightly coupled change | Several distinct features you want cleared in order |
|
|
24
|
+
| Ordering | n/a | Dependency-aware waves (see below) |
|
|
25
|
+
|
|
26
|
+
If the specs are really one change, use **Implement**. If they're a list of separate features, use **Batch** and let it sequence them.
|
|
27
|
+
|
|
28
|
+
## Dependency waves
|
|
29
|
+
|
|
30
|
+
Batch mode doesn't just run specs top to bottom — it computes a **dependency-aware execution order** and groups specs into *waves*. The orchestrator (`/specrails:batch-implement`) figures out which specs depend on which, then schedules them so that nothing runs before the work it builds on.
|
|
31
|
+
|
|
32
|
+
Conceptually:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Wave 1: #2 (data model) ← no dependencies, runs first
|
|
36
|
+
Wave 2: #4 (API on the model) ← waits for #2
|
|
37
|
+
#5 (CLI on the model) ← waits for #2
|
|
38
|
+
Wave 3: #7 (docs across all) ← waits for #4 and #5
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Within the job, each wave's specs are implemented before the next wave starts. You don't configure this by hand — the orchestrator derives the waves from the specs themselves. Watch it unfold in the [Job Detail view](the-job-detail-view): the streaming log narrates which spec the batch is on, and the ticket header shows every spec the job touched.
|
|
42
|
+
|
|
43
|
+
## Worktree isolation
|
|
44
|
+
|
|
45
|
+
When several specs are implemented in one run, the pipeline keeps each unit of work isolated so concurrent or sequential changes don't trample each other's files. The batch orchestrator runs each spec's implementation in its own clean working context, then integrates the results — so a half-finished spec never leaves your tree in a broken intermediate state visible to the next one.
|
|
46
|
+
|
|
47
|
+
In practice this means:
|
|
48
|
+
|
|
49
|
+
- Each spec gets a clean slate to implement against, rather than inheriting the in-flight edits of the previous spec mid-stream.
|
|
50
|
+
- Reviews and ship steps operate on a coherent snapshot, not a moving target.
|
|
51
|
+
- A failure in one wave is contained — it doesn't silently corrupt the specs that already shipped.
|
|
52
|
+
|
|
53
|
+
The app records, per job, exactly which files were touched and which ticket touched them (you'll see this surface as provenance chips in the **Code** section and as a "Files touched by this ticket" list on each spec's detail modal). That attribution is what lets you trust a multi-spec run: you can always trace a file change back to the spec that caused it.
|
|
54
|
+
|
|
55
|
+
## Multi-feature across projects
|
|
56
|
+
|
|
57
|
+
If you want genuine parallelism — two big features building at the same time — split them **across projects**, not across rails in one project. Each project has its own independent queue, so:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Project A ▶ Rail running feature X ┐
|
|
61
|
+
├─ run simultaneously
|
|
62
|
+
Project B ▶ Rail running feature Y ┘
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
There's no global concurrency limit and no contention between projects. Open both, launch a rail in each, and they progress together. The only shared throttle is your budget cap, which pauses queues per-project or app-wide once the day's spend hits the limit.
|
|
66
|
+
|
|
67
|
+
## Tips for big batches
|
|
68
|
+
|
|
69
|
+
- **Group related specs on one rail** before switching to Batch — the dependency waves only see what's on that rail.
|
|
70
|
+
- **Set a daily budget** before a large batch so an unexpectedly expensive run auto-pauses instead of running away. Configure it under [Budget](../settings/customizing).
|
|
71
|
+
- **Use the Compare button** on the Jobs page afterward to diff two batch runs side by side.
|
|
72
|
+
- **Export a diagnostic** (if telemetry was on) to get the exact profile + plugin snapshot for the whole batch.
|
|
73
|
+
|
|
74
|
+
## Where to go next
|
|
75
|
+
|
|
76
|
+
- [Rails & jobs](rails-and-jobs) — the queue model in depth.
|
|
77
|
+
- [The Job Detail view](the-job-detail-view) — watch a batch run live.
|
|
78
|
+
- [Picking an engine per rail](picking-an-engine-per-rail) — note that Batch runs on any provider; Ultra is Claude-only.
|