@shepai/cli 1.130.1 → 1.131.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 (230) hide show
  1. package/apis/json-schema/WorkflowConfig.yaml +5 -0
  2. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/agents/approve-agent-run.use-case.js +2 -2
  4. package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/agents/reject-agent-run.use-case.js +2 -2
  6. package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
  7. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +5 -0
  9. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +17 -0
  11. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts +52 -1
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.js +121 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts +6 -2
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +139 -75
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +19 -65
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +34 -3
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +31 -0
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +48 -2
  25. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.js +13 -0
  27. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +12 -0
  28. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
  29. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +50 -0
  30. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +13 -0
  32. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +13 -0
  34. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +13 -0
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.js +24 -1
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +1 -0
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +4 -0
  41. package/dist/src/presentation/cli/ui/output.js +2 -2
  42. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  43. package/dist/src/presentation/web/app/build-feature-node-data.js +2 -0
  44. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +2 -1
  46. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +1 -0
  47. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts +3 -1
  49. package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts +1 -1
  51. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts.map +1 -1
  52. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.js +2 -2
  53. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts +2 -0
  54. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +9 -0
  56. package/dist/tsconfig.build.tsbuildinfo +1 -1
  57. package/package.json +3 -3
  58. package/web/.next/BUILD_ID +1 -1
  59. package/web/.next/build-manifest.json +2 -2
  60. package/web/.next/fallback-build-manifest.json +2 -2
  61. package/web/.next/prerender-manifest.json +3 -3
  62. package/web/.next/required-server-files.js +2 -2
  63. package/web/.next/required-server-files.json +2 -2
  64. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +24 -24
  65. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
  66. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  67. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +24 -24
  69. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  70. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
  73. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  74. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +30 -30
  77. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  78. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
  81. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  82. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +24 -24
  85. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  86. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  87. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
  89. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  90. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  91. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +30 -30
  93. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  94. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +22 -22
  97. package/web/.next/server/app/(dashboard)/page.js +2 -2
  98. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
  101. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  102. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  103. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/_global-error.html +2 -2
  105. package/web/.next/server/app/_global-error.rsc +1 -1
  106. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  107. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  108. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  109. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  110. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  111. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  112. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/api/graph-data/route.js +1 -1
  114. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  115. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  116. package/web/.next/server/app/settings/page.js +1 -1
  117. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  118. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  120. package/web/.next/server/app/skills/page.js +1 -1
  121. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  122. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  124. package/web/.next/server/app/tools/page.js +1 -1
  125. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  126. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  127. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  128. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  130. package/web/.next/server/chunks/{[root-of-the-server]__d1dc8fcd._.js → [root-of-the-server]__c6e32a23._.js} +2 -2
  131. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -0
  132. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +1 -1
  134. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  136. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +1 -1
  138. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +1 -1
  140. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__2c791c42._.js +4 -0
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__2c791c42._.js.map +1 -0
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  144. package/web/.next/server/chunks/ssr/{[root-of-the-server]__84f72684._.js → [root-of-the-server]__3ef34e4c._.js} +3 -3
  145. package/web/.next/server/chunks/ssr/{[root-of-the-server]__84f72684._.js.map → [root-of-the-server]__3ef34e4c._.js.map} +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js +1 -1
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js +4 -0
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +1 -0
  158. package/web/.next/server/chunks/ssr/{[root-of-the-server]__57018345._.js → [root-of-the-server]__9c45d070._.js} +2 -2
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +1 -0
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  167. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/{_60d96b77._.js → _1ff3035b._.js} +2 -2
  169. package/web/.next/server/chunks/ssr/{_60d96b77._.js.map → _1ff3035b._.js.map} +1 -1
  170. package/web/.next/server/chunks/ssr/_4a4b4e1a._.js +3 -0
  171. package/web/.next/server/chunks/ssr/{_e44c1df8._.js.map → _4a4b4e1a._.js.map} +1 -1
  172. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  173. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  175. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  177. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  179. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  181. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/{src_presentation_web_1b00ce26._.js → src_presentation_web_1769b67a._.js} +2 -2
  183. package/web/.next/server/chunks/ssr/{src_presentation_web_1b00ce26._.js.map → src_presentation_web_1769b67a._.js.map} +1 -1
  184. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +2 -2
  185. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +1 -1
  187. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  189. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  191. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +2 -2
  193. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  195. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  197. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  198. package/web/.next/server/pages/500.html +2 -2
  199. package/web/.next/server/server-reference-manifest.js +1 -1
  200. package/web/.next/server/server-reference-manifest.json +38 -38
  201. package/web/.next/static/chunks/{6a528a033ae55794.js → 1e7aa4fc00db4d85.js} +2 -2
  202. package/web/.next/static/chunks/{ceefd537b2a82fb5.js → 24ab1a6841758200.js} +1 -1
  203. package/web/.next/static/chunks/{1553f15c07eb7745.js → 431ebee69d487093.js} +1 -1
  204. package/web/.next/static/chunks/46488328b6d76dcf.js +1 -0
  205. package/web/.next/static/chunks/554010ffa090b3cb.js +1 -0
  206. package/web/.next/static/chunks/{c5019bfe2884e088.js → 5541ee6e8c3dfbc0.js} +1 -1
  207. package/web/.next/static/chunks/5f401fd30f6e8a29.js +1 -0
  208. package/web/.next/static/chunks/665bc0be216c6374.js +1 -0
  209. package/web/.next/static/chunks/81e8a59652c53338.js +1 -0
  210. package/web/.next/static/chunks/a90d02d0338ca269.js +2 -0
  211. package/web/.next/static/chunks/{499fe813285eb6b6.js → bd5910aa46e4f7f8.js} +1 -1
  212. package/web/.next/static/chunks/{7e5b7a8ca6303e76.js → ecfe17fa09ff543e.js} +1 -1
  213. package/web/next.config.mjs +1 -1
  214. package/web/package.json +1 -1
  215. package/web/.next/server/chunks/[root-of-the-server]__d1dc8fcd._.js.map +0 -1
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__5142820f._.js +0 -4
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__5142820f._.js.map +0 -1
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__57018345._.js.map +0 -1
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__99ab2519._.js +0 -4
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__99ab2519._.js.map +0 -1
  221. package/web/.next/server/chunks/ssr/_e44c1df8._.js +0 -3
  222. package/web/.next/static/chunks/010e770e43094b0c.js +0 -1
  223. package/web/.next/static/chunks/2fc5168fdc6be797.js +0 -1
  224. package/web/.next/static/chunks/8057ebdc852674de.js +0 -2
  225. package/web/.next/static/chunks/ad8d9368ff2f152d.js +0 -1
  226. package/web/.next/static/chunks/c1bc8dbfa5d7fc35.js +0 -1
  227. package/web/.next/static/chunks/f3e3c98b0dbdb7c5.js +0 -1
  228. /package/web/.next/static/{JhvdO6haSso0T4F28qUg0 → fBDTRerkah3YOaOkhqEUT}/_buildManifest.js +0 -0
  229. /package/web/.next/static/{JhvdO6haSso0T4F28qUg0 → fBDTRerkah3YOaOkhqEUT}/_clientMiddlewareManifest.json +0 -0
  230. /package/web/.next/static/{JhvdO6haSso0T4F28qUg0 → fBDTRerkah3YOaOkhqEUT}/_ssgManifest.js +0 -0
@@ -208,3 +208,53 @@ If no evidence can be captured (e.g., no UI to screenshot, no tests to run), out
208
208
  - Do NOT capture evidence for documentation-only changes or spec files
209
209
  ${commitSection}`;
210
210
  }
211
+ function formatValidationErrors(errors) {
212
+ if (errors.length === 0)
213
+ return '';
214
+ const uiErrors = errors.filter((e) => e.type === 'ui');
215
+ const completenessErrors = errors.filter((e) => e.type === 'completeness');
216
+ const fileErrors = errors.filter((e) => e.type === 'fileExistence');
217
+ const sections = [];
218
+ if (uiErrors.length > 0) {
219
+ sections.push(`### Missing App-Level Screenshots\n\n${uiErrors.map((e) => `- ${e.message}`).join('\n')}`);
220
+ }
221
+ if (completenessErrors.length > 0) {
222
+ sections.push(`### Missing Evidence by Task Type\n\n${completenessErrors
223
+ .map((e) => `- ${e.message}`)
224
+ .join('\n')}`);
225
+ }
226
+ if (fileErrors.length > 0) {
227
+ sections.push(`### File Issues\n\n${fileErrors.map((e) => `- ${e.message}`).join('\n')}`);
228
+ }
229
+ return sections.join('\n\n');
230
+ }
231
+ /**
232
+ * Build a retry prompt for evidence collection that augments the base evidence
233
+ * prompt with structured validation feedback listing specific failures.
234
+ *
235
+ * Follows the repair.node.ts pattern of passing validation errors into the
236
+ * retry prompt so the agent can focus on fixing specific gaps rather than
237
+ * recollecting all evidence blindly.
238
+ *
239
+ * When errors is empty, returns the base prompt without a feedback section.
240
+ */
241
+ export function buildEvidenceRetryPrompt(state, errors, options = { commitEvidence: false }) {
242
+ const basePrompt = buildEvidencePrompt(state, options);
243
+ if (errors.length === 0)
244
+ return basePrompt;
245
+ const feedbackSection = `
246
+
247
+ ## VALIDATION FEEDBACK
248
+
249
+ The previous evidence collection attempt was insufficient. Address the following missing evidence. Focus ONLY on fixing the listed gaps — do NOT recollect evidence that was already captured successfully.
250
+
251
+ ${formatValidationErrors(errors)}
252
+
253
+ ### Instructions
254
+
255
+ - Review the issues above and capture the missing evidence
256
+ - Focus on the specific gaps listed — do not re-capture evidence that already exists
257
+ - Ensure new evidence files are saved to the correct paths
258
+ - Output ALL evidence records (both previously captured and newly captured) in the JSON output block`;
259
+ return basePrompt + feedbackSection;
260
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"plan.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA4MhE"}
1
+ {"version":3,"file":"plan.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAyNhE"}
@@ -190,6 +190,19 @@ You MUST write TWO files:
190
190
  Do NOT list individual tasks — the structured tasks array above is the source of truth.
191
191
  Instead, summarize the overall flow: "First we set up X, then wire Y, finally integrate Z.")
192
192
 
193
+ ## YAML Output Rules
194
+
195
+ **CRITICAL:** When writing YAML files, you MUST follow these rules to ensure valid YAML:
196
+
197
+ 1. **Wrap all string values in double quotes** — this prevents YAML parsing errors from special characters
198
+ 2. **Escape internal double quotes with backslash** — use \\" inside quoted strings
199
+ 3. **Use block scalars (\`|\`) for multi-line text** — this avoids escaping complexity
200
+
201
+ **Example (incorrect → correct):**
202
+ - ❌ \`description: it's a critical task\` → ✅ \`description: "it's a critical task"\` or \`description: |\\n it's a critical task\`
203
+ - ❌ \`title: Add "strict" validation\` → ✅ \`title: "Add \\"strict\\" validation"\`
204
+ - ❌ \`red: Write test that checks X\\nand Y\` → ✅ \`red: |\\n Write test that checks X\\n and Y\`
205
+
193
206
  ## Constraints
194
207
 
195
208
  - Write to BOTH ${state.specDir}/plan.yaml AND ${state.specDir}/tasks.yaml
@@ -1 +1 @@
1
- {"version":3,"file":"requirements.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAmLxE"}
1
+ {"version":3,"file":"requirements.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAgMxE"}
@@ -163,6 +163,19 @@ Write the COMPLETE file. Preserve name/number/branch/technologies from analysis
163
163
 
164
164
  (keep or update with requirements-informed reasoning)
165
165
 
166
+ ## YAML Output Rules
167
+
168
+ **CRITICAL:** When writing YAML files, you MUST follow these rules to ensure valid YAML:
169
+
170
+ 1. **Wrap all string values in double quotes** — this prevents YAML parsing errors from special characters
171
+ 2. **Escape internal double quotes with backslash** — use \\" inside quoted strings
172
+ 3. **Use block scalars (\`|\`) for multi-line text** — this avoids escaping complexity
173
+
174
+ **Example (incorrect → correct):**
175
+ - ❌ \`description: it's required\` → ✅ \`description: "it's required"\` or \`description: |\\n it's required\`
176
+ - ❌ \`rationale: must be "fast"\` → ✅ \`rationale: "must be \\"fast\\""\`
177
+ - ❌ \`content: line1\\nline2\` → ✅ \`content: |\\n line1\\n line2\`
178
+
166
179
  ## Constraints
167
180
 
168
181
  - Write ONLY to ${state.specDir}/spec.yaml
@@ -1 +1 @@
1
- {"version":3,"file":"research.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAsIpE"}
1
+ {"version":3,"file":"research.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAmJpE"}
@@ -123,6 +123,19 @@ Use this YAML structure:
123
123
 
124
124
  (how this fits into the existing codebase architecture)
125
125
 
126
+ ## YAML Output Rules
127
+
128
+ **CRITICAL:** When writing YAML files, you MUST follow these rules to ensure valid YAML:
129
+
130
+ 1. **Wrap all string values in double quotes** — this prevents YAML parsing errors from special characters
131
+ 2. **Escape internal double quotes with backslash** — use \\" inside quoted strings
132
+ 3. **Use block scalars (\`|\`) for multi-line text** — this avoids escaping complexity
133
+
134
+ **Example (incorrect → correct):**
135
+ - ❌ \`rationale: it's the best approach\` → ✅ \`rationale: "it's the best approach"\` or \`rationale: |\\n it's the best approach\`
136
+ - ❌ \`rejected: doesn't scale\` → ✅ \`rejected: "doesn't scale"\`
137
+ - ❌ \`description: use "strict" mode\` → ✅ \`description: "use \\"strict\\" mode"\`
138
+
126
139
  ## Constraints
127
140
 
128
141
  - Write ONLY to ${state.specDir}/research.yaml
@@ -1 +1 @@
1
- {"version":3,"file":"repair.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAGpG;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CA2BR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,QAAQ,EAAE,cAAc,GACvB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAwCnE"}
1
+ {"version":3,"file":"repair.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAGpG;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CAkDR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,QAAQ,EAAE,cAAc,GACvB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAwCnE"}
@@ -31,10 +31,33 @@ export function buildRepairPrompt(filename, content, errors, specDir) {
31
31
  '### Output Files',
32
32
  ...filePaths.map((p) => `- Write fixed YAML to: ${p}`),
33
33
  '',
34
+ '### YAML Escaping Rules',
35
+ '',
36
+ '**CRITICAL:** Follow these rules to ensure valid YAML:',
37
+ '',
38
+ '1. **Wrap all string values in double quotes** — prevents parsing errors from special characters',
39
+ '2. **Escape internal double quotes with backslash** — use \\\\" inside quoted strings',
40
+ '3. **Use block scalars (|) for multi-line text** — avoids escaping complexity',
41
+ '',
42
+ '### Examples (incorrect → correct):',
43
+ '',
44
+ '**Example 1: Unescaped quote in contraction**',
45
+ "- ❌ Before: text: it's broken",
46
+ '- ✅ After: text: "it\'s broken"',
47
+ '- ✅ Or use: text: | followed by indented text',
48
+ '',
49
+ '**Example 2: Unquoted string with special characters**',
50
+ '- ❌ Before: title: Add "strict" mode',
51
+ '- ✅ After: title: "Add \\\\"strict\\\\" mode"',
52
+ '',
53
+ '**Example 3: Multi-line content on single line**',
54
+ '- ❌ Before: description: First line then Second line',
55
+ '- ✅ After: description: | followed by indented multi-line text',
56
+ '',
34
57
  '### Rules',
35
58
  '- Fix ONLY the reported errors',
36
59
  '- Preserve all existing valid content',
37
- '- Use proper YAML formatting',
60
+ '- Use proper YAML formatting (apply escaping rules above)',
38
61
  '- Do not add fields that were not in the original',
39
62
  ].join('\n');
40
63
  }
@@ -49,6 +49,7 @@ export declare const FeatureAgentAnnotation: import("@langchain/langgraph").Anno
49
49
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
50
50
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
51
51
  evidence: import("@langchain/langgraph").BinaryOperatorAggregate<Evidence[], Evidence[]>;
52
+ evidenceRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
52
53
  resumeReason: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
53
54
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
54
55
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<CiFixRecord[], CiFixRecord[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgGjC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,OAAO,sBAAsB,CAAC,KAAK,CAAC"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoGjC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,OAAO,sBAAsB,CAAC,KAAK,CAAC"}
@@ -84,6 +84,10 @@ export const FeatureAgentAnnotation = Annotation.Root({
84
84
  reducer: (prev, next) => [...prev, ...next],
85
85
  default: () => [],
86
86
  }),
87
+ evidenceRetries: Annotation({
88
+ reducer: (_prev, next) => next,
89
+ default: () => 0,
90
+ }),
87
91
  // --- Resume context (set when resuming from error/crash/stop) ---
88
92
  resumeReason: Annotation({
89
93
  reducer: (_prev, next) => next ?? _prev,
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * @module output
10
10
  */
11
- import yaml from 'js-yaml';
11
+ import { safeYamlDump } from '../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js';
12
12
  import { TableFormatter } from './tables.js';
13
13
  /**
14
14
  * Output formatter for multiple formats
@@ -43,6 +43,6 @@ export class OutputFormatter {
43
43
  * Formats data as YAML
44
44
  */
45
45
  static formatAsYAML(data) {
46
- return yaml.dump(data, { indent: 2, lineWidth: -1 });
46
+ return safeYamlDump(data);
47
47
  }
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CAiDjB"}
1
+ {"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CAmDjB"}
@@ -1,6 +1,7 @@
1
1
  import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
2
2
  import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
3
3
  import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
4
+ import { computeWorktreePath } from '../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
4
5
  /**
5
6
  * Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
6
7
  * This is the single-feature version of the logic in `buildGraphNodes`.
@@ -16,6 +17,7 @@ export function buildFeatureNodeData(feature, run, options) {
16
17
  lifecycle: deriveLifecycle(feature, run),
17
18
  repositoryPath: feature.repositoryPath,
18
19
  branch: feature.branch,
20
+ worktreePath: feature.worktreePath ?? computeWorktreePath(feature.repositoryPath, feature.branch),
19
21
  specPath: feature.specPath,
20
22
  state: deriveNodeState(feature, run, pidAlive !== undefined ? { isPidAlive: pidAlive } : undefined),
21
23
  progress: deriveProgress(feature),
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CA8lB1F"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAgmB1F"}
@@ -321,6 +321,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
321
321
  ? {
322
322
  repositoryPath: featureNode.repositoryPath,
323
323
  branch: featureNode.branch,
324
+ worktreePath: featureNode.worktreePath,
324
325
  specPath: featureNode.specPath,
325
326
  }
326
327
  : null;
@@ -352,7 +353,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
352
353
  const repoName = featureNode.repositoryName ??
353
354
  featureNode.repositoryPath.split('/').filter(Boolean).at(-1) ??
354
355
  '';
355
- header = (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: featureNode.name }), repoName ? (_jsxs("div", { className: "flex items-center gap-1.5 pt-0.5", children: [_jsx(Code2, { className: "text-muted-foreground size-3.5 shrink-0" }), featureNode.remoteUrl ? (_jsxs("a", { href: featureNode.remoteUrl, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors", "data-testid": "feature-drawer-repo-link", children: [repoName, _jsx(ExternalLink, { className: "size-3" })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: repoName }))] })) : null, _jsx(DrawerDescription, { className: "sr-only", children: featureNode.name })] }), featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-2", "data-testid": "feature-drawer-actions", children: [_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, showSpecs: !!featureActionsInput.specPath }), featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [_jsx("code", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs", children: shortId }), _jsx("button", { type: "button", onClick: handleCopyId, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors", "aria-label": "Copy feature ID", "data-testid": "feature-drawer-copy-id", children: idCopied ? (_jsx(Check, { className: "size-3.5 text-green-600" })) : (_jsx(Copy, { className: "size-3.5" })) })] }), featureNode.featureId ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Delete feature", disabled: isDeleting, className: "text-muted-foreground hover:text-destructive", "data-testid": "feature-drawer-delete", onClick: () => setDeleteDialogOpen(true), children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }), _jsx(DeleteFeatureDialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, onConfirm: (cleanup, cascadeDelete, closePr) => handleDelete(featureNode.featureId, cleanup, cascadeDelete, closePr), isDeleting: isDeleting, featureName: featureNode.name, featureId: featureNode.featureId, hasChildren: featureNode.hasChildren, hasOpenPr: !!featureNode.pr && featureNode.pr.status === 'Open' })] })) : null] })) : null] }));
356
+ header = (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: featureNode.name }), repoName ? (_jsxs("div", { className: "flex items-center gap-1.5 pt-0.5", children: [_jsx(Code2, { className: "text-muted-foreground size-3.5 shrink-0" }), featureNode.remoteUrl ? (_jsxs("a", { href: featureNode.remoteUrl, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors", "data-testid": "feature-drawer-repo-link", children: [repoName, _jsx(ExternalLink, { className: "size-3" })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: repoName }))] })) : null, _jsx(DrawerDescription, { className: "sr-only", children: featureNode.name })] }), featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-2", "data-testid": "feature-drawer-actions", children: [_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, worktreePath: featureActionsInput.worktreePath, showSpecs: !!featureActionsInput.specPath }), featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [_jsx("code", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs", children: shortId }), _jsx("button", { type: "button", onClick: handleCopyId, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors", "aria-label": "Copy feature ID", "data-testid": "feature-drawer-copy-id", children: idCopied ? (_jsx(Check, { className: "size-3.5 text-green-600" })) : (_jsx(Copy, { className: "size-3.5" })) })] }), featureNode.featureId ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Delete feature", disabled: isDeleting, className: "text-muted-foreground hover:text-destructive", "data-testid": "feature-drawer-delete", onClick: () => setDeleteDialogOpen(true), children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }), _jsx(DeleteFeatureDialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, onConfirm: (cleanup, cascadeDelete, closePr) => handleDelete(featureNode.featureId, cleanup, cascadeDelete, closePr), isDeleting: isDeleting, featureName: featureNode.name, featureId: featureNode.featureId, hasChildren: featureNode.hasChildren, hasOpenPr: !!featureNode.pr && featureNode.pr.status === 'Open' })] })) : null] })) : null] }));
356
357
  }
357
358
  // ── Body ──────────────────────────────────────────────────────────────
358
359
  let body = null;
@@ -1,6 +1,7 @@
1
1
  export interface FeatureActionsInput {
2
2
  repositoryPath: string;
3
3
  branch: string;
4
+ worktreePath?: string;
4
5
  specPath?: string;
5
6
  }
6
7
  export interface FeatureActionsState {
@@ -1 +1 @@
1
- {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA8GxF"}
1
+ {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA8GxF"}
@@ -2,8 +2,10 @@ import type { FeatureActionsState } from '../../common/feature-drawer/use-featur
2
2
  export interface OpenActionMenuProps {
3
3
  /** Actions returned by useFeatureActions hook */
4
4
  actions: FeatureActionsState;
5
- /** Absolute path to copy (repository path or spec path) */
5
+ /** Absolute path to the repository */
6
6
  repositoryPath: string;
7
+ /** Absolute path to the git worktree for this feature (preferred for copy) */
8
+ worktreePath?: string;
7
9
  /** Whether to show the "Open Specs" item */
8
10
  showSpecs?: boolean;
9
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/open-action-menu/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AAElG,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/open-action-menu/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AAElG,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
@@ -1,3 +1,3 @@
1
1
  import type { OpenActionMenuProps } from './config.js';
2
- export declare function OpenActionMenu({ actions, repositoryPath, showSpecs }: OpenActionMenuProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function OpenActionMenu({ actions, repositoryPath, worktreePath, showSpecs, }: OpenActionMenuProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=open-action-menu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"open-action-menu.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/open-action-menu/open-action-menu.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAIpD,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,EAAE,mBAAmB,2CAoFzF"}
1
+ {"version":3,"file":"open-action-menu.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/open-action-menu/open-action-menu.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAIpD,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,cAAc,EACd,YAAY,EACZ,SAAS,GACV,EAAE,mBAAmB,2CAoFrB"}
@@ -5,10 +5,10 @@ import { Code2, Terminal, FolderOpen, ChevronDown, Copy, Check, Loader2, CircleA
5
5
  import { Button } from '../../ui/button.js';
6
6
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '../../ui/dropdown-menu.js';
7
7
  const COPY_FEEDBACK_DELAY = 2000;
8
- export function OpenActionMenu({ actions, repositoryPath, showSpecs }) {
8
+ export function OpenActionMenu({ actions, repositoryPath, worktreePath, showSpecs, }) {
9
9
  const [copied, setCopied] = useState(false);
10
10
  const handleCopyPath = () => {
11
- void navigator.clipboard.writeText(repositoryPath);
11
+ void navigator.clipboard.writeText(worktreePath ?? repositoryPath);
12
12
  setCopied(true);
13
13
  setTimeout(() => setCopied(false), COPY_FEEDBACK_DELAY);
14
14
  };
@@ -11,4 +11,6 @@ export declare const WithoutSpecs: Story;
11
11
  export declare const Loading: Story;
12
12
  /** Menu with an error on the IDE action. */
13
13
  export declare const WithError: Story;
14
+ /** Menu with a worktree path — Copy path copies the worktree path. */
15
+ export declare const WithWorktreePath: Story;
14
16
  //# sourceMappingURL=open-action-menu.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"open-action-menu.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/open-action-menu/open-action-menu.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAepD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAOrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;AAE7C,4DAA4D;AAC5D,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC"}
1
+ {"version":3,"file":"open-action-menu.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/open-action-menu/open-action-menu.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAepD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAOrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,cAAc,CAAC,CAAC;AAE7C,4DAA4D;AAC5D,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC"}
@@ -52,3 +52,12 @@ export const WithError = {
52
52
  showSpecs: true,
53
53
  },
54
54
  };
55
+ /** Menu with a worktree path — Copy path copies the worktree path. */
56
+ export const WithWorktreePath = {
57
+ args: {
58
+ actions: defaultActions,
59
+ repositoryPath: '/Users/dev/my-project',
60
+ worktreePath: '/Users/dev/my-project/.worktrees/feature-add-login',
61
+ showSpecs: true,
62
+ },
63
+ };