@shepai/cli 1.164.1 → 1.165.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 (191) hide show
  1. package/dist/src/presentation/web/components/common/repo-group/repo-group.d.ts +3 -1
  2. package/dist/src/presentation/web/components/common/repo-group/repo-group.d.ts.map +1 -1
  3. package/dist/src/presentation/web/components/common/repo-group/repo-group.js +6 -3
  4. package/dist/src/presentation/web/components/common/repo-group/repo-group.stories.d.ts +1 -0
  5. package/dist/src/presentation/web/components/common/repo-group/repo-group.stories.d.ts.map +1 -1
  6. package/dist/src/presentation/web/components/common/repo-group/repo-group.stories.js +10 -1
  7. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  8. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +4 -1
  9. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts +3 -1
  10. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  11. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  12. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +2 -0
  14. package/dist/tsconfig.build.tsbuildinfo +1 -1
  15. package/package.json +1 -1
  16. package/web/.next/BUILD_ID +1 -1
  17. package/web/.next/build-manifest.json +2 -2
  18. package/web/.next/fallback-build-manifest.json +2 -2
  19. package/web/.next/prerender-manifest.json +3 -3
  20. package/web/.next/required-server-files.js +2 -2
  21. package/web/.next/required-server-files.json +2 -2
  22. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  23. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  25. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  26. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  29. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  30. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  31. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  32. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  33. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  35. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  36. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  38. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  41. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  44. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  47. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  50. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  56. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  59. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  62. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/_global-error.html +2 -2
  65. package/web/.next/server/app/_global-error.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  68. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  70. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  71. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  72. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  73. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  75. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  76. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  78. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  79. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  81. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  82. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  84. package/web/.next/server/app/version/page.js.nft.json +1 -1
  85. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  87. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  88. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  90. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js +2 -2
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d0c3840._.js +3 -0
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d0c3840._.js.map +1 -0
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js +2 -2
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
  112. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  114. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/_0727935d._.js +1 -1
  116. package/web/.next/server/chunks/ssr/_0727935d._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  118. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
  120. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  122. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/_43ba79e7._.js +3 -0
  124. package/web/.next/server/chunks/ssr/_43ba79e7._.js.map +1 -0
  125. package/web/.next/server/chunks/ssr/{_3694ac1d._.js → _44591fa7._.js} +2 -2
  126. package/web/.next/server/chunks/ssr/{_3694ac1d._.js.map → _44591fa7._.js.map} +1 -1
  127. package/web/.next/server/chunks/ssr/_506a3bc3._.js +9 -0
  128. package/web/.next/server/chunks/ssr/_506a3bc3._.js.map +1 -0
  129. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  130. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/{_423abf07._.js → _616a8ac1._.js} +2 -2
  132. package/web/.next/server/chunks/ssr/_616a8ac1._.js.map +1 -0
  133. package/web/.next/server/chunks/ssr/_9215e9ec._.js +1 -1
  134. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
  137. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  139. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/{_97d6bed3._.js → _d582e961._.js} +2 -2
  141. package/web/.next/server/chunks/ssr/{_97d6bed3._.js.map → _d582e961._.js.map} +1 -1
  142. package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
  143. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  145. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  147. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  149. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  151. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  153. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  159. package/web/.next/server/pages/500.html +2 -2
  160. package/web/.next/server/server-reference-manifest.js +1 -1
  161. package/web/.next/server/server-reference-manifest.json +47 -47
  162. package/web/.next/static/chunks/{d45bab7ae6805b07.js → 1a3b885d3f886bcb.js} +1 -1
  163. package/web/.next/static/chunks/{eeadf13c0ea6cbe0.css → 1e6609edc3367244.css} +1 -1
  164. package/web/.next/static/chunks/{abffc5c232738d87.js → 21f9eacf5581b713.js} +1 -1
  165. package/web/.next/static/chunks/{dbd876611e25a77a.js → 2b3740e29ed9b3de.js} +2 -2
  166. package/web/.next/static/chunks/{87aab386fe53c79a.js → 558d87d09cd1cc45.js} +1 -1
  167. package/web/.next/static/chunks/{89846d73600950d1.js → 5c6428d4679cd574.js} +1 -1
  168. package/web/.next/static/chunks/{2bf4ef44d86ffc3b.js → 61e13c3bd0f3cd25.js} +2 -2
  169. package/web/.next/static/chunks/{779b5c49587b074e.js → 65440524d7ee7d13.js} +1 -1
  170. package/web/.next/static/chunks/8b0a9cb5109fe899.js +1 -0
  171. package/web/.next/static/chunks/90fbdf461b7ec652.js +1 -0
  172. package/web/.next/static/chunks/{6590ee22b55e119c.js → 9461ce4baa99276f.js} +1 -1
  173. package/web/.next/static/chunks/{ba1873d442ce6a95.js → bec9239427893a91.js} +1 -1
  174. package/web/.next/static/chunks/{57ab723edeb11139.js → c96dff98886884ee.js} +3 -3
  175. package/web/.next/static/chunks/{2afb3ff30c02d222.js → cad3cca5183ead26.js} +1 -1
  176. package/web/.next/static/chunks/ccdd1bc568f11f61.js +7 -0
  177. package/web/.next/static/chunks/e4be686cb3bd28f0.js +1 -0
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0be67c7._.js +0 -3
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0be67c7._.js.map +0 -1
  180. package/web/.next/server/chunks/ssr/_423abf07._.js.map +0 -1
  181. package/web/.next/server/chunks/ssr/_c45aee16._.js +0 -3
  182. package/web/.next/server/chunks/ssr/_c45aee16._.js.map +0 -1
  183. package/web/.next/server/chunks/ssr/_cc654b75._.js +0 -9
  184. package/web/.next/server/chunks/ssr/_cc654b75._.js.map +0 -1
  185. package/web/.next/static/chunks/648c64fc71830213.js +0 -1
  186. package/web/.next/static/chunks/966eb2688300b7f5.js +0 -1
  187. package/web/.next/static/chunks/9ddf7523e76e17a5.js +0 -7
  188. package/web/.next/static/chunks/9f8caef46056054a.js +0 -1
  189. /package/web/.next/static/{xUxHXKly7tXyWCOO7vL7O → rkwlBjHfpnafQpJdBxN27}/_buildManifest.js +0 -0
  190. /package/web/.next/static/{xUxHXKly7tXyWCOO7vL7O → rkwlBjHfpnafQpJdBxN27}/_clientMiddlewareManifest.json +0 -0
  191. /package/web/.next/static/{xUxHXKly7tXyWCOO7vL7O → rkwlBjHfpnafQpJdBxN27}/_ssgManifest.js +0 -0
@@ -7,6 +7,8 @@ export interface RepoGroupProps {
7
7
  children: ReactNode;
8
8
  /** Whether the group starts expanded (default: true) */
9
9
  defaultOpen?: boolean;
10
+ /** Called when the user clicks the + button to add a feature */
11
+ onAddFeature?: () => void;
10
12
  }
11
- export declare function RepoGroup({ repoName, featureCount, children, defaultOpen, }: RepoGroupProps): import("react/jsx-runtime").JSX.Element;
13
+ export declare function RepoGroup({ repoName, featureCount, children, defaultOpen, onAddFeature, }: RepoGroupProps): import("react/jsx-runtime").JSX.Element;
12
14
  //# sourceMappingURL=repo-group.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repo-group.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repo-group/repo-group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,WAAkB,GACnB,EAAE,cAAc,2CAiChB"}
1
+ {"version":3,"file":"repo-group.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repo-group/repo-group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,WAAkB,EAClB,YAAY,GACb,EAAE,cAAc,2CAoDhB"}
@@ -1,9 +1,12 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
- import { ChevronDown, GitFork } from 'lucide-react';
4
+ import { ChevronDown, GitFork, Plus } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
- export function RepoGroup({ repoName, featureCount, children, defaultOpen = true, }) {
6
+ export function RepoGroup({ repoName, featureCount, children, defaultOpen = true, onAddFeature, }) {
7
7
  const [open, setOpen] = useState(defaultOpen);
8
- return (_jsxs("div", { "data-testid": "repo-group", className: "mb-1", children: [_jsxs("button", { type: "button", onClick: () => setOpen(!open), className: cn('text-sidebar-foreground hover:bg-sidebar-accent flex w-full items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-xs font-semibold', 'transition-colors duration-100'), "aria-expanded": open, children: [_jsx(ChevronDown, { className: cn('text-muted-foreground h-3.5 w-3.5 shrink-0 transition-transform duration-200', !open && '-rotate-90') }), _jsx(GitFork, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: repoName }), _jsx("span", { "aria-label": `${featureCount} features`, className: "bg-sidebar-accent text-sidebar-accent-foreground ml-auto inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full px-1 text-[0.6rem] font-medium tabular-nums", role: "img", children: featureCount })] }), open ? _jsx("div", { className: "pl-2", children: children }) : null] }));
8
+ return (_jsxs("div", { "data-testid": "repo-group", className: "group/repo mb-1", children: [_jsxs("div", { className: "flex items-center", children: [_jsxs("button", { type: "button", onClick: () => setOpen(!open), className: cn('text-sidebar-foreground hover:bg-sidebar-accent flex min-w-0 flex-1 items-center gap-1.5 rounded-md px-2 py-1.5 text-left text-xs font-semibold', 'transition-colors duration-100'), "aria-expanded": open, children: [_jsx(ChevronDown, { className: cn('text-muted-foreground h-3.5 w-3.5 shrink-0 transition-transform duration-200', !open && '-rotate-90') }), _jsx(GitFork, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: repoName }), _jsx("span", { "aria-label": `${featureCount} features`, className: "bg-sidebar-accent text-sidebar-accent-foreground ml-auto inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full px-1 text-[0.6rem] font-medium tabular-nums", role: "img", children: featureCount })] }), onAddFeature ? (_jsx("button", { type: "button", "data-testid": "repo-add-feature", onClick: (e) => {
9
+ e.stopPropagation();
10
+ onAddFeature();
11
+ }, className: cn('text-muted-foreground hover:text-sidebar-foreground hover:bg-sidebar-accent shrink-0 rounded-md p-1 opacity-0 transition-all duration-100 group-hover/repo:opacity-100', 'focus-visible:ring-ring focus-visible:opacity-100 focus-visible:ring-1 focus-visible:outline-none'), "aria-label": `Add feature to ${repoName}`, children: _jsx(Plus, { className: "h-3.5 w-3.5" }) })) : null] }), open ? _jsx("div", { className: "pl-2", children: children }) : null] }));
9
12
  }
@@ -6,5 +6,6 @@ type Story = StoryObj<typeof meta>;
6
6
  export declare const Default: Story;
7
7
  export declare const SingleFeature: Story;
8
8
  export declare const Collapsed: Story;
9
+ export declare const WithAddFeature: Story;
9
10
  export declare const MultipleRepos: Story;
10
11
  //# sourceMappingURL=repo-group.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repo-group.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repo-group/repo-group.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CAgBhC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAgBrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAU3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAevB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAyB3B,CAAC"}
1
+ {"version":3,"file":"repo-group.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repo-group/repo-group.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,SAAS,CAgBhC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAgBrB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAU3B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAevB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAgB5B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAyB3B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { fn } from '@storybook/test';
2
3
  import { SidebarProvider } from '../../ui/sidebar.js';
3
4
  import { FeatureListItem } from '../../common/feature-list-item/index.js';
4
5
  import { FeatureStatusGroup } from '../../common/feature-status-group/index.js';
@@ -37,6 +38,14 @@ export const Collapsed = {
37
38
  children: (_jsxs(FeatureStatusGroup, { label: "In Progress", count: 5, children: [_jsx(FeatureListItem, { name: "Feature A", status: "in-progress", startedAt: Date.now() - 60_000 }), _jsx(FeatureListItem, { name: "Feature B", status: "in-progress", startedAt: Date.now() - 120_000 }), _jsx(FeatureListItem, { name: "Feature C", status: "in-progress", startedAt: Date.now() - 180_000 }), _jsx(FeatureListItem, { name: "Feature D", status: "in-progress", startedAt: Date.now() - 240_000 }), _jsx(FeatureListItem, { name: "Feature E", status: "in-progress", startedAt: Date.now() - 300_000 })] })),
38
39
  },
39
40
  };
41
+ export const WithAddFeature = {
42
+ args: {
43
+ repoName: 'my-project',
44
+ featureCount: 2,
45
+ onAddFeature: fn(),
46
+ children: (_jsxs(_Fragment, { children: [_jsx(FeatureStatusGroup, { label: "In Progress", count: 1, children: _jsx(FeatureListItem, { name: "Dashboard", status: "in-progress", startedAt: Date.now() - 330_000 }) }), _jsx(FeatureStatusGroup, { label: "Done", count: 1, children: _jsx(FeatureListItem, { name: "Settings Page", status: "done", duration: "2h" }) })] })),
47
+ },
48
+ };
40
49
  export const MultipleRepos = {
41
- render: () => (_jsxs(_Fragment, { children: [_jsxs(RepoGroup, { repoName: "frontend", featureCount: 2, children: [_jsx(FeatureStatusGroup, { label: "In Progress", count: 1, children: _jsx(FeatureListItem, { name: "Dashboard", status: "in-progress", startedAt: Date.now() - 330_000 }) }), _jsx(FeatureStatusGroup, { label: "Done", count: 1, children: _jsx(FeatureListItem, { name: "Settings Page", status: "done", duration: "2h" }) })] }), _jsxs(RepoGroup, { repoName: "backend-api", featureCount: 2, children: [_jsx(FeatureStatusGroup, { label: "Action Needed", count: 1, children: _jsx(FeatureListItem, { name: "Auth Module", status: "action-needed" }) }), _jsx(FeatureStatusGroup, { label: "In Progress", count: 1, children: _jsx(FeatureListItem, { name: "API Gateway", status: "in-progress", startedAt: Date.now() - 60_000 }) })] })] })),
50
+ render: () => (_jsxs(_Fragment, { children: [_jsxs(RepoGroup, { repoName: "frontend", featureCount: 2, onAddFeature: fn(), children: [_jsx(FeatureStatusGroup, { label: "In Progress", count: 1, children: _jsx(FeatureListItem, { name: "Dashboard", status: "in-progress", startedAt: Date.now() - 330_000 }) }), _jsx(FeatureStatusGroup, { label: "Done", count: 1, children: _jsx(FeatureListItem, { name: "Settings Page", status: "done", duration: "2h" }) })] }), _jsxs(RepoGroup, { repoName: "backend-api", featureCount: 2, onAddFeature: fn(), children: [_jsx(FeatureStatusGroup, { label: "Action Needed", count: 1, children: _jsx(FeatureListItem, { name: "Auth Module", status: "action-needed" }) }), _jsx(FeatureStatusGroup, { label: "In Progress", count: 1, children: _jsx(FeatureListItem, { name: "API Gateway", status: "in-progress", startedAt: Date.now() - 60_000 }) })] })] })),
42
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAqBzE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAiHD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,aAAa,2CAiBhE"}
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAqBzE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAyHD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,aAAa,2CAiBhE"}
@@ -26,6 +26,9 @@ function AppShellInner({ children, sidebarOpen }) {
26
26
  const handleFeatureClick = useCallback((featureId) => {
27
27
  guardedNavigate(() => router.push(`/feature/${featureId}`));
28
28
  }, [router, guardedNavigate]);
29
+ const handleAddFeature = useCallback((repositoryPath) => {
30
+ guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repositoryPath)}`));
31
+ }, [router, guardedNavigate]);
29
32
  const [addingRepo, setAddingRepo] = useState(false);
30
33
  const [githubDialogOpen, setGithubDialogOpen] = useState(false);
31
34
  const [showReactPicker, setShowReactPicker] = useState(false);
@@ -76,7 +79,7 @@ function AppShellInner({ children, sidebarOpen }) {
76
79
  window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path: repository.path } }));
77
80
  }
78
81
  }, []);
79
- return (_jsxs(SidebarProvider, { defaultOpen: sidebarOpen ?? false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsx("main", { className: "h-full", children: children }), _jsx(GlobalChatPopup, {}), featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleGitHubImportComplete })) : null] }) }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
82
+ return (_jsxs(SidebarProvider, { defaultOpen: sidebarOpen ?? false, children: [_jsx(AppSidebar, { features: features, featureFlags: featureFlags, onFeatureClick: handleFeatureClick, onAddFeature: handleAddFeature }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsx("main", { className: "h-full", children: children }), _jsx(GlobalChatPopup, {}), featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleGitHubImportComplete })) : null] }) }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
80
83
  if (!open)
81
84
  setShowReactPicker(false);
82
85
  }, onSelect: handleReactPickerSelect })] }));
@@ -15,6 +15,8 @@ export interface AppSidebarProps {
15
15
  features: FeatureItem[];
16
16
  featureFlags: FeatureFlagsState;
17
17
  onFeatureClick?: (featureId: string) => void;
18
+ /** Called when the user clicks the + button on a repo group to create a feature */
19
+ onAddFeature?: (repositoryPath: string) => void;
18
20
  }
19
- export declare function AppSidebar({ features, featureFlags, onFeatureClick, }: AppSidebarProps): import("react/jsx-runtime").JSX.Element;
21
+ export declare function AppSidebar({ features, featureFlags, onFeatureClick, onAddFeature, }: AppSidebarProps): import("react/jsx-runtime").JSX.Element;
20
22
  //# sourceMappingURL=app-sidebar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,GACf,EAAE,eAAe,2CAqQjB"}
1
+ {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,mFAAmF;IACnF,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,EACd,YAAY,GACb,EAAE,eAAe,2CA0QjB"}
@@ -22,7 +22,7 @@ import { featureStatusConfig, featureStatusOrder } from '../../common/feature-st
22
22
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
23
23
  import { useDeferredMount } from '../../../hooks/use-deferred-mount.js';
24
24
  import { useVersion } from '../../../hooks/use-version.js';
25
- export function AppSidebar({ features, featureFlags, onFeatureClick, }) {
25
+ export function AppSidebar({ features, featureFlags, onFeatureClick, onAddFeature, }) {
26
26
  const { t, i18n } = useTranslation('web');
27
27
  const pathname = usePathname();
28
28
  const { state } = useSidebar();
@@ -68,7 +68,7 @@ export function AppSidebar({ features, featureFlags, onFeatureClick, }) {
68
68
  'flex min-h-0 flex-1 flex-col overflow-hidden transition-opacity duration-200 ease-out',
69
69
  '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
70
70
  expandedVisible ? 'opacity-100' : 'opacity-0',
71
- ].join(' '), children: [_jsx(SidebarSectionHeader, { label: t('sidebar.features') }), _jsx(ScrollArea, { className: "min-h-0 flex-1", children: repoGroups.map(({ repoPath, repoName, featureCount, statusGroups }) => (_jsx(RepoGroup, { repoName: repoName, featureCount: featureCount, children: statusGroups.map(({ statusKey, label, items }) => (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, agentType: feature.agentType, modelId: feature.modelId, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, statusKey))) }, repoPath))) })] })) : null }), _jsx(SidebarFooter, { className: "border-t p-2", children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx("div", { className: "flex items-center gap-1", children: _jsxs(TooltipProvider, { children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { className: "w-auto flex-none", onClick: (e) => {
71
+ ].join(' '), children: [_jsx(SidebarSectionHeader, { label: t('sidebar.features') }), _jsx(ScrollArea, { className: "min-h-0 flex-1", children: repoGroups.map(({ repoPath, repoName, featureCount, statusGroups }) => (_jsx(RepoGroup, { repoName: repoName, featureCount: featureCount, onAddFeature: onAddFeature ? () => onAddFeature(repoPath) : undefined, children: statusGroups.map(({ statusKey, label, items }) => (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, agentType: feature.agentType, modelId: feature.modelId, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, statusKey))) }, repoPath))) })] })) : null }), _jsx(SidebarFooter, { className: "border-t p-2", children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx("div", { className: "flex items-center gap-1", children: _jsxs(TooltipProvider, { children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { className: "w-auto flex-none", onClick: (e) => {
72
72
  const currentResolved = theme === 'system' ? resolvedTheme : theme;
73
73
  const goingToDark = currentResolved !== 'dark';
74
74
  const newTheme = theme === 'system'
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgB3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA+DnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAIlC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KA6BrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAmElC,CAAC"}
1
+ {"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAgB3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA+DnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAKlC,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KA6BrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAmElC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { fn } from '@storybook/test';
2
3
  import { SidebarProvider, SidebarInset } from '../../ui/sidebar.js';
3
4
  import { AppSidebar } from './app-sidebar.js';
4
5
  const defaultFeatureFlags = {
@@ -96,6 +97,7 @@ export const Default = {
96
97
  export const WithNewFeatureButton = {
97
98
  args: {
98
99
  features: mockFeatures,
100
+ onAddFeature: fn(),
99
101
  },
100
102
  };
101
103
  export const Collapsed = {