@shepai/cli 1.60.0 → 1.62.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 (180) hide show
  1. package/dist/src/presentation/web/components/common/action-button/action-button.d.ts.map +1 -1
  2. package/dist/src/presentation/web/components/common/action-button/action-button.js +7 -1
  3. package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts +1 -1
  4. package/dist/src/presentation/web/components/common/action-button/action-button.stories.d.ts.map +1 -1
  5. package/dist/src/presentation/web/components/common/action-button/action-button.stories.js +1 -1
  6. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
  7. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +10 -1
  8. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts +20 -0
  9. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts.map +1 -0
  10. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.js +68 -0
  11. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  12. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +23 -2
  13. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  14. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -2
  15. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +16 -3
  17. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +1 -1
  18. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -1
  20. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.js +14 -1
  22. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts +2 -0
  23. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.js +2 -0
  25. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.js +4 -1
  27. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts +1 -0
  28. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.js +1 -0
  30. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +14 -1
  32. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +1 -1
  33. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -1
  35. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.d.ts.map +1 -1
  36. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.js +13 -0
  37. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts +2 -0
  38. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.js +2 -0
  40. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  41. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  42. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +7 -13
  43. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
  44. package/dist/src/presentation/web/hooks/use-notifications.js +18 -18
  45. package/dist/src/presentation/web/hooks/use-sound-action.d.ts +100 -0
  46. package/dist/src/presentation/web/hooks/use-sound-action.d.ts.map +1 -0
  47. package/dist/src/presentation/web/hooks/use-sound-action.js +42 -0
  48. package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts +6 -0
  49. package/dist/src/presentation/web/hooks/use-sound-action.stories.d.ts.map +1 -0
  50. package/dist/src/presentation/web/hooks/use-sound-action.stories.js +61 -0
  51. package/dist/tsconfig.build.tsbuildinfo +1 -1
  52. package/package.json +1 -1
  53. package/web/.next/BUILD_ID +1 -1
  54. package/web/.next/build-manifest.json +2 -2
  55. package/web/.next/cache/.previewinfo +1 -1
  56. package/web/.next/cache/.rscinfo +1 -1
  57. package/web/.next/cache/.tsbuildinfo +1 -1
  58. package/web/.next/cache/config.json +3 -3
  59. package/web/.next/fallback-build-manifest.json +2 -2
  60. package/web/.next/prerender-manifest.json +3 -3
  61. package/web/.next/required-server-files.js +1 -1
  62. package/web/.next/required-server-files.json +1 -1
  63. package/web/.next/server/app/_global-error.html +2 -2
  64. package/web/.next/server/app/_global-error.rsc +1 -1
  65. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  68. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  69. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  70. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  71. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  72. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/page/server-reference-manifest.json +14 -14
  74. package/web/.next/server/app/page.js.nft.json +1 -1
  75. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
  77. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  78. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  80. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  81. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  83. package/web/.next/server/app/version/page.js.nft.json +1 -1
  84. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  102. package/web/.next/server/chunks/ssr/{_34627374._.js → _d3711354._.js} +2 -2
  103. package/web/.next/server/chunks/ssr/_d3711354._.js.map +1 -0
  104. package/web/.next/server/pages/500.html +2 -2
  105. package/web/.next/server/server-reference-manifest.js +1 -1
  106. package/web/.next/server/server-reference-manifest.json +15 -15
  107. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  108. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  109. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  110. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  111. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  112. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  113. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  114. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  115. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  116. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  117. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  118. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  119. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  120. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  121. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
  122. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  123. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  124. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +1 -1
  125. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  126. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  127. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  128. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  129. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  130. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  131. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  132. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  133. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  134. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2395adc6._.js +1 -1
  135. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  136. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  137. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__87fda958._.js +1 -1
  138. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  139. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +2 -2
  140. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +1 -1
  141. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  142. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_34627374._.js → _d3711354._.js} +2 -2
  143. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  144. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  145. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
  146. package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.stories.tsx +1 -1
  147. package/web/.next/standalone/src/presentation/web/components/common/action-button/action-button.tsx +9 -1
  148. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx +82 -0
  149. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +16 -2
  150. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +29 -3
  151. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +14 -2
  152. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -1
  153. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +17 -4
  154. package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.stories.tsx +2 -0
  155. package/web/.next/standalone/src/presentation/web/components/common/sidebar-collapse-toggle/sidebar-collapse-toggle.tsx +14 -1
  156. package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.stories.tsx +1 -0
  157. package/web/.next/standalone/src/presentation/web/components/common/sidebar-nav-item/sidebar-nav-item.tsx +6 -1
  158. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +1 -1
  159. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +14 -1
  160. package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.stories.tsx +2 -0
  161. package/web/.next/standalone/src/presentation/web/components/common/theme-toggle/theme-toggle.tsx +14 -0
  162. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +2 -2
  163. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +7 -12
  164. package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +20 -19
  165. package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.stories.tsx +107 -0
  166. package/web/.next/standalone/src/presentation/web/hooks/use-sound-action.ts +53 -0
  167. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  168. package/web/.next/static/chunks/{bac5122e95f5c7eb.js → 13664c029245afc8.js} +1 -1
  169. package/web/.next/static/chunks/45f510f84c7c417d.css +2 -0
  170. package/web/.next/static/chunks/8e4c719503d9387e.js +1 -0
  171. package/web/.next/static/chunks/cd44f06f18e3425a.js +10 -0
  172. package/web/.next/trace +1 -1
  173. package/web/.next/trace-build +1 -1
  174. package/web/.next/server/chunks/ssr/_34627374._.js.map +0 -1
  175. package/web/.next/static/chunks/1fe24572a810eafa.js +0 -10
  176. package/web/.next/static/chunks/7d3c5ae8f47e74cd.js +0 -1
  177. package/web/.next/static/chunks/8b2879f911a05b55.css +0 -2
  178. /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → 2z-UoCok36_D1hh1-N88G}/_buildManifest.js +0 -0
  179. /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → 2z-UoCok36_D1hh1-N88G}/_clientMiddlewareManifest.json +0 -0
  180. /package/web/.next/static/{enyZhg62FqP6oInxg1T3h → 2z-UoCok36_D1hh1-N88G}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "node": {
3
- "005002b953331ef2b32b0ee2a29b030254fa27d4f8": {
3
+ "007a62721e1bc5362586b473fae8c3f95131819457": {
4
4
  "workers": {
5
5
  "app/_not-found/page": {
6
6
  "moduleId": 66973,
@@ -43,7 +43,7 @@
43
43
  "filename": "src/presentation/web/app/actions/pick-folder.ts",
44
44
  "exportedName": "pickFolder"
45
45
  },
46
- "603678ffdda82d766bd57b7cf3a44583c6af1bd731": {
46
+ "6009aa3c55bba1ddde7b13bf164dcd3ca47c18796e": {
47
47
  "workers": {
48
48
  "app/page": {
49
49
  "moduleId": 16555,
@@ -58,7 +58,7 @@
58
58
  "filename": "src/presentation/web/app/actions/approve-feature.ts",
59
59
  "exportedName": "approveFeature"
60
60
  },
61
- "6088bf597ba6473c1afca4f0297666105be5a15c9e": {
61
+ "60cfc37a2191fd62989f5c7336084946887366097e": {
62
62
  "workers": {
63
63
  "app/page": {
64
64
  "moduleId": 16555,
@@ -73,7 +73,7 @@
73
73
  "filename": "src/presentation/web/app/actions/reject-feature.ts",
74
74
  "exportedName": "rejectFeature"
75
75
  },
76
- "40bc811484a5f239d58ee65a0bd59328811ff2b4e3": {
76
+ "4048eaf5f7609b4ef04f879498d18d73ca951fe1a6": {
77
77
  "workers": {
78
78
  "app/page": {
79
79
  "moduleId": 16555,
@@ -88,7 +88,7 @@
88
88
  "filename": "src/presentation/web/app/actions/get-feature-artifact.ts",
89
89
  "exportedName": "getFeatureArtifact"
90
90
  },
91
- "4007171cf7da2fd054e5e014401e5c9cc36635fd04": {
91
+ "40957ee941603cfc08dfa297df5bb4a4349446eae2": {
92
92
  "workers": {
93
93
  "app/page": {
94
94
  "moduleId": 16555,
@@ -103,7 +103,7 @@
103
103
  "filename": "src/presentation/web/app/actions/get-research-artifact.ts",
104
104
  "exportedName": "getResearchArtifact"
105
105
  },
106
- "00db78a75eeac6610a7482f83c2d6e9cf7821846dd": {
106
+ "00800d322465815891a1a89a535319abbc467a4764": {
107
107
  "workers": {
108
108
  "app/page": {
109
109
  "moduleId": 16555,
@@ -118,7 +118,7 @@
118
118
  "filename": "src/presentation/web/app/actions/get-workflow-defaults.ts",
119
119
  "exportedName": "getWorkflowDefaults"
120
120
  },
121
- "4090f202fed23dc9161fabe4c27979ced8bead4ba9": {
121
+ "40ccc596c8732aa1aea4988c8c4849c043d6e8cfd0": {
122
122
  "workers": {
123
123
  "app/page": {
124
124
  "moduleId": 16555,
@@ -133,7 +133,7 @@
133
133
  "filename": "src/presentation/web/app/actions/get-merge-review-data.ts",
134
134
  "exportedName": "getMergeReviewData"
135
135
  },
136
- "407d5afd78499db86e3eff56fdb63e778de00b36b1": {
136
+ "4061cc10691887f77f67e764939de05c9e670098a2": {
137
137
  "workers": {
138
138
  "app/page": {
139
139
  "moduleId": 16555,
@@ -148,7 +148,7 @@
148
148
  "filename": "src/presentation/web/app/actions/open-ide.ts",
149
149
  "exportedName": "openIde"
150
150
  },
151
- "409f8daa4548d14a38c6edfc3041836f18795b19d9": {
151
+ "40a654c23471f5749fd5a822bb7bde886b4a18803d": {
152
152
  "workers": {
153
153
  "app/page": {
154
154
  "moduleId": 16555,
@@ -163,7 +163,7 @@
163
163
  "filename": "src/presentation/web/app/actions/open-shell.ts",
164
164
  "exportedName": "openShell"
165
165
  },
166
- "406dc7ef8c8774e1e72b1453fc61d10d0c28e8c665": {
166
+ "4095e26b914b90885e19c106f328bf95e365943a01": {
167
167
  "workers": {
168
168
  "app/page": {
169
169
  "moduleId": 16555,
@@ -178,7 +178,7 @@
178
178
  "filename": "src/presentation/web/app/actions/open-folder.ts",
179
179
  "exportedName": "openFolder"
180
180
  },
181
- "402fada86fc26ca8ede1ba9c4c6b166807b445ec7e": {
181
+ "4028cbc8b7daaf40907e6b11b058b81357f988dce5": {
182
182
  "workers": {
183
183
  "app/page": {
184
184
  "moduleId": 16555,
@@ -193,7 +193,7 @@
193
193
  "filename": "src/presentation/web/app/actions/create-feature.ts",
194
194
  "exportedName": "createFeature"
195
195
  },
196
- "40d8a084578197cb61b49f374df7aebd4123184ee8": {
196
+ "40a5f2b9870c264affcc0afed840b19d7736760d09": {
197
197
  "workers": {
198
198
  "app/page": {
199
199
  "moduleId": 16555,
@@ -208,7 +208,7 @@
208
208
  "filename": "src/presentation/web/app/actions/delete-feature.ts",
209
209
  "exportedName": "deleteFeature"
210
210
  },
211
- "407df636fc8220cd03b329236c8672fe57a23588d7": {
211
+ "40ec31fc0e50addf6a63fe78fd2265089ea6fc2436": {
212
212
  "workers": {
213
213
  "app/page": {
214
214
  "moduleId": 16555,
@@ -223,7 +223,7 @@
223
223
  "filename": "src/presentation/web/app/actions/add-repository.ts",
224
224
  "exportedName": "addRepository"
225
225
  },
226
- "404d9996266111ff820086d49653feeaf03304d055": {
226
+ "40f152f20c14e3edf19b73729aad8232a78f9bddcd": {
227
227
  "workers": {
228
228
  "app/page": {
229
229
  "moduleId": 16555,
@@ -240,5 +240,5 @@
240
240
  }
241
241
  },
242
242
  "edge": {},
243
- "encryptionKey": "BSWjcQYQYXudhnah0VC2q2mhJZ50qvsRRMCnweVbWwU="
243
+ "encryptionKey": "OdTyfJgxB9kSZVRPajI4sJD9Ig3KfcfHQ67zTSc0fRs="
244
244
  }
@@ -24,7 +24,7 @@ function noop() {
24
24
  // intentional no-op for stories
25
25
  }
26
26
 
27
- /** Default labeled button with outline variant. */
27
+ /** Default labeled button with outline variant. Plays "click" sound on press. */
28
28
  export const Default: Story = {
29
29
  args: {
30
30
  onClick: noop,
@@ -4,6 +4,7 @@ import type { LucideIcon } from 'lucide-react';
4
4
  import { Loader2, CircleAlert } from 'lucide-react';
5
5
  import { cn } from '@/lib/utils';
6
6
  import { Button } from '@/components/ui/button';
7
+ import { useSoundAction } from '@/hooks/use-sound-action';
7
8
 
8
9
  export interface ActionButtonProps {
9
10
  label: string;
@@ -29,13 +30,20 @@ export function ActionButton({
29
30
  variant = 'outline',
30
31
  size = 'sm',
31
32
  }: ActionButtonProps) {
33
+ const clickSound = useSoundAction('click');
34
+
35
+ const handleClick = () => {
36
+ clickSound.play();
37
+ onClick();
38
+ };
39
+
32
40
  return (
33
41
  <Button
34
42
  variant={variant}
35
43
  size={size}
36
44
  aria-label={label}
37
45
  disabled={loading}
38
- onClick={onClick}
46
+ onClick={handleClick}
39
47
  className={cn(
40
48
  'gap-1.5',
41
49
  error && 'text-destructive hover:text-destructive',
@@ -0,0 +1,82 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
3
+ import { Check } from 'lucide-react';
4
+ import { DrawerActionBar } from './drawer-action-bar';
5
+
6
+ const meta: Meta<typeof DrawerActionBar> = {
7
+ title: 'Composed/DrawerActionBar',
8
+ component: DrawerActionBar,
9
+ tags: ['autodocs'],
10
+ parameters: {
11
+ layout: 'centered',
12
+ },
13
+ args: {
14
+ onApprove: fn().mockName('onApprove'),
15
+ approveLabel: 'Approve',
16
+ },
17
+ decorators: [
18
+ (Story) => (
19
+ <div className="w-[400px] rounded-md border">
20
+ <Story />
21
+ </div>
22
+ ),
23
+ ],
24
+ };
25
+
26
+ export default meta;
27
+ type Story = StoryObj<typeof DrawerActionBar>;
28
+
29
+ /** Default — approve button only. Plays "approve" sound on click. */
30
+ export const Default: Story = {};
31
+
32
+ /** With approve icon. */
33
+ export const WithIcon: Story = {
34
+ args: {
35
+ approveLabel: 'Approve PRD',
36
+ approveIcon: <Check className="mr-1.5 h-4 w-4" />,
37
+ },
38
+ };
39
+
40
+ /** With reject button. Plays "reject" sound on reject click, "approve" on approve. */
41
+ export const WithReject: Story = {
42
+ args: {
43
+ onReject: fn().mockName('onReject'),
44
+ approveLabel: 'Approve',
45
+ },
46
+ };
47
+
48
+ /** Processing state — buttons disabled, no sounds play. */
49
+ export const Processing: Story = {
50
+ args: {
51
+ onReject: fn().mockName('onReject'),
52
+ approveLabel: 'Approve',
53
+ isProcessing: true,
54
+ },
55
+ };
56
+
57
+ /** Rejecting state — buttons disabled. */
58
+ export const Rejecting: Story = {
59
+ args: {
60
+ onReject: fn().mockName('onReject'),
61
+ approveLabel: 'Approve',
62
+ isRejecting: true,
63
+ },
64
+ };
65
+
66
+ /** With revision input and reject button. */
67
+ export const WithRevisionInput: Story = {
68
+ args: {
69
+ onReject: fn().mockName('onReject'),
70
+ approveLabel: 'Approve',
71
+ revisionPlaceholder: 'Ask AI to revise the plan...',
72
+ },
73
+ };
74
+
75
+ /** Custom reject dialog title. */
76
+ export const CustomRejectTitle: Story = {
77
+ args: {
78
+ onReject: fn().mockName('onReject'),
79
+ approveLabel: 'Approve Plan',
80
+ rejectDialogTitle: 'Reject Plan',
81
+ },
82
+ };
@@ -5,6 +5,7 @@ import { X } from 'lucide-react';
5
5
  import { Button } from '@/components/ui/button';
6
6
  import { RejectFeedbackDialog } from '@/components/common/reject-feedback-dialog';
7
7
  import { DrawerRevisionInput } from '@/components/common/drawer-revision-input';
8
+ import { useSoundAction } from '@/hooks/use-sound-action';
8
9
  import type { DrawerActionBarProps } from './drawer-action-bar-config';
9
10
 
10
11
  export function DrawerActionBar({
@@ -20,6 +21,8 @@ export function DrawerActionBar({
20
21
  children,
21
22
  }: DrawerActionBarProps) {
22
23
  const [rejectDialogOpen, setRejectDialogOpen] = useState(false);
24
+ const approveSound = useSoundAction('approve');
25
+ const rejectSound = useSoundAction('reject');
23
26
  const disabled = isProcessing || isRejecting;
24
27
 
25
28
  return (
@@ -40,7 +43,10 @@ export function DrawerActionBar({
40
43
  variant="outline"
41
44
  className="text-destructive hover:text-destructive"
42
45
  disabled={disabled}
43
- onClick={() => setRejectDialogOpen(true)}
46
+ onClick={() => {
47
+ rejectSound.play();
48
+ setRejectDialogOpen(true);
49
+ }}
44
50
  >
45
51
  <X className="mr-1.5 h-4 w-4" />
46
52
  Reject
@@ -54,7 +60,15 @@ export function DrawerActionBar({
54
60
  />
55
61
  </>
56
62
  ) : null}
57
- <Button type="button" className="flex-1" disabled={disabled} onClick={onApprove}>
63
+ <Button
64
+ type="button"
65
+ className="flex-1"
66
+ disabled={disabled}
67
+ onClick={() => {
68
+ approveSound.play();
69
+ onApprove();
70
+ }}
71
+ >
58
72
  {approveIcon}
59
73
  {approveLabel}
60
74
  </Button>
@@ -14,6 +14,7 @@ import {
14
14
  CheckIcon,
15
15
  } from 'lucide-react';
16
16
  import { cn } from '@/lib/utils';
17
+ import { useSoundAction } from '@/hooks/use-sound-action';
17
18
  import {
18
19
  Drawer,
19
20
  DrawerContent,
@@ -93,6 +94,9 @@ export function FeatureCreateDrawer({
93
94
  features,
94
95
  initialParentId,
95
96
  }: FeatureCreateDrawerProps) {
97
+ const drawerOpenSound = useSoundAction('drawer-open');
98
+ const drawerCloseSound = useSoundAction('drawer-close');
99
+ const createSound = useSoundAction('create');
96
100
  const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;
97
101
  const defaultPush = workflowDefaults?.push ?? false;
98
102
  const defaultOpenPr = workflowDefaults?.openPr ?? false;
@@ -105,6 +109,13 @@ export function FeatureCreateDrawer({
105
109
  const [openPr, setOpenPr] = useState(defaultOpenPr);
106
110
  const [parentId, setParentId] = useState<string | undefined>(undefined);
107
111
 
112
+ // Play drawer-open sound when the drawer opens
113
+ useEffect(() => {
114
+ if (open) {
115
+ drawerOpenSound.play();
116
+ }
117
+ }, [open, drawerOpenSound]);
118
+
108
119
  // Sync state when workflowDefaults load asynchronously
109
120
  useEffect(() => {
110
121
  if (workflowDefaults) {
@@ -134,17 +145,19 @@ export function FeatureCreateDrawer({
134
145
  const handleOpenChange = useCallback(
135
146
  (nextOpen: boolean) => {
136
147
  if (!nextOpen) {
148
+ drawerCloseSound.play();
137
149
  resetForm();
138
150
  onClose();
139
151
  }
140
152
  },
141
- [onClose, resetForm]
153
+ [onClose, resetForm, drawerCloseSound]
142
154
  );
143
155
 
144
156
  const handleSubmit = useCallback(
145
157
  (e: React.FormEvent) => {
146
158
  e.preventDefault();
147
159
  if (!name.trim()) return;
160
+ createSound.play();
148
161
  const trimmedDescription = description.trim() || undefined;
149
162
  onSubmit({
150
163
  name: name.trim(),
@@ -160,6 +173,7 @@ export function FeatureCreateDrawer({
160
173
  openPr,
161
174
  ...(parentId ? { parentId } : {}),
162
175
  });
176
+ resetForm();
163
177
  },
164
178
  [
165
179
  name,
@@ -171,6 +185,8 @@ export function FeatureCreateDrawer({
171
185
  push,
172
186
  openPr,
173
187
  parentId,
188
+ createSound,
189
+ resetForm,
174
190
  ]
175
191
  );
176
192
 
@@ -198,7 +214,10 @@ export function FeatureCreateDrawer({
198
214
  <button
199
215
  type="button"
200
216
  aria-label="Close"
201
- onClick={onClose}
217
+ onClick={() => {
218
+ drawerCloseSound.play();
219
+ onClose();
220
+ }}
202
221
  className="ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden"
203
222
  >
204
223
  <XIcon className="size-4" />
@@ -357,7 +376,14 @@ export function FeatureCreateDrawer({
357
376
  {/* Footer */}
358
377
  <Separator />
359
378
  <DrawerFooter className="flex-row justify-end gap-2">
360
- <Button variant="outline" onClick={onClose} disabled={isSubmitting}>
379
+ <Button
380
+ variant="outline"
381
+ onClick={() => {
382
+ drawerCloseSound.play();
383
+ onClose();
384
+ }}
385
+ disabled={isSubmitting}
386
+ >
361
387
  Cancel
362
388
  </Button>
363
389
  <Button type="submit" form="create-feature-form" disabled={!name.trim() || isSubmitting}>
@@ -3,6 +3,7 @@
3
3
  import { XIcon, Loader2, Trash2, ExternalLink, GitCommitHorizontal } from 'lucide-react';
4
4
  import { PrStatus } from '@shepai/core/domain/generated/output';
5
5
  import { cn } from '@/lib/utils';
6
+ import { useSoundAction } from '@/hooks/use-sound-action';
6
7
  import { OpenActionMenu } from '@/components/common/open-action-menu';
7
8
  import {
8
9
  Drawer,
@@ -44,6 +45,9 @@ export function FeatureDrawer({
44
45
  onDelete,
45
46
  isDeleting = false,
46
47
  }: FeatureDrawerProps) {
48
+ const drawerOpenSound = useSoundAction('drawer-open');
49
+ const drawerCloseSound = useSoundAction('drawer-close');
50
+
47
51
  return (
48
52
  <Drawer
49
53
  direction="right"
@@ -51,7 +55,12 @@ export function FeatureDrawer({
51
55
  handleOnly
52
56
  open={selectedNode !== null}
53
57
  onOpenChange={(open) => {
54
- if (!open) onClose();
58
+ if (open) {
59
+ drawerOpenSound.play();
60
+ } else {
61
+ drawerCloseSound.play();
62
+ onClose();
63
+ }
55
64
  }}
56
65
  >
57
66
  <DrawerContent direction="right" className="w-96" showCloseButton={false}>
@@ -61,7 +70,10 @@ export function FeatureDrawer({
61
70
  <button
62
71
  type="button"
63
72
  aria-label="Close"
64
- onClick={onClose}
73
+ onClick={() => {
74
+ drawerCloseSound.play();
75
+ onClose();
76
+ }}
65
77
  className="ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden"
66
78
  >
67
79
  <XIcon className="size-4" />
@@ -194,7 +194,7 @@ const mockData: PrdQuestionnaireData = {
194
194
  finalAction: mockFinalAction,
195
195
  };
196
196
 
197
- /** Default state — first step shown, no selections. Click options to auto-advance. */
197
+ /** Default state — first step shown, no selections. Click options to auto-advance. Plays "select" on option click, "navigate" on step/nav buttons. */
198
198
  export const Default: Story = {
199
199
  render: () => <InteractiveQuestionnaire data={mockData} />,
200
200
  };
@@ -6,6 +6,7 @@ import { cn } from '@/lib/utils';
6
6
  import { Button } from '@/components/ui/button';
7
7
  import { Badge } from '@/components/ui/badge';
8
8
  import { DrawerActionBar } from '@/components/common/drawer-action-bar';
9
+ import { useSoundAction } from '@/hooks/use-sound-action';
9
10
  import type { PrdQuestionnaireProps } from './prd-questionnaire-config';
10
11
 
11
12
  export function PrdQuestionnaire({
@@ -20,6 +21,8 @@ export function PrdQuestionnaire({
20
21
  }: PrdQuestionnaireProps) {
21
22
  const { question, context, questions, finalAction } = data;
22
23
  const [currentStep, setCurrentStep] = useState(0);
24
+ const selectSound = useSoundAction('select');
25
+ const navigateSound = useSoundAction('navigate');
23
26
 
24
27
  const total = questions.length;
25
28
  const isFirstStep = currentStep === 0;
@@ -30,13 +33,14 @@ export function PrdQuestionnaire({
30
33
 
31
34
  const handleSelect = useCallback(
32
35
  (questionId: string, optionId: string) => {
36
+ selectSound.play();
33
37
  onSelect(questionId, optionId);
34
38
  // Auto-advance to the next step after selection (unless last step)
35
39
  if (!isLastStep) {
36
40
  setTimeout(() => setCurrentStep((s) => s + 1), 250);
37
41
  }
38
42
  },
39
- [onSelect, isLastStep]
43
+ [onSelect, isLastStep, selectSound]
40
44
  );
41
45
 
42
46
  if (total === 0) return null;
@@ -73,7 +77,10 @@ export function PrdQuestionnaire({
73
77
  idx !== currentStep && selections[q.id] ? 'bg-primary/50' : '',
74
78
  idx !== currentStep && !selections[q.id] ? 'bg-muted-foreground/25' : ''
75
79
  )}
76
- onClick={() => setCurrentStep(idx)}
80
+ onClick={() => {
81
+ navigateSound.play();
82
+ setCurrentStep(idx);
83
+ }}
77
84
  />
78
85
  ))}
79
86
  </div>
@@ -129,7 +136,10 @@ export function PrdQuestionnaire({
129
136
  variant="ghost"
130
137
  size="sm"
131
138
  disabled={isFirstStep || isProcessing}
132
- onClick={() => setCurrentStep((s) => s - 1)}
139
+ onClick={() => {
140
+ navigateSound.play();
141
+ setCurrentStep((s) => s - 1);
142
+ }}
133
143
  >
134
144
  <ChevronLeft className="mr-1 h-4 w-4" />
135
145
  Previous
@@ -141,7 +151,10 @@ export function PrdQuestionnaire({
141
151
  variant="ghost"
142
152
  size="sm"
143
153
  disabled={isProcessing}
144
- onClick={() => setCurrentStep((s) => s + 1)}
154
+ onClick={() => {
155
+ navigateSound.play();
156
+ setCurrentStep((s) => s + 1);
157
+ }}
145
158
  >
146
159
  {selections[currentQuestion.id] ? 'Next' : 'Skip'}
147
160
  <ChevronRight className="ml-1 h-4 w-4" />
@@ -25,8 +25,10 @@ const meta: Meta<typeof SidebarCollapseToggle> = {
25
25
  export default meta;
26
26
  type Story = StoryObj<typeof meta>;
27
27
 
28
+ /** Expanded state — clicking plays "collapse" sound. */
28
29
  export const Expanded: Story = {};
29
30
 
31
+ /** Collapsed state — clicking plays "expand" sound. */
30
32
  export const Collapsed: Story = {
31
33
  decorators: [
32
34
  (Story) => (
@@ -4,6 +4,7 @@ import { PanelLeft } from 'lucide-react';
4
4
  import { useSidebar } from '@/components/ui/sidebar';
5
5
  import { Button } from '@/components/ui/button';
6
6
  import { cn } from '@/lib/utils';
7
+ import { useSoundAction } from '@/hooks/use-sound-action';
7
8
 
8
9
  export interface SidebarCollapseToggleProps {
9
10
  className?: string;
@@ -11,8 +12,20 @@ export interface SidebarCollapseToggleProps {
11
12
 
12
13
  export function SidebarCollapseToggle({ className }: SidebarCollapseToggleProps) {
13
14
  const { toggleSidebar, open } = useSidebar();
15
+ const expandSound = useSoundAction('expand');
16
+ const collapseSound = useSoundAction('collapse');
14
17
  const label = open ? 'Collapse sidebar' : 'Expand sidebar';
15
18
 
19
+ const handleClick = () => {
20
+ // Play sound based on current state (before toggle)
21
+ if (open) {
22
+ collapseSound.play();
23
+ } else {
24
+ expandSound.play();
25
+ }
26
+ toggleSidebar();
27
+ };
28
+
16
29
  return (
17
30
  <div className={cn('flex', className)}>
18
31
  <Button
@@ -20,7 +33,7 @@ export function SidebarCollapseToggle({ className }: SidebarCollapseToggleProps)
20
33
  variant="ghost"
21
34
  size="icon"
22
35
  className="size-7 cursor-pointer group-data-[collapsible=icon]:size-8!"
23
- onClick={toggleSidebar}
36
+ onClick={handleClick}
24
37
  aria-label={label}
25
38
  >
26
39
  <PanelLeft className="size-4" />
@@ -24,6 +24,7 @@ const meta: Meta<typeof SidebarNavItem> = {
24
24
  export default meta;
25
25
  type Story = StoryObj<typeof meta>;
26
26
 
27
+ /** Default — clicking plays "navigate" sound. */
27
28
  export const Default: Story = {
28
29
  args: {
29
30
  icon: Home,
@@ -1,7 +1,10 @@
1
+ 'use client';
2
+
1
3
  import Link from 'next/link';
2
4
  import type { Route } from 'next';
3
5
  import type { LucideIcon } from 'lucide-react';
4
6
  import { SidebarMenuItem, SidebarMenuButton } from '@/components/ui/sidebar';
7
+ import { useSoundAction } from '@/hooks/use-sound-action';
5
8
 
6
9
  export interface SidebarNavItemProps {
7
10
  icon: LucideIcon;
@@ -11,10 +14,12 @@ export interface SidebarNavItemProps {
11
14
  }
12
15
 
13
16
  export function SidebarNavItem({ icon: Icon, label, href, active = false }: SidebarNavItemProps) {
17
+ const navigateSound = useSoundAction('navigate');
18
+
14
19
  return (
15
20
  <SidebarMenuItem data-testid="sidebar-nav-item">
16
21
  <SidebarMenuButton asChild isActive={active} tooltip={label}>
17
- <Link href={href as Route}>
22
+ <Link href={href as Route} onClick={() => navigateSound.play()}>
18
23
  <Icon />
19
24
  <span>{label}</span>
20
25
  </Link>
@@ -63,7 +63,7 @@ const meta: Meta<typeof TechDecisionsReview> = {
63
63
  export default meta;
64
64
  type Story = StoryObj<typeof TechDecisionsReview>;
65
65
 
66
- /** Default — scrollable list of decisions taken. */
66
+ /** Default — scrollable list of decisions taken. "Other Options Considered" toggle plays expand/collapse sounds. */
67
67
  export const Default: Story = {
68
68
  args: {
69
69
  data: mockData,
@@ -6,6 +6,7 @@ import Markdown from 'react-markdown';
6
6
  import { Check, ChevronRight, GitCompareArrows, Layers } from 'lucide-react';
7
7
  import { Badge } from '@/components/ui/badge';
8
8
  import { DrawerActionBar } from '@/components/common/drawer-action-bar';
9
+ import { useSoundAction } from '@/hooks/use-sound-action';
9
10
  import type { TechDecisionsReviewProps, TechDecision } from './tech-decisions-review-config';
10
11
 
11
12
  const markdownComponents: Components = {
@@ -46,6 +47,18 @@ const markdownComponents: Components = {
46
47
 
47
48
  function DecisionCard({ decision, index }: { decision: TechDecision; index: number }) {
48
49
  const [alternativesOpen, setAlternativesOpen] = useState(false);
50
+ const expandSound = useSoundAction('expand');
51
+ const collapseSound = useSoundAction('collapse');
52
+
53
+ const handleToggleAlternatives = () => {
54
+ // Play sound based on current state (before toggle)
55
+ if (alternativesOpen) {
56
+ collapseSound.play();
57
+ } else {
58
+ expandSound.play();
59
+ }
60
+ setAlternativesOpen((prev) => !prev);
61
+ };
49
62
 
50
63
  return (
51
64
  <div className="border-border rounded-lg border">
@@ -82,7 +95,7 @@ function DecisionCard({ decision, index }: { decision: TechDecision; index: numb
82
95
  <div className="border-border border-t">
83
96
  <button
84
97
  type="button"
85
- onClick={() => setAlternativesOpen((prev) => !prev)}
98
+ onClick={handleToggleAlternatives}
86
99
  className="text-muted-foreground hover:bg-muted/50 flex w-full items-center gap-1.5 px-4 py-3 text-xs font-medium transition-colors"
87
100
  >
88
101
  <ChevronRight
@@ -13,10 +13,12 @@ const meta: Meta<typeof ThemeToggle> = {
13
13
  export default meta;
14
14
  type Story = StoryObj<typeof meta>;
15
15
 
16
+ /** Default — click to toggle theme. Plays toggle-on (dark) or toggle-off (light) sound. */
16
17
  export const Default: Story = {
17
18
  render: () => <ThemeToggle />,
18
19
  };
19
20
 
21
+ /** In context with label. Sounds play on each toggle click. */
20
22
  export const InContext: Story = {
21
23
  render: () => (
22
24
  <div className="flex items-center gap-4 rounded-lg border p-4">