@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
@@ -14,7 +14,7 @@ export interface FeatureAgentGraphDeps {
14
14
  * Factory function that creates and compiles the feature-agent LangGraph.
15
15
  *
16
16
  * The graph defines a linear SDLC workflow with validation gates:
17
- * analyze → validate → requirements → validate → research → validate → plan → validate → implement → merge
17
+ * analyze → validate → requirements → validate → research → validate → plan → validate → implement (+ evidence sub-agent) → merge
18
18
  *
19
19
  * Each YAML-producing node is followed by a validate/repair loop that ensures
20
20
  * the output YAML conforms to its schema before proceeding.
@@ -45,6 +45,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
45
45
  ciStatus: string | null;
46
46
  push: boolean;
47
47
  openPr: boolean;
48
+ evidence: import("../../../../domain/index.js").Evidence[];
48
49
  ciFixAttempts: number;
49
50
  ciFixHistory: import("../../../../domain/index.js").CiFixRecord[];
50
51
  ciFixStatus: "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted";
@@ -70,6 +71,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
70
71
  ciStatus?: string | null | undefined;
71
72
  push?: boolean | undefined;
72
73
  openPr?: boolean | undefined;
74
+ evidence?: import("../../../../domain/index.js").Evidence[] | undefined;
73
75
  ciFixAttempts?: number | undefined;
74
76
  ciFixHistory?: import("../../../../domain/index.js").CiFixRecord[] | undefined;
75
77
  ciFixStatus?: "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted" | undefined;
@@ -115,6 +117,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
115
117
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
116
118
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
117
119
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
120
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
118
121
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
119
122
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
120
123
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -160,6 +163,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
160
163
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
161
164
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
162
165
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
166
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
163
167
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
164
168
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
165
169
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -206,6 +210,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
206
210
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
207
211
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
208
212
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
213
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
209
214
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
210
215
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
211
216
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -252,6 +257,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
252
257
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
253
258
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
254
259
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
260
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
255
261
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
256
262
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
257
263
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -298,6 +304,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
298
304
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
299
305
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
300
306
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
307
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
301
308
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
302
309
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
303
310
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -344,6 +351,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
344
351
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
345
352
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
346
353
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
354
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
347
355
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
348
356
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
349
357
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -390,6 +398,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
390
398
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
391
399
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
392
400
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
401
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
393
402
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
394
403
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
395
404
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -436,6 +445,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
436
445
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
437
446
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
438
447
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
448
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
439
449
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
440
450
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
441
451
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -482,6 +492,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
482
492
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
483
493
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
484
494
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
495
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
485
496
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
486
497
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
487
498
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -528,6 +539,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
528
539
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
529
540
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
530
541
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
542
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
531
543
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
532
544
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
533
545
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -574,6 +586,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
574
586
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
575
587
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
576
588
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
589
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
577
590
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
578
591
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
579
592
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -620,6 +633,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
620
633
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
621
634
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
622
635
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
636
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
623
637
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
624
638
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
625
639
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -666,6 +680,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
666
680
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
667
681
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
668
682
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
683
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
669
684
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
670
685
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
671
686
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -712,6 +727,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
712
727
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
713
728
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
714
729
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
730
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
715
731
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
716
732
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
717
733
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -758,6 +774,7 @@ export declare function createFeatureAgentGraph(depsOrExecutor: FeatureAgentGrap
758
774
  ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
759
775
  push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
760
776
  openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
777
+ evidence: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").Evidence[], import("../../../../domain/index.js").Evidence[]>;
761
778
  ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
762
779
  ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
763
780
  ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAOpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AASlF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AAyHD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwEnC"}
1
+ {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAOpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AASlF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AAyHD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwEnC"}
@@ -123,7 +123,7 @@ function createPlanTasksValidator() {
123
123
  * Factory function that creates and compiles the feature-agent LangGraph.
124
124
  *
125
125
  * The graph defines a linear SDLC workflow with validation gates:
126
- * analyze → validate → requirements → validate → research → validate → plan → validate → implement → merge
126
+ * analyze → validate → requirements → validate → research → validate → plan → validate → implement (+ evidence sub-agent) → merge
127
127
  *
128
128
  * Each YAML-producing node is followed by a validate/repair loop that ensures
129
129
  * the output YAML conforms to its schema before proceeding.
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Evidence Output Parser
3
+ *
4
+ * Extracts structured Evidence records from free-form agent text output.
5
+ * Looks for a fenced JSON code block containing an array of evidence objects.
6
+ * Returns empty array gracefully on any parsing failure.
7
+ */
8
+ import type { Evidence } from '../../../../../domain/generated/output.js';
9
+ /**
10
+ * Extract Evidence records from agent text output.
11
+ * Looks for a fenced JSON code block containing a JSON array of evidence objects.
12
+ * Returns empty array when no block found, JSON is malformed, or no valid records exist.
13
+ */
14
+ export declare function parseEvidenceRecords(output: string): Evidence[];
15
+ //# sourceMappingURL=evidence-output-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-output-parser.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence-output-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2CAA2C,CAAC;AAwB1E;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAc/D"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Evidence Output Parser
3
+ *
4
+ * Extracts structured Evidence records from free-form agent text output.
5
+ * Looks for a fenced JSON code block containing an array of evidence objects.
6
+ * Returns empty array gracefully on any parsing failure.
7
+ */
8
+ import { EvidenceType } from '../../../../../domain/generated/output.js';
9
+ // Matches a fenced JSON code block: ```json ... ```
10
+ const JSON_BLOCK_RE = /```json\s*\n([\s\S]*?)\n\s*```/;
11
+ const VALID_EVIDENCE_TYPES = new Set(Object.values(EvidenceType));
12
+ function isValidRecord(record) {
13
+ if (record === null || typeof record !== 'object')
14
+ return false;
15
+ const r = record;
16
+ if (typeof r.type !== 'string' || !VALID_EVIDENCE_TYPES.has(r.type))
17
+ return false;
18
+ if (typeof r.capturedAt !== 'string')
19
+ return false;
20
+ if (typeof r.description !== 'string')
21
+ return false;
22
+ if (typeof r.relativePath !== 'string')
23
+ return false;
24
+ // Block path traversal
25
+ if (r.relativePath.includes('..'))
26
+ return false;
27
+ return true;
28
+ }
29
+ /**
30
+ * Extract Evidence records from agent text output.
31
+ * Looks for a fenced JSON code block containing a JSON array of evidence objects.
32
+ * Returns empty array when no block found, JSON is malformed, or no valid records exist.
33
+ */
34
+ export function parseEvidenceRecords(output) {
35
+ const match = output.match(JSON_BLOCK_RE);
36
+ if (!match)
37
+ return [];
38
+ let parsed;
39
+ try {
40
+ parsed = JSON.parse(match[1]);
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ if (!Array.isArray(parsed))
46
+ return [];
47
+ return parsed.filter(isValidRecord);
48
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Evidence Node — Agent-Directed Evidence Collection
3
+ *
4
+ * Captures visual and textual evidence (screenshots, test outputs,
5
+ * terminal recordings) proving that implemented tasks work as expected.
6
+ * Evidence files are committed to .shep/evidence/ on the feature branch
7
+ * and evidence records flow through graph state to the merge node for
8
+ * inclusion in the PR body.
9
+ *
10
+ * Uses a custom node pattern (not executeNode) because it needs a
11
+ * post-execution parsing step to extract Evidence[] from the agent's
12
+ * text output via parseEvidenceRecords. Reuses the same helpers as
13
+ * other nodes (createNodeLogger, buildExecutorOptions, retryExecute,
14
+ * getCompletedPhases, markPhaseComplete).
15
+ *
16
+ * Graceful degradation (FR-8): parse failures return empty evidence
17
+ * array and log a warning. Evidence failures never block the merge.
18
+ */
19
+ import type { IAgentExecutor } from '../../../../../application/ports/output/agents/agent-executor.interface.js';
20
+ import type { FeatureAgentState } from '../state.js';
21
+ /**
22
+ * Factory that creates the evidence collection node function.
23
+ *
24
+ * @param executor - Agent executor for running the evidence capture prompt
25
+ * @returns A LangGraph node function
26
+ */
27
+ export declare function createEvidenceNode(executor: IAgentExecutor): (state: FeatureAgentState) => Promise<Partial<FeatureAgentState>>;
28
+ //# sourceMappingURL=evidence.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAEpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAerD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,IAG3C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAsE7E"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Evidence Node — Agent-Directed Evidence Collection
3
+ *
4
+ * Captures visual and textual evidence (screenshots, test outputs,
5
+ * terminal recordings) proving that implemented tasks work as expected.
6
+ * Evidence files are committed to .shep/evidence/ on the feature branch
7
+ * and evidence records flow through graph state to the merge node for
8
+ * inclusion in the PR body.
9
+ *
10
+ * Uses a custom node pattern (not executeNode) because it needs a
11
+ * post-execution parsing step to extract Evidence[] from the agent's
12
+ * text output via parseEvidenceRecords. Reuses the same helpers as
13
+ * other nodes (createNodeLogger, buildExecutorOptions, retryExecute,
14
+ * getCompletedPhases, markPhaseComplete).
15
+ *
16
+ * Graceful degradation (FR-8): parse failures return empty evidence
17
+ * array and log a warning. Evidence failures never block the merge.
18
+ */
19
+ import { isGraphBubbleUp } from '@langchain/langgraph';
20
+ import { createNodeLogger, getCompletedPhases, markPhaseComplete, retryExecute, buildExecutorOptions, } from './node-helpers.js';
21
+ import { reportNodeStart } from '../heartbeat.js';
22
+ import { recordPhaseStart, recordPhaseEnd } from '../phase-timing-context.js';
23
+ import { updateNodeLifecycle } from '../lifecycle-context.js';
24
+ import { buildEvidencePrompt } from './prompts/evidence-prompts.js';
25
+ import { parseEvidenceRecords } from './evidence-output-parser.js';
26
+ import { hasSettings, getSettings } from '../../../settings.service.js';
27
+ /**
28
+ * Factory that creates the evidence collection node function.
29
+ *
30
+ * @param executor - Agent executor for running the evidence capture prompt
31
+ * @returns A LangGraph node function
32
+ */
33
+ export function createEvidenceNode(executor) {
34
+ const log = createNodeLogger('evidence');
35
+ return async (state) => {
36
+ log.info('Starting evidence collection');
37
+ reportNodeStart('evidence');
38
+ await updateNodeLifecycle('evidence');
39
+ // --- Resume support: skip if already completed ---
40
+ const completedPhases = getCompletedPhases(state.specDir);
41
+ if (completedPhases.includes('evidence')) {
42
+ log.info('Evidence phase already completed, skipping execution');
43
+ return {
44
+ currentNode: 'evidence',
45
+ messages: ['[evidence] Already completed — skipping'],
46
+ _needsReexecution: false,
47
+ };
48
+ }
49
+ const startTime = Date.now();
50
+ const timingId = await recordPhaseStart('evidence');
51
+ try {
52
+ const commitEvidence = hasSettings() && getSettings().workflow.commitEvidence;
53
+ const prompt = buildEvidencePrompt(state, { commitEvidence });
54
+ const options = buildExecutorOptions(state);
55
+ log.info(`Executing agent at cwd=${options.cwd}`);
56
+ log.info(`Prompt length: ${prompt.length} chars`);
57
+ const result = await retryExecute(executor, prompt, options, { logger: log });
58
+ const durationMs = Date.now() - startTime;
59
+ const elapsed = (durationMs / 1000).toFixed(1);
60
+ log.info(`Agent complete (${result.result.length} chars, ${elapsed}s)`);
61
+ // --- Parse evidence records from agent output (graceful degradation) ---
62
+ let evidence;
63
+ try {
64
+ evidence = parseEvidenceRecords(result.result);
65
+ log.info(`Parsed ${evidence.length} evidence record(s)`);
66
+ }
67
+ catch (parseErr) {
68
+ const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);
69
+ log.error(`Warning: evidence parsing failed: ${msg} — continuing with empty evidence`);
70
+ evidence = [];
71
+ }
72
+ await recordPhaseEnd(timingId, durationMs);
73
+ markPhaseComplete(state.specDir, 'evidence', log);
74
+ return {
75
+ currentNode: 'evidence',
76
+ evidence,
77
+ messages: [
78
+ `[evidence] Complete — ${evidence.length} evidence record(s) captured (${elapsed}s)`,
79
+ ...(evidence.length === 0
80
+ ? ['[evidence] Warning: no evidence records parsed from agent output']
81
+ : []),
82
+ ],
83
+ _needsReexecution: false,
84
+ };
85
+ }
86
+ catch (err) {
87
+ // Re-throw LangGraph control-flow exceptions (interrupt, Command, etc.)
88
+ if (isGraphBubbleUp(err))
89
+ throw err;
90
+ const message = err instanceof Error ? err.message : String(err);
91
+ const durationMs = Date.now() - startTime;
92
+ const elapsed = (durationMs / 1000).toFixed(1);
93
+ log.error(`Evidence collection failed: ${message} (${elapsed}s)`);
94
+ await recordPhaseEnd(timingId, durationMs);
95
+ throw new Error(`[evidence] ${message}`);
96
+ }
97
+ };
98
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"fast-implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAOrD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,IAGhD,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAwC7E"}
1
+ {"version":3,"file":"fast-implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAEpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,IAGhD,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAmD7E"}
@@ -9,12 +9,17 @@
9
9
  * Follows the same factory pattern as other nodes: takes executor
10
10
  * dependency, returns async (state) => Partial<FeatureAgentState>.
11
11
  */
12
+ import { mkdirSync, writeFileSync } from 'node:fs';
13
+ import { join, dirname } from 'node:path';
12
14
  import { isGraphBubbleUp } from '@langchain/langgraph';
13
15
  import { createNodeLogger, buildExecutorOptions, retryExecute } from './node-helpers.js';
14
16
  import { reportNodeStart } from '../heartbeat.js';
15
17
  import { recordPhaseStart, recordPhaseEnd } from '../phase-timing-context.js';
16
18
  import { updateNodeLifecycle } from '../lifecycle-context.js';
17
19
  import { buildFastImplementPrompt } from './prompts/fast-implement.prompt.js';
20
+ import { buildEvidencePrompt } from './prompts/evidence-prompts.js';
21
+ import { parseEvidenceRecords } from './evidence-output-parser.js';
22
+ import { hasSettings, getSettings } from '../../../settings.service.js';
18
23
  /**
19
24
  * Factory that creates the fast-implement node function.
20
25
  *
@@ -38,10 +43,20 @@ export function createFastImplementNode(executor) {
38
43
  const durationMs = Date.now() - startTime;
39
44
  const elapsed = (durationMs / 1000).toFixed(1);
40
45
  log.info(`Complete (${result.result.length} chars, ${elapsed}s)`);
46
+ // --- Evidence sub-agent: capture proof of completion (settings-gated) ---
47
+ const evidenceEnabled = hasSettings() && getSettings().workflow.enableEvidence;
48
+ const evidence = evidenceEnabled ? await collectEvidence(executor, state, log) : [];
49
+ if (!evidenceEnabled) {
50
+ log.info('Evidence collection disabled via settings — skipping');
51
+ }
41
52
  await recordPhaseEnd(timingId, durationMs);
42
53
  return {
43
54
  currentNode: 'fast-implement',
44
- messages: [`[fast-implement] Complete (${result.result.length} chars, ${elapsed}s)`],
55
+ evidence,
56
+ messages: [
57
+ `[fast-implement] Complete (${result.result.length} chars, ${elapsed}s)`,
58
+ `[fast-implement] Evidence: ${evidence.length} record(s) captured`,
59
+ ],
45
60
  _needsReexecution: false,
46
61
  };
47
62
  }
@@ -58,3 +73,56 @@ export function createFastImplementNode(executor) {
58
73
  }
59
74
  };
60
75
  }
76
+ /**
77
+ * Sub-agent call to collect evidence after fast implementation completes.
78
+ * Graceful degradation: returns empty array on any failure so evidence
79
+ * collection never blocks the workflow.
80
+ */
81
+ async function collectEvidence(executor, state, log) {
82
+ try {
83
+ log.info('Collecting evidence (sub-agent)');
84
+ const commitEvidence = hasSettings() && getSettings().workflow.commitEvidence;
85
+ const prompt = buildEvidencePrompt(state, { commitEvidence });
86
+ const options = buildExecutorOptions(state);
87
+ const result = await retryExecute(executor, prompt, options, { logger: log });
88
+ try {
89
+ const evidence = parseEvidenceRecords(result.result);
90
+ log.info(`Parsed ${evidence.length} evidence record(s)`);
91
+ saveEvidenceManifest(state, evidence, log);
92
+ return evidence;
93
+ }
94
+ catch (parseErr) {
95
+ const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);
96
+ log.error(`Warning: evidence parsing failed: ${msg} — continuing with empty evidence`);
97
+ return [];
98
+ }
99
+ }
100
+ catch (err) {
101
+ // Re-throw LangGraph control-flow exceptions
102
+ if (isGraphBubbleUp(err))
103
+ throw err;
104
+ const msg = err instanceof Error ? err.message : String(err);
105
+ log.error(`Evidence collection failed: ${msg} — continuing without evidence`);
106
+ return [];
107
+ }
108
+ }
109
+ /**
110
+ * Save evidence manifest to the shep home evidence folder so the
111
+ * merge review UI can read it without accessing graph state.
112
+ */
113
+ function saveEvidenceManifest(state, evidence, log) {
114
+ if (evidence.length === 0)
115
+ return;
116
+ try {
117
+ const cwd = state.worktreePath || state.repositoryPath;
118
+ const repoHashDir = dirname(dirname(cwd));
119
+ const evidenceDir = join(repoHashDir, 'evidence', state.featureId);
120
+ mkdirSync(evidenceDir, { recursive: true });
121
+ writeFileSync(join(evidenceDir, 'manifest.json'), JSON.stringify(evidence, null, 2), 'utf-8');
122
+ log.info(`Saved evidence manifest to ${evidenceDir}/manifest.json`);
123
+ }
124
+ catch (err) {
125
+ const msg = err instanceof Error ? err.message : String(err);
126
+ log.error(`Failed to save evidence manifest: ${msg}`);
127
+ }
128
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqErD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,IAG5C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAgL7E"}
1
+ {"version":3,"file":"implement.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAEpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAwErD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,IAG5C,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAwL7E"}
@@ -7,14 +7,17 @@
7
7
  * feature.yaml between phases.
8
8
  */
9
9
  import yaml from 'js-yaml';
10
- import { writeFileSync } from 'node:fs';
11
- import { join } from 'node:path';
10
+ import { writeFileSync, mkdirSync } from 'node:fs';
11
+ import { join, dirname } from 'node:path';
12
12
  import { interrupt, isGraphBubbleUp } from '@langchain/langgraph';
13
13
  import { createNodeLogger, readSpecFile, buildExecutorOptions, shouldInterrupt, safeYamlLoad, retryExecute, getCompletedPhases, markPhaseComplete, } from './node-helpers.js';
14
14
  import { reportNodeStart } from '../heartbeat.js';
15
15
  import { recordPhaseStart, recordPhaseEnd, recordApprovalWaitStart, } from '../phase-timing-context.js';
16
16
  import { updateNodeLifecycle } from '../lifecycle-context.js';
17
17
  import { buildImplementPhasePrompt, } from './prompts/implement.prompt.js';
18
+ import { buildEvidencePrompt } from './prompts/evidence-prompts.js';
19
+ import { parseEvidenceRecords } from './evidence-output-parser.js';
20
+ import { hasSettings, getSettings } from '../../../settings.service.js';
18
21
  /**
19
22
  * Update feature.yaml with current implementation progress.
20
23
  * Silently no-ops if the file is missing or unparseable.
@@ -141,6 +144,13 @@ export function createImplementNode(executor) {
141
144
  log.info(`All phases complete — ${completedTasks}/${totalTasks} tasks (${elapsed}s)`);
142
145
  updateFeatureProgress(state.specDir, totalTasks, totalTasks, 'implementation-complete', null, log);
143
146
  messages.push(`[implement] Complete: ${totalTasks} tasks across ${totalPhases} phases (${elapsed}s)`);
147
+ // --- Evidence sub-agent: capture proof of completion (settings-gated) ---
148
+ const evidenceEnabled = hasSettings() && getSettings().workflow.enableEvidence;
149
+ const evidence = evidenceEnabled ? await collectEvidence(executor, state, log) : [];
150
+ if (!evidenceEnabled) {
151
+ log.info('Evidence collection disabled via settings — skipping');
152
+ }
153
+ messages.push(`[implement] Evidence: ${evidence.length} record(s) captured`);
144
154
  // Record top-level implement phase completion
145
155
  await recordPhaseEnd(implementTimingId, Date.now() - startTime);
146
156
  if (shouldInterrupt('implement', state.approvalGates)) {
@@ -151,7 +161,7 @@ export function createImplementNode(executor) {
151
161
  message: `Implementation complete: ${totalTasks} tasks across ${totalPhases} phases. Approve to finish.`,
152
162
  });
153
163
  }
154
- return { currentNode: 'implement', messages };
164
+ return { currentNode: 'implement', evidence, messages };
155
165
  }
156
166
  catch (err) {
157
167
  if (isGraphBubbleUp(err))
@@ -168,3 +178,58 @@ export function createImplementNode(executor) {
168
178
  }
169
179
  };
170
180
  }
181
+ /**
182
+ * Sub-agent call to collect evidence after implementation completes.
183
+ * Graceful degradation: returns empty array on any failure so evidence
184
+ * collection never blocks the workflow.
185
+ */
186
+ async function collectEvidence(executor, state, log) {
187
+ try {
188
+ log.info('Collecting evidence (sub-agent)');
189
+ const commitEvidence = hasSettings() && getSettings().workflow.commitEvidence;
190
+ const prompt = buildEvidencePrompt(state, { commitEvidence });
191
+ const options = buildExecutorOptions(state);
192
+ const result = await retryExecute(executor, prompt, options, { logger: log });
193
+ try {
194
+ const evidence = parseEvidenceRecords(result.result);
195
+ log.info(`Parsed ${evidence.length} evidence record(s)`);
196
+ saveEvidenceManifest(state, evidence, log);
197
+ return evidence;
198
+ }
199
+ catch (parseErr) {
200
+ const msg = parseErr instanceof Error ? parseErr.message : String(parseErr);
201
+ log.error(`Warning: evidence parsing failed: ${msg} — continuing with empty evidence`);
202
+ return [];
203
+ }
204
+ }
205
+ catch (err) {
206
+ // Re-throw LangGraph control-flow exceptions
207
+ if (isGraphBubbleUp(err))
208
+ throw err;
209
+ const msg = err instanceof Error ? err.message : String(err);
210
+ log.error(`Evidence collection failed: ${msg} — continuing without evidence`);
211
+ return [];
212
+ }
213
+ }
214
+ /**
215
+ * Save evidence manifest to the shep home evidence folder so the
216
+ * merge review UI can read it without accessing graph state.
217
+ */
218
+ function saveEvidenceManifest(state, evidence, log) {
219
+ if (evidence.length === 0)
220
+ return;
221
+ try {
222
+ const cwd = state.worktreePath || state.repositoryPath;
223
+ // Worktree path: ~/.shep/repos/<hash>/wt/<slug>
224
+ // Evidence dir: ~/.shep/repos/<hash>/evidence/<featureId>/
225
+ const repoHashDir = dirname(dirname(cwd));
226
+ const evidenceDir = join(repoHashDir, 'evidence', state.featureId);
227
+ mkdirSync(evidenceDir, { recursive: true });
228
+ writeFileSync(join(evidenceDir, 'manifest.json'), JSON.stringify(evidence, null, 2), 'utf-8');
229
+ log.info(`Saved evidence manifest to ${evidenceDir}/manifest.json`);
230
+ }
231
+ catch (err) {
232
+ const msg = err instanceof Error ? err.message : String(err);
233
+ log.error(`Failed to save evidence manifest: ${msg}`);
234
+ }
235
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAkBzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AAE3H,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;IAC5B,6BAA6B,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CA0Q7E"}
1
+ {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAkBzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AAE3H,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;IAC5B,6BAA6B,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAmR7E"}
@@ -82,6 +82,9 @@ export function createMergeNode(deps) {
82
82
  let ciFixStatus = state.ciFixStatus ?? 'idle';
83
83
  // --- Check for git remote (needed by both agent calls) ---
84
84
  const remoteAvailable = await deps.hasRemote(cwd);
85
+ const repoUrl = remoteAvailable
86
+ ? ((await deps.gitPrService.getRemoteUrl(cwd)) ?? undefined)
87
+ : undefined;
85
88
  // --- Agent Call 1: Commit + Push + PR (skip on approval resume) ---
86
89
  if (!isResumeAfterInterrupt) {
87
90
  if (!remoteAvailable) {
@@ -89,7 +92,7 @@ export function createMergeNode(deps) {
89
92
  }
90
93
  const effectiveState = remoteAvailable ? state : { ...state, push: false, openPr: false };
91
94
  log.info('Agent call 1: commit + push + PR');
92
- const commitPushPrPrompt = buildCommitPushPrPrompt(effectiveState, branch, baseBranch);
95
+ const commitPushPrPrompt = buildCommitPushPrPrompt(effectiveState, branch, baseBranch, repoUrl);
93
96
  const commitResult = await retryExecute(executor, commitPushPrPrompt, options, {
94
97
  logger: log,
95
98
  });
@@ -162,6 +165,7 @@ export function createMergeNode(deps) {
162
165
  prUrl,
163
166
  prNumber,
164
167
  ciStatus,
168
+ evidence: state.evidence ?? [],
165
169
  });
166
170
  }
167
171
  }