@shepai/cli 1.76.0 → 1.77.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 (239) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +1 -0
  2. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +4 -1
  4. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +5 -2
  7. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
  8. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +220 -0
  10. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -0
  11. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.js +66 -0
  12. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +1 -0
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +3 -0
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +1 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +10 -1
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.js +1 -0
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts +21 -0
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts.map +1 -0
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +60 -0
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.d.ts +25 -0
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.d.ts.map +1 -0
  25. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.js +176 -0
  26. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +1 -1
  27. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.js +8 -3
  29. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  30. package/dist/src/presentation/cli/commands/feat/new.command.js +2 -0
  31. package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -0
  32. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  33. package/dist/src/presentation/web/app/actions/create-feature.js +3 -1
  34. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
  35. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  36. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +5 -1
  37. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +18 -0
  38. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +49 -0
  40. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +28 -4
  42. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +4 -1
  43. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +6 -3
  45. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  46. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +1 -0
  47. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +71 -2
  49. package/dist/src/presentation/web/hooks/use-graph-state.d.ts +2 -0
  50. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  51. package/dist/src/presentation/web/hooks/use-graph-state.js +4 -0
  52. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +1 -0
  53. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -1
  54. package/dist/tsconfig.build.tsbuildinfo +1 -1
  55. package/package.json +1 -1
  56. package/web/.next/BUILD_ID +1 -1
  57. package/web/.next/build-manifest.json +2 -2
  58. package/web/.next/cache/.previewinfo +1 -1
  59. package/web/.next/cache/.rscinfo +1 -1
  60. package/web/.next/cache/.tsbuildinfo +1 -1
  61. package/web/.next/cache/config.json +3 -3
  62. package/web/.next/fallback-build-manifest.json +2 -2
  63. package/web/.next/prerender-manifest.json +3 -3
  64. package/web/.next/required-server-files.js +1 -1
  65. package/web/.next/required-server-files.json +1 -1
  66. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  67. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  70. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  73. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  76. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  79. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  80. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  82. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  85. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  86. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/_global-error.html +2 -2
  88. package/web/.next/server/app/_global-error.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  92. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  93. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  94. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  95. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  97. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  99. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  101. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  103. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  105. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  107. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  125. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/{_a3854150._.js → _2a862f34._.js} +2 -2
  127. package/web/.next/server/chunks/ssr/{_a3854150._.js.map → _2a862f34._.js.map} +1 -1
  128. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  129. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  131. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  133. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  135. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  139. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  141. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  143. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  145. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  146. package/web/.next/server/pages/500.html +2 -2
  147. package/web/.next/server/server-reference-manifest.js +1 -1
  148. package/web/.next/server/server-reference-manifest.json +22 -22
  149. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  150. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  151. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  152. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  184. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  186. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  190. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  193. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  195. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  196. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  198. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  199. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  200. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  201. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  202. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_a3854150._.js → _2a862f34._.js} +2 -2
  203. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  204. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  205. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  206. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  207. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  208. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  209. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  210. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  211. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  212. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  213. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  214. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -22
  215. package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +6 -1
  216. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +57 -0
  217. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +21 -0
  218. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +32 -4
  219. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +9 -4
  220. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx +81 -2
  221. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +1 -1
  222. package/web/.next/standalone/src/presentation/web/hooks/use-graph-state.ts +7 -0
  223. package/web/.next/standalone/src/presentation/web/hooks/use-viewport-persistence.ts +2 -0
  224. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  225. package/web/.next/static/chunks/{293231ccc0b144fa.js → 5968047406179daf.js} +1 -1
  226. package/web/.next/static/chunks/{255140c45a023ff4.js → 6a45ff0fe9faf80e.js} +1 -1
  227. package/web/.next/static/chunks/{9a765e022ef2b815.js → 7ea9e0b8236d5f48.js} +1 -1
  228. package/web/.next/static/chunks/{6931ae67c2484ddf.js → a3a1392c422107d6.js} +1 -1
  229. package/web/.next/static/chunks/{3bc2a07d02372939.js → c558d0da468011b6.js} +1 -1
  230. package/web/.next/static/chunks/{c1dbeb3307dab443.js → ce67a6fcc19c61dc.js} +3 -3
  231. package/web/.next/static/chunks/d5b885838e1da36a.js +1 -0
  232. package/web/.next/static/chunks/{d7786685ec8efe10.js → e8637d52f6093074.js} +1 -1
  233. package/web/.next/static/chunks/{716547ef8d13139d.js → efaf0f0eb50be73f.js} +1 -1
  234. package/web/.next/trace +1 -1
  235. package/web/.next/trace-build +1 -1
  236. package/web/.next/static/chunks/11a6c88ffcbac93f.js +0 -1
  237. /package/web/.next/static/{L6_6jZ4TnQuuDXIF5GZEf → TkQduVaaKmOXMiLB6CK5h}/_buildManifest.js +0 -0
  238. /package/web/.next/static/{L6_6jZ4TnQuuDXIF5GZEf → TkQduVaaKmOXMiLB6CK5h}/_clientMiddlewareManifest.json +0 -0
  239. /package/web/.next/static/{L6_6jZ4TnQuuDXIF5GZEf → TkQduVaaKmOXMiLB6CK5h}/_ssgManifest.js +0 -0
@@ -32,6 +32,7 @@ export interface IFeatureAgentProcessService {
32
32
  openPr?: boolean;
33
33
  resumePayload?: string;
34
34
  agentType?: AgentType;
35
+ fast?: boolean;
35
36
  }): number;
36
37
  /**
37
38
  * Check if a process is still alive.
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-process.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/feature-agent-process.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;;;;;;OAQG;IACH,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB,GACA,MAAM,CAAC;IAEV;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE9B;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD"}
1
+ {"version":3,"file":"feature-agent-process.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/agents/feature-agent-process.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;;;;;;;OAQG;IACH,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,GACA,MAAM,CAAC;IAEV;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE9B;;;;;OAKG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD"}
@@ -22,12 +22,15 @@ export interface ISpecInitializerService {
22
22
  * - tasks.yaml
23
23
  * - feature.yaml
24
24
  *
25
+ * When mode is 'fast', only feature.yaml is created (no spec/research/plan/tasks).
26
+ *
25
27
  * @param basePath - Directory to create specs/ in (typically the worktree path)
26
28
  * @param slug - Feature slug (kebab-case, e.g., "user-authentication")
27
29
  * @param featureNumber - Sequential feature number (will be zero-padded to 3 digits)
28
30
  * @param description - Feature description for template substitution
31
+ * @param mode - Optional mode; when 'fast', only feature.yaml is created
29
32
  * @returns The spec directory path and feature number used
30
33
  */
31
- initialize(basePath: string, slug: string, featureNumber: number, description: string): Promise<SpecInitializerResult>;
34
+ initialize(basePath: string, slug: string, featureNumber: number, description: string, mode?: 'fast'): Promise<SpecInitializerResult>;
32
35
  }
33
36
  //# sourceMappingURL=spec-initializer.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec-initializer.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/spec-initializer.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;;;;;;;;OAeG;IACH,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnC"}
1
+ {"version":3,"file":"spec-initializer.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/spec-initializer.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAEtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAGhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAhBZ,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa;IAG9C;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgH1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAiE1D"}
1
+ {"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAEtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAGhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAhBZ,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa;IAG9C;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAkH1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAmE1D"}
@@ -70,7 +70,9 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
70
70
  * No AI calls, no git operations — just DB writes.
71
71
  */
72
72
  async createRecord(input) {
73
- let initialLifecycle = SdlcLifecycle.Requirements;
73
+ let initialLifecycle = input.fast
74
+ ? SdlcLifecycle.Implementation
75
+ : SdlcLifecycle.Requirements;
74
76
  let shouldSpawn = true;
75
77
  let effectiveRepoPath = input.repositoryPath;
76
78
  if (input.parentId) {
@@ -188,7 +190,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
188
190
  const worktreePath = this.worktreeService.getWorktreePath(effectiveRepoPath, branch);
189
191
  await this.worktreeService.create(effectiveRepoPath, branch, worktreePath, defaultBranch);
190
192
  // Initialize spec directory — full user input goes into spec.yaml as-is
191
- const { specDir } = await this.specInitializer.initialize(worktreePath, slug, featureNumber, input.userInput);
193
+ const { specDir } = await this.specInitializer.initialize(worktreePath, slug, featureNumber, input.userInput, input.fast ? 'fast' : undefined);
192
194
  // Update feature record with refined metadata, branch, and specPath
193
195
  const updatedFeature = {
194
196
  ...feature,
@@ -208,6 +210,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
208
210
  threadId: agentRun?.threadId ?? randomUUID(),
209
211
  push: input.push ?? false,
210
212
  openPr: input.openPr ?? false,
213
+ ...(input.fast ? { fast: true } : {}),
211
214
  });
212
215
  }
213
216
  return { warning, updatedFeature };
@@ -11,6 +11,8 @@ export interface CreateFeatureInput {
11
11
  name?: string;
12
12
  /** Pre-supplied description (skips AI metadata extraction for description). */
13
13
  description?: string;
14
+ /** When true, skip SDLC phases and implement directly from the user prompt. */
15
+ fast?: boolean;
14
16
  }
15
17
  export interface CreateFeatureResult {
16
18
  feature: Feature;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAErF,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,WAAW,EAAE,OAAO,CAAC;CACtB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAErF,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,WAAW,EAAE,OAAO,CAAC;CACtB"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Fast Feature Agent Graph Factory
3
+ *
4
+ * Creates a LangGraph StateGraph with only 2 nodes: fast-implement → merge.
5
+ * This is the fast-mode alternative to createFeatureAgentGraph() which has
6
+ * 15+ nodes. The merge node and its CI watch/fix loop are reused via
7
+ * composition from the full graph's createMergeNode().
8
+ *
9
+ * Uses the same FeatureAgentAnnotation state shape as the full graph,
10
+ * enabling checkpointing, resume, and identical worker lifecycle handling.
11
+ */
12
+ import { type BaseCheckpointSaver } from '@langchain/langgraph';
13
+ import type { IAgentExecutor } from '../../../../application/ports/output/agents/agent-executor.interface.js';
14
+ import { type MergeNodeDeps } from './nodes/merge/merge.node.js';
15
+ export { FeatureAgentAnnotation, type FeatureAgentState } from './state.js';
16
+ /**
17
+ * Dependencies needed to build the fast feature agent graph.
18
+ * Same shape as FeatureAgentGraphDeps for consistency.
19
+ */
20
+ export interface FastFeatureAgentGraphDeps {
21
+ executor: IAgentExecutor;
22
+ mergeNodeDeps?: Omit<MergeNodeDeps, 'executor'>;
23
+ }
24
+ /**
25
+ * Factory function that creates and compiles the fast-mode feature agent graph.
26
+ *
27
+ * The graph defines a minimal workflow:
28
+ * START → fast-implement → merge → conditional(reexecute or END)
29
+ *
30
+ * When merge is rejected, routeReexecution routes back to fast-implement
31
+ * for a fresh implementation pass.
32
+ *
33
+ * @param depsOrExecutor - Graph dependencies or a legacy executor
34
+ * @param checkpointer - Optional checkpoint saver for state persistence
35
+ * @returns A compiled LangGraph ready to be invoked
36
+ */
37
+ export declare function createFastFeatureAgentGraph(depsOrExecutor: FastFeatureAgentGraphDeps | IAgentExecutor, checkpointer?: BaseCheckpointSaver): import("@langchain/langgraph").CompiledStateGraph<{
38
+ featureId: string;
39
+ repositoryPath: string;
40
+ specDir: string;
41
+ worktreePath: string;
42
+ currentNode: string;
43
+ error: string | null;
44
+ approvalGates: import("../../../../domain/index.js").ApprovalGates | undefined;
45
+ messages: string[];
46
+ validationRetries: number;
47
+ lastValidationTarget: string;
48
+ lastValidationErrors: string[];
49
+ _approvalAction: string | null;
50
+ _rejectionFeedback: string | null;
51
+ _needsReexecution: boolean;
52
+ prUrl: string | null;
53
+ prNumber: number | null;
54
+ commitHash: string | null;
55
+ ciStatus: string | null;
56
+ push: boolean;
57
+ openPr: boolean;
58
+ ciFixAttempts: number;
59
+ ciFixHistory: import("../../../../domain/index.js").CiFixRecord[];
60
+ ciFixStatus: "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted";
61
+ }, {
62
+ featureId?: string | undefined;
63
+ repositoryPath?: string | undefined;
64
+ specDir?: string | undefined;
65
+ worktreePath?: string | undefined;
66
+ currentNode?: string | undefined;
67
+ error?: string | null | undefined;
68
+ approvalGates?: import("../../../../domain/index.js").ApprovalGates | undefined;
69
+ messages?: string[] | undefined;
70
+ validationRetries?: number | undefined;
71
+ lastValidationTarget?: string | undefined;
72
+ lastValidationErrors?: string[] | undefined;
73
+ _approvalAction?: string | null | undefined;
74
+ _rejectionFeedback?: string | null | undefined;
75
+ _needsReexecution?: boolean | undefined;
76
+ prUrl?: string | null | undefined;
77
+ prNumber?: number | null | undefined;
78
+ commitHash?: string | null | undefined;
79
+ ciStatus?: string | null | undefined;
80
+ push?: boolean | undefined;
81
+ openPr?: boolean | undefined;
82
+ ciFixAttempts?: number | undefined;
83
+ ciFixHistory?: import("../../../../domain/index.js").CiFixRecord[] | undefined;
84
+ ciFixStatus?: "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted" | undefined;
85
+ }, "__start__" | "fast-implement", {
86
+ featureId: {
87
+ (): import("@langchain/langgraph").LastValue<string>;
88
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
89
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
90
+ };
91
+ repositoryPath: {
92
+ (): import("@langchain/langgraph").LastValue<string>;
93
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
94
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
95
+ };
96
+ specDir: {
97
+ (): import("@langchain/langgraph").LastValue<string>;
98
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
99
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
100
+ };
101
+ worktreePath: {
102
+ (): import("@langchain/langgraph").LastValue<string>;
103
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
104
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
105
+ };
106
+ currentNode: {
107
+ (): import("@langchain/langgraph").LastValue<string>;
108
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
109
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
110
+ };
111
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
112
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").ApprovalGates | undefined, import("../../../../domain/index.js").ApprovalGates | undefined>;
113
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
114
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
115
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
116
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
117
+ _approvalAction: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
118
+ _rejectionFeedback: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
119
+ _needsReexecution: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
120
+ prUrl: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
121
+ prNumber: import("@langchain/langgraph").BinaryOperatorAggregate<number | null, number | null>;
122
+ commitHash: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
123
+ ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
124
+ push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
125
+ openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
126
+ ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
127
+ ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
128
+ ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
129
+ }, {
130
+ featureId: {
131
+ (): import("@langchain/langgraph").LastValue<string>;
132
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
133
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
134
+ };
135
+ repositoryPath: {
136
+ (): import("@langchain/langgraph").LastValue<string>;
137
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
138
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
139
+ };
140
+ specDir: {
141
+ (): import("@langchain/langgraph").LastValue<string>;
142
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
143
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
144
+ };
145
+ worktreePath: {
146
+ (): import("@langchain/langgraph").LastValue<string>;
147
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
148
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
149
+ };
150
+ currentNode: {
151
+ (): import("@langchain/langgraph").LastValue<string>;
152
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
153
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
154
+ };
155
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
156
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").ApprovalGates | undefined, import("../../../../domain/index.js").ApprovalGates | undefined>;
157
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
158
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
159
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
160
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
161
+ _approvalAction: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
162
+ _rejectionFeedback: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
163
+ _needsReexecution: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
164
+ prUrl: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
165
+ prNumber: import("@langchain/langgraph").BinaryOperatorAggregate<number | null, number | null>;
166
+ commitHash: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
167
+ ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
168
+ push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
169
+ openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
170
+ ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
171
+ ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
172
+ ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
173
+ }, import("@langchain/langgraph").StateDefinition, {
174
+ "fast-implement": Partial<import("@langchain/langgraph").StateType<{
175
+ featureId: {
176
+ (): import("@langchain/langgraph").LastValue<string>;
177
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
178
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
179
+ };
180
+ repositoryPath: {
181
+ (): import("@langchain/langgraph").LastValue<string>;
182
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
183
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
184
+ };
185
+ specDir: {
186
+ (): import("@langchain/langgraph").LastValue<string>;
187
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
188
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
189
+ };
190
+ worktreePath: {
191
+ (): import("@langchain/langgraph").LastValue<string>;
192
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
193
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
194
+ };
195
+ currentNode: {
196
+ (): import("@langchain/langgraph").LastValue<string>;
197
+ (annotation: import("@langchain/langgraph").SingleReducer<string, string>): import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
198
+ Root: <S extends import("@langchain/langgraph").StateDefinition>(sd: S) => import("@langchain/langgraph").AnnotationRoot<S>;
199
+ };
200
+ error: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
201
+ approvalGates: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").ApprovalGates | undefined, import("../../../../domain/index.js").ApprovalGates | undefined>;
202
+ messages: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
203
+ validationRetries: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
204
+ lastValidationTarget: import("@langchain/langgraph").BinaryOperatorAggregate<string, string>;
205
+ lastValidationErrors: import("@langchain/langgraph").BinaryOperatorAggregate<string[], string[]>;
206
+ _approvalAction: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
207
+ _rejectionFeedback: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
208
+ _needsReexecution: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
209
+ prUrl: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
210
+ prNumber: import("@langchain/langgraph").BinaryOperatorAggregate<number | null, number | null>;
211
+ commitHash: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
212
+ ciStatus: import("@langchain/langgraph").BinaryOperatorAggregate<string | null, string | null>;
213
+ push: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
214
+ openPr: import("@langchain/langgraph").BinaryOperatorAggregate<boolean, boolean>;
215
+ ciFixAttempts: import("@langchain/langgraph").BinaryOperatorAggregate<number, number>;
216
+ ciFixHistory: import("@langchain/langgraph").BinaryOperatorAggregate<import("../../../../domain/index.js").CiFixRecord[], import("../../../../domain/index.js").CiFixRecord[]>;
217
+ ciFixStatus: import("@langchain/langgraph").BinaryOperatorAggregate<"success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted", "success" | "timeout" | "idle" | "watching" | "fixing" | "exhausted">;
218
+ }>>;
219
+ }, unknown, unknown>;
220
+ //# sourceMappingURL=fast-feature-agent-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAGpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAGlF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AAkBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,yBAAyB,GAAG,cAAc,EAC1D,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA6BnC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Fast Feature Agent Graph Factory
3
+ *
4
+ * Creates a LangGraph StateGraph with only 2 nodes: fast-implement → merge.
5
+ * This is the fast-mode alternative to createFeatureAgentGraph() which has
6
+ * 15+ nodes. The merge node and its CI watch/fix loop are reused via
7
+ * composition from the full graph's createMergeNode().
8
+ *
9
+ * Uses the same FeatureAgentAnnotation state shape as the full graph,
10
+ * enabling checkpointing, resume, and identical worker lifecycle handling.
11
+ */
12
+ import { StateGraph, START, END } from '@langchain/langgraph';
13
+ import { FeatureAgentAnnotation } from './state.js';
14
+ import { createFastImplementNode } from './nodes/fast-implement.node.js';
15
+ import { createMergeNode } from './nodes/merge/merge.node.js';
16
+ // Re-export for consumers
17
+ export { FeatureAgentAnnotation } from './state.js';
18
+ /**
19
+ * Conditional edge: route back to fast-implement on merge rejection,
20
+ * otherwise proceed to END.
21
+ *
22
+ * Mirrors the routeReexecution() pattern from feature-agent-graph.ts.
23
+ */
24
+ function routeReexecution(selfNode, nextNode) {
25
+ return (state) => {
26
+ if (state._needsReexecution)
27
+ return selfNode;
28
+ return nextNode;
29
+ };
30
+ }
31
+ /**
32
+ * Factory function that creates and compiles the fast-mode feature agent graph.
33
+ *
34
+ * The graph defines a minimal workflow:
35
+ * START → fast-implement → merge → conditional(reexecute or END)
36
+ *
37
+ * When merge is rejected, routeReexecution routes back to fast-implement
38
+ * for a fresh implementation pass.
39
+ *
40
+ * @param depsOrExecutor - Graph dependencies or a legacy executor
41
+ * @param checkpointer - Optional checkpoint saver for state persistence
42
+ * @returns A compiled LangGraph ready to be invoked
43
+ */
44
+ export function createFastFeatureAgentGraph(depsOrExecutor, checkpointer) {
45
+ // Support legacy signature: createFastFeatureAgentGraph(executor, checkpointer)
46
+ const deps = 'execute' in depsOrExecutor ? { executor: depsOrExecutor } : depsOrExecutor;
47
+ const { executor } = deps;
48
+ const graph = new StateGraph(FeatureAgentAnnotation).addNode('fast-implement', createFastImplementNode(executor));
49
+ // Wire merge node when deps are provided
50
+ if (deps.mergeNodeDeps) {
51
+ const mergeNodeDeps = {
52
+ executor,
53
+ ...deps.mergeNodeDeps,
54
+ };
55
+ graph
56
+ .addNode('merge', createMergeNode(mergeNodeDeps))
57
+ .addEdge(START, 'fast-implement')
58
+ .addEdge('fast-implement', 'merge')
59
+ .addConditionalEdges('merge', routeReexecution('fast-implement', END));
60
+ }
61
+ else {
62
+ // Without merge deps, fast-implement goes directly to END
63
+ graph.addEdge(START, 'fast-implement').addEdge('fast-implement', END);
64
+ }
65
+ return graph.compile({ checkpointer });
66
+ }
@@ -20,6 +20,7 @@ export declare class FeatureAgentProcessService implements IFeatureAgentProcessS
20
20
  openPr?: boolean;
21
21
  resumePayload?: string;
22
22
  agentType?: AgentType;
23
+ fast?: boolean;
23
24
  }): number;
24
25
  isAlive(pid: number): boolean;
25
26
  checkAndMarkCrashed(runId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-process.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACxH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAC/G,OAAO,EAAkB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAYlG,qBAAa,0BAA2B,YAAW,2BAA2B;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,mBAAmB;IAE/D,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB,GACA,MAAM;IA6DT,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASvB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAexD"}
1
+ {"version":3,"file":"feature-agent-process.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACxH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAC/G,OAAO,EAAkB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAYlG,qBAAa,0BAA2B,YAAW,2BAA2B;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,mBAAmB;IAE/D,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QACR,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,GACA,MAAM;IAgET,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IASvB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAexD"}
@@ -65,6 +65,9 @@ export class FeatureAgentProcessService {
65
65
  if (options?.agentType) {
66
66
  args.push('--agent-type', options.agentType);
67
67
  }
68
+ if (options?.fast) {
69
+ args.push('--fast');
70
+ }
68
71
  // Create log file for worker output (for debugging)
69
72
  const logsDir = join(homedir(), '.shep', 'logs');
70
73
  mkdirSync(logsDir, { recursive: true });
@@ -25,6 +25,7 @@ export interface WorkerArgs {
25
25
  openPr?: boolean;
26
26
  resumePayload?: string;
27
27
  agentType?: AgentType;
28
+ fast?: boolean;
28
29
  }
29
30
  /**
30
31
  * Parse CLI arguments into a WorkerArgs object.
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAa1B,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAS9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA2D1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiN/D"}
1
+ {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAe1B,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAS9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA6D1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0N/D"}
@@ -14,6 +14,7 @@ import { homedir } from 'node:os';
14
14
  import { Command } from '@langchain/langgraph';
15
15
  import { initializeContainer, container } from '../../../di/container.js';
16
16
  import { createFeatureAgentGraph } from './feature-agent-graph.js';
17
+ import { createFastFeatureAgentGraph } from './fast-feature-agent-graph.js';
17
18
  import { createCheckpointer } from '../common/checkpointer.js';
18
19
  import { AgentRunStatus } from '../../../../domain/generated/output.js';
19
20
  import { initializeSettings } from '../../../services/settings.service.js';
@@ -51,6 +52,7 @@ export function parseWorkerArgs(args) {
51
52
  const resumeFromInterrupt = args.includes('--resume-from-interrupt');
52
53
  const push = args.includes('--push');
53
54
  const openPr = args.includes('--open-pr');
55
+ const fast = args.includes('--fast');
54
56
  const threadIdx = args.indexOf('--thread-id');
55
57
  const threadId = threadIdx !== -1 && threadIdx + 1 < args.length ? args[threadIdx + 1] : undefined;
56
58
  const agentTypeIdx = args.indexOf('--agent-type');
@@ -75,6 +77,7 @@ export function parseWorkerArgs(args) {
75
77
  openPr,
76
78
  resumePayload,
77
79
  agentType,
80
+ fast,
78
81
  };
79
82
  }
80
83
  /** Simple worker logger — writes to stdout which is redirected to log file by the parent. */
@@ -115,6 +118,7 @@ export async function runWorker(args) {
115
118
  log(` worktreePath=${args.worktreePath ?? '(none)'}`);
116
119
  log(` approvalGates=${args.approvalGates ? JSON.stringify(args.approvalGates) : '(none)'}`);
117
120
  log(` resume=${args.resume}`);
121
+ log(` fast=${args.fast ?? false}`);
118
122
  log('Initializing container...');
119
123
  await initializeContainer();
120
124
  // Initialize settings in the worker process
@@ -155,7 +159,12 @@ export async function runWorker(args) {
155
159
  const checkpointPath = join(homedir(), '.shep', 'checkpoints', `${checkpointId}.db`);
156
160
  log(`Creating checkpointer at ${checkpointPath} (thread: ${checkpointId})`);
157
161
  const checkpointer = createCheckpointer(checkpointPath);
158
- const graph = createFeatureAgentGraph(graphDeps, checkpointer);
162
+ // Both graph factories return compiled graphs with identical FeatureAgentAnnotation
163
+ // state shape and invoke() interface. Cast through unknown because the compiled
164
+ // graphs have different node name types but share the same runtime contract.
165
+ const graph = args.fast
166
+ ? createFastFeatureAgentGraph(graphDeps, checkpointer)
167
+ : createFeatureAgentGraph(graphDeps, checkpointer);
159
168
  // Mark the run as running with our PID
160
169
  const now = new Date();
161
170
  log(`Updating status to running (PID ${process.pid})...`);
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle-context.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D;;;;GAIG;AACH,UAAU,gBAAgB;IACxB,OAAO,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,aAAa,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChF;AAeD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzE"}
1
+ {"version":3,"file":"lifecycle-context.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D;;;;GAIG;AACH,UAAU,gBAAgB;IACxB,OAAO,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,aAAa,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChF;AAgBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzE"}
@@ -24,6 +24,7 @@ const NODE_TO_LIFECYCLE = {
24
24
  research: SdlcLifecycle.Research,
25
25
  plan: SdlcLifecycle.Planning,
26
26
  implement: SdlcLifecycle.Implementation,
27
+ 'fast-implement': SdlcLifecycle.Implementation,
27
28
  merge: SdlcLifecycle.Review,
28
29
  };
29
30
  /**
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Fast-Implement Node
3
+ *
4
+ * Single-pass implementation node for fast mode. Builds a prompt from
5
+ * the user's query plus lightweight codebase context, calls the executor
6
+ * once, and returns. Does NOT handle commit/push/PR — that's the merge
7
+ * node's job.
8
+ *
9
+ * Follows the same factory pattern as other nodes: takes executor
10
+ * dependency, returns async (state) => Partial<FeatureAgentState>.
11
+ */
12
+ import type { IAgentExecutor } from '../../../../../application/ports/output/agents/agent-executor.interface.js';
13
+ import type { FeatureAgentState } from '../state.js';
14
+ /**
15
+ * Factory that creates the fast-implement node function.
16
+ *
17
+ * @param executor - The agent executor to use for implementation
18
+ * @returns A LangGraph node function
19
+ */
20
+ export declare function createFastImplementNode(executor: IAgentExecutor): (state: FeatureAgentState) => Promise<Partial<FeatureAgentState>>;
21
+ //# sourceMappingURL=fast-implement.node.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Fast-Implement Node
3
+ *
4
+ * Single-pass implementation node for fast mode. Builds a prompt from
5
+ * the user's query plus lightweight codebase context, calls the executor
6
+ * once, and returns. Does NOT handle commit/push/PR — that's the merge
7
+ * node's job.
8
+ *
9
+ * Follows the same factory pattern as other nodes: takes executor
10
+ * dependency, returns async (state) => Partial<FeatureAgentState>.
11
+ */
12
+ import { isGraphBubbleUp } from '@langchain/langgraph';
13
+ import { createNodeLogger, buildExecutorOptions, retryExecute } from './node-helpers.js';
14
+ import { reportNodeStart } from '../heartbeat.js';
15
+ import { recordPhaseStart, recordPhaseEnd } from '../phase-timing-context.js';
16
+ import { updateNodeLifecycle } from '../lifecycle-context.js';
17
+ import { buildFastImplementPrompt } from './prompts/fast-implement.prompt.js';
18
+ /**
19
+ * Factory that creates the fast-implement node function.
20
+ *
21
+ * @param executor - The agent executor to use for implementation
22
+ * @returns A LangGraph node function
23
+ */
24
+ export function createFastImplementNode(executor) {
25
+ const log = createNodeLogger('fast-implement');
26
+ return async (state) => {
27
+ log.info('Starting fast implementation');
28
+ reportNodeStart('fast-implement');
29
+ await updateNodeLifecycle('fast-implement');
30
+ const startTime = Date.now();
31
+ const timingId = await recordPhaseStart('fast-implement');
32
+ try {
33
+ const prompt = buildFastImplementPrompt(state);
34
+ const options = buildExecutorOptions(state);
35
+ log.info(`Executing agent at cwd=${options.cwd}`);
36
+ log.info(`Prompt length: ${prompt.length} chars`);
37
+ const result = await retryExecute(executor, prompt, options, { logger: log });
38
+ const durationMs = Date.now() - startTime;
39
+ const elapsed = (durationMs / 1000).toFixed(1);
40
+ log.info(`Complete (${result.result.length} chars, ${elapsed}s)`);
41
+ await recordPhaseEnd(timingId, durationMs);
42
+ return {
43
+ currentNode: 'fast-implement',
44
+ messages: [`[fast-implement] Complete (${result.result.length} chars, ${elapsed}s)`],
45
+ _needsReexecution: false,
46
+ };
47
+ }
48
+ catch (err) {
49
+ if (isGraphBubbleUp(err))
50
+ throw err;
51
+ const message = err instanceof Error ? err.message : String(err);
52
+ const durationMs = Date.now() - startTime;
53
+ const elapsed = (durationMs / 1000).toFixed(1);
54
+ log.error(`${message} (after ${elapsed}s)`);
55
+ await recordPhaseEnd(timingId, durationMs);
56
+ // Throw so LangGraph does NOT checkpoint this node as "completed".
57
+ throw new Error(`[fast-implement] ${message}`);
58
+ }
59
+ };
60
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Fast-Implement Prompt Builder
3
+ *
4
+ * Builds a single-pass implementation prompt for fast mode.
5
+ * Combines the user's raw query with lightweight codebase context
6
+ * (CLAUDE.md, package.json, shallow directory listing).
7
+ *
8
+ * The prompt instructs the executor to implement changes and run tests,
9
+ * but NOT to commit, push, or create PRs (that's the merge node's job).
10
+ */
11
+ import type { FeatureAgentState } from '../../state.js';
12
+ /**
13
+ * Build the fast-implement prompt from user query + codebase context.
14
+ *
15
+ * The prompt includes:
16
+ * 1. User's raw query (from spec.yaml userQuery field)
17
+ * 2. CLAUDE.md content (if exists)
18
+ * 3. package.json (if exists)
19
+ * 4. Shallow directory listing (depth 1-2)
20
+ *
21
+ * Instructs the executor to implement, test, and validate — but NOT
22
+ * commit/push/PR (that's the merge node's job).
23
+ */
24
+ export declare function buildFastImplementPrompt(state: FeatureAgentState): string;
25
+ //# sourceMappingURL=fast-implement.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-implement.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA+FxD;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAiEzE"}