@shepai/cli 1.117.0-pr378.ba81704 → 1.118.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/apis/json-schema/EnvironmentConfig.yaml +5 -0
  2. package/apis/json-schema/TerminalType.yaml +10 -0
  3. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  4. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +7 -1
  5. package/dist/packages/core/src/domain/generated/output.d.ts +11 -0
  6. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  7. package/dist/packages/core/src/domain/generated/output.js +8 -0
  8. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  9. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts +11 -0
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts.map +1 -0
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.js +13 -0
  14. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +1 -1
  15. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  17. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +5 -0
  18. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +7 -0
  20. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/system-terminal.json +24 -0
  21. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts +12 -0
  22. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts.map +1 -0
  23. package/dist/src/presentation/web/app/actions/get-available-terminals.js +53 -0
  24. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
  25. package/dist/src/presentation/web/app/actions/open-shell.js +47 -3
  26. package/dist/src/presentation/web/app/settings/page.d.ts.map +1 -1
  27. package/dist/src/presentation/web/app/settings/page.js +6 -2
  28. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +2 -7
  30. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +0 -2
  31. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
  32. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts +1 -1
  33. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +4 -6
  35. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +0 -6
  36. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +0 -74
  38. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts +3 -1
  39. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts.map +1 -1
  40. package/dist/src/presentation/web/components/features/settings/environment-settings-section.js +32 -5
  41. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts +2 -0
  42. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts.map +1 -1
  43. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.js +34 -1
  44. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts +3 -1
  45. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +45 -13
  47. package/dist/tsconfig.build.tsbuildinfo +1 -1
  48. package/package.json +1 -1
  49. package/web/.next/BUILD_ID +1 -1
  50. package/web/.next/build-manifest.json +2 -2
  51. package/web/.next/fallback-build-manifest.json +2 -2
  52. package/web/.next/prerender-manifest.json +3 -3
  53. package/web/.next/required-server-files.js +2 -2
  54. package/web/.next/required-server-files.json +2 -2
  55. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +21 -21
  56. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  57. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  58. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  60. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  61. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +27 -27
  64. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  65. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  68. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  69. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +21 -21
  72. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  73. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  76. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  77. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +27 -27
  80. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  81. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  82. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +19 -19
  84. package/web/.next/server/app/(dashboard)/page.js +2 -2
  85. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  86. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  88. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  89. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  90. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/_global-error/page.js +1 -1
  92. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  93. package/web/.next/server/app/_global-error.html +2 -2
  94. package/web/.next/server/app/_global-error.rsc +1 -1
  95. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  96. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  97. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  98. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  99. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  100. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  101. package/web/.next/server/app/_not-found/page.js +2 -2
  102. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  103. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  105. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  106. package/web/.next/server/app/settings/page/server-reference-manifest.json +25 -10
  107. package/web/.next/server/app/settings/page.js +3 -3
  108. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  109. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  111. package/web/.next/server/app/skills/page.js +2 -2
  112. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  113. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  115. package/web/.next/server/app/tools/page.js +2 -2
  116. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  117. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  118. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  119. package/web/.next/server/app/version/page.js +2 -2
  120. package/web/.next/server/app/version/page.js.nft.json +1 -1
  121. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +1 -1
  123. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -1
  124. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  125. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  126. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  128. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +1 -1
  130. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +1 -1
  132. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  134. package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js → [root-of-the-server]__2dddfea9._.js} +2 -2
  135. package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__2dddfea9._.js.map} +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js +4 -0
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__2ff2daf6._.js.map +1 -0
  138. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ac0304e7._.js → [root-of-the-server]__3155add4._.js} +2 -2
  139. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ac0304e7._.js.map → [root-of-the-server]__3155add4._.js.map} +1 -1
  140. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__4c7486cb._.js} +2 -2
  141. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__4c7486cb._.js.map} +1 -1
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +4 -0
  145. package/web/.next/server/chunks/ssr/{[root-of-the-server]__11033878._.js.map → [root-of-the-server]__6b17a22d._.js.map} +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +4 -0
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -0
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js +4 -0
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__7b707feb._.js.map +1 -0
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +4 -0
  153. package/web/.next/server/chunks/ssr/{[root-of-the-server]__fdc75809._.js.map → [root-of-the-server]__804c006d._.js.map} +1 -1
  154. package/web/.next/server/chunks/ssr/{[root-of-the-server]__89e8a5cc._.js → [root-of-the-server]__8763fd7a._.js} +3 -3
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__8763fd7a._.js.map +1 -0
  156. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2a5592d5._.js → [root-of-the-server]__9c56d724._.js} +2 -2
  157. package/web/.next/server/chunks/ssr/{[root-of-the-server]__2a5592d5._.js.map → [root-of-the-server]__9c56d724._.js.map} +1 -1
  158. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a93289b0._.js → [root-of-the-server]__cfc116d5._.js} +2 -2
  159. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a93289b0._.js.map → [root-of-the-server]__cfc116d5._.js.map} +1 -1
  160. package/web/.next/server/chunks/ssr/{[root-of-the-server]__172d9576._.js → [root-of-the-server]__d3841d9e._.js} +2 -2
  161. package/web/.next/server/chunks/ssr/{[root-of-the-server]__172d9576._.js.map → [root-of-the-server]__d3841d9e._.js.map} +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__db9afe04._.js +3 -0
  163. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b1e68e34._.js.map → [root-of-the-server]__db9afe04._.js.map} +1 -1
  164. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  165. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/_1bb131c4._.js +1 -1
  167. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/{_8dacd1e7._.js → _2f6f48b8._.js} +2 -2
  170. package/web/.next/server/chunks/ssr/{_8dacd1e7._.js.map → _2f6f48b8._.js.map} +1 -1
  171. package/web/.next/server/chunks/ssr/{_9e49abaa._.js → _5f868392._.js} +2 -2
  172. package/web/.next/server/chunks/ssr/{_9e49abaa._.js.map → _5f868392._.js.map} +1 -1
  173. package/web/.next/server/chunks/ssr/{_524b38a3._.js → _c6ec0fa4._.js} +2 -2
  174. package/web/.next/server/chunks/ssr/{_524b38a3._.js.map → _c6ec0fa4._.js.map} +1 -1
  175. package/web/.next/server/chunks/ssr/{_91f6d758._.js → _ca5a8b32._.js} +2 -2
  176. package/web/.next/server/chunks/ssr/{_91f6d758._.js.map → _ca5a8b32._.js.map} +1 -1
  177. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  178. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  180. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js +2 -2
  182. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +1 -1
  184. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  186. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  188. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  189. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  190. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  192. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  194. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  195. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js +2 -2
  196. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js.map +1 -1
  197. package/web/.next/server/pages/500.html +2 -2
  198. package/web/.next/server/server-reference-manifest.js +1 -1
  199. package/web/.next/server/server-reference-manifest.json +52 -37
  200. package/web/.next/static/chunks/{f47c8ea3cfe6a43a.js → 15a2249cbec45bee.js} +1 -1
  201. package/web/.next/static/chunks/{46b623a4a941c63c.js → 169d4ce4e5fa10d2.js} +1 -1
  202. package/web/.next/static/chunks/{bfa2e6f36f5a66e5.js → 3fb7682246dbaf45.js} +1 -1
  203. package/web/.next/static/chunks/{3e47d1e571a82b7c.js → 59e6b9b540f05bf1.js} +1 -1
  204. package/web/.next/static/chunks/{60a563f3e9bf8586.js → 7ce5aacd9b492e8c.js} +1 -1
  205. package/web/.next/static/chunks/9285299c4fb0f020.js +1 -0
  206. package/web/.next/static/chunks/{d9078c8963172d03.js → bf46b5bf0d9d43b3.js} +2 -2
  207. package/web/.next/static/chunks/{3dc5abcd1187cd47.js → da24af4a494de11a.js} +1 -1
  208. package/web/.next/static/chunks/{1729fe2ac1a8df22.js → dc81cb5172953533.js} +1 -1
  209. package/web/.next/static/chunks/{fcde0cbb2976b933.js → e2ef95d904c360f3.js} +1 -1
  210. package/web/.next/static/chunks/{5a64ee5d82790de1.js → f7577de2f653acfc.js} +2 -2
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +0 -4
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +0 -4
  213. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +0 -1
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +0 -4
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js.map +0 -1
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +0 -1
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +0 -4
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +0 -1
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +0 -3
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +0 -4
  221. package/web/.next/static/chunks/ce670d8f4a90eade.js +0 -1
  222. /package/web/.next/static/{Pv25YwqnApbBYI6OTQk3G → akrvSvVQ4BzHsJ1sA0rS7}/_buildManifest.js +0 -0
  223. /package/web/.next/static/{Pv25YwqnApbBYI6OTQk3G → akrvSvVQ4BzHsJ1sA0rS7}/_clientMiddlewareManifest.json +0 -0
  224. /package/web/.next/static/{Pv25YwqnApbBYI6OTQk3G → akrvSvVQ4BzHsJ1sA0rS7}/_ssgManifest.js +0 -0
@@ -74,8 +74,6 @@ export interface MergeReviewData {
74
74
  export interface MergeReviewProps {
75
75
  /** Merge review data from the server action */
76
76
  data: MergeReviewData;
77
- /** When true, hides the action bar and shows archival header text (post-merge history mode) */
78
- readOnly?: boolean;
79
77
  /** Approve merge callback */
80
78
  onApprove: () => void;
81
79
  /** Reject merge callback — opens feedback dialog when provided; also used for inline text rejection */
@@ -1 +1 @@
1
- {"version":3,"file":"merge-review-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merge-review-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review-config.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import type { MergeReviewProps } from './merge-review-config.js';
2
- export declare function MergeReview({ data, readOnly, onApprove, onReject, isProcessing, isRejecting, chatInput, onChatInputChange, }: MergeReviewProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function MergeReview({ data, onApprove, onReject, isProcessing, isRejecting, chatInput, onChatInputChange, }: MergeReviewProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=merge-review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,uBAAuB,CAAC;AA0KnF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAgB,EAChB,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,EAAE,gBAAgB,2CAiKlB"}
1
+ {"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,gBAAgB,EAAuB,MAAM,uBAAuB,CAAC;AA0KnF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,EACnB,SAAS,EACT,iBAAiB,GAClB,EAAE,gBAAgB,2CA2JlB"}
@@ -65,13 +65,11 @@ function EvidenceTextPreview({ url }) {
65
65
  function EvidenceList({ evidence, basePath, }) {
66
66
  return (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(Camera, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Evidence" }), _jsx(Badge, { variant: "secondary", className: "text-[10px]", children: evidence.length })] }), _jsx("ul", { className: "space-y-2", children: evidence.map((e) => (_jsx(EvidenceItem, { evidence: e, basePath: basePath }, `${e.type}-${e.relativePath}`))) })] }) }));
67
67
  }
68
- export function MergeReview({ data, readOnly = false, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
68
+ export function MergeReview({ data, onApprove, onReject, isProcessing = false, isRejecting = false, chatInput, onChatInputChange, }) {
69
69
  const { pr, diffSummary, fileDiffs, branch, warning, evidence, evidenceBasePath } = data;
70
70
  const hasConflicts = pr?.mergeable === false;
71
71
  const handleApproveOrResolve = hasConflicts && onReject ? () => onReject('Resolve merge conflicts', []) : onApprove;
72
- return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-emerald-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-foreground text-sm font-bold", children: readOnly ? 'Merge History' : 'Merge Review' }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs leading-relaxed", children: readOnly
73
- ? 'This feature was merged. Review the pull request details and evidence below.'
74
- : pr
75
- ? 'Review the pull request details and approve to merge.'
76
- : 'Review the changes and approve to merge.' })] })] }), branch ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx(Badge, { variant: "secondary", className: "font-mono text-[11px]", children: branch.source }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx(Badge, { variant: "outline", className: "font-mono text-[11px]", children: branch.target })] }) })) : null, pr ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { variant: "outline", className: "text-xs", children: pr.status })] }), pr.mergeable === false ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Merge Status" }), _jsxs(Badge, { className: "border-transparent bg-orange-50 text-orange-700 hover:bg-orange-50", children: [_jsx(AlertTriangle, { className: "mr-1 h-3.5 w-3.5" }), "Conflicts"] })] })) : null, pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) })) : null, diffSummary ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(FileDiff, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changes" })] }), _jsxs("div", { className: "grid grid-cols-4 gap-3", children: [_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.filesChanged }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "files" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-green-600", children: ["+", diffSummary.additions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "additions" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-red-600", children: ["-", diffSummary.deletions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "deletions" })] }), _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.commitCount }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "commits" })] })] })] }) })) : warning ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(AlertTriangle, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "text-muted-foreground text-xs", children: warning })] }) })) : null, evidence && evidence.length > 0 ? (_jsx(EvidenceList, { evidence: evidence, basePath: evidenceBasePath })) : null, fileDiffs && fileDiffs.length > 0 ? _jsx(DiffView, { fileDiffs: fileDiffs }) : null] }), !readOnly && (_jsx(DrawerActionBar, { onReject: onReject, onApprove: handleApproveOrResolve, approveLabel: hasConflicts ? 'Resolve Conflicts' : 'Approve Merge', approveVariant: hasConflicts ? 'warning' : 'default', revisionPlaceholder: "Ask AI to revise before merging...", isProcessing: isProcessing, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange }))] }));
72
+ return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1.5 h-2.5 w-2.5 shrink-0 rounded-full bg-emerald-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h2", { className: "text-foreground text-sm font-bold", children: "Merge Review" }), _jsx("p", { className: "text-muted-foreground mt-1 text-xs leading-relaxed", children: pr
73
+ ? 'Review the pull request details and approve to merge.'
74
+ : 'Review the changes and approve to merge.' })] })] }), branch ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(GitBranch, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx(Badge, { variant: "secondary", className: "font-mono text-[11px]", children: branch.source }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx(Badge, { variant: "outline", className: "font-mono text-[11px]", children: branch.target })] }) })) : null, pr ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { variant: "outline", className: "text-xs", children: pr.status })] }), pr.mergeable === false ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Merge Status" }), _jsxs(Badge, { className: "border-transparent bg-orange-50 text-orange-700 hover:bg-orange-50", children: [_jsx(AlertTriangle, { className: "mr-1 h-3.5 w-3.5" }), "Conflicts"] })] })) : null, pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) })) : null, diffSummary ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(FileDiff, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changes" })] }), _jsxs("div", { className: "grid grid-cols-4 gap-3", children: [_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.filesChanged }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "files" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-green-600", children: ["+", diffSummary.additions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "additions" })] }), _jsxs("div", { className: "text-center", children: [_jsxs("div", { className: "text-sm font-bold text-red-600", children: ["-", diffSummary.deletions] }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "deletions" })] }), _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-foreground text-sm font-bold", children: diffSummary.commitCount }), _jsx("div", { className: "text-muted-foreground text-[10px]", children: "commits" })] })] })] }) })) : warning ? (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(AlertTriangle, { className: "text-muted-foreground h-4 w-4 shrink-0" }), _jsx("span", { className: "text-muted-foreground text-xs", children: warning })] }) })) : null, evidence && evidence.length > 0 ? (_jsx(EvidenceList, { evidence: evidence, basePath: evidenceBasePath })) : null, fileDiffs && fileDiffs.length > 0 ? _jsx(DiffView, { fileDiffs: fileDiffs }) : null] }), _jsx(DrawerActionBar, { onReject: onReject, onApprove: handleApproveOrResolve, approveLabel: hasConflicts ? 'Resolve Conflicts' : 'Approve Merge', approveVariant: hasConflicts ? 'warning' : 'default', revisionPlaceholder: "Ask AI to revise before merging...", isProcessing: isProcessing, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] }));
77
75
  }
@@ -25,10 +25,4 @@ export declare const NoPrNoDiff: Story;
25
25
  export declare const WithFileDiffs: Story;
26
26
  /** With evidence — shows evidence items captured during implementation. */
27
27
  export declare const WithEvidence: Story;
28
- /** Read-only mode with full data — PR, diff summary, evidence, and file diffs. No action bar. */
29
- export declare const ReadOnlyFullData: Story;
30
- /** Read-only mode with evidence but no diffs — warning message shown for unavailable diffs. */
31
- export declare const ReadOnlyEvidenceNoDiffs: Story;
32
- /** Read-only mode with PR metadata only — no evidence, no diffs. */
33
- export declare const ReadOnlyPrOnly: Story;
34
28
  //# sourceMappingURL=merge-review.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-review.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA2F7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAE1C,kDAAkD;AAClD,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,cAAc,EAAE,KAQ5B,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,YAAY,EAAE,KAoC1B,CAAC;AAaF,iGAAiG;AACjG,eAAO,MAAM,gBAAgB,EAAE,KA2B9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,uBAAuB,EAAE,KAwBrC,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,cAAc,EAAE,KAS5B,CAAC"}
1
+ {"version":3,"file":"merge-review.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA2F7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AAE1C,kDAAkD;AAClD,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,cAAc,EAAE,KAQ5B,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,YAAY,EAAE,KAoC1B,CAAC"}
@@ -230,77 +230,3 @@ export const WithEvidence = {
230
230
  ...defaultActions,
231
231
  },
232
232
  };
233
- /* ─── Read-Only / History Mode ─── */
234
- const mergedPr = {
235
- ...fullPr,
236
- status: PrStatus.Merged,
237
- };
238
- const readOnlyActions = {
239
- onApprove: fn().mockName('onApprove'),
240
- };
241
- /** Read-only mode with full data — PR, diff summary, evidence, and file diffs. No action bar. */
242
- export const ReadOnlyFullData = {
243
- args: {
244
- data: {
245
- pr: mergedPr,
246
- branch: sampleBranch,
247
- diffSummary: fullData.diffSummary,
248
- fileDiffs: sampleFileDiffs,
249
- evidence: [
250
- {
251
- type: 'Screenshot',
252
- capturedAt: '2026-03-09T12:00:00Z',
253
- description: 'Homepage showing new auth banner',
254
- relativePath: '.shep/evidence/homepage-banner.png',
255
- taskRef: 'task-1',
256
- },
257
- {
258
- type: 'TestOutput',
259
- capturedAt: '2026-03-09T12:01:00Z',
260
- description: 'Unit tests — all 42 passing',
261
- relativePath: '.shep/evidence/unit-test-results.txt',
262
- taskRef: 'task-2',
263
- },
264
- ],
265
- },
266
- readOnly: true,
267
- ...readOnlyActions,
268
- },
269
- };
270
- /** Read-only mode with evidence but no diffs — warning message shown for unavailable diffs. */
271
- export const ReadOnlyEvidenceNoDiffs = {
272
- args: {
273
- data: {
274
- pr: mergedPr,
275
- branch: sampleBranch,
276
- warning: 'Diff statistics unavailable — worktree was removed after merge',
277
- evidence: [
278
- {
279
- type: 'Screenshot',
280
- capturedAt: '2026-03-09T12:00:00Z',
281
- description: 'Final state of the feature',
282
- relativePath: '.shep/evidence/final-state.png',
283
- },
284
- {
285
- type: 'Video',
286
- capturedAt: '2026-03-09T12:02:00Z',
287
- description: 'Demo walkthrough recording',
288
- relativePath: '.shep/evidence/demo.mp4',
289
- },
290
- ],
291
- },
292
- readOnly: true,
293
- ...readOnlyActions,
294
- },
295
- };
296
- /** Read-only mode with PR metadata only — no evidence, no diffs. */
297
- export const ReadOnlyPrOnly = {
298
- args: {
299
- data: {
300
- pr: mergedPr,
301
- branch: sampleBranch,
302
- },
303
- readOnly: true,
304
- ...readOnlyActions,
305
- },
306
- };
@@ -1,6 +1,8 @@
1
1
  import type { EnvironmentConfig } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ import type { AvailableTerminal } from '../../../app/actions/get-available-terminals.js';
2
3
  export interface EnvironmentSettingsSectionProps {
3
4
  environment: EnvironmentConfig;
5
+ availableTerminals?: AvailableTerminal[];
4
6
  }
5
- export declare function EnvironmentSettingsSection({ environment }: EnvironmentSettingsSectionProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function EnvironmentSettingsSection({ environment, availableTerminals, }: EnvironmentSettingsSectionProps): import("react/jsx-runtime").JSX.Element;
6
8
  //# sourceMappingURL=environment-settings-section.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/environment-settings-section.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAgB9E,MAAM,WAAW,+BAA+B;IAC9C,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED,wBAAgB,0BAA0B,CAAC,EAAE,WAAW,EAAE,EAAE,+BAA+B,2CAwF1F"}
1
+ {"version":3,"file":"environment-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/environment-settings-section.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAgB/E,MAAM,WAAW,+BAA+B;IAC9C,WAAW,EAAE,iBAAiB,CAAC;IAC/B,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAED,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,kBAAkB,GACnB,EAAE,+BAA+B,2CAuIjC"}
@@ -7,7 +7,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../..
7
7
  import { Label } from '../../ui/label.js';
8
8
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
9
9
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
10
- import { EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
10
+ import { EditorType, TerminalType } from '../../../../../../packages/core/src/domain/generated/output.js';
11
11
  const EDITOR_OPTIONS = [
12
12
  { value: EditorType.VsCode, label: 'VS Code' },
13
13
  { value: EditorType.Cursor, label: 'Cursor' },
@@ -20,9 +20,10 @@ const SHELL_OPTIONS = [
20
20
  { value: 'zsh', label: 'Zsh' },
21
21
  { value: 'fish', label: 'Fish' },
22
22
  ];
23
- export function EnvironmentSettingsSection({ environment }) {
23
+ export function EnvironmentSettingsSection({ environment, availableTerminals, }) {
24
24
  const [editor, setEditor] = useState(environment.defaultEditor);
25
25
  const [shell, setShell] = useState(environment.shellPreference);
26
+ const [terminal, setTerminal] = useState(environment.terminalPreference ?? TerminalType.System);
26
27
  const [isPending, startTransition] = useTransition();
27
28
  const [showSaved, setShowSaved] = useState(false);
28
29
  const prevPendingRef = useRef(false);
@@ -44,11 +45,37 @@ export function EnvironmentSettingsSection({ environment }) {
44
45
  }
45
46
  function handleEditorChange(value) {
46
47
  setEditor(value);
47
- save({ environment: { defaultEditor: value, shellPreference: shell } });
48
+ save({
49
+ environment: {
50
+ defaultEditor: value,
51
+ shellPreference: shell,
52
+ terminalPreference: terminal,
53
+ },
54
+ });
48
55
  }
49
56
  function handleShellChange(value) {
50
57
  setShell(value);
51
- save({ environment: { defaultEditor: editor, shellPreference: value } });
58
+ save({
59
+ environment: {
60
+ defaultEditor: editor,
61
+ shellPreference: value,
62
+ terminalPreference: terminal,
63
+ },
64
+ });
65
+ }
66
+ function handleTerminalChange(value) {
67
+ setTerminal(value);
68
+ save({
69
+ environment: {
70
+ defaultEditor: editor,
71
+ shellPreference: shell,
72
+ terminalPreference: value,
73
+ },
74
+ });
52
75
  }
53
- return (_jsxs(Card, { id: "environment", className: "scroll-mt-6", "data-testid": "environment-settings-section", children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Terminal, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "IDE & Terminal" })] }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsx(CardDescription, { children: "Configure your default editor and shell preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "default-editor", children: "Default Editor" }), _jsxs(Select, { value: editor, onValueChange: handleEditorChange, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "shell-preference", children: "Shell Preference" }), _jsxs(Select, { value: shell, onValueChange: handleShellChange, children: [_jsx(SelectTrigger, { id: "shell-preference", "data-testid": "shell-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: SHELL_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] })] })] }));
76
+ // Filter to only show installed terminals
77
+ const terminalOptions = availableTerminals
78
+ ? availableTerminals.filter((t) => t.available)
79
+ : [{ id: TerminalType.System, name: 'System Terminal', available: true }];
80
+ return (_jsxs(Card, { id: "environment", className: "scroll-mt-6", "data-testid": "environment-settings-section", children: [_jsxs(CardHeader, { children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Terminal, { className: "text-muted-foreground h-4 w-4" }), _jsx(CardTitle, { children: "IDE & Terminal" })] }), isPending ? _jsx("span", { className: "text-muted-foreground text-xs", children: "Saving..." }) : null, showSaved && !isPending ? (_jsxs("span", { className: "flex items-center gap-1 text-xs text-green-600", children: [_jsx(Check, { className: "h-3 w-3" }), "Saved"] })) : null] }), _jsx(CardDescription, { children: "Configure your default editor, shell, and terminal preferences" })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "default-editor", children: "Default Editor" }), _jsxs(Select, { value: editor, onValueChange: handleEditorChange, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "shell-preference", children: "Shell Preference" }), _jsxs(Select, { value: shell, onValueChange: handleShellChange, children: [_jsx(SelectTrigger, { id: "shell-preference", "data-testid": "shell-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: SHELL_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "terminal-preference", children: "Terminal Emulator" }), _jsxs(Select, { value: terminal, onValueChange: handleTerminalChange, children: [_jsx(SelectTrigger, { id: "terminal-preference", "data-testid": "terminal-select", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: terminalOptions.map((opt) => (_jsx(SelectItem, { value: opt.id, children: opt.name }, opt.id))) })] })] })] })] }));
54
81
  }
@@ -12,4 +12,6 @@ export default meta;
12
12
  type Story = StoryObj<typeof meta>;
13
13
  export declare const Default: Story;
14
14
  export declare const CursorWithZsh: Story;
15
+ export declare const WarpSelected: Story;
16
+ export declare const OnlySystemTerminal: Story;
15
17
  //# sourceMappingURL=environment-settings-section.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/environment-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAG5E,QAAA,MAAM,IAAI;;;;;;;CAOyC,CAAC;AAEpD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAOrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAO3B,CAAC"}
1
+ {"version":3,"file":"environment-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/environment-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAG5E,QAAA,MAAM,IAAI;;;;;;;CAOyC,CAAC;AAEpD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAarB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAS3B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAe1B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAQhC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { EnvironmentSettingsSection } from './environment-settings-section.js';
2
- import { EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ import { EditorType, TerminalType } from '../../../../../../packages/core/src/domain/generated/output.js';
3
3
  const meta = {
4
4
  title: 'Features/Settings/EnvironmentSettingsSection',
5
5
  component: EnvironmentSettingsSection,
@@ -14,7 +14,13 @@ export const Default = {
14
14
  environment: {
15
15
  defaultEditor: EditorType.VsCode,
16
16
  shellPreference: 'bash',
17
+ terminalPreference: TerminalType.System,
17
18
  },
19
+ availableTerminals: [
20
+ { id: 'system', name: 'System Terminal', available: true },
21
+ { id: 'warp', name: 'Warp', available: true },
22
+ { id: 'iterm2', name: 'iTerm2', available: true },
23
+ ],
18
24
  },
19
25
  };
20
26
  export const CursorWithZsh = {
@@ -22,6 +28,33 @@ export const CursorWithZsh = {
22
28
  environment: {
23
29
  defaultEditor: EditorType.Cursor,
24
30
  shellPreference: 'zsh',
31
+ terminalPreference: TerminalType.System,
32
+ },
33
+ availableTerminals: [{ id: 'system', name: 'System Terminal', available: true }],
34
+ },
35
+ };
36
+ export const WarpSelected = {
37
+ args: {
38
+ environment: {
39
+ defaultEditor: EditorType.VsCode,
40
+ shellPreference: 'zsh',
41
+ terminalPreference: TerminalType.Warp,
42
+ },
43
+ availableTerminals: [
44
+ { id: 'system', name: 'System Terminal', available: true },
45
+ { id: 'warp', name: 'Warp', available: true },
46
+ { id: 'iterm2', name: 'iTerm2', available: true },
47
+ { id: 'alacritty', name: 'Alacritty', available: true },
48
+ { id: 'kitty', name: 'Kitty', available: true },
49
+ ],
50
+ },
51
+ };
52
+ export const OnlySystemTerminal = {
53
+ args: {
54
+ environment: {
55
+ defaultEditor: EditorType.VsCode,
56
+ shellPreference: 'bash',
57
+ terminalPreference: TerminalType.System,
25
58
  },
26
59
  },
27
60
  };
@@ -1,8 +1,10 @@
1
1
  import type { Settings } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ import type { AvailableTerminal } from '../../../app/actions/get-available-terminals.js';
2
3
  export interface SettingsPageClientProps {
3
4
  settings: Settings;
4
5
  shepHome: string;
5
6
  dbFileSize: string;
7
+ availableTerminals?: AvailableTerminal[];
6
8
  }
7
- export declare function SettingsPageClient({ settings, shepHome, dbFileSize }: SettingsPageClientProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare function SettingsPageClient({ settings, shepHome, dbFileSize, availableTerminals, }: SettingsPageClientProps): import("react/jsx-runtime").JSX.Element;
8
10
  //# sourceMappingURL=settings-page-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AA0B9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6QD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,uBAAuB,2CA4iC7F"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAgC/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CA4nCzB"}
@@ -11,7 +11,7 @@ import { Switch } from '../../ui/switch.js';
11
11
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
12
12
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
13
13
  import { updateSettingsAction } from '../../../app/actions/update-settings.js';
14
- import { AgentAuthMethod, EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
14
+ import { AgentAuthMethod, EditorType, TerminalType, } from '../../../../../../packages/core/src/domain/generated/output.js';
15
15
  import { getEditorTypeIcon } from '../../common/editor-type-icons.js';
16
16
  import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
17
17
  import { TimeoutSlider } from '../../features/settings/timeout-slider.js';
@@ -26,6 +26,11 @@ const EDITOR_OPTIONS = [
26
26
  { value: EditorType.Zed, label: 'Zed' },
27
27
  { value: EditorType.Antigravity, label: 'Antigravity' },
28
28
  ];
29
+ const SHELL_OPTIONS = [
30
+ { value: 'bash', label: 'Bash' },
31
+ { value: 'zsh', label: 'Zsh' },
32
+ { value: 'fish', label: 'Fish' },
33
+ ];
29
34
  const SECTIONS = [
30
35
  { id: 'agent', label: 'Agent', icon: Bot },
31
36
  { id: 'environment', label: 'Environment', icon: Terminal },
@@ -115,7 +120,7 @@ function SectionHint({ children, links, }) {
115
120
  return (_jsxs("div", { className: "hidden pt-2 lg:block", children: [_jsx("p", { className: "text-muted-foreground/70 text-[11px] leading-relaxed", children: children }), links != null && links.length > 0 ? (_jsx("div", { className: "mt-2 flex flex-col gap-1", children: links.map((link) => (_jsxs("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-[10px] transition-colors", children: [_jsx(ExternalLink, { className: "h-2.5 w-2.5" }), link.label] }, link.href))) })) : null] }));
116
121
  }
117
122
  /* ── Main component ── */
118
- export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
123
+ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTerminals, }) {
119
124
  const { showSaving, showSaved, save } = useSaveIndicator();
120
125
  const featureFlags = settings.featureFlags ?? { skills: false, envDeploy: false, debug: false };
121
126
  // Agent state
@@ -125,7 +130,12 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
125
130
  const [showToken, setShowToken] = useState(false);
126
131
  // Environment state
127
132
  const [editor, setEditor] = useState(settings.environment.defaultEditor);
128
- const shell = settings.environment.shellPreference;
133
+ const [shell, setShell] = useState(settings.environment.shellPreference);
134
+ const [terminal, setTerminal] = useState(settings.environment.terminalPreference ?? TerminalType.System);
135
+ // Filter to only show installed terminals
136
+ const terminalOptions = availableTerminals
137
+ ? availableTerminals.filter((t) => t.available)
138
+ : [{ id: TerminalType.System, name: 'System Terminal', available: true }];
129
139
  // Workflow state
130
140
  const [openPr, setOpenPr] = useState(settings.workflow.openPrOnImplementationComplete);
131
141
  const [pushOnComplete, setPushOnComplete] = useState(settings.workflow.approvalGateDefaults.pushOnImplementationComplete);
@@ -299,20 +309,42 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
299
309
  label: 'Configuration guide',
300
310
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
301
311
  },
302
- ], children: "Choose which AI coding agent powers your features. Each agent supports different models and capabilities. Authentication is resolved automatically via your active session." })] }), _jsxs("div", { id: "section-environment", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsx(SettingsSection, { icon: Terminal, title: "Environment", description: "Editor and shell preferences", testId: "environment-settings-section", children: _jsx(SettingsRow, { label: "Default Editor", description: "Editor launched for file operations", htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
303
- setEditor(v);
304
- save({
305
- environment: { defaultEditor: v, shellPreference: shell },
306
- });
307
- }, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => {
308
- const Icon = getEditorTypeIcon(opt.value);
309
- return (_jsx(SelectItem, { value: opt.value, children: _jsxs("span", { className: "flex items-center gap-2 text-xs", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), opt.label] }) }, opt.value));
310
- }) })] }) }) }), _jsx(SectionHint, { links: [
312
+ ], children: "Choose which AI coding agent powers your features. Each agent supports different models and capabilities. Authentication is resolved automatically via your active session." })] }), _jsxs("div", { id: "section-environment", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Terminal, title: "Environment", description: "Editor, shell, and terminal preferences", testId: "environment-settings-section", children: [_jsx(SettingsRow, { label: "Default Editor", description: "Editor launched for file operations", htmlFor: "default-editor", children: _jsxs(Select, { value: editor, onValueChange: (v) => {
313
+ setEditor(v);
314
+ save({
315
+ environment: {
316
+ defaultEditor: v,
317
+ shellPreference: shell,
318
+ terminalPreference: terminal,
319
+ },
320
+ });
321
+ }, children: [_jsx(SelectTrigger, { id: "default-editor", "data-testid": "editor-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: EDITOR_OPTIONS.map((opt) => {
322
+ const Icon = getEditorTypeIcon(opt.value);
323
+ return (_jsx(SelectItem, { value: opt.value, children: _jsxs("span", { className: "flex items-center gap-2 text-xs", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), opt.label] }) }, opt.value));
324
+ }) })] }) }), _jsx(SettingsRow, { label: "Shell", description: "Default shell for generated scripts", htmlFor: "shell-preference", children: _jsxs(Select, { value: shell, onValueChange: (v) => {
325
+ setShell(v);
326
+ save({
327
+ environment: {
328
+ defaultEditor: editor,
329
+ shellPreference: v,
330
+ terminalPreference: terminal,
331
+ },
332
+ });
333
+ }, children: [_jsx(SelectTrigger, { id: "shell-preference", "data-testid": "shell-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: SHELL_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) }), _jsx(SettingsRow, { label: "Terminal", description: "Terminal emulator for shell sessions", htmlFor: "terminal-preference", children: _jsxs(Select, { value: terminal, onValueChange: (v) => {
334
+ setTerminal(v);
335
+ save({
336
+ environment: {
337
+ defaultEditor: editor,
338
+ shellPreference: shell,
339
+ terminalPreference: v,
340
+ },
341
+ });
342
+ }, children: [_jsx(SelectTrigger, { id: "terminal-preference", "data-testid": "terminal-select", className: "w-55 cursor-pointer text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: terminalOptions.map((opt) => (_jsx(SelectItem, { value: opt.id, children: opt.name }, opt.id))) })] }) })] }), _jsx(SectionHint, { links: [
311
343
  {
312
344
  label: 'Configuration guide',
313
345
  href: 'https://github.com/shep-ai/cli/blob/main/docs/guides/configuration.md',
314
346
  },
315
- ], children: "Your preferred editor is used when opening files for review or editing during the development workflow." })] }), _jsxs("div", { id: "section-workflow", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: GitBranch, title: "Workflow", description: "Automation behavior after implementation", testId: "workflow-settings-section", children: [_jsx(SubsectionLabel, { children: "Approve" }), _jsx(SwitchRow, { label: "Auto-approve PRD", description: "Skip manual review of requirements", id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
347
+ ], children: "Your preferred editor opens files for review. The shell setting controls generated scripts. The terminal emulator is launched when opening shell sessions from the web UI." })] }), _jsxs("div", { id: "section-workflow", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: GitBranch, title: "Workflow", description: "Automation behavior after implementation", testId: "workflow-settings-section", children: [_jsx(SubsectionLabel, { children: "Approve" }), _jsx(SwitchRow, { label: "Auto-approve PRD", description: "Skip manual review of requirements", id: "allow-prd", testId: "switch-allow-prd", checked: allowPrd, onChange: (v) => {
316
348
  setAllowPrd(v);
317
349
  save(buildWorkflowPayload({ allowPrd: v }));
318
350
  } }), _jsx(SwitchRow, { label: "Auto-approve Plan", description: "Skip manual review of implementation plan", id: "allow-plan", testId: "switch-allow-plan", checked: allowPlan, onChange: (v) => {