@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.
- package/apis/json-schema/FeatureFlags.yaml +0 -5
- package/apis/json-schema/Repository.yaml +3 -0
- package/dist/packages/core/src/application/index.d.ts +1 -1
- package/dist/packages/core/src/application/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/index.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -2
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +21 -5
- package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +8 -2
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +0 -1
- package/dist/packages/core/src/domain/generated/output.d.ts +4 -4
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +0 -10
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +0 -2
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-spec-storage-mode.js +19 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +6 -2
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +2 -3
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts +4 -2
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +15 -8
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts +17 -0
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/filesystem/repo-hash.js +21 -0
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +2 -4
- package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +2 -4
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +17 -3
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.js +49 -13
- package/dist/src/presentation/cli/index.js +0 -2
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -9
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +0 -3
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +0 -3
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +0 -5
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +0 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +0 -1
- package/dist/src/presentation/web/dev-server.js +1 -62
- package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/feature-flags-context.js +0 -1
- package/dist/src/presentation/web/lib/feature-flags.d.ts +0 -2
- package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/feature-flags.js +0 -5
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -2
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +50 -80
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +50 -80
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +62 -92
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +62 -92
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +46 -76
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +50 -80
- package/web/.next/server/app/(dashboard)/create/page.js +2 -2
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +62 -92
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +62 -92
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +46 -76
- package/web/.next/server/app/(dashboard)/page.js +2 -2
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +46 -76
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_567de315._.js +2 -2
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__785e8499._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__785e8499._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b1670307._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b1670307._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d68f61dd._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d68f61dd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f4e193d3._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f4e193d3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
- package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_12282083._.js → _32961561._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_12282083._.js.map → _32961561._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_503680be._.js +3 -0
- package/web/.next/server/chunks/ssr/{_7bc4a733._.js.map → _503680be._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
- package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_e69a26ba._.js +4 -0
- package/web/.next/server/chunks/ssr/_e69a26ba._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_99db45e9._.js → src_presentation_web_06ffd221._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_99db45e9._.js.map → src_presentation_web_06ffd221._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js.map +1 -0
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +307 -463
- package/web/.next/static/chunks/{18616dda443b7ed1.js → 0b7fe2ac4f078f54.js} +7 -7
- package/web/.next/static/chunks/{ac7469534efcc3b0.js → 2bbb31a39a80d011.js} +1 -1
- package/web/.next/static/chunks/{fe54542759c9fd27.js → 5466ac7c8d7c6b2b.js} +1 -1
- package/web/.next/static/chunks/{acd8d06ded15d1ed.js → 6daf875725c43e2c.js} +2 -2
- package/web/.next/static/chunks/{dfe1ea2ffdc06c44.js → 796bb98fb3f35b71.js} +2 -2
- package/web/.next/static/chunks/{0d4f2f0257e78c06.css → 92cd6f523639a6fa.css} +1 -1
- package/web/.next/static/chunks/{dc8683ddff12ef38.js → 991f2fcba923f3ed.js} +1 -1
- package/web/.next/static/chunks/{12511f976fedf4cb.js → af4d1051b6fa73d5.js} +1 -1
- package/web/.next/static/chunks/{08d0fd276fa7ac89.js → c317cd6a6f76361d.js} +1 -1
- package/web/.next/static/chunks/{745234c95baaf6df.js → d0be9b22c3b9bce8.js} +1 -1
- package/web/.next/static/chunks/db862617e62ba1f9.js +1 -0
- package/web/.next/static/chunks/{cfcc46c87d712da6.js → e15904973d49ff89.js} +1 -1
- package/web/.next/static/chunks/{1f321d18af8d8b30.js → e6cff1dacc561fa0.js} +1 -1
- package/web/.next/static/chunks/{47d110d7472840fd.js → e8d49a8e1274cb49.js} +1 -1
- package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts +0 -132
- package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts.map +0 -1
- package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.js +0 -12
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts +0 -11
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.js +0 -17
- package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts +0 -42
- package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/coasts.service.js +0 -185
- package/dist/src/presentation/cli/commands/coasts/index.d.ts +0 -3
- package/dist/src/presentation/cli/commands/coasts/index.d.ts.map +0 -1
- package/dist/src/presentation/cli/commands/coasts/index.js +0 -7
- package/dist/src/presentation/cli/commands/coasts/init.command.d.ts +0 -3
- package/dist/src/presentation/cli/commands/coasts/init.command.d.ts.map +0 -1
- package/dist/src/presentation/cli/commands/coasts/init.command.js +0 -40
- package/dist/src/presentation/web/app/actions/check-coastfile.d.ts +0 -5
- package/dist/src/presentation/web/app/actions/check-coastfile.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/check-coastfile.js +0 -16
- package/dist/src/presentation/web/app/actions/generate-coastfile.d.ts +0 -7
- package/dist/src/presentation/web/app/actions/generate-coastfile.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/generate-coastfile.js +0 -22
- package/dist/src/presentation/web/coasts-dev-server.d.ts +0 -34
- package/dist/src/presentation/web/coasts-dev-server.d.ts.map +0 -1
- package/dist/src/presentation/web/coasts-dev-server.js +0 -69
- package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.d.ts +0 -12
- package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.js +0 -76
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cf9161b._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cf9161b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__71b5d4e8._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__71b5d4e8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__944b653f._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__944b653f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a9079247._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a9079247._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_01383b12._.js +0 -4
- package/web/.next/server/chunks/ssr/_01383b12._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_112b6fbf._.js +0 -6
- package/web/.next/server/chunks/ssr/_112b6fbf._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3b9ec2d7._.js +0 -4
- package/web/.next/server/chunks/ssr/_3b9ec2d7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_7a4bfe44._.js +0 -6
- package/web/.next/server/chunks/ssr/_7a4bfe44._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_7bc4a733._.js +0 -3
- package/web/.next/server/chunks/ssr/_7dd6c393._.js +0 -4
- package/web/.next/server/chunks/ssr/_7dd6c393._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_82cc1fcf._.js +0 -4
- package/web/.next/server/chunks/ssr/_82cc1fcf._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +0 -1
- package/web/.next/static/chunks/891d57985c5f3a0b.js +0 -1
- /package/web/.next/static/{YPdE95T5GezMRcw-C6nfC → xpAWvEAtoYdP3klvh5Yyo}/_buildManifest.js +0 -0
- /package/web/.next/static/{YPdE95T5GezMRcw-C6nfC → xpAWvEAtoYdP3klvh5Yyo}/_clientMiddlewareManifest.json +0 -0
- /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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
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 =
|
|
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.${
|
|
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": "${
|
|
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": "${
|
|
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**: ${
|
|
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;
|
|
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
|
-
|
|
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
|
}
|
package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
*
|
|
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
|
package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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 =
|
|
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
|
-
*
|
|
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
|
|
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(
|
|
310
|
+
entries = await readdir(dirPath);
|
|
274
311
|
}
|
|
275
312
|
catch {
|
|
276
|
-
|
|
277
|
-
return hint;
|
|
313
|
+
return 0;
|
|
278
314
|
}
|
|
279
|
-
let
|
|
315
|
+
let max = 0;
|
|
280
316
|
for (const entry of entries) {
|
|
281
317
|
const match = entry.match(/^(\d{3})-/);
|
|
282
318
|
if (match) {
|
|
283
|
-
|
|
319
|
+
max = Math.max(max, parseInt(match[1], 10));
|
|
284
320
|
}
|
|
285
321
|
}
|
|
286
|
-
return
|
|
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());
|
package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"
|
|
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,
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js
CHANGED
|
@@ -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,
|
|
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
|
};
|
package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map
CHANGED
|
@@ -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,
|
|
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',
|
package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
|
@@ -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:
|
|
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;
|
|
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"}
|