@shepai/cli 1.76.0-pr245.808d0f5 → 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 (233) 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/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  65. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  68. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  71. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  74. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  77. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  80. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  83. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/_global-error.html +2 -2
  86. package/web/.next/server/app/_global-error.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  88. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  92. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  93. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  95. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  97. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  99. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  101. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  103. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  105. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  122. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/{_60c2d0fa._.js → _2a862f34._.js} +2 -2
  124. package/web/.next/server/chunks/ssr/{_60c2d0fa._.js.map → _2a862f34._.js.map} +1 -1
  125. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  126. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  128. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  130. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  132. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  136. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  138. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  140. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  142. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  143. package/web/.next/server/pages/500.html +2 -2
  144. package/web/.next/server/server-reference-manifest.js +1 -1
  145. package/web/.next/server/server-reference-manifest.json +22 -22
  146. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  147. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  148. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  149. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  150. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  151. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  184. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  185. 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
  186. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  189. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  190. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  193. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  196. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_60c2d0fa._.js → _2a862f34._.js} +2 -2
  198. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  199. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  200. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  201. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  202. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  203. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  204. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  205. 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
  206. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  207. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  208. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  209. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -22
  210. package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +6 -1
  211. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +57 -0
  212. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +21 -0
  213. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +32 -4
  214. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +9 -4
  215. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx +81 -2
  216. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +1 -1
  217. package/web/.next/standalone/src/presentation/web/hooks/use-graph-state.ts +7 -0
  218. package/web/.next/standalone/src/presentation/web/hooks/use-viewport-persistence.ts +2 -0
  219. package/web/.next/static/chunks/{7063e7b488900775.js → 5968047406179daf.js} +1 -1
  220. package/web/.next/static/chunks/{9ae4377d9691e6a5.js → 6a45ff0fe9faf80e.js} +1 -1
  221. package/web/.next/static/chunks/{7198c3cfc0c66730.js → 7ea9e0b8236d5f48.js} +1 -1
  222. package/web/.next/static/chunks/{c5943035be5216df.js → a3a1392c422107d6.js} +1 -1
  223. package/web/.next/static/chunks/{f20d345341fdde0b.js → c558d0da468011b6.js} +1 -1
  224. package/web/.next/static/chunks/{c3b9d5db135f9a6d.js → ce67a6fcc19c61dc.js} +3 -3
  225. package/web/.next/static/chunks/d5b885838e1da36a.js +1 -0
  226. package/web/.next/static/chunks/{a480eff8d4725451.js → e8637d52f6093074.js} +1 -1
  227. package/web/.next/static/chunks/{e6817324c3802b5b.js → efaf0f0eb50be73f.js} +1 -1
  228. package/web/.next/trace +1 -1
  229. package/web/.next/trace-build +1 -1
  230. package/web/.next/static/chunks/135cdb77e3d27078.js +0 -1
  231. /package/web/.next/static/{v-WI-WKnpVXNM4SX7zn33 → TkQduVaaKmOXMiLB6CK5h}/_buildManifest.js +0 -0
  232. /package/web/.next/static/{v-WI-WKnpVXNM4SX7zn33 → TkQduVaaKmOXMiLB6CK5h}/_clientMiddlewareManifest.json +0 -0
  233. /package/web/.next/static/{v-WI-WKnpVXNM4SX7zn33 → TkQduVaaKmOXMiLB6CK5h}/_ssgManifest.js +0 -0
@@ -49,6 +49,8 @@ export interface FeatureCreatePayload {
49
49
  push: boolean;
50
50
  openPr: boolean;
51
51
  parentId?: string;
52
+ /** When true, skip SDLC phases and implement directly from the prompt. */
53
+ fast: boolean;
52
54
  }
53
55
 
54
56
  const AUTO_APPROVE_OPTIONS = [
@@ -97,6 +99,7 @@ export function FeatureCreateDrawer({
97
99
  const [push, setPush] = useState(defaultPush);
98
100
  const [openPr, setOpenPr] = useState(defaultOpenPr);
99
101
  const [parentId, setParentId] = useState<string | undefined>(undefined);
102
+ const [fast, setFast] = useState(false);
100
103
 
101
104
  // Sync state when workflowDefaults load asynchronously
102
105
  useEffect(() => {
@@ -121,6 +124,7 @@ export function FeatureCreateDrawer({
121
124
  setPush(defaultPush);
122
125
  setOpenPr(defaultOpenPr);
123
126
  setParentId(undefined);
127
+ setFast(false);
124
128
  }, [defaultGates, defaultPush, defaultOpenPr]);
125
129
 
126
130
  // Track whether the form has unsaved data
@@ -145,6 +149,7 @@ export function FeatureCreateDrawer({
145
149
  },
146
150
  push: push || openPr,
147
151
  openPr,
152
+ fast,
148
153
  ...(parentId ? { parentId } : {}),
149
154
  });
150
155
  resetForm();
@@ -157,6 +162,7 @@ export function FeatureCreateDrawer({
157
162
  onSubmit,
158
163
  push,
159
164
  openPr,
165
+ fast,
160
166
  parentId,
161
167
  createSound,
162
168
  resetForm,
@@ -258,6 +264,21 @@ export function FeatureCreateDrawer({
258
264
  </div>
259
265
  ) : null}
260
266
 
267
+ {/* Fast mode toggle */}
268
+ <div className="flex flex-col gap-1.5">
269
+ <Label className="text-muted-foreground text-xs font-semibold tracking-wider">
270
+ MODE
271
+ </Label>
272
+ <CheckboxGroupItem
273
+ id="fast-mode"
274
+ label="Fast Mode"
275
+ description="Skip SDLC phases and implement directly from your prompt."
276
+ checked={fast}
277
+ onCheckedChange={setFast}
278
+ disabled={isSubmitting}
279
+ />
280
+ </div>
281
+
261
282
  {/* Auto-approve checkboxes */}
262
283
  <div className="flex flex-col gap-1.5">
263
284
  <Label className="text-muted-foreground text-xs font-semibold tracking-wider">
@@ -1,8 +1,9 @@
1
1
  'use client';
2
2
 
3
- import { useCallback, useEffect, useMemo } from 'react';
3
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
5
  import type { Edge, Viewport } from '@xyflow/react';
6
+ import { useReactFlow } from '@xyflow/react';
6
7
  import { FeaturesCanvas } from '@/components/features/features-canvas';
7
8
  import type { CanvasNodeType } from '@/components/features/features-canvas';
8
9
  import type { FeatureNodeData } from '@/components/common/feature-node';
@@ -18,6 +19,14 @@ import { useViewportPersistence } from '@/hooks/use-viewport-persistence';
18
19
  import { ControlCenterEmptyState } from './control-center-empty-state';
19
20
  import { useControlCenterState } from './use-control-center-state';
20
21
 
22
+ const AUTO_FOCUS_OPTIONS = {
23
+ maxZoom: 1.0,
24
+ padding: 0.5,
25
+ duration: 500,
26
+ } as const;
27
+
28
+ const AUTO_FOCUS_DRAWER_DELAY_MS = 600;
29
+
21
30
  interface ControlCenterInnerProps {
22
31
  initialNodes: CanvasNodeType[];
23
32
  initialEdges: Edge[];
@@ -29,6 +38,8 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
29
38
  const selectedFeatureId = useSelectedFeatureId();
30
39
  const clickSound = useSoundAction('click');
31
40
  const { guardedNavigate } = useDrawerCloseGuard();
41
+ const { fitView } = useReactFlow();
42
+ const drawerTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
32
43
 
33
44
  const {
34
45
  defaultViewport,
@@ -164,11 +175,28 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
164
175
  useEffect(() => {
165
176
  const handler = (e: Event) => {
166
177
  const path = (e as CustomEvent<{ path: string }>).detail.path;
167
- handleAddRepository(path);
178
+ const { wasEmpty, repoPath } = handleAddRepository(path);
179
+
180
+ if (wasEmpty) {
181
+ // Wait for next render so the repo node exists in the DOM, then auto-focus
182
+ setTimeout(() => {
183
+ fitView(AUTO_FOCUS_OPTIONS);
184
+
185
+ // Open the create-feature drawer after the fitView animation completes
186
+ drawerTimerRef.current = setTimeout(() => {
187
+ guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));
188
+ }, AUTO_FOCUS_DRAWER_DELAY_MS);
189
+ }, 0);
190
+ }
168
191
  };
169
192
  window.addEventListener('shep:add-repository', handler);
170
- return () => window.removeEventListener('shep:add-repository', handler);
171
- }, [handleAddRepository]);
193
+ return () => {
194
+ window.removeEventListener('shep:add-repository', handler);
195
+ if (drawerTimerRef.current != null) {
196
+ clearTimeout(drawerTimerRef.current);
197
+ }
198
+ };
199
+ }, [handleAddRepository, fitView, guardedNavigate, router]);
172
200
 
173
201
  // Listen for create events from the create drawer (with real feature ID from server)
174
202
  useEffect(() => {
@@ -36,7 +36,7 @@ export interface ControlCenterState {
36
36
  edges: Edge[];
37
37
  onNodesChange: (changes: NodeChange<CanvasNodeType>[]) => void;
38
38
  handleConnect: (connection: Connection) => void;
39
- handleAddRepository: (path: string) => void;
39
+ handleAddRepository: (path: string) => { wasEmpty: boolean; repoPath: string };
40
40
  handleLayout: (direction: LayoutDirection) => void;
41
41
  handleDeleteFeature: (featureId: string) => void;
42
42
  handleDeleteRepository: (repositoryId: string) => Promise<void>;
@@ -57,6 +57,7 @@ export interface ControlCenterState {
57
57
  const METADATA_UPDATED_MESSAGE = 'Feature metadata updated';
58
58
 
59
59
  let nextFeatureId = 0;
60
+ let nextRepoTempId = 0;
60
61
 
61
62
  export function useControlCenterState(
62
63
  initialNodes: CanvasNodeType[],
@@ -79,6 +80,7 @@ export function useControlCenterState(
79
80
  replaceRepository,
80
81
  getFeatureRepositoryPath,
81
82
  getRepositoryData,
83
+ getRepoMapSize,
82
84
  setCallbacks,
83
85
  } = useGraphState(initialNodes, initialEdges);
84
86
 
@@ -384,8 +386,9 @@ export function useControlCenterState(
384
386
  );
385
387
 
386
388
  const handleAddRepository = useCallback(
387
- (path: string) => {
388
- const tempId = `repo-temp-${Date.now()}`;
389
+ (path: string): { wasEmpty: boolean; repoPath: string } => {
390
+ const wasEmpty = getRepoMapSize() === 0;
391
+ const tempId = `repo-temp-${++nextRepoTempId}`;
389
392
  const repoName =
390
393
  path
391
394
  .replace(/[\\/]+$/, '')
@@ -414,8 +417,10 @@ export function useControlCenterState(
414
417
  removeRepository(tempId);
415
418
  toast.error('Failed to add repository');
416
419
  });
420
+
421
+ return { wasEmpty, repoPath: path };
417
422
  },
418
- [addRepositoryToMap, removeRepository, replaceRepository, createSound]
423
+ [addRepositoryToMap, removeRepository, replaceRepository, createSound, getRepoMapSize]
419
424
  );
420
425
 
421
426
  return {
@@ -5,6 +5,7 @@ import type { CanvasNodeType } from './features-canvas';
5
5
  import type { FeatureNodeType } from '@/components/common/feature-node';
6
6
  import type { RepositoryNodeType } from '@/components/common/repository-node';
7
7
  import { layoutWithDagre } from '@/lib/layout-with-dagre';
8
+ import { DEFAULT_VIEWPORT } from '@/hooks/use-viewport-persistence';
8
9
 
9
10
  const meta: Meta<typeof FeaturesCanvas> = {
10
11
  title: 'Features/FeaturesCanvas',
@@ -561,12 +562,14 @@ export const InteractiveWithRepository: Story = {
561
562
  },
562
563
  };
563
564
 
565
+ // --- Viewport Persistence Stories ---
566
+
564
567
  export const WithSavedViewport: Story = {
565
568
  args: {
566
569
  nodes: repoFeatureNodes,
567
570
  edges: repoFeatureEdges,
568
571
  defaultViewport: { x: 200, y: 150, zoom: 1.0 },
569
- onResetViewport: () => ({ x: 30, y: 30, zoom: 0.85 }),
572
+ onResetViewport: () => DEFAULT_VIEWPORT,
570
573
  },
571
574
  };
572
575
 
@@ -575,6 +578,82 @@ export const ZoomedOutViewport: Story = {
575
578
  nodes: mixedLayoutedNodes,
576
579
  edges: mixedLayoutedEdges,
577
580
  defaultViewport: { x: 0, y: 0, zoom: 0.5 },
578
- onResetViewport: () => ({ x: 30, y: 30, zoom: 0.85 }),
581
+ onResetViewport: () => DEFAULT_VIEWPORT,
582
+ },
583
+ };
584
+
585
+ // --- Fast-mode feature scenario ---
586
+
587
+ const fastModeNodesRaw: CanvasNodeType[] = [
588
+ {
589
+ id: 'repo-1',
590
+ type: 'repositoryNode',
591
+ position: { x: 0, y: 0 },
592
+ data: { name: 'shep-ai/cli' },
593
+ },
594
+ {
595
+ id: 'feat-fast-1',
596
+ type: 'featureNode',
597
+ position: { x: 0, y: 0 },
598
+ data: {
599
+ name: 'Quick Bug Fix',
600
+ description: 'Fast-mode feature — skips SDLC, starts at implementation',
601
+ featureId: '#ff1',
602
+ lifecycle: 'implementation',
603
+ state: 'running',
604
+ progress: 30,
605
+ repositoryPath: '/home/user/my-repo',
606
+ branch: 'feat/quick-bug-fix',
607
+ },
608
+ },
609
+ {
610
+ id: 'feat-full-1',
611
+ type: 'featureNode',
612
+ position: { x: 0, y: 0 },
613
+ data: {
614
+ name: 'Auth Module',
615
+ description: 'Full-pipeline feature — goes through all SDLC phases',
616
+ featureId: '#ff2',
617
+ lifecycle: 'requirements',
618
+ state: 'running',
619
+ progress: 15,
620
+ repositoryPath: '/home/user/my-repo',
621
+ branch: 'feat/auth-module',
622
+ },
623
+ },
624
+ {
625
+ id: 'feat-fast-2',
626
+ type: 'featureNode',
627
+ position: { x: 0, y: 0 },
628
+ data: {
629
+ name: 'Update README',
630
+ description: 'Fast-mode feature — already done',
631
+ featureId: '#ff3',
632
+ lifecycle: 'deploy',
633
+ state: 'done',
634
+ progress: 100,
635
+ repositoryPath: '/home/user/my-repo',
636
+ branch: 'feat/update-readme',
637
+ },
638
+ },
639
+ ];
640
+
641
+ const fastModeEdges: Edge[] = [
642
+ { id: 'e-r1-ff1', source: 'repo-1', target: 'feat-fast-1', ...dashedEdge },
643
+ { id: 'e-r1-ff2', source: 'repo-1', target: 'feat-full-1', ...dashedEdge },
644
+ { id: 'e-r1-ff3', source: 'repo-1', target: 'feat-fast-2', ...dashedEdge },
645
+ ];
646
+
647
+ const { nodes: fastModeLayoutedNodes, edges: fastModeLayoutedEdges } = layoutWithDagre(
648
+ fastModeNodesRaw,
649
+ fastModeEdges,
650
+ { direction: 'LR' }
651
+ );
652
+
653
+ export const FastModeFeatures: Story = {
654
+ name: 'Fast Mode Features (Mixed Pipeline)',
655
+ args: {
656
+ nodes: fastModeLayoutedNodes,
657
+ edges: fastModeLayoutedEdges,
579
658
  },
580
659
  };
@@ -43,7 +43,7 @@ function ResetButton({ onResetViewport }: { onResetViewport: () => Viewport }) {
43
43
 
44
44
  return (
45
45
  <ControlButton onClick={handleReset} title="Reset view" aria-label="Reset view">
46
- <RotateCcw />
46
+ <RotateCcw style={{ fill: 'none' }} />
47
47
  </ControlButton>
48
48
  );
49
49
  }
@@ -45,6 +45,8 @@ export interface UseGraphStateReturn {
45
45
  getFeatureRepositoryPath: (featureNodeId: string) => string | undefined;
46
46
  /** Stable lookup: get repository node data by nodeId. */
47
47
  getRepositoryData: (nodeId: string) => RepositoryNodeData | undefined;
48
+ /** Stable lookup: get the current number of repositories in the domain Map. */
49
+ getRepoMapSize: () => number;
48
50
  /** Update callbacks injected into node data (does NOT trigger re-render). */
49
51
  setCallbacks: (callbacks: GraphCallbacks) => void;
50
52
  }
@@ -353,6 +355,10 @@ export function useGraphState(
353
355
  return repoMapRef.current.get(nodeId)?.data;
354
356
  }, []);
355
357
 
358
+ const getRepoMapSize = useCallback((): number => {
359
+ return repoMapRef.current.size;
360
+ }, []);
361
+
356
362
  const setCallbacks = useCallback((callbacks: GraphCallbacks) => {
357
363
  callbacksRef.current = callbacks;
358
364
  }, []);
@@ -371,6 +377,7 @@ export function useGraphState(
371
377
  replaceRepository,
372
378
  getFeatureRepositoryPath,
373
379
  getRepositoryData,
380
+ getRepoMapSize,
374
381
  setCallbacks,
375
382
  };
376
383
  }
@@ -3,6 +3,8 @@
3
3
  import { useCallback, useEffect, useRef } from 'react';
4
4
  import type { Viewport } from '@xyflow/react';
5
5
 
6
+ export type { Viewport } from '@xyflow/react';
7
+
6
8
  export const STORAGE_KEY = 'shep-canvas-viewport';
7
9
  export const DEBOUNCE_MS = 500;
8
10