@shepai/cli 1.68.1 → 1.70.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 (157) hide show
  1. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts +1 -1
  2. package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts +2 -1
  4. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  5. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +17 -2
  6. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +1 -1
  7. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/CLAUDE.md +45 -18
  9. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +18 -0
  10. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/iterm2.json +17 -0
  11. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/kitty.json +18 -0
  12. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/tmux.json +27 -0
  13. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +17 -0
  14. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -0
  15. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  17. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +32 -0
  18. package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -0
  20. package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/features/tools/tools-page-client.js +2 -1
  22. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  23. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +7 -2
  24. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts +3 -3
  25. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +1 -1
  27. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  28. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +36 -11
  29. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts +26 -0
  30. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -0
  31. package/dist/src/presentation/web/hooks/sidebar-features-context.js +34 -0
  32. package/dist/tsconfig.build.tsbuildinfo +1 -1
  33. package/package.json +1 -1
  34. package/web/.next/BUILD_ID +1 -1
  35. package/web/.next/build-manifest.json +2 -2
  36. package/web/.next/cache/.previewinfo +1 -1
  37. package/web/.next/cache/.rscinfo +1 -1
  38. package/web/.next/cache/.tsbuildinfo +1 -1
  39. package/web/.next/cache/config.json +3 -3
  40. package/web/.next/fallback-build-manifest.json +2 -2
  41. package/web/.next/prerender-manifest.json +3 -3
  42. package/web/.next/required-server-files.js +1 -1
  43. package/web/.next/required-server-files.json +1 -1
  44. package/web/.next/server/app/_global-error.html +2 -2
  45. package/web/.next/server/app/_global-error.rsc +1 -1
  46. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  47. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  48. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  49. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  51. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  52. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  53. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/page/server-reference-manifest.json +18 -18
  55. package/web/.next/server/app/page.js.nft.json +1 -1
  56. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
  58. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  59. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  61. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  62. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  64. package/web/.next/server/app/version/page.js.nft.json +1 -1
  65. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/chunks/[root-of-the-server]__09413611._.js.map +1 -1
  67. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  68. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  69. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  70. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -1
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
  77. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js.map +1 -1
  80. package/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
  81. package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -1
  82. package/web/.next/server/chunks/ssr/_68b5e0de._.js +6 -0
  83. package/web/.next/server/chunks/ssr/_68b5e0de._.js.map +1 -0
  84. package/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
  85. package/web/.next/server/chunks/ssr/_690ea95f._.js.map +1 -1
  86. package/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
  87. package/web/.next/server/chunks/ssr/_725584e5._.js.map +1 -1
  88. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  89. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  90. package/web/.next/server/pages/500.html +2 -2
  91. package/web/.next/server/server-reference-manifest.js +1 -1
  92. package/web/.next/server/server-reference-manifest.json +19 -19
  93. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  94. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  95. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  96. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  97. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  98. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  99. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  100. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  101. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  102. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  103. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  104. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  105. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  106. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  107. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +18 -18
  108. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  109. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  110. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
  111. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  112. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  113. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  114. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  115. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  116. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  117. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  118. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  119. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  120. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  121. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
  122. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  123. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  124. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
  125. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
  126. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
  127. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_68b5e0de._.js +6 -0
  128. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
  129. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
  130. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  131. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  132. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  133. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +19 -19
  134. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +2 -0
  135. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +44 -0
  136. package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +1 -0
  137. package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx +5 -1
  138. package/web/.next/standalone/src/presentation/web/components/layouts/app-shell/app-shell.tsx +18 -2
  139. package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx +36 -11
  140. package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +7 -4
  141. package/web/.next/standalone/src/presentation/web/hooks/sidebar-features-context.tsx +69 -0
  142. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  143. package/web/.next/static/chunks/{491ae2bbae40857c.js → 505c6a9e4c5d0808.js} +1 -1
  144. package/web/.next/static/chunks/{caa2e7e1618e2179.js → 51c94a563ecc565d.js} +1 -1
  145. package/web/.next/static/chunks/6d7d233d07d9a026.js +1 -0
  146. package/web/.next/static/chunks/{ac9971b036d46eca.js → 86b38e36afcd19f3.js} +1 -1
  147. package/web/.next/static/chunks/{7b56cca1fa91c197.js → 94562d62bf8e4bf7.js} +1 -1
  148. package/web/.next/static/chunks/{babbd238fc276df2.js → fdfd68aacc4727cf.js} +2 -2
  149. package/web/.next/trace +1 -1
  150. package/web/.next/trace-build +1 -1
  151. package/web/.next/server/chunks/ssr/_23c92688._.js +0 -6
  152. package/web/.next/server/chunks/ssr/_23c92688._.js.map +0 -1
  153. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_23c92688._.js +0 -6
  154. package/web/.next/static/chunks/eaf9699a447461e1.js +0 -1
  155. /package/web/.next/static/{VcKnu_EsfkBbSZnJoevS7 → 6pJLWKt-ohZJ_2kGrHG_m}/_buildManifest.js +0 -0
  156. /package/web/.next/static/{VcKnu_EsfkBbSZnJoevS7 → 6pJLWKt-ohZJ_2kGrHG_m}/_clientMiddlewareManifest.json +0 -0
  157. /package/web/.next/static/{VcKnu_EsfkBbSZnJoevS7 → 6pJLWKt-ohZJ_2kGrHG_m}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "node": {
3
- "007904f92b37e3fb1ddaa8cf3b3331b5785965e1c9": {
3
+ "00be2fc10adebcfc2f426a24668679c45663250f3a": {
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
- "40091ac70dbece6329609e9da1410745b8e79a1978": {
46
+ "402688cf2b9feee0c53225056605d9e5a9f0f409e6": {
47
47
  "workers": {
48
48
  "app/page": {
49
49
  "moduleId": 80894,
@@ -65,7 +65,7 @@
65
65
  "filename": "src/presentation/web/app/actions/deploy-feature.ts",
66
66
  "exportedName": "deployFeature"
67
67
  },
68
- "40ed5afaeb300463c182041f77eaa948fa86386a5c": {
68
+ "40342cdffce744e263c8ea15e16f076ce9ff4eaa00": {
69
69
  "workers": {
70
70
  "app/page": {
71
71
  "moduleId": 80894,
@@ -87,7 +87,7 @@
87
87
  "filename": "src/presentation/web/app/actions/deploy-repository.ts",
88
88
  "exportedName": "deployRepository"
89
89
  },
90
- "4046dda08e3ac125dd85a6e30729cf9ce5ff5fc9fc": {
90
+ "4016a359d9c8578ef9ac7cf6942a02a39801fde73d": {
91
91
  "workers": {
92
92
  "app/page": {
93
93
  "moduleId": 80894,
@@ -109,7 +109,7 @@
109
109
  "filename": "src/presentation/web/app/actions/stop-deployment.ts",
110
110
  "exportedName": "stopDeployment"
111
111
  },
112
- "400b1e92a6c3cb7d2e398f6b1fa858860eb0af1683": {
112
+ "4053062518c8311a3874802bc886588bb58d6e3dd8": {
113
113
  "workers": {
114
114
  "app/page": {
115
115
  "moduleId": 80894,
@@ -131,7 +131,7 @@
131
131
  "filename": "src/presentation/web/app/actions/get-deployment-status.ts",
132
132
  "exportedName": "getDeploymentStatus"
133
133
  },
134
- "40e4ab9cc0c2bcff2737de34dd19e9829ae0acf95c": {
134
+ "40ac121fcf695ece0315d6b16aea92fcd528796009": {
135
135
  "workers": {
136
136
  "app/page": {
137
137
  "moduleId": 80894,
@@ -146,7 +146,7 @@
146
146
  "filename": "src/presentation/web/app/actions/open-ide.ts",
147
147
  "exportedName": "openIde"
148
148
  },
149
- "40bb4ee841781b4ac6f38393d9567a33a75c16803f": {
149
+ "40b0455ae84958b17afe82c1d1ce91e161217df202": {
150
150
  "workers": {
151
151
  "app/page": {
152
152
  "moduleId": 80894,
@@ -161,7 +161,7 @@
161
161
  "filename": "src/presentation/web/app/actions/open-shell.ts",
162
162
  "exportedName": "openShell"
163
163
  },
164
- "407e578ae8d6e2984df524e710d1d8487ec34bf728": {
164
+ "401cbd2d770c13e0b5467dac3b184eaab53502a6b9": {
165
165
  "workers": {
166
166
  "app/page": {
167
167
  "moduleId": 80894,
@@ -176,7 +176,7 @@
176
176
  "filename": "src/presentation/web/app/actions/open-folder.ts",
177
177
  "exportedName": "openFolder"
178
178
  },
179
- "60e994e1442630456535b345b6a05311c3fbbedb61": {
179
+ "608f06fc0ab6542b3869c8388d2fa967ad3b5d755a": {
180
180
  "workers": {
181
181
  "app/page": {
182
182
  "moduleId": 80894,
@@ -191,7 +191,7 @@
191
191
  "filename": "src/presentation/web/app/actions/approve-feature.ts",
192
192
  "exportedName": "approveFeature"
193
193
  },
194
- "602e7fdbdb74c05c7f4f3dd8f5637838691089f2b1": {
194
+ "608a96f17904d884f377b787f610a82c5d1e96fa0d": {
195
195
  "workers": {
196
196
  "app/page": {
197
197
  "moduleId": 80894,
@@ -206,7 +206,7 @@
206
206
  "filename": "src/presentation/web/app/actions/reject-feature.ts",
207
207
  "exportedName": "rejectFeature"
208
208
  },
209
- "40fd2271f8743e95b32b23c4cc29f4a4a691c8a8a8": {
209
+ "4087d0916887bd38c364f156095af3b16f2a019cfc": {
210
210
  "workers": {
211
211
  "app/page": {
212
212
  "moduleId": 80894,
@@ -221,7 +221,7 @@
221
221
  "filename": "src/presentation/web/app/actions/get-feature-artifact.ts",
222
222
  "exportedName": "getFeatureArtifact"
223
223
  },
224
- "40d0d1e095b8c6db449462031b286123933f4bee13": {
224
+ "4007d08e6b50895a5198f3bd26272f14fa021a393c": {
225
225
  "workers": {
226
226
  "app/page": {
227
227
  "moduleId": 80894,
@@ -236,7 +236,7 @@
236
236
  "filename": "src/presentation/web/app/actions/get-research-artifact.ts",
237
237
  "exportedName": "getResearchArtifact"
238
238
  },
239
- "40f9ada722bbf6e70ad7d3ccfa993936bded27ce89": {
239
+ "403f05debc955be9e844ec7cef2d5999ca3c94ac62": {
240
240
  "workers": {
241
241
  "app/page": {
242
242
  "moduleId": 80894,
@@ -251,7 +251,7 @@
251
251
  "filename": "src/presentation/web/app/actions/get-merge-review-data.ts",
252
252
  "exportedName": "getMergeReviewData"
253
253
  },
254
- "00cbe5967ab0d2ea54019ace7243ab5397796e3a89": {
254
+ "00da35b2abc9ff8152ae97c30b92d35dd67e52639a": {
255
255
  "workers": {
256
256
  "app/page": {
257
257
  "moduleId": 80894,
@@ -266,7 +266,7 @@
266
266
  "filename": "src/presentation/web/app/actions/get-workflow-defaults.ts",
267
267
  "exportedName": "getWorkflowDefaults"
268
268
  },
269
- "409f6567cb8365e9802d86c09e0509aa967474395d": {
269
+ "4072dca971b914309df351ad86f6ada99d2890b501": {
270
270
  "workers": {
271
271
  "app/page": {
272
272
  "moduleId": 80894,
@@ -281,7 +281,7 @@
281
281
  "filename": "src/presentation/web/app/actions/create-feature.ts",
282
282
  "exportedName": "createFeature"
283
283
  },
284
- "40a7ee7ee0070cdfe3c3b4361ed390c1d2dfc83832": {
284
+ "40ea4ef54d49c83b5276bc4f5e84162acbb8562e2f": {
285
285
  "workers": {
286
286
  "app/page": {
287
287
  "moduleId": 80894,
@@ -296,7 +296,7 @@
296
296
  "filename": "src/presentation/web/app/actions/delete-feature.ts",
297
297
  "exportedName": "deleteFeature"
298
298
  },
299
- "4060e90fc1976d3214d65d6e16a4132b33b8561e8c": {
299
+ "40c1a52262c95500ac5bcf73cadc7e00dcbe0f3359": {
300
300
  "workers": {
301
301
  "app/page": {
302
302
  "moduleId": 80894,
@@ -311,7 +311,7 @@
311
311
  "filename": "src/presentation/web/app/actions/add-repository.ts",
312
312
  "exportedName": "addRepository"
313
313
  },
314
- "409df51440e3f1b792cd761ca460a45413a942c955": {
314
+ "40adf9365acf11b90554381e21967e70a64ffb817c": {
315
315
  "workers": {
316
316
  "app/page": {
317
317
  "moduleId": 80894,
@@ -328,5 +328,5 @@
328
328
  }
329
329
  },
330
330
  "edge": {},
331
- "encryptionKey": "XorWUWzItCcuuzR171bhaqoTDpomNe7XE12jN0+uDNo="
331
+ "encryptionKey": "YYckm5T2edBLRBOdnKanUSiR4rteQ9v7zFLUWYYbRzU="
332
332
  }
@@ -53,6 +53,8 @@ export interface FeatureNodeData {
53
53
  branch: string;
54
54
  /** Absolute path to the specs folder on disk */
55
55
  specPath?: string;
56
+ /** Epoch ms when the current agent run started (for elapsed-time in sidebar) */
57
+ startedAt?: number;
56
58
  /** Human-readable runtime for done state (e.g. "2h 15m") */
57
59
  runtime?: string;
58
60
  /** Feature name this node is blocked by */
@@ -10,6 +10,10 @@ import type { RepositoryNodeData } from '@/components/common/repository-node';
10
10
  import { NotificationPermissionBanner } from '@/components/common/notification-permission-banner';
11
11
  import { getWorkflowDefaults } from '@/app/actions/get-workflow-defaults';
12
12
  import type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';
13
+ import {
14
+ useSidebarFeaturesContext,
15
+ mapNodeStateToSidebarStatus,
16
+ } from '@/hooks/sidebar-features-context';
13
17
  import { ControlCenterEmptyState } from './control-center-empty-state';
14
18
  import { useControlCenterState } from './use-control-center-state';
15
19
 
@@ -42,6 +46,46 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
42
46
  pendingParentFeatureId,
43
47
  } = useControlCenterState(initialNodes, initialEdges);
44
48
 
49
+ // Publish sidebar features to context whenever feature node data changes
50
+ const { setFeatures: setSidebarFeatures } = useSidebarFeaturesContext();
51
+
52
+ const sidebarKey = useMemo(() => {
53
+ return nodes
54
+ .filter((n) => n.type === 'featureNode')
55
+ .map((n) => {
56
+ const d = n.data as FeatureNodeData;
57
+ return `${d.featureId}:${d.state}:${d.runtime ?? ''}:${d.startedAt ?? ''}`;
58
+ })
59
+ .sort()
60
+ .join(',');
61
+ }, [nodes]);
62
+
63
+ useEffect(() => {
64
+ const sidebarItems = nodes
65
+ .filter((n) => n.type === 'featureNode')
66
+ .map((n) => {
67
+ const d = n.data as FeatureNodeData;
68
+ const status = mapNodeStateToSidebarStatus(d.state);
69
+ if (!status) return null;
70
+ return {
71
+ featureId: d.featureId,
72
+ name: d.name,
73
+ status,
74
+ ...(d.startedAt != null && { startedAt: d.startedAt }),
75
+ ...(d.runtime != null && { duration: d.runtime }),
76
+ };
77
+ })
78
+ .filter(Boolean) as {
79
+ featureId: string;
80
+ name: string;
81
+ status: 'action-needed' | 'in-progress' | 'done';
82
+ startedAt?: number;
83
+ duration?: string;
84
+ }[];
85
+
86
+ setSidebarFeatures(sidebarItems);
87
+ }, [sidebarKey, nodes, setSidebarFeatures]);
88
+
45
89
  // Feature list for the parent selector in the create drawer
46
90
  const featureOptions = useMemo(
47
91
  () =>
@@ -28,6 +28,7 @@ const TAG_CONFIG: Record<string, { label: string; icon: typeof Monitor }> = {
28
28
  ide: { label: 'IDE', icon: Monitor },
29
29
  'cli-agent': { label: 'CLI Agent', icon: Terminal },
30
30
  vcs: { label: 'VCS', icon: GitBranch },
31
+ terminal: { label: 'Terminal', icon: Terminal },
31
32
  };
32
33
 
33
34
  export function ToolCard({ tool, onRefresh, className }: ToolCardProps) {
@@ -12,13 +12,14 @@ export interface ToolsPageClientProps {
12
12
  className?: string;
13
13
  }
14
14
 
15
- type TabValue = 'all' | 'ide' | 'cli-agent' | 'vcs';
15
+ type TabValue = 'all' | 'ide' | 'cli-agent' | 'vcs' | 'terminal';
16
16
 
17
17
  const TAB_FILTER: Record<TabValue, (tool: ToolItem) => boolean> = {
18
18
  all: () => true,
19
19
  ide: (tool) => tool.tags.includes('ide'),
20
20
  'cli-agent': (tool) => tool.tags.includes('cli-agent'),
21
21
  vcs: (tool) => tool.tags.includes('vcs'),
22
+ terminal: (tool) => tool.tags.includes('terminal'),
22
23
  };
23
24
 
24
25
  export function ToolsPageClient({ tools: initialTools, className }: ToolsPageClientProps) {
@@ -72,6 +73,9 @@ export function ToolsPageClient({ tools: initialTools, className }: ToolsPageCli
72
73
  <TabsTrigger value="vcs" data-testid="tools-tab-vcs" className="px-2.5 text-xs">
73
74
  Version Control
74
75
  </TabsTrigger>
76
+ <TabsTrigger value="terminal" data-testid="tools-tab-terminal" className="px-2.5 text-xs">
77
+ Terminals
78
+ </TabsTrigger>
75
79
  </TabsList>
76
80
 
77
81
  <TabsContent value={activeTab} className="mt-3">
@@ -7,6 +7,10 @@ import { AddRepositoryButton } from '@/components/common/add-repository-node';
7
7
  import { ThemeToggle } from '@/components/common/theme-toggle';
8
8
  import { SoundToggle } from '@/components/common/sound-toggle';
9
9
  import { AgentEventsProvider } from '@/hooks/agent-events-provider';
10
+ import {
11
+ SidebarFeaturesProvider,
12
+ useSidebarFeaturesContext,
13
+ } from '@/hooks/sidebar-features-context';
10
14
  import { useNotifications } from '@/hooks/use-notifications';
11
15
 
12
16
  interface AppShellProps {
@@ -18,17 +22,27 @@ function AppShellInner({ children }: AppShellProps) {
18
22
  // Subscribe to agent lifecycle events and dispatch toast/browser notifications
19
23
  useNotifications();
20
24
 
25
+ const { features } = useSidebarFeaturesContext();
26
+
21
27
  const handleNewFeature = useCallback(() => {
22
28
  window.dispatchEvent(new CustomEvent('shep:open-create-drawer'));
23
29
  }, []);
24
30
 
31
+ const handleFeatureClick = useCallback((featureId: string) => {
32
+ window.dispatchEvent(new CustomEvent('shep:select-feature', { detail: { featureId } }));
33
+ }, []);
34
+
25
35
  const handleRepositorySelect = useCallback((path: string) => {
26
36
  window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));
27
37
  }, []);
28
38
 
29
39
  return (
30
40
  <SidebarProvider>
31
- <AppSidebar features={[]} onNewFeature={handleNewFeature} />
41
+ <AppSidebar
42
+ features={features}
43
+ onNewFeature={handleNewFeature}
44
+ onFeatureClick={handleFeatureClick}
45
+ />
32
46
  <SidebarInset>
33
47
  <div className="relative h-full">
34
48
  <div className="absolute top-3 right-3 z-50 flex gap-1">
@@ -46,7 +60,9 @@ function AppShellInner({ children }: AppShellProps) {
46
60
  export function AppShell({ children }: AppShellProps) {
47
61
  return (
48
62
  <AgentEventsProvider>
49
- <AppShellInner>{children}</AppShellInner>
63
+ <SidebarFeaturesProvider>
64
+ <AppShellInner>{children}</AppShellInner>
65
+ </SidebarFeaturesProvider>
50
66
  </AgentEventsProvider>
51
67
  );
52
68
  }
@@ -34,12 +34,27 @@ export default meta;
34
34
  type Story = StoryObj<typeof meta>;
35
35
 
36
36
  const mockFeatures = [
37
- { name: 'Auth Module', status: 'action-needed' as const },
38
- { name: 'Payment Flow', status: 'action-needed' as const },
39
- { name: 'Dashboard', status: 'in-progress' as const, startedAt: Date.now() - 330_000 },
40
- { name: 'API Gateway', status: 'in-progress' as const, startedAt: Date.now() - 60_000 },
41
- { name: 'Settings Page', status: 'done' as const, duration: '2h' },
42
- { name: 'User Profile', status: 'done' as const, duration: '1h' },
37
+ { featureId: 'feat-auth-001', name: 'Auth Module', status: 'action-needed' as const },
38
+ { featureId: 'feat-payment-002', name: 'Payment Flow', status: 'action-needed' as const },
39
+ {
40
+ featureId: 'feat-dashboard-003',
41
+ name: 'Dashboard',
42
+ status: 'in-progress' as const,
43
+ startedAt: Date.now() - 330_000,
44
+ },
45
+ {
46
+ featureId: 'feat-api-004',
47
+ name: 'API Gateway',
48
+ status: 'in-progress' as const,
49
+ startedAt: Date.now() - 60_000,
50
+ },
51
+ {
52
+ featureId: 'feat-settings-005',
53
+ name: 'Settings Page',
54
+ status: 'done' as const,
55
+ duration: '2h',
56
+ },
57
+ { featureId: 'feat-profile-006', name: 'User Profile', status: 'done' as const, duration: '1h' },
43
58
  ];
44
59
 
45
60
  export const Default: Story = {
@@ -66,8 +81,18 @@ export const Empty: Story = {
66
81
  export const AllInProgress: Story = {
67
82
  args: {
68
83
  features: [
69
- { name: 'Feature A', status: 'in-progress' as const, startedAt: Date.now() - 120_000 },
70
- { name: 'Feature B', status: 'in-progress' as const, startedAt: Date.now() - 600_000 },
84
+ {
85
+ featureId: 'feat-a-001',
86
+ name: 'Feature A',
87
+ status: 'in-progress' as const,
88
+ startedAt: Date.now() - 120_000,
89
+ },
90
+ {
91
+ featureId: 'feat-b-002',
92
+ name: 'Feature B',
93
+ status: 'in-progress' as const,
94
+ startedAt: Date.now() - 600_000,
95
+ },
71
96
  ],
72
97
  },
73
98
  };
@@ -75,9 +100,9 @@ export const AllInProgress: Story = {
75
100
  export const AllDone: Story = {
76
101
  args: {
77
102
  features: [
78
- { name: 'Feature A', status: 'done' as const, duration: '30m' },
79
- { name: 'Feature B', status: 'done' as const, duration: '1h' },
80
- { name: 'Feature C', status: 'done' as const, duration: '3h' },
103
+ { featureId: 'feat-a-001', name: 'Feature A', status: 'done' as const, duration: '30m' },
104
+ { featureId: 'feat-b-002', name: 'Feature B', status: 'done' as const, duration: '1h' },
105
+ { featureId: 'feat-c-003', name: 'Feature C', status: 'done' as const, duration: '3h' },
81
106
  ],
82
107
  },
83
108
  };
@@ -25,7 +25,8 @@ import type { FeatureStatus } from '@/components/common/feature-status-config';
25
25
  import { useDeferredMount } from '@/hooks/use-deferred-mount';
26
26
  import { featureFlags } from '@/lib/feature-flags';
27
27
 
28
- interface FeatureItem {
28
+ export interface FeatureItem {
29
+ featureId: string;
29
30
  name: string;
30
31
  status: FeatureStatus;
31
32
  startedAt?: number;
@@ -35,7 +36,7 @@ interface FeatureItem {
35
36
  export interface AppSidebarProps {
36
37
  features: FeatureItem[];
37
38
  onNewFeature?: () => void;
38
- onFeatureClick?: (name: string) => void;
39
+ onFeatureClick?: (featureId: string) => void;
39
40
  onFeaturesFolderClick?: () => void;
40
41
  onFeaturesMenuClick?: () => void;
41
42
  }
@@ -119,12 +120,14 @@ export function AppSidebar({
119
120
  <FeatureStatusGroup key={key} label={label} count={items.length}>
120
121
  {items.map((feature) => (
121
122
  <FeatureListItem
122
- key={feature.name}
123
+ key={feature.featureId}
123
124
  name={feature.name}
124
125
  status={feature.status}
125
126
  startedAt={feature.startedAt}
126
127
  duration={feature.duration}
127
- onClick={onFeatureClick ? () => onFeatureClick(feature.name) : undefined}
128
+ onClick={
129
+ onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined
130
+ }
128
131
  />
129
132
  ))}
130
133
  </FeatureStatusGroup>
@@ -0,0 +1,69 @@
1
+ 'use client';
2
+
3
+ import { createContext, useContext, useState, useMemo, type ReactNode } from 'react';
4
+ import type { FeatureNodeState } from '@/components/common/feature-node/feature-node-state-config';
5
+ import type { FeatureStatus } from '@/components/common/feature-status-config';
6
+
7
+ // Re-export the FeatureItem type so consumers can import from one place.
8
+ // This will gain `featureId` in a later phase.
9
+ export interface SidebarFeatureItem {
10
+ name: string;
11
+ status: FeatureStatus;
12
+ featureId: string;
13
+ startedAt?: number;
14
+ duration?: string;
15
+ }
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // Pure mapping: FeatureNodeState (6-state) → FeatureStatus (3-state) | null
19
+ // ---------------------------------------------------------------------------
20
+
21
+ const stateMapping: Record<FeatureNodeState, FeatureStatus | null> = {
22
+ 'action-required': 'action-needed',
23
+ running: 'in-progress',
24
+ done: 'done',
25
+ blocked: 'in-progress',
26
+ error: 'in-progress',
27
+ creating: null,
28
+ };
29
+
30
+ /**
31
+ * Maps a canvas FeatureNodeState to the sidebar's 3-state FeatureStatus.
32
+ * Returns `null` for `creating` (optimistic UI) — these should be excluded from the sidebar.
33
+ */
34
+ export function mapNodeStateToSidebarStatus(state: FeatureNodeState): FeatureStatus | null {
35
+ return stateMapping[state];
36
+ }
37
+
38
+ // ---------------------------------------------------------------------------
39
+ // SidebarFeaturesContext
40
+ // ---------------------------------------------------------------------------
41
+
42
+ interface SidebarFeaturesContextValue {
43
+ features: SidebarFeatureItem[];
44
+ setFeatures: (features: SidebarFeatureItem[]) => void;
45
+ }
46
+
47
+ const SidebarFeaturesContext = createContext<SidebarFeaturesContextValue | null>(null);
48
+
49
+ interface SidebarFeaturesProviderProps {
50
+ children: ReactNode;
51
+ }
52
+
53
+ export function SidebarFeaturesProvider({ children }: SidebarFeaturesProviderProps) {
54
+ const [features, setFeatures] = useState<SidebarFeatureItem[]>([]);
55
+
56
+ const value = useMemo<SidebarFeaturesContextValue>(() => ({ features, setFeatures }), [features]);
57
+
58
+ return (
59
+ <SidebarFeaturesContext.Provider value={value}>{children}</SidebarFeaturesContext.Provider>
60
+ );
61
+ }
62
+
63
+ export function useSidebarFeaturesContext(): SidebarFeaturesContextValue {
64
+ const ctx = useContext(SidebarFeaturesContext);
65
+ if (!ctx) {
66
+ throw new Error('useSidebarFeaturesContext must be used within a <SidebarFeaturesProvider>');
67
+ }
68
+ return ctx;
69
+ }
@@ -15,7 +15,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
15
15
  const hostname = process.env.HOSTNAME || '0.0.0.0'
16
16
 
17
17
  let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
18
- const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.68.0","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3","node:os","node:child_process","node:fs"],"distDirRoot":".next"}
18
+ const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.69.0","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3","node:os","node:child_process","node:fs"],"distDirRoot":".next"}
19
19
 
20
20
  process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
21
21