@shepai/cli 1.145.0 → 1.146.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 (262) hide show
  1. package/apis/json-schema/Feature.yaml +25 -0
  2. package/apis/json-schema/PullRequest.yaml +11 -0
  3. package/apis/json-schema/SdlcLifecycle.yaml +1 -0
  4. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +5 -0
  5. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.d.ts +79 -0
  7. package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.d.ts.map +1 -0
  8. package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.js +31 -0
  9. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +5 -0
  11. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  12. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +10 -0
  13. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +10 -0
  14. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  15. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.d.ts +23 -0
  16. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.d.ts.map +1 -0
  17. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.js +84 -0
  18. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  19. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +2 -0
  20. package/dist/packages/core/src/domain/generated/output.d.ts +33 -0
  21. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  22. package/dist/packages/core/src/domain/generated/output.js +1 -0
  23. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/di/container.js +2 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +8 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +18 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.d.ts +13 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.d.ts.map +1 -0
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.js +30 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.d.ts +12 -0
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.js +23 -0
  34. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +23 -4
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +25 -0
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +85 -0
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +5 -0
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +15 -0
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +5 -0
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  45. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +23 -0
  46. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +2 -0
  47. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  48. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +50 -0
  49. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +8 -0
  50. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  51. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +40 -1
  52. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.d.ts.map +1 -1
  53. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.js +11 -9
  54. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  55. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +5 -1
  56. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
  57. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +8 -6
  58. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
  59. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +11 -9
  60. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
  61. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +8 -6
  62. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.d.ts.map +1 -1
  63. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.js +3 -1
  64. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts +1 -0
  65. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts.map +1 -1
  66. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.js +9 -0
  67. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +5 -0
  68. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  69. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +20 -0
  70. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts +25 -0
  71. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts.map +1 -0
  72. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.js +145 -0
  73. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts +17 -3
  74. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -1
  75. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +98 -15
  76. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  77. package/dist/src/presentation/cli/commands/ui.command.js +2 -1
  78. package/dist/src/presentation/web/app/actions/create-feature.d.ts +10 -0
  79. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  80. package/dist/src/presentation/web/app/actions/create-feature.js +8 -1
  81. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  82. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  83. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  84. package/dist/src/presentation/web/app/build-feature-node-data.js +5 -3
  85. package/dist/src/presentation/web/app/build-graph-nodes.js +5 -3
  86. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
  87. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -0
  88. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  89. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +24 -7
  90. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +12 -0
  91. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  92. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +35 -0
  93. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +7 -1
  94. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +5 -1
  95. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +12 -0
  97. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +1 -0
  99. package/dist/src/presentation/web/dev-server.js +2 -1
  100. package/dist/tsconfig.build.tsbuildinfo +1 -1
  101. package/package.json +1 -1
  102. package/web/.next/BUILD_ID +1 -1
  103. package/web/.next/build-manifest.json +2 -2
  104. package/web/.next/fallback-build-manifest.json +2 -2
  105. package/web/.next/prerender-manifest.json +3 -3
  106. package/web/.next/required-server-files.js +2 -2
  107. package/web/.next/required-server-files.json +2 -2
  108. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  109. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  110. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  112. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  113. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  115. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  116. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  118. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  121. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
  124. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  125. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  127. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  128. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  130. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  133. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  134. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  136. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  137. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/_global-error.html +2 -2
  139. package/web/.next/server/app/_global-error.rsc +1 -1
  140. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  141. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  142. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  143. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  144. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  145. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  146. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  148. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  149. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  150. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  151. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  153. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  154. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  155. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  157. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  158. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  159. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  160. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  161. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  162. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  163. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  164. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  166. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +2 -2
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +1 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js +3 -0
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js.map +1 -0
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  192. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  194. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  195. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  196. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  197. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  198. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
  200. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  202. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  204. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/_8fcc39d4._.js +3 -0
  206. package/web/.next/server/chunks/ssr/_8fcc39d4._.js.map +1 -0
  207. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  211. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/{_2a415784._.js → _f0507de3._.js} +2 -2
  213. package/web/.next/server/chunks/ssr/{_2a415784._.js.map → _f0507de3._.js.map} +1 -1
  214. package/web/.next/server/chunks/ssr/{_1fa6f5f0._.js → _f3428a54._.js} +2 -2
  215. package/web/.next/server/chunks/ssr/{_1fa6f5f0._.js.map → _f3428a54._.js.map} +1 -1
  216. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  217. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  219. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web_3f392ed3._.js +3 -0
  221. package/web/.next/server/chunks/ssr/{src_presentation_web_721fb773._.js.map → src_presentation_web_3f392ed3._.js.map} +1 -1
  222. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  223. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  225. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  227. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  232. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  233. package/web/.next/server/pages/500.html +2 -2
  234. package/web/.next/server/server-reference-manifest.js +1 -1
  235. package/web/.next/server/server-reference-manifest.json +44 -44
  236. package/web/.next/static/chunks/{f2a6406394a41d3c.js → 00c975ddd2b87528.js} +1 -1
  237. package/web/.next/static/chunks/{74ee98538b63a4b2.css → 0b18c50740356276.css} +1 -1
  238. package/web/.next/static/chunks/{266fe61224d14058.js → 0ead3bd3449a6efe.js} +1 -1
  239. package/web/.next/static/chunks/{18c49ba954b15750.js → 5afa709c97ad44c3.js} +1 -1
  240. package/web/.next/static/chunks/{ed43f5ec24322234.js → 64a97bd60c175b9e.js} +1 -1
  241. package/web/.next/static/chunks/6dad9c4718b9ef1c.js +1 -0
  242. package/web/.next/static/chunks/{c0fd9ae3d7b3ebe3.js → 7558964bf146f27c.js} +1 -1
  243. package/web/.next/static/chunks/{7559d0ac9e155de8.js → 86bc398562d84b1d.js} +2 -2
  244. package/web/.next/static/chunks/{e2e3d8a7d339c110.js → 8ff013b5490a9111.js} +1 -1
  245. package/web/.next/static/chunks/{41667f7f505952e6.js → 96fb06a2ff46e152.js} +1 -1
  246. package/web/.next/static/chunks/b3ee28e6d690043f.js +2 -0
  247. package/web/.next/static/chunks/bb466ffb8a013811.js +1 -0
  248. package/web/.next/static/chunks/d8364c7cbc1a8432.js +1 -0
  249. package/web/.next/static/chunks/fa556c575c788679.js +1 -0
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js +0 -3
  251. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js.map +0 -1
  252. package/web/.next/server/chunks/ssr/_a9f57758._.js +0 -3
  253. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +0 -1
  254. package/web/.next/server/chunks/ssr/src_presentation_web_721fb773._.js +0 -3
  255. package/web/.next/static/chunks/149c88eadafaf835.js +0 -1
  256. package/web/.next/static/chunks/37b065777853153c.js +0 -2
  257. package/web/.next/static/chunks/6a370f2709c81d83.js +0 -1
  258. package/web/.next/static/chunks/a6f8230f1756f318.js +0 -1
  259. package/web/.next/static/chunks/d1c52a649f1c7704.js +0 -1
  260. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_buildManifest.js +0 -0
  261. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_clientMiddlewareManifest.json +0 -0
  262. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_ssgManifest.js +0 -0
@@ -54,6 +54,11 @@ export function parseWorkerArgs(args) {
54
54
  const resumeFromInterrupt = args.includes('--resume-from-interrupt');
55
55
  const push = args.includes('--push');
56
56
  const openPr = args.includes('--open-pr');
57
+ const forkAndPr = args.includes('--fork-and-pr');
58
+ const commitSpecs = !args.includes('--no-commit-specs');
59
+ const ciWatchEnabled = !args.includes('--no-ci-watch');
60
+ const enableEvidence = args.includes('--enable-evidence');
61
+ const commitEvidence = args.includes('--commit-evidence');
57
62
  const fast = args.includes('--fast');
58
63
  const threadIdx = args.indexOf('--thread-id');
59
64
  const threadId = threadIdx !== -1 && threadIdx + 1 < args.length ? args[threadIdx + 1] : undefined;
@@ -83,6 +88,11 @@ export function parseWorkerArgs(args) {
83
88
  resumeFromInterrupt,
84
89
  push,
85
90
  openPr,
91
+ forkAndPr,
92
+ commitSpecs,
93
+ ciWatchEnabled,
94
+ enableEvidence,
95
+ commitEvidence,
86
96
  resumePayload,
87
97
  agentType,
88
98
  fast,
@@ -143,6 +153,8 @@ export async function runWorker(args) {
143
153
  ...(args.resumeFromInterrupt ? ['--resume-from-interrupt'] : []),
144
154
  ...(args.push ? ['--push'] : []),
145
155
  ...(args.openPr ? ['--open-pr'] : []),
156
+ ...(args.forkAndPr ? ['--fork-and-pr'] : []),
157
+ ...(args.commitSpecs === false ? ['--no-commit-specs'] : []),
146
158
  ...(args.resumePayload ? ['--resume-payload', args.resumePayload] : []),
147
159
  ...(args.agentType ? ['--agent-type', args.agentType] : []),
148
160
  ...(args.fast ? ['--fast'] : []),
@@ -185,6 +197,7 @@ export async function runWorker(args) {
185
197
  localMergeSquash: (cwd, featureBranch, baseBranch, commitMessage, hasRemote) => gitPrService.localMergeSquash(cwd, featureBranch, baseBranch, commitMessage, hasRemote),
186
198
  featureRepository,
187
199
  gitPrService,
200
+ gitForkService: container.resolve('IGitForkService'),
188
201
  cleanupFeatureWorktreeUseCase,
189
202
  },
190
203
  };
@@ -274,6 +287,11 @@ export async function runWorker(args) {
274
287
  ...(args.resumeReason ? { resumeReason: args.resumeReason } : {}),
275
288
  push: args.push ?? false,
276
289
  openPr: args.openPr ?? false,
290
+ forkAndPr: args.forkAndPr ?? false,
291
+ commitSpecs: args.commitSpecs ?? true,
292
+ ciWatchEnabled: args.ciWatchEnabled ?? true,
293
+ enableEvidence: args.enableEvidence ?? false,
294
+ commitEvidence: args.commitEvidence ?? false,
277
295
  }, graphConfig);
278
296
  }
279
297
  else {
@@ -287,6 +305,11 @@ export async function runWorker(args) {
287
305
  ...(args.model ? { model: args.model } : {}),
288
306
  push: args.push ?? false,
289
307
  openPr: args.openPr ?? false,
308
+ forkAndPr: args.forkAndPr ?? false,
309
+ commitSpecs: args.commitSpecs ?? true,
310
+ ciWatchEnabled: args.ciWatchEnabled ?? true,
311
+ enableEvidence: args.enableEvidence ?? false,
312
+ commitEvidence: args.commitEvidence ?? false,
290
313
  }, graphConfig);
291
314
  }
292
315
  log(`Graph invocation completed. Error: ${result.error ?? 'none'}`);
@@ -17,6 +17,7 @@ import type { FeatureAgentState } from '../../state.js';
17
17
  import type { IFeatureRepository } from '../../../../../../application/ports/output/repositories/feature-repository.interface.js';
18
18
  import type { DiffSummary, IGitPrService } from '../../../../../../application/ports/output/services/git-pr-service.interface.js';
19
19
  import type { CleanupFeatureWorktreeUseCase } from '../../../../../../application/use-cases/features/cleanup-feature-worktree.use-case.js';
20
+ import type { IGitForkService } from '../../../../../../application/ports/output/services/git-fork-service.interface.js';
20
21
  export interface MergeNodeDeps {
21
22
  executor: IAgentExecutor;
22
23
  getDiffSummary: (cwd: string, baseBranch: string) => Promise<DiffSummary>;
@@ -37,6 +38,7 @@ export interface MergeNodeDeps {
37
38
  */
38
39
  revParse: (cwd: string, ref: string) => Promise<string>;
39
40
  gitPrService: IGitPrService;
41
+ gitForkService?: IGitForkService;
40
42
  cleanupFeatureWorktreeUseCase: Pick<CleanupFeatureWorktreeUseCase, 'execute'>;
41
43
  }
42
44
  /**
@@ -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;AAoBzE,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;;OAEG;IACH,gBAAgB,EAAE,CAChB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,OAAO,KAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;OAGG;IACH,WAAW,EAAE,CACX,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,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,CAiU7E"}
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;AAoBzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AAC3H,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mEAAmE,CAAC;AAEzG,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;;OAEG;IACH,gBAAgB,EAAE,CAChB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,OAAO,KAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;OAGG;IACH,WAAW,EAAE,CACX,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,YAAY,EAAE,aAAa,CAAC;IAC5B,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,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,CAgY7E"}
@@ -220,6 +220,56 @@ export function createMergeNode(deps) {
220
220
  ciStatus = feature.pr.ciStatus ?? ciStatus;
221
221
  }
222
222
  }
223
+ // --- Fork-and-PR flow ---
224
+ // When forkAndPr=true, fork the repo, push to the fork, create upstream PR,
225
+ // then transition to AwaitingUpstream instead of merging.
226
+ if (state.forkAndPr && deps.gitForkService) {
227
+ log.info('Fork-and-PR flow: forking repo and creating upstream PR');
228
+ await deps.gitForkService.forkRepository(cwd);
229
+ log.info('Repository forked, remotes remapped');
230
+ await deps.gitForkService.pushToFork(cwd, branch);
231
+ log.info(`Branch ${branch} pushed to fork`);
232
+ const upstreamPr = await deps.gitForkService.createUpstreamPr(cwd, feature?.name ?? branch, feature?.description ?? '', branch, baseBranch);
233
+ log.info(`Upstream PR created: ${upstreamPr.url}`);
234
+ messages.push(`[merge] Upstream PR created: ${upstreamPr.url}`);
235
+ if (feature) {
236
+ await deps.featureRepository.update({
237
+ ...feature,
238
+ lifecycle: SdlcLifecycle.AwaitingUpstream,
239
+ pr: {
240
+ ...(feature.pr ?? { url: '', number: 0, status: PrStatus.Open }),
241
+ ...(commitHash ? { commitHash } : {}),
242
+ upstreamPrUrl: upstreamPr.url,
243
+ upstreamPrNumber: upstreamPr.number,
244
+ upstreamPrStatus: PrStatus.Open,
245
+ },
246
+ updatedAt: new Date(),
247
+ });
248
+ messages.push(`[merge] Feature lifecycle → AwaitingUpstream`);
249
+ }
250
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
251
+ await recordPhaseEnd(mergeTimingId, Date.now() - startTime, {
252
+ inputTokens: totalInputTokens || undefined,
253
+ outputTokens: totalOutputTokens || undefined,
254
+ exitCode: 'success',
255
+ });
256
+ messages.push(`[merge] Complete (${elapsed}s)`);
257
+ log.info(`Fork-and-PR merge flow complete (${elapsed}s)`);
258
+ return {
259
+ currentNode: 'merge',
260
+ messages,
261
+ commitHash,
262
+ prUrl,
263
+ prNumber,
264
+ ciStatus,
265
+ ciFixAttempts,
266
+ ciFixHistory,
267
+ ciFixStatus,
268
+ _approvalAction: null,
269
+ _rejectionFeedback: null,
270
+ _needsReexecution: false,
271
+ };
272
+ }
223
273
  // --- Merge ---
224
274
  // Merge when: allowMerge is true (auto-merge), OR user explicitly
225
275
  // approved at the merge gate (isResumeAfterInterrupt means they
@@ -159,6 +159,14 @@ export declare function buildCommitPushBlock(opts: {
159
159
  * context so the agent knows to check existing work before proceeding.
160
160
  */
161
161
  export declare function buildResumeContext(resumeReason: string | undefined): string;
162
+ /**
163
+ * Safety net: remove spec-file commits the agent made despite being told not to.
164
+ *
165
+ * When commitSpecs=false and the agent ignored the "do NOT commit" instruction,
166
+ * this function finds the most recent commit that touches the spec directory and
167
+ * soft-resets it so the files remain on disk (for local use) but are not committed.
168
+ */
169
+ export declare function removeSpecCommitsIfNeeded(state: FeatureAgentState, nodeName: string, log: NodeLogger): void;
162
170
  /**
163
171
  * Execute a node with consistent logging and error handling.
164
172
  *
@@ -1 +1 @@
1
- {"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,+DAA+D,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAE7C,4DAA4D;gBAChD,IAAI;kBAGF,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;EAK/B;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAoBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EACxB,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,EAC3D,QAAQ,CAAC,EAAE,MAAM,GAChB,qBAAqB,CAUvB;AAeD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQrD;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAElD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAQ3F;AAMD,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,mBAAmB,GAAG,eAAe,GAAG,SAAS,CAAC;AAMhG;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAKjE;AAED,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB,EAC9B,SAAS,CAAC,EAAE,YAAY,GACvB,OAAO,CAAC,oBAAoB,CAAC,CA6B/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAiB5F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOhG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAoB1F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAa5F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,MAAM,CAiCT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAa3E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GACjE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAqInE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,QAAQ,EAAE,EACpB,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GACvC,IAAI,CAaN"}
1
+ {"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,8 @@
6
6
  */
7
7
  import yaml from 'js-yaml';
8
8
  import { mkdirSync, readFileSync, writeFileSync, renameSync, unlinkSync } from 'node:fs';
9
- import { join, dirname } from 'node:path';
9
+ import { execSync } from 'node:child_process';
10
+ import { join, dirname, relative } from 'node:path';
10
11
  import { interrupt, isGraphBubbleUp } from '@langchain/langgraph';
11
12
  import { hasSettings, getSettings } from '../../../../services/settings.service.js';
12
13
  import { reportNodeStart } from '../heartbeat.js';
@@ -394,6 +395,42 @@ Before proceeding with this phase:
394
395
 
395
396
  `;
396
397
  }
398
+ /** Spec-only phases whose commits should be removed when commitSpecs=false. */
399
+ const SPEC_PHASE_NODES = new Set(['analyze', 'requirements', 'research', 'plan']);
400
+ /**
401
+ * Safety net: remove spec-file commits the agent made despite being told not to.
402
+ *
403
+ * When commitSpecs=false and the agent ignored the "do NOT commit" instruction,
404
+ * this function finds the most recent commit that touches the spec directory and
405
+ * soft-resets it so the files remain on disk (for local use) but are not committed.
406
+ */
407
+ export function removeSpecCommitsIfNeeded(state, nodeName, log) {
408
+ if (state.commitSpecs)
409
+ return;
410
+ if (!SPEC_PHASE_NODES.has(nodeName))
411
+ return;
412
+ const cwd = state.worktreePath || state.repositoryPath;
413
+ const specRelDir = relative(cwd, state.specDir).replaceAll('\\', '/');
414
+ try {
415
+ // Check if HEAD commit touches spec files
416
+ const filesInHead = execSync(`git diff --name-only HEAD~1 HEAD -- "${specRelDir}"`, {
417
+ cwd,
418
+ encoding: 'utf-8',
419
+ windowsHide: true,
420
+ }).trim();
421
+ if (!filesInHead)
422
+ return;
423
+ log.info(`commitSpecs=false but agent committed spec files: ${filesInHead.split('\n').join(', ')}. Soft-resetting to undo.`);
424
+ // Soft-reset the last commit so spec files are unstaged but kept on disk
425
+ execSync('git reset --soft HEAD~1', { cwd, windowsHide: true });
426
+ // Unstage the spec files (keep them as untracked/modified on disk)
427
+ execSync(`git reset HEAD -- "${specRelDir}"`, { cwd, windowsHide: true });
428
+ }
429
+ catch {
430
+ // If git commands fail (e.g., no prior commit, detached HEAD), log and continue
431
+ log.info('Failed to check/remove spec commits — continuing');
432
+ }
433
+ }
397
434
  /**
398
435
  * Execute a node with consistent logging and error handling.
399
436
  *
@@ -480,6 +517,8 @@ export function executeNode(nodeName, executor, buildPrompt) {
480
517
  durationApiMs: result.usage?.durationApiMs,
481
518
  exitCode: 'success',
482
519
  });
520
+ // Safety net: undo spec commits if commitSpecs=false
521
+ removeSpecCommitsIfNeeded(state, nodeName, log);
483
522
  // Mark phase complete BEFORE interrupting so that on resume the
484
523
  // node detects the work is already done and returns early.
485
524
  markPhaseComplete(state.specDir, nodeName, log);
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA6GnE"}
1
+ {"version":3,"file":"analyze.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAiHnE"}
@@ -36,9 +36,9 @@ Write your analysis to: ${state.specDir}/spec.yaml
36
36
 
37
37
  You MUST write the COMPLETE file (not a partial update). Preserve the existing name/number/branch fields and update everything else. Use this YAML structure:
38
38
 
39
- name: (keep existing)
40
- number: (keep existing)
41
- branch: (keep existing)
39
+ name: (keep existing — string)
40
+ number: (keep existing — MUST be a bare integer, e.g. 2, NOT "002" or "2")
41
+ branch: (keep existing — string)
42
42
  oneLiner: (concise one-line description of the feature)
43
43
  summary: >
44
44
  (2-3 sentence summary of what this feature involves based on your analysis)
@@ -107,10 +107,12 @@ You MUST write the COMPLETE file (not a partial update). Preserve the existing n
107
107
  - Do NOT start implementing the feature
108
108
  - Keep your analysis thorough but concise
109
109
 
110
- ${buildCommitPushBlock({
111
- push: state.push,
112
- files: [`${state.specDir}/spec.yaml`],
113
- commitHint: 'docs(specs): analyze repository and define spec',
114
- skipVerification: true,
115
- })}`;
110
+ ${state.commitSpecs
111
+ ? buildCommitPushBlock({
112
+ push: state.push,
113
+ files: [`${state.specDir}/spec.yaml`],
114
+ commitHint: 'docs(specs): analyze repository and define spec',
115
+ skipVerification: true,
116
+ })
117
+ : `## Git Operations\n\nDo NOT commit or push any spec files. Spec files are managed locally only.`}`;
116
118
  }
@@ -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;;;;;;;;;GASG;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,CAqER;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;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqDzD"}
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;;;;;;;;;GASG;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,CAyER;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;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqDzD"}
@@ -128,8 +128,11 @@ export function buildCommitPushPrPrompt(state, branch, baseBranch, repoUrl) {
128
128
  : '';
129
129
  const steps = [];
130
130
  // Step 1: Commit (always)
131
+ const stageCmd = state.commitSpecs
132
+ ? '`git add -A`'
133
+ : '`git add -A` then `git reset -- specs/` (do NOT commit the specs/ directory)';
131
134
  steps.push(`1. Review the current changes using \`git diff\` and \`git status\`
132
- 2. Stage all changes with \`git add -A\`
135
+ 2. Stage changes with ${stageCmd}
133
136
  3. Write a conventional commit message based on the actual diff content
134
137
  - Use the format: \`feat(<scope>): <description>\` or \`fix(<scope>): <description>\`
135
138
  - The commit message should summarize what actually changed, not be generic
@@ -177,6 +180,7 @@ ${evidenceSection}
177
180
 
178
181
  - Write a meaningful conventional commit message derived from the actual diff — do NOT use generic messages
179
182
  ${rejectionSection ? '- You MUST modify source code files to address the rejection feedback above BEFORE committing' : '- Do NOT modify any source code files — only perform git operations'}
183
+ ${!state.commitSpecs ? '- Do NOT commit the `specs/` directory — it must stay untracked. If you accidentally staged it, run `git reset -- specs/` before committing' : ''}
180
184
  - Do NOT amend existing commits
181
185
  - Do NOT run \`git pull\`, \`git rebase\`, or \`git merge\` — this is a fresh branch, push it directly
182
186
  - If there are no changes to commit, skip the commit step and report that no changes were found`;
@@ -1 +1 @@
1
- {"version":3,"file":"plan.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA6NhE"}
1
+ {"version":3,"file":"plan.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAiOhE"}
@@ -219,10 +219,12 @@ You MUST write TWO files:
219
219
  - Do NOT modify any source code
220
220
  - Do NOT start implementing — planning only
221
221
 
222
- ${buildCommitPushBlock({
223
- push: state.push,
224
- files: [`${state.specDir}/plan.yaml`, `${state.specDir}/tasks.yaml`],
225
- commitHint: 'docs(specs): create implementation plan and task breakdown',
226
- skipVerification: true,
227
- })}`;
222
+ ${state.commitSpecs
223
+ ? buildCommitPushBlock({
224
+ push: state.push,
225
+ files: [`${state.specDir}/plan.yaml`, `${state.specDir}/tasks.yaml`],
226
+ commitHint: 'docs(specs): create implementation plan and task breakdown',
227
+ skipVerification: true,
228
+ })
229
+ : `## Git Operations\n\nDo NOT commit or push any spec files. Spec files are managed locally only.`}`;
228
230
  }
@@ -1 +1 @@
1
- {"version":3,"file":"requirements.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAgMxE"}
1
+ {"version":3,"file":"requirements.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAoMxE"}
@@ -84,9 +84,9 @@ Update the file at: ${state.specDir}/spec.yaml
84
84
 
85
85
  Write the COMPLETE file. Preserve name/number/branch/technologies from analysis and update:
86
86
 
87
- name: (keep)
88
- number: (keep)
89
- branch: (keep)
87
+ name: (keep — string)
88
+ number: (keep — MUST be a bare integer, e.g. 2, NOT "002" or "2")
89
+ branch: (keep — string)
90
90
  oneLiner: (keep or refine)
91
91
  summary: >
92
92
  (keep or refine based on requirements)
@@ -185,10 +185,12 @@ Write the COMPLETE file. Preserve name/number/branch/technologies from analysis
185
185
  - Do NOT create any other files
186
186
  - Do NOT modify any source code
187
187
 
188
- ${buildCommitPushBlock({
189
- push: state.push,
190
- files: [`${state.specDir}/spec.yaml`],
191
- commitHint: 'docs(specs): define requirements and product questions',
192
- skipVerification: true,
193
- })}`;
188
+ ${state.commitSpecs
189
+ ? buildCommitPushBlock({
190
+ push: state.push,
191
+ files: [`${state.specDir}/spec.yaml`],
192
+ commitHint: 'docs(specs): define requirements and product questions',
193
+ skipVerification: true,
194
+ })
195
+ : `## Git Operations\n\nDo NOT commit or push any spec files. Spec files are managed locally only.`}`;
194
196
  }
@@ -1 +1 @@
1
- {"version":3,"file":"research.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAmJpE"}
1
+ {"version":3,"file":"research.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAuJpE"}
@@ -146,10 +146,12 @@ Use this YAML structure:
146
146
  - Do NOT create any other files
147
147
  - Do NOT modify any source code
148
148
 
149
- ${buildCommitPushBlock({
150
- push: state.push,
151
- files: [`${state.specDir}/research.yaml`],
152
- commitHint: 'docs(specs): research technical decisions and library choices',
153
- skipVerification: true,
154
- })}`;
149
+ ${state.commitSpecs
150
+ ? buildCommitPushBlock({
151
+ push: state.push,
152
+ files: [`${state.specDir}/research.yaml`],
153
+ commitHint: 'docs(specs): research technical decisions and library choices',
154
+ skipVerification: true,
155
+ })
156
+ : `## Git Operations\n\nDo NOT commit or push any spec files. Spec files are managed locally only.`}`;
155
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"spec.schema.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuC,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AA4B7F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAYnE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAqBxE"}
1
+ {"version":3,"file":"spec.schema.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,iBAAiB,CAAC;AA8BzB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAYnE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAqBxE"}
@@ -1,4 +1,4 @@
1
- import { requireString, requireNonEmptyArray } from './validation.js';
1
+ import { requireString, requireInteger, requireNonEmptyArray, } from './validation.js';
2
2
  const VALID_SIZE_ESTIMATES = ['S', 'M', 'L', 'XL'];
3
3
  function validateBaseSpec(data, errors) {
4
4
  if (!data || typeof data !== 'object') {
@@ -7,6 +7,8 @@ function validateBaseSpec(data, errors) {
7
7
  }
8
8
  const d = data;
9
9
  requireString(d, 'name', errors);
10
+ requireInteger(d, 'number', errors);
11
+ requireString(d, 'branch', errors);
10
12
  requireString(d, 'oneLiner', errors);
11
13
  requireString(d, 'summary', errors);
12
14
  requireString(d, 'phase', errors);
@@ -3,6 +3,7 @@ export interface ValidationResult {
3
3
  errors: string[];
4
4
  }
5
5
  export declare function requireString(data: Record<string, unknown>, field: string, errors: string[], prefix?: string): void;
6
+ export declare function requireInteger(data: Record<string, unknown>, field: string, errors: string[], prefix?: string): void;
6
7
  export declare function requireNonEmptyArray(data: Record<string, unknown>, field: string, errors: string[], prefix?: string): unknown[] | null;
7
8
  export declare function requireArrayOfShape(data: Record<string, unknown>, field: string, errors: string[], itemChecker: (item: unknown, index: number, errors: string[]) => void, prefix?: string): void;
8
9
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,SAAK,GACV,IAAI,CASN;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,SAAK,GACV,OAAO,EAAE,GAAG,IAAI,CAelB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,EACrE,MAAM,SAAK,GACV,IAAI,CAMN"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,SAAK,GACV,IAAI,CASN;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,SAAK,GACV,IAAI,CASN;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,SAAK,GACV,OAAO,EAAE,GAAG,IAAI,CAelB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,EACrE,MAAM,SAAK,GACV,IAAI,CAMN"}
@@ -10,6 +10,15 @@ export function requireString(data, field, errors, prefix = '') {
10
10
  errors.push(`Field '${prefix}${field}' must not be empty`);
11
11
  }
12
12
  }
13
+ export function requireInteger(data, field, errors, prefix = '') {
14
+ const val = data[field];
15
+ if (val === undefined || val === null) {
16
+ errors.push(`Missing required integer field '${prefix}${field}'`);
17
+ }
18
+ else if (typeof val !== 'number' || !Number.isInteger(val)) {
19
+ errors.push(`Field '${prefix}${field}' must be an integer, got ${typeof val === 'number' ? val : typeof val}`);
20
+ }
21
+ }
13
22
  export function requireNonEmptyArray(data, field, errors, prefix = '') {
14
23
  const val = data[field];
15
24
  if (val === undefined || val === null) {
@@ -48,6 +48,11 @@ 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
+ forkAndPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
52
+ commitSpecs: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
53
+ ciWatchEnabled: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
54
+ enableEvidence: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
55
+ commitEvidence: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
51
56
  evidence: import("@langchain/langgraph").BinaryOperatorAggregate<Evidence[], Evidence[]>;
52
57
  evidenceRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
53
58
  resumeReason: import("@langchain/langgraph").BinaryOperatorAggregate<string | undefined, string | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAEzF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoGjC,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwHjC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,OAAO,sBAAsB,CAAC,KAAK,CAAC"}
@@ -79,6 +79,26 @@ export const FeatureAgentAnnotation = Annotation.Root({
79
79
  reducer: (_prev, next) => next,
80
80
  default: () => false,
81
81
  }),
82
+ forkAndPr: Annotation({
83
+ reducer: (_prev, next) => next,
84
+ default: () => false,
85
+ }),
86
+ commitSpecs: Annotation({
87
+ reducer: (_prev, next) => next,
88
+ default: () => true,
89
+ }),
90
+ ciWatchEnabled: Annotation({
91
+ reducer: (_prev, next) => next,
92
+ default: () => true,
93
+ }),
94
+ enableEvidence: Annotation({
95
+ reducer: (_prev, next) => next,
96
+ default: () => false,
97
+ }),
98
+ commitEvidence: Annotation({
99
+ reducer: (_prev, next) => next,
100
+ default: () => false,
101
+ }),
82
102
  // --- Evidence state ---
83
103
  evidence: Annotation({
84
104
  reducer: (prev, next) => [...prev, ...next],
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Git Fork Service Implementation
3
+ *
4
+ * Manages GitHub fork operations: forking repos, pushing to forks,
5
+ * creating upstream PRs, and polling upstream PR status.
6
+ * Uses `gh` CLI for all GitHub API interactions.
7
+ */
8
+ import type { IGitForkService } from '../../../application/ports/output/services/git-fork-service.interface.js';
9
+ import type { UpstreamPrResult } from '../../../application/ports/output/services/git-fork-service.interface.js';
10
+ import { PrStatus } from '../../../domain/generated/output.js';
11
+ import type { ExecFunction } from './worktree.service.js';
12
+ export declare class GitForkService implements IGitForkService {
13
+ private readonly execFile;
14
+ constructor(execFile: ExecFunction);
15
+ forkRepository(cwd: string): Promise<void>;
16
+ pushToFork(cwd: string, branch: string): Promise<void>;
17
+ createUpstreamPr(cwd: string, title: string, body: string, head: string, base: string): Promise<UpstreamPrResult>;
18
+ getUpstreamPrStatus(upstreamRepo: string, prNumber: number): Promise<PrStatus>;
19
+ /**
20
+ * Extract owner/repo from a git remote URL.
21
+ * Handles both HTTPS and SSH formats.
22
+ */
23
+ private extractRepoFromUrl;
24
+ }
25
+ //# sourceMappingURL=git-fork.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-fork.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-fork.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0EAA0E,CAAC;AAChH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0EAA0E,CAAC;AAKjH,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,cAAe,YAAW,eAAe;IAChB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C1C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD,gBAAgB,CACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC;IAiDtB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsBpF;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAU3B"}