@shepai/cli 1.136.0-pr437.9f802f1 → 1.136.0-pr439.2a7af41

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 (284) hide show
  1. package/apis/json-schema/FeatureFlags.yaml +0 -5
  2. package/apis/json-schema/Repository.yaml +3 -0
  3. package/dist/packages/core/src/application/index.d.ts +1 -1
  4. package/dist/packages/core/src/application/index.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/ports/output/index.d.ts +1 -1
  6. package/dist/packages/core/src/application/ports/output/index.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +1 -1
  8. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -2
  10. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  11. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +21 -5
  12. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts.map +1 -1
  13. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +1 -1
  14. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  15. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +8 -2
  16. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  17. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +0 -1
  18. package/dist/packages/core/src/domain/generated/output.d.ts +4 -4
  19. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/di/container.js +0 -10
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +1 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +2 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +0 -1
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +0 -2
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts +12 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts.map +1 -0
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.js +19 -0
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +1 -1
  32. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +6 -2
  34. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +2 -3
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +4 -2
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +15 -8
  39. package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts +17 -0
  40. package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts.map +1 -0
  41. package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.js +21 -0
  42. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  43. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +2 -4
  44. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map +1 -1
  45. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +2 -4
  46. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +17 -3
  47. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map +1 -1
  48. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.js +49 -13
  49. package/dist/src/presentation/cli/index.js +0 -2
  50. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -9
  52. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +0 -3
  54. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +0 -3
  56. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  57. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +0 -5
  58. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +0 -1
  60. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +0 -1
  62. package/dist/src/presentation/web/dev-server.js +1 -62
  63. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  64. package/dist/src/presentation/web/hooks/feature-flags-context.js +0 -1
  65. package/dist/src/presentation/web/lib/feature-flags.d.ts +0 -2
  66. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  67. package/dist/src/presentation/web/lib/feature-flags.js +0 -5
  68. package/dist/tsconfig.build.tsbuildinfo +1 -1
  69. package/package.json +1 -2
  70. package/web/.next/BUILD_ID +1 -1
  71. package/web/.next/build-manifest.json +2 -2
  72. package/web/.next/fallback-build-manifest.json +2 -2
  73. package/web/.next/prerender-manifest.json +3 -3
  74. package/web/.next/required-server-files.js +1 -1
  75. package/web/.next/required-server-files.json +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +50 -80
  77. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
  78. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +50 -80
  81. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  82. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +62 -92
  85. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  86. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  87. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +62 -92
  89. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  90. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  91. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +46 -76
  93. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  94. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +50 -80
  97. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  98. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +62 -92
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  103. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +62 -92
  105. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  106. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  107. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +46 -76
  109. package/web/.next/server/app/(dashboard)/page.js +2 -2
  110. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +46 -76
  113. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  114. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/_global-error.html +2 -2
  117. package/web/.next/server/app/_global-error.rsc +1 -1
  118. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  119. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  120. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  121. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  123. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  124. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  126. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  127. package/web/.next/server/app/api/graph-data/route.js +1 -1
  128. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  129. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  130. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  131. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  133. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  134. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  136. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  137. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  139. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/chunks/403f9_next_567de315._.js +2 -2
  141. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  142. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  143. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  144. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  145. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +3 -0
  147. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +1 -0
  148. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  149. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +3 -0
  151. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +1 -0
  152. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +3 -0
  153. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +1 -0
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__785e8499._.js +3 -0
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__785e8499._.js.map +1 -0
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1670307._.js +3 -0
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1670307._.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__d68f61dd._.js +3 -0
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__d68f61dd._.js.map +1 -0
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4e193d3._.js +3 -0
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4e193d3._.js.map +1 -0
  176. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  177. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  179. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/{_12282083._.js → _32961561._.js} +2 -2
  181. package/web/.next/server/chunks/ssr/{_12282083._.js.map → _32961561._.js.map} +1 -1
  182. package/web/.next/server/chunks/ssr/_503680be._.js +3 -0
  183. package/web/.next/server/chunks/ssr/{_7bc4a733._.js.map → _503680be._.js.map} +1 -1
  184. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  185. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  187. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  191. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/_e69a26ba._.js +4 -0
  193. package/web/.next/server/chunks/ssr/_e69a26ba._.js.map +1 -0
  194. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  195. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  197. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/{src_presentation_web_99db45e9._.js → src_presentation_web_06ffd221._.js} +2 -2
  199. package/web/.next/server/chunks/ssr/{src_presentation_web_99db45e9._.js.map → src_presentation_web_06ffd221._.js.map} +1 -1
  200. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +5 -0
  201. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +3 -0
  203. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  205. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  207. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  209. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  211. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +5 -0
  213. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js.map +1 -0
  214. package/web/.next/server/pages/500.html +2 -2
  215. package/web/.next/server/server-reference-manifest.js +1 -1
  216. package/web/.next/server/server-reference-manifest.json +307 -463
  217. package/web/.next/static/chunks/{18616dda443b7ed1.js → 0b7fe2ac4f078f54.js} +7 -7
  218. package/web/.next/static/chunks/{ac7469534efcc3b0.js → 2bbb31a39a80d011.js} +1 -1
  219. package/web/.next/static/chunks/{fe54542759c9fd27.js → 5466ac7c8d7c6b2b.js} +1 -1
  220. package/web/.next/static/chunks/{acd8d06ded15d1ed.js → 6daf875725c43e2c.js} +2 -2
  221. package/web/.next/static/chunks/{dfe1ea2ffdc06c44.js → 796bb98fb3f35b71.js} +2 -2
  222. package/web/.next/static/chunks/{0d4f2f0257e78c06.css → 92cd6f523639a6fa.css} +1 -1
  223. package/web/.next/static/chunks/{dc8683ddff12ef38.js → 991f2fcba923f3ed.js} +1 -1
  224. package/web/.next/static/chunks/{12511f976fedf4cb.js → af4d1051b6fa73d5.js} +1 -1
  225. package/web/.next/static/chunks/{08d0fd276fa7ac89.js → c317cd6a6f76361d.js} +1 -1
  226. package/web/.next/static/chunks/{745234c95baaf6df.js → d0be9b22c3b9bce8.js} +1 -1
  227. package/web/.next/static/chunks/db862617e62ba1f9.js +1 -0
  228. package/web/.next/static/chunks/{cfcc46c87d712da6.js → e15904973d49ff89.js} +1 -1
  229. package/web/.next/static/chunks/{1f321d18af8d8b30.js → e6cff1dacc561fa0.js} +1 -1
  230. package/web/.next/static/chunks/{47d110d7472840fd.js → e8d49a8e1274cb49.js} +1 -1
  231. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts +0 -132
  232. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts.map +0 -1
  233. package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.js +0 -12
  234. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts +0 -11
  235. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts.map +0 -1
  236. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.js +0 -17
  237. package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts +0 -42
  238. package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts.map +0 -1
  239. package/dist/packages/core/src/infrastructure/services/coasts.service.js +0 -185
  240. package/dist/src/presentation/cli/commands/coasts/index.d.ts +0 -3
  241. package/dist/src/presentation/cli/commands/coasts/index.d.ts.map +0 -1
  242. package/dist/src/presentation/cli/commands/coasts/index.js +0 -7
  243. package/dist/src/presentation/cli/commands/coasts/init.command.d.ts +0 -3
  244. package/dist/src/presentation/cli/commands/coasts/init.command.d.ts.map +0 -1
  245. package/dist/src/presentation/cli/commands/coasts/init.command.js +0 -40
  246. package/dist/src/presentation/web/app/actions/check-coastfile.d.ts +0 -5
  247. package/dist/src/presentation/web/app/actions/check-coastfile.d.ts.map +0 -1
  248. package/dist/src/presentation/web/app/actions/check-coastfile.js +0 -16
  249. package/dist/src/presentation/web/app/actions/generate-coastfile.d.ts +0 -7
  250. package/dist/src/presentation/web/app/actions/generate-coastfile.d.ts.map +0 -1
  251. package/dist/src/presentation/web/app/actions/generate-coastfile.js +0 -22
  252. package/dist/src/presentation/web/coasts-dev-server.d.ts +0 -34
  253. package/dist/src/presentation/web/coasts-dev-server.d.ts.map +0 -1
  254. package/dist/src/presentation/web/coasts-dev-server.js +0 -69
  255. package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.d.ts +0 -12
  256. package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.d.ts.map +0 -1
  257. package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.js +0 -76
  258. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cf9161b._.js +0 -4
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cf9161b._.js.map +0 -1
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__71b5d4e8._.js +0 -4
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__71b5d4e8._.js.map +0 -1
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__944b653f._.js +0 -4
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__944b653f._.js.map +0 -1
  264. package/web/.next/server/chunks/ssr/[root-of-the-server]__a9079247._.js +0 -4
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__a9079247._.js.map +0 -1
  266. package/web/.next/server/chunks/ssr/_01383b12._.js +0 -4
  267. package/web/.next/server/chunks/ssr/_01383b12._.js.map +0 -1
  268. package/web/.next/server/chunks/ssr/_112b6fbf._.js +0 -6
  269. package/web/.next/server/chunks/ssr/_112b6fbf._.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/_3b9ec2d7._.js +0 -4
  271. package/web/.next/server/chunks/ssr/_3b9ec2d7._.js.map +0 -1
  272. package/web/.next/server/chunks/ssr/_7a4bfe44._.js +0 -6
  273. package/web/.next/server/chunks/ssr/_7a4bfe44._.js.map +0 -1
  274. package/web/.next/server/chunks/ssr/_7bc4a733._.js +0 -3
  275. package/web/.next/server/chunks/ssr/_7dd6c393._.js +0 -4
  276. package/web/.next/server/chunks/ssr/_7dd6c393._.js.map +0 -1
  277. package/web/.next/server/chunks/ssr/_82cc1fcf._.js +0 -4
  278. package/web/.next/server/chunks/ssr/_82cc1fcf._.js.map +0 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +0 -3
  280. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +0 -1
  281. package/web/.next/static/chunks/891d57985c5f3a0b.js +0 -1
  282. /package/web/.next/static/{YPdE95T5GezMRcw-C6nfC → xpAWvEAtoYdP3klvh5Yyo}/_buildManifest.js +0 -0
  283. /package/web/.next/static/{YPdE95T5GezMRcw-C6nfC → xpAWvEAtoYdP3klvh5Yyo}/_clientMiddlewareManifest.json +0 -0
  284. /package/web/.next/static/{YPdE95T5GezMRcw-C6nfC → xpAWvEAtoYdP3klvh5Yyo}/_ssgManifest.js +0 -0
@@ -5,8 +5,10 @@
5
5
  * (screenshots, test outputs, terminal recordings) proving that
6
6
  * completed tasks work as expected. Evidence files are saved to the
7
7
  * shep home folder (~/.shep/repos/<hash>/evidence/). When commitEvidence
8
- * is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
9
- * in the worktree. The agent outputs a structured JSON manifest of
8
+ * is enabled, files are also committed to .shep/specs/<NNN>-<feature>/evidence/
9
+ * in the worktree. When the spec directory is outside the worktree
10
+ * (shep-managed mode), commitEvidence is forced to false since git
11
+ * cannot track files outside the worktree. The agent outputs a structured JSON manifest of
10
12
  * evidence records that the evidence-output-parser extracts for the
11
13
  * graph state.
12
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CAoNR;AAgCD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CAsBR"}
1
+ {"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CA0NR;AAgCD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CAsBR"}
@@ -5,8 +5,10 @@
5
5
  * (screenshots, test outputs, terminal recordings) proving that
6
6
  * completed tasks work as expected. Evidence files are saved to the
7
7
  * shep home folder (~/.shep/repos/<hash>/evidence/). When commitEvidence
8
- * is enabled, files are also committed to specs/<NNN>-<feature>/evidence/
9
- * in the worktree. The agent outputs a structured JSON manifest of
8
+ * is enabled, files are also committed to .shep/specs/<NNN>-<feature>/evidence/
9
+ * in the worktree. When the spec directory is outside the worktree
10
+ * (shep-managed mode), commitEvidence is forced to false since git
11
+ * cannot track files outside the worktree. The agent outputs a structured JSON manifest of
10
12
  * evidence records that the evidence-output-parser extracts for the
11
13
  * graph state.
12
14
  */
@@ -45,7 +47,12 @@ ${tasksContent}
45
47
  const relativeSpecDir = relative(cwd, state.specDir).replaceAll('\\', '/');
46
48
  const specEvidenceRelPath = `${relativeSpecDir}/evidence`;
47
49
  const specEvidenceAbsPath = join(state.specDir, 'evidence').replaceAll('\\', '/');
48
- const storageSection = options.commitEvidence
50
+ // When specDir is outside the worktree (shep-managed mode), force commitEvidence=false.
51
+ // In shep-managed mode, relative() produces paths starting with '..' which escape
52
+ // the worktree boundary, making git operations invalid.
53
+ const isSpecDirOutsideWorktree = relativeSpecDir.startsWith('..');
54
+ const effectiveCommitEvidence = isSpecDirOutsideWorktree ? false : options.commitEvidence;
55
+ const storageSection = effectiveCommitEvidence
49
56
  ? `## Evidence Storage
50
57
 
51
58
  Save all evidence files to BOTH locations:
@@ -67,7 +74,7 @@ Save all evidence files to the shep home folder:
67
74
  1. Create the directory if it does not exist: \`mkdir -p ${shepEvidenceDir}/\`
68
75
  2. Save each evidence file with a descriptive name (e.g., \`homepage-screenshot.png\`, \`unit-test-results.txt\`)
69
76
  3. In the output JSON, set relativePath to the absolute path in the shep home folder (e.g., \`${shepEvidenceDir}/homepage-screenshot.png\`)`;
70
- const commitSection = options.commitEvidence
77
+ const commitSection = effectiveCommitEvidence
71
78
  ? `\n${buildCommitPushBlock({
72
79
  push: state.push,
73
80
  files: [`${specEvidenceRelPath}/`],
@@ -79,7 +86,7 @@ Do NOT commit or push any evidence files. Evidence is stored locally only.
79
86
  However, if you make code fixes during evidence collection, those fixes MUST be committed (see "Handling Code Fixes" above).`;
80
87
  return `You are a senior software engineer performing the EVIDENCE COLLECTION phase of feature development.
81
88
 
82
- Your goal is to capture visual and textual evidence proving that the implemented tasks work as expected.${options.commitEvidence ? ' This evidence will be embedded in the pull request body for reviewer verification.' : ' This evidence will be available for review locally.'}
89
+ Your goal is to capture visual and textual evidence proving that the implemented tasks work as expected.${effectiveCommitEvidence ? ' This evidence will be embedded in the pull request body for reviewer verification.' : ' This evidence will be available for review locally.'}
83
90
 
84
91
  ${specSection}
85
92
  ${tasksSection}
@@ -175,14 +182,14 @@ After capturing all evidence, output a JSON array of evidence records in a fence
175
182
  "type": "Screenshot",
176
183
  "capturedAt": "2026-01-01T12:00:00Z",
177
184
  "description": "Homepage showing new feature banner",
178
- "relativePath": "${options.commitEvidence ? `${specEvidenceRelPath}/homepage-banner.png` : `${shepEvidenceDir}/homepage-banner.png`}",
185
+ "relativePath": "${effectiveCommitEvidence ? `${specEvidenceRelPath}/homepage-banner.png` : `${shepEvidenceDir}/homepage-banner.png`}",
179
186
  "taskRef": "task-1"
180
187
  },
181
188
  {
182
189
  "type": "TestOutput",
183
190
  "capturedAt": "2026-01-01T12:01:00Z",
184
191
  "description": "Unit test results — all 42 tests passing",
185
- "relativePath": "${options.commitEvidence ? `${specEvidenceRelPath}/unit-test-results.txt` : `${shepEvidenceDir}/unit-test-results.txt`}",
192
+ "relativePath": "${effectiveCommitEvidence ? `${specEvidenceRelPath}/unit-test-results.txt` : `${shepEvidenceDir}/unit-test-results.txt`}",
186
193
  "taskRef": "task-2"
187
194
  }
188
195
  ]
@@ -192,7 +199,7 @@ Each evidence record must have:
192
199
  - **type**: One of Screenshot, Video, TestOutput, TerminalRecording
193
200
  - **capturedAt**: ISO 8601 timestamp of when the evidence was captured
194
201
  - **description**: Human-readable description of what this evidence proves
195
- - **relativePath**: ${options.commitEvidence ? `Path relative to the repo root (must start with \`${specEvidenceRelPath}/\`)` : `Absolute path in the shep home evidence folder (must start with \`${shepEvidenceDir}/\`)`}
202
+ - **relativePath**: ${effectiveCommitEvidence ? `Path relative to the repo root (must start with \`${specEvidenceRelPath}/\`)` : `Absolute path in the shep home evidence folder (must start with \`${shepEvidenceDir}/\`)`}
196
203
  - **taskRef**: (optional) Reference to the task ID this evidence proves
197
204
 
198
205
  If no evidence can be captured (e.g., no UI to screenshot, no tests to run), output an empty JSON array:
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Repository Hash Utility
3
+ *
4
+ * Computes a deterministic hash prefix from a repository path.
5
+ * Used to create unique per-repo directories under ~/.shep/repos/<hash>/.
6
+ *
7
+ * Normalizes path separators before hashing so the same repository
8
+ * produces the same hash on both Unix and Windows.
9
+ */
10
+ /**
11
+ * Compute a 16-character hex hash prefix for a repository path.
12
+ *
13
+ * @param repoPath - Absolute path to the repository root
14
+ * @returns First 16 hex characters of the SHA-256 hash
15
+ */
16
+ export declare function computeRepoHash(repoPath: string): string;
17
+ //# sourceMappingURL=repo-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-hash.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/filesystem/repo-hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIxD"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Repository Hash Utility
3
+ *
4
+ * Computes a deterministic hash prefix from a repository path.
5
+ * Used to create unique per-repo directories under ~/.shep/repos/<hash>/.
6
+ *
7
+ * Normalizes path separators before hashing so the same repository
8
+ * produces the same hash on both Unix and Windows.
9
+ */
10
+ import { createHash } from 'node:crypto';
11
+ /**
12
+ * Compute a 16-character hex hash prefix for a repository path.
13
+ *
14
+ * @param repoPath - Absolute path to the repository root
15
+ * @returns First 16 hex characters of the SHA-256 hash
16
+ */
17
+ export function computeRepoHash(repoPath) {
18
+ // Normalize separators before hashing so C:\foo and C:/foo produce the same hash
19
+ const normalizedRepoPath = repoPath.replace(/\\/g, '/');
20
+ return createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
21
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAQlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAuBlB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB1F,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBjD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAQzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAsB9B"}
1
+ {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAQlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAuBlB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB1F,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBjD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAsB9B"}
@@ -17,10 +17,10 @@ var __metadata = (this && this.__metadata) || function (k, v) {
17
17
  var __param = (this && this.__param) || function (paramIndex, decorator) {
18
18
  return function (target, key) { decorator(target, key, paramIndex); }
19
19
  };
20
- import { createHash } from 'node:crypto';
21
20
  import { mkdirSync, realpathSync } from 'node:fs';
22
21
  import path from 'node:path';
23
22
  import { injectable, inject } from 'tsyringe';
23
+ import { computeRepoHash } from '../filesystem/repo-hash.js';
24
24
  const GIT_AUTO_INIT_USER = 'shep-ai[bot]';
25
25
  const GIT_AUTO_INIT_EMAIL = 'bot@shep.bot';
26
26
  import { WorktreeError, WorktreeErrorCode, } from '../../../application/ports/output/services/worktree-service.interface.js';
@@ -178,9 +178,7 @@ let WorktreeService = class WorktreeService {
178
178
  }
179
179
  }
180
180
  getWorktreePath(repoPath, branch) {
181
- // Normalize separators before hashing so C:\foo and C:/foo produce the same hash
182
- const normalizedRepoPath = repoPath.replace(/\\/g, '/');
183
- const repoHash = createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
181
+ const repoHash = computeRepoHash(repoPath);
184
182
  const slug = branch.replace(/\//g, '-');
185
183
  return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
186
184
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compute-worktree-path.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAM5E"}
1
+ {"version":3,"file":"compute-worktree-path.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI5E"}
@@ -6,9 +6,9 @@
6
6
  *
7
7
  * Path format: ~/.shep/repos/<sha256-hash-prefix>/wt/<branch-slug>
8
8
  */
9
- import { createHash } from 'node:crypto';
10
9
  import { join } from 'node:path';
11
10
  import { getShepHomeDir } from '../filesystem/shep-directory.service.js';
11
+ import { computeRepoHash } from '../filesystem/repo-hash.js';
12
12
  /**
13
13
  * Compute the worktree path for a given repository and branch.
14
14
  *
@@ -17,9 +17,7 @@ import { getShepHomeDir } from '../filesystem/shep-directory.service.js';
17
17
  * @returns Absolute path to the worktree directory under ~/.shep/repos/
18
18
  */
19
19
  export function computeWorktreePath(repoPath, branch) {
20
- // Normalize separators before hashing so C:\foo and C:/foo produce the same hash
21
- const normalizedRepoPath = repoPath.replace(/\\/g, '/');
22
- const repoHash = createHash('sha256').update(normalizedRepoPath).digest('hex').slice(0, 16);
20
+ const repoHash = computeRepoHash(repoPath);
23
21
  const slug = branch.replace(/\//g, '-');
24
22
  return join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
25
23
  }
@@ -5,13 +5,27 @@
5
5
  * Templates match exactly what /shep-kit:new-feature produces,
6
6
  * enabling dogfooding — the CLI and the skill use the same spec format.
7
7
  */
8
- import type { ISpecInitializerService, SpecInitializerResult } from '../../../application/ports/output/services/spec-initializer.interface.js';
8
+ import type { ISpecInitializerService, SpecInitializerOptions, SpecInitializerResult } from '../../../application/ports/output/services/spec-initializer.interface.js';
9
9
  export declare class SpecInitializerService implements ISpecInitializerService {
10
- initialize(basePath: string, slug: string, featureNumber: number, description: string, mode?: 'fast'): Promise<SpecInitializerResult>;
10
+ initialize(basePath: string, slug: string, featureNumber: number, description: string, mode?: 'fast', options?: SpecInitializerOptions): Promise<SpecInitializerResult>;
11
11
  /**
12
- * Scan specs/ for existing NNN-* directories and return the next available number.
12
+ * Compute the spec directory path based on storage mode.
13
+ */
14
+ private computeSpecDir;
15
+ /**
16
+ * Scan spec directories for existing NNN-* entries and return the next available number.
17
+ * Scans up to 3 locations to prevent collisions during the transition period:
18
+ * 1. specs/ (legacy location)
19
+ * 2. .shep/specs/ (new in-repo location)
20
+ * 3. ~/.shep/repos/<hash>/specs/ (shep-managed location, when repositoryPath provided)
21
+ *
13
22
  * Uses the DB-derived hint as a minimum, but always respects filesystem state.
14
23
  */
15
24
  private resolveNextNumber;
25
+ /**
26
+ * Scan a single directory for NNN-* prefixed entries and return the max number found.
27
+ * Returns 0 if the directory does not exist or is empty.
28
+ */
29
+ private scanDirForMaxNumber;
16
30
  }
17
31
  //# sourceMappingURL=spec-initializer.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec-initializer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/spec/spec-initializer.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,mEAAmE,CAAC;AA8P3E,qBAAa,sBAAuB,YAAW,uBAAuB;IAC9D,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC;IAqCjC;;;OAGG;YACW,iBAAiB;CAoBhC"}
1
+ {"version":3,"file":"spec-initializer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/spec/spec-initializer.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,mEAAmE,CAAC;AAgQ3E,qBAAa,sBAAuB,YAAW,uBAAuB;IAC9D,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,qBAAqB,CAAC;IAgDjC;;OAEG;IACH,OAAO,CAAC,cAAc;IAgBtB;;;;;;;;OAQG;YACW,iBAAiB;IAqB/B;;;OAGG;YACW,mBAAmB;CAiBlC"}
@@ -7,6 +7,8 @@
7
7
  */
8
8
  import { mkdir, readdir, writeFile } from 'node:fs/promises';
9
9
  import { join } from 'node:path';
10
+ import { computeRepoHash } from '../../services/filesystem/repo-hash.js';
11
+ import { getShepHomeDir } from '../../services/filesystem/shep-directory.service.js';
10
12
  /**
11
13
  * Pad a number to 3 digits with leading zeros.
12
14
  */
@@ -240,13 +242,14 @@ const TEMPLATES = [
240
242
  { filename: 'feature.yaml', content: FEATURE_YAML },
241
243
  ];
242
244
  export class SpecInitializerService {
243
- async initialize(basePath, slug, featureNumber, description, mode) {
244
- // Scan existing specs/ directory for highest NNN prefix to avoid collisions
245
+ async initialize(basePath, slug, featureNumber, description, mode, options) {
246
+ const storageMode = options?.storageMode ?? 'in-repo';
247
+ // Scan existing spec directories for highest NNN prefix to avoid collisions
245
248
  // (specs may have been created outside the DB, e.g., via /shep-kit:new-feature)
246
- const resolvedNumber = await this.resolveNextNumber(basePath, featureNumber);
249
+ const resolvedNumber = await this.resolveNextNumber(basePath, featureNumber, options?.repositoryPath);
247
250
  const nnn = padNumber(resolvedNumber);
248
251
  const specDirName = `${nnn}-${slug}`;
249
- const specDir = join(basePath, 'specs', specDirName);
252
+ const specDir = this.computeSpecDir(basePath, specDirName, storageMode, options?.repositoryPath);
250
253
  // Create the spec directory
251
254
  await mkdir(specDir, { recursive: true });
252
255
  const now = new Date();
@@ -263,26 +266,59 @@ export class SpecInitializerService {
263
266
  return { specDir, featureNumber: nnn };
264
267
  }
265
268
  /**
266
- * Scan specs/ for existing NNN-* directories and return the next available number.
269
+ * Compute the spec directory path based on storage mode.
270
+ */
271
+ computeSpecDir(basePath, specDirName, storageMode, repositoryPath) {
272
+ if (storageMode === 'shep-managed') {
273
+ if (!repositoryPath) {
274
+ throw new Error('repositoryPath is required when storageMode is shep-managed');
275
+ }
276
+ const repoHash = computeRepoHash(repositoryPath);
277
+ return join(getShepHomeDir(), 'repos', repoHash, 'specs', specDirName);
278
+ }
279
+ return join(basePath, '.shep', 'specs', specDirName);
280
+ }
281
+ /**
282
+ * Scan spec directories for existing NNN-* entries and return the next available number.
283
+ * Scans up to 3 locations to prevent collisions during the transition period:
284
+ * 1. specs/ (legacy location)
285
+ * 2. .shep/specs/ (new in-repo location)
286
+ * 3. ~/.shep/repos/<hash>/specs/ (shep-managed location, when repositoryPath provided)
287
+ *
267
288
  * Uses the DB-derived hint as a minimum, but always respects filesystem state.
268
289
  */
269
- async resolveNextNumber(basePath, hint) {
270
- const specsDir = join(basePath, 'specs');
290
+ async resolveNextNumber(basePath, hint, repositoryPath) {
291
+ const dirsToScan = [join(basePath, 'specs'), join(basePath, '.shep', 'specs')];
292
+ if (repositoryPath) {
293
+ const repoHash = computeRepoHash(repositoryPath);
294
+ dirsToScan.push(join(getShepHomeDir(), 'repos', repoHash, 'specs'));
295
+ }
296
+ let maxExisting = 0;
297
+ for (const dir of dirsToScan) {
298
+ const max = await this.scanDirForMaxNumber(dir);
299
+ maxExisting = Math.max(maxExisting, max);
300
+ }
301
+ return Math.max(maxExisting + 1, hint);
302
+ }
303
+ /**
304
+ * Scan a single directory for NNN-* prefixed entries and return the max number found.
305
+ * Returns 0 if the directory does not exist or is empty.
306
+ */
307
+ async scanDirForMaxNumber(dirPath) {
271
308
  let entries;
272
309
  try {
273
- entries = await readdir(specsDir);
310
+ entries = await readdir(dirPath);
274
311
  }
275
312
  catch {
276
- // specs/ doesn't exist yet — use hint
277
- return hint;
313
+ return 0;
278
314
  }
279
- let maxExisting = 0;
315
+ let max = 0;
280
316
  for (const entry of entries) {
281
317
  const match = entry.match(/^(\d{3})-/);
282
318
  if (match) {
283
- maxExisting = Math.max(maxExisting, parseInt(match[1], 10));
319
+ max = Math.max(max, parseInt(match[1], 10));
284
320
  }
285
321
  }
286
- return Math.max(maxExisting + 1, hint);
322
+ return max;
287
323
  }
288
324
  }
@@ -42,7 +42,6 @@ import { createIdeOpenCommand } from './commands/ide-open.command.js';
42
42
  import { createInstallCommand } from './commands/install.command.js';
43
43
  import { createUpgradeCommand } from './commands/upgrade.command.js';
44
44
  import { createToolsCommand } from './commands/tools.command.js';
45
- import { createCoastsCommand } from './commands/coasts/index.js';
46
45
  import { messages } from './ui/index.js';
47
46
  // Daemon lifecycle commands
48
47
  import { createStartCommand } from './commands/start.command.js';
@@ -111,7 +110,6 @@ async function bootstrap() {
111
110
  program.addCommand(createInstallCommand());
112
111
  program.addCommand(createToolsCommand());
113
112
  program.addCommand(createUpgradeCommand());
114
- program.addCommand(createCoastsCommand());
115
113
  // Daemon lifecycle commands (task-9)
116
114
  program.addCommand(createStartCommand());
117
115
  program.addCommand(createStopCommand());
@@ -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":"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
  /**