@shepai/cli 1.98.0 → 1.99.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 (272) hide show
  1. package/apis/json-schema/Evidence.yaml +25 -0
  2. package/apis/json-schema/EvidenceType.yaml +9 -0
  3. package/apis/json-schema/WorkflowConfig.yaml +10 -0
  4. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  5. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +2 -0
  6. package/dist/packages/core/src/domain/generated/output.d.ts +39 -0
  7. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  8. package/dist/packages/core/src/domain/generated/output.js +7 -0
  9. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +2 -0
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +5 -0
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +14 -0
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +7 -3
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +12 -5
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.js +9 -8
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +18 -1
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +1 -1
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts +15 -0
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.d.ts.map +1 -0
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.js +48 -0
  25. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts +28 -0
  26. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -0
  27. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +98 -0
  28. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts.map +1 -1
  29. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +69 -1
  30. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +68 -3
  32. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +5 -1
  34. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +19 -0
  35. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -0
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +197 -0
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts +17 -1
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +72 -2
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +2 -1
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +5 -0
  43. package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
  44. package/dist/src/presentation/web/app/actions/get-merge-review-data.js +36 -3
  45. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +2 -0
  46. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
  47. package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +2 -0
  48. package/dist/src/presentation/web/app/api/evidence/route.d.ts +8 -0
  49. package/dist/src/presentation/web/app/api/evidence/route.d.ts.map +1 -0
  50. package/dist/src/presentation/web/app/api/evidence/route.js +50 -0
  51. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
  52. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +27 -3
  54. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +2 -0
  56. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +12 -0
  57. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +63 -3
  60. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +2 -0
  61. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +38 -0
  63. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +27 -5
  65. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts +1 -0
  66. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +14 -0
  68. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +6 -0
  70. package/dist/tsconfig.build.tsbuildinfo +1 -1
  71. package/package.json +1 -1
  72. package/web/.next/BUILD_ID +1 -1
  73. package/web/.next/app-path-routes-manifest.json +1 -0
  74. package/web/.next/build-manifest.json +2 -2
  75. package/web/.next/fallback-build-manifest.json +2 -2
  76. package/web/.next/prerender-manifest.json +3 -3
  77. package/web/.next/required-server-files.js +2 -2
  78. package/web/.next/required-server-files.json +2 -2
  79. package/web/.next/routes-manifest.json +6 -0
  80. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
  81. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
  85. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  86. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +25 -25
  89. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  90. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  91. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  93. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  94. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
  97. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  98. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  103. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +25 -25
  105. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  106. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  107. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
  109. package/web/.next/server/app/(dashboard)/page.js +1 -1
  110. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  113. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  114. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/_global-error/page.js +1 -1
  117. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  118. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/_global-error.html +2 -2
  120. package/web/.next/server/app/_global-error.rsc +1 -1
  121. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  123. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  124. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  125. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  126. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  127. package/web/.next/server/app/_not-found/page.js +1 -1
  128. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  129. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  130. package/web/.next/server/app/api/attachments/preview/route.js +1 -1
  131. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  132. package/web/.next/server/app/api/attachments/upload-from-path/route.js +1 -1
  133. package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -1
  134. package/web/.next/server/app/api/evidence/route/app-paths-manifest.json +3 -0
  135. package/web/.next/server/app/api/evidence/route/build-manifest.json +11 -0
  136. package/web/.next/server/app/api/evidence/route/server-reference-manifest.json +4 -0
  137. package/web/.next/server/app/api/evidence/route.js +7 -0
  138. package/web/.next/server/app/api/evidence/route.js.map +5 -0
  139. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -0
  140. package/web/.next/server/app/api/evidence/route_client-reference-manifest.js +2 -0
  141. package/web/.next/server/app/api/feature-logs/route.js +1 -1
  142. package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
  143. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  144. package/web/.next/server/app/settings/page.js +1 -1
  145. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  146. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  148. package/web/.next/server/app/skills/page.js +1 -1
  149. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  150. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  151. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  152. package/web/.next/server/app/tools/page.js +1 -1
  153. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  154. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  156. package/web/.next/server/app/version/page.js +1 -1
  157. package/web/.next/server/app/version/page.js.nft.json +1 -1
  158. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app-paths-manifest.json +1 -0
  160. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  161. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  162. package/web/.next/server/chunks/[root-of-the-server]__7d63f9a4._.js +3 -0
  163. package/web/.next/server/chunks/[root-of-the-server]__7d63f9a4._.js.map +1 -0
  164. package/web/.next/server/chunks/{[root-of-the-server]__52c318d1._.js → [root-of-the-server]__91d44424._.js} +2 -2
  165. package/web/.next/server/chunks/[root-of-the-server]__a1c7c02a._.js +3 -0
  166. package/web/.next/server/chunks/[root-of-the-server]__a1c7c02a._.js.map +1 -0
  167. package/web/.next/server/chunks/{[root-of-the-server]__a5879003._.js → [root-of-the-server]__db04ed44._.js} +2 -2
  168. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_evidence_route_actions_38aa6e60.js +3 -0
  169. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_evidence_route_actions_38aa6e60.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  171. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js +1 -1
  173. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_c757eb00.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js +1 -1
  175. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_7eb49631.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__19fb0bfe._.js +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__19fb0bfe._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d9536c4._.js → [root-of-the-server]__248ee887._.js} +2 -2
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__3d6f6b0e._.js +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__3d6f6b0e._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__42020c54._.js +1 -1
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__42020c54._.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +3 -0
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8210f45._.js → [root-of-the-server]__9bc1434f._.js} +2 -2
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__9cb60e1e._.js +1 -1
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__9cb60e1e._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -1
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f1a05100._.js → [root-of-the-server]__b062b383._.js} +2 -2
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  202. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/{_1718c38f._.js → _3fafea0f._.js} +2 -2
  205. package/web/.next/server/chunks/ssr/{_1718c38f._.js.map → _3fafea0f._.js.map} +1 -1
  206. package/web/.next/server/chunks/ssr/{_5e112f82._.js → _60e203af._.js} +2 -2
  207. package/web/.next/server/chunks/ssr/{_5e112f82._.js.map → _60e203af._.js.map} +1 -1
  208. package/web/.next/server/chunks/ssr/_6a83bd29._.js +3 -0
  209. package/web/.next/server/chunks/ssr/{7f428_lucide-react_dist_esm_icons_2b65878f._.js.map → _6a83bd29._.js.map} +1 -1
  210. package/web/.next/server/chunks/ssr/_6e08ce21._.js.map +1 -1
  211. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/{_17237ac7._.js → _cb93a788._.js} +2 -2
  214. package/web/.next/server/chunks/ssr/{_17237ac7._.js.map → _cb93a788._.js.map} +1 -1
  215. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  216. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/_eca4aa07._.js +3 -0
  218. package/web/.next/server/chunks/ssr/{_b6866f30._.js.map → _eca4aa07._.js.map} +1 -1
  219. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  220. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  221. package/web/.next/server/chunks/ssr/src_presentation_web_3c53a23d._.js +2 -2
  222. package/web/.next/server/chunks/ssr/src_presentation_web_3c53a23d._.js.map +1 -1
  223. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_befd865a.js.map +1 -1
  225. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  227. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  232. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  233. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_ec8c7a4f._.js +2 -2
  237. package/web/.next/server/chunks/ssr/src_presentation_web_ec8c7a4f._.js.map +1 -1
  238. package/web/.next/server/pages/500.html +2 -2
  239. package/web/.next/server/server-reference-manifest.js +1 -1
  240. package/web/.next/server/server-reference-manifest.json +30 -30
  241. package/web/.next/static/chunks/{d95cd4b81c8d7580.js → 133cef90b3975d8f.js} +1 -1
  242. package/web/.next/static/chunks/{9284ea43640fc469.js → 17c31f43cf41eda4.js} +1 -1
  243. package/web/.next/static/chunks/{3418f7926955f058.js → 24e64b7a634794ad.js} +1 -1
  244. package/web/.next/static/chunks/{feb21651203a4855.js → 356b41f959ceb6dc.js} +1 -1
  245. package/web/.next/static/chunks/{550b849dcc7c1df1.js → 43ac66e5699a245a.js} +1 -1
  246. package/web/.next/static/chunks/4d4019cbe85eaedc.css +1 -0
  247. package/web/.next/static/chunks/{550acf01d8003f3a.js → 6b3282453b0bdc6e.js} +1 -1
  248. package/web/.next/static/chunks/71f3fb72d47e709b.js +1 -0
  249. package/web/.next/static/chunks/761b0946d122beec.js +1 -0
  250. package/web/.next/static/chunks/{5dc83c75c3acefb3.js → d1f5da71a9abf369.js} +1 -1
  251. package/web/.next/static/chunks/{bd6df3bba696a007.js → e01c63f00ba7ec95.js} +2 -2
  252. package/web/.next/static/chunks/e24a024affc634d9.js +1 -0
  253. package/web/.next/static/chunks/e7d1e440160f9fc2.js +2 -0
  254. package/web/.next/server/chunks/[root-of-the-server]__0b10355c._.js +0 -3
  255. package/web/.next/server/chunks/[root-of-the-server]__0b10355c._.js.map +0 -1
  256. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_2b65878f._.js +0 -3
  257. package/web/.next/server/chunks/ssr/[root-of-the-server]__b65f78cf._.js +0 -3
  258. package/web/.next/server/chunks/ssr/_b6866f30._.js +0 -3
  259. package/web/.next/static/chunks/197b047efa3501c8.js +0 -1
  260. package/web/.next/static/chunks/71d785d1de4b86f6.css +0 -1
  261. package/web/.next/static/chunks/8a3eff27cccf331f.js +0 -1
  262. package/web/.next/static/chunks/8bd300e88a189928.js +0 -1
  263. package/web/.next/static/chunks/f7794f1941c8c867.js +0 -1
  264. /package/web/.next/server/chunks/{[root-of-the-server]__52c318d1._.js.map → [root-of-the-server]__91d44424._.js.map} +0 -0
  265. /package/web/.next/server/chunks/{[root-of-the-server]__a5879003._.js.map → [root-of-the-server]__db04ed44._.js.map} +0 -0
  266. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d9536c4._.js.map → [root-of-the-server]__248ee887._.js.map} +0 -0
  267. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__b65f78cf._.js.map → [root-of-the-server]__4af0afe0._.js.map} +0 -0
  268. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8210f45._.js.map → [root-of-the-server]__9bc1434f._.js.map} +0 -0
  269. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f1a05100._.js.map → [root-of-the-server]__b062b383._.js.map} +0 -0
  270. /package/web/.next/static/{HxY7oDPQaoJ0BmVeVLer5 → kPS64EVb81p_02U5q_c7b}/_buildManifest.js +0 -0
  271. /package/web/.next/static/{HxY7oDPQaoJ0BmVeVLer5 → kPS64EVb81p_02U5q_c7b}/_clientMiddlewareManifest.json +0 -0
  272. /package/web/.next/static/{HxY7oDPQaoJ0BmVeVLer5 → kPS64EVb81p_02U5q_c7b}/_ssgManifest.js +0 -0
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Evidence Phase Prompt
3
+ *
4
+ * Instructs the agent to capture visual and textual evidence
5
+ * (screenshots, test outputs, terminal recordings) proving that
6
+ * completed tasks work as expected. Evidence files are saved to the
7
+ * shep home folder (~/.shep/repos/<hash>/evidence/). When commitEvidence
8
+ * is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
9
+ * in the worktree. The agent outputs a structured JSON manifest of
10
+ * evidence records that the evidence-output-parser extracts for the
11
+ * graph state.
12
+ */
13
+ import type { FeatureAgentState } from '../../state.js';
14
+ export interface EvidencePromptOptions {
15
+ /** Whether to commit evidence to the worktree / feature branch */
16
+ commitEvidence: boolean;
17
+ }
18
+ export declare function buildEvidencePrompt(state: FeatureAgentState, options?: EvidencePromptOptions): string;
19
+ //# sourceMappingURL=evidence-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CA6LR"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Evidence Phase Prompt
3
+ *
4
+ * Instructs the agent to capture visual and textual evidence
5
+ * (screenshots, test outputs, terminal recordings) proving that
6
+ * completed tasks work as expected. Evidence files are saved to the
7
+ * shep home folder (~/.shep/repos/<hash>/evidence/). When commitEvidence
8
+ * is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
9
+ * in the worktree. The agent outputs a structured JSON manifest of
10
+ * evidence records that the evidence-output-parser extracts for the
11
+ * graph state.
12
+ */
13
+ import { join, dirname, relative } from 'node:path';
14
+ import { readSpecFile, buildCommitPushBlock } from '../node-helpers.js';
15
+ export function buildEvidencePrompt(state, options = { commitEvidence: false }) {
16
+ const specContent = readSpecFile(state.specDir, 'spec.yaml');
17
+ const tasksContent = readSpecFile(state.specDir, 'tasks.yaml');
18
+ const cwd = state.worktreePath || state.repositoryPath;
19
+ // Derive the shep home evidence directory from the worktree path.
20
+ // Worktree path is: ~/.shep/repos/<hash>/wt/<slug>
21
+ // Evidence path is: ~/.shep/repos/<hash>/evidence/<featureId>/
22
+ const repoHashDir = dirname(dirname(cwd)); // go up from wt/<slug>
23
+ const shepEvidenceDir = join(repoHashDir, 'evidence', state.featureId);
24
+ const specSection = specContent
25
+ ? `## Feature Specification (spec.yaml)
26
+
27
+ \`\`\`yaml
28
+ ${specContent}
29
+ \`\`\`
30
+ `
31
+ : `## Feature Context
32
+
33
+ Feature ID: ${state.featureId}
34
+ `;
35
+ const tasksSection = tasksContent
36
+ ? `## Task List (tasks.yaml)
37
+
38
+ \`\`\`yaml
39
+ ${tasksContent}
40
+ \`\`\`
41
+ `
42
+ : '';
43
+ // Relative spec dir path from worktree root (e.g., "specs/057-sidenav-feature-toggle")
44
+ const relativeSpecDir = relative(cwd, state.specDir);
45
+ const specEvidenceRelPath = `${relativeSpecDir}/evidence`;
46
+ const specEvidenceAbsPath = join(state.specDir, 'evidence');
47
+ const storageSection = options.commitEvidence
48
+ ? `## Evidence Storage
49
+
50
+ Save all evidence files to BOTH locations:
51
+
52
+ 1. **Shep home folder** (persistent local storage):
53
+ \`mkdir -p ${shepEvidenceDir}/\`
54
+ Save each file here first.
55
+
56
+ 2. **Spec folder** (for PR commit):
57
+ \`mkdir -p ${specEvidenceAbsPath}/\`
58
+ Copy each file here too.
59
+
60
+ 3. Use descriptive file names (e.g., \`homepage-screenshot.png\`, \`unit-test-results.txt\`)
61
+ 4. In the output JSON, use relative paths from the repo root (e.g., \`${specEvidenceRelPath}/homepage-screenshot.png\`)`
62
+ : `## Evidence Storage
63
+
64
+ Save all evidence files to the shep home folder:
65
+
66
+ 1. Create the directory if it does not exist: \`mkdir -p ${shepEvidenceDir}/\`
67
+ 2. Save each evidence file with a descriptive name (e.g., \`homepage-screenshot.png\`, \`unit-test-results.txt\`)
68
+ 3. In the output JSON, set relativePath to the absolute path in the shep home folder (e.g., \`${shepEvidenceDir}/homepage-screenshot.png\`)`;
69
+ const commitSection = options.commitEvidence
70
+ ? `\n${buildCommitPushBlock({
71
+ push: state.push,
72
+ files: [`${specEvidenceRelPath}/`],
73
+ commitHint: 'chore(agents): capture evidence for completed tasks',
74
+ })}`
75
+ : `\n## Git Operations
76
+
77
+ Do NOT commit or push any files. Evidence is stored locally only.`;
78
+ return `You are a senior software engineer performing the EVIDENCE COLLECTION phase of feature development.
79
+
80
+ Your goal is to capture visual and textual evidence proving that the implemented tasks work as expected.${options.commitEvidence ? ' This evidence will be embedded in the pull request body for reviewer verification.' : ' This evidence will be available for review locally.'}
81
+
82
+ ${specSection}
83
+ ${tasksSection}
84
+ ## Working Directory
85
+
86
+ ${cwd}
87
+
88
+ ## Evidence Capture Instructions
89
+
90
+ Review the completed tasks above and capture evidence for each.
91
+
92
+ ### MANDATORY Screenshot Rule
93
+
94
+ **If ANY task touches UI code (components, pages, views, styles, layouts, templates, JSX/TSX, HTML, CSS), you MUST capture at least one Screenshot.** This is non-negotiable. Changing a heading, button label, color, layout, or any visible element requires a screenshot proving the change renders correctly.
95
+
96
+ To capture screenshots:
97
+ 1. Install Playwright if not already available: \`npx playwright install chromium --with-deps 2>/dev/null || npx playwright install chromium\`
98
+ 2. Start the dev server in the background (e.g., \`npm run dev &\` or \`pnpm dev &\`)
99
+ 3. Wait for the server to be ready
100
+ 4. Use a Playwright script to navigate and screenshot:
101
+ \`\`\`bash
102
+ node -e "
103
+ const { chromium } = require('playwright');
104
+ (async () => {
105
+ const browser = await chromium.launch();
106
+ const page = await browser.newPage({ viewport: { width: 1280, height: 720 } });
107
+ await page.goto('http://localhost:PORT');
108
+ await page.waitForLoadState('networkidle');
109
+ await page.screenshot({ path: 'SCREENSHOT_PATH' });
110
+ await browser.close();
111
+ })();
112
+ "
113
+ \`\`\`
114
+ 5. Stop the dev server after capturing
115
+
116
+ If Playwright installation fails, try alternative approaches (e.g., \`npx puppeteer\`, \`curl\` for API responses). Only skip screenshots if ALL browser automation approaches fail — and in that case, explicitly note the failure reason in the evidence description.
117
+
118
+ ### Evidence by Task Type
119
+
120
+ - **UI/Web tasks**: You MUST take screenshots (see mandatory rule above). Also run and capture test output.
121
+ - **Backend/API tasks**: Run the relevant test suite and capture test output showing passing tests.
122
+ - **CLI tasks**: Run the CLI commands and capture terminal output demonstrating correct behavior.
123
+ - **Refactoring/Infrastructure tasks**: Capture test output or build output confirming no regressions.
124
+
125
+ ### Evidence Types
126
+
127
+ - **Screenshot** — Visual proof of UI or output state (PNG/JPEG). **Required for any UI change.**
128
+ - **Video** — Screen recording of a workflow or interaction (MP4/WebM)
129
+ - **TestOutput** — Test suite execution results (TXT)
130
+ - **TerminalRecording** — CLI command output capture (TXT)
131
+
132
+ ### Minimum Evidence Requirements
133
+
134
+ Your output MUST include:
135
+ 1. At least one **Screenshot** if any task modifies UI/visual code (components, styles, templates, markup)
136
+ 2. At least one **TestOutput** if the project has a test suite
137
+ 3. Do NOT output only TestOutput/TerminalRecording when the feature involves visible UI changes — screenshots are mandatory in that case
138
+
139
+ ${storageSection}
140
+
141
+ ## File Size Constraints
142
+
143
+ - Capture screenshots at standard resolution (1280x720 or similar) — do NOT use 4K or retina resolution
144
+ - Compress images where possible (use PNG for screenshots, JPEG for photos)
145
+ - Truncate test output and terminal recordings to the first 500 lines to avoid large files
146
+ - Keep individual evidence files under 500KB where possible
147
+
148
+ ## Sensitive Data Redaction
149
+
150
+ - Redact any API keys, tokens, passwords, or secrets visible in screenshots or terminal output
151
+ - Do NOT capture screenshots of authentication screens or settings pages showing sensitive credentials
152
+ - Strip environment variables containing sensitive values from test output before saving
153
+
154
+ ## Output Format
155
+
156
+ After capturing all evidence, output a JSON array of evidence records in a fenced code block. This is CRITICAL — the system parses this block to extract evidence metadata.
157
+
158
+ \`\`\`json
159
+ [
160
+ {
161
+ "type": "Screenshot",
162
+ "capturedAt": "2026-01-01T12:00:00Z",
163
+ "description": "Homepage showing new feature banner",
164
+ "relativePath": "${options.commitEvidence ? `${specEvidenceRelPath}/homepage-banner.png` : `${shepEvidenceDir}/homepage-banner.png`}",
165
+ "taskRef": "task-1"
166
+ },
167
+ {
168
+ "type": "TestOutput",
169
+ "capturedAt": "2026-01-01T12:01:00Z",
170
+ "description": "Unit test results — all 42 tests passing",
171
+ "relativePath": "${options.commitEvidence ? `${specEvidenceRelPath}/unit-test-results.txt` : `${shepEvidenceDir}/unit-test-results.txt`}",
172
+ "taskRef": "task-2"
173
+ }
174
+ ]
175
+ \`\`\`
176
+
177
+ Each evidence record must have:
178
+ - **type**: One of Screenshot, Video, TestOutput, TerminalRecording
179
+ - **capturedAt**: ISO 8601 timestamp of when the evidence was captured
180
+ - **description**: Human-readable description of what this evidence proves
181
+ - **relativePath**: ${options.commitEvidence ? `Path relative to the repo root (must start with \`${specEvidenceRelPath}/\`)` : `Absolute path in the shep home evidence folder (must start with \`${shepEvidenceDir}/\`)`}
182
+ - **taskRef**: (optional) Reference to the task ID this evidence proves
183
+
184
+ If no evidence can be captured (e.g., no UI to screenshot, no tests to run), output an empty JSON array:
185
+
186
+ \`\`\`json
187
+ []
188
+ \`\`\`
189
+
190
+ ## Constraints
191
+
192
+ - Capture evidence for completed tasks only — do NOT modify any implementation code
193
+ - Capture evidence that proves the feature works — prioritize screenshots for UI changes, test output for logic changes
194
+ - If a screenshot capture fails, document the failure reason in the evidence description and try alternative approaches before giving up
195
+ - Do NOT capture evidence for documentation-only changes or spec files
196
+ ${commitSection}`;
197
+ }
@@ -5,14 +5,30 @@
5
5
  * 1. buildCommitPushPrPrompt — commit (always), push (conditional), PR create (conditional)
6
6
  * 2. buildMergeSquashPrompt — merge/squash PR or branch
7
7
  */
8
+ import { type Evidence } from '../../../../../../domain/generated/output.js';
8
9
  import type { FeatureAgentState } from '../../state.js';
10
+ /**
11
+ * Parse a GitHub remote URL (HTTPS or SSH) into owner/repo.
12
+ * Returns null if the URL does not match a known GitHub format.
13
+ */
14
+ export declare function parseGitHubOwnerRepo(remoteUrl: string): {
15
+ owner: string;
16
+ repo: string;
17
+ } | null;
18
+ /**
19
+ * Build a markdown evidence section from evidence records.
20
+ * Returns empty string when no evidence is available.
21
+ * When branch and repoUrl are provided, image paths are converted to
22
+ * absolute raw.githubusercontent.com URLs for correct rendering in PR bodies.
23
+ */
24
+ export declare function formatEvidenceSection(evidence: Evidence[], branch?: string, repoUrl?: string): string;
9
25
  /**
10
26
  * Build a prompt for the commit + push + PR agent call.
11
27
  *
12
28
  * The agent always commits. Push and PR creation are conditional based
13
29
  * on state.push and state.openPr flags.
14
30
  */
15
- export declare function buildCommitPushPrPrompt(state: FeatureAgentState, branch: string, baseBranch: string): string;
31
+ export declare function buildCommitPushPrPrompt(state: FeatureAgentState, branch: string, baseBranch: string, repoUrl?: string): string;
16
32
  /**
17
33
  * Build a prompt for the CI watch/fix agent call.
18
34
  *
@@ -1 +1 @@
1
- {"version":3,"file":"merge-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAwCxD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CA+DR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,UAAQ,GAChB,MAAM,CAkER"}
1
+ {"version":3,"file":"merge-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAwCxD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAU9F;AAuCD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAAE,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAUR;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAmER;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,UAAQ,GAChB,MAAM,CAkER"}
@@ -6,6 +6,7 @@
6
6
  * 2. buildMergeSquashPrompt — merge/squash PR or branch
7
7
  */
8
8
  import yaml from 'js-yaml';
9
+ import { EvidenceType } from '../../../../../../domain/generated/output.js';
9
10
  import { readSpecFile } from '../node-helpers.js';
10
11
  /**
11
12
  * Extract merge-phase rejection feedback from spec.yaml.
@@ -42,17 +43,86 @@ ${olderSection}
42
43
  }
43
44
  return '';
44
45
  }
46
+ /**
47
+ * Parse a GitHub remote URL (HTTPS or SSH) into owner/repo.
48
+ * Returns null if the URL does not match a known GitHub format.
49
+ */
50
+ export function parseGitHubOwnerRepo(remoteUrl) {
51
+ // HTTPS: https://github.com/owner/repo.git or https://github.com/owner/repo
52
+ const httpsMatch = remoteUrl.match(/github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?$/);
53
+ if (httpsMatch)
54
+ return { owner: httpsMatch[1], repo: httpsMatch[2] };
55
+ // SSH: git@github.com:owner/repo.git or git@github.com:owner/repo
56
+ const sshMatch = remoteUrl.match(/github\.com:([^/]+)\/([^/.]+?)(?:\.git)?$/);
57
+ if (sshMatch)
58
+ return { owner: sshMatch[1], repo: sshMatch[2] };
59
+ return null;
60
+ }
61
+ /**
62
+ * Convert a relative evidence path to an absolute GitHub raw URL.
63
+ * Falls back to the relative path if repoUrl is unavailable or not a GitHub repo.
64
+ */
65
+ function toGitHubRawUrl(relativePath, branch, repoUrl) {
66
+ if (!repoUrl || !branch)
67
+ return relativePath;
68
+ const parsed = parseGitHubOwnerRepo(repoUrl);
69
+ if (!parsed)
70
+ return relativePath;
71
+ return `https://raw.githubusercontent.com/${parsed.owner}/${parsed.repo}/${branch}/${relativePath}`;
72
+ }
73
+ /**
74
+ * Format a single evidence record as GitHub-compatible markdown.
75
+ * When repoUrl and branch are provided, converts relative paths to
76
+ * absolute raw.githubusercontent.com URLs so images render in PR bodies.
77
+ */
78
+ function formatEvidenceItem(e, branch, repoUrl) {
79
+ const taskLine = e.taskRef ? ` (${e.taskRef})` : '';
80
+ const url = toGitHubRawUrl(e.relativePath, branch, repoUrl);
81
+ switch (e.type) {
82
+ case EvidenceType.Screenshot:
83
+ return `- **${e.description}**${taskLine}\n ![${e.description}](${url})`;
84
+ case EvidenceType.TestOutput:
85
+ return `- **${e.description}**${taskLine}\n See: \`${e.relativePath}\``;
86
+ case EvidenceType.Video:
87
+ return `- [${e.description}](${url})${taskLine}`;
88
+ case EvidenceType.TerminalRecording:
89
+ return `- [${e.description}](${url})${taskLine}`;
90
+ default:
91
+ return `- [${e.description}](${url})${taskLine}`;
92
+ }
93
+ }
94
+ /**
95
+ * Build a markdown evidence section from evidence records.
96
+ * Returns empty string when no evidence is available.
97
+ * When branch and repoUrl are provided, image paths are converted to
98
+ * absolute raw.githubusercontent.com URLs for correct rendering in PR bodies.
99
+ */
100
+ export function formatEvidenceSection(evidence, branch, repoUrl) {
101
+ if (!evidence || evidence.length === 0)
102
+ return '';
103
+ const items = evidence.map((e) => formatEvidenceItem(e, branch, repoUrl)).join('\n');
104
+ return `\n## Evidence
105
+
106
+ The following evidence was captured to prove task completion. Include this section in the PR body:
107
+
108
+ ${items}
109
+ `;
110
+ }
45
111
  /**
46
112
  * Build a prompt for the commit + push + PR agent call.
47
113
  *
48
114
  * The agent always commits. Push and PR creation are conditional based
49
115
  * on state.push and state.openPr flags.
50
116
  */
51
- export function buildCommitPushPrPrompt(state, branch, baseBranch) {
117
+ export function buildCommitPushPrPrompt(state, branch, baseBranch, repoUrl) {
52
118
  const specContent = readSpecFile(state.specDir, 'spec.yaml');
53
119
  const cwd = state.worktreePath || state.repositoryPath;
54
120
  const shouldPush = state.push || state.openPr;
55
121
  const rejectionSection = getMergeRejectionFeedback(specContent);
122
+ // Only include evidence in the PR body when commitEvidence is enabled
123
+ const evidenceSection = state.evidence?.length
124
+ ? formatEvidenceSection(state.evidence, branch, repoUrl)
125
+ : '';
56
126
  const steps = [];
57
127
  // Step 1: Commit (always)
58
128
  steps.push(`1. Review the current changes using \`git diff\` and \`git status\`
@@ -98,7 +168,7 @@ ${cwd}
98
168
  ## Instructions
99
169
 
100
170
  ${steps.join('\n')}
101
-
171
+ ${evidenceSection}
102
172
  ## Constraints
103
173
 
104
174
  - Write a meaningful conventional commit message derived from the actual diff — do NOT use generic messages
@@ -1,4 +1,4 @@
1
- import type { ApprovalGates, CiFixRecord } from '../../../../domain/generated/output.js';
1
+ import type { ApprovalGates, CiFixRecord, Evidence } from '../../../../domain/generated/output.js';
2
2
  /**
3
3
  * State annotation for the feature-agent graph.
4
4
  *
@@ -48,6 +48,7 @@ export declare const FeatureAgentAnnotation: import("@langchain/langgraph").Anno
48
48
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
49
49
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
50
50
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
51
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<Evidence[], Evidence[]>;
51
52
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
52
53
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<CiFixRecord[], CiFixRecord[]>;
53
54
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -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,MAAM,8BAA8B,CAAC;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFjC,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2FjC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,OAAO,sBAAsB,CAAC,KAAK,CAAC"}
@@ -79,6 +79,11 @@ export const FeatureAgentAnnotation = Annotation.Root({
79
79
  reducer: (_prev, next) => next,
80
80
  default: () => false,
81
81
  }),
82
+ // --- Evidence state ---
83
+ evidence: Annotation({
84
+ reducer: (prev, next) => [...prev, ...next],
85
+ default: () => [],
86
+ }),
82
87
  // --- CI watch/fix loop state ---
83
88
  ciFixAttempts: Annotation({
84
89
  reducer: (_prev, next) => next,
@@ -1 +1 @@
1
- {"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sDAAsD,CAAC;AAG5F,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAiD7F"}
1
+ {"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;AAG9D,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgF7F"}
@@ -1,4 +1,6 @@
1
1
  'use server';
2
+ import { readFileSync, existsSync } from 'node:fs';
3
+ import { join, dirname } from 'node:path';
2
4
  import { resolve } from '../../lib/server-container.js';
3
5
  import { computeWorktreePath } from '../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
4
6
  export async function getMergeReviewData(featureId) {
@@ -25,8 +27,33 @@ export async function getMergeReviewData(featureId) {
25
27
  (feature.repositoryPath && feature.branch
26
28
  ? computeWorktreePath(feature.repositoryPath, feature.branch)
27
29
  : null);
30
+ // Load evidence manifest (best-effort)
31
+ let evidence;
32
+ let evidenceBasePath;
33
+ if (worktreePath) {
34
+ try {
35
+ // Worktree path: ~/.shep/repos/<hash>/wt/<slug>
36
+ // Evidence manifest: ~/.shep/repos/<hash>/evidence/<featureId>/manifest.json
37
+ const repoHashDir = dirname(dirname(worktreePath));
38
+ const evidenceDir = join(repoHashDir, 'evidence', featureId);
39
+ const manifestPath = join(evidenceDir, 'manifest.json');
40
+ if (existsSync(manifestPath)) {
41
+ evidence = JSON.parse(readFileSync(manifestPath, 'utf-8'));
42
+ evidenceBasePath = worktreePath;
43
+ }
44
+ }
45
+ catch {
46
+ // Evidence unavailable — not critical
47
+ }
48
+ }
28
49
  if (!worktreePath) {
29
- return { pr, branch, warning: pr ? undefined : 'No PR or diff data available' };
50
+ return {
51
+ pr,
52
+ branch,
53
+ evidence,
54
+ evidenceBasePath,
55
+ warning: pr ? undefined : 'No PR or diff data available',
56
+ };
30
57
  }
31
58
  try {
32
59
  const gitPrService = resolve('IGitPrService');
@@ -34,10 +61,16 @@ export async function getMergeReviewData(featureId) {
34
61
  gitPrService.getPrDiffSummary(worktreePath, 'main'),
35
62
  gitPrService.getFileDiffs(worktreePath, 'main').catch(() => undefined),
36
63
  ]);
37
- return { pr, branch, diffSummary, fileDiffs };
64
+ return { pr, branch, diffSummary, fileDiffs, evidence, evidenceBasePath };
38
65
  }
39
66
  catch {
40
- return { pr, branch, warning: 'Diff statistics unavailable' };
67
+ return {
68
+ pr,
69
+ branch,
70
+ evidence,
71
+ evidenceBasePath,
72
+ warning: 'Diff statistics unavailable',
73
+ };
41
74
  }
42
75
  }
43
76
  catch (error) {
@@ -6,6 +6,8 @@ export interface WorkflowDefaults {
6
6
  };
7
7
  push: boolean;
8
8
  openPr: boolean;
9
+ enableEvidence: boolean;
10
+ commitEvidence: boolean;
9
11
  }
10
12
  export declare function getWorkflowDefaults(): Promise<WorkflowDefaults>;
11
13
  //# sourceMappingURL=get-workflow-defaults.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-workflow-defaults.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-workflow-defaults.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAarE"}
1
+ {"version":3,"file":"get-workflow-defaults.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-workflow-defaults.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAerE"}
@@ -11,5 +11,7 @@ export async function getWorkflowDefaults() {
11
11
  },
12
12
  push: workflow.approvalGateDefaults.pushOnImplementationComplete,
13
13
  openPr: workflow.openPrOnImplementationComplete,
14
+ enableEvidence: workflow.enableEvidence,
15
+ commitEvidence: workflow.commitEvidence,
14
16
  };
15
17
  }
@@ -0,0 +1,8 @@
1
+ import type { NextRequest } from 'next/server';
2
+ import { NextResponse } from 'next/server';
3
+ /**
4
+ * Serves evidence files from ~/.shep/repos/ directories.
5
+ * Security: only paths within SHEP_HOME/repos/ are allowed.
6
+ */
7
+ export declare function GET(request: NextRequest): Promise<NextResponse>;
8
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/evidence/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsB3C;;;GAGG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA6BrE"}
@@ -0,0 +1,50 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { readFile, stat } from 'fs/promises';
3
+ import { extname, resolve } from 'path';
4
+ import { getShepHomeDir } from '../../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
5
+ const MIME_MAP = {
6
+ '.png': 'image/png',
7
+ '.jpg': 'image/jpeg',
8
+ '.jpeg': 'image/jpeg',
9
+ '.gif': 'image/gif',
10
+ '.webp': 'image/webp',
11
+ '.svg': 'image/svg+xml',
12
+ '.bmp': 'image/bmp',
13
+ '.mp4': 'video/mp4',
14
+ '.webm': 'video/webm',
15
+ '.mov': 'video/quicktime',
16
+ '.txt': 'text/plain',
17
+ '.log': 'text/plain',
18
+ '.json': 'application/json',
19
+ '.cast': 'application/json',
20
+ };
21
+ /**
22
+ * Serves evidence files from ~/.shep/repos/ directories.
23
+ * Security: only paths within SHEP_HOME/repos/ are allowed.
24
+ */
25
+ export async function GET(request) {
26
+ const path = request.nextUrl.searchParams.get('path');
27
+ if (!path) {
28
+ return NextResponse.json({ error: 'Missing path parameter' }, { status: 400 });
29
+ }
30
+ const resolved = resolve(path);
31
+ const reposRoot = resolve(getShepHomeDir(), 'repos');
32
+ if (!resolved.startsWith(reposRoot)) {
33
+ return NextResponse.json({ error: 'Access denied' }, { status: 403 });
34
+ }
35
+ try {
36
+ await stat(resolved);
37
+ const buffer = await readFile(resolved);
38
+ const ext = extname(resolved).toLowerCase();
39
+ const contentType = MIME_MAP[ext] ?? 'application/octet-stream';
40
+ return new NextResponse(buffer, {
41
+ headers: {
42
+ 'Content-Type': contentType,
43
+ 'Cache-Control': 'private, max-age=3600',
44
+ },
45
+ });
46
+ }
47
+ catch {
48
+ return NextResponse.json({ error: 'File not found' }, { status: 404 });
49
+ }
50
+ }
@@ -25,6 +25,8 @@ export interface FeatureCreatePayload {
25
25
  };
26
26
  push: boolean;
27
27
  openPr: boolean;
28
+ enableEvidence: boolean;
29
+ commitEvidence: boolean;
28
30
  parentId?: string;
29
31
  /** When true, skip SDLC phases and implement directly from the prompt. */
30
32
  fast: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+ED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,EAAE,wBAAwB,2CAymB1B"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+ED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,EAAE,wBAAwB,2CA8rB1B"}