specrails-desktop 2.25.0 → 2.26.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.
Files changed (140) hide show
  1. package/client/dist/assets/{ActivityFeedPage-BGRTOOhT.js → ActivityFeedPage-C1LftFSE.js} +1 -1
  2. package/client/dist/assets/{AgentBrowserCapture-DvDLxsUy.js → AgentBrowserCapture-B5prW-V0.js} +1 -1
  3. package/client/dist/assets/{AgentModeCodePane-DfwctjzN.js → AgentModeCodePane-b6UmdjwB.js} +2 -2
  4. package/client/dist/assets/{AgentModeJobsPane-G3WrS-sE.js → AgentModeJobsPane-DW3Wj5oi.js} +1 -1
  5. package/client/dist/assets/{AgentsPage-DGFFijMC.js → AgentsPage-DBMnhdlq.js} +3 -3
  6. package/client/dist/assets/{AnalyticsPage-hoJmlEpk.js → AnalyticsPage-DjFf1OxU.js} +1 -1
  7. package/client/dist/assets/{BarChart-BEhAXVK-.js → BarChart-nmDbbUiR.js} +1 -1
  8. package/client/dist/assets/{CodePage-B4zB9DVC.js → CodePage-DHd46Sm7.js} +1 -1
  9. package/client/dist/assets/{DesktopAnalyticsPage-CBX-Qpxd.js → DesktopAnalyticsPage-ee0bpk-F.js} +1 -1
  10. package/client/dist/assets/{DocsDialog-lTsnNdAM.js → DocsDialog-CGUzB1zX.js} +1 -1
  11. package/client/dist/assets/{DocsPage-CkvdGroT.js → DocsPage-96iws84I.js} +1 -1
  12. package/client/dist/assets/{ExportDropdown-Da98gR-P.js → ExportDropdown-Dzk2Lkxw.js} +1 -1
  13. package/client/dist/assets/{IntegrationsPage-Cf9o4eZq.js → IntegrationsPage-Bta2lAhq.js} +1 -1
  14. package/client/dist/assets/{InteractiveJobComposer-C8N-Bbnn.js → InteractiveJobComposer-B9S_ZGJS.js} +5 -5
  15. package/client/dist/assets/{JobDetailModal-BZVwIIEx.js → JobDetailModal-DhrwU2z0.js} +1 -1
  16. package/client/dist/assets/{JobDetailPage-CQewQ1zy.js → JobDetailPage-BnhoXkql.js} +1 -1
  17. package/client/dist/assets/{JobsPage-CB4wOxmE.js → JobsPage-BBT9fyhg.js} +1 -1
  18. package/client/dist/assets/{LoopBuilderPage-B9Y5gt08.js → LoopBuilderPage-5ucN9Hq9.js} +2 -2
  19. package/client/dist/assets/{LoopPreviewModal-kxQ5kV1t.js → LoopPreviewModal-wKAts-Wf.js} +1 -1
  20. package/client/dist/assets/{LoopsPage-RysW-6sC.js → LoopsPage-COyxf6Pa.js} +1 -1
  21. package/client/dist/assets/{ProjectSettingsDialog-BHN5qsGT.js → ProjectSettingsDialog-CcToBI-Z.js} +1 -1
  22. package/client/dist/assets/{TemplatePreviewModal-DW6lZCIs.js → TemplatePreviewModal-_Dy6ceXg.js} +1 -1
  23. package/client/dist/assets/agent-BmH52J4j.js +1 -0
  24. package/client/dist/assets/agent-Bxb9RRNW.js +1 -0
  25. package/client/dist/assets/agent-Cg49-TGZ.js +1 -0
  26. package/client/dist/assets/agent-DgDtg-0Y2.js +1 -0
  27. package/client/dist/assets/agent-DolxzTol.js +1 -0
  28. package/client/dist/assets/agent-DwDR2Exf2.js +1 -0
  29. package/client/dist/assets/agent-_tfCgFUk.js +1 -0
  30. package/client/dist/assets/agent-gFi-qvxO2.js +1 -0
  31. package/client/dist/assets/{brain-B9dkGuAN.js → brain-BJ2Gd98j.js} +1 -1
  32. package/client/dist/assets/code-CwnBPPyA.js +1 -0
  33. package/client/dist/assets/dashboard-90r0QcUc2.js +1 -0
  34. package/client/dist/assets/dashboard-B0C6mJP-.js +1 -0
  35. package/client/dist/assets/dashboard-BOx0FR1L2.js +1 -0
  36. package/client/dist/assets/dashboard-BcjUOLJr.js +1 -0
  37. package/client/dist/assets/dashboard-C27kNpjn.js +1 -0
  38. package/client/dist/assets/dashboard-DJAj2EbH.js +1 -0
  39. package/client/dist/assets/dashboard-DNd1Gobs.js +1 -0
  40. package/client/dist/assets/dashboard-DZWrDAYm2.js +1 -0
  41. package/client/dist/assets/{dist-js-Bbd7Wzdw.js → dist-js-CXAsO0Z8.js} +1 -1
  42. package/client/dist/assets/{dist-js-BW5-IZTP.js → dist-js-D7smLA35.js} +1 -1
  43. package/client/dist/assets/index-B3ejvKSt.js +156 -0
  44. package/client/dist/assets/index-C695aPdV.css +2 -0
  45. package/client/dist/assets/{lib-EIkIPf26.js → lib-BIHmUkcn.js} +1 -1
  46. package/client/dist/assets/{loops-YYV2bwjd.js → loops-Brnx4Fji.js} +1 -1
  47. package/client/dist/assets/{loops-hXgncEpF2.js → loops-BvqQ-bHR2.js} +1 -1
  48. package/client/dist/assets/{loops-BvEenWBy.js → loops-CvOWsi5r.js} +1 -1
  49. package/client/dist/assets/{loops-DjOtVXRo.js → loops-D6D3XHjj.js} +1 -1
  50. package/client/dist/assets/{loops-HTHf-xu32.js → loops-DJNhp17p2.js} +1 -1
  51. package/client/dist/assets/{loops-kYbydDyN.js → loops-K5_HXfJa.js} +1 -1
  52. package/client/dist/assets/loops-LIgO_-eM.js +1 -0
  53. package/client/dist/assets/{loops-DNGiYKll2.js → loops-vhJdbcz92.js} +1 -1
  54. package/client/dist/assets/{settings-BsJMsWGc.js → settings-BHdPchJP.js} +1 -1
  55. package/client/dist/assets/{settings-lFoaYT-s2.js → settings-BeCczBFS2.js} +1 -1
  56. package/client/dist/assets/{settings-DZJeXoRV.js → settings-BlLi719f.js} +1 -1
  57. package/client/dist/assets/{settings-BOHOmHkb.js → settings-C_nY14Yz.js} +1 -1
  58. package/client/dist/assets/{settings-D6qY9_UI.js → settings-CaZ26a0S.js} +1 -1
  59. package/client/dist/assets/{settings-BlEA_7h02.js → settings-D54_cgl12.js} +1 -1
  60. package/client/dist/assets/settings-D9bDDe2O.js +1 -0
  61. package/client/dist/assets/{settings-TNga5gIF2.js → settings-cn0tbve62.js} +1 -1
  62. package/client/dist/assets/{setup-iY8vH8pB.js → setup-7J8TjG4O.js} +1 -1
  63. package/client/dist/assets/{setup-D674kWQH.js → setup-BXpw07r-.js} +1 -1
  64. package/client/dist/assets/{setup-B590KsTX.js → setup-BiduSX9d.js} +1 -1
  65. package/client/dist/assets/{setup-CmU6bTCV2.js → setup-BuQNKztt2.js} +1 -1
  66. package/client/dist/assets/{setup-CEj6uY3-2.js → setup-BwMovM9z2.js} +1 -1
  67. package/client/dist/assets/{setup-BkyGoby6.js → setup-D84y3wx-.js} +1 -1
  68. package/client/dist/assets/{setup-CbIerFGf2.js → setup-DU0ULX8q2.js} +1 -1
  69. package/client/dist/assets/{setup-VNqXyB6Y.js → setup-RiUHzq7E.js} +1 -1
  70. package/client/dist/assets/{upload-BCMl-nCg.js → upload-xdQuJvXN.js} +1 -1
  71. package/client/dist/assets/{value-CG-amSq1.js → value-Bk2f9AUg.js} +1 -1
  72. package/client/dist/index.html +22 -9
  73. package/docs/agy-cli-provider-study.md +1 -1
  74. package/docs/codex.md +2 -2
  75. package/docs/gemini-cli-provider-study.md +2 -2
  76. package/docs/guide/de/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  77. package/docs/guide/en/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  78. package/docs/guide/es/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  79. package/docs/guide/fr/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  80. package/docs/guide/it/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  81. package/docs/guide/ja/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  82. package/docs/guide/pt/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  83. package/docs/guide/pt/pipeline/5-the-loop-builder.md +1 -1
  84. package/docs/guide/zh/pipeline/3-batch-implement-and-multi-feature.md +1 -1
  85. package/docs/internals/api-reference.md +3 -3
  86. package/docs/internals/companion-rails-as-loops-contract.md +6 -6
  87. package/docs/internals/configuration.md +1 -1
  88. package/docs/internals/interactive-jobs.md +3 -3
  89. package/docs/internals/safe-pr-review-flow.md +1 -1
  90. package/docs/internals/visual-design-audit.md +2 -2
  91. package/docs/running-pipelines.md +1 -1
  92. package/package.json +1 -1
  93. package/server/dist/agent-chat-manager.js +16 -2
  94. package/server/dist/agent-chat-router.js +66 -1
  95. package/server/dist/agent-context-resolver.js +301 -0
  96. package/server/dist/agent-operator-prompt.js +58 -11
  97. package/server/dist/agent-store.js +24 -12
  98. package/server/dist/db.js +17 -17
  99. package/server/dist/desktop-db.js +6 -0
  100. package/server/dist/desktop-router.js +9 -2
  101. package/server/dist/feature-flags.js +2 -2
  102. package/server/dist/index.js +1 -1
  103. package/server/dist/interactive-job-session.js +3 -3
  104. package/server/dist/loop-command-catalog.js +11 -11
  105. package/server/dist/loop-factory.js +7 -7
  106. package/server/dist/loop-graph.js +2 -2
  107. package/server/dist/loop-run-manager.js +1 -1
  108. package/server/dist/mcp/guide.js +41 -10
  109. package/server/dist/mcp/tools/app-settings.js +18 -2
  110. package/server/dist/mcp/tools/catalog.js +2 -0
  111. package/server/dist/mcp/tools/rails.js +29 -9
  112. package/server/dist/mcp/tools/support.js +324 -0
  113. package/server/dist/mobile/mobile-router.js +1 -1
  114. package/server/dist/project-router-jobs.js +1 -1
  115. package/server/dist/project-router-loop-runs.js +1 -1
  116. package/server/dist/project-router-settings.js +5 -5
  117. package/server/dist/queue-manager.js +27 -27
  118. package/server/dist/rail-isolated-launch.js +5 -1
  119. package/server/dist/rails-router.js +76 -27
  120. package/client/dist/assets/agent-4ARs0uac2.js +0 -1
  121. package/client/dist/assets/agent-C55wwsUX.js +0 -1
  122. package/client/dist/assets/agent-C_kqyrXo.js +0 -1
  123. package/client/dist/assets/agent-Df3lnHMu.js +0 -1
  124. package/client/dist/assets/agent-G6Zn2gpr.js +0 -1
  125. package/client/dist/assets/agent-MQhun7cv.js +0 -1
  126. package/client/dist/assets/agent-NqlER4Yh2.js +0 -1
  127. package/client/dist/assets/agent-OTGI6t7e2.js +0 -1
  128. package/client/dist/assets/code-CqCcRThR.js +0 -1
  129. package/client/dist/assets/dashboard-4WX7agHF2.js +0 -1
  130. package/client/dist/assets/dashboard-5Z_esXIB.js +0 -1
  131. package/client/dist/assets/dashboard-DQ-po1MG2.js +0 -1
  132. package/client/dist/assets/dashboard-IbEztmJ52.js +0 -1
  133. package/client/dist/assets/dashboard-nc-Raovv.js +0 -1
  134. package/client/dist/assets/dashboard-ojWdDq6S.js +0 -1
  135. package/client/dist/assets/dashboard-oqS7VRrK.js +0 -1
  136. package/client/dist/assets/dashboard-zfoJcdFW.js +0 -1
  137. package/client/dist/assets/index-BtAks9nm.css +0 -2
  138. package/client/dist/assets/index-DC-REAcL.js +0 -155
  139. package/client/dist/assets/loops-CBiWd9Hf.js +0 -1
  140. package/client/dist/assets/settings-Mr7MnJbf.js +0 -1
@@ -1 +1 @@
1
- var e=`Loops`,t=`再利用可能な自動化ループ — すべてのプロジェクトで共有されます。`,n=`新しいループ`,r={drafts:`下書き`,published:`公開済み`,templates:`テンプレート`,builtIn:`組み込み`},i={search:`テンプレートを検索…`,noResults:`フィルターに一致するテンプレートがありません。`,clearFilter:`フィルターをクリア`,resultCount_one:`{{count}} 件のテンプレート`,resultCount_other:`{{count}} 件のテンプレート`,needsSpec:`スペックが必要`,standalone:`単独実行`,needsSpecHint:`スペックをドラッグした rail で実行`,standaloneHint:`単独で実行 — プロジェクトを選ぶだけ`},a={API:`API`,Automation:`自動化`,CI:`CI`,Database:`データベース`,Debugging:`デバッグ`,DevOps:`DevOps`,Docs:`ドキュメント`,Git:`Git`,Maintenance:`メンテナンス`,Performance:`パフォーマンス`,Planning:`計画`,Quality:`品質`,Review:`レビュー`,Security:`セキュリティ`,Testing:`テスト`},o={draft:`下書き`,published:`公開済み`,running:`実行中`},s={title:`ループはまだありません`,body:`ゼロから作成するか、テンプレートから始めましょう。`},c={edit:`編集`,delete:`削除`,publish:`公開`,unpublish:`公開を取り消す`,duplicate:`複製`,use:`テンプレートを使用`,preview:`プレビュー`,fork:`フォークして編集`,run:`実行`,export:`エクスポート`,import:`インポート`,select:`{{name}} を選択`},l={nodes_one:`{{count}} 個のノード`,nodes_other:`{{count}} 個のノード`,usedIn:`使用中 · {{project}}`},u=`このループを削除しますか?すべてのレールのピッカーから表示されなくなります。`,d=`新しいループ`,f={load:`ループの読み込みに失敗しました`,save:`ループの保存に失敗しました`,publishInvalid:`このループはまだ公開できません — ハイライトされた問題を修正してください。`},p={back:`ループに戻る`,save:`保存`,saved:`ループを保存しました`,publish:`公開`,published:`ループを公開しました`,addNode:`ノードを追加`,deleteNode:`ノードを削除`,config:{maxIterations:`最大反復回数`,timeout:`タイムアウト(分)`,maxIterationsHint:`Loop Decider の反復回数の上限 — 目標が未達でも到達したらループを停止。暴走ループを防ぎます。`,timeoutHint:`実行全体の実時間の上限(分)。超過すると実行は停止し失敗として記録されます — 最大反復回数と並ぶ安全策です。`,maxCost:`最大コスト ($)`,maxCostHint:`実行全体の任意の USD 予算。ステップ間で確認(各ステップの費用はそのステップ終了時にのみ判明)するため、合計が超えると次のステップ前にループを停止します(1ステップ分超過する可能性あり)。Claude 以外のプロバイダーでは費用は推定値です。空欄 = 上限なし。`},nodes:{start:`開始`,"ai-step":`AI ステップ`,shell:`シェル`,decider:`ループ判定`,condition:`条件`,end:`終了`},inspector:{selectNode:`編集するノードを選択してください。`,prompt:`プロンプト`,provider:`プロバイダー`,model:`モデル`,effort:`推論の労力`,command:`コマンド`,goal:`目標 / 停止条件`,join:`結合`,outcome:`結果`,startNote:`ループのエントリーポイント。最初のステップに接続してください。`,promptHint:`トークンをクリックまたはドラッグしてプロンプトに挿入します。`,tokensSpec:`Spec フィールド`,tokensJira:`Jira`,tokensCommands:`コマンド`,label:`名前`},branch:{continue:`↻ 続行`,stop:`✓ 終了`},edgesHelp:{label:`ステップの接続方法`,body:`矢印は実行の順序を設定するもので、データの流れではありません — ボックスには入力ポートがなく、エッジはパラメータを運びません。各 AI Step は自動的にそのセッションを再開し (これまでの完全なコンテキスト)、加えて前のステップの短い要約を引き継ぎます。手作業での配線は一切ありません。Loop Decider には 2 つの出力があります: ↻ Continue (目標未達 → ループバック) と ✓ Stop (目標達成 → 終了)。`},arrange:{label:`整列`,vertical:`垂直`,horizontal:`水平`,grid:`グリッド`,reset:`リセット`},constants:{label:`定数`,manage:`定数を管理`,title:`ループ定数`,empty:`カスタム定数はまだありません。`,name:`名前`,value:`値`,add:`追加`,builtinBadge:`組み込み`},paste:{done_one:`{{count}} 個のステップを貼り付けました`,done_other:`{{count}} 個のステップを貼り付けました`},problems:{count_one:`{{count}} 件の問題`,count_other:`{{count}} 件の問題`,NO_START:`開始ノードを追加してください。`,MULTIPLE_START:`開始ノードは1つだけ許可されます。`,NO_END:`終了ノードを少なくとも1つ追加してください。`,ORPHAN:`このステップは開始から到達できません。`,DECIDER_BRANCHES:`Loop Decider には継続と停止の分岐が必要です。`,EMPTY_PROMPT:`AI ステップのプロンプトが空です。`,EMPTY_COMMAND:`Shell ステップのコマンドが空です。`,EMPTY_GOAL:`Loop Decider に目標がありません。`,DEAD_END:`このステップには出力接続がありません。`},preview:{label:`プレビュー`,title:`ドライラン プレビュー`,sampleNote:`Spec の値はサンプルです。コマンドと定数は実行時と同じように解決されます。`,empty:`プレビューするステップがありません。`,error:`プレビューに失敗しました`}},m={steps:`ステップ`,limits:`最大 {{iterations}} 回 · {{timeout}} 分タイムアウト`,openInBuilder:`ビルダーで開く`,builtin:`ビルトイン`},h=`組み込み`,g={title:`{{name}} を実行`,subtitle:`このループをプロジェクトで実行します(チケット不要)。`,project:`プロジェクト`,provider:`プロバイダー`,model:`モデル`,effort:`推論の強度`,execute:`実行`,noProjects:`利用可能なプロジェクトがありません。`,launched:`{{name}} を実行中`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"完全自律: spec を実装し、検証し、失敗時には修正 (refine) する — すべてがグリーンになるまで 検証 → 修正 → 検証 をループします。人手による介入は不要です。"},"verify-pass":{"name":"Verify Pass","description":"自律的な検証と修正: プロジェクトの build / lint / テストを検出して実行し、失敗時には修正 — グリーンになるまで 検証 → 修正 → 検証 を繰り返します。"},"ci-watch":{"name":"CI Watch","description":"オープンな PR の CI チェックをポーリングし (エージェントがリポジトリの CI ツールを使用)、すべてのチェックがグリーンになるまで続けます。"},"lint-and-fix":{"name":"Lint & Fix","description":"エージェントがプロジェクトの linter を検出して実行し、すべての問題を修正します。コードベースがクリーンになるまで反復します。"},"type-safe":{"name":"Type Safe","description":"エージェントがプロジェクトの型チェッカーを検出して実行し、すべてのエラーを解消します。問題なくパスするまで反復します。"},"coverage-climb":{"name":"Coverage Climb","description":"エージェントがプロジェクトのカバレッジツールを実行し、しきい値をパスするまで的を絞ったテストを追加します。"},"build-fix":{"name":"Build Fix","description":"エージェントがプロジェクトの本番 build を検出して実行し、グリーンになるまでコンパイル / バンドルのエラーを修正します。"},"deploy-check":{"name":"Deploy Check","description":"エージェントがデプロイ / ヘルスステータスをポーリングし (プロジェクトの deploy ツールを使用)、サービスが正常を報告するまで続けます。"},"factory_implement":{"name":"実装","description":"完全自律: spec を実装し、検証し、失敗時には修正 (refine) する — すべてのテストがパスするまでループします。"},"factory_batch":{"name":"一括実装","description":"レールのすべてのチケットを一度に一括実装し、失敗時にはグリーンになるまで 検証 + 修正 を行います。"},"factory_ultracode":{"name":"Freestyle","description":"スペックをそのままモデルに渡して完全な自由を与えます — パイプラインなしで通常のコーディングエージェントのように動作し、その後グリーンになるまで検証+改善します。Claude 専用。"},"autoloop-tdd":{"name":"TDD 自動ループ","description":"{{spec.title}} に対する厳格なレッド・グリーン・リファクタのサイクル。まず失敗するテストで各挙動を固定し、グリーンにする最小限のコードだけを書き、整理する。仕様を完全にカバーするまで繰り返します。"},"e2e-until-green":{"name":"グリーンまで E2E","description":"{{spec.title}} の E2E スイートを実行し、失敗したユーザーフローを一つずつ診断して、根本にある UI や連携の不具合を修正。すべての E2E が通るまでサイクルを回します。"},"flaky-test-triage":{"name":"Flaky テスト切り分け","description":"{{spec.title}} まわりの失敗テストを何度か再実行し、本物のリグレッションと不安定な flake を切り分け。実際の破損を直し、flaky なものは安定化または記録します。"},"independent-verifier-pass":{"name":"独立検証パス","description":"{{spec.title}} を敵対的に検証。ビルド・lint・テストをゼロから再実行し、過去の「動いた」という主張ではなく生のコマンド出力だけを信じて、あらゆる抜けを洗い出し修正します。"},"post-edit-test-guard":{"name":"編集後テストガード","description":"{{spec.title}} の編集をひとまとまり加えるたびに、変更ファイルに関わる最小限のテストを即座に実行。リグレッションを最後ではなく発生した瞬間に捕まえます。"},"post-merge-regression-guard":{"name":"マージ後リグレッション防止","description":"マージやリベースで他人の作業が {{spec.title}} に入った直後に高速な smoke test を実行し、連携の破損を即座に検出。新たな機能開発を上に積み始める前に手当てします。"},"pre-commit-guard":{"name":"コミット前ガード","description":"{{spec.title}} のすべてのコミットを差し止める安全ゲート。先にテストスイートを実行し、レッドの間はコミットを拒否するので、壊れたコードが履歴に入りません。"},"visual-regression-until-match":{"name":"一致までビジュアル回帰","description":"変更した UI のビジュアルスナップショットを取得し、意図しないピクセル差分をすべて追跡。承認された意図的なデザイン変更だけが残り、ビジュアルスイートがグリーンになるまで自己修正します。"},"format-until-clean":{"name":"クリーンまで整形","description":"プロジェクトのフォーマッタを適用し、自動修正できない少数のスタイル問題を片付け、再度フォーマットを実行しても作業ツリーが変化しなくなるまで続けます。"},"lint-typecheck-fix":{"name":"lint・型チェック修正","description":"linter と型チェッカーを実行し、報告された各問題を最小限の編集で解消。両方のゲートが完全にクリーンになるまでループします。"},"a11y-audit-until-clean":{"name":"クリーンまで A11y 監査","description":"変更した画面に自動アクセシビリティチェックを実行し、違反をカテゴリごとに一つずつ修正。監査の指摘がゼロになるまで繰り返します。"},"de-sloppify-pass":{"name":"雑さ除去パス","description":"機能が入った後、差分に残った雑なもの — デバッグ出力、不要な分岐、いい加減な命名、肥大した関数 — を一掃して整理し、その整理が何も壊していないことを証明します。"},"fix-ci-until-green":{"name":"グリーンまで CI 修正","description":"このブランチで直近にレッドになった CI を取得し、手元で破損を再現。本当の原因を直してプッシュし、すべてのチェックが成功するまでサイクルを回します。"},"pr-babysitter":{"name":"PR 見守り","description":"一定間隔で、見ている PR を巡回し、各 PR をマージ可能に保ちます。レッドの CI を立て直し、ベースブランチから遅れたものはリベースし、停滞したものには催促を — 人の判断が要るものはエスカレーションします。"},"pr-watch-loop":{"name":"PR 監視ループ","description":"ウォッチリストの PR を一定間隔でポーリングし、各 PR の CI とレビュー状況を要約。些細な阻害要因はその場で片付け、担当者が必要なものは表に出します。"},"pr-self-review":{"name":"PR セルフレビュー","description":"自分の作業差分を、厳しいシニアレビュアーになったつもりで批評し、見つけた点を解消。重大な指摘が出なくなるまで再レビューします — PR を手放す前に。"},"spec-first-ship":{"name":"仕様ファースト出荷","description":"要件チェックリストを一項目ずつ完了へ導きます。各パスで未チェックの要件を一つ実装して証明し、チェックを付ける — 仕様が「完了」の契約になります。"},"dependency-audit-weekly":{"name":"週次 依存監査","description":"毎週、遅れているパッケージを棚卸しし、安全に上げられるものと危ういものに仕分けて、すぐ実行できる明確なアップグレード計画を返します。"},"dependency-upgrade-one-by-one":{"name":"依存を一つずつ更新","description":"パスごとに古いパッケージを正確に一つだけ上げ、それで壊れた箇所を直し、プロジェクトがまだ動くことを証明してコミット — まとめて上げるより遥かに安全です。"},"knip-until-clean":{"name":"クリーンまでデッドコード除去","description":"参照されないエクスポート、孤立したファイル、誰も import しない依存を洗い出して安全に削除。デッドコードスキャナの報告が無くなるまで続けます。"},"docs-sync-after-edits":{"name":"ドキュメントをコードに同期","description":"コード編集を一通り終えたら、変更が触れたドキュメント — README、API リファレンス、インラインコメント — をすべて探し出し、実際の挙動に合わせて更新します。"},"security-audit-weekly":{"name":"週次 セキュリティ監査","description":"依存ツリーに対し毎週、脆弱性スキャンを実行し、出てきたものを深刻度と実際の露出度でトリアージして、優先順位付きの是正計画を返します。"},"npm-audit-fix-loop":{"name":"脆弱性を一つずつ修正","description":"依存の high・critical の勧告を慎重に解消します。パスごとに一つ修正し、それぞれをテストスイートで検証 — ビルドを静かに壊しかねない一括強制修正は避けます。"},"api-contract-until-match":{"name":"一致まで API 契約","description":"実装のレスポンスが公開された API 契約を満たすまで作業を進め、スキーマが約束する内容とハンドラが実際に返す内容との乖離を埋めます。"},"openapi-sync-until-valid":{"name":"妥当になるまで OpenAPI 同期","description":"OpenAPI ドキュメントを整形式かつ実際のルートハンドラに忠実に保ちます。仕様エラーやコードとドキュメントのずれをパスごとに直し、linter が満足するまで続けます。"},"migration-until-applied":{"name":"適用までマイグレーション","description":"データベーススキーマをきれいに前へ進めます。保留中のマイグレーションを実行し、浮かび上がったスキーマや SQL の不具合を直し、マイグレーション履歴の整合を確認します。"},"bundle-size-budget":{"name":"バンドルサイズ予算","description":"クライアントバンドルを予算超過させずに機能を投入します。パスごとに計測し、サイズゲートがグリーンになるまで削減・コード分割・遅延読み込みを行います。"},"changelog-sync-after-ship":{"name":"出荷後 Changelog 同期","description":"出荷後、changelog がユーザー向けの物語を語れているか確認します。入った変更を見直し、Keep a Changelog 形式のエントリを書き、目に見える変更が漏れていないか確かめます。"},"guardrails-learning-loop":{"name":"ガードレール学習ループ","description":"ゲートがグリーンになるまで反復しますが、同じ失敗が二度起きるたびに先にガードレールメモを書き残し、既に失敗した手を試し直してイテレーションを無駄にしないようにします。"},"ralph-story-executor":{"name":"バックログ実行","description":"ユーザーストーリーのバックログを毎回まっさらな文脈で一つずつ処理します。次の未完ストーリーを選び、それだけを作り、プロジェクトのゲートがグリーンに保たれることを証明し、コミットして完了とし、次へ進みます。"},"investigation-script-loop":{"name":"調査スクリプトループ","description":"バグの真の原因を実証的に突き止めます。疑わしい挙動を再現する使い捨ての小さなスクリプトを書いて実行し、生の出力を読み、その出力自体が根本原因を示すまでプローブを磨きます。"},"reflexion-debug-loop":{"name":"省察デバッグループ","description":"失敗するテストを空回りせずグリーンにします。試行が失敗するたびに短い省察をディスクに記録し、次の試みの前に参照することで、既に除外した修正をループが繰り返さないようにします。"},"merge-conflict-resolver":{"name":"マージ競合の解決","description":"リベースでブランチをターゲットに追従させ、両者の意図を保ちながら競合をファイルごとに解消。結果がなお通ることを証明してから、ブランチが最新になったと宣言します。"},"staging-smoke-test":{"name":"ステージング smoke test","description":"ステージングへのデプロイ後、固定の smoke チェックリスト — 認証、主要なユーザー導線、重要な連携 — をたどり、壊れるたびに最小の問題を直して再実行。チェックリスト全体がクリーンになるまで繰り返します。"},"deploy-verification-loop":{"name":"デプロイ検証ループ","description":"デプロイ後、health と smoke のエンドポイントを一定間隔でポーリングし、不健全な応答を調査して修正またはエスカレーション。設定したすべてのエンドポイントが成功を報告するまでチェックを続けます。"},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"チケットからアーカイブまでの OpenSpec ライフサイクル: アーティファクト生成 (opsx:ff) → 実装 (opsx:apply) → 検証 (opsx:verify)。FAIL なら同じ change を修正しに戻り、PASS なら無人でアーカイブします。"}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} 個のループをインポートしました`,done_other:`{{count}} 個のループをインポートしました`,skipped_one:`{{count}} 件の重複をスキップ:{{names}}`,skipped_other:`{{count}} 件の重複をスキップ:{{names}}`,invalid:`そのファイルは有効なループのエクスポートではありません。`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
1
+ var e=`Loops`,t=`再利用可能な自動化ループ — すべてのプロジェクトで共有されます。`,n=`新しいループ`,r={drafts:`下書き`,published:`公開済み`,templates:`テンプレート`,builtIn:`組み込み`},i={search:`テンプレートを検索…`,noResults:`フィルターに一致するテンプレートがありません。`,clearFilter:`フィルターをクリア`,resultCount_one:`{{count}} 件のテンプレート`,resultCount_other:`{{count}} 件のテンプレート`,needsSpec:`スペックが必要`,standalone:`単独実行`,needsSpecHint:`スペックをドラッグした rail で実行`,standaloneHint:`単独で実行 — プロジェクトを選ぶだけ`},a={API:`API`,Automation:`自動化`,CI:`CI`,Database:`データベース`,Debugging:`デバッグ`,DevOps:`DevOps`,Docs:`ドキュメント`,Git:`Git`,Maintenance:`メンテナンス`,Performance:`パフォーマンス`,Planning:`計画`,Quality:`品質`,Review:`レビュー`,Security:`セキュリティ`,Testing:`テスト`},o={draft:`下書き`,published:`公開済み`,running:`実行中`},s={title:`ループはまだありません`,body:`ゼロから作成するか、テンプレートから始めましょう。`},c={edit:`編集`,delete:`削除`,publish:`公開`,unpublish:`公開を取り消す`,duplicate:`複製`,use:`テンプレートを使用`,preview:`プレビュー`,fork:`フォークして編集`,run:`実行`,export:`エクスポート`,import:`インポート`,select:`{{name}} を選択`},l={nodes_one:`{{count}} 個のノード`,nodes_other:`{{count}} 個のノード`,usedIn:`使用中 · {{project}}`},u=`このループを削除しますか?すべてのレールのピッカーから表示されなくなります。`,d=`新しいループ`,f={load:`ループの読み込みに失敗しました`,save:`ループの保存に失敗しました`,publishInvalid:`このループはまだ公開できません — ハイライトされた問題を修正してください。`},p={back:`ループに戻る`,save:`保存`,saved:`ループを保存しました`,publish:`公開`,published:`ループを公開しました`,addNode:`ノードを追加`,deleteNode:`ノードを削除`,config:{maxIterations:`最大反復回数`,timeout:`タイムアウト(分)`,maxIterationsHint:`Loop Decider の反復回数の上限 — 目標が未達でも到達したらループを停止。暴走ループを防ぎます。`,timeoutHint:`実行全体の実時間の上限(分)。超過すると実行は停止し失敗として記録されます — 最大反復回数と並ぶ安全策です。`,maxCost:`最大コスト ($)`,maxCostHint:`実行全体の任意の USD 予算。ステップ間で確認(各ステップの費用はそのステップ終了時にのみ判明)するため、合計が超えると次のステップ前にループを停止します(1ステップ分超過する可能性あり)。Claude 以外のプロバイダーでは費用は推定値です。空欄 = 上限なし。`},nodes:{start:`開始`,"ai-step":`AI ステップ`,shell:`シェル`,decider:`ループ判定`,condition:`条件`,end:`終了`},inspector:{selectNode:`編集するノードを選択してください。`,prompt:`プロンプト`,provider:`プロバイダー`,model:`モデル`,effort:`推論の労力`,command:`コマンド`,goal:`目標 / 停止条件`,join:`結合`,outcome:`結果`,startNote:`ループのエントリーポイント。最初のステップに接続してください。`,promptHint:`トークンをクリックまたはドラッグしてプロンプトに挿入します。`,tokensSpec:`Spec フィールド`,tokensJira:`Jira`,tokensCommands:`コマンド`,label:`名前`},branch:{continue:`↻ 続行`,stop:`✓ 終了`},edgesHelp:{label:`ステップの接続方法`,body:`矢印は実行の順序を設定するもので、データの流れではありません — ボックスには入力ポートがなく、エッジはパラメータを運びません。各 AI Step は自動的にそのセッションを再開し (これまでの完全なコンテキスト)、加えて前のステップの短い要約を引き継ぎます。手作業での配線は一切ありません。Loop Decider には 2 つの出力があります: ↻ Continue (目標未達 → ループバック) と ✓ Stop (目標達成 → 終了)。`},arrange:{label:`整列`,vertical:`垂直`,horizontal:`水平`,grid:`グリッド`,reset:`リセット`},constants:{label:`定数`,manage:`定数を管理`,title:`ループ定数`,empty:`カスタム定数はまだありません。`,name:`名前`,value:`値`,add:`追加`,builtinBadge:`組み込み`},paste:{done_one:`{{count}} 個のステップを貼り付けました`,done_other:`{{count}} 個のステップを貼り付けました`},problems:{count_one:`{{count}} 件の問題`,count_other:`{{count}} 件の問題`,NO_START:`開始ノードを追加してください。`,MULTIPLE_START:`開始ノードは1つだけ許可されます。`,NO_END:`終了ノードを少なくとも1つ追加してください。`,ORPHAN:`このステップは開始から到達できません。`,DECIDER_BRANCHES:`Loop Decider には継続と停止の分岐が必要です。`,EMPTY_PROMPT:`AI ステップのプロンプトが空です。`,EMPTY_COMMAND:`Shell ステップのコマンドが空です。`,EMPTY_GOAL:`Loop Decider に目標がありません。`,DEAD_END:`このステップには出力接続がありません。`},preview:{label:`プレビュー`,title:`ドライラン プレビュー`,sampleNote:`Spec の値はサンプルです。コマンドと定数は実行時と同じように解決されます。`,empty:`プレビューするステップがありません。`,error:`プレビューに失敗しました`}},m={steps:`ステップ`,limits:`最大 {{iterations}} 回 · {{timeout}} 分タイムアウト`,openInBuilder:`ビルダーで開く`,builtin:`ビルトイン`},h=`組み込み`,g={title:`{{name}} を実行`,subtitle:`このループをプロジェクトで実行します(チケット不要)。`,project:`プロジェクト`,provider:`プロバイダー`,model:`モデル`,effort:`推論の強度`,execute:`実行`,noProjects:`利用可能なプロジェクトがありません。`,launched:`{{name}} を実行中`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"完全自律: spec を実装し、検証し、失敗時には修正 (refine) する — すべてがグリーンになるまで 検証 → 修正 → 検証 をループします。人手による介入は不要です。"},"verify-pass":{"name":"Verify Pass","description":"自律的な検証と修正: プロジェクトの build / lint / テストを検出して実行し、失敗時には修正 — グリーンになるまで 検証 → 修正 → 検証 を繰り返します。"},"ci-watch":{"name":"CI Watch","description":"オープンな PR の CI チェックをポーリングし (エージェントがリポジトリの CI ツールを使用)、すべてのチェックがグリーンになるまで続けます。"},"lint-and-fix":{"name":"Lint & Fix","description":"エージェントがプロジェクトの linter を検出して実行し、すべての問題を修正します。コードベースがクリーンになるまで反復します。"},"type-safe":{"name":"Type Safe","description":"エージェントがプロジェクトの型チェッカーを検出して実行し、すべてのエラーを解消します。問題なくパスするまで反復します。"},"coverage-climb":{"name":"Coverage Climb","description":"エージェントがプロジェクトのカバレッジツールを実行し、しきい値をパスするまで的を絞ったテストを追加します。"},"build-fix":{"name":"Build Fix","description":"エージェントがプロジェクトの本番 build を検出して実行し、グリーンになるまでコンパイル / バンドルのエラーを修正します。"},"deploy-check":{"name":"Deploy Check","description":"エージェントがデプロイ / ヘルスステータスをポーリングし (プロジェクトの deploy ツールを使用)、サービスが正常を報告するまで続けます。"},"factory_implement":{"name":"実装","description":"完全自律: spec を実装し、検証し、失敗時には修正 (refine) する — すべてのテストがパスするまでループします。"},"factory_batch":{"name":"一括実装","description":"レールのすべてのチケットを一度に一括実装し、失敗時にはグリーンになるまで 検証 + 修正 を行います。"},"factory_freestyle":{"name":"Freestyle","description":"スペックをそのままモデルに渡して完全な自由を与えます — パイプラインなしで通常のコーディングエージェントのように動作し、その後グリーンになるまで検証+改善します。Claude 専用。"},"autoloop-tdd":{"name":"TDD 自動ループ","description":"{{spec.title}} に対する厳格なレッド・グリーン・リファクタのサイクル。まず失敗するテストで各挙動を固定し、グリーンにする最小限のコードだけを書き、整理する。仕様を完全にカバーするまで繰り返します。"},"e2e-until-green":{"name":"グリーンまで E2E","description":"{{spec.title}} の E2E スイートを実行し、失敗したユーザーフローを一つずつ診断して、根本にある UI や連携の不具合を修正。すべての E2E が通るまでサイクルを回します。"},"flaky-test-triage":{"name":"Flaky テスト切り分け","description":"{{spec.title}} まわりの失敗テストを何度か再実行し、本物のリグレッションと不安定な flake を切り分け。実際の破損を直し、flaky なものは安定化または記録します。"},"independent-verifier-pass":{"name":"独立検証パス","description":"{{spec.title}} を敵対的に検証。ビルド・lint・テストをゼロから再実行し、過去の「動いた」という主張ではなく生のコマンド出力だけを信じて、あらゆる抜けを洗い出し修正します。"},"post-edit-test-guard":{"name":"編集後テストガード","description":"{{spec.title}} の編集をひとまとまり加えるたびに、変更ファイルに関わる最小限のテストを即座に実行。リグレッションを最後ではなく発生した瞬間に捕まえます。"},"post-merge-regression-guard":{"name":"マージ後リグレッション防止","description":"マージやリベースで他人の作業が {{spec.title}} に入った直後に高速な smoke test を実行し、連携の破損を即座に検出。新たな機能開発を上に積み始める前に手当てします。"},"pre-commit-guard":{"name":"コミット前ガード","description":"{{spec.title}} のすべてのコミットを差し止める安全ゲート。先にテストスイートを実行し、レッドの間はコミットを拒否するので、壊れたコードが履歴に入りません。"},"visual-regression-until-match":{"name":"一致までビジュアル回帰","description":"変更した UI のビジュアルスナップショットを取得し、意図しないピクセル差分をすべて追跡。承認された意図的なデザイン変更だけが残り、ビジュアルスイートがグリーンになるまで自己修正します。"},"format-until-clean":{"name":"クリーンまで整形","description":"プロジェクトのフォーマッタを適用し、自動修正できない少数のスタイル問題を片付け、再度フォーマットを実行しても作業ツリーが変化しなくなるまで続けます。"},"lint-typecheck-fix":{"name":"lint・型チェック修正","description":"linter と型チェッカーを実行し、報告された各問題を最小限の編集で解消。両方のゲートが完全にクリーンになるまでループします。"},"a11y-audit-until-clean":{"name":"クリーンまで A11y 監査","description":"変更した画面に自動アクセシビリティチェックを実行し、違反をカテゴリごとに一つずつ修正。監査の指摘がゼロになるまで繰り返します。"},"de-sloppify-pass":{"name":"雑さ除去パス","description":"機能が入った後、差分に残った雑なもの — デバッグ出力、不要な分岐、いい加減な命名、肥大した関数 — を一掃して整理し、その整理が何も壊していないことを証明します。"},"fix-ci-until-green":{"name":"グリーンまで CI 修正","description":"このブランチで直近にレッドになった CI を取得し、手元で破損を再現。本当の原因を直してプッシュし、すべてのチェックが成功するまでサイクルを回します。"},"pr-babysitter":{"name":"PR 見守り","description":"一定間隔で、見ている PR を巡回し、各 PR をマージ可能に保ちます。レッドの CI を立て直し、ベースブランチから遅れたものはリベースし、停滞したものには催促を — 人の判断が要るものはエスカレーションします。"},"pr-watch-loop":{"name":"PR 監視ループ","description":"ウォッチリストの PR を一定間隔でポーリングし、各 PR の CI とレビュー状況を要約。些細な阻害要因はその場で片付け、担当者が必要なものは表に出します。"},"pr-self-review":{"name":"PR セルフレビュー","description":"自分の作業差分を、厳しいシニアレビュアーになったつもりで批評し、見つけた点を解消。重大な指摘が出なくなるまで再レビューします — PR を手放す前に。"},"spec-first-ship":{"name":"仕様ファースト出荷","description":"要件チェックリストを一項目ずつ完了へ導きます。各パスで未チェックの要件を一つ実装して証明し、チェックを付ける — 仕様が「完了」の契約になります。"},"dependency-audit-weekly":{"name":"週次 依存監査","description":"毎週、遅れているパッケージを棚卸しし、安全に上げられるものと危ういものに仕分けて、すぐ実行できる明確なアップグレード計画を返します。"},"dependency-upgrade-one-by-one":{"name":"依存を一つずつ更新","description":"パスごとに古いパッケージを正確に一つだけ上げ、それで壊れた箇所を直し、プロジェクトがまだ動くことを証明してコミット — まとめて上げるより遥かに安全です。"},"knip-until-clean":{"name":"クリーンまでデッドコード除去","description":"参照されないエクスポート、孤立したファイル、誰も import しない依存を洗い出して安全に削除。デッドコードスキャナの報告が無くなるまで続けます。"},"docs-sync-after-edits":{"name":"ドキュメントをコードに同期","description":"コード編集を一通り終えたら、変更が触れたドキュメント — README、API リファレンス、インラインコメント — をすべて探し出し、実際の挙動に合わせて更新します。"},"security-audit-weekly":{"name":"週次 セキュリティ監査","description":"依存ツリーに対し毎週、脆弱性スキャンを実行し、出てきたものを深刻度と実際の露出度でトリアージして、優先順位付きの是正計画を返します。"},"npm-audit-fix-loop":{"name":"脆弱性を一つずつ修正","description":"依存の high・critical の勧告を慎重に解消します。パスごとに一つ修正し、それぞれをテストスイートで検証 — ビルドを静かに壊しかねない一括強制修正は避けます。"},"api-contract-until-match":{"name":"一致まで API 契約","description":"実装のレスポンスが公開された API 契約を満たすまで作業を進め、スキーマが約束する内容とハンドラが実際に返す内容との乖離を埋めます。"},"openapi-sync-until-valid":{"name":"妥当になるまで OpenAPI 同期","description":"OpenAPI ドキュメントを整形式かつ実際のルートハンドラに忠実に保ちます。仕様エラーやコードとドキュメントのずれをパスごとに直し、linter が満足するまで続けます。"},"migration-until-applied":{"name":"適用までマイグレーション","description":"データベーススキーマをきれいに前へ進めます。保留中のマイグレーションを実行し、浮かび上がったスキーマや SQL の不具合を直し、マイグレーション履歴の整合を確認します。"},"bundle-size-budget":{"name":"バンドルサイズ予算","description":"クライアントバンドルを予算超過させずに機能を投入します。パスごとに計測し、サイズゲートがグリーンになるまで削減・コード分割・遅延読み込みを行います。"},"changelog-sync-after-ship":{"name":"出荷後 Changelog 同期","description":"出荷後、changelog がユーザー向けの物語を語れているか確認します。入った変更を見直し、Keep a Changelog 形式のエントリを書き、目に見える変更が漏れていないか確かめます。"},"guardrails-learning-loop":{"name":"ガードレール学習ループ","description":"ゲートがグリーンになるまで反復しますが、同じ失敗が二度起きるたびに先にガードレールメモを書き残し、既に失敗した手を試し直してイテレーションを無駄にしないようにします。"},"ralph-story-executor":{"name":"バックログ実行","description":"ユーザーストーリーのバックログを毎回まっさらな文脈で一つずつ処理します。次の未完ストーリーを選び、それだけを作り、プロジェクトのゲートがグリーンに保たれることを証明し、コミットして完了とし、次へ進みます。"},"investigation-script-loop":{"name":"調査スクリプトループ","description":"バグの真の原因を実証的に突き止めます。疑わしい挙動を再現する使い捨ての小さなスクリプトを書いて実行し、生の出力を読み、その出力自体が根本原因を示すまでプローブを磨きます。"},"reflexion-debug-loop":{"name":"省察デバッグループ","description":"失敗するテストを空回りせずグリーンにします。試行が失敗するたびに短い省察をディスクに記録し、次の試みの前に参照することで、既に除外した修正をループが繰り返さないようにします。"},"merge-conflict-resolver":{"name":"マージ競合の解決","description":"リベースでブランチをターゲットに追従させ、両者の意図を保ちながら競合をファイルごとに解消。結果がなお通ることを証明してから、ブランチが最新になったと宣言します。"},"staging-smoke-test":{"name":"ステージング smoke test","description":"ステージングへのデプロイ後、固定の smoke チェックリスト — 認証、主要なユーザー導線、重要な連携 — をたどり、壊れるたびに最小の問題を直して再実行。チェックリスト全体がクリーンになるまで繰り返します。"},"deploy-verification-loop":{"name":"デプロイ検証ループ","description":"デプロイ後、health と smoke のエンドポイントを一定間隔でポーリングし、不健全な応答を調査して修正またはエスカレーション。設定したすべてのエンドポイントが成功を報告するまでチェックを続けます。"},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"チケットからアーカイブまでの OpenSpec ライフサイクル: アーティファクト生成 (opsx:ff) → 実装 (opsx:apply) → 検証 (opsx:verify)。FAIL なら同じ change を修正しに戻り、PASS なら無人でアーカイブします。"}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} 個のループをインポートしました`,done_other:`{{count}} 個のループをインポートしました`,skipped_one:`{{count}} 件の重複をスキップ:{{names}}`,skipped_other:`{{count}} 件の重複をスキップ:{{names}}`,invalid:`そのファイルは有効なループのエクスポートではありません。`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
@@ -1 +1 @@
1
- var e=`Loops`,t=`Bucles de automatización reutilizables — compartidos entre todos tus proyectos.`,n=`Nuevo loop`,r={drafts:`Borradores`,published:`Publicados`,templates:`Plantillas`,builtIn:`Integrados`},i={search:`Buscar plantillas…`,noResults:`Ninguna plantilla coincide con los filtros.`,clearFilter:`Limpiar filtros`,resultCount_one:`{{count}} plantilla`,resultCount_other:`{{count}} plantillas`,needsSpec:`Requiere spec`,standalone:`Autónoma`,needsSpecHint:`Se ejecuta en un rail con una spec arrastrada`,standaloneHint:`Se ejecuta sola — solo elige un proyecto`},a={API:`API`,Automation:`Automatización`,CI:`CI`,Database:`Base de datos`,Debugging:`Depuración`,DevOps:`DevOps`,Docs:`Docs`,Git:`Git`,Maintenance:`Mantenimiento`,Performance:`Rendimiento`,Planning:`Planificación`,Quality:`Calidad`,Review:`Revisión`,Security:`Seguridad`,Testing:`Pruebas`},o={draft:`Borrador`,published:`Publicado`,running:`En ejecución`},s={title:`Aún no hay loops`,body:`Crea uno desde cero o empieza a partir de una plantilla.`},c={edit:`Editar`,delete:`Eliminar`,publish:`Publicar`,unpublish:`Despublicar`,duplicate:`Duplicar`,use:`Usar plantilla`,preview:`Vista previa`,fork:`Bifurcar para editar`,run:`Ejecutar`,export:`Exportar`,import:`Importar`,select:`Seleccionar {{name}}`},l={nodes_one:`{{count}} nodo`,nodes_other:`{{count}} nodos`,usedIn:`En uso · {{project}}`},u=`¿Eliminar este loop? Desaparecerá de todos los selectores de rieles.`,d=`Nuevo loop`,f={load:`No se pudieron cargar los loops`,save:`No se pudo guardar el loop`,publishInvalid:`Este loop aún no se puede publicar — corrige los problemas resaltados.`},p={back:`Volver a los loops`,save:`Guardar`,saved:`Loop guardado`,publish:`Publicar`,published:`Loop publicado`,addNode:`Añadir nodo`,deleteNode:`Eliminar nodo`,config:{maxIterations:`Iteraciones máximas`,timeout:`Tiempo límite (min)`,maxIterationsHint:`Tope de iteraciones del Loop Decider — el loop se detiene al alcanzarlo aunque no se cumpla el objetivo. Evita bucles infinitos.`,timeoutHint:`Límite de tiempo real de toda la ejecución, en minutos. Si se supera, la ejecución se detiene y se marca como fallida — una red de seguridad junto a las iteraciones máximas.`,maxCost:`Coste máx ($)`,maxCostHint:`Presupuesto opcional en USD para toda la ejecución. Se comprueba ENTRE pasos (el coste de un paso solo se sabe al terminarlo), así que el loop para antes del siguiente paso cuando el total lo supera — puede pasarse un paso. En proveedores no-Claude el coste es estimado. Vacío = sin tope.`},nodes:{start:`Inicio`,"ai-step":`Paso de IA`,shell:`Shell`,decider:`Decisor del loop`,condition:`Condición`,end:`Fin`},inspector:{selectNode:`Selecciona un nodo para editarlo.`,prompt:`Prompt`,provider:`Proveedor`,model:`Modelo`,effort:`Esfuerzo de razonamiento`,command:`Comando`,goal:`Objetivo / criterio de parada`,join:`Unión`,outcome:`Resultado`,startNote:`El punto de entrada del loop. Conéctalo al primer paso.`,promptHint:`Haz clic o arrastra un token para insertarlo en el prompt.`,tokensSpec:`Campos del spec`,tokensJira:`Jira`,tokensCommands:`Comandos`,label:`Nombre`},branch:{continue:`↻ Continuar`,stop:`✓ Detener`},edgesHelp:{label:`Cómo se conectan los pasos`,body:`Las flechas marcan el ORDEN de ejecución, no los datos: las cajas no tienen puertos de entrada y las conexiones no transportan parámetros. Cada AI Step reanuda automáticamente su sesión (con todo el contexto previo) más un resumen breve de los pasos anteriores; nada se conecta a mano. El Loop Decider tiene dos salidas: ↻ Continuar (objetivo no cumplido → volver al bucle) y ✓ Detener (objetivo cumplido → salir).`},arrange:{label:`Ordenar`,vertical:`Vertical`,horizontal:`Horizontal`,grid:`Cuadrícula`,reset:`Restablecer`},constants:{label:`Constantes`,manage:`Gestionar constantes`,title:`Constantes del loop`,empty:`Aún no hay constantes personalizadas.`,name:`NOMBRE`,value:`valor`,add:`Añadir`,builtinBadge:`Integradas`},paste:{done_one:`{{count}} paso pegado`,done_other:`{{count}} pasos pegados`},problems:{count_one:`{{count}} problema`,count_other:`{{count}} problemas`,NO_START:`Añade un nodo de Inicio.`,MULTIPLE_START:`Solo se permite un nodo de Inicio.`,NO_END:`Añade al menos un nodo de Fin.`,ORPHAN:`Este paso no es alcanzable desde Inicio.`,DECIDER_BRANCHES:`El Decisor necesita una rama Continuar y otra Detener.`,EMPTY_PROMPT:`El Paso de IA tiene el prompt vacío.`,EMPTY_COMMAND:`El paso Shell tiene el comando vacío.`,EMPTY_GOAL:`El Decisor no tiene objetivo.`,DEAD_END:`Este paso no tiene conexión de salida.`},preview:{label:`Previsualizar`,title:`Previsualización (dry-run)`,sampleNote:`Los valores del spec son de ejemplo; comandos y constantes se resuelven tal cual en ejecución.`,empty:`No hay pasos que previsualizar.`,error:`Falló la previsualización`}},m={steps:`Pasos`,limits:`máx. {{iterations}} iteraciones · {{timeout}} min de timeout`,openInBuilder:`Abrir en el builder`,builtin:`Integrado`},h=`Integrado`,g={title:`Ejecutar {{name}}`,subtitle:`Lanza este loop en un proyecto (sin ticket).`,project:`Proyecto`,provider:`Proveedor`,model:`Modelo`,effort:`Esfuerzo de razonamiento`,execute:`Ejecutar`,noProjects:`No hay proyectos disponibles.`,launched:`Ejecutando {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"Totalmente autónomo: implementa la spec, verifica y refina (corrige) cuando falla, encadenando verificar → corregir → verificar hasta que todo esté en verde. Sin intervención humana."},"verify-pass":{"name":"Verificación","description":"Verifica y corrige de forma autónoma: detecta y ejecuta el build, el lint y los tests del proyecto y luego refina cuando falla, encadenando verificar → corregir → verificar hasta que esté en verde."},"ci-watch":{"name":"Vigilar CI","description":"Consulta los checks de CI del PR abierto (el agente usa las herramientas de CI del repositorio) hasta que todos los checks estén en verde."},"lint-and-fix":{"name":"Lint y corregir","description":"El agente detecta y ejecuta el linter del proyecto y corrige cada incidencia, iterando hasta que el código esté limpio."},"type-safe":{"name":"Tipado seguro","description":"El agente detecta y ejecuta el comprobador de tipos del proyecto y resuelve cada error, iterando hasta que pase sin problemas."},"coverage-climb":{"name":"Subir cobertura","description":"El agente ejecuta las herramientas de cobertura del proyecto y añade tests específicos hasta superar los umbrales."},"build-fix":{"name":"Arreglar build","description":"El agente detecta y ejecuta el build de producción del proyecto y corrige los errores de compilación o de empaquetado hasta que esté en verde."},"deploy-check":{"name":"Comprobar deploy","description":"El agente consulta el estado del deploy y de salud (usando las herramientas de deploy del proyecto) hasta que el servicio se reporte saludable."},"factory_implement":{"name":"Implementar","description":"Totalmente autónomo: implementa la spec, verifica y refina (corrige) cuando falla, encadenando hasta que pasen todos los tests."},"factory_batch":{"name":"Implementar en lote","description":"Implementa de golpe todos los tickets del raíl y luego verifica y refina cuando falla hasta que esté en verde."},"factory_ultracode":{"name":"Freestyle","description":"Entrega la spec directamente al modelo con total libertad — sin pipeline, trabaja como un agente de código normal, y después verifica + refina hasta quedar en verde. Solo Claude."},"autoloop-tdd":{"name":"Autoloop TDD","description":"Un ciclo estricto de rojo-verde-refactor para {{spec.title}}: fija cada comportamiento con una prueba que falle primero, escribe solo el código justo para ponerla en verde y luego limpia, repitiendo hasta cubrir toda la spec."},"e2e-until-green":{"name":"E2E hasta verde","description":"Ejecuta la suite end-to-end de {{spec.title}}, diagnostica cada flujo de usuario que falla, corrige el defecto de UI o integración subyacente y sigue iterando hasta que todas las pruebas E2E pasen."},"flaky-test-triage":{"name":"Triaje de tests flaky","description":"Reejecuta varias veces las pruebas que fallan en torno a {{spec.title}} para distinguir regresiones reales de fallos intermitentes, luego repara las roturas reales y estabiliza o documenta las flaky."},"independent-verifier-pass":{"name":"Verificación independiente","description":"Una verificación adversarial de {{spec.title}}: reejecuta build, lint y tests desde cero, confía solo en la salida real de los comandos (no en un 'funciona' anterior) y saca a la luz o corrige cada hueco."},"post-edit-test-guard":{"name":"Guardia de tests tras editar","description":"Tras cada tanda de ediciones en {{spec.title}}, ejecuta de inmediato el conjunto más reducido de pruebas que tocan los archivos cambiados, detectando regresiones en cuanto aparecen en lugar de al final."},"post-merge-regression-guard":{"name":"Guardia tras el merge","description":"Justo después de que un merge o rebase incorpore el trabajo de otros a {{spec.title}}, ejecuta el smoke test rápido para detectar roturas de integración de inmediato, antes de empezar nada nuevo encima."},"pre-commit-guard":{"name":"Guardia pre-commit","description":"Una barrera de seguridad para {{spec.title}} que intercepta cada commit: primero ejecuta la suite de pruebas y rechaza el commit mientras esté en rojo, para que el código roto nunca entre en el historial."},"visual-regression-until-match":{"name":"Regresión visual hasta cuadrar","description":"Captura instantáneas visuales de la UI modificada, persigue cada diferencia de píxeles no intencionada y autocorrige hasta que la suite visual esté en verde, con solo los cambios de diseño deliberados aprobados."},"format-until-clean":{"name":"Formatear hasta limpio","description":"Aplica el formateador del proyecto, arregla los pocos problemas de estilo que no puede corregir solo y sigue hasta que una nueva pasada de formato deje el árbol de trabajo sin tocar."},"lint-typecheck-fix":{"name":"Arreglar lint y tipos","description":"Ejecuta el lint y el comprobador de tipos, resuelve cada problema con la edición más pequeña posible e itera hasta que ambas barreras queden completamente limpias."},"a11y-audit-until-clean":{"name":"Auditoría A11y hasta limpio","description":"Pasa las comprobaciones automáticas de accesibilidad por las pantallas modificadas, corrige las infracciones categoría a categoría y repite hasta que la auditoría no devuelva ningún problema."},"de-sloppify-pass":{"name":"Pasada de pulido","description":"Tras aterrizar la funcionalidad, peina el diff en busca de descuidos: trazas de depuración, ramas muertas, nombres flojos, funciones infladas; límpialos y demuestra que la limpieza no rompió nada."},"fix-ci-until-green":{"name":"Arreglar CI hasta verde","description":"Recupera la ejecución de CI más reciente en rojo de esta rama, reproduce la rotura en tu máquina, corrige la causa real, haz push y sigue iterando hasta que todas las comprobaciones pasen."},"pr-babysitter":{"name":"Niñera de PRs","description":"A intervalos regulares, repasa las pull requests que vigilas y mantenlas mergeables: reanima la CI en rojo, haz rebase de las que se han quedado atrás respecto a la rama base y avisa de las estancadas, escalando lo que deba decidir una persona."},"pr-watch-loop":{"name":"Vigilancia de PRs","description":"Sondea con cadencia constante las pull requests de tu lista de seguimiento, resume el estado de CI y de revisión de cada una, y o bien despacha los bloqueos triviales o señala lo que necesita un responsable."},"pr-self-review":{"name":"Autorrevisión de PR","description":"Critica tu propio diff como lo haría un revisor sénior exigente, resuelve lo que encuentres y revísalo de nuevo hasta que una pasada limpia no saque nada crítico, antes de que la PR salga de tus manos."},"spec-first-ship":{"name":"Entrega guiada por spec","description":"Lleva una checklist de requisitos hasta el final de uno en uno: cada pasada implementa un requisito sin marcar, lo demuestra y lo tacha, de modo que la spec es el contrato de lo que está hecho."},"dependency-audit-weekly":{"name":"Auditoría semanal de dependencias","description":"Cada semana revisa qué paquetes se han quedado atrás, clasifícalos entre seguros de actualizar y arriesgados, y devuelve un plan de actualización claro y accionable."},"dependency-upgrade-one-by-one":{"name":"Actualizar dependencias de una en una","description":"Actualiza exactamente un paquete obsoleto por pasada, repara lo que la subida rompa, demuestra que el proyecto sigue funcionando y haz commit; mucho más seguro que actualizar todo de golpe."},"knip-until-clean":{"name":"Podar código muerto hasta limpio","description":"Rastrea exports sin referenciar, archivos huérfanos y dependencias que nadie importa, elimínalos con seguridad y sigue hasta que el escáner de código muerto no tenga nada que reportar."},"docs-sync-after-edits":{"name":"Sincronizar docs con el código","description":"Tras una ronda de ediciones, localiza cada documento que los cambios tocaron (README, referencia de la API, comentarios en línea) y ponlos de nuevo en consonancia con cómo se comporta ahora el código."},"security-audit-weekly":{"name":"Auditoría semanal de seguridad","description":"Ejecuta un escaneo semanal de vulnerabilidades sobre el árbol de dependencias, triaja lo que aparezca por severidad y exposición real, y devuelve un plan de remediación priorizado."},"npm-audit-fix-loop":{"name":"Parchear vulnerabilidades de una en una","description":"Resuelve los avisos altos y críticos de dependencias con cuidado (una corrección por pasada, cada una verificada contra la suite de pruebas) en lugar de un force-fix a ciegas que puede romper el build en silencio."},"api-contract-until-match":{"name":"Contrato de API hasta cuadrar","description":"Lleva la implementación hasta que sus respuestas respeten el contrato de la API publicada, cerrando cualquier brecha entre lo que promete el esquema y lo que devuelven realmente los handlers."},"openapi-sync-until-valid":{"name":"Sincronizar OpenAPI hasta válido","description":"Mantén el documento OpenAPI bien formado y fiel a los handlers de ruta reales, reparando errores de la spec y la deriva entre código y documento en cada pasada hasta que el lint quede satisfecho."},"migration-until-applied":{"name":"Migración hasta aplicada","description":"Avanza el esquema de la base de datos sin sobresaltos: ejecuta las migraciones pendientes, repara los fallos de esquema o SQL que afloren y confirma que el historial de migraciones se mantiene coherente."},"bundle-size-budget":{"name":"Presupuesto de tamaño del bundle","description":"Aterriza la funcionalidad sin inflar el bundle del cliente por encima de su presupuesto: mide en cada pasada y recorta, divide el código o aplica carga diferida hasta que la barrera de tamaño esté en verde."},"changelog-sync-after-ship":{"name":"Sincronizar changelog tras entregar","description":"Tras entregar, asegúrate de que el changelog cuente la historia de cara al usuario: revisa lo que aterrizó, escribe entradas estilo Keep a Changelog y confirma que no se quedó nada visible fuera."},"guardrails-learning-loop":{"name":"Bucle de aprendizaje con guardarraíles","description":"Sigue iterando sobre las barreras hasta que pasen, pero cada vez que una comprobación falle igual dos veces, anota primero una nota de guardarraíl para que el bucle no malgaste iteraciones reintentando un enfoque que ya falló."},"ralph-story-executor":{"name":"Ejecutor de historias del backlog","description":"Trabaja un backlog de historias de usuario de una en una con contexto nuevo en cada pasada: elige la siguiente historia sin terminar, construye solo esa, demuestra que las barreras del proyecto siguen en verde, haz commit y márcala como hecha antes de seguir."},"investigation-script-loop":{"name":"Bucle de script de investigación","description":"Localiza empíricamente la causa real de un bug: escribe un script desechable diminuto que ejercite el comportamiento sospechoso, ejecútalo, lee la salida real y refina la sonda hasta que la propia salida demuestre la causa raíz."},"reflexion-debug-loop":{"name":"Bucle de depuración con reflexión","description":"Pon en verde una prueba que falla sin dar vueltas: cada vez que un intento falle, anota una breve reflexión en disco y consúltala antes del siguiente intento, para que el bucle no repita una solución ya descartada."},"merge-conflict-resolver":{"name":"Resolutor de conflictos de merge","description":"Pon la rama al día con su destino mediante rebase, luego resuelve cada conflicto archivo a archivo preservando la intención de ambos lados, y demuestra que el resultado sigue pasando antes de declarar la rama al día."},"staging-smoke-test":{"name":"Smoke test en staging","description":"Tras un despliegue en staging, recorre una checklist fija de smoke (auth, los flujos de usuario centrales y las integraciones clave), corrigiendo el problema más pequeño cada vez que algo se rompa y reejecutando hasta que toda la checklist quede limpia."},"deploy-verification-loop":{"name":"Bucle de verificación del despliegue","description":"Tras salir un despliegue, sondea a intervalos los endpoints de salud y de smoke, investiga y corrige o escala cualquier respuesta no saludable, y sigue comprobando hasta que todos los endpoints configurados reporten éxito."},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"Ciclo OpenSpec de ticket a archivo: genera artefactos (opsx:ff) → implementa (opsx:apply) → verifica (opsx:verify); con FAIL vuelve atrás y enmienda el mismo change, con PASS lo archiva sin intervención."}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} loop importado`,done_other:`{{count}} loops importados`,skipped_one:`Omitido {{count}} duplicado: {{names}}`,skipped_other:`Omitidos {{count}} duplicados: {{names}}`,invalid:`Ese archivo no es una exportación de loops válida.`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
1
+ var e=`Loops`,t=`Bucles de automatización reutilizables — compartidos entre todos tus proyectos.`,n=`Nuevo loop`,r={drafts:`Borradores`,published:`Publicados`,templates:`Plantillas`,builtIn:`Integrados`},i={search:`Buscar plantillas…`,noResults:`Ninguna plantilla coincide con los filtros.`,clearFilter:`Limpiar filtros`,resultCount_one:`{{count}} plantilla`,resultCount_other:`{{count}} plantillas`,needsSpec:`Requiere spec`,standalone:`Autónoma`,needsSpecHint:`Se ejecuta en un rail con una spec arrastrada`,standaloneHint:`Se ejecuta sola — solo elige un proyecto`},a={API:`API`,Automation:`Automatización`,CI:`CI`,Database:`Base de datos`,Debugging:`Depuración`,DevOps:`DevOps`,Docs:`Docs`,Git:`Git`,Maintenance:`Mantenimiento`,Performance:`Rendimiento`,Planning:`Planificación`,Quality:`Calidad`,Review:`Revisión`,Security:`Seguridad`,Testing:`Pruebas`},o={draft:`Borrador`,published:`Publicado`,running:`En ejecución`},s={title:`Aún no hay loops`,body:`Crea uno desde cero o empieza a partir de una plantilla.`},c={edit:`Editar`,delete:`Eliminar`,publish:`Publicar`,unpublish:`Despublicar`,duplicate:`Duplicar`,use:`Usar plantilla`,preview:`Vista previa`,fork:`Bifurcar para editar`,run:`Ejecutar`,export:`Exportar`,import:`Importar`,select:`Seleccionar {{name}}`},l={nodes_one:`{{count}} nodo`,nodes_other:`{{count}} nodos`,usedIn:`En uso · {{project}}`},u=`¿Eliminar este loop? Desaparecerá de todos los selectores de rieles.`,d=`Nuevo loop`,f={load:`No se pudieron cargar los loops`,save:`No se pudo guardar el loop`,publishInvalid:`Este loop aún no se puede publicar — corrige los problemas resaltados.`},p={back:`Volver a los loops`,save:`Guardar`,saved:`Loop guardado`,publish:`Publicar`,published:`Loop publicado`,addNode:`Añadir nodo`,deleteNode:`Eliminar nodo`,config:{maxIterations:`Iteraciones máximas`,timeout:`Tiempo límite (min)`,maxIterationsHint:`Tope de iteraciones del Loop Decider — el loop se detiene al alcanzarlo aunque no se cumpla el objetivo. Evita bucles infinitos.`,timeoutHint:`Límite de tiempo real de toda la ejecución, en minutos. Si se supera, la ejecución se detiene y se marca como fallida — una red de seguridad junto a las iteraciones máximas.`,maxCost:`Coste máx ($)`,maxCostHint:`Presupuesto opcional en USD para toda la ejecución. Se comprueba ENTRE pasos (el coste de un paso solo se sabe al terminarlo), así que el loop para antes del siguiente paso cuando el total lo supera — puede pasarse un paso. En proveedores no-Claude el coste es estimado. Vacío = sin tope.`},nodes:{start:`Inicio`,"ai-step":`Paso de IA`,shell:`Shell`,decider:`Decisor del loop`,condition:`Condición`,end:`Fin`},inspector:{selectNode:`Selecciona un nodo para editarlo.`,prompt:`Prompt`,provider:`Proveedor`,model:`Modelo`,effort:`Esfuerzo de razonamiento`,command:`Comando`,goal:`Objetivo / criterio de parada`,join:`Unión`,outcome:`Resultado`,startNote:`El punto de entrada del loop. Conéctalo al primer paso.`,promptHint:`Haz clic o arrastra un token para insertarlo en el prompt.`,tokensSpec:`Campos del spec`,tokensJira:`Jira`,tokensCommands:`Comandos`,label:`Nombre`},branch:{continue:`↻ Continuar`,stop:`✓ Detener`},edgesHelp:{label:`Cómo se conectan los pasos`,body:`Las flechas marcan el ORDEN de ejecución, no los datos: las cajas no tienen puertos de entrada y las conexiones no transportan parámetros. Cada AI Step reanuda automáticamente su sesión (con todo el contexto previo) más un resumen breve de los pasos anteriores; nada se conecta a mano. El Loop Decider tiene dos salidas: ↻ Continuar (objetivo no cumplido → volver al bucle) y ✓ Detener (objetivo cumplido → salir).`},arrange:{label:`Ordenar`,vertical:`Vertical`,horizontal:`Horizontal`,grid:`Cuadrícula`,reset:`Restablecer`},constants:{label:`Constantes`,manage:`Gestionar constantes`,title:`Constantes del loop`,empty:`Aún no hay constantes personalizadas.`,name:`NOMBRE`,value:`valor`,add:`Añadir`,builtinBadge:`Integradas`},paste:{done_one:`{{count}} paso pegado`,done_other:`{{count}} pasos pegados`},problems:{count_one:`{{count}} problema`,count_other:`{{count}} problemas`,NO_START:`Añade un nodo de Inicio.`,MULTIPLE_START:`Solo se permite un nodo de Inicio.`,NO_END:`Añade al menos un nodo de Fin.`,ORPHAN:`Este paso no es alcanzable desde Inicio.`,DECIDER_BRANCHES:`El Decisor necesita una rama Continuar y otra Detener.`,EMPTY_PROMPT:`El Paso de IA tiene el prompt vacío.`,EMPTY_COMMAND:`El paso Shell tiene el comando vacío.`,EMPTY_GOAL:`El Decisor no tiene objetivo.`,DEAD_END:`Este paso no tiene conexión de salida.`},preview:{label:`Previsualizar`,title:`Previsualización (dry-run)`,sampleNote:`Los valores del spec son de ejemplo; comandos y constantes se resuelven tal cual en ejecución.`,empty:`No hay pasos que previsualizar.`,error:`Falló la previsualización`}},m={steps:`Pasos`,limits:`máx. {{iterations}} iteraciones · {{timeout}} min de timeout`,openInBuilder:`Abrir en el builder`,builtin:`Integrado`},h=`Integrado`,g={title:`Ejecutar {{name}}`,subtitle:`Lanza este loop en un proyecto (sin ticket).`,project:`Proyecto`,provider:`Proveedor`,model:`Modelo`,effort:`Esfuerzo de razonamiento`,execute:`Ejecutar`,noProjects:`No hay proyectos disponibles.`,launched:`Ejecutando {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"Totalmente autónomo: implementa la spec, verifica y refina (corrige) cuando falla, encadenando verificar → corregir → verificar hasta que todo esté en verde. Sin intervención humana."},"verify-pass":{"name":"Verificación","description":"Verifica y corrige de forma autónoma: detecta y ejecuta el build, el lint y los tests del proyecto y luego refina cuando falla, encadenando verificar → corregir → verificar hasta que esté en verde."},"ci-watch":{"name":"Vigilar CI","description":"Consulta los checks de CI del PR abierto (el agente usa las herramientas de CI del repositorio) hasta que todos los checks estén en verde."},"lint-and-fix":{"name":"Lint y corregir","description":"El agente detecta y ejecuta el linter del proyecto y corrige cada incidencia, iterando hasta que el código esté limpio."},"type-safe":{"name":"Tipado seguro","description":"El agente detecta y ejecuta el comprobador de tipos del proyecto y resuelve cada error, iterando hasta que pase sin problemas."},"coverage-climb":{"name":"Subir cobertura","description":"El agente ejecuta las herramientas de cobertura del proyecto y añade tests específicos hasta superar los umbrales."},"build-fix":{"name":"Arreglar build","description":"El agente detecta y ejecuta el build de producción del proyecto y corrige los errores de compilación o de empaquetado hasta que esté en verde."},"deploy-check":{"name":"Comprobar deploy","description":"El agente consulta el estado del deploy y de salud (usando las herramientas de deploy del proyecto) hasta que el servicio se reporte saludable."},"factory_implement":{"name":"Implementar","description":"Totalmente autónomo: implementa la spec, verifica y refina (corrige) cuando falla, encadenando hasta que pasen todos los tests."},"factory_batch":{"name":"Implementar en lote","description":"Implementa de golpe todos los tickets del raíl y luego verifica y refina cuando falla hasta que esté en verde."},"factory_freestyle":{"name":"Freestyle","description":"Entrega la spec directamente al modelo con total libertad — sin pipeline, trabaja como un agente de código normal, y después verifica + refina hasta quedar en verde. Solo Claude."},"autoloop-tdd":{"name":"Autoloop TDD","description":"Un ciclo estricto de rojo-verde-refactor para {{spec.title}}: fija cada comportamiento con una prueba que falle primero, escribe solo el código justo para ponerla en verde y luego limpia, repitiendo hasta cubrir toda la spec."},"e2e-until-green":{"name":"E2E hasta verde","description":"Ejecuta la suite end-to-end de {{spec.title}}, diagnostica cada flujo de usuario que falla, corrige el defecto de UI o integración subyacente y sigue iterando hasta que todas las pruebas E2E pasen."},"flaky-test-triage":{"name":"Triaje de tests flaky","description":"Reejecuta varias veces las pruebas que fallan en torno a {{spec.title}} para distinguir regresiones reales de fallos intermitentes, luego repara las roturas reales y estabiliza o documenta las flaky."},"independent-verifier-pass":{"name":"Verificación independiente","description":"Una verificación adversarial de {{spec.title}}: reejecuta build, lint y tests desde cero, confía solo en la salida real de los comandos (no en un 'funciona' anterior) y saca a la luz o corrige cada hueco."},"post-edit-test-guard":{"name":"Guardia de tests tras editar","description":"Tras cada tanda de ediciones en {{spec.title}}, ejecuta de inmediato el conjunto más reducido de pruebas que tocan los archivos cambiados, detectando regresiones en cuanto aparecen en lugar de al final."},"post-merge-regression-guard":{"name":"Guardia tras el merge","description":"Justo después de que un merge o rebase incorpore el trabajo de otros a {{spec.title}}, ejecuta el smoke test rápido para detectar roturas de integración de inmediato, antes de empezar nada nuevo encima."},"pre-commit-guard":{"name":"Guardia pre-commit","description":"Una barrera de seguridad para {{spec.title}} que intercepta cada commit: primero ejecuta la suite de pruebas y rechaza el commit mientras esté en rojo, para que el código roto nunca entre en el historial."},"visual-regression-until-match":{"name":"Regresión visual hasta cuadrar","description":"Captura instantáneas visuales de la UI modificada, persigue cada diferencia de píxeles no intencionada y autocorrige hasta que la suite visual esté en verde, con solo los cambios de diseño deliberados aprobados."},"format-until-clean":{"name":"Formatear hasta limpio","description":"Aplica el formateador del proyecto, arregla los pocos problemas de estilo que no puede corregir solo y sigue hasta que una nueva pasada de formato deje el árbol de trabajo sin tocar."},"lint-typecheck-fix":{"name":"Arreglar lint y tipos","description":"Ejecuta el lint y el comprobador de tipos, resuelve cada problema con la edición más pequeña posible e itera hasta que ambas barreras queden completamente limpias."},"a11y-audit-until-clean":{"name":"Auditoría A11y hasta limpio","description":"Pasa las comprobaciones automáticas de accesibilidad por las pantallas modificadas, corrige las infracciones categoría a categoría y repite hasta que la auditoría no devuelva ningún problema."},"de-sloppify-pass":{"name":"Pasada de pulido","description":"Tras aterrizar la funcionalidad, peina el diff en busca de descuidos: trazas de depuración, ramas muertas, nombres flojos, funciones infladas; límpialos y demuestra que la limpieza no rompió nada."},"fix-ci-until-green":{"name":"Arreglar CI hasta verde","description":"Recupera la ejecución de CI más reciente en rojo de esta rama, reproduce la rotura en tu máquina, corrige la causa real, haz push y sigue iterando hasta que todas las comprobaciones pasen."},"pr-babysitter":{"name":"Niñera de PRs","description":"A intervalos regulares, repasa las pull requests que vigilas y mantenlas mergeables: reanima la CI en rojo, haz rebase de las que se han quedado atrás respecto a la rama base y avisa de las estancadas, escalando lo que deba decidir una persona."},"pr-watch-loop":{"name":"Vigilancia de PRs","description":"Sondea con cadencia constante las pull requests de tu lista de seguimiento, resume el estado de CI y de revisión de cada una, y o bien despacha los bloqueos triviales o señala lo que necesita un responsable."},"pr-self-review":{"name":"Autorrevisión de PR","description":"Critica tu propio diff como lo haría un revisor sénior exigente, resuelve lo que encuentres y revísalo de nuevo hasta que una pasada limpia no saque nada crítico, antes de que la PR salga de tus manos."},"spec-first-ship":{"name":"Entrega guiada por spec","description":"Lleva una checklist de requisitos hasta el final de uno en uno: cada pasada implementa un requisito sin marcar, lo demuestra y lo tacha, de modo que la spec es el contrato de lo que está hecho."},"dependency-audit-weekly":{"name":"Auditoría semanal de dependencias","description":"Cada semana revisa qué paquetes se han quedado atrás, clasifícalos entre seguros de actualizar y arriesgados, y devuelve un plan de actualización claro y accionable."},"dependency-upgrade-one-by-one":{"name":"Actualizar dependencias de una en una","description":"Actualiza exactamente un paquete obsoleto por pasada, repara lo que la subida rompa, demuestra que el proyecto sigue funcionando y haz commit; mucho más seguro que actualizar todo de golpe."},"knip-until-clean":{"name":"Podar código muerto hasta limpio","description":"Rastrea exports sin referenciar, archivos huérfanos y dependencias que nadie importa, elimínalos con seguridad y sigue hasta que el escáner de código muerto no tenga nada que reportar."},"docs-sync-after-edits":{"name":"Sincronizar docs con el código","description":"Tras una ronda de ediciones, localiza cada documento que los cambios tocaron (README, referencia de la API, comentarios en línea) y ponlos de nuevo en consonancia con cómo se comporta ahora el código."},"security-audit-weekly":{"name":"Auditoría semanal de seguridad","description":"Ejecuta un escaneo semanal de vulnerabilidades sobre el árbol de dependencias, triaja lo que aparezca por severidad y exposición real, y devuelve un plan de remediación priorizado."},"npm-audit-fix-loop":{"name":"Parchear vulnerabilidades de una en una","description":"Resuelve los avisos altos y críticos de dependencias con cuidado (una corrección por pasada, cada una verificada contra la suite de pruebas) en lugar de un force-fix a ciegas que puede romper el build en silencio."},"api-contract-until-match":{"name":"Contrato de API hasta cuadrar","description":"Lleva la implementación hasta que sus respuestas respeten el contrato de la API publicada, cerrando cualquier brecha entre lo que promete el esquema y lo que devuelven realmente los handlers."},"openapi-sync-until-valid":{"name":"Sincronizar OpenAPI hasta válido","description":"Mantén el documento OpenAPI bien formado y fiel a los handlers de ruta reales, reparando errores de la spec y la deriva entre código y documento en cada pasada hasta que el lint quede satisfecho."},"migration-until-applied":{"name":"Migración hasta aplicada","description":"Avanza el esquema de la base de datos sin sobresaltos: ejecuta las migraciones pendientes, repara los fallos de esquema o SQL que afloren y confirma que el historial de migraciones se mantiene coherente."},"bundle-size-budget":{"name":"Presupuesto de tamaño del bundle","description":"Aterriza la funcionalidad sin inflar el bundle del cliente por encima de su presupuesto: mide en cada pasada y recorta, divide el código o aplica carga diferida hasta que la barrera de tamaño esté en verde."},"changelog-sync-after-ship":{"name":"Sincronizar changelog tras entregar","description":"Tras entregar, asegúrate de que el changelog cuente la historia de cara al usuario: revisa lo que aterrizó, escribe entradas estilo Keep a Changelog y confirma que no se quedó nada visible fuera."},"guardrails-learning-loop":{"name":"Bucle de aprendizaje con guardarraíles","description":"Sigue iterando sobre las barreras hasta que pasen, pero cada vez que una comprobación falle igual dos veces, anota primero una nota de guardarraíl para que el bucle no malgaste iteraciones reintentando un enfoque que ya falló."},"ralph-story-executor":{"name":"Ejecutor de historias del backlog","description":"Trabaja un backlog de historias de usuario de una en una con contexto nuevo en cada pasada: elige la siguiente historia sin terminar, construye solo esa, demuestra que las barreras del proyecto siguen en verde, haz commit y márcala como hecha antes de seguir."},"investigation-script-loop":{"name":"Bucle de script de investigación","description":"Localiza empíricamente la causa real de un bug: escribe un script desechable diminuto que ejercite el comportamiento sospechoso, ejecútalo, lee la salida real y refina la sonda hasta que la propia salida demuestre la causa raíz."},"reflexion-debug-loop":{"name":"Bucle de depuración con reflexión","description":"Pon en verde una prueba que falla sin dar vueltas: cada vez que un intento falle, anota una breve reflexión en disco y consúltala antes del siguiente intento, para que el bucle no repita una solución ya descartada."},"merge-conflict-resolver":{"name":"Resolutor de conflictos de merge","description":"Pon la rama al día con su destino mediante rebase, luego resuelve cada conflicto archivo a archivo preservando la intención de ambos lados, y demuestra que el resultado sigue pasando antes de declarar la rama al día."},"staging-smoke-test":{"name":"Smoke test en staging","description":"Tras un despliegue en staging, recorre una checklist fija de smoke (auth, los flujos de usuario centrales y las integraciones clave), corrigiendo el problema más pequeño cada vez que algo se rompa y reejecutando hasta que toda la checklist quede limpia."},"deploy-verification-loop":{"name":"Bucle de verificación del despliegue","description":"Tras salir un despliegue, sondea a intervalos los endpoints de salud y de smoke, investiga y corrige o escala cualquier respuesta no saludable, y sigue comprobando hasta que todos los endpoints configurados reporten éxito."},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"Ciclo OpenSpec de ticket a archivo: genera artefactos (opsx:ff) → implementa (opsx:apply) → verifica (opsx:verify); con FAIL vuelve atrás y enmienda el mismo change, con PASS lo archiva sin intervención."}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} loop importado`,done_other:`{{count}} loops importados`,skipped_one:`Omitido {{count}} duplicado: {{names}}`,skipped_other:`Omitidos {{count}} duplicados: {{names}}`,invalid:`Ese archivo no es una exportación de loops válida.`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
@@ -1 +1 @@
1
- var e=`Loops`,t=`Wiederverwendbare Automatisierungs-Loops – projektübergreifend geteilt.`,n=`Neuer Loop`,r={drafts:`Entwürfe`,published:`Veröffentlicht`,templates:`Vorlagen`,builtIn:`Integriert`},i={search:`Vorlagen suchen…`,noResults:`Keine Vorlagen entsprechen deinen Filtern.`,clearFilter:`Filter zurücksetzen`,resultCount_one:`{{count}} Vorlage`,resultCount_other:`{{count}} Vorlagen`,needsSpec:`Spec nötig`,standalone:`Eigenständig`,needsSpecHint:`Läuft auf einer Rail mit einer gezogenen Spec`,standaloneHint:`Läuft eigenständig — einfach ein Projekt wählen`},a={API:`API`,Automation:`Automatisierung`,CI:`CI`,Database:`Datenbank`,Debugging:`Debugging`,DevOps:`DevOps`,Docs:`Doku`,Git:`Git`,Maintenance:`Wartung`,Performance:`Performance`,Planning:`Planung`,Quality:`Qualität`,Review:`Review`,Security:`Sicherheit`,Testing:`Tests`},o={draft:`Entwurf`,published:`Veröffentlicht`,running:`Läuft`},s={title:`Noch keine Loops`,body:`Erstelle einen von Grund auf neu oder beginne mit einer Vorlage.`},c={edit:`Bearbeiten`,delete:`Löschen`,publish:`Veröffentlichen`,unpublish:`Zurückziehen`,duplicate:`Duplizieren`,use:`Vorlage verwenden`,preview:`Vorschau`,fork:`Zum Bearbeiten forken`,run:`Ausführen`,export:`Exportieren`,import:`Importieren`,select:`{{name}} auswählen`},l={nodes_one:`{{count}} Knoten`,nodes_other:`{{count}} Knoten`,usedIn:`In Verwendung · {{project}}`},u=`Diesen Loop löschen? Er verschwindet aus jeder Rail-Auswahl.`,d=`Neuer Loop`,f={load:`Loops konnten nicht geladen werden`,save:`Loop konnte nicht gespeichert werden`,publishInvalid:`Dieser Loop kann noch nicht veröffentlicht werden – behebe die hervorgehobenen Probleme.`},p={back:`Zurück zu Loops`,save:`Speichern`,saved:`Loop gespeichert`,publish:`Veröffentlichen`,published:`Loop veröffentlicht`,addNode:`Knoten hinzufügen`,deleteNode:`Knoten löschen`,config:{maxIterations:`Maximale Iterationen`,timeout:`Timeout (Min.)`,maxIterationsHint:`Obergrenze für Loop-Decider-Iterationen — der Loop stoppt beim Erreichen, auch wenn das Ziel nicht erfüllt ist. Verhindert Endlosschleifen.`,timeoutHint:`Echtzeit-Limit für den gesamten Lauf, in Minuten. Bei Überschreitung wird der Lauf gestoppt und als fehlgeschlagen markiert — ein Sicherheitsnetz neben den max. Iterationen.`,maxCost:`Max. Kosten ($)`,maxCostHint:`Optionales USD-Budget für den gesamten Lauf. Wird ZWISCHEN Schritten geprüft (die Kosten eines Schritts stehen erst nach dessen Ende fest), der Loop stoppt vor dem nächsten Schritt, sobald die Summe es überschreitet — kann um einen Schritt überschreiten. Bei Nicht-Claude-Anbietern sind die Kosten geschätzt. Leer = kein Limit.`},nodes:{start:`Start`,"ai-step":`KI-Schritt`,shell:`Shell`,decider:`Loop-Entscheider`,condition:`Bedingung`,end:`Ende`},inspector:{selectNode:`Wähle einen Knoten aus, um ihn zu bearbeiten.`,prompt:`Prompt`,provider:`Anbieter`,model:`Modell`,effort:`Denkaufwand`,command:`Befehl`,goal:`Ziel / Abbruchkriterien`,join:`Verknüpfung`,outcome:`Ergebnis`,startNote:`Der Einstiegspunkt des Loops. Verbinde ihn mit dem ersten Schritt.`,promptHint:`Klicke oder ziehe ein Token, um es in den Prompt einzufügen.`,tokensSpec:`Spec-Felder`,tokensJira:`Jira`,tokensCommands:`Befehle`,label:`Name`},branch:{continue:`↻ Fortsetzen`,stop:`✓ Stoppen`},edgesHelp:{label:`Wie Schritte verbunden werden`,body:`Pfeile legen die REIHENFOLGE der Ausführung fest, keine Daten — Boxen haben keine Eingangsports und Kanten übergeben keine Parameter. Jeder AI Step setzt automatisch seine Session fort (vollständiger vorheriger Kontext) plus eine kurze Zusammenfassung der vorherigen Schritte; nichts wird von Hand verdrahtet. Der Loop Decider hat zwei Ausgänge: ↻ Fortsetzen (Ziel nicht erreicht → zurück in die Schleife) und ✓ Stoppen (Ziel erreicht → beenden).`},arrange:{label:`Anordnen`,vertical:`Vertikal`,horizontal:`Horizontal`,grid:`Raster`,reset:`Zurücksetzen`},constants:{label:`Konstanten`,manage:`Konstanten verwalten`,title:`Loop-Konstanten`,empty:`Noch keine eigenen Konstanten.`,name:`NAME`,value:`Wert`,add:`Hinzufügen`,builtinBadge:`Integriert`},paste:{done_one:`{{count}} Schritt eingefügt`,done_other:`{{count}} Schritte eingefügt`},problems:{count_one:`{{count}} Problem`,count_other:`{{count}} Probleme`,NO_START:`Füge einen Start-Knoten hinzu.`,MULTIPLE_START:`Nur ein Start-Knoten ist erlaubt.`,NO_END:`Füge mindestens einen End-Knoten hinzu.`,ORPHAN:`Dieser Schritt ist vom Start nicht erreichbar.`,DECIDER_BRANCHES:`Der Loop Decider braucht einen Fortsetzen- und einen Stopp-Zweig.`,EMPTY_PROMPT:`Der KI-Schritt hat einen leeren Prompt.`,EMPTY_COMMAND:`Der Shell-Schritt hat einen leeren Befehl.`,EMPTY_GOAL:`Der Loop Decider hat kein Ziel.`,DEAD_END:`Dieser Schritt hat keine ausgehende Verbindung.`},preview:{label:`Vorschau`,title:`Probelauf-Vorschau`,sampleNote:`Spec-Werte sind Beispieldaten; Befehle und Konstanten werden wie zur Laufzeit aufgelöst.`,empty:`Keine Schritte zur Vorschau.`,error:`Vorschau fehlgeschlagen`}},m={steps:`Schritte`,limits:`max. {{iterations}} Iterationen · {{timeout}} Min. Timeout`,openInBuilder:`Im Builder öffnen`,builtin:`Integriert`},h=`Integriert`,g={title:`{{name}} ausführen`,subtitle:`Diesen Loop auf einem Projekt starten (kein Ticket nötig).`,project:`Projekt`,provider:`Anbieter`,model:`Modell`,effort:`Reasoning-Aufwand`,execute:`Ausführen`,noProjects:`Keine Projekte verfügbar.`,launched:`{{name}} wird ausgeführt`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"Vollständig autonom: spec implementieren, verifizieren und bei Fehlern nachbessern (Fix) — in der Schleife verifizieren → fixen → verifizieren, bis alles grün ist. Kein manuelles Eingreifen."},"verify-pass":{"name":"Verify Pass","description":"Autonomes Verifizieren-und-Fixen: build/lint/Tests des Projekts erkennen und ausführen, dann bei Fehlern nachbessern — verifizieren → fixen → verifizieren, bis grün."},"ci-watch":{"name":"CI Watch","description":"Fragt die CI-Checks des offenen PR ab (der Agent nutzt das CI-Tooling des Repos), bis jeder Check grün ist."},"lint-and-fix":{"name":"Lint & Fix","description":"Der Agent erkennt und führt den lint des Projekts aus und behebt jedes Problem, iterierend, bis die Codebasis sauber ist."},"type-safe":{"name":"Type Safe","description":"Der Agent erkennt und führt den Typchecker des Projekts aus und behebt jeden Fehler, iterierend, bis er sauber durchläuft."},"coverage-climb":{"name":"Coverage Climb","description":"Der Agent führt das Coverage-Tooling des Projekts aus und ergänzt gezielte Tests, bis die Schwellenwerte erreicht sind."},"build-fix":{"name":"Build Fix","description":"Der Agent erkennt und führt den Produktions-build des Projekts aus und behebt Kompilier-/Bundle-Fehler, bis er grün ist."},"deploy-check":{"name":"Deploy Check","description":"Der Agent fragt den deploy-/Health-Status ab (mit dem deploy-Tooling des Projekts), bis der Dienst als gesund gemeldet wird."},"factory_implement":{"name":"Implementieren","description":"Vollständig autonom: spec implementieren, verifizieren und bei Fehlern nachbessern (Fix) — in der Schleife, bis alle Tests bestehen."},"factory_batch":{"name":"Batch-Implementierung","description":"Alle Tickets des Rails auf einmal als Batch implementieren, dann verifizieren + bei Fehlern nachbessern, bis grün."},"factory_ultracode":{"name":"Freestyle","description":"Übergibt die Spec direkt an das Modell mit voller Freiheit — ohne Pipeline, es arbeitet wie ein normaler Coding-Agent, dann verifizieren + verfeinern bis alles grün ist. Nur Claude."},"autoloop-tdd":{"name":"Autoloop TDD","description":"Ein strenger Red-Green-Refactor-Zyklus für {{spec.title}}: Jedes Verhalten zuerst mit einem fehlschlagenden Test festnageln, nur so viel Code schreiben, bis er grün wird, und dann aufräumen – so lange wiederholen, bis die Spec vollständig abgedeckt ist."},"e2e-until-green":{"name":"E2E bis grün","description":"Die E2E-Suite für {{spec.title}} ausführen, jeden fehlschlagenden User-Flow diagnostizieren, den zugrunde liegenden UI- oder Integrationsfehler beheben und so lange durchlaufen, bis jede E2E-Spec besteht."},"flaky-test-triage":{"name":"Flaky-Test-Triage","description":"Die fehlschlagenden Tests rund um {{spec.title}} mehrfach erneut ausführen, um echte Regressionen von sporadischen Flakes zu trennen, dann die echten Brüche reparieren und die instabilen Tests stabilisieren oder dokumentieren."},"independent-verifier-pass":{"name":"Unabhängige Prüfung","description":"Eine adversariale Verifikation von {{spec.title}}: Build, Lint und Tests komplett neu ausführen, nur der rohen Befehlsausgabe vertrauen (nicht früheren „läuft\\"-Behauptungen) und jede Lücke aufdecken oder beheben."},"post-edit-test-guard":{"name":"Test-Guard nach Edits","description":"Nach jedem Block von Änderungen an {{spec.title}} sofort die kleinstmögliche Testmenge ausführen, die die geänderten Dateien berührt – so werden Regressionen im Moment ihres Auftretens erkannt statt erst am Ende."},"post-merge-regression-guard":{"name":"Regressions-Guard nach Merge","description":"Direkt nachdem ein Merge oder Rebase fremde Arbeit in {{spec.title}} gebracht hat, den schnellen Smoke Test ausführen, um Integrationsbrüche sofort zu erkennen – bevor neue Feature-Arbeit darauf aufsetzt."},"pre-commit-guard":{"name":"Pre-Commit-Guard","description":"Ein Sicherheits-Gate für {{spec.title}}, das jeden Commit abfängt: zuerst die Test-Suite ausführen und den Commit verweigern, solange sie rot ist – so gelangt kaputter Code nie in die Historie."},"visual-regression-until-match":{"name":"Visuelle Regression bis passt","description":"Visuelle Snapshots der geänderten UI aufnehmen, jeden ungewollten Pixel-Diff aufspüren und so lange selbst korrigieren, bis die visuelle Suite grün ist und nur bewusste Designänderungen freigegeben sind."},"format-until-clean":{"name":"Formatieren bis sauber","description":"Den Projekt-Formatter anwenden, die wenigen Stilprobleme beheben, die er nicht automatisch fixen kann, und weitermachen, bis ein erneuter Formatlauf den Arbeitsbaum unverändert lässt."},"lint-typecheck-fix":{"name":"Lint und Typecheck beheben","description":"Linter und Typechecker ausführen, jedes gemeldete Problem mit der kleinstmöglichen Änderung lösen und schleifen, bis beide Gates völlig sauber zurückkommen."},"a11y-audit-until-clean":{"name":"A11y-Audit bis sauber","description":"Die automatischen Barrierefreiheits-Checks über die geänderten Screens laufen lassen, die Verstöße Kategorie für Kategorie beheben und wiederholen, bis das Audit null Probleme meldet."},"de-sloppify-pass":{"name":"Aufräum-Durchlauf","description":"Nachdem das Feature steht, den Diff nach übrig gebliebenem Ballast durchforsten – Debug-Ausgaben, tote Zweige, schlampige Namen, aufgeblähte Funktionen –, das aufräumen und nachweisen, dass dabei nichts kaputtgegangen ist."},"fix-ci-until-green":{"name":"CI reparieren bis grün","description":"Den jüngsten roten CI-Lauf dieses Branches holen, den Bruch lokal reproduzieren, die echte Ursache patchen, pushen und so lange durchlaufen, bis jeder Check Erfolg meldet."},"pr-babysitter":{"name":"PR-Babysitter","description":"In regelmäßigen Abständen die beobachteten offenen Pull Requests durchgehen und jeden mergebar halten: rote CI wiederbeleben, zurückgefallene Branches gegen den Base-Branch rebasen und veraltete anstoßen – alles, was ein Mensch entscheiden muss, eskalieren."},"pr-watch-loop":{"name":"PR-Watch-Loop","description":"Die Pull Requests auf deiner Watchlist in gleichmäßigem Takt abfragen, für jeden den Zustand von CI und Review zusammenfassen und entweder triviale Blocker direkt erledigen oder aufzeigen, was einen Owner braucht."},"pr-self-review":{"name":"PR-Selbstreview","description":"Den eigenen Arbeits-Diff so kritisch prüfen wie ein anspruchsvoller Senior-Reviewer, das Gefundene beheben und erneut prüfen, bis ein sauberer Durchgang nichts Kritisches mehr findet – noch bevor der PR deine Hände verlässt."},"spec-first-ship":{"name":"Spec-First liefern","description":"Eine schriftliche Anforderungs-Checkliste Punkt für Punkt zum Abschluss bringen – jeder Durchgang setzt eine einzige offene Anforderung um, weist sie nach und hakt sie ab –, sodass die Spec der Vertrag für „fertig\\" ist."},"dependency-audit-weekly":{"name":"Wöchentliches Dependency-Audit","description":"Jede Woche Bilanz ziehen, welche Pakete zurückgefallen sind, sie in unbedenklich versus riskant einteilen und einen klaren, umsetzbaren Upgrade-Plan zurückliefern."},"dependency-upgrade-one-by-one":{"name":"Dependencies einzeln upgraden","description":"Pro Durchgang genau ein veraltetes Paket anheben, reparieren, was das Update bricht, nachweisen, dass das Projekt weiter läuft, und committen – weit sicherer, als alles auf einmal zu upgraden."},"knip-until-clean":{"name":"Toten Code entfernen bis sauber","description":"Unreferenzierte Exports, verwaiste Dateien und von niemandem importierte Abhängigkeiten aufspüren, sie sicher entfernen und weitermachen, bis der Dead-Code-Scanner nichts mehr zu melden hat."},"docs-sync-after-edits":{"name":"Docs an Codeänderungen angleichen","description":"Nach einer Runde Codeänderungen jedes betroffene Dokument aufspüren – README, API-Referenz, Inline-Kommentare – und es wieder damit in Einklang bringen, wie sich der Code jetzt tatsächlich verhält."},"security-audit-weekly":{"name":"Wöchentliches Security-Audit","description":"Wöchentlich einen Schwachstellen-Scan über den Dependency-Baum laufen lassen, die Funde nach Schweregrad und realer Exposition triagieren und einen priorisierten Behebungsplan zurückliefern."},"npm-audit-fix-loop":{"name":"Schwachstellen einzeln patchen","description":"High- und Critical-Advisories der Dependencies gezielt abarbeiten – ein Fix pro Durchgang, jeder gegen die Test-Suite verifiziert – statt eines blinden Force-Fix, der den Build still kaputt machen kann."},"api-contract-until-match":{"name":"API-Contract bis passt","description":"Die Implementierung so weit treiben, dass ihre Antworten dem veröffentlichten API-Contract entsprechen, und jede Lücke zwischen dem, was das Schema verspricht, und dem, was die Handler tatsächlich zurückgeben, schließen."},"openapi-sync-until-valid":{"name":"OpenAPI-Sync bis valide","description":"Das OpenAPI-Dokument wohlgeformt und getreu zu den echten Route-Handlern halten, indem in jedem Durchgang Spec-Fehler und Drift zwischen Code und Doku behoben werden, bis der Linter zufrieden ist."},"migration-until-applied":{"name":"Migration bis angewendet","description":"Das Datenbankschema sauber nach vorn bringen: die ausstehenden Migrationen ausführen, dabei auftretende Schema- oder SQL-Fehler beheben und sicherstellen, dass die Migrationshistorie konsistent bleibt."},"bundle-size-budget":{"name":"Bundle-Size-Budget","description":"Das Feature liefern, ohne das Client-Bundle über sein Budget aufzublähen – in jedem Durchgang messen und kürzen, per Code-Splitting aufteilen oder lazy laden, bis das Größen-Gate grün ist."},"changelog-sync-after-ship":{"name":"Changelog nach Release angleichen","description":"Nach dem Release sicherstellen, dass das Changelog die nutzersichtbare Geschichte erzählt: prüfen, was gelandet ist, Einträge im Keep-a-Changelog-Stil schreiben und bestätigen, dass nichts Sichtbares übersehen wurde."},"guardrails-learning-loop":{"name":"Guardrails-Lern-Loop","description":"Weiter an den Gates iterieren, bis sie grün werden, aber sobald ein Check zweimal auf dieselbe Weise scheitert, zuerst eine Guardrail-Notiz festhalten – so verschwendet die Schleife nie Iterationen mit einem Ansatz, der schon gescheitert ist."},"ralph-story-executor":{"name":"Backlog-Story-Executor","description":"Einen Backlog von User Storys einzeln und mit jeweils frischem Kontext abarbeiten: die nächste offene Story wählen, nur sie umsetzen, nachweisen, dass die Projekt-Gates grün bleiben, committen und sie als erledigt markieren, bevor es weitergeht."},"investigation-script-loop":{"name":"Untersuchungs-Skript-Loop","description":"Die wahre Ursache eines Bugs empirisch festnageln: ein winziges Wegwerf-Skript schreiben, das das verdächtige Verhalten auslöst, es ausführen, die echte Ausgabe lesen und die Sonde verfeinern, bis die Ausgabe selbst die Grundursache beweist."},"reflexion-debug-loop":{"name":"Reflexions-Debug-Loop","description":"Einen fehlschlagenden Test grün bekommen, ohne im Kreis zu laufen: bei jedem gescheiterten Versuch eine kurze Reflexion auf die Festplatte schreiben und sie vor dem nächsten Anlauf konsultieren, damit die Schleife nie einen bereits ausgeschlossenen Fix wiederholt."},"merge-conflict-resolver":{"name":"Merge-Konflikt-Löser","description":"Den Branch per Rebase auf seinen Zielstand bringen, dann jeden Konflikt Datei für Datei lösen und dabei die Absicht beider Seiten bewahren, und nachweisen, dass das Ergebnis weiterhin besteht, bevor der Branch als aktuell gilt."},"staging-smoke-test":{"name":"Staging-Smoke-Test","description":"Nach einem Staging-Deploy eine feste Smoke-Checkliste durchgehen – Auth, die zentralen User-Pfade und wichtige Integrationen –, bei jedem Bruch das kleinste Problem beheben und erneut durchlaufen, bis die ganze Checkliste sauber zurückkommt."},"deploy-verification-loop":{"name":"Deploy-Verifikations-Loop","description":"Nachdem ein Deploy raus ist, die Health- und Smoke-Endpoints im Intervall abfragen, jede nicht gesunde Antwort untersuchen und beheben oder eskalieren und so lange weiter prüfen, bis jeder konfigurierte Endpoint Erfolg meldet."},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"OpenSpec-Lebenszyklus vom Ticket bis zum Archiv: Artefakte generieren (opsx:ff) → implementieren (opsx:apply) → verifizieren (opsx:verify); bei FAIL zurück und denselben Change nachbessern, bei PASS unbeaufsichtigt archivieren."}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} Loop importiert`,done_other:`{{count}} Loops importiert`,skipped_one:`{{count}} Duplikat übersprungen: {{names}}`,skipped_other:`{{count}} Duplikate übersprungen: {{names}}`,invalid:`Diese Datei ist kein gültiger Loops-Export.`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
1
+ var e=`Loops`,t=`Wiederverwendbare Automatisierungs-Loops – projektübergreifend geteilt.`,n=`Neuer Loop`,r={drafts:`Entwürfe`,published:`Veröffentlicht`,templates:`Vorlagen`,builtIn:`Integriert`},i={search:`Vorlagen suchen…`,noResults:`Keine Vorlagen entsprechen deinen Filtern.`,clearFilter:`Filter zurücksetzen`,resultCount_one:`{{count}} Vorlage`,resultCount_other:`{{count}} Vorlagen`,needsSpec:`Spec nötig`,standalone:`Eigenständig`,needsSpecHint:`Läuft auf einer Rail mit einer gezogenen Spec`,standaloneHint:`Läuft eigenständig — einfach ein Projekt wählen`},a={API:`API`,Automation:`Automatisierung`,CI:`CI`,Database:`Datenbank`,Debugging:`Debugging`,DevOps:`DevOps`,Docs:`Doku`,Git:`Git`,Maintenance:`Wartung`,Performance:`Performance`,Planning:`Planung`,Quality:`Qualität`,Review:`Review`,Security:`Sicherheit`,Testing:`Tests`},o={draft:`Entwurf`,published:`Veröffentlicht`,running:`Läuft`},s={title:`Noch keine Loops`,body:`Erstelle einen von Grund auf neu oder beginne mit einer Vorlage.`},c={edit:`Bearbeiten`,delete:`Löschen`,publish:`Veröffentlichen`,unpublish:`Zurückziehen`,duplicate:`Duplizieren`,use:`Vorlage verwenden`,preview:`Vorschau`,fork:`Zum Bearbeiten forken`,run:`Ausführen`,export:`Exportieren`,import:`Importieren`,select:`{{name}} auswählen`},l={nodes_one:`{{count}} Knoten`,nodes_other:`{{count}} Knoten`,usedIn:`In Verwendung · {{project}}`},u=`Diesen Loop löschen? Er verschwindet aus jeder Rail-Auswahl.`,d=`Neuer Loop`,f={load:`Loops konnten nicht geladen werden`,save:`Loop konnte nicht gespeichert werden`,publishInvalid:`Dieser Loop kann noch nicht veröffentlicht werden – behebe die hervorgehobenen Probleme.`},p={back:`Zurück zu Loops`,save:`Speichern`,saved:`Loop gespeichert`,publish:`Veröffentlichen`,published:`Loop veröffentlicht`,addNode:`Knoten hinzufügen`,deleteNode:`Knoten löschen`,config:{maxIterations:`Maximale Iterationen`,timeout:`Timeout (Min.)`,maxIterationsHint:`Obergrenze für Loop-Decider-Iterationen — der Loop stoppt beim Erreichen, auch wenn das Ziel nicht erfüllt ist. Verhindert Endlosschleifen.`,timeoutHint:`Echtzeit-Limit für den gesamten Lauf, in Minuten. Bei Überschreitung wird der Lauf gestoppt und als fehlgeschlagen markiert — ein Sicherheitsnetz neben den max. Iterationen.`,maxCost:`Max. Kosten ($)`,maxCostHint:`Optionales USD-Budget für den gesamten Lauf. Wird ZWISCHEN Schritten geprüft (die Kosten eines Schritts stehen erst nach dessen Ende fest), der Loop stoppt vor dem nächsten Schritt, sobald die Summe es überschreitet — kann um einen Schritt überschreiten. Bei Nicht-Claude-Anbietern sind die Kosten geschätzt. Leer = kein Limit.`},nodes:{start:`Start`,"ai-step":`KI-Schritt`,shell:`Shell`,decider:`Loop-Entscheider`,condition:`Bedingung`,end:`Ende`},inspector:{selectNode:`Wähle einen Knoten aus, um ihn zu bearbeiten.`,prompt:`Prompt`,provider:`Anbieter`,model:`Modell`,effort:`Denkaufwand`,command:`Befehl`,goal:`Ziel / Abbruchkriterien`,join:`Verknüpfung`,outcome:`Ergebnis`,startNote:`Der Einstiegspunkt des Loops. Verbinde ihn mit dem ersten Schritt.`,promptHint:`Klicke oder ziehe ein Token, um es in den Prompt einzufügen.`,tokensSpec:`Spec-Felder`,tokensJira:`Jira`,tokensCommands:`Befehle`,label:`Name`},branch:{continue:`↻ Fortsetzen`,stop:`✓ Stoppen`},edgesHelp:{label:`Wie Schritte verbunden werden`,body:`Pfeile legen die REIHENFOLGE der Ausführung fest, keine Daten — Boxen haben keine Eingangsports und Kanten übergeben keine Parameter. Jeder AI Step setzt automatisch seine Session fort (vollständiger vorheriger Kontext) plus eine kurze Zusammenfassung der vorherigen Schritte; nichts wird von Hand verdrahtet. Der Loop Decider hat zwei Ausgänge: ↻ Fortsetzen (Ziel nicht erreicht → zurück in die Schleife) und ✓ Stoppen (Ziel erreicht → beenden).`},arrange:{label:`Anordnen`,vertical:`Vertikal`,horizontal:`Horizontal`,grid:`Raster`,reset:`Zurücksetzen`},constants:{label:`Konstanten`,manage:`Konstanten verwalten`,title:`Loop-Konstanten`,empty:`Noch keine eigenen Konstanten.`,name:`NAME`,value:`Wert`,add:`Hinzufügen`,builtinBadge:`Integriert`},paste:{done_one:`{{count}} Schritt eingefügt`,done_other:`{{count}} Schritte eingefügt`},problems:{count_one:`{{count}} Problem`,count_other:`{{count}} Probleme`,NO_START:`Füge einen Start-Knoten hinzu.`,MULTIPLE_START:`Nur ein Start-Knoten ist erlaubt.`,NO_END:`Füge mindestens einen End-Knoten hinzu.`,ORPHAN:`Dieser Schritt ist vom Start nicht erreichbar.`,DECIDER_BRANCHES:`Der Loop Decider braucht einen Fortsetzen- und einen Stopp-Zweig.`,EMPTY_PROMPT:`Der KI-Schritt hat einen leeren Prompt.`,EMPTY_COMMAND:`Der Shell-Schritt hat einen leeren Befehl.`,EMPTY_GOAL:`Der Loop Decider hat kein Ziel.`,DEAD_END:`Dieser Schritt hat keine ausgehende Verbindung.`},preview:{label:`Vorschau`,title:`Probelauf-Vorschau`,sampleNote:`Spec-Werte sind Beispieldaten; Befehle und Konstanten werden wie zur Laufzeit aufgelöst.`,empty:`Keine Schritte zur Vorschau.`,error:`Vorschau fehlgeschlagen`}},m={steps:`Schritte`,limits:`max. {{iterations}} Iterationen · {{timeout}} Min. Timeout`,openInBuilder:`Im Builder öffnen`,builtin:`Integriert`},h=`Integriert`,g={title:`{{name}} ausführen`,subtitle:`Diesen Loop auf einem Projekt starten (kein Ticket nötig).`,project:`Projekt`,provider:`Anbieter`,model:`Modell`,effort:`Reasoning-Aufwand`,execute:`Ausführen`,noProjects:`Keine Projekte verfügbar.`,launched:`{{name}} wird ausgeführt`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"Vollständig autonom: spec implementieren, verifizieren und bei Fehlern nachbessern (Fix) — in der Schleife verifizieren → fixen → verifizieren, bis alles grün ist. Kein manuelles Eingreifen."},"verify-pass":{"name":"Verify Pass","description":"Autonomes Verifizieren-und-Fixen: build/lint/Tests des Projekts erkennen und ausführen, dann bei Fehlern nachbessern — verifizieren → fixen → verifizieren, bis grün."},"ci-watch":{"name":"CI Watch","description":"Fragt die CI-Checks des offenen PR ab (der Agent nutzt das CI-Tooling des Repos), bis jeder Check grün ist."},"lint-and-fix":{"name":"Lint & Fix","description":"Der Agent erkennt und führt den lint des Projekts aus und behebt jedes Problem, iterierend, bis die Codebasis sauber ist."},"type-safe":{"name":"Type Safe","description":"Der Agent erkennt und führt den Typchecker des Projekts aus und behebt jeden Fehler, iterierend, bis er sauber durchläuft."},"coverage-climb":{"name":"Coverage Climb","description":"Der Agent führt das Coverage-Tooling des Projekts aus und ergänzt gezielte Tests, bis die Schwellenwerte erreicht sind."},"build-fix":{"name":"Build Fix","description":"Der Agent erkennt und führt den Produktions-build des Projekts aus und behebt Kompilier-/Bundle-Fehler, bis er grün ist."},"deploy-check":{"name":"Deploy Check","description":"Der Agent fragt den deploy-/Health-Status ab (mit dem deploy-Tooling des Projekts), bis der Dienst als gesund gemeldet wird."},"factory_implement":{"name":"Implementieren","description":"Vollständig autonom: spec implementieren, verifizieren und bei Fehlern nachbessern (Fix) — in der Schleife, bis alle Tests bestehen."},"factory_batch":{"name":"Batch-Implementierung","description":"Alle Tickets des Rails auf einmal als Batch implementieren, dann verifizieren + bei Fehlern nachbessern, bis grün."},"factory_freestyle":{"name":"Freestyle","description":"Übergibt die Spec direkt an das Modell mit voller Freiheit — ohne Pipeline, es arbeitet wie ein normaler Coding-Agent, dann verifizieren + verfeinern bis alles grün ist. Nur Claude."},"autoloop-tdd":{"name":"Autoloop TDD","description":"Ein strenger Red-Green-Refactor-Zyklus für {{spec.title}}: Jedes Verhalten zuerst mit einem fehlschlagenden Test festnageln, nur so viel Code schreiben, bis er grün wird, und dann aufräumen – so lange wiederholen, bis die Spec vollständig abgedeckt ist."},"e2e-until-green":{"name":"E2E bis grün","description":"Die E2E-Suite für {{spec.title}} ausführen, jeden fehlschlagenden User-Flow diagnostizieren, den zugrunde liegenden UI- oder Integrationsfehler beheben und so lange durchlaufen, bis jede E2E-Spec besteht."},"flaky-test-triage":{"name":"Flaky-Test-Triage","description":"Die fehlschlagenden Tests rund um {{spec.title}} mehrfach erneut ausführen, um echte Regressionen von sporadischen Flakes zu trennen, dann die echten Brüche reparieren und die instabilen Tests stabilisieren oder dokumentieren."},"independent-verifier-pass":{"name":"Unabhängige Prüfung","description":"Eine adversariale Verifikation von {{spec.title}}: Build, Lint und Tests komplett neu ausführen, nur der rohen Befehlsausgabe vertrauen (nicht früheren „läuft\\"-Behauptungen) und jede Lücke aufdecken oder beheben."},"post-edit-test-guard":{"name":"Test-Guard nach Edits","description":"Nach jedem Block von Änderungen an {{spec.title}} sofort die kleinstmögliche Testmenge ausführen, die die geänderten Dateien berührt – so werden Regressionen im Moment ihres Auftretens erkannt statt erst am Ende."},"post-merge-regression-guard":{"name":"Regressions-Guard nach Merge","description":"Direkt nachdem ein Merge oder Rebase fremde Arbeit in {{spec.title}} gebracht hat, den schnellen Smoke Test ausführen, um Integrationsbrüche sofort zu erkennen – bevor neue Feature-Arbeit darauf aufsetzt."},"pre-commit-guard":{"name":"Pre-Commit-Guard","description":"Ein Sicherheits-Gate für {{spec.title}}, das jeden Commit abfängt: zuerst die Test-Suite ausführen und den Commit verweigern, solange sie rot ist – so gelangt kaputter Code nie in die Historie."},"visual-regression-until-match":{"name":"Visuelle Regression bis passt","description":"Visuelle Snapshots der geänderten UI aufnehmen, jeden ungewollten Pixel-Diff aufspüren und so lange selbst korrigieren, bis die visuelle Suite grün ist und nur bewusste Designänderungen freigegeben sind."},"format-until-clean":{"name":"Formatieren bis sauber","description":"Den Projekt-Formatter anwenden, die wenigen Stilprobleme beheben, die er nicht automatisch fixen kann, und weitermachen, bis ein erneuter Formatlauf den Arbeitsbaum unverändert lässt."},"lint-typecheck-fix":{"name":"Lint und Typecheck beheben","description":"Linter und Typechecker ausführen, jedes gemeldete Problem mit der kleinstmöglichen Änderung lösen und schleifen, bis beide Gates völlig sauber zurückkommen."},"a11y-audit-until-clean":{"name":"A11y-Audit bis sauber","description":"Die automatischen Barrierefreiheits-Checks über die geänderten Screens laufen lassen, die Verstöße Kategorie für Kategorie beheben und wiederholen, bis das Audit null Probleme meldet."},"de-sloppify-pass":{"name":"Aufräum-Durchlauf","description":"Nachdem das Feature steht, den Diff nach übrig gebliebenem Ballast durchforsten – Debug-Ausgaben, tote Zweige, schlampige Namen, aufgeblähte Funktionen –, das aufräumen und nachweisen, dass dabei nichts kaputtgegangen ist."},"fix-ci-until-green":{"name":"CI reparieren bis grün","description":"Den jüngsten roten CI-Lauf dieses Branches holen, den Bruch lokal reproduzieren, die echte Ursache patchen, pushen und so lange durchlaufen, bis jeder Check Erfolg meldet."},"pr-babysitter":{"name":"PR-Babysitter","description":"In regelmäßigen Abständen die beobachteten offenen Pull Requests durchgehen und jeden mergebar halten: rote CI wiederbeleben, zurückgefallene Branches gegen den Base-Branch rebasen und veraltete anstoßen – alles, was ein Mensch entscheiden muss, eskalieren."},"pr-watch-loop":{"name":"PR-Watch-Loop","description":"Die Pull Requests auf deiner Watchlist in gleichmäßigem Takt abfragen, für jeden den Zustand von CI und Review zusammenfassen und entweder triviale Blocker direkt erledigen oder aufzeigen, was einen Owner braucht."},"pr-self-review":{"name":"PR-Selbstreview","description":"Den eigenen Arbeits-Diff so kritisch prüfen wie ein anspruchsvoller Senior-Reviewer, das Gefundene beheben und erneut prüfen, bis ein sauberer Durchgang nichts Kritisches mehr findet – noch bevor der PR deine Hände verlässt."},"spec-first-ship":{"name":"Spec-First liefern","description":"Eine schriftliche Anforderungs-Checkliste Punkt für Punkt zum Abschluss bringen – jeder Durchgang setzt eine einzige offene Anforderung um, weist sie nach und hakt sie ab –, sodass die Spec der Vertrag für „fertig\\" ist."},"dependency-audit-weekly":{"name":"Wöchentliches Dependency-Audit","description":"Jede Woche Bilanz ziehen, welche Pakete zurückgefallen sind, sie in unbedenklich versus riskant einteilen und einen klaren, umsetzbaren Upgrade-Plan zurückliefern."},"dependency-upgrade-one-by-one":{"name":"Dependencies einzeln upgraden","description":"Pro Durchgang genau ein veraltetes Paket anheben, reparieren, was das Update bricht, nachweisen, dass das Projekt weiter läuft, und committen – weit sicherer, als alles auf einmal zu upgraden."},"knip-until-clean":{"name":"Toten Code entfernen bis sauber","description":"Unreferenzierte Exports, verwaiste Dateien und von niemandem importierte Abhängigkeiten aufspüren, sie sicher entfernen und weitermachen, bis der Dead-Code-Scanner nichts mehr zu melden hat."},"docs-sync-after-edits":{"name":"Docs an Codeänderungen angleichen","description":"Nach einer Runde Codeänderungen jedes betroffene Dokument aufspüren – README, API-Referenz, Inline-Kommentare – und es wieder damit in Einklang bringen, wie sich der Code jetzt tatsächlich verhält."},"security-audit-weekly":{"name":"Wöchentliches Security-Audit","description":"Wöchentlich einen Schwachstellen-Scan über den Dependency-Baum laufen lassen, die Funde nach Schweregrad und realer Exposition triagieren und einen priorisierten Behebungsplan zurückliefern."},"npm-audit-fix-loop":{"name":"Schwachstellen einzeln patchen","description":"High- und Critical-Advisories der Dependencies gezielt abarbeiten – ein Fix pro Durchgang, jeder gegen die Test-Suite verifiziert – statt eines blinden Force-Fix, der den Build still kaputt machen kann."},"api-contract-until-match":{"name":"API-Contract bis passt","description":"Die Implementierung so weit treiben, dass ihre Antworten dem veröffentlichten API-Contract entsprechen, und jede Lücke zwischen dem, was das Schema verspricht, und dem, was die Handler tatsächlich zurückgeben, schließen."},"openapi-sync-until-valid":{"name":"OpenAPI-Sync bis valide","description":"Das OpenAPI-Dokument wohlgeformt und getreu zu den echten Route-Handlern halten, indem in jedem Durchgang Spec-Fehler und Drift zwischen Code und Doku behoben werden, bis der Linter zufrieden ist."},"migration-until-applied":{"name":"Migration bis angewendet","description":"Das Datenbankschema sauber nach vorn bringen: die ausstehenden Migrationen ausführen, dabei auftretende Schema- oder SQL-Fehler beheben und sicherstellen, dass die Migrationshistorie konsistent bleibt."},"bundle-size-budget":{"name":"Bundle-Size-Budget","description":"Das Feature liefern, ohne das Client-Bundle über sein Budget aufzublähen – in jedem Durchgang messen und kürzen, per Code-Splitting aufteilen oder lazy laden, bis das Größen-Gate grün ist."},"changelog-sync-after-ship":{"name":"Changelog nach Release angleichen","description":"Nach dem Release sicherstellen, dass das Changelog die nutzersichtbare Geschichte erzählt: prüfen, was gelandet ist, Einträge im Keep-a-Changelog-Stil schreiben und bestätigen, dass nichts Sichtbares übersehen wurde."},"guardrails-learning-loop":{"name":"Guardrails-Lern-Loop","description":"Weiter an den Gates iterieren, bis sie grün werden, aber sobald ein Check zweimal auf dieselbe Weise scheitert, zuerst eine Guardrail-Notiz festhalten – so verschwendet die Schleife nie Iterationen mit einem Ansatz, der schon gescheitert ist."},"ralph-story-executor":{"name":"Backlog-Story-Executor","description":"Einen Backlog von User Storys einzeln und mit jeweils frischem Kontext abarbeiten: die nächste offene Story wählen, nur sie umsetzen, nachweisen, dass die Projekt-Gates grün bleiben, committen und sie als erledigt markieren, bevor es weitergeht."},"investigation-script-loop":{"name":"Untersuchungs-Skript-Loop","description":"Die wahre Ursache eines Bugs empirisch festnageln: ein winziges Wegwerf-Skript schreiben, das das verdächtige Verhalten auslöst, es ausführen, die echte Ausgabe lesen und die Sonde verfeinern, bis die Ausgabe selbst die Grundursache beweist."},"reflexion-debug-loop":{"name":"Reflexions-Debug-Loop","description":"Einen fehlschlagenden Test grün bekommen, ohne im Kreis zu laufen: bei jedem gescheiterten Versuch eine kurze Reflexion auf die Festplatte schreiben und sie vor dem nächsten Anlauf konsultieren, damit die Schleife nie einen bereits ausgeschlossenen Fix wiederholt."},"merge-conflict-resolver":{"name":"Merge-Konflikt-Löser","description":"Den Branch per Rebase auf seinen Zielstand bringen, dann jeden Konflikt Datei für Datei lösen und dabei die Absicht beider Seiten bewahren, und nachweisen, dass das Ergebnis weiterhin besteht, bevor der Branch als aktuell gilt."},"staging-smoke-test":{"name":"Staging-Smoke-Test","description":"Nach einem Staging-Deploy eine feste Smoke-Checkliste durchgehen – Auth, die zentralen User-Pfade und wichtige Integrationen –, bei jedem Bruch das kleinste Problem beheben und erneut durchlaufen, bis die ganze Checkliste sauber zurückkommt."},"deploy-verification-loop":{"name":"Deploy-Verifikations-Loop","description":"Nachdem ein Deploy raus ist, die Health- und Smoke-Endpoints im Intervall abfragen, jede nicht gesunde Antwort untersuchen und beheben oder eskalieren und so lange weiter prüfen, bis jeder konfigurierte Endpoint Erfolg meldet."},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"OpenSpec-Lebenszyklus vom Ticket bis zum Archiv: Artefakte generieren (opsx:ff) → implementieren (opsx:apply) → verifizieren (opsx:verify); bei FAIL zurück und denselben Change nachbessern, bei PASS unbeaufsichtigt archivieren."}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} Loop importiert`,done_other:`{{count}} Loops importiert`,skipped_one:`{{count}} Duplikat übersprungen: {{names}}`,skipped_other:`{{count}} Duplikate übersprungen: {{names}}`,invalid:`Diese Datei ist kein gültiger Loops-Export.`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
@@ -0,0 +1 @@
1
+ var e=`Loops`,t=`Loops de automação reutilizáveis — partilhados entre todos os seus projetos.`,n=`Novo loop`,r={drafts:`Rascunhos`,published:`Publicados`,templates:`Modelos`,builtIn:`Integrados`},i={search:`Buscar modelos…`,noResults:`Nenhum modelo corresponde aos seus filtros.`,clearFilter:`Limpar filtros`,resultCount_one:`{{count}} modelo`,resultCount_other:`{{count}} modelos`,needsSpec:`Requer spec`,standalone:`Autônoma`,needsSpecHint:`Roda em um rail com uma spec arrastada`,standaloneHint:`Roda sozinha — basta escolher um projeto`},a={API:`API`,Automation:`Automação`,CI:`CI`,Database:`Banco de dados`,Debugging:`Depuração`,DevOps:`DevOps`,Docs:`Docs`,Git:`Git`,Maintenance:`Manutenção`,Performance:`Desempenho`,Planning:`Planejamento`,Quality:`Qualidade`,Review:`Revisão`,Security:`Segurança`,Testing:`Testes`},o={draft:`Rascunho`,published:`Publicado`,running:`Em execução`},s={title:`Ainda não há loops`,body:`Crie um do zero ou comece a partir de um modelo.`},c={edit:`Editar`,delete:`Eliminar`,publish:`Publicar`,unpublish:`Despublicar`,duplicate:`Duplicar`,use:`Usar modelo`,preview:`Pré-visualização`,fork:`Bifurcar para editar`,run:`Executar`,export:`Exportar`,import:`Importar`,select:`Selecionar {{name}}`},l={nodes_one:`{{count}} nó`,nodes_other:`{{count}} nós`,usedIn:`Em uso · {{project}}`},u=`Eliminar este loop? Desaparecerá de todos os seletores de rail.`,d=`Novo loop`,f={load:`Falha ao carregar os loops`,save:`Falha ao guardar o loop`,publishInvalid:`Este loop ainda não pode ser publicado — corrija os problemas assinalados.`},p={back:`Voltar aos Loops`,save:`Guardar`,saved:`Loop guardado`,publish:`Publicar`,published:`Loop publicado`,addNode:`Adicionar nó`,deleteNode:`Eliminar nó`,config:{maxIterations:`Iterações máximas`,timeout:`Tempo limite (min)`,maxIterationsHint:`Limite de iterações do Loop Decider — o loop para ao atingi-lo mesmo que o objetivo não seja cumprido. Evita loops infinitos.`,timeoutHint:`Limite de tempo real de toda a execução, em minutos. Se excedido, a execução é interrompida e marcada como falha — uma rede de segurança junto com as iterações máximas.`,maxCost:`Custo máx ($)`,maxCostHint:`Orçamento opcional em USD para toda a execução. Verificado ENTRE passos (o custo de um passo só é conhecido ao terminá-lo), o loop para antes do próximo passo quando o total freestylepassa — pode passar um passo. Em provedores não-Claude o custo é estimado. Vazio = sem limite.`},nodes:{start:`Início`,"ai-step":`Passo de IA`,shell:`Shell`,decider:`Decisor do Loop`,condition:`Condição`,end:`Fim`},inspector:{selectNode:`Selecione um nó para o editar.`,prompt:`Prompt`,provider:`Fornecedor`,model:`Modelo`,effort:`Esforço de raciocínio`,command:`Comando`,goal:`Objetivo / critérios de paragem`,join:`Junção`,outcome:`Resultado`,startNote:`O ponto de entrada do loop. Ligue-o ao primeiro passo.`,promptHint:`Clique ou arraste um token para inseri-lo no prompt.`,tokensSpec:`Campos da spec`,tokensJira:`Jira`,tokensCommands:`Comandos`,label:`Nome`},branch:{continue:`↻ Continuar`,stop:`✓ Parar`},edgesHelp:{label:`Como as etapas se conectam`,body:`As setas definem a ORDEM de execução, não os dados — as caixas não têm portas de entrada e as conexões não carregam parâmetros. Cada AI Step retoma automaticamente sua sessão (todo o contexto anterior) mais um breve resumo das etapas anteriores; nada é ligado manualmente. O Loop Decider tem duas saídas: ↻ Continuar (objetivo não atingido → volta ao loop) e ✓ Parar (objetivo atingido → sai).`},arrange:{label:`Organizar`,vertical:`Vertical`,horizontal:`Horizontal`,grid:`Grade`,reset:`Redefinir`},constants:{label:`Constantes`,manage:`Gerenciar constantes`,title:`Constantes do loop`,empty:`Ainda não há constantes personalizadas.`,name:`NOME`,value:`valor`,add:`Adicionar`,builtinBadge:`Integradas`},paste:{done_one:`{{count}} passo colado`,done_other:`{{count}} passos colados`},problems:{count_one:`{{count}} problema`,count_other:`{{count}} problemas`,NO_START:`Adicione um nó de Início.`,MULTIPLE_START:`Só é permitido um nó de Início.`,NO_END:`Adicione pelo menos um nó de Fim.`,ORPHAN:`Este passo não é acessível a partir do Início.`,DECIDER_BRANCHES:`O Loop Decider precisa de uma ramificação Continuar e uma Parar.`,EMPTY_PROMPT:`O AI Step está com o prompt vazio.`,EMPTY_COMMAND:`O passo Shell está com o comando vazio.`,EMPTY_GOAL:`O Loop Decider não tem objetivo.`,DEAD_END:`Este passo não tem conexão de saída.`},preview:{label:`Pré-visualizar`,title:`Pré-visualização (dry-run)`,sampleNote:`Os valores do spec são exemplos; comandos e constantes são resolvidos como em execução.`,empty:`Nenhum passo para pré-visualizar.`,error:`Falha na pré-visualização`}},m={steps:`Passos`,limits:`máx. {{iterations}} iterações · {{timeout}} min de timeout`,openInBuilder:`Abrir no builder`,builtin:`Integrado`},h=`Integrado`,g={title:`Executar {{name}}`,subtitle:`Inicia este loop num projeto (sem ticket).`,project:`Projeto`,provider:`Provedor`,model:`Modelo`,effort:`Esforço de raciocínio`,execute:`Executar`,noProjects:`Sem projetos disponíveis.`,launched:`Executando {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"Ship & Green","description":"Totalmente autônomo: implementa a spec, verifica e refina (corrige) em caso de falha — repetindo verificar → corrigir → verificar até tudo ficar verde. Sem intervenção humana."},"verify-pass":{"name":"Verificação","description":"Verificação e correção autônomas: detecta e executa o build/lint/testes do projeto e, em caso de falha, refina — verificar → corrigir → verificar até ficar verde."},"ci-watch":{"name":"Monitorar CI","description":"Consulta as verificações de CI no PR aberto (o agente usa as ferramentas de CI do repositório) até que todas fiquem verdes."},"lint-and-fix":{"name":"Lint & Corrigir","description":"O agente detecta e executa o lint do projeto e corrige cada problema, iterando até o código ficar limpo."},"type-safe":{"name":"Tipos Seguros","description":"O agente detecta e executa o verificador de tipos do projeto e resolve cada erro, iterando até passar sem problemas."},"coverage-climb":{"name":"Subir Cobertura","description":"O agente executa a ferramenta de cobertura do projeto e adiciona testes focados até atingir os limites exigidos."},"build-fix":{"name":"Corrigir Build","description":"O agente detecta e executa o build de produção do projeto e corrige erros de compilação/empacotamento até ficar verde."},"deploy-check":{"name":"Checar Deploy","description":"O agente consulta o status de deploy/saúde (usando as ferramentas de deploy do projeto) até o serviço reportar que está saudável."},"factory_implement":{"name":"Implementar","description":"Totalmente autônomo: implementa a spec, verifica e refina (corrige) em caso de falha — repetindo até todos os testes passarem."},"factory_batch":{"name":"Implementar em Lote","description":"Implementa de uma vez todos os tickets do trilho e, em seguida, verifica + refina em caso de falha até ficar verde."},"factory_freestyle":{"name":"Freestyle","description":"Entrega a spec diretamente ao modelo com total liberdade — sem pipeline, ele trabalha como um agente de código normal, depois verifica + refina até ficar verde. Somente Claude."},"autoloop-tdd":{"name":"Autoloop TDD","description":"Um ciclo rigoroso de red-green-refactor para {{spec.title}}: defina cada comportamento primeiro com um teste que falha, escreva só o código necessário para deixá-lo verde e então organize — repetindo até cobrir totalmente a spec."},"e2e-until-green":{"name":"E2E até passar","description":"Rode a suíte end-to-end de {{spec.title}}, diagnostique cada fluxo de usuário que falha, corrija o defeito de UI ou integração por trás dele e siga iterando até todas as specs E2E passarem."},"flaky-test-triage":{"name":"Triagem de testes instáveis","description":"Reexecute várias vezes os testes que falham em torno de {{spec.title}} para separar regressões reais de instabilidades intermitentes, depois conserte as quebras reais e estabilize ou documente as instáveis."},"independent-verifier-pass":{"name":"Verificação independente","description":"Uma verificação adversarial de {{spec.title}}: rode build, lint e testes do zero, confie só na saída crua dos comandos (não em qualquer alegação prévia de 'funciona') e exponha ou corrija cada falha."},"post-edit-test-guard":{"name":"Teste pós-edição","description":"Após cada lote de edições em {{spec.title}}, rode imediatamente o menor conjunto de testes que toca os arquivos alterados — pegando regressões no instante em que surgem, em vez de só no final."},"post-merge-regression-guard":{"name":"Guarda pós-merge","description":"Logo após um merge ou rebase trazer o trabalho de outras pessoas para {{spec.title}}, rode o smoke test rápido para pegar quebras de integração na hora — antes de começar qualquer nova feature em cima disso."},"pre-commit-guard":{"name":"Guarda pré-commit","description":"Um portão de segurança para {{spec.title}} que intercepta cada commit: roda a suíte de testes primeiro e se recusa a commitar enquanto ela estiver vermelha, para que código quebrado nunca entre no histórico."},"visual-regression-until-match":{"name":"Regressão visual até bater","description":"Capture snapshots visuais da UI alterada, cace cada diferença de pixel não intencional e se autocorrija até a suíte visual ficar verde, com apenas as mudanças de design deliberadas aprovadas."},"format-until-clean":{"name":"Formatar até limpar","description":"Aplique o formatador do projeto, resolva os poucos problemas de estilo que ele não corrige sozinho e siga até uma nova formatação não alterar mais nada na árvore de trabalho."},"lint-typecheck-fix":{"name":"Corrigir lint e tipos","description":"Rode o lint e o verificador de tipos, resolva cada problema reportado com a menor edição possível e itere até ambos os portões voltarem completamente limpos."},"a11y-audit-until-clean":{"name":"Auditoria de a11y","description":"Rode as verificações automáticas de acessibilidade nas telas alteradas, corrija as violações uma categoria por vez e repita até a auditoria voltar sem nenhum problema."},"de-sloppify-pass":{"name":"Passada de limpeza","description":"Depois que a feature entra, varra o diff atrás de sobras desleixadas — saída de debug, ramos mortos, nomes ruins, funções inchadas — limpe tudo e comprove que a limpeza não quebrou nada."},"fix-ci-until-green":{"name":"Corrigir CI até passar","description":"Pegue a execução de CI mais recente que ficou vermelha nesta branch, reproduza a quebra na sua máquina, corrija a causa real, faça push e siga iterando até todas as checagens reportarem sucesso."},"pr-babysitter":{"name":"Babá de PRs","description":"Em intervalos recorrentes, varra os pull requests que você acompanha e mantenha cada um mergeável: reviva CI vermelho, faça rebase dos que ficaram atrás da branch base e cutuque os parados — escalando tudo o que precisa da decisão de um humano."},"pr-watch-loop":{"name":"Acompanhar PRs","description":"Consulte os pull requests da sua lista de acompanhamento em cadência constante, resuma a saúde de CI e revisão de cada um e resolva os bloqueios triviais ou destaque o que precisa de um responsável."},"pr-self-review":{"name":"Auto-revisão de PR","description":"Critique o seu próprio diff como faria um revisor sênior exigente, resolva o que encontrar e revise de novo até uma passada limpa não apontar nada crítico — antes mesmo do PR sair das suas mãos."},"spec-first-ship":{"name":"Spec primeiro","description":"Leve um checklist escrito de requisitos até o fim, um item por vez — cada passada implementa um único requisito não marcado, comprova e o risca — para que a spec seja o contrato do 'pronto'."},"dependency-audit-weekly":{"name":"Auditoria semanal de deps","description":"A cada semana, faça um balanço de quais pacotes ficaram para trás, separe-os entre seguros de atualizar e arriscados e devolva um plano de upgrade claro e acionável."},"dependency-upgrade-one-by-one":{"name":"Atualizar deps uma a uma","description":"Atualize exatamente um pacote desatualizado por passada, conserte o que a atualização quebrar, comprove que o projeto ainda funciona e commite — bem mais seguro do que atualizar tudo de uma vez."},"knip-until-clean":{"name":"Podar código morto","description":"Cace exports sem referência, arquivos órfãos e dependências que ninguém importa, remova-os com segurança e siga até o scanner de código morto não ter mais nada a reportar."},"docs-sync-after-edits":{"name":"Sincronizar docs com o código","description":"Após uma rodada de edições, rastreie cada doc que as mudanças tocaram — README, referência de API, comentários inline — e alinhe-os de novo com o real comportamento atual do código."},"security-audit-weekly":{"name":"Auditoria semanal de segurança","description":"Rode um scan semanal de vulnerabilidades sobre a árvore de dependências, faça a triagem do que aparecer por severidade e exposição real e devolva um plano de remediação priorizado."},"npm-audit-fix-loop":{"name":"Corrigir vulnerabilidades uma a uma","description":"Resolva os alertas altos e críticos de dependências de forma deliberada — uma correção por passada, cada uma verificada contra a suíte de testes — em vez de um force-fix cego que pode quebrar o build em silêncio."},"api-contract-until-match":{"name":"Contrato de API até bater","description":"Conduza a implementação até suas respostas honrarem o contrato de API publicado, fechando qualquer lacuna entre o que o schema promete e o que os handlers de fato retornam."},"openapi-sync-until-valid":{"name":"Sincronizar OpenAPI","description":"Mantenha o documento OpenAPI bem-formado e fiel aos handlers de rota reais, corrigindo erros da spec e o descompasso código-vs-doc a cada passada até o lint ficar satisfeito."},"migration-until-applied":{"name":"Migração até aplicar","description":"Leve o schema do banco adiante de forma limpa: rode as migrações pendentes, corrija qualquer falha de schema ou SQL que elas revelem e confirme que o histórico de migração permanece consistente."},"bundle-size-budget":{"name":"Orçamento de bundle","description":"Entregue a feature sem inflar o bundle do cliente além do orçamento — meça a cada passada e enxugue, faça code-split ou carregamento lazy até o portão de tamanho ficar verde."},"changelog-sync-after-ship":{"name":"Sincronizar changelog","description":"Após entregar, garanta que o changelog conte a história voltada ao usuário: revise o que entrou, escreva as entradas no padrão Keep-a-Changelog e confirme que nada visível ficou de fora."},"guardrails-learning-loop":{"name":"Loop de guardrails","description":"Siga iterando nos portões até ficarem verdes, mas toda vez que uma checagem falhar do mesmo jeito duas vezes, anote primeiro uma nota de guardrail para que o loop nunca gaste iterações tentando de novo uma abordagem que já falhou."},"ralph-story-executor":{"name":"Executor de histórias","description":"Trabalhe um backlog de histórias de usuário uma por vez, com contexto novo a cada passada: pegue a próxima história pendente, construa só ela, comprove que os portões do projeto seguem verdes, commite e marque como pronta antes de seguir."},"investigation-script-loop":{"name":"Script de investigação","description":"Identifique empiricamente a verdadeira causa de um bug: escreva um script descartável minúsculo que exercita o comportamento suspeito, rode-o, leia a saída real e refine a sonda até a própria saída provar a causa raiz."},"reflexion-debug-loop":{"name":"Debug com reflexão","description":"Deixe um teste que falha verde sem ficar patinando: cada vez que uma tentativa falha, registre uma reflexão curta em disco e consulte-a antes da próxima tentativa, para que o loop nunca repita uma correção já descartada."},"merge-conflict-resolver":{"name":"Resolver conflitos de merge","description":"Atualize a branch em relação ao alvo via rebase, depois resolva cada arquivo em conflito um a um preservando a intenção dos dois lados e comprove que o resultado ainda passa antes de declarar a branch em dia."},"staging-smoke-test":{"name":"Smoke test em staging","description":"Após um deploy em staging, percorra um checklist fixo de smoke — auth, os fluxos centrais de usuário e as integrações-chave — corrigindo o menor problema sempre que algo quebra e reexecutando até o checklist inteiro voltar limpo."},"deploy-verification-loop":{"name":"Verificação de deploy","description":"Depois que um deploy sai, consulte os endpoints de saúde e smoke em intervalos, investigando e corrigindo ou escalando qualquer resposta não saudável, e siga checando até todos os endpoints configurados reportarem sucesso."},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"Ciclo OpenSpec do ticket ao arquivo: gera artefatos (opsx:ff) → implementa (opsx:apply) → verifica (opsx:verify); em FAIL volta e emenda o mesmo change, em PASS arquiva sem intervenção."}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`{{count}} loop importado`,done_other:`{{count}} loops importados`,skipped_one:`{{count}} duplicado ignorado: {{names}}`,skipped_other:`{{count}} duplicados ignorados: {{names}}`,invalid:`Esse arquivo não é uma exportação de loops válida.`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
@@ -1 +1 @@
1
- var e=`Loops`,t=`可复用的自动化循环——在你所有项目间共享。`,n=`新建循环`,r={drafts:`草稿`,published:`已发布`,templates:`模板`,builtIn:`内置`},i={search:`搜索模板…`,noResults:`没有模板符合筛选条件。`,clearFilter:`清除筛选`,resultCount_one:`{{count}} 个模板`,resultCount_other:`{{count}} 个模板`,needsSpec:`需要规格`,standalone:`独立运行`,needsSpecHint:`在 rail 上运行,需拖入一个规格`,standaloneHint:`独立运行——只需选择一个项目`},a={API:`API`,Automation:`自动化`,CI:`CI`,Database:`数据库`,Debugging:`调试`,DevOps:`DevOps`,Docs:`文档`,Git:`Git`,Maintenance:`维护`,Performance:`性能`,Planning:`规划`,Quality:`质量`,Review:`评审`,Security:`安全`,Testing:`测试`},o={draft:`草稿`,published:`已发布`,running:`运行中`},s={title:`暂无循环`,body:`从零创建一个,或从模板开始。`},c={edit:`编辑`,delete:`删除`,publish:`发布`,unpublish:`取消发布`,duplicate:`复制`,use:`使用模板`,preview:`预览`,fork:`复刻以编辑`,run:`运行`,export:`导出`,import:`导入`,select:`选择 {{name}}`},l={nodes_one:`{{count}} 个节点`,nodes_other:`{{count}} 个节点`,usedIn:`使用中 · {{project}}`},u=`删除此循环?它将从所有 rail 选择器中消失。`,d=`新建循环`,f={load:`加载循环失败`,save:`保存循环失败`,publishInvalid:`此循环暂时无法发布——请修复高亮显示的问题。`},p={back:`返回循环列表`,save:`保存`,saved:`循环已保存`,publish:`发布`,published:`循环已发布`,addNode:`添加节点`,deleteNode:`删除节点`,config:{maxIterations:`最大迭代次数`,timeout:`超时(分钟)`,maxIterationsHint:`Loop Decider 迭代次数上限——达到后即使目标未达成也会停止循环。防止无限循环。`,timeoutHint:`整个运行的实际时间上限(分钟)。超过后运行将停止并标记为失败——与最大迭代次数一起作为安全网。`,maxCost:`最大费用 ($)`,maxCostHint:`整个运行的可选美元预算。在步骤之间检查(每步费用只有在该步结束后才知道),因此当总额超过时循环会在下一步之前停止——可能超出一步。非 Claude 提供方的费用为估算。留空 = 不限制。`},nodes:{start:`开始`,"ai-step":`AI 步骤`,shell:`Shell`,decider:`循环决策器`,condition:`条件`,end:`结束`},inspector:{selectNode:`选择一个节点进行编辑。`,prompt:`提示词`,provider:`提供方`,model:`模型`,effort:`推理强度`,command:`命令`,goal:`目标 / 停止条件`,join:`合并`,outcome:`结果`,startNote:`循环的入口点。将其连接到第一个步骤。`,promptHint:`点击或拖动令牌将其插入提示词。`,tokensSpec:`Spec 字段`,tokensJira:`Jira`,tokensCommands:`命令`,label:`名称`},branch:{continue:`↻ 继续`,stop:`✓ 停止`},edgesHelp:{label:`步骤如何连接`,body:`箭头设定的是运行顺序,而非数据——节点没有输入端口,连线也不携带任何参数。每个 AI Step 都会自动恢复其会话(完整的先前上下文),并附带前序步骤的简短摘要;无需手动连线。Loop Decider 有两个输出:↻ 继续(目标未达成 → 循环返回)和 ✓ 停止(目标达成 → 退出)。`},arrange:{label:`排列`,vertical:`垂直`,horizontal:`水平`,grid:`网格`,reset:`重置`},constants:{label:`常量`,manage:`管理常量`,title:`循环常量`,empty:`还没有自定义常量。`,name:`名称`,value:`值`,add:`添加`,builtinBadge:`内置`},paste:{done_one:`已粘贴 {{count}} 个步骤`,done_other:`已粘贴 {{count}} 个步骤`},problems:{count_one:`{{count}} 个问题`,count_other:`{{count}} 个问题`,NO_START:`添加一个开始节点。`,MULTIPLE_START:`只允许一个开始节点。`,NO_END:`至少添加一个结束节点。`,ORPHAN:`该步骤无法从开始到达。`,DECIDER_BRANCHES:`Loop Decider 需要一个继续分支和一个停止分支。`,EMPTY_PROMPT:`AI 步骤的提示词为空。`,EMPTY_COMMAND:`Shell 步骤的命令为空。`,EMPTY_GOAL:`Loop Decider 没有目标。`,DEAD_END:`该步骤没有出向连接。`},preview:{label:`预览`,title:`试运行预览`,sampleNote:`Spec 值为示例数据;命令和常量按运行时的实际值解析。`,empty:`没有可预览的步骤。`,error:`预览失败`}},m={steps:`步骤`,limits:`最多 {{iterations}} 次迭代 · {{timeout}} 分钟超时`,openInBuilder:`在构建器中打开`,builtin:`内置`},h=`内置`,g={title:`运行 {{name}}`,subtitle:`在某个项目上启动此循环(无需工单)。`,project:`项目`,provider:`提供方`,model:`模型`,effort:`推理强度`,execute:`执行`,noProjects:`没有可用的项目。`,launched:`正在运行 {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"交付并通过","description":"全自动:实现 spec、验证,失败时自动修正(fix)——循环执行 验证 → 修复 → 验证,直到全部通过。无需人工干预。"},"verify-pass":{"name":"验证通过","description":"自动验证并修复:检测并运行项目的 build/lint/测试,失败时自动修正——验证 → 修复 → 验证,直到全部通过。"},"ci-watch":{"name":"CI 监视","description":"轮询当前已打开 PR 的 CI 检查(由 agent 使用仓库的 CI 工具),直到每一项检查都通过。"},"lint-and-fix":{"name":"Lint 修复","description":"agent 检测并运行项目的 linter,修复每一个问题,持续迭代直到代码库干净无误。"},"type-safe":{"name":"类型安全","description":"agent 检测并运行项目的类型检查器,解决每一个错误,持续迭代直到顺利通过。"},"coverage-climb":{"name":"覆盖率提升","description":"agent 运行项目的覆盖率工具并补充针对性测试,直到达到阈值。"},"build-fix":{"name":"构建修复","description":"agent 检测并运行项目的生产 build,修复编译/打包错误,直到顺利通过。"},"deploy-check":{"name":"部署检查","description":"agent 轮询部署/健康状态(使用项目的 deploy 工具),直到服务报告健康。"},"factory_implement":{"name":"实现","description":"全自动:实现 spec、验证,失败时自动修正(fix)——循环直到所有测试通过。"},"factory_batch":{"name":"批量实现","description":"一次性批量实现该 rail 的全部工单,然后验证 + 失败时修正,直到全部通过。"},"factory_ultracode":{"name":"Freestyle","description":"将 spec 直接交给模型, 给予完全自由 — 无管线, 像普通编码智能体一样工作, 然后验证+改进直到全部通过。仅限 Claude。"},"autoloop-tdd":{"name":"自动循环 TDD","description":"针对 {{spec.title}} 严格执行红-绿-重构循环:先用失败的测试锁定每个行为,再写刚好够让它变绿的代码,然后整理代码——如此反复,直到完整覆盖该规格。"},"e2e-until-green":{"name":"E2E 直到通过","description":"运行 {{spec.title}} 的 E2E 测试套件,逐一诊断失败的用户流程,修复底层的 UI 或集成缺陷,持续循环直到每条 E2E 用例都通过。"},"flaky-test-triage":{"name":"不稳定测试分诊","description":"多次重跑 {{spec.title}} 相关的失败测试,区分真正的回归与偶发的不稳定,然后修复真正的故障,并稳定或记录那些不稳定的用例。"},"independent-verifier-pass":{"name":"独立验证一遍","description":"对 {{spec.title}} 做对抗式验证:从零重新运行构建、lint 和测试,只信任命令的原始输出(不信任此前任何「能用」的说法),并暴露或修复每个缺口。"},"post-edit-test-guard":{"name":"改后测试守卫","description":"针对 {{spec.title}} 每改完一批代码,立刻运行覆盖改动文件的最小测试集——在回归出现的当下就捕获,而非拖到最后。"},"post-merge-regression-guard":{"name":"合并后回归守卫","description":"在合并或变基把他人的工作引入 {{spec.title}} 后,立即运行快速 smoke test 套件以第一时间发现集成破坏——在新功能开发动工之前。"},"pre-commit-guard":{"name":"提交前守卫","description":"为 {{spec.title}} 把守每次提交:先运行测试套件,只要测试为红就拒绝提交,让坏代码永远进不了历史记录。"},"visual-regression-until-match":{"name":"视觉回归直到匹配","description":"对改动的 UI 截取视觉快照,揪出每一处非预期的像素差异并自我修正,直到视觉套件全部通过、且只保留经审批的有意设计变更。"},"format-until-clean":{"name":"格式化直到干净","description":"运行项目格式化工具,手动收拾它无法自动修复的少量风格问题,持续进行直到再次格式化不再改动工作区。"},"lint-typecheck-fix":{"name":"Lint 与类型检查修复","description":"运行 lint 工具和类型检查器,以尽可能小的改动逐一解决每个报告的问题,循环直到两道关卡都彻底通过。"},"a11y-audit-until-clean":{"name":"无障碍审计直到干净","description":"对改动的页面运行自动化无障碍检查,按类别逐项修复违规,反复进行直到审计返回零问题。"},"de-sloppify-pass":{"name":"清理杂乱一遍","description":"功能落地后,把改动从头扫一遍清除残留杂乱——调试输出、死分支、随意命名、臃肿函数——清理干净,并证明清理没有破坏任何东西。"},"fix-ci-until-green":{"name":"修复 CI 直到通过","description":"拉取本分支最近一次失败的 CI 运行,在本地复现故障,修复真正的根因并推送,持续循环直到每项检查都报告成功。"},"pr-babysitter":{"name":"PR 看护","description":"按固定间隔巡查你关注的开放 PR,让每个都保持可合并状态:救活失败的 CI,对落后于基线分支的进行变基,催促停滞的——并把需要人来决策的事项上报。"},"pr-watch-loop":{"name":"PR 监视循环","description":"以稳定节奏轮询监视列表中的 PR,汇总各自的 CI 与评审健康度,要么顺手解决琐碎的阻塞项,要么标记出需要负责人处理的事项。"},"pr-self-review":{"name":"PR 自审","description":"像挑剔的资深评审者那样审视自己的工作改动,逐一修复发现的问题,反复自审直到一遍下来再无关键问题——赶在 PR 离手之前。"},"spec-first-ship":{"name":"规格优先交付","description":"逐项推进一份书面需求清单直至全部完成——每一遍只实现一条未勾选的需求、验证它、再打勾——让规格成为「完成」的契约。"},"dependency-audit-weekly":{"name":"每周依赖审计","description":"每周盘点哪些依赖包已落后,将其分为可安全升级与有风险两类,并交还一份你可直接执行的清晰升级计划。"},"dependency-upgrade-one-by-one":{"name":"逐个升级依赖","description":"每一遍只升级一个过时的依赖包,修好升级带来的破坏,证明项目仍可正常运行后再提交——远比一次性全部升级更安全。"},"knip-until-clean":{"name":"清除死代码直到干净","description":"揪出无人引用的导出、孤立文件和没人导入的依赖,安全地移除它们,持续进行直到死代码扫描工具再无可报告的内容。"},"docs-sync-after-edits":{"name":"文档同步代码改动","description":"在一轮代码改动之后,找出每一份被改动波及的文档——README、API 参考、内联注释——让它们与代码现在的实际行为重新对齐。"},"security-audit-weekly":{"name":"每周安全审计","description":"每周对依赖树运行一次漏洞扫描,按严重程度和真实暴露面对结果分诊,并交还一份按优先级排序的修复计划。"},"npm-audit-fix-loop":{"name":"逐个修补漏洞","description":"有条不紊地清除高危和严重的依赖告警——每一遍只修一个,并用测试套件逐一验证——而非可能悄悄弄坏构建的盲目强制修复。"},"api-contract-until-match":{"name":"API 契约直到匹配","description":"推动实现直到其响应符合已发布的 API 契约,弥合 schema 承诺与处理函数实际返回之间的任何差距。"},"openapi-sync-until-valid":{"name":"OpenAPI 同步直到有效","description":"保持 OpenAPI 文档格式良好且忠实于真实的路由处理函数,每一遍修复规格错误和代码与文档的偏差,直到 lint 工具满意为止。"},"migration-until-applied":{"name":"迁移直到生效","description":"干净地推进数据库 schema:运行待执行的迁移,修复其暴露出的任何 schema 或 SQL 错误,并确认迁移历史保持一致。"},"bundle-size-budget":{"name":"打包体积预算","description":"在不让客户端打包体积超出预算的前提下交付功能——每一遍测量并精简、代码拆分或懒加载,直到体积关卡通过。"},"changelog-sync-after-ship":{"name":"交付后同步变更日志","description":"交付后确保变更日志讲清面向用户的来龙去脉:回顾落地的内容,按 Keep a Changelog 规范撰写条目,并确认没有遗漏任何可见变更。"},"guardrails-learning-loop":{"name":"护栏学习循环","description":"持续迭代直到各项关卡通过,但每当某项检查以同样的方式失败两次,先记下一条护栏笔记,让循环不再浪费迭代去重试一个已经失败的方案。"},"ralph-story-executor":{"name":"待办故事执行器","description":"以每遍全新上下文逐个处理用户故事待办:挑出下一个未完成的故事,只构建它,证明项目各项关卡保持通过,提交并标记完成,再继续下一个。"},"investigation-script-loop":{"name":"探查脚本循环","description":"凭实证锁定 bug 的真正根因:写一个一次性的小脚本来触发可疑行为,运行它、读取真实输出,并不断打磨探针,直到输出本身证明根因所在。"},"reflexion-debug-loop":{"name":"反思调试循环","description":"不靠瞎试就让失败的测试变绿:每次尝试失败时把一段简短反思写入磁盘,并在下次尝试前查阅它,让循环不再重复已被排除的修法。"},"merge-conflict-resolver":{"name":"合并冲突解决器","description":"通过变基把分支更新到与目标一致,然后逐个文件解决每处冲突、保留双方意图,并在宣布分支已同步前证明结果仍然通过。"},"staging-smoke-test":{"name":"预发布 Smoke Test","description":"在预发布部署后,走一遍固定的 smoke test 清单——认证、核心用户路径和关键集成——每次出问题就修复最小的那个并重跑,直到整份清单全部通过。"},"deploy-verification-loop":{"name":"部署验证循环","description":"部署上线后,按间隔轮询健康检查和 smoke test 端点,对任何非健康响应进行排查、修复或上报,并持续检查直到每个配置的端点都报告成功。"},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"从 ticket 到归档的 OpenSpec 生命周期: 生成工件 (opsx:ff) → 实现 (opsx:apply) → 验证 (opsx:verify); FAIL 则回环修正同一 change, PASS 则无人值守归档。"}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`已导入 {{count}} 个循环`,done_other:`已导入 {{count}} 个循环`,skipped_one:`已跳过 {{count}} 个重复项:{{names}}`,skipped_other:`已跳过 {{count}} 个重复项:{{names}}`,invalid:`该文件不是有效的循环导出。`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
1
+ var e=`Loops`,t=`可复用的自动化循环——在你所有项目间共享。`,n=`新建循环`,r={drafts:`草稿`,published:`已发布`,templates:`模板`,builtIn:`内置`},i={search:`搜索模板…`,noResults:`没有模板符合筛选条件。`,clearFilter:`清除筛选`,resultCount_one:`{{count}} 个模板`,resultCount_other:`{{count}} 个模板`,needsSpec:`需要规格`,standalone:`独立运行`,needsSpecHint:`在 rail 上运行,需拖入一个规格`,standaloneHint:`独立运行——只需选择一个项目`},a={API:`API`,Automation:`自动化`,CI:`CI`,Database:`数据库`,Debugging:`调试`,DevOps:`DevOps`,Docs:`文档`,Git:`Git`,Maintenance:`维护`,Performance:`性能`,Planning:`规划`,Quality:`质量`,Review:`评审`,Security:`安全`,Testing:`测试`},o={draft:`草稿`,published:`已发布`,running:`运行中`},s={title:`暂无循环`,body:`从零创建一个,或从模板开始。`},c={edit:`编辑`,delete:`删除`,publish:`发布`,unpublish:`取消发布`,duplicate:`复制`,use:`使用模板`,preview:`预览`,fork:`复刻以编辑`,run:`运行`,export:`导出`,import:`导入`,select:`选择 {{name}}`},l={nodes_one:`{{count}} 个节点`,nodes_other:`{{count}} 个节点`,usedIn:`使用中 · {{project}}`},u=`删除此循环?它将从所有 rail 选择器中消失。`,d=`新建循环`,f={load:`加载循环失败`,save:`保存循环失败`,publishInvalid:`此循环暂时无法发布——请修复高亮显示的问题。`},p={back:`返回循环列表`,save:`保存`,saved:`循环已保存`,publish:`发布`,published:`循环已发布`,addNode:`添加节点`,deleteNode:`删除节点`,config:{maxIterations:`最大迭代次数`,timeout:`超时(分钟)`,maxIterationsHint:`Loop Decider 迭代次数上限——达到后即使目标未达成也会停止循环。防止无限循环。`,timeoutHint:`整个运行的实际时间上限(分钟)。超过后运行将停止并标记为失败——与最大迭代次数一起作为安全网。`,maxCost:`最大费用 ($)`,maxCostHint:`整个运行的可选美元预算。在步骤之间检查(每步费用只有在该步结束后才知道),因此当总额超过时循环会在下一步之前停止——可能超出一步。非 Claude 提供方的费用为估算。留空 = 不限制。`},nodes:{start:`开始`,"ai-step":`AI 步骤`,shell:`Shell`,decider:`循环决策器`,condition:`条件`,end:`结束`},inspector:{selectNode:`选择一个节点进行编辑。`,prompt:`提示词`,provider:`提供方`,model:`模型`,effort:`推理强度`,command:`命令`,goal:`目标 / 停止条件`,join:`合并`,outcome:`结果`,startNote:`循环的入口点。将其连接到第一个步骤。`,promptHint:`点击或拖动令牌将其插入提示词。`,tokensSpec:`Spec 字段`,tokensJira:`Jira`,tokensCommands:`命令`,label:`名称`},branch:{continue:`↻ 继续`,stop:`✓ 停止`},edgesHelp:{label:`步骤如何连接`,body:`箭头设定的是运行顺序,而非数据——节点没有输入端口,连线也不携带任何参数。每个 AI Step 都会自动恢复其会话(完整的先前上下文),并附带前序步骤的简短摘要;无需手动连线。Loop Decider 有两个输出:↻ 继续(目标未达成 → 循环返回)和 ✓ 停止(目标达成 → 退出)。`},arrange:{label:`排列`,vertical:`垂直`,horizontal:`水平`,grid:`网格`,reset:`重置`},constants:{label:`常量`,manage:`管理常量`,title:`循环常量`,empty:`还没有自定义常量。`,name:`名称`,value:`值`,add:`添加`,builtinBadge:`内置`},paste:{done_one:`已粘贴 {{count}} 个步骤`,done_other:`已粘贴 {{count}} 个步骤`},problems:{count_one:`{{count}} 个问题`,count_other:`{{count}} 个问题`,NO_START:`添加一个开始节点。`,MULTIPLE_START:`只允许一个开始节点。`,NO_END:`至少添加一个结束节点。`,ORPHAN:`该步骤无法从开始到达。`,DECIDER_BRANCHES:`Loop Decider 需要一个继续分支和一个停止分支。`,EMPTY_PROMPT:`AI 步骤的提示词为空。`,EMPTY_COMMAND:`Shell 步骤的命令为空。`,EMPTY_GOAL:`Loop Decider 没有目标。`,DEAD_END:`该步骤没有出向连接。`},preview:{label:`预览`,title:`试运行预览`,sampleNote:`Spec 值为示例数据;命令和常量按运行时的实际值解析。`,empty:`没有可预览的步骤。`,error:`预览失败`}},m={steps:`步骤`,limits:`最多 {{iterations}} 次迭代 · {{timeout}} 分钟超时`,openInBuilder:`在构建器中打开`,builtin:`内置`},h=`内置`,g={title:`运行 {{name}}`,subtitle:`在某个项目上启动此循环(无需工单)。`,project:`项目`,provider:`提供方`,model:`模型`,effort:`推理强度`,execute:`执行`,noProjects:`没有可用的项目。`,launched:`正在运行 {{name}}`},_=JSON.parse(`{"ship-and-green":{"name":"交付并通过","description":"全自动:实现 spec、验证,失败时自动修正(fix)——循环执行 验证 → 修复 → 验证,直到全部通过。无需人工干预。"},"verify-pass":{"name":"验证通过","description":"自动验证并修复:检测并运行项目的 build/lint/测试,失败时自动修正——验证 → 修复 → 验证,直到全部通过。"},"ci-watch":{"name":"CI 监视","description":"轮询当前已打开 PR 的 CI 检查(由 agent 使用仓库的 CI 工具),直到每一项检查都通过。"},"lint-and-fix":{"name":"Lint 修复","description":"agent 检测并运行项目的 linter,修复每一个问题,持续迭代直到代码库干净无误。"},"type-safe":{"name":"类型安全","description":"agent 检测并运行项目的类型检查器,解决每一个错误,持续迭代直到顺利通过。"},"coverage-climb":{"name":"覆盖率提升","description":"agent 运行项目的覆盖率工具并补充针对性测试,直到达到阈值。"},"build-fix":{"name":"构建修复","description":"agent 检测并运行项目的生产 build,修复编译/打包错误,直到顺利通过。"},"deploy-check":{"name":"部署检查","description":"agent 轮询部署/健康状态(使用项目的 deploy 工具),直到服务报告健康。"},"factory_implement":{"name":"实现","description":"全自动:实现 spec、验证,失败时自动修正(fix)——循环直到所有测试通过。"},"factory_batch":{"name":"批量实现","description":"一次性批量实现该 rail 的全部工单,然后验证 + 失败时修正,直到全部通过。"},"factory_freestyle":{"name":"Freestyle","description":"将 spec 直接交给模型, 给予完全自由 — 无管线, 像普通编码智能体一样工作, 然后验证+改进直到全部通过。仅限 Claude。"},"autoloop-tdd":{"name":"自动循环 TDD","description":"针对 {{spec.title}} 严格执行红-绿-重构循环:先用失败的测试锁定每个行为,再写刚好够让它变绿的代码,然后整理代码——如此反复,直到完整覆盖该规格。"},"e2e-until-green":{"name":"E2E 直到通过","description":"运行 {{spec.title}} 的 E2E 测试套件,逐一诊断失败的用户流程,修复底层的 UI 或集成缺陷,持续循环直到每条 E2E 用例都通过。"},"flaky-test-triage":{"name":"不稳定测试分诊","description":"多次重跑 {{spec.title}} 相关的失败测试,区分真正的回归与偶发的不稳定,然后修复真正的故障,并稳定或记录那些不稳定的用例。"},"independent-verifier-pass":{"name":"独立验证一遍","description":"对 {{spec.title}} 做对抗式验证:从零重新运行构建、lint 和测试,只信任命令的原始输出(不信任此前任何「能用」的说法),并暴露或修复每个缺口。"},"post-edit-test-guard":{"name":"改后测试守卫","description":"针对 {{spec.title}} 每改完一批代码,立刻运行覆盖改动文件的最小测试集——在回归出现的当下就捕获,而非拖到最后。"},"post-merge-regression-guard":{"name":"合并后回归守卫","description":"在合并或变基把他人的工作引入 {{spec.title}} 后,立即运行快速 smoke test 套件以第一时间发现集成破坏——在新功能开发动工之前。"},"pre-commit-guard":{"name":"提交前守卫","description":"为 {{spec.title}} 把守每次提交:先运行测试套件,只要测试为红就拒绝提交,让坏代码永远进不了历史记录。"},"visual-regression-until-match":{"name":"视觉回归直到匹配","description":"对改动的 UI 截取视觉快照,揪出每一处非预期的像素差异并自我修正,直到视觉套件全部通过、且只保留经审批的有意设计变更。"},"format-until-clean":{"name":"格式化直到干净","description":"运行项目格式化工具,手动收拾它无法自动修复的少量风格问题,持续进行直到再次格式化不再改动工作区。"},"lint-typecheck-fix":{"name":"Lint 与类型检查修复","description":"运行 lint 工具和类型检查器,以尽可能小的改动逐一解决每个报告的问题,循环直到两道关卡都彻底通过。"},"a11y-audit-until-clean":{"name":"无障碍审计直到干净","description":"对改动的页面运行自动化无障碍检查,按类别逐项修复违规,反复进行直到审计返回零问题。"},"de-sloppify-pass":{"name":"清理杂乱一遍","description":"功能落地后,把改动从头扫一遍清除残留杂乱——调试输出、死分支、随意命名、臃肿函数——清理干净,并证明清理没有破坏任何东西。"},"fix-ci-until-green":{"name":"修复 CI 直到通过","description":"拉取本分支最近一次失败的 CI 运行,在本地复现故障,修复真正的根因并推送,持续循环直到每项检查都报告成功。"},"pr-babysitter":{"name":"PR 看护","description":"按固定间隔巡查你关注的开放 PR,让每个都保持可合并状态:救活失败的 CI,对落后于基线分支的进行变基,催促停滞的——并把需要人来决策的事项上报。"},"pr-watch-loop":{"name":"PR 监视循环","description":"以稳定节奏轮询监视列表中的 PR,汇总各自的 CI 与评审健康度,要么顺手解决琐碎的阻塞项,要么标记出需要负责人处理的事项。"},"pr-self-review":{"name":"PR 自审","description":"像挑剔的资深评审者那样审视自己的工作改动,逐一修复发现的问题,反复自审直到一遍下来再无关键问题——赶在 PR 离手之前。"},"spec-first-ship":{"name":"规格优先交付","description":"逐项推进一份书面需求清单直至全部完成——每一遍只实现一条未勾选的需求、验证它、再打勾——让规格成为「完成」的契约。"},"dependency-audit-weekly":{"name":"每周依赖审计","description":"每周盘点哪些依赖包已落后,将其分为可安全升级与有风险两类,并交还一份你可直接执行的清晰升级计划。"},"dependency-upgrade-one-by-one":{"name":"逐个升级依赖","description":"每一遍只升级一个过时的依赖包,修好升级带来的破坏,证明项目仍可正常运行后再提交——远比一次性全部升级更安全。"},"knip-until-clean":{"name":"清除死代码直到干净","description":"揪出无人引用的导出、孤立文件和没人导入的依赖,安全地移除它们,持续进行直到死代码扫描工具再无可报告的内容。"},"docs-sync-after-edits":{"name":"文档同步代码改动","description":"在一轮代码改动之后,找出每一份被改动波及的文档——README、API 参考、内联注释——让它们与代码现在的实际行为重新对齐。"},"security-audit-weekly":{"name":"每周安全审计","description":"每周对依赖树运行一次漏洞扫描,按严重程度和真实暴露面对结果分诊,并交还一份按优先级排序的修复计划。"},"npm-audit-fix-loop":{"name":"逐个修补漏洞","description":"有条不紊地清除高危和严重的依赖告警——每一遍只修一个,并用测试套件逐一验证——而非可能悄悄弄坏构建的盲目强制修复。"},"api-contract-until-match":{"name":"API 契约直到匹配","description":"推动实现直到其响应符合已发布的 API 契约,弥合 schema 承诺与处理函数实际返回之间的任何差距。"},"openapi-sync-until-valid":{"name":"OpenAPI 同步直到有效","description":"保持 OpenAPI 文档格式良好且忠实于真实的路由处理函数,每一遍修复规格错误和代码与文档的偏差,直到 lint 工具满意为止。"},"migration-until-applied":{"name":"迁移直到生效","description":"干净地推进数据库 schema:运行待执行的迁移,修复其暴露出的任何 schema 或 SQL 错误,并确认迁移历史保持一致。"},"bundle-size-budget":{"name":"打包体积预算","description":"在不让客户端打包体积超出预算的前提下交付功能——每一遍测量并精简、代码拆分或懒加载,直到体积关卡通过。"},"changelog-sync-after-ship":{"name":"交付后同步变更日志","description":"交付后确保变更日志讲清面向用户的来龙去脉:回顾落地的内容,按 Keep a Changelog 规范撰写条目,并确认没有遗漏任何可见变更。"},"guardrails-learning-loop":{"name":"护栏学习循环","description":"持续迭代直到各项关卡通过,但每当某项检查以同样的方式失败两次,先记下一条护栏笔记,让循环不再浪费迭代去重试一个已经失败的方案。"},"ralph-story-executor":{"name":"待办故事执行器","description":"以每遍全新上下文逐个处理用户故事待办:挑出下一个未完成的故事,只构建它,证明项目各项关卡保持通过,提交并标记完成,再继续下一个。"},"investigation-script-loop":{"name":"探查脚本循环","description":"凭实证锁定 bug 的真正根因:写一个一次性的小脚本来触发可疑行为,运行它、读取真实输出,并不断打磨探针,直到输出本身证明根因所在。"},"reflexion-debug-loop":{"name":"反思调试循环","description":"不靠瞎试就让失败的测试变绿:每次尝试失败时把一段简短反思写入磁盘,并在下次尝试前查阅它,让循环不再重复已被排除的修法。"},"merge-conflict-resolver":{"name":"合并冲突解决器","description":"通过变基把分支更新到与目标一致,然后逐个文件解决每处冲突、保留双方意图,并在宣布分支已同步前证明结果仍然通过。"},"staging-smoke-test":{"name":"预发布 Smoke Test","description":"在预发布部署后,走一遍固定的 smoke test 清单——认证、核心用户路径和关键集成——每次出问题就修复最小的那个并重跑,直到整份清单全部通过。"},"deploy-verification-loop":{"name":"部署验证循环","description":"部署上线后,按间隔轮询健康检查和 smoke test 端点,对任何非健康响应进行排查、修复或上报,并持续检查直到每个配置的端点都报告成功。"},"factory_openspec":{"name":"OpenSpec Lifecycle","description":"从 ticket 到归档的 OpenSpec 生命周期: 生成工件 (opsx:ff) → 实现 (opsx:apply) → 验证 (opsx:verify); FAIL 则回环修正同一 change, PASS 则无人值守归档。"}}`),v={title:e,subtitle:t,newLoop:n,sections:r,gallery:i,categories:a,status:o,empty:s,actions:c,card:l,confirmDelete:u,newLoopName:d,errors:f,builder:p,preview:m,builtInBadge:h,run:g,catalog:_,import:{done_one:`已导入 {{count}} 个循环`,done_other:`已导入 {{count}} 个循环`,skipped_one:`已跳过 {{count}} 个重复项:{{names}}`,skipped_other:`已跳过 {{count}} 个重复项:{{names}}`,invalid:`该文件不是有效的循环导出。`}};export{c as actions,p as builder,h as builtInBadge,l as card,_ as catalog,a as categories,u as confirmDelete,v as default,s as empty,f as errors,i as gallery,n as newLoop,d as newLoopName,m as preview,g as run,r as sections,o as status,t as subtitle,e as title};
@@ -1 +1 @@
1
- var e={title:`言語`,description:`Desktop 全体の UI 言語。即座に適用され、再起動は不要です。`,selectLabel:`インターフェース言語`,updateFailed:`言語設定を保存できませんでした`},t={title:`プロジェクト設定`},n={saveFailed:`保存に失敗しました: {{message}}`},r={title:`パイプラインテレメトリ`,description:`診断エクスポート用にトークン使用量、フェーズ時間、サブエージェントの活動を記録します。デフォルトはオフです。`,toggleLabel:`パイプラインテレメトリを有効化`,toggleDescription:`オンにすると、パイプラインジョブの OTEL データがローカルに記録されます。ジョブカードの <mono>診断をエクスポート</mono> ボタンからダウンロードできます。`,enabled:`パイプラインテレメトリを有効にしました`,disabled:`パイプラインテレメトリを無効にしました`,saveFailed:`テレメトリ設定の保存に失敗しました`},i={title:`レールのプレプロンプト`,description:`implement と batch-implement のレールジョブで、チケットコンテキストの後・実行前に追加されるプロジェクト固有の指示です。`,label:`プレプロンプト`,placeholder:`例: 段階的な変更を優先し、マイグレーションの後方互換性を保ち、レールの変更ごとにテストを追加すること。`,helper:`すべてのレール実装の実行に常に添えたい、安定したプロジェクト指針に使用してください。`,saveButton:`プレプロンプトを保存`,cleared:`プレプロンプトをクリアしました`,saved:`プレプロンプトを保存しました`,saveFailed:`プレプロンプトの保存に失敗しました`},a={title:`Freestyle プレプロンプト`,description:`Freestyle(Claude 専用レール)で Claude に送られる指示です。Freestyle は OpenSpec パイプラインをスキップし、このプレプロンプトとスペックテキストを Claude に渡して自律的に実装させます。空欄の場合は組み込みのデフォルトを使用します。`,label:`Freestyle プレプロンプト`,placeholder:`空欄の場合はデフォルトの Freestyle 指示を使用します。`,helper:`スペックテキストはこのプレプロンプトの後に自動で追加されます。空欄 = デフォルト。`,saveButton:`Freestyle プレプロンプトを保存`,resetToDefault:`Freestyle プレプロンプトをデフォルトにリセットしました`,saved:`Freestyle プレプロンプトを保存しました`,saveFailed:`Freestyle プレプロンプトの保存に失敗しました`},o={title:`予算`,description:`このプロジェクトの1日あたりの支出上限を設定します。上限に達するとキューは自動で一時停止します。`,dailyLabel:`日次予算(USD)`,dailyHelper:`無効にするには空欄のままにします。支出は過去24時間で計算されます。`,dailyPlaceholder:`例: 5.00`,perJobLabel:`ジョブ単位のコストアラート(USD)`,perJobHelper:`このプロジェクトの単一ジョブがこの金額を超えたときにアラートします。`,perJobPlaceholder:`例: 0.50`,invalidNumber:`正の数値を入力するか、無効にするには空欄のままにしてください`,dailyRemoved:`日次予算を削除しました`,dailySet:"日次予算を ${{amount}} に設定しました",perJobAlertDisabled:`ジョブ単位のコストアラートを無効にしました`,alertSet:"${{amount}} を超えるジョブにアラートを設定しました",saveBudgetFailed:`予算の保存に失敗しました`,saveThresholdFailed:`しきい値の保存に失敗しました`},s={nav:{appearance:`外観`,code:`コード`,terminal:`ターミナル`,updates:`更新`,mobile:`モバイル`,mcp:`MCP`,projects:`プロジェクト`,advanced:`詳細`,webhooks:`Webhooks`,about:`概要`},title:`Desktop 設定`,description:`登録済みプロジェクトの管理と Desktop 情報の表示。`,registeredProjects:`登録済みプロジェクト`,noProjects:`登録されたプロジェクトはまだありません`,techUrlDescription:`specrails-tech API のベース URL(デフォルト: http://localhost:3000)`,techUrlSaved:`specrails-tech の URL を保存しました`,techUrlSaveFailed:`URL の保存に失敗しました`,budgetAlertsHeading:`予算とアラート`,dailyBudgetLabel:`Desktop 日次予算(USD)`,dailyBudgetHelper:`全プロジェクト共通のグローバルな日次支出上限。超過するとキューは自動で一時停止します。`,dailyBudgetPlaceholder:`例: 10.00`,perJobHelper:`単一ジョブがこの金額を超えたときにアラートします。無効にするには空欄のままにします。`,costAlertsDisabled:`コストアラートを無効にしました`,dailyBudgetRemoved:`Desktop の日次予算を削除しました`,dailyBudgetSet:"Desktop の日次予算を ${{amount}} に設定しました",dailyBudgetSaveFailed:`Desktop の日次予算の保存に失敗しました`,projectRemoved:`プロジェクトを削除しました`,projectRemoveFailed:`プロジェクトの削除に失敗しました`,onboardingHeading:`オンボーディング`,platformTour:`プラットフォームツアー`,platformTourDescription:`ウェルカムウィザードを再生して主要機能を確認します。`,replayTour:`ツアーを再生`,terminalPanelHeading:`ターミナルパネル`,infoHeading:`Desktop 情報`,infoPort:`ポート`,infoProjects:`プロジェクト`,infoDb:`Desktop DB`},c={heading:`OS 通知`,description:`ジョブの完了・失敗時にネイティブのデスクトップ通知を表示します。通知はタブがフォーカスされていないときのみ表示されます。`,enableLabel:`OS 通知を有効化`,notifyOn:`通知の対象:`,filterAll:`すべて(完了と失敗)`,filterCompleted:`完了のみ`,filterFailed:`失敗のみ`,enabledToast:`OS 通知を有効にしました`,disabledToast:`OS 通知を無効にしました`},l={heading:`アウトバウンド Webhook`,description:`Desktop のイベントを外部ツール(Slack、Zapier、CI/CD)に通知します。シークレットが設定されている場合、リクエストは <code>X-Specrails-Signature</code> で署名されます。`,eventJobCompleted:`ジョブ完了`,eventJobFailed:`ジョブ失敗`,eventDailyBudgetExceeded:`日次予算超過`,statusOn:`オン`,statusOff:`オフ`,disable:`無効化`,enable:`有効化`,sendTestPing:`テスト ping を送信`,addHeading:`Webhook を追加`,secretPlaceholder:`署名シークレット(任意)`,addButton:`Webhook を追加`,urlRequired:`URL は必須です`,selectEvent:`イベントを1つ以上選択してください`,added:`Webhook を追加しました`,addFailed:`Webhook の追加に失敗しました`,updateFailed:`Webhook の更新に失敗しました`,removed:`Webhook を削除しました`,removeFailed:`Webhook の削除に失敗しました`,testPingSent:`テスト ping を送信しました`,testPingFailed:`テスト ping の送信に失敗しました`},u={title:`ターミナルパネル`,desktopDescription:`プロジェクト別のオーバーライドがない限り、すべてのプロジェクトに適用される Desktop 全体のデフォルトです。`,projectDescription:`ターミナルパネルのプロジェクト別オーバーライド。Desktop のデフォルトを継承するには、フィールドを変更しないでください。`,fontFamily:`フォントファミリー`,fontSize:`フォントサイズ({{min}}–{{max}})`,renderMode:`レンダリングモード`,copyOnSelect:`選択時にコピー`,shellIntegration:`シェル統合(OSC 133 マーク)`,notifyLongRunning:`長時間実行コマンドの通知`,longCommandThreshold:`長時間コマンドのしきい値(ms)`,imageRendering:`インライン画像レンダリング(Sixel + iTerm2)`,browserShortcutUrl:`ブラウザショートカット URL`,quickScript:`クイックスクリプト(アクティブなターミナルに貼り付け — Enter は手動)`,reset:`リセット`,unsavedChanges:`未保存の変更`,clearOverride:`オーバーライドをクリア`,clear:`クリア`,inheritingDefault:`Desktop のデフォルトを継承中`,nothingToSave:`保存する変更はありません`,saved:`ターミナル設定を保存しました`},d={heading:`Code セクション`,summaryLanguage:`要約の言語`,monthlyBudget:`月次予算(USD)`,budgetHelper:"暦月ごとの `surface=file-summary` 支出の上限。ユーザーが開始した再生成は上限を超えられます。"},f={taglines:{dracula:`オリジナル — 紫がかったダークにネオンのアクセント`,"aurora-light":`プレミアムライト — Linear風のインディゴと温かみのあるオフホワイト`,"obsidian-dark":`プレミアムダーク — 青みがかった漆黒にエレクトリックなアクセント`,matrix:`蛍光ターミナル — 緑がかった漆黒にソフトミント`,specrails:`ブランドテーマ — 深いネイビーインディゴに鮮やかなシアン`},heading:`外観`,themeGroupLabel:`テーマ`,currentlyActive:`現在アクティブ`,updateFailed:`テーマの更新に失敗しました`},p={heading:`モバイルコンパニオン`,description:`スマートフォンの SpecRails Companion アプリから Specrails を操作します。通信は 100% ローカルネットワーク経由です。デフォルトはオフです。`,accessOn:`モバイルアクセス オン`,accessOff:`モバイルアクセス オフ`,listeningOnPort:`ポート {{port}} で待機中`,notListening:`待機していません`,turnOn:`オンにする`,turnOff:`オフにする`,pairWebDevice:`Web コンパニオンをペアリング`,reset:`リセット`,resetConfirm:`モバイル ID をリセットしますか?ペアリング済みのすべてのデバイスが無効化され、再ペアリングが必要になります。`,identityReset:`モバイル ID をリセットしました`,enableFailed:`モバイルアクセスを有効にできませんでした: {{message}}`,disableFailed:`モバイルアクセスを無効にできませんでした: {{message}}`,windowsFirewall:`初回有効化時に Windows ファイアウォールが SpecRails サーバーの許可を求めます — 「プライベートネットワークで許可」を選択してください。`,pairedDevices:`ペアリング済みデバイス`,noDevices:`ペアリングされたデバイスはまだありません。`,revokeDevice:`{{name}} を無効化`},m={title:`Web コンパニオンをペアリング`,description:`スマートフォンで specrails.dev/companion-app を開き、それでこのコードをスキャンしてください。`,startFailed:`ペアリングを開始できませんでした: {{error}}`,showThenScan:`スマートフォンでこれをスキャンしたら、「スマートフォンのコードをスキャン」をタップし、カメラをスマートフォンに向けてください。`,scanAnswer:`スマートフォンのコードをスキャン`,scanning:`カメラをスマートフォンのコードに向けてください…`,cameraFailed:`カメラを利用できません: {{message}}`,notAnswer:`その QR はペアリング応答ではありません。`,connecting:`接続中…`,paired:`✓ ペアリング済み`,pairedToast:`Web コンパニオンをペアリングしました`,answerRejected:`デスクトップがそのコードを拒否しました。新しいコードを生成して再試行してください。`,copyCode:`コードをコピー`,codeCopied:`コードをコピーしました`,cancel:`キャンセル`},h={heading:`Specrails Core`,installed:`インストール済み:`,updateAvailable:`アップデートあり: {{version}}`,upToDate:`最新です`,neverChecked:`未確認`,check:`アップデートを確認`,checking:`確認中…`,update:`{{version}} に更新`,downloading:`ダウンロード中…`,materializing:`インストール中…`,affectsAll:`すべてのプロジェクトに適用 — 再起動不要。`,unavailable:`このビルドではコアの更新は利用できません。`,toastDone:`Specrails Core を {{version}} に更新しました`,toastError:`コアの更新に失敗しました: {{message}}`,toastUpToDate:`Specrails Core は最新です`,toastCheckFailed:`更新の確認に失敗しました: {{message}}`},g={heading:`Specrails Desktop`,installed:`インストール済み:`,check:`アップデートを確認`,checking:`確認中…`,upToDate:`最新バージョンです`,updateAvailable:`アップデートあり: {{version}}`,autoHint:`起動時と6時間ごとに自動確認します。`,unavailable:`アップデートはデスクトップアプリでのみ利用できます。`,toastUpToDate:`Specrails Desktop は最新です`,toastCheckFailed:`アップデートの確認に失敗しました: {{message}}`},_={title:`{{name}} — 設定`,description:`プロジェクト設定:プロンプト、予算、テレメトリ、ターミナル。`,nav:{general:`一般`,budget:`予算`,telemetry:`テレメトリ`,terminal:`ターミナル`}},v={title:`統合ブランチ`,description:`並列レールが分岐し、ドラフト PR の対象となるブランチです。空欄にするとリポジトリのデフォルトブランチに自動解決されます。`,placeholder:`自動(リポジトリのデフォルト)`,resolved:`レールは <mono>{{branch}}</mono> から分岐します`,save:`ブランチを保存`,saved:`統合ブランチを保存しました`,saveFailed:`統合ブランチを保存できませんでした`},y={language:e,page:t,errors:n,telemetry:r,prePrompt:i,ultraPrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,y as default,s as desktop,n as errors,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,r as telemetry,u as terminal,a as ultraPrePrompt,l as webhooks};
1
+ var e={title:`言語`,description:`Desktop 全体の UI 言語。即座に適用され、再起動は不要です。`,selectLabel:`インターフェース言語`,updateFailed:`言語設定を保存できませんでした`},t={title:`プロジェクト設定`},n={saveFailed:`保存に失敗しました: {{message}}`},r={title:`パイプラインテレメトリ`,description:`診断エクスポート用にトークン使用量、フェーズ時間、サブエージェントの活動を記録します。デフォルトはオフです。`,toggleLabel:`パイプラインテレメトリを有効化`,toggleDescription:`オンにすると、パイプラインジョブの OTEL データがローカルに記録されます。ジョブカードの <mono>診断をエクスポート</mono> ボタンからダウンロードできます。`,enabled:`パイプラインテレメトリを有効にしました`,disabled:`パイプラインテレメトリを無効にしました`,saveFailed:`テレメトリ設定の保存に失敗しました`},i={title:`レールのプレプロンプト`,description:`implement と batch-implement のレールジョブで、チケットコンテキストの後・実行前に追加されるプロジェクト固有の指示です。`,label:`プレプロンプト`,placeholder:`例: 段階的な変更を優先し、マイグレーションの後方互換性を保ち、レールの変更ごとにテストを追加すること。`,helper:`すべてのレール実装の実行に常に添えたい、安定したプロジェクト指針に使用してください。`,saveButton:`プレプロンプトを保存`,cleared:`プレプロンプトをクリアしました`,saved:`プレプロンプトを保存しました`,saveFailed:`プレプロンプトの保存に失敗しました`},a={title:`Freestyle プレプロンプト`,description:`Freestyle(Claude 専用レール)で Claude に送られる指示です。Freestyle は OpenSpec パイプラインをスキップし、このプレプロンプトとスペックテキストを Claude に渡して自律的に実装させます。空欄の場合は組み込みのデフォルトを使用します。`,label:`Freestyle プレプロンプト`,placeholder:`空欄の場合はデフォルトの Freestyle 指示を使用します。`,helper:`スペックテキストはこのプレプロンプトの後に自動で追加されます。空欄 = デフォルト。`,saveButton:`Freestyle プレプロンプトを保存`,resetToDefault:`Freestyle プレプロンプトをデフォルトにリセットしました`,saved:`Freestyle プレプロンプトを保存しました`,saveFailed:`Freestyle プレプロンプトの保存に失敗しました`},o={title:`予算`,description:`このプロジェクトの1日あたりの支出上限を設定します。上限に達するとキューは自動で一時停止します。`,dailyLabel:`日次予算(USD)`,dailyHelper:`無効にするには空欄のままにします。支出は過去24時間で計算されます。`,dailyPlaceholder:`例: 5.00`,perJobLabel:`ジョブ単位のコストアラート(USD)`,perJobHelper:`このプロジェクトの単一ジョブがこの金額を超えたときにアラートします。`,perJobPlaceholder:`例: 0.50`,invalidNumber:`正の数値を入力するか、無効にするには空欄のままにしてください`,dailyRemoved:`日次予算を削除しました`,dailySet:"日次予算を ${{amount}} に設定しました",perJobAlertDisabled:`ジョブ単位のコストアラートを無効にしました`,alertSet:"${{amount}} を超えるジョブにアラートを設定しました",saveBudgetFailed:`予算の保存に失敗しました`,saveThresholdFailed:`しきい値の保存に失敗しました`},s={nav:{appearance:`外観`,code:`コード`,terminal:`ターミナル`,updates:`更新`,mobile:`モバイル`,mcp:`MCP`,projects:`プロジェクト`,advanced:`詳細`,webhooks:`Webhooks`,about:`概要`},title:`Desktop 設定`,description:`登録済みプロジェクトの管理と Desktop 情報の表示。`,registeredProjects:`登録済みプロジェクト`,noProjects:`登録されたプロジェクトはまだありません`,techUrlDescription:`specrails-tech API のベース URL(デフォルト: http://localhost:3000)`,techUrlSaved:`specrails-tech の URL を保存しました`,techUrlSaveFailed:`URL の保存に失敗しました`,budgetAlertsHeading:`予算とアラート`,dailyBudgetLabel:`Desktop 日次予算(USD)`,dailyBudgetHelper:`全プロジェクト共通のグローバルな日次支出上限。超過するとキューは自動で一時停止します。`,dailyBudgetPlaceholder:`例: 10.00`,perJobHelper:`単一ジョブがこの金額を超えたときにアラートします。無効にするには空欄のままにします。`,costAlertsDisabled:`コストアラートを無効にしました`,dailyBudgetRemoved:`Desktop の日次予算を削除しました`,dailyBudgetSet:"Desktop の日次予算を ${{amount}} に設定しました",dailyBudgetSaveFailed:`Desktop の日次予算の保存に失敗しました`,projectRemoved:`プロジェクトを削除しました`,projectRemoveFailed:`プロジェクトの削除に失敗しました`,onboardingHeading:`オンボーディング`,platformTour:`プラットフォームツアー`,platformTourDescription:`ウェルカムウィザードを再生して主要機能を確認します。`,replayTour:`ツアーを再生`,terminalPanelHeading:`ターミナルパネル`,infoHeading:`Desktop 情報`,infoPort:`ポート`,infoProjects:`プロジェクト`,infoDb:`Desktop DB`},c={heading:`OS 通知`,description:`ジョブの完了・失敗時にネイティブのデスクトップ通知を表示します。通知はタブがフォーカスされていないときのみ表示されます。`,enableLabel:`OS 通知を有効化`,notifyOn:`通知の対象:`,filterAll:`すべて(完了と失敗)`,filterCompleted:`完了のみ`,filterFailed:`失敗のみ`,enabledToast:`OS 通知を有効にしました`,disabledToast:`OS 通知を無効にしました`},l={heading:`アウトバウンド Webhook`,description:`Desktop のイベントを外部ツール(Slack、Zapier、CI/CD)に通知します。シークレットが設定されている場合、リクエストは <code>X-Specrails-Signature</code> で署名されます。`,eventJobCompleted:`ジョブ完了`,eventJobFailed:`ジョブ失敗`,eventDailyBudgetExceeded:`日次予算超過`,statusOn:`オン`,statusOff:`オフ`,disable:`無効化`,enable:`有効化`,sendTestPing:`テスト ping を送信`,addHeading:`Webhook を追加`,secretPlaceholder:`署名シークレット(任意)`,addButton:`Webhook を追加`,urlRequired:`URL は必須です`,selectEvent:`イベントを1つ以上選択してください`,added:`Webhook を追加しました`,addFailed:`Webhook の追加に失敗しました`,updateFailed:`Webhook の更新に失敗しました`,removed:`Webhook を削除しました`,removeFailed:`Webhook の削除に失敗しました`,testPingSent:`テスト ping を送信しました`,testPingFailed:`テスト ping の送信に失敗しました`},u={title:`ターミナルパネル`,desktopDescription:`プロジェクト別のオーバーライドがない限り、すべてのプロジェクトに適用される Desktop 全体のデフォルトです。`,projectDescription:`ターミナルパネルのプロジェクト別オーバーライド。Desktop のデフォルトを継承するには、フィールドを変更しないでください。`,fontFamily:`フォントファミリー`,fontSize:`フォントサイズ({{min}}–{{max}})`,renderMode:`レンダリングモード`,copyOnSelect:`選択時にコピー`,shellIntegration:`シェル統合(OSC 133 マーク)`,notifyLongRunning:`長時間実行コマンドの通知`,longCommandThreshold:`長時間コマンドのしきい値(ms)`,imageRendering:`インライン画像レンダリング(Sixel + iTerm2)`,browserShortcutUrl:`ブラウザショートカット URL`,quickScript:`クイックスクリプト(アクティブなターミナルに貼り付け — Enter は手動)`,reset:`リセット`,unsavedChanges:`未保存の変更`,clearOverride:`オーバーライドをクリア`,clear:`クリア`,inheritingDefault:`Desktop のデフォルトを継承中`,nothingToSave:`保存する変更はありません`,saved:`ターミナル設定を保存しました`},d={heading:`Code セクション`,summaryLanguage:`要約の言語`,monthlyBudget:`月次予算(USD)`,budgetHelper:"暦月ごとの `surface=file-summary` 支出の上限。ユーザーが開始した再生成は上限を超えられます。"},f={taglines:{dracula:`オリジナル — 紫がかったダークにネオンのアクセント`,"aurora-light":`プレミアムライト — Linear風のインディゴと温かみのあるオフホワイト`,"obsidian-dark":`プレミアムダーク — 青みがかった漆黒にエレクトリックなアクセント`,specrails:`ブランドテーマ — 深いネイビーインディゴに鮮やかなシアン`,"code-rain":`蛍光ターミナル — 緑がかった漆黒にソフトミント`,galaxy:`深宇宙のブルーと輝くブレードの軌跡`},heading:`外観`,themeGroupLabel:`テーマ`,currentlyActive:`現在アクティブ`,updateFailed:`テーマの更新に失敗しました`},p={heading:`モバイルコンパニオン`,description:`スマートフォンの SpecRails Companion アプリから Specrails を操作します。通信は 100% ローカルネットワーク経由です。デフォルトはオフです。`,accessOn:`モバイルアクセス オン`,accessOff:`モバイルアクセス オフ`,listeningOnPort:`ポート {{port}} で待機中`,notListening:`待機していません`,turnOn:`オンにする`,turnOff:`オフにする`,pairWebDevice:`Web コンパニオンをペアリング`,reset:`リセット`,resetConfirm:`モバイル ID をリセットしますか?ペアリング済みのすべてのデバイスが無効化され、再ペアリングが必要になります。`,identityReset:`モバイル ID をリセットしました`,enableFailed:`モバイルアクセスを有効にできませんでした: {{message}}`,disableFailed:`モバイルアクセスを無効にできませんでした: {{message}}`,windowsFirewall:`初回有効化時に Windows ファイアウォールが SpecRails サーバーの許可を求めます — 「プライベートネットワークで許可」を選択してください。`,pairedDevices:`ペアリング済みデバイス`,noDevices:`ペアリングされたデバイスはまだありません。`,revokeDevice:`{{name}} を無効化`},m={title:`Web コンパニオンをペアリング`,description:`スマートフォンで specrails.dev/companion-app を開き、それでこのコードをスキャンしてください。`,startFailed:`ペアリングを開始できませんでした: {{error}}`,showThenScan:`スマートフォンでこれをスキャンしたら、「スマートフォンのコードをスキャン」をタップし、カメラをスマートフォンに向けてください。`,scanAnswer:`スマートフォンのコードをスキャン`,scanning:`カメラをスマートフォンのコードに向けてください…`,cameraFailed:`カメラを利用できません: {{message}}`,notAnswer:`その QR はペアリング応答ではありません。`,connecting:`接続中…`,paired:`✓ ペアリング済み`,pairedToast:`Web コンパニオンをペアリングしました`,answerRejected:`デスクトップがそのコードを拒否しました。新しいコードを生成して再試行してください。`,copyCode:`コードをコピー`,codeCopied:`コードをコピーしました`,cancel:`キャンセル`},h={heading:`Specrails Core`,installed:`インストール済み:`,updateAvailable:`アップデートあり: {{version}}`,upToDate:`最新です`,neverChecked:`未確認`,check:`アップデートを確認`,checking:`確認中…`,update:`{{version}} に更新`,downloading:`ダウンロード中…`,materializing:`インストール中…`,affectsAll:`すべてのプロジェクトに適用 — 再起動不要。`,unavailable:`このビルドではコアの更新は利用できません。`,toastDone:`Specrails Core を {{version}} に更新しました`,toastError:`コアの更新に失敗しました: {{message}}`,toastUpToDate:`Specrails Core は最新です`,toastCheckFailed:`更新の確認に失敗しました: {{message}}`},g={heading:`Specrails Desktop`,installed:`インストール済み:`,check:`アップデートを確認`,checking:`確認中…`,upToDate:`最新バージョンです`,updateAvailable:`アップデートあり: {{version}}`,autoHint:`起動時と6時間ごとに自動確認します。`,unavailable:`アップデートはデスクトップアプリでのみ利用できます。`,toastUpToDate:`Specrails Desktop は最新です`,toastCheckFailed:`アップデートの確認に失敗しました: {{message}}`},_={title:`{{name}} — 設定`,description:`プロジェクト設定:プロンプト、予算、テレメトリ、ターミナル。`,nav:{general:`一般`,budget:`予算`,telemetry:`テレメトリ`,terminal:`ターミナル`}},v={title:`統合ブランチ`,description:`並列レールが分岐し、ドラフト PR の対象となるブランチです。空欄にするとリポジトリのデフォルトブランチに自動解決されます。`,placeholder:`自動(リポジトリのデフォルト)`,resolved:`レールは <mono>{{branch}}</mono> から分岐します`,save:`ブランチを保存`,saved:`統合ブランチを保存しました`,saveFailed:`統合ブランチを保存できませんでした`},y={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,y as default,s as desktop,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,r as telemetry,u as terminal,l as webhooks};
@@ -1 +1 @@
1
- var e={title:`语言`,description:`Desktop 全局界面语言。即时生效,无需重启。`,selectLabel:`界面语言`,updateFailed:`无法保存语言偏好`},t={title:`项目设置`},n={saveFailed:`保存失败:{{message}}`},r={title:`流水线遥测`,description:`采集 token 用量、阶段耗时和子 Agent 活动以供诊断导出。默认关闭。`,toggleLabel:`启用流水线遥测`,toggleDescription:`开启后,流水线任务的 OTEL 数据将在本地采集。在任意任务卡片上使用<mono>导出诊断</mono>按钮即可下载。`,enabled:`已启用流水线遥测`,disabled:`已禁用流水线遥测`,saveFailed:`保存遥测设置失败`},i={title:`Rail 前置提示词`,description:`追加到 implement 与 batch-implement rail 任务中的项目专属附加指令,位于工单上下文之后、开始执行之前。`,label:`前置提示词`,placeholder:`示例:优先采用增量修改,保持迁移向后兼容,并为每次 rail 变更添加测试。`,helper:`用于应随每次 rail 实现运行附带的稳定项目指引。`,saveButton:`保存前置提示词`,cleared:`前置提示词已清除`,saved:`前置提示词已保存`,saveFailed:`保存前置提示词失败`},a={title:`Freestyle 前置提示词`,description:`在 Freestyle(仅限 Claude 的 rail)模式下发送给 Claude 的指令。Freestyle 跳过 OpenSpec 流水线——直接把该前置提示词加上 spec 文本交给 Claude,让其自主实现。留空则使用内置默认值。`,label:`Freestyle 前置提示词`,placeholder:`留空以使用默认的 Freestyle 指令。`,helper:`spec 文本会自动追加在该前置提示词之后。留空 = 使用默认值。`,saveButton:`保存 Freestyle 前置提示词`,resetToDefault:`Freestyle 前置提示词已重置为默认值`,saved:`Freestyle 前置提示词已保存`,saveFailed:`保存 Freestyle 前置提示词失败`},o={title:`预算`,description:`为此项目设置每日支出上限。达到上限时队列自动暂停。`,dailyLabel:`每日预算(USD)`,dailyHelper:`留空表示禁用。支出按最近 24 小时计算。`,dailyPlaceholder:`如 5.00`,perJobLabel:`单任务成本告警(USD)`,perJobHelper:`当此项目中的单个任务超过此金额时告警。`,perJobPlaceholder:`如 0.50`,invalidNumber:`请输入正数,或留空以禁用`,dailyRemoved:`已移除每日预算`,dailySet:"每日预算已设为 ${{amount}}",perJobAlertDisabled:`已禁用单任务成本告警`,alertSet:"已设置任务超过 ${{amount}} 时告警",saveBudgetFailed:`保存预算失败`,saveThresholdFailed:`保存阈值失败`},s={nav:{appearance:`外观`,code:`代码`,terminal:`终端`,updates:`更新`,mobile:`移动端`,mcp:`MCP`,projects:`项目`,advanced:`高级`,webhooks:`Webhooks`,about:`关于`},title:`Desktop 设置`,description:`管理已注册的项目并查看 Desktop 信息。`,registeredProjects:`已注册项目`,noProjects:`尚未注册任何项目`,techUrlDescription:`specrails-tech API 的基础 URL(默认:http://localhost:3000)`,techUrlSaved:`specrails-tech URL 已保存`,techUrlSaveFailed:`保存 URL 失败`,budgetAlertsHeading:`预算与告警`,dailyBudgetLabel:`Desktop 每日预算(USD)`,dailyBudgetHelper:`所有项目的全局每日支出上限。超出后队列自动暂停。`,dailyBudgetPlaceholder:`如 10.00`,perJobHelper:`当单个任务超过此金额时告警。留空表示禁用。`,costAlertsDisabled:`已禁用成本告警`,dailyBudgetRemoved:`已移除 Desktop 每日预算`,dailyBudgetSet:"Desktop 每日预算已设为 ${{amount}}",dailyBudgetSaveFailed:`保存 Desktop 每日预算失败`,projectRemoved:`项目已移除`,projectRemoveFailed:`移除项目失败`,onboardingHeading:`新手引导`,platformTour:`平台导览`,platformTourDescription:`重播欢迎向导,回顾核心功能。`,replayTour:`重播导览`,terminalPanelHeading:`终端面板`,infoHeading:`Desktop 信息`,infoPort:`端口`,infoProjects:`项目`,infoDb:`Desktop 数据库`},c={heading:`系统通知`,description:`任务完成或失败时显示原生桌面通知。仅在标签页未聚焦时显示通知。`,enableLabel:`启用系统通知`,notifyOn:`通知时机:`,filterAll:`全部(完成与失败)`,filterCompleted:`仅完成`,filterFailed:`仅失败`,enabledToast:`已启用系统通知`,disabledToast:`已禁用系统通知`},l={heading:`出站 Webhook`,description:`在 Desktop 事件发生时通知外部工具(Slack、Zapier、CI/CD)。设置密钥后,请求会通过 <code>X-Specrails-Signature</code> 进行签名。`,eventJobCompleted:`任务完成`,eventJobFailed:`任务失败`,eventDailyBudgetExceeded:`超出每日预算`,statusOn:`开`,statusOff:`关`,disable:`禁用`,enable:`启用`,sendTestPing:`发送测试 ping`,addHeading:`添加 Webhook`,secretPlaceholder:`签名密钥(可选)`,addButton:`添加 Webhook`,urlRequired:`URL 为必填项`,selectEvent:`请至少选择一个事件`,added:`Webhook 已添加`,addFailed:`添加 Webhook 失败`,updateFailed:`更新 Webhook 失败`,removed:`Webhook 已移除`,removeFailed:`移除 Webhook 失败`,testPingSent:`测试 ping 已发送`,testPingFailed:`发送测试 ping 失败`},u={title:`终端面板`,desktopDescription:`Desktop 全局默认值,应用于所有项目,除非设置了项目级覆盖。`,projectDescription:`终端面板的项目级覆盖。保持字段不变即继承 Desktop 默认值。`,fontFamily:`字体`,fontSize:`字号({{min}}–{{max}})`,renderMode:`渲染模式`,copyOnSelect:`选中即复制`,shellIntegration:`Shell 集成(OSC 133 标记)`,notifyLongRunning:`长耗时命令通知`,longCommandThreshold:`长命令阈值(ms)`,imageRendering:`内联图片渲染(Sixel + iTerm2)`,browserShortcutUrl:`浏览器快捷方式 URL`,quickScript:`快捷脚本(粘贴到活动终端——需手动按 Enter)`,reset:`重置`,unsavedChanges:`有未保存的更改`,clearOverride:`清除覆盖`,clear:`清除`,inheritingDefault:`正在继承 Desktop 默认值`,nothingToSave:`没有可保存的内容`,saved:`终端设置已保存`},d={heading:`代码板块`,summaryLanguage:`摘要语言`,monthlyBudget:`每月预算(USD)`,budgetHelper:"每个自然月 `surface=file-summary` 支出的上限。用户手动发起的重新生成可超出此限制。"},f={taglines:{dracula:`经典原版 — 紫色调暗色主题,霓虹色点缀鲜明`,"aurora-light":`高级浅色 — 受 Linear 启发的靛蓝配暖白底色`,"obsidian-dark":`高级深色 — 近黑蓝调配电光色点缀`,matrix:`磷光终端 — 绿黑底色上的柔和薄荷绿`,specrails:`品牌主题 — 深海军靛蓝配饱和青色点缀`},heading:`外观`,themeGroupLabel:`主题`,currentlyActive:`当前使用中`,updateFailed:`更新主题失败`},p={heading:`移动伴侣`,description:`通过手机上的 SpecRails Companion 应用控制 Specrails,完全经由本地网络。默认关闭。`,accessOn:`移动访问已开启`,accessOff:`移动访问已关闭`,listeningOnPort:`正在监听端口 {{port}}`,notListening:`未在监听`,turnOn:`开启`,turnOff:`关闭`,pairWebDevice:`配对网页伴侣`,reset:`重置`,resetConfirm:`确定要重置移动身份吗?所有已配对设备都将被吊销,必须重新配对。`,identityReset:`移动身份已重置`,enableFailed:`无法启用移动访问:{{message}}`,disableFailed:`无法禁用移动访问:{{message}}`,windowsFirewall:`首次启用时,Windows 防火墙会询问是否允许 SpecRails 服务器——请选择“允许在专用网络上”。`,pairedDevices:`已配对设备`,noDevices:`尚无已配对设备。`,revokeDevice:`吊销 {{name}}`},m={title:`配对网页伴侣`,description:`在手机上打开 specrails.dev/companion-app,然后用它扫描此二维码。`,startFailed:`无法开始配对:{{error}}`,showThenScan:`手机扫描此码后,点按“扫描手机的二维码”,并将摄像头对准手机。`,scanAnswer:`扫描手机的二维码`,scanning:`请将摄像头对准手机上的二维码…`,cameraFailed:`摄像头不可用:{{message}}`,notAnswer:`该二维码不是配对应答。`,connecting:`正在连接…`,paired:`✓ 已配对`,pairedToast:`网页伴侣已配对`,answerRejected:`桌面端拒绝了该码。请重新生成一个并重试。`,copyCode:`复制配对码`,codeCopied:`配对码已复制`,cancel:`取消`},h={heading:`Specrails Core`,installed:`已安装:`,updateAvailable:`有可用更新:{{version}}`,upToDate:`已是最新`,neverChecked:`尚未检查`,check:`检查更新`,checking:`检查中…`,update:`更新到 {{version}}`,downloading:`下载中…`,materializing:`安装中…`,affectsAll:`适用于所有项目 — 无需重启。`,unavailable:`此版本不支持核心更新。`,toastDone:`Specrails Core 已更新到 {{version}}`,toastError:`核心更新失败:{{message}}`,toastUpToDate:`Specrails Core 已是最新`,toastCheckFailed:`检查更新失败:{{message}}`},g={heading:`Specrails Desktop`,installed:`已安装:`,check:`检查更新`,checking:`检查中…`,upToDate:`已是最新版本`,updateAvailable:`有可用更新: {{version}}`,autoHint:`启动时及每 6 小时自动检查。`,unavailable:`更新仅在桌面应用中可用。`,toastUpToDate:`Specrails Desktop 已是最新`,toastCheckFailed:`检查更新失败: {{message}}`},_={title:`{{name}} — 设置`,description:`项目级配置:提示词、预算、遥测和终端。`,nav:{general:`常规`,budget:`预算`,telemetry:`遥测`,terminal:`终端`}},v={title:`集成分支`,description:`并行 rail 从此分支创建,其草稿 PR 也以此为目标。留空则自动解析为仓库的默认分支。`,placeholder:`自动(仓库默认分支)`,resolved:`Rail 从 <mono>{{branch}}</mono> 创建分支`,save:`保存分支`,saved:`集成分支已保存`,saveFailed:`无法保存集成分支`},y={language:e,page:t,errors:n,telemetry:r,prePrompt:i,ultraPrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,y as default,s as desktop,n as errors,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,r as telemetry,u as terminal,a as ultraPrePrompt,l as webhooks};
1
+ var e={title:`语言`,description:`Desktop 全局界面语言。即时生效,无需重启。`,selectLabel:`界面语言`,updateFailed:`无法保存语言偏好`},t={title:`项目设置`},n={saveFailed:`保存失败:{{message}}`},r={title:`流水线遥测`,description:`采集 token 用量、阶段耗时和子 Agent 活动以供诊断导出。默认关闭。`,toggleLabel:`启用流水线遥测`,toggleDescription:`开启后,流水线任务的 OTEL 数据将在本地采集。在任意任务卡片上使用<mono>导出诊断</mono>按钮即可下载。`,enabled:`已启用流水线遥测`,disabled:`已禁用流水线遥测`,saveFailed:`保存遥测设置失败`},i={title:`Rail 前置提示词`,description:`追加到 implement 与 batch-implement rail 任务中的项目专属附加指令,位于工单上下文之后、开始执行之前。`,label:`前置提示词`,placeholder:`示例:优先采用增量修改,保持迁移向后兼容,并为每次 rail 变更添加测试。`,helper:`用于应随每次 rail 实现运行附带的稳定项目指引。`,saveButton:`保存前置提示词`,cleared:`前置提示词已清除`,saved:`前置提示词已保存`,saveFailed:`保存前置提示词失败`},a={title:`Freestyle 前置提示词`,description:`在 Freestyle(仅限 Claude 的 rail)模式下发送给 Claude 的指令。Freestyle 跳过 OpenSpec 流水线——直接把该前置提示词加上 spec 文本交给 Claude,让其自主实现。留空则使用内置默认值。`,label:`Freestyle 前置提示词`,placeholder:`留空以使用默认的 Freestyle 指令。`,helper:`spec 文本会自动追加在该前置提示词之后。留空 = 使用默认值。`,saveButton:`保存 Freestyle 前置提示词`,resetToDefault:`Freestyle 前置提示词已重置为默认值`,saved:`Freestyle 前置提示词已保存`,saveFailed:`保存 Freestyle 前置提示词失败`},o={title:`预算`,description:`为此项目设置每日支出上限。达到上限时队列自动暂停。`,dailyLabel:`每日预算(USD)`,dailyHelper:`留空表示禁用。支出按最近 24 小时计算。`,dailyPlaceholder:`如 5.00`,perJobLabel:`单任务成本告警(USD)`,perJobHelper:`当此项目中的单个任务超过此金额时告警。`,perJobPlaceholder:`如 0.50`,invalidNumber:`请输入正数,或留空以禁用`,dailyRemoved:`已移除每日预算`,dailySet:"每日预算已设为 ${{amount}}",perJobAlertDisabled:`已禁用单任务成本告警`,alertSet:"已设置任务超过 ${{amount}} 时告警",saveBudgetFailed:`保存预算失败`,saveThresholdFailed:`保存阈值失败`},s={nav:{appearance:`外观`,code:`代码`,terminal:`终端`,updates:`更新`,mobile:`移动端`,mcp:`MCP`,projects:`项目`,advanced:`高级`,webhooks:`Webhooks`,about:`关于`},title:`Desktop 设置`,description:`管理已注册的项目并查看 Desktop 信息。`,registeredProjects:`已注册项目`,noProjects:`尚未注册任何项目`,techUrlDescription:`specrails-tech API 的基础 URL(默认:http://localhost:3000)`,techUrlSaved:`specrails-tech URL 已保存`,techUrlSaveFailed:`保存 URL 失败`,budgetAlertsHeading:`预算与告警`,dailyBudgetLabel:`Desktop 每日预算(USD)`,dailyBudgetHelper:`所有项目的全局每日支出上限。超出后队列自动暂停。`,dailyBudgetPlaceholder:`如 10.00`,perJobHelper:`当单个任务超过此金额时告警。留空表示禁用。`,costAlertsDisabled:`已禁用成本告警`,dailyBudgetRemoved:`已移除 Desktop 每日预算`,dailyBudgetSet:"Desktop 每日预算已设为 ${{amount}}",dailyBudgetSaveFailed:`保存 Desktop 每日预算失败`,projectRemoved:`项目已移除`,projectRemoveFailed:`移除项目失败`,onboardingHeading:`新手引导`,platformTour:`平台导览`,platformTourDescription:`重播欢迎向导,回顾核心功能。`,replayTour:`重播导览`,terminalPanelHeading:`终端面板`,infoHeading:`Desktop 信息`,infoPort:`端口`,infoProjects:`项目`,infoDb:`Desktop 数据库`},c={heading:`系统通知`,description:`任务完成或失败时显示原生桌面通知。仅在标签页未聚焦时显示通知。`,enableLabel:`启用系统通知`,notifyOn:`通知时机:`,filterAll:`全部(完成与失败)`,filterCompleted:`仅完成`,filterFailed:`仅失败`,enabledToast:`已启用系统通知`,disabledToast:`已禁用系统通知`},l={heading:`出站 Webhook`,description:`在 Desktop 事件发生时通知外部工具(Slack、Zapier、CI/CD)。设置密钥后,请求会通过 <code>X-Specrails-Signature</code> 进行签名。`,eventJobCompleted:`任务完成`,eventJobFailed:`任务失败`,eventDailyBudgetExceeded:`超出每日预算`,statusOn:`开`,statusOff:`关`,disable:`禁用`,enable:`启用`,sendTestPing:`发送测试 ping`,addHeading:`添加 Webhook`,secretPlaceholder:`签名密钥(可选)`,addButton:`添加 Webhook`,urlRequired:`URL 为必填项`,selectEvent:`请至少选择一个事件`,added:`Webhook 已添加`,addFailed:`添加 Webhook 失败`,updateFailed:`更新 Webhook 失败`,removed:`Webhook 已移除`,removeFailed:`移除 Webhook 失败`,testPingSent:`测试 ping 已发送`,testPingFailed:`发送测试 ping 失败`},u={title:`终端面板`,desktopDescription:`Desktop 全局默认值,应用于所有项目,除非设置了项目级覆盖。`,projectDescription:`终端面板的项目级覆盖。保持字段不变即继承 Desktop 默认值。`,fontFamily:`字体`,fontSize:`字号({{min}}–{{max}})`,renderMode:`渲染模式`,copyOnSelect:`选中即复制`,shellIntegration:`Shell 集成(OSC 133 标记)`,notifyLongRunning:`长耗时命令通知`,longCommandThreshold:`长命令阈值(ms)`,imageRendering:`内联图片渲染(Sixel + iTerm2)`,browserShortcutUrl:`浏览器快捷方式 URL`,quickScript:`快捷脚本(粘贴到活动终端——需手动按 Enter)`,reset:`重置`,unsavedChanges:`有未保存的更改`,clearOverride:`清除覆盖`,clear:`清除`,inheritingDefault:`正在继承 Desktop 默认值`,nothingToSave:`没有可保存的内容`,saved:`终端设置已保存`},d={heading:`代码板块`,summaryLanguage:`摘要语言`,monthlyBudget:`每月预算(USD)`,budgetHelper:"每个自然月 `surface=file-summary` 支出的上限。用户手动发起的重新生成可超出此限制。"},f={taglines:{dracula:`经典原版 — 紫色调暗色主题,霓虹色点缀鲜明`,"aurora-light":`高级浅色 — 受 Linear 启发的靛蓝配暖白底色`,"obsidian-dark":`高级深色 — 近黑蓝调配电光色点缀`,specrails:`品牌主题 — 深海军靛蓝配饱和青色点缀`,"code-rain":`磷光终端 — 绿黑底色上的柔和薄荷绿`,galaxy:`深空蓝配上发光的光刃轨迹`},heading:`外观`,themeGroupLabel:`主题`,currentlyActive:`当前使用中`,updateFailed:`更新主题失败`},p={heading:`移动伴侣`,description:`通过手机上的 SpecRails Companion 应用控制 Specrails,完全经由本地网络。默认关闭。`,accessOn:`移动访问已开启`,accessOff:`移动访问已关闭`,listeningOnPort:`正在监听端口 {{port}}`,notListening:`未在监听`,turnOn:`开启`,turnOff:`关闭`,pairWebDevice:`配对网页伴侣`,reset:`重置`,resetConfirm:`确定要重置移动身份吗?所有已配对设备都将被吊销,必须重新配对。`,identityReset:`移动身份已重置`,enableFailed:`无法启用移动访问:{{message}}`,disableFailed:`无法禁用移动访问:{{message}}`,windowsFirewall:`首次启用时,Windows 防火墙会询问是否允许 SpecRails 服务器——请选择“允许在专用网络上”。`,pairedDevices:`已配对设备`,noDevices:`尚无已配对设备。`,revokeDevice:`吊销 {{name}}`},m={title:`配对网页伴侣`,description:`在手机上打开 specrails.dev/companion-app,然后用它扫描此二维码。`,startFailed:`无法开始配对:{{error}}`,showThenScan:`手机扫描此码后,点按“扫描手机的二维码”,并将摄像头对准手机。`,scanAnswer:`扫描手机的二维码`,scanning:`请将摄像头对准手机上的二维码…`,cameraFailed:`摄像头不可用:{{message}}`,notAnswer:`该二维码不是配对应答。`,connecting:`正在连接…`,paired:`✓ 已配对`,pairedToast:`网页伴侣已配对`,answerRejected:`桌面端拒绝了该码。请重新生成一个并重试。`,copyCode:`复制配对码`,codeCopied:`配对码已复制`,cancel:`取消`},h={heading:`Specrails Core`,installed:`已安装:`,updateAvailable:`有可用更新:{{version}}`,upToDate:`已是最新`,neverChecked:`尚未检查`,check:`检查更新`,checking:`检查中…`,update:`更新到 {{version}}`,downloading:`下载中…`,materializing:`安装中…`,affectsAll:`适用于所有项目 — 无需重启。`,unavailable:`此版本不支持核心更新。`,toastDone:`Specrails Core 已更新到 {{version}}`,toastError:`核心更新失败:{{message}}`,toastUpToDate:`Specrails Core 已是最新`,toastCheckFailed:`检查更新失败:{{message}}`},g={heading:`Specrails Desktop`,installed:`已安装:`,check:`检查更新`,checking:`检查中…`,upToDate:`已是最新版本`,updateAvailable:`有可用更新: {{version}}`,autoHint:`启动时及每 6 小时自动检查。`,unavailable:`更新仅在桌面应用中可用。`,toastUpToDate:`Specrails Desktop 已是最新`,toastCheckFailed:`检查更新失败: {{message}}`},_={title:`{{name}} — 设置`,description:`项目级配置:提示词、预算、遥测和终端。`,nav:{general:`常规`,budget:`预算`,telemetry:`遥测`,terminal:`终端`}},v={title:`集成分支`,description:`并行 rail 从此分支创建,其草稿 PR 也以此为目标。留空则自动解析为仓库的默认分支。`,placeholder:`自动(仓库默认分支)`,resolved:`Rail 从 <mono>{{branch}}</mono> 创建分支`,save:`保存分支`,saved:`集成分支已保存`,saveFailed:`无法保存集成分支`},y={language:e,page:t,errors:n,telemetry:r,prePrompt:i,freestylePrePrompt:a,budget:o,desktop:s,notifications:c,webhooks:l,terminal:u,codeSection:d,appearance:f,mobile:p,pairWeb:m,coreUpdate:h,appUpdate:g,projectDialog:_,integrationBranch:v};export{g as appUpdate,f as appearance,o as budget,d as codeSection,h as coreUpdate,y as default,s as desktop,n as errors,a as freestylePrePrompt,v as integrationBranch,e as language,p as mobile,c as notifications,t as page,m as pairWeb,i as prePrompt,_ as projectDialog,r as telemetry,u as terminal,l as webhooks};