@shepai/cli 1.136.0-pr437.9f802f1 → 1.136.0-pr440.bb6800a

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 (304) hide show
  1. package/apis/json-schema/Feature.yaml +3 -0
  2. package/apis/json-schema/FeatureFlags.yaml +0 -5
  3. package/apis/json-schema/SdlcLifecycle.yaml +1 -0
  4. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts +2 -0
  5. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/index.d.ts +0 -1
  7. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts +20 -0
  9. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts.map +1 -0
  10. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.js +74 -0
  11. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts +20 -0
  12. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts.map +1 -0
  13. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.js +65 -0
  14. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  15. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +0 -1
  16. package/dist/packages/core/src/domain/generated/output.d.ts +6 -5
  17. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  18. package/dist/packages/core/src/domain/generated/output.js +1 -0
  19. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/di/container.js +10 -10
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +6 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +0 -1
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +0 -2
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts +12 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts.map +1 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.js +16 -0
  30. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +7 -2
  32. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +2 -3
  34. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts +18 -0
  35. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +1 -0
  36. package/dist/src/presentation/cli/commands/feat/archive.command.js +54 -0
  37. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  38. package/dist/src/presentation/cli/commands/feat/index.js +5 -1
  39. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  40. package/dist/src/presentation/cli/commands/feat/ls.command.js +5 -0
  41. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts +17 -0
  42. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +1 -0
  43. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +42 -0
  44. package/dist/src/presentation/cli/index.js +0 -2
  45. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  46. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +6 -1
  47. package/dist/src/presentation/web/app/actions/archive-feature.d.ts +6 -0
  48. package/dist/src/presentation/web/app/actions/archive-feature.d.ts.map +1 -0
  49. package/dist/src/presentation/web/app/actions/archive-feature.js +16 -0
  50. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts +6 -0
  51. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts.map +1 -0
  52. package/dist/src/presentation/web/app/actions/unarchive-feature.js +16 -0
  53. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  54. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  55. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +6 -0
  57. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +3 -1
  58. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +11 -1
  60. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +16 -2
  62. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +5 -0
  63. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +75 -1
  65. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  66. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -9
  67. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +13 -4
  69. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +6 -0
  70. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +70 -0
  72. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +6 -0
  73. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +43 -2
  75. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +0 -3
  77. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  78. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +0 -3
  79. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +0 -5
  81. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  82. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +0 -1
  83. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  84. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +0 -1
  85. package/dist/src/presentation/web/dev-server.js +1 -62
  86. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  87. package/dist/src/presentation/web/hooks/feature-flags-context.js +0 -1
  88. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
  89. package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -0
  90. package/dist/src/presentation/web/hooks/use-graph-state.d.ts +1 -1
  91. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  92. package/dist/src/presentation/web/hooks/use-graph-state.js +17 -2
  93. package/dist/src/presentation/web/lib/derive-graph.d.ts +4 -0
  94. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  95. package/dist/src/presentation/web/lib/derive-graph.js +12 -0
  96. package/dist/src/presentation/web/lib/feature-flags.d.ts +0 -2
  97. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  98. package/dist/src/presentation/web/lib/feature-flags.js +0 -5
  99. package/dist/tsconfig.build.tsbuildinfo +1 -1
  100. package/package.json +1 -2
  101. package/web/.next/BUILD_ID +1 -1
  102. package/web/.next/build-manifest.json +2 -2
  103. package/web/.next/fallback-build-manifest.json +2 -2
  104. package/web/.next/prerender-manifest.json +3 -3
  105. package/web/.next/required-server-files.js +1 -1
  106. package/web/.next/required-server-files.json +1 -1
  107. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +80 -80
  108. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  109. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  110. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +80 -80
  112. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  113. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  114. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +92 -92
  116. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  117. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  118. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +92 -92
  120. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  121. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +76 -76
  124. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  125. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  126. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  127. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +80 -80
  128. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  129. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  130. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +92 -92
  132. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  133. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  134. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +92 -92
  136. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  137. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  138. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  139. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +76 -76
  140. package/web/.next/server/app/(dashboard)/page.js +1 -1
  141. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  142. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  143. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +76 -76
  144. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  145. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  146. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/_global-error.html +2 -2
  148. package/web/.next/server/app/_global-error.rsc +1 -1
  149. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  150. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  151. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  152. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  153. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  154. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  155. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  157. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  158. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  159. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  160. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  161. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  162. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  163. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  164. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  165. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  166. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  167. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  168. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  169. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  170. package/web/.next/server/chunks/403f9_next_567de315._.js +2 -2
  171. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  172. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  173. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  174. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  175. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  176. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  177. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  178. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  179. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  181. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a9079247._.js → [root-of-the-server]__61564698._.js} +2 -2
  187. package/web/.next/server/chunks/ssr/{[root-of-the-server]__944b653f._.js.map → [root-of-the-server]__61564698._.js.map} +1 -1
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +1 -1
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1cf9161b._.js → [root-of-the-server]__74ab160c._.js} +2 -2
  191. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a9079247._.js.map → [root-of-the-server]__74ab160c._.js.map} +1 -1
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/{[root-of-the-server]__71b5d4e8._.js → [root-of-the-server]__bd16cded._.js} +2 -2
  199. package/web/.next/server/chunks/ssr/{[root-of-the-server]__71b5d4e8._.js.map → [root-of-the-server]__bd16cded._.js.map} +1 -1
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  202. package/web/.next/server/chunks/ssr/{[root-of-the-server]__944b653f._.js → [root-of-the-server]__f14fffe1._.js} +2 -2
  203. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1cf9161b._.js.map → [root-of-the-server]__f14fffe1._.js.map} +1 -1
  204. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  205. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  207. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/{_7dd6c393._.js → _2fdfd9ab._.js} +2 -2
  209. package/web/.next/server/chunks/ssr/{_7dd6c393._.js.map → _2fdfd9ab._.js.map} +1 -1
  210. package/web/.next/server/chunks/ssr/_36059d08._.js +4 -0
  211. package/web/.next/server/chunks/ssr/_36059d08._.js.map +1 -0
  212. package/web/.next/server/chunks/ssr/{_7a4bfe44._.js → _65f6e0e0._.js} +3 -3
  213. package/web/.next/server/chunks/ssr/{_7a4bfe44._.js.map → _65f6e0e0._.js.map} +1 -1
  214. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  215. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/_913fb649._.js +3 -0
  217. package/web/.next/server/chunks/ssr/{_7bc4a733._.js.map → _913fb649._.js.map} +1 -1
  218. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  219. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/{_01383b12._.js → _a51673dd._.js} +2 -2
  221. package/web/.next/server/chunks/ssr/{_82cc1fcf._.js.map → _a51673dd._.js.map} +1 -1
  222. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  223. package/web/.next/server/chunks/ssr/{_82cc1fcf._.js → _ae587066._.js} +2 -2
  224. package/web/.next/server/chunks/ssr/{_01383b12._.js.map → _ae587066._.js.map} +1 -1
  225. package/web/.next/server/chunks/ssr/{_3b9ec2d7._.js → _d162e30d._.js} +2 -2
  226. package/web/.next/server/chunks/ssr/{_3b9ec2d7._.js.map → _d162e30d._.js.map} +1 -1
  227. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  228. package/web/.next/server/chunks/ssr/{_112b6fbf._.js → _d763f022._.js} +3 -3
  229. package/web/.next/server/chunks/ssr/{_112b6fbf._.js.map → _d763f022._.js.map} +1 -1
  230. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  231. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  232. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  233. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  235. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/{src_presentation_web_99db45e9._.js → src_presentation_web_97dc2fb0._.js} +2 -2
  237. package/web/.next/server/chunks/ssr/{src_presentation_web_99db45e9._.js.map → src_presentation_web_97dc2fb0._.js.map} +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  239. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  241. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  242. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  243. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -1
  244. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  245. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  246. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  247. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  248. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  250. package/web/.next/server/pages/500.html +2 -2
  251. package/web/.next/server/server-reference-manifest.js +1 -1
  252. package/web/.next/server/server-reference-manifest.json +463 -463
  253. package/web/.next/static/chunks/{18616dda443b7ed1.js → 0b7fe2ac4f078f54.js} +7 -7
  254. package/web/.next/static/chunks/{ac7469534efcc3b0.js → 2d6eb4409cc6324d.js} +1 -1
  255. package/web/.next/static/chunks/{acd8d06ded15d1ed.js → 3a7ff215d6a2c489.js} +2 -2
  256. package/web/.next/static/chunks/{dc8683ddff12ef38.js → 4b3e7454c2b07877.js} +1 -1
  257. package/web/.next/static/chunks/{745234c95baaf6df.js → 791e64500a080d4f.js} +1 -1
  258. package/web/.next/static/chunks/79c9871d46b22bf8.css +1 -0
  259. package/web/.next/static/chunks/7ee0606f698b032c.js +1 -0
  260. package/web/.next/static/chunks/87640f53f3bff3a6.js +1 -0
  261. package/web/.next/static/chunks/bb5bd1b5aafc70cd.js +1 -0
  262. package/web/.next/static/chunks/{cfcc46c87d712da6.js → bf0a401666f990e2.js} +1 -1
  263. package/web/.next/static/chunks/c4c3fcf18262b386.js +2 -0
  264. package/web/.next/static/chunks/{12511f976fedf4cb.js → cd14232b3d8f5052.js} +1 -1
  265. package/web/.next/static/chunks/{08d0fd276fa7ac89.js → dd8f2197640aea64.js} +1 -1
  266. package/web/.next/static/chunks/{47d110d7472840fd.js → fc442d957b35bd5e.js} +1 -1
  267. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts +0 -132
  268. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts.map +0 -1
  269. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.js +0 -12
  270. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts +0 -11
  271. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts.map +0 -1
  272. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.js +0 -17
  273. package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts +0 -42
  274. package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts.map +0 -1
  275. package/dist/packages/core/src/infrastructure/services/coasts.service.js +0 -185
  276. package/dist/src/presentation/cli/commands/coasts/index.d.ts +0 -3
  277. package/dist/src/presentation/cli/commands/coasts/index.d.ts.map +0 -1
  278. package/dist/src/presentation/cli/commands/coasts/index.js +0 -7
  279. package/dist/src/presentation/cli/commands/coasts/init.command.d.ts +0 -3
  280. package/dist/src/presentation/cli/commands/coasts/init.command.d.ts.map +0 -1
  281. package/dist/src/presentation/cli/commands/coasts/init.command.js +0 -40
  282. package/dist/src/presentation/web/app/actions/check-coastfile.d.ts +0 -5
  283. package/dist/src/presentation/web/app/actions/check-coastfile.d.ts.map +0 -1
  284. package/dist/src/presentation/web/app/actions/check-coastfile.js +0 -16
  285. package/dist/src/presentation/web/app/actions/generate-coastfile.d.ts +0 -7
  286. package/dist/src/presentation/web/app/actions/generate-coastfile.d.ts.map +0 -1
  287. package/dist/src/presentation/web/app/actions/generate-coastfile.js +0 -22
  288. package/dist/src/presentation/web/coasts-dev-server.d.ts +0 -34
  289. package/dist/src/presentation/web/coasts-dev-server.d.ts.map +0 -1
  290. package/dist/src/presentation/web/coasts-dev-server.js +0 -69
  291. package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.d.ts +0 -12
  292. package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.d.ts.map +0 -1
  293. package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.js +0 -76
  294. package/web/.next/server/chunks/ssr/_12282083._.js +0 -4
  295. package/web/.next/server/chunks/ssr/_12282083._.js.map +0 -1
  296. package/web/.next/server/chunks/ssr/_7bc4a733._.js +0 -3
  297. package/web/.next/static/chunks/0d4f2f0257e78c06.css +0 -1
  298. package/web/.next/static/chunks/1f321d18af8d8b30.js +0 -1
  299. package/web/.next/static/chunks/891d57985c5f3a0b.js +0 -1
  300. package/web/.next/static/chunks/dfe1ea2ffdc06c44.js +0 -2
  301. package/web/.next/static/chunks/fe54542759c9fd27.js +0 -1
  302. /package/web/.next/static/{YPdE95T5GezMRcw-C6nfC → JaRBeVSDLWZLQIl_k7ChK}/_buildManifest.js +0 -0
  303. /package/web/.next/static/{YPdE95T5GezMRcw-C6nfC → JaRBeVSDLWZLQIl_k7ChK}/_clientMiddlewareManifest.json +0 -0
  304. /package/web/.next/static/{YPdE95T5GezMRcw-C6nfC → JaRBeVSDLWZLQIl_k7ChK}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useMemo } from 'react';
3
- import { expect, fn, waitFor } from '@storybook/test';
3
+ import { expect, fn, userEvent, waitFor, within } from '@storybook/test';
4
4
  import { ReactFlowProvider, ReactFlow, useNodesState } from '@xyflow/react';
5
5
  import { DeploymentState, PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
6
6
  import { FeatureNode } from './feature-node.js';
@@ -213,6 +213,16 @@ const allStatesData = [
213
213
  agentType: 'claude-code',
214
214
  hasAgentRun: true,
215
215
  },
216
+ {
217
+ name: 'Old Dashboard',
218
+ description: 'Previous iteration of the admin dashboard',
219
+ featureId: '#f8',
220
+ lifecycle: 'maintain',
221
+ state: 'archived',
222
+ progress: 100,
223
+ repositoryPath: '/home/user/my-repo',
224
+ branch: 'feat/old-dashboard',
225
+ },
216
226
  ];
217
227
  export const AllStates = {
218
228
  render: () => (_jsx("div", { className: "flex flex-wrap gap-6", children: allStatesData.map((data) => (_jsx(FeatureNodeCanvas, { style: { width: 500, height: 350 }, data: data }, data.featureId))) })),
@@ -594,3 +604,67 @@ export const PendingWithStart = {
594
604
  },
595
605
  render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
596
606
  };
607
+ export const Archived = {
608
+ args: {
609
+ name: 'Old Dashboard',
610
+ description: 'Previous iteration of the admin dashboard',
611
+ featureId: '#a1',
612
+ lifecycle: 'maintain',
613
+ state: 'archived',
614
+ progress: 100,
615
+ },
616
+ render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
617
+ };
618
+ export const ArchivedWithUnarchive = {
619
+ args: {
620
+ name: 'Old Dashboard',
621
+ description: 'Previous iteration of the admin dashboard',
622
+ featureId: '#a2',
623
+ lifecycle: 'maintain',
624
+ state: 'archived',
625
+ progress: 100,
626
+ onUnarchive: fn(),
627
+ },
628
+ render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
629
+ };
630
+ export const DoneWithArchive = {
631
+ args: {
632
+ name: 'Completed Feature',
633
+ description: 'A feature ready to be archived',
634
+ featureId: '#ar1',
635
+ lifecycle: 'maintain',
636
+ state: 'done',
637
+ progress: 100,
638
+ runtime: '2h 30m',
639
+ onArchive: fn(),
640
+ onDelete: fn(),
641
+ },
642
+ render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
643
+ };
644
+ /** Shows the archive confirmation dialog in its open state. */
645
+ export const ArchiveConfirmationDialog = {
646
+ args: {
647
+ name: 'Payment Gateway',
648
+ description: 'Stripe integration for subscriptions',
649
+ featureId: '#cd1',
650
+ lifecycle: 'maintain',
651
+ state: 'done',
652
+ progress: 100,
653
+ runtime: '1h 42m',
654
+ onArchive: fn(),
655
+ },
656
+ render: (args) => _jsx(FeatureNodeCanvas, { data: args, style: { width: 600, height: 500 } }),
657
+ play: async ({ canvasElement }) => {
658
+ const canvas = within(canvasElement);
659
+ // Hover over the node to reveal the archive button
660
+ const card = await waitFor(() => canvas.getByTestId('feature-node-card'));
661
+ await userEvent.hover(card);
662
+ // Click the archive button to open the confirmation dialog
663
+ const archiveButton = await waitFor(() => canvas.getByTestId('feature-node-archive-button'));
664
+ await userEvent.click(archiveButton);
665
+ // Verify the dialog is open
666
+ await waitFor(() => {
667
+ expect(document.querySelector('[role="alertdialog"]')).toBeTruthy();
668
+ });
669
+ },
670
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAQnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAmd5F"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAqa5F"}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { useState, useCallback } from 'react';
4
4
  import { Handle, Position } from '@xyflow/react';
5
5
  import { useRouter } from 'next/navigation';
6
- import { Github, Plus, Code2, Terminal, FolderOpen, Trash2, Play, Square, GitBranch, GitCommitHorizontal, ArrowDown, User, RotateCcw, FileCode2, } from 'lucide-react';
6
+ import { Github, Plus, Code2, Terminal, FolderOpen, Trash2, Play, Square, GitBranch, GitCommitHorizontal, ArrowDown, User, RotateCcw, } from 'lucide-react';
7
7
  import { cn } from '../../../lib/utils.js';
8
8
  import { ActionButton } from '../../common/action-button/index.js';
9
9
  import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '../../ui/dialog.js';
@@ -12,7 +12,6 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../
12
12
  import { useDeployAction } from '../../../hooks/use-deploy-action.js';
13
13
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
14
14
  import { useRepositoryActions } from './use-repository-actions.js';
15
- import { useCoastsActions } from './use-coasts-actions.js';
16
15
  import { FeatureSessionsDropdown, } from '../../common/feature-node/feature-sessions-dropdown.js';
17
16
  export function RepositoryNode({ data }) {
18
17
  const router = useRouter();
@@ -26,7 +25,6 @@ export function RepositoryNode({ data }) {
26
25
  repositoryPath: data.repositoryPath,
27
26
  }
28
27
  : null);
29
- const coastsActions = useCoastsActions(data.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
30
28
  const isDeploymentActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
31
29
  const handleCreateFromSession = useCallback((session, sessionFilePath) => {
32
30
  if (!data.repositoryPath)
@@ -87,10 +85,5 @@ export function RepositoryNode({ data }) {
87
85
  ? 'Retry'
88
86
  : isDeploymentActive
89
87
  ? 'Stop Dev Server'
90
- : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: false, icon: deployAction.deployError ? RotateCcw : isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) })] }) })) : null, featureFlags.coastsDevServer && data.repositoryPath ? (_jsx("div", { "data-testid": "repository-node-coastfile", className: "border-t px-4 py-2", onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx("span", { className: "text-muted-foreground", children: coastsActions.coastfileExists ? 'Coastfile' : 'No Coastfile' }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "ml-auto flex items-center", children: _jsx(ActionButton, { label: coastsActions.coastfileExists
91
- ? 'Regenerate Coastfile'
92
- : 'Generate Coastfile', onClick: coastsActions.generateCoastfile, loading: coastsActions.generating || coastsActions.checkLoading, error: !!coastsActions.error, icon: FileCode2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: coastsActions.error ??
93
- (coastsActions.coastfileExists
94
- ? 'Regenerate Coastfile'
95
- : 'Generate Coastfile') })] }) })] }) })) : null] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!", style: { top: 70 } })) : null] }));
88
+ : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: false, icon: deployAction.deployError ? RotateCcw : isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) })] }) })) : null] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!", style: { top: 70 } })) : null] }));
96
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAuWzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAKpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAoYzF"}
@@ -1,8 +1,10 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import { useReactFlow } from '@xyflow/react';
5
+ import { Panel, useReactFlow } from '@xyflow/react';
6
+ import { Eye, EyeOff } from 'lucide-react';
7
+ import { cn } from '../../../lib/utils.js';
6
8
  import { FeaturesCanvas } from '../../features/features-canvas/index.js';
7
9
  import { useSidebarFeaturesContext, mapNodeStateToSidebarStatus, } from '../../../hooks/sidebar-features-context.js';
8
10
  import { useSelectedFeatureId } from '../../../hooks/use-selected-feature-id.js';
@@ -26,7 +28,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
26
28
  const { fitView } = useReactFlow();
27
29
  const drawerTimerRef = useRef(null);
28
30
  const { defaultViewport, onMoveEnd: handleViewportChange, resetViewport, } = useViewportPersistence();
29
- const { nodes, edges, onNodesChange, handleConnect, handleAddRepository, handleDeleteFeature, handleRetryFeature, handleStartFeature, handleStopFeature, handleDeleteRepository, createFeatureNode, setCallbacks, } = useControlCenterState(initialNodes, initialEdges);
31
+ const { nodes, edges, onNodesChange, handleConnect, handleAddRepository, handleArchiveFeature, handleDeleteFeature, handleRetryFeature, handleStartFeature, handleStopFeature, handleUnarchiveFeature, handleDeleteRepository, createFeatureNode, showArchived, setShowArchived, setCallbacks, } = useControlCenterState(initialNodes, initialEdges);
30
32
  // Publish sidebar features + repo state to context
31
33
  const { setFeatures: setSidebarFeatures, setHasRepositories: setSidebarHasRepos } = useSidebarFeaturesContext();
32
34
  const featureNodes = useMemo(() => nodes.filter((n) => n.type === 'featureNode'), [nodes]);
@@ -201,6 +203,8 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
201
203
  onRetryFeature: handleRetryFeature,
202
204
  onStartFeature: handleStartFeature,
203
205
  onStopFeature: handleStopFeature,
206
+ onArchiveFeature: handleArchiveFeature,
207
+ onUnarchiveFeature: handleUnarchiveFeature,
204
208
  onRepositoryAdd: handleAddFeatureToRepo,
205
209
  onRepositoryClick: handleRepositoryClick,
206
210
  onRepositoryDelete: handleDeleteRepository,
@@ -208,10 +212,12 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
208
212
  }, [
209
213
  setCallbacks,
210
214
  handleAddFeatureToFeature,
215
+ handleArchiveFeature,
211
216
  handleDeleteFeature,
212
217
  handleRetryFeature,
213
218
  handleStartFeature,
214
219
  handleStopFeature,
220
+ handleUnarchiveFeature,
215
221
  handleAddFeatureToRepo,
216
222
  handleRepositoryClick,
217
223
  handleDeleteRepository,
@@ -263,5 +269,8 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
263
269
  return nodes;
264
270
  return nodes.map((n) => n.type === 'repositoryNode' ? { ...n, data: { ...n.data, pulseAdd: true } } : n);
265
271
  }, [nodes, isCreateDrawerOpen]);
266
- return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
272
+ const archiveToggle = (_jsx(Panel, { position: "top-right", children: _jsxs("button", { type: "button", "aria-label": showArchived ? 'Hide archived features' : 'Show archived features', "data-testid": "archive-toggle-button", onClick: () => setShowArchived(!showArchived), className: cn('bg-card flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium shadow-sm transition-colors', showArchived
273
+ ? 'border-primary/30 text-primary'
274
+ : 'text-muted-foreground hover:text-foreground'), children: [showArchived ? _jsx(Eye, { className: "h-3.5 w-3.5" }) : _jsx(EyeOff, { className: "h-3.5 w-3.5" }), showArchived ? 'Archived visible' : 'Show archived'] }) }));
275
+ return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, toolbar: archiveToggle, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
267
276
  }
@@ -15,4 +15,10 @@ export declare const WithNodeActions: Story;
15
15
  * "Horizontal" to switch back.
16
16
  */
17
17
  export declare const DagreLayout: Story;
18
+ /**
19
+ * Canvas with active and archived features.
20
+ * The archive toggle button appears in the top-right corner ("Show archived").
21
+ * Click the toggle to reveal the dimmed archived feature node.
22
+ */
23
+ export declare const WithArchivedFeatures: Story;
18
24
  //# sourceMappingURL=control-center.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAkBpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0EnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAS7B,CAAC;AAiIF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC"}
1
+ {"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAkBpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0EnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAS7B,CAAC;AAiIF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AA4DF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KASlC,CAAC"}
@@ -245,3 +245,73 @@ export const DagreLayout = {
245
245
  initialEdges: dagreLayoutedEdges,
246
246
  },
247
247
  };
248
+ // --- Archive toggle stories ---
249
+ const archiveRepoNode = {
250
+ id: 'repo-archive',
251
+ type: 'repositoryNode',
252
+ position: { x: 50, y: 115 },
253
+ data: { name: 'shep-ai/cli' },
254
+ };
255
+ const archivedFeatureNodes = [
256
+ {
257
+ id: 'feat-active',
258
+ type: 'featureNode',
259
+ position: { x: 400, y: 0 },
260
+ data: {
261
+ name: 'Auth Module',
262
+ description: 'OAuth2 authentication flow',
263
+ featureId: '#f1',
264
+ lifecycle: 'implementation',
265
+ state: 'running',
266
+ progress: 65,
267
+ repositoryPath: '/home/user/my-repo',
268
+ branch: 'feat/auth-module',
269
+ },
270
+ },
271
+ {
272
+ id: 'feat-done',
273
+ type: 'featureNode',
274
+ position: { x: 400, y: 230 },
275
+ data: {
276
+ name: 'Payment Gateway',
277
+ description: 'Stripe integration for subscriptions',
278
+ featureId: '#f2',
279
+ lifecycle: 'deploy',
280
+ state: 'done',
281
+ progress: 100,
282
+ runtime: '1h 42m',
283
+ repositoryPath: '/home/user/my-repo',
284
+ branch: 'feat/payment-gateway',
285
+ },
286
+ },
287
+ {
288
+ id: 'feat-archived',
289
+ type: 'featureNode',
290
+ position: { x: 800, y: 115 },
291
+ data: {
292
+ name: 'Old Dashboard',
293
+ description: 'Previous iteration of the admin dashboard',
294
+ featureId: '#f3',
295
+ lifecycle: 'maintain',
296
+ state: 'archived',
297
+ progress: 100,
298
+ repositoryPath: '/home/user/my-repo',
299
+ branch: 'feat/old-dashboard',
300
+ },
301
+ },
302
+ ];
303
+ /**
304
+ * Canvas with active and archived features.
305
+ * The archive toggle button appears in the top-right corner ("Show archived").
306
+ * Click the toggle to reveal the dimmed archived feature node.
307
+ */
308
+ export const WithArchivedFeatures = {
309
+ args: {
310
+ initialNodes: [archiveRepoNode, ...archivedFeatureNodes],
311
+ initialEdges: [
312
+ { id: 'e-repo-active', source: 'repo-archive', target: 'feat-active', ...dashedEdge },
313
+ { id: 'e-repo-done', source: 'repo-archive', target: 'feat-done', ...dashedEdge },
314
+ { id: 'e-repo-archived', source: 'repo-archive', target: 'feat-archived', ...dashedEdge },
315
+ ],
316
+ },
317
+ };
@@ -14,12 +14,18 @@ export interface ControlCenterState {
14
14
  repoPath: string;
15
15
  };
16
16
  handleLayout: (direction: LayoutDirection) => void;
17
+ handleArchiveFeature: (featureId: string) => void;
17
18
  handleDeleteFeature: (featureId: string, cleanup?: boolean, cascadeDelete?: boolean, closePr?: boolean) => void;
18
19
  handleRetryFeature: (featureId: string) => void;
19
20
  handleStartFeature: (featureId: string) => void;
20
21
  handleStopFeature: (featureId: string) => void;
22
+ handleUnarchiveFeature: (featureId: string) => void;
21
23
  handleDeleteRepository: (repositoryId: string) => Promise<void>;
22
24
  createFeatureNode: (sourceNodeId: string | null, dataOverride?: Partial<FeatureNodeData>, edgeType?: string) => string;
25
+ /** Whether archived features are shown on the canvas. */
26
+ showArchived: boolean;
27
+ /** Toggle archived feature visibility. */
28
+ setShowArchived: (show: boolean) => void;
23
29
  /** Stable lookup: repositoryPath for a feature node. */
24
30
  getFeatureRepositoryPath: (featureNodeId: string) => string | undefined;
25
31
  /** Stable lookup: repository data by nodeId. */
@@ -1 +1 @@
1
- {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAwhBpB"}
1
+ {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAkBjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mBAAmB,EAAE,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,yDAAyD;IACzD,YAAY,EAAE,OAAO,CAAC;IACtB,0CAA0C;IAC1C,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAwkBpB"}
@@ -1,12 +1,14 @@
1
1
  'use client';
2
- import { useCallback, useEffect, useMemo, useRef } from 'react';
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { useRouter } from 'next/navigation';
4
4
  import { toast } from 'sonner';
5
5
  import { layoutWithDagre, CANVAS_LAYOUT_DEFAULTS, } from '../../../lib/layout-with-dagre.js';
6
+ import { archiveFeature } from '../../../app/actions/archive-feature.js';
6
7
  import { deleteFeature } from '../../../app/actions/delete-feature.js';
7
8
  import { resumeFeature } from '../../../app/actions/resume-feature.js';
8
9
  import { startFeature } from '../../../app/actions/start-feature.js';
9
10
  import { stopFeature } from '../../../app/actions/stop-feature.js';
11
+ import { unarchiveFeature } from '../../../app/actions/unarchive-feature.js';
10
12
  import { addRepository } from '../../../app/actions/add-repository.js';
11
13
  import { deleteRepository } from '../../../app/actions/delete-repository.js';
12
14
  import { getFeatureMetadata } from '../../../app/actions/get-feature-metadata.js';
@@ -25,7 +27,9 @@ export function useControlCenterState(initialNodes, initialEdges) {
25
27
  const router = useRouter();
26
28
  const deleteSound = useSoundAction('delete');
27
29
  const createSound = useSoundAction('create');
28
- const { nodes, edges, reconcile, updateFeature, addPendingFeature, removeFeature, restoreFeature, addRepository: addRepositoryToMap, removeRepository, replaceRepository, getFeatureRepositoryPath, getRepositoryData, getRepoMapSize, setCallbacks, beginMutation, endMutation, isMutating, } = useGraphState(initialNodes, initialEdges);
30
+ // Archive toggle: persists during session, resets on page reload (FR-10)
31
+ const [showArchived, setShowArchived] = useState(false);
32
+ const { nodes, edges, reconcile, updateFeature, addPendingFeature, removeFeature, restoreFeature, addRepository: addRepositoryToMap, removeRepository, replaceRepository, getFeatureRepositoryPath, getRepositoryData, getRepoMapSize, setCallbacks, beginMutation, endMutation, isMutating, } = useGraphState(initialNodes, initialEdges, showArchived);
29
33
  // Refs for stable access to latest nodes/edges without callback recreation
30
34
  const nodesRef = useRef(nodes);
31
35
  const edgesRef = useRef(edges);
@@ -279,6 +283,39 @@ export function useControlCenterState(initialNodes, initialEdges) {
279
283
  })
280
284
  .finally(() => endMutation());
281
285
  }, [beginMutation, endMutation]);
286
+ const handleArchiveFeature = useCallback((featureId) => {
287
+ beginMutation();
288
+ archiveFeature(featureId)
289
+ .then((result) => {
290
+ if (result.error) {
291
+ toast.error(result.error);
292
+ }
293
+ else {
294
+ toast.success('Feature archived');
295
+ }
296
+ })
297
+ .catch(() => {
298
+ toast.error('Failed to archive feature');
299
+ })
300
+ .finally(() => endMutation());
301
+ }, [beginMutation, endMutation]);
302
+ const handleUnarchiveFeature = useCallback((featureId) => {
303
+ beginMutation();
304
+ unarchiveFeature(featureId)
305
+ .then((result) => {
306
+ if (result.error) {
307
+ toast.error(result.error);
308
+ }
309
+ else {
310
+ // The next poll/reconcile will restore the correct state and lifecycle
311
+ toast.success('Feature unarchived');
312
+ }
313
+ })
314
+ .catch(() => {
315
+ toast.error('Failed to unarchive feature');
316
+ })
317
+ .finally(() => endMutation());
318
+ }, [beginMutation, endMutation]);
282
319
  const handleDeleteFeature = useCallback((featureId, cleanup, cascadeDelete, closePr) => {
283
320
  const nodeId = `feat-${featureId}`;
284
321
  const shouldCascade = cascadeDelete === true;
@@ -455,13 +492,17 @@ export function useControlCenterState(initialNodes, initialEdges) {
455
492
  onNodesChange,
456
493
  handleConnect,
457
494
  handleAddRepository,
495
+ handleArchiveFeature,
458
496
  handleLayout,
459
497
  handleDeleteFeature,
460
498
  handleRetryFeature,
461
499
  handleStartFeature,
462
500
  handleStopFeature,
501
+ handleUnarchiveFeature,
463
502
  handleDeleteRepository,
464
503
  createFeatureNode,
504
+ showArchived,
505
+ setShowArchived,
465
506
  getFeatureRepositoryPath,
466
507
  getRepositoryData,
467
508
  setCallbacks,
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAkCzE,MAAM,WAAW,gCAAgC;IAC/C,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,2BAA2B,CAAC,EAAE,YAAY,EAAE,EAAE,gCAAgC,2CAgE7F"}
1
+ {"version":3,"file":"feature-flags-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AA8BzE,MAAM,WAAW,gCAAgC;IAC/C,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,2BAA2B,CAAC,EAAE,YAAY,EAAE,EAAE,gCAAgC,2CAgE7F"}
@@ -14,7 +14,6 @@ const FLAG_DESCRIPTIONS = {
14
14
  githubImport: 'Enable GitHub repository import in the web UI',
15
15
  adoptBranch: 'Enable the ability to adopt existing branches as tracked features',
16
16
  reactFileManager: 'Use the built-in React file manager instead of the native OS folder picker. Also serves as automatic fallback when the native picker is unavailable.',
17
- coastsDevServer: 'Enable Coasts containerized runtime isolation for the dev server, providing per-worktree isolation via Docker containers',
18
17
  };
19
18
  const FLAG_LABELS = {
20
19
  skills: 'Skills',
@@ -23,7 +22,6 @@ const FLAG_LABELS = {
23
22
  githubImport: 'GitHub Import',
24
23
  adoptBranch: 'Adopt Branch',
25
24
  reactFileManager: 'React File Manager',
26
- coastsDevServer: 'Coasts Dev Server',
27
25
  };
28
26
  const FLAG_KEYS = [
29
27
  'skills',
@@ -32,7 +30,6 @@ const FLAG_KEYS = [
32
30
  'githubImport',
33
31
  'adoptBranch',
34
32
  'reactFileManager',
35
- 'coastsDevServer',
36
33
  ];
37
34
  export function FeatureFlagsSettingsSection({ featureFlags }) {
38
35
  const [flags, setFlags] = useState({ ...featureFlags });
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAYrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAYxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAYzB,CAAC"}
1
+ {"version":3,"file":"feature-flags-settings-section.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/feature-flags-settings-section.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAE/E,QAAA,MAAM,IAAI;;;;;;;CAO0C,CAAC;AAErD,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAWrB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC"}
@@ -17,7 +17,6 @@ export const Default = {
17
17
  githubImport: false,
18
18
  adoptBranch: false,
19
19
  reactFileManager: false,
20
- coastsDevServer: false,
21
20
  },
22
21
  },
23
22
  };
@@ -30,7 +29,6 @@ export const AllEnabled = {
30
29
  githubImport: true,
31
30
  adoptBranch: true,
32
31
  reactFileManager: true,
33
- coastsDevServer: true,
34
32
  },
35
33
  },
36
34
  };
@@ -43,7 +41,6 @@ export const AllDisabled = {
43
41
  githubImport: false,
44
42
  adoptBranch: false,
45
43
  reactFileManager: false,
46
- coastsDevServer: false,
47
44
  },
48
45
  },
49
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA2B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CA6pCzB"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AA2B/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AA6QD,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,kBAAkB,GACnB,EAAE,uBAAuB,2CAgpCzB"}
@@ -122,7 +122,6 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
122
122
  githubImport: false,
123
123
  adoptBranch: false,
124
124
  reactFileManager: false,
125
- coastsDevServer: false,
126
125
  };
127
126
  // Agent state
128
127
  const [agentType, setAgentType] = useState(settings.agent.type);
@@ -502,10 +501,6 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize, availableTe
502
501
  const newFlags = { ...flags, reactFileManager: v };
503
502
  setFlags(newFlags);
504
503
  save({ featureFlags: newFlags });
505
- } }), _jsx(SwitchRow, { label: "Coasts Dev Server", description: "Enable Coasts containerized runtime isolation for the dev server", id: "flag-coastsDevServer", testId: "switch-flag-coastsDevServer", checked: flags.coastsDevServer, onChange: (v) => {
506
- const newFlags = { ...flags, coastsDevServer: v };
507
- setFlags(newFlags);
508
- save({ featureFlags: newFlags });
509
504
  } })] }), _jsx(SectionHint, { children: "Experimental features that are still under development. Enable at your own risk \u2014 they may change or be removed in future versions. Debug mode adds verbose logging useful for troubleshooting." })] }), _jsxs("div", { id: "section-database", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Database, title: "Database", description: "Local storage information", testId: "database-settings-section", children: [_jsx(SettingsRow, { label: "Location", description: "Path to the local SQLite database", children: _jsx("span", { className: "text-muted-foreground max-w-50 truncate font-mono text-xs", "data-testid": "shep-home-path", children: shepHome }) }), _jsx(SettingsRow, { label: "Size", children: _jsx("span", { className: "text-muted-foreground text-xs", "data-testid": "db-file-size", children: dbFileSize }) })] }), _jsx(SectionHint, { links: [
510
505
  {
511
506
  label: 'Settings service',
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,QAAA,MAAM,IAAI;;;;;;;CAOiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAqBzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAsB5B,CAAC"}
1
+ {"version":3,"file":"settings-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,QAAA,MAAM,IAAI;;;;;;;CAOiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAoBzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAsB5B,CAAC"}
@@ -33,7 +33,6 @@ export const AllSections = {
33
33
  githubImport: false,
34
34
  adoptBranch: false,
35
35
  reactFileManager: false,
36
- coastsDevServer: false,
37
36
  },
38
37
  },
39
38
  shepHome: '/opt/shep',
@@ -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;AAmDnC,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,KAiB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAQrB,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;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAe3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAyBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAmDnC,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,KAiB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC"}
@@ -8,7 +8,6 @@ const defaultFeatureFlags = {
8
8
  githubImport: false,
9
9
  adoptBranch: false,
10
10
  reactFileManager: false,
11
- coastsDevServer: false,
12
11
  };
13
12
  const meta = {
14
13
  title: 'Layout/AppSidebar',
@@ -20,8 +20,6 @@ import { initializeSettings } from '../../../packages/core/src/infrastructure/se
20
20
  import { initializeNotificationWatcher, getNotificationWatcher, } from '../../../packages/core/src/infrastructure/services/notifications/notification-watcher.service.js';
21
21
  import { initializePrSyncWatcher, getPrSyncWatcher, } from '../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js';
22
22
  import { getExistingConnection } from '../../../packages/core/src/infrastructure/persistence/sqlite/connection.js';
23
- import { getFeatureFlags } from './lib/feature-flags.js';
24
- import { startCoastsDevServer, shutdownCoasts } from './coasts-dev-server.js';
25
23
  const DEFAULT_PORT = 3000;
26
24
  async function isPortAvailable(port) {
27
25
  return new Promise((resolve) => {
@@ -49,9 +47,6 @@ async function findAvailablePort(startPort) {
49
47
  async function main() {
50
48
  const basePort = process.env.PORT !== undefined ? parseInt(process.env.PORT, 10) : DEFAULT_PORT;
51
49
  const port = await findAvailablePort(basePort);
52
- // Track Coasts mode state for shutdown handler
53
- let coastsService = null;
54
- let coastsWorkDir = null;
55
50
  // Step 1: Initialize DI container (database + migrations)
56
51
  // Same as CLI bootstrap (src/presentation/cli/index.ts:52-58)
57
52
  try {
@@ -77,63 +72,7 @@ async function main() {
77
72
  catch (error) {
78
73
  console.warn('[dev-server] DI initialization failed — features will be empty:', error);
79
74
  }
80
- // Step 2: Check coastsDevServer feature flag — branch to Coasts mode or bare Next.js
81
- const flags = getFeatureFlags();
82
- if (flags.coastsDevServer) {
83
- // --- Coasts mode: containerized runtime isolation ---
84
- const workDir = process.cwd();
85
- try {
86
- const service = container.resolve('ICoastsService');
87
- const instance = await startCoastsDevServer(service, workDir);
88
- coastsService = service;
89
- coastsWorkDir = workDir;
90
- console.log(`[dev-server:coasts] Dev server running in Coasts mode at ${instance.url}`);
91
- }
92
- catch (error) {
93
- console.error('[dev-server:coasts] Failed to start Coasts dev server:', error);
94
- process.exit(1);
95
- }
96
- // Graceful shutdown for Coasts mode
97
- let isShuttingDown = false;
98
- const shutdown = async () => {
99
- if (isShuttingDown)
100
- return;
101
- isShuttingDown = true;
102
- console.log('\n[dev-server:coasts] Shutting down...');
103
- const forceExit = setTimeout(() => process.exit(0), 2000);
104
- try {
105
- await shutdownCoasts(coastsService, coastsWorkDir);
106
- try {
107
- const deploymentService = container.resolve('IDeploymentService');
108
- deploymentService.stopAll();
109
- }
110
- catch {
111
- /* not initialized */
112
- }
113
- try {
114
- getNotificationWatcher().stop();
115
- }
116
- catch {
117
- /* not initialized */
118
- }
119
- try {
120
- getPrSyncWatcher().stop();
121
- }
122
- catch {
123
- /* not initialized */
124
- }
125
- }
126
- finally {
127
- clearTimeout(forceExit);
128
- process.exit(0);
129
- }
130
- };
131
- process.on('SIGINT', shutdown);
132
- process.on('SIGTERM', shutdown);
133
- return;
134
- }
135
- // --- Bare mode: standard Next.js dev server (default, unchanged) ---
136
- // Clean up lock file to allow multiple dev instances
75
+ // Step 2: Clean up lock file to allow multiple dev instances
137
76
  const lockPath = path.join(import.meta.dirname, '.next', 'dev', 'lock');
138
77
  try {
139
78
  fs.rmSync(lockPath, { force: true });
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/feature-flags-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAc7D,UAAU,yBAAyB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,yBAAyB,2CAElF;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,CAEnD"}
1
+ {"version":3,"file":"feature-flags-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/feature-flags-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAa7D,UAAU,yBAAyB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,yBAAyB,2CAElF;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,iBAAiB,CAEnD"}
@@ -8,7 +8,6 @@ const defaultFlags = {
8
8
  githubImport: false,
9
9
  adoptBranch: false,
10
10
  reactFileManager: false,
11
- coastsDevServer: false,
12
11
  };
13
12
  const FeatureFlagsContext = createContext(defaultFlags);
14
13
  /**