@shepai/cli 1.135.3 → 1.136.0-pr437.9f802f1
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 +5 -0
- package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts +132 -0
- package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/coasts-service.interface.js +12 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- 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 +1 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
- 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 +10 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
- 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 +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts +11 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-feature-flag-coasts-dev-server.js +17 -0
- 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 +3 -2
- package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts +42 -0
- package/dist/packages/core/src/infrastructure/services/coasts.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/coasts.service.js +185 -0
- package/dist/src/presentation/cli/commands/coasts/index.d.ts +3 -0
- package/dist/src/presentation/cli/commands/coasts/index.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/coasts/index.js +7 -0
- package/dist/src/presentation/cli/commands/coasts/init.command.d.ts +3 -0
- package/dist/src/presentation/cli/commands/coasts/init.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/coasts/init.command.js +40 -0
- package/dist/src/presentation/cli/index.js +2 -0
- package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts +2 -0
- package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/check-agent-auth.js +8 -1
- package/dist/src/presentation/web/app/actions/check-coastfile.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/check-coastfile.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/check-coastfile.js +16 -0
- package/dist/src/presentation/web/app/actions/check-tool-status.d.ts +14 -0
- package/dist/src/presentation/web/app/actions/check-tool-status.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/check-tool-status.js +53 -0
- package/dist/src/presentation/web/app/actions/generate-coastfile.d.ts +7 -0
- package/dist/src/presentation/web/app/actions/generate-coastfile.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/generate-coastfile.js +22 -0
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +1 -9
- package/dist/src/presentation/web/coasts-dev-server.d.ts +34 -0
- package/dist/src/presentation/web/coasts-dev-server.d.ts.map +1 -0
- package/dist/src/presentation/web/coasts-dev-server.js +69 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +17 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +91 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +54 -64
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +85 -19
- 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 +15 -6
- package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.d.ts +12 -0
- package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/repository-node/use-coasts-actions.js +76 -0
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +35 -9
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts +17 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.js +110 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +443 -10
- 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 +3 -0
- 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 +3 -0
- 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 +5 -0
- 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 +1 -0
- 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 +1 -0
- package/dist/src/presentation/web/dev-server.js +62 -1
- package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/feature-flags.js +5 -0
- package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -1
- 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 +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +93 -48
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
- 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 +93 -48
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
- 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 +105 -60
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
- 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 +105 -60
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
- 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 +89 -44
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
- 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 +93 -48
- package/web/.next/server/app/(dashboard)/create/page.js +3 -3
- 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 +105 -60
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
- 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 +105 -60
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
- 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 +89 -44
- package/web/.next/server/app/(dashboard)/page.js +3 -3
- 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 +89 -44
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
- 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.js.nft.json +1 -1
- 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.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 +1 -1
- 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 +1 -1
- 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.js.nft.json +1 -1
- 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_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/[root-of-the-server]__1cf9161b._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cf9161b._.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 +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__71b5d4e8._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__71b5d4e8._.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]__944b653f._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__944b653f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__96670392._.js → [root-of-the-server]__a5f9c6e5._.js} +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a9079247._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a9079247._.js.map +1 -0
- 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]__b3dbadca._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__7894f27f._.js.map → [root-of-the-server]__d48c5b11._.js.map} +1 -1
- 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/_01383b12._.js +4 -0
- package/web/.next/server/chunks/ssr/_01383b12._.js.map +1 -0
- 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/_112b6fbf._.js +6 -0
- package/web/.next/server/chunks/ssr/_112b6fbf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_d17bc20a._.js → _12282083._.js} +2 -2
- package/web/.next/server/chunks/ssr/_12282083._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_3b9ec2d7._.js +4 -0
- package/web/.next/server/chunks/ssr/_3b9ec2d7._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_7a4bfe44._.js +6 -0
- package/web/.next/server/chunks/ssr/_7a4bfe44._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_7bc4a733._.js +3 -0
- package/web/.next/server/chunks/ssr/_7bc4a733._.js.map +1 -0
- 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/_7dd6c393._.js +4 -0
- package/web/.next/server/chunks/ssr/_7dd6c393._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_82cc1fcf._.js +4 -0
- package/web/.next/server/chunks/ssr/_82cc1fcf._.js.map +1 -0
- 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/_a9f57758._.js.map +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/_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_127fb482._.js → src_presentation_web_99db45e9._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_127fb482._.js.map → src_presentation_web_99db45e9._.js.map} +1 -1
- 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_app_actions_open-ide_ts_baaca5d5._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.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/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +530 -296
- package/web/.next/static/chunks/{d5342f9be437afd9.js → 08d0fd276fa7ac89.js} +1 -1
- package/web/.next/static/chunks/0d4f2f0257e78c06.css +1 -0
- package/web/.next/static/chunks/{d8a0dd9bfd0f22fa.js → 12511f976fedf4cb.js} +1 -1
- package/web/.next/static/chunks/{0b7fe2ac4f078f54.js → 18616dda443b7ed1.js} +7 -7
- package/web/.next/static/chunks/1f321d18af8d8b30.js +1 -0
- package/web/.next/static/chunks/{1a9dfc34432387f5.js → 47d110d7472840fd.js} +1 -1
- package/web/.next/static/chunks/{7875a9370622a064.js → 745234c95baaf6df.js} +1 -1
- package/web/.next/static/chunks/891d57985c5f3a0b.js +1 -0
- package/web/.next/static/chunks/{61f7d4f0f0f770a4.js → ac7469534efcc3b0.js} +1 -1
- package/web/.next/static/chunks/{8c42b7752187f48c.js → acd8d06ded15d1ed.js} +2 -2
- package/web/.next/static/chunks/cfcc46c87d712da6.js +1 -0
- package/web/.next/static/chunks/d0dff217a94d4ee1.js +1 -0
- package/web/.next/static/chunks/{9154973d61eae190.js → dc8683ddff12ef38.js} +1 -1
- package/web/.next/static/chunks/{fdc719494dcd9c92.js → dfe1ea2ffdc06c44.js} +2 -2
- package/web/.next/static/chunks/fe54542759c9fd27.js +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__31bc28da._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__31bc28da._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__32ecbed9._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__32ecbed9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__90ce4b6d._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__90ce4b6d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__90f9ae71._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__90f9ae71._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_313c9690._.js +0 -3
- package/web/.next/server/chunks/ssr/_313c9690._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_b6960ca0._.js +0 -4
- package/web/.next/server/chunks/ssr/_b6960ca0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d17bc20a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +0 -1
- package/web/.next/static/chunks/15e6a74ef39fda73.js +0 -1
- package/web/.next/static/chunks/314b8314f77d6921.js +0 -1
- package/web/.next/static/chunks/3e2d7d07926b05bf.css +0 -1
- package/web/.next/static/chunks/55a1c86671bb1a5b.js +0 -1
- package/web/.next/static/chunks/c0c287da1631752f.js +0 -1
- package/web/.next/static/chunks/e6b87832e1382949.js +0 -1
- /package/web/.next/static/{p0KCxpQ0DqKcttVypdnix → YPdE95T5GezMRcw-C6nfC}/_buildManifest.js +0 -0
- /package/web/.next/static/{p0KCxpQ0DqKcttVypdnix → YPdE95T5GezMRcw-C6nfC}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{p0KCxpQ0DqKcttVypdnix → YPdE95T5GezMRcw-C6nfC}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coasts Service Implementation
|
|
3
|
+
*
|
|
4
|
+
* Infrastructure adapter wrapping the coast CLI binary for containerized
|
|
5
|
+
* runtime isolation. Uses constructor-injected ExecFunction for subprocess
|
|
6
|
+
* invocation and IStructuredAgentCaller for AI-powered Coastfile generation.
|
|
7
|
+
*
|
|
8
|
+
* Following Clean Architecture:
|
|
9
|
+
* - Implements the ICoastsService application port
|
|
10
|
+
* - Lives in the infrastructure layer
|
|
11
|
+
* - No direct child_process imports (injected via ExecFunction)
|
|
12
|
+
*/
|
|
13
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
14
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
15
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
17
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
18
|
+
};
|
|
19
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
21
|
+
};
|
|
22
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
23
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
24
|
+
};
|
|
25
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
26
|
+
import path from 'node:path';
|
|
27
|
+
import { injectable, inject } from 'tsyringe';
|
|
28
|
+
import { IS_WINDOWS } from '../platform.js';
|
|
29
|
+
/** Timeout for coast build (may need to pull Docker images). */
|
|
30
|
+
const BUILD_TIMEOUT_MS = 30_000;
|
|
31
|
+
/** Timeout for all other coast CLI commands. */
|
|
32
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
33
|
+
/** JSON schema for Coastfile generation via structured agent caller. */
|
|
34
|
+
const COASTFILE_SCHEMA = {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
content: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'The complete Coastfile content in TOML format',
|
|
40
|
+
},
|
|
41
|
+
warnings: {
|
|
42
|
+
type: 'array',
|
|
43
|
+
items: { type: 'string' },
|
|
44
|
+
description: 'Any warnings or notes about the generated Coastfile',
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
required: ['content'],
|
|
48
|
+
additionalProperties: false,
|
|
49
|
+
};
|
|
50
|
+
let CoastsService = class CoastsService {
|
|
51
|
+
execFile;
|
|
52
|
+
structuredCaller;
|
|
53
|
+
cachedInstallationPrompt = null;
|
|
54
|
+
isWindows;
|
|
55
|
+
constructor(execFile, structuredCaller, isWindows) {
|
|
56
|
+
this.execFile = execFile;
|
|
57
|
+
this.structuredCaller = structuredCaller;
|
|
58
|
+
this.isWindows = isWindows ?? IS_WINDOWS;
|
|
59
|
+
}
|
|
60
|
+
async checkPrerequisites(workDir) {
|
|
61
|
+
if (this.isWindows) {
|
|
62
|
+
return {
|
|
63
|
+
coastBinary: false,
|
|
64
|
+
docker: false,
|
|
65
|
+
coastdRunning: false,
|
|
66
|
+
allMet: false,
|
|
67
|
+
missingMessages: [
|
|
68
|
+
'Coasts dev server is not supported on Windows. See https://coasts.dev/docs for platform support.',
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const [coastResult, dockerResult, coastdResult] = await Promise.allSettled([
|
|
73
|
+
this.checkCoastBinary(),
|
|
74
|
+
this.checkDocker(),
|
|
75
|
+
this.checkCoastdRunning(workDir),
|
|
76
|
+
]);
|
|
77
|
+
const coastBinary = coastResult.status === 'fulfilled';
|
|
78
|
+
const docker = dockerResult.status === 'fulfilled';
|
|
79
|
+
const coastdRunning = coastdResult.status === 'fulfilled';
|
|
80
|
+
const missingMessages = [];
|
|
81
|
+
if (!coastBinary) {
|
|
82
|
+
missingMessages.push('coast binary not found on PATH. Install it with: curl -fsSL https://coasts.dev/install | sh. See https://coasts.dev/docs');
|
|
83
|
+
}
|
|
84
|
+
if (!docker) {
|
|
85
|
+
missingMessages.push('Docker daemon is not reachable. Start Docker Desktop or run: sudo systemctl start docker');
|
|
86
|
+
}
|
|
87
|
+
if (!coastdRunning) {
|
|
88
|
+
missingMessages.push('coastd daemon is not running. Start it with: coastd &. See https://coasts.dev/docs/daemon');
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
coastBinary,
|
|
92
|
+
docker,
|
|
93
|
+
coastdRunning,
|
|
94
|
+
allMet: coastBinary && docker && coastdRunning,
|
|
95
|
+
missingMessages,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async build(workDir) {
|
|
99
|
+
await this.execCoast(['build'], workDir, BUILD_TIMEOUT_MS);
|
|
100
|
+
}
|
|
101
|
+
async run(workDir) {
|
|
102
|
+
const { stdout } = await this.execCoast(['run'], workDir);
|
|
103
|
+
return this.parseCoastInstance(stdout);
|
|
104
|
+
}
|
|
105
|
+
async stop(workDir) {
|
|
106
|
+
try {
|
|
107
|
+
await this.execCoast(['stop'], workDir);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// No-op if no instance is running
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async lookup(workDir) {
|
|
114
|
+
try {
|
|
115
|
+
const { stdout } = await this.execCoast(['lookup'], workDir);
|
|
116
|
+
return this.parseCoastInstance(stdout);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async isRunning(workDir) {
|
|
123
|
+
const instance = await this.lookup(workDir);
|
|
124
|
+
return instance !== null;
|
|
125
|
+
}
|
|
126
|
+
async checkout(workDir) {
|
|
127
|
+
await this.execCoast(['checkout'], workDir);
|
|
128
|
+
}
|
|
129
|
+
async getInstallationPrompt() {
|
|
130
|
+
if (this.cachedInstallationPrompt !== null) {
|
|
131
|
+
return this.cachedInstallationPrompt;
|
|
132
|
+
}
|
|
133
|
+
const { stdout } = await this.execFile('coast', ['installation-prompt'], {
|
|
134
|
+
timeout: DEFAULT_TIMEOUT_MS,
|
|
135
|
+
});
|
|
136
|
+
this.cachedInstallationPrompt = stdout;
|
|
137
|
+
return stdout;
|
|
138
|
+
}
|
|
139
|
+
async generateCoastfile(workDir) {
|
|
140
|
+
const installationPrompt = await this.getInstallationPrompt();
|
|
141
|
+
const prompt = `${installationPrompt}\n\nAnalyze the project at the working directory and generate a Coastfile.\nReturn the complete Coastfile content as valid TOML in the "content" field.`;
|
|
142
|
+
const result = await this.structuredCaller.call(prompt, COASTFILE_SCHEMA, {
|
|
143
|
+
allowedTools: [],
|
|
144
|
+
silent: true,
|
|
145
|
+
maxTurns: 10,
|
|
146
|
+
});
|
|
147
|
+
const coastfilePath = path.join(workDir, 'Coastfile');
|
|
148
|
+
writeFileSync(coastfilePath, result.content, 'utf-8');
|
|
149
|
+
return coastfilePath;
|
|
150
|
+
}
|
|
151
|
+
async hasCoastfile(workDir) {
|
|
152
|
+
return existsSync(path.join(workDir, 'Coastfile'));
|
|
153
|
+
}
|
|
154
|
+
// --- Private helpers ---
|
|
155
|
+
async checkCoastBinary() {
|
|
156
|
+
await this.execFile('coast', ['--version'], { timeout: 500 });
|
|
157
|
+
}
|
|
158
|
+
async checkDocker() {
|
|
159
|
+
await this.execFile('docker', ['info'], { timeout: 500 });
|
|
160
|
+
}
|
|
161
|
+
async checkCoastdRunning(workDir) {
|
|
162
|
+
await this.execFile('coast', ['ls'], { cwd: workDir, timeout: 500 });
|
|
163
|
+
}
|
|
164
|
+
async execCoast(args, workDir, timeout = DEFAULT_TIMEOUT_MS) {
|
|
165
|
+
return this.execFile('coast', args, { cwd: workDir, timeout });
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Parse coast CLI output to extract port and URL from stdout.
|
|
169
|
+
* Looks for patterns like "port 3000" and "http://localhost:3000".
|
|
170
|
+
*/
|
|
171
|
+
parseCoastInstance(stdout) {
|
|
172
|
+
const portMatch = stdout.match(/port\s+(\d+)/i);
|
|
173
|
+
const urlMatch = stdout.match(/(https?:\/\/[^\s]+)/i);
|
|
174
|
+
const port = portMatch ? parseInt(portMatch[1], 10) : 3000;
|
|
175
|
+
const url = urlMatch ? urlMatch[1] : `http://localhost:${port}`;
|
|
176
|
+
return { port, url };
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
CoastsService = __decorate([
|
|
180
|
+
injectable(),
|
|
181
|
+
__param(0, inject('ExecFunction')),
|
|
182
|
+
__param(1, inject('IStructuredAgentCaller')),
|
|
183
|
+
__metadata("design:paramtypes", [Function, Object, Boolean])
|
|
184
|
+
], CoastsService);
|
|
185
|
+
export { CoastsService };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/coasts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,wBAAgB,mBAAmB,IAAI,OAAO,CAI7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/coasts/init.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,iBAAiB,IAAI,OAAO,CA0C3C"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
3
|
+
import { messages, spinner } from '../../ui/index.js';
|
|
4
|
+
export function createInitCommand() {
|
|
5
|
+
return new Command('init')
|
|
6
|
+
.description('Generate a Coastfile for the current repository')
|
|
7
|
+
.option('-f, --force', 'Overwrite existing Coastfile without prompting')
|
|
8
|
+
.action(async (options) => {
|
|
9
|
+
const workDir = process.cwd();
|
|
10
|
+
try {
|
|
11
|
+
const coastsService = container.resolve('ICoastsService');
|
|
12
|
+
// Check if Coastfile already exists
|
|
13
|
+
const exists = await coastsService.hasCoastfile(workDir);
|
|
14
|
+
if (exists && !options.force) {
|
|
15
|
+
messages.warning('Coastfile already exists. Use --force to regenerate.');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Check prerequisites
|
|
19
|
+
const prereqs = await coastsService.checkPrerequisites(workDir);
|
|
20
|
+
if (!prereqs.allMet) {
|
|
21
|
+
for (const msg of prereqs.missingMessages) {
|
|
22
|
+
messages.error(msg);
|
|
23
|
+
}
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Generate Coastfile
|
|
28
|
+
const coastfilePath = await spinner('Generating Coastfile via AI agent...', () => coastsService.generateCoastfile(workDir));
|
|
29
|
+
messages.success(`Coastfile generated at ${coastfilePath}`);
|
|
30
|
+
// Build container
|
|
31
|
+
await spinner('Building coast container...', () => coastsService.build(workDir));
|
|
32
|
+
messages.success('Coast container built successfully.');
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
36
|
+
messages.error('Failed to initialize Coasts', err);
|
|
37
|
+
process.exitCode = 1;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
@@ -42,6 +42,7 @@ 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';
|
|
45
46
|
import { messages } from './ui/index.js';
|
|
46
47
|
// Daemon lifecycle commands
|
|
47
48
|
import { createStartCommand } from './commands/start.command.js';
|
|
@@ -110,6 +111,7 @@ async function bootstrap() {
|
|
|
110
111
|
program.addCommand(createInstallCommand());
|
|
111
112
|
program.addCommand(createToolsCommand());
|
|
112
113
|
program.addCommand(createUpgradeCommand());
|
|
114
|
+
program.addCommand(createCoastsCommand());
|
|
113
115
|
// Daemon lifecycle commands (task-9)
|
|
114
116
|
program.addCommand(createStartCommand());
|
|
115
117
|
program.addCommand(createStopCommand());
|
|
@@ -8,6 +8,8 @@ export interface AgentAuthStatus {
|
|
|
8
8
|
label: string;
|
|
9
9
|
/** CLI binary name (e.g. "claude", "gemini") */
|
|
10
10
|
binaryName: string | null;
|
|
11
|
+
/** Shell command to install the tool (e.g. "npm install -g @anthropic-ai/claude-code") */
|
|
12
|
+
installCommand: string | null;
|
|
11
13
|
/** Instructions to authenticate if not authenticated */
|
|
12
14
|
authCommand: string | null;
|
|
13
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA6FD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0FAA0F;IAC1F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA6FD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAwF/D"}
|
|
@@ -114,6 +114,7 @@ export async function checkAgentAuth() {
|
|
|
114
114
|
authenticated: false,
|
|
115
115
|
label: 'Unknown',
|
|
116
116
|
binaryName: null,
|
|
117
|
+
installCommand: null,
|
|
117
118
|
authCommand: null,
|
|
118
119
|
};
|
|
119
120
|
}
|
|
@@ -128,16 +129,19 @@ export async function checkAgentAuth() {
|
|
|
128
129
|
authenticated: true,
|
|
129
130
|
label,
|
|
130
131
|
binaryName: null,
|
|
132
|
+
installCommand: null,
|
|
131
133
|
authCommand: null,
|
|
132
134
|
};
|
|
133
135
|
}
|
|
134
|
-
// Check if tool is installed
|
|
136
|
+
// Check if tool is installed (also grab install command from metadata)
|
|
135
137
|
let installed = false;
|
|
138
|
+
let installCommand = null;
|
|
136
139
|
try {
|
|
137
140
|
const useCase = resolve('ListToolsUseCase');
|
|
138
141
|
const tools = await useCase.execute();
|
|
139
142
|
const tool = tools.find((t) => t.id === toolId);
|
|
140
143
|
installed = tool?.status.status === 'available';
|
|
144
|
+
installCommand = tool?.installCommand ?? null;
|
|
141
145
|
}
|
|
142
146
|
catch {
|
|
143
147
|
installed = false;
|
|
@@ -149,6 +153,7 @@ export async function checkAgentAuth() {
|
|
|
149
153
|
authenticated: false,
|
|
150
154
|
label,
|
|
151
155
|
binaryName,
|
|
156
|
+
installCommand,
|
|
152
157
|
authCommand: binaryName ? `Install ${label} first` : null,
|
|
153
158
|
};
|
|
154
159
|
}
|
|
@@ -161,6 +166,7 @@ export async function checkAgentAuth() {
|
|
|
161
166
|
authenticated: false,
|
|
162
167
|
label,
|
|
163
168
|
binaryName,
|
|
169
|
+
installCommand,
|
|
164
170
|
authCommand: binaryName,
|
|
165
171
|
};
|
|
166
172
|
}
|
|
@@ -175,6 +181,7 @@ export async function checkAgentAuth() {
|
|
|
175
181
|
authenticated,
|
|
176
182
|
label,
|
|
177
183
|
binaryName,
|
|
184
|
+
installCommand,
|
|
178
185
|
authCommand: authenticated ? null : binaryName,
|
|
179
186
|
};
|
|
180
187
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-coastfile.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-coastfile.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAYhG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { resolve } from '../../lib/server-container.js';
|
|
4
|
+
export async function checkCoastfileAction(repositoryPath) {
|
|
5
|
+
if (!repositoryPath || !path.isAbsolute(repositoryPath)) {
|
|
6
|
+
return { exists: false };
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
const coastsService = resolve('ICoastsService');
|
|
10
|
+
const exists = await coastsService.hasCoastfile(repositoryPath);
|
|
11
|
+
return { exists };
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return { exists: false };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ToolStatusEntry {
|
|
2
|
+
installed: boolean;
|
|
3
|
+
version: string | null;
|
|
4
|
+
/** Platform-specific install command from tool JSON metadata */
|
|
5
|
+
installCommand: string | null;
|
|
6
|
+
/** Documentation/website URL */
|
|
7
|
+
installUrl: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface ToolStatusResult {
|
|
10
|
+
git: ToolStatusEntry;
|
|
11
|
+
gh: ToolStatusEntry;
|
|
12
|
+
}
|
|
13
|
+
export declare function checkToolStatus(): Promise<ToolStatusResult>;
|
|
14
|
+
//# sourceMappingURL=check-tool-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-tool-status.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-tool-status.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gEAAgE;IAChE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gCAAgC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,eAAe,CAAC;IACrB,EAAE,EAAE,eAAe,CAAC;CACrB;AAwBD,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA8BjE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { IS_WINDOWS } from '../../../../../packages/core/src/infrastructure/platform.js';
|
|
4
|
+
import { resolve } from '../../lib/server-container.js';
|
|
5
|
+
function getVersion(command, args) {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
try {
|
|
8
|
+
const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };
|
|
9
|
+
execFile(command, args, opts, (error, stdout) => {
|
|
10
|
+
if (error) {
|
|
11
|
+
resolve({ installed: false, version: null });
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// Extract version number from output like "git version 2.43.0" or "gh version 2.40.1"
|
|
15
|
+
const match = stdout.match(/(\d+\.\d+(?:\.\d+)?)/);
|
|
16
|
+
resolve({ installed: true, version: match?.[1] ?? null });
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
resolve({ installed: false, version: null });
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export async function checkToolStatus() {
|
|
25
|
+
// Run version checks and tool metadata lookup in parallel
|
|
26
|
+
const [gitVersion, ghVersion, tools] = await Promise.all([
|
|
27
|
+
getVersion('git', ['--version']),
|
|
28
|
+
getVersion('gh', ['--version']),
|
|
29
|
+
(async () => {
|
|
30
|
+
try {
|
|
31
|
+
const useCase = resolve('ListToolsUseCase');
|
|
32
|
+
return await useCase.execute();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
})(),
|
|
38
|
+
]);
|
|
39
|
+
const gitTool = tools.find((t) => t.id === 'git');
|
|
40
|
+
const ghTool = tools.find((t) => t.id === 'gh');
|
|
41
|
+
return {
|
|
42
|
+
git: {
|
|
43
|
+
...gitVersion,
|
|
44
|
+
installCommand: gitTool?.installCommand ?? null,
|
|
45
|
+
installUrl: gitTool?.website ?? 'https://git-scm.com',
|
|
46
|
+
},
|
|
47
|
+
gh: {
|
|
48
|
+
...ghVersion,
|
|
49
|
+
installCommand: ghTool?.installCommand ?? null,
|
|
50
|
+
installUrl: ghTool?.website ?? 'https://cli.github.com',
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface GenerateCoastfileResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
coastfilePath?: string;
|
|
4
|
+
error?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function generateCoastfileAction(repositoryPath: string): Promise<GenerateCoastfileResult>;
|
|
7
|
+
//# sourceMappingURL=generate-coastfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-coastfile.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/generate-coastfile.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,uBAAuB,CAC3C,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,uBAAuB,CAAC,CAkBlC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { resolve } from '../../lib/server-container.js';
|
|
5
|
+
export async function generateCoastfileAction(repositoryPath) {
|
|
6
|
+
if (!repositoryPath || !path.isAbsolute(repositoryPath)) {
|
|
7
|
+
return { success: false, error: 'repositoryPath must be an absolute path' };
|
|
8
|
+
}
|
|
9
|
+
if (!existsSync(repositoryPath)) {
|
|
10
|
+
return { success: false, error: `Directory does not exist: ${repositoryPath}` };
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const coastsService = resolve('ICoastsService');
|
|
14
|
+
const coastfilePath = await coastsService.generateCoastfile(repositoryPath);
|
|
15
|
+
await coastsService.build(repositoryPath);
|
|
16
|
+
return { success: true, coastfilePath };
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
const message = error instanceof Error ? error.message : 'Failed to generate Coastfile';
|
|
20
|
+
return { success: false, error: message };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,GAAG,CACf,MAAM,EACN;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CACzF,CAAC;IACF,0DAA0D;IAC1D,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC,CAAC;CACjE;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAoG5C"}
|
|
@@ -1,15 +1,7 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
|
-
import path from 'node:path';
|
|
3
1
|
import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
|
|
4
2
|
import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
|
|
5
3
|
import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
|
|
6
|
-
import {
|
|
7
|
-
/** Compute the worktree path for a feature, matching WorktreeService.getWorktreePath() */
|
|
8
|
-
function computeWorktreePath(repoPath, branch) {
|
|
9
|
-
const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
|
|
10
|
-
const slug = branch.replace(/\//g, '-');
|
|
11
|
-
return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
|
|
12
|
-
}
|
|
4
|
+
import { computeWorktreePath } from '../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
|
|
13
5
|
export function buildGraphNodes(repositories, featuresWithRuns, options) {
|
|
14
6
|
// Normalize path separators so Windows backslash paths match forward-slash paths
|
|
15
7
|
const normalizePath = (p) => p.replace(/\\/g, '/');
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coasts Dev Server Startup & Shutdown
|
|
3
|
+
*
|
|
4
|
+
* Extracted from dev-server.ts for testability. Provides the Coasts startup
|
|
5
|
+
* sequence (prerequisite checks, Coastfile existence check, build, run) and
|
|
6
|
+
* graceful shutdown logic.
|
|
7
|
+
*
|
|
8
|
+
* All log messages use [dev-server:coasts] prefix per NFR-10.
|
|
9
|
+
*/
|
|
10
|
+
import type { ICoastsService, CoastInstance } from '../../../packages/core/src/application/ports/output/services/coasts-service.interface.js';
|
|
11
|
+
/**
|
|
12
|
+
* Start the dev server in Coasts mode.
|
|
13
|
+
*
|
|
14
|
+
* Sequence:
|
|
15
|
+
* 1. Check prerequisites (coast binary, Docker, coastd daemon)
|
|
16
|
+
* 2. Check for Coastfile — fail if missing
|
|
17
|
+
* 3. Build the coast container image
|
|
18
|
+
* 4. Run the coast instance
|
|
19
|
+
*
|
|
20
|
+
* @param coastsService - Resolved ICoastsService from the DI container
|
|
21
|
+
* @param workDir - Working directory (repo/worktree root)
|
|
22
|
+
* @returns The running CoastInstance with port and URL
|
|
23
|
+
* @throws Error if prerequisites are not met or any step fails
|
|
24
|
+
*/
|
|
25
|
+
export declare function startCoastsDevServer(coastsService: ICoastsService, workDir: string): Promise<CoastInstance>;
|
|
26
|
+
/**
|
|
27
|
+
* Gracefully shut down the Coasts instance.
|
|
28
|
+
* Catches and logs errors to prevent shutdown failures.
|
|
29
|
+
*
|
|
30
|
+
* @param coastsService - The ICoastsService instance, or null if not in Coasts mode
|
|
31
|
+
* @param workDir - Working directory for the coast instance
|
|
32
|
+
*/
|
|
33
|
+
export declare function shutdownCoasts(coastsService: ICoastsService | null, workDir: string): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=coasts-dev-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coasts-dev-server.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/coasts-dev-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACd,MAAM,yEAAyE,CAAC;AAEjF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,cAAc,EAC7B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAiCxB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,cAAc,GAAG,IAAI,EACpC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coasts Dev Server Startup & Shutdown
|
|
3
|
+
*
|
|
4
|
+
* Extracted from dev-server.ts for testability. Provides the Coasts startup
|
|
5
|
+
* sequence (prerequisite checks, Coastfile existence check, build, run) and
|
|
6
|
+
* graceful shutdown logic.
|
|
7
|
+
*
|
|
8
|
+
* All log messages use [dev-server:coasts] prefix per NFR-10.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Start the dev server in Coasts mode.
|
|
12
|
+
*
|
|
13
|
+
* Sequence:
|
|
14
|
+
* 1. Check prerequisites (coast binary, Docker, coastd daemon)
|
|
15
|
+
* 2. Check for Coastfile — fail if missing
|
|
16
|
+
* 3. Build the coast container image
|
|
17
|
+
* 4. Run the coast instance
|
|
18
|
+
*
|
|
19
|
+
* @param coastsService - Resolved ICoastsService from the DI container
|
|
20
|
+
* @param workDir - Working directory (repo/worktree root)
|
|
21
|
+
* @returns The running CoastInstance with port and URL
|
|
22
|
+
* @throws Error if prerequisites are not met or any step fails
|
|
23
|
+
*/
|
|
24
|
+
export async function startCoastsDevServer(coastsService, workDir) {
|
|
25
|
+
// Step 1: Check prerequisites
|
|
26
|
+
console.log('[dev-server:coasts] Checking prerequisites...');
|
|
27
|
+
const prereqs = await coastsService.checkPrerequisites(workDir);
|
|
28
|
+
if (!prereqs.allMet) {
|
|
29
|
+
const messages = prereqs.missingMessages.map((m) => ` - ${m}`).join('\n');
|
|
30
|
+
throw new Error(`[dev-server:coasts] Prerequisites not met:\n${messages}`);
|
|
31
|
+
}
|
|
32
|
+
console.log('[dev-server:coasts] All prerequisites met.');
|
|
33
|
+
// Step 2: Check for Coastfile — fail if missing (generate on-demand via CLI or web UI)
|
|
34
|
+
const hasCoastfile = await coastsService.hasCoastfile(workDir);
|
|
35
|
+
if (!hasCoastfile) {
|
|
36
|
+
throw new Error(`[dev-server:coasts] No Coastfile found in ${workDir} (expected: Coastfile).\n` +
|
|
37
|
+
'Generate one with:\n' +
|
|
38
|
+
' - CLI: shep coasts init\n' +
|
|
39
|
+
' - Web UI: Use the "Generate Coastfile" button on the repository node');
|
|
40
|
+
}
|
|
41
|
+
// Step 3: Build the coast container image
|
|
42
|
+
console.log('[dev-server:coasts] Building coast container...');
|
|
43
|
+
await coastsService.build(workDir);
|
|
44
|
+
console.log('[dev-server:coasts] Build complete.');
|
|
45
|
+
// Step 4: Run the coast instance
|
|
46
|
+
console.log('[dev-server:coasts] Starting coast instance...');
|
|
47
|
+
const instance = await coastsService.run(workDir);
|
|
48
|
+
console.log(`[dev-server:coasts] Ready at ${instance.url}`);
|
|
49
|
+
return instance;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Gracefully shut down the Coasts instance.
|
|
53
|
+
* Catches and logs errors to prevent shutdown failures.
|
|
54
|
+
*
|
|
55
|
+
* @param coastsService - The ICoastsService instance, or null if not in Coasts mode
|
|
56
|
+
* @param workDir - Working directory for the coast instance
|
|
57
|
+
*/
|
|
58
|
+
export async function shutdownCoasts(coastsService, workDir) {
|
|
59
|
+
if (!coastsService)
|
|
60
|
+
return;
|
|
61
|
+
try {
|
|
62
|
+
console.log('[dev-server:coasts] Stopping coast instance...');
|
|
63
|
+
await coastsService.stop(workDir);
|
|
64
|
+
console.log('[dev-server:coasts] Coast instance stopped.');
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.warn('[dev-server:coasts] Failed to stop coast instance:', error);
|
|
68
|
+
}
|
|
69
|
+
}
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts
CHANGED
|
@@ -6,6 +6,23 @@ export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'don
|
|
|
6
6
|
export type FeatureLifecyclePhase = 'pending' | 'requirements' | 'research' | 'implementation' | 'review' | 'deploy' | 'maintain';
|
|
7
7
|
/** Human-readable display labels for lifecycle phases. */
|
|
8
8
|
export declare const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string>;
|
|
9
|
+
/** Left border color for each lifecycle phase. */
|
|
10
|
+
export declare const lifecycleBorderColors: Record<FeatureLifecyclePhase, string>;
|
|
11
|
+
/** Accent bar background color for each lifecycle phase. */
|
|
12
|
+
export declare const lifecycleAccentColors: Record<FeatureLifecyclePhase, string>;
|
|
13
|
+
/** Phase badge: short letter, color classes, and user-friendly tooltip. */
|
|
14
|
+
export declare const lifecyclePhaseBadge: Record<FeatureLifecyclePhase, {
|
|
15
|
+
letter: string;
|
|
16
|
+
bg: string;
|
|
17
|
+
text: string;
|
|
18
|
+
dot: string;
|
|
19
|
+
tooltip: string;
|
|
20
|
+
description: string;
|
|
21
|
+
}>;
|
|
22
|
+
/** State-based left border overrides (takes precedence over lifecycle). */
|
|
23
|
+
export declare const stateBorderColors: Partial<Record<FeatureNodeState, string>>;
|
|
24
|
+
/** State-based accent bar overrides (takes precedence over lifecycle). */
|
|
25
|
+
export declare const stateAccentColors: Partial<Record<FeatureNodeState, string>>;
|
|
9
26
|
/** Present-participle verbs for the running badge, keyed by lifecycle phase. */
|
|
10
27
|
export declare const lifecycleRunningVerbs: Record<FeatureLifecyclePhase, string>;
|
|
11
28
|
export interface FeatureNodeData {
|