@shepai/cli 1.138.0 → 1.139.0-pr446.9a4d670
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/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +41 -20
- package/dist/src/presentation/web/app/actions/deploy-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-feature.js +8 -0
- package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/deploy-repository.js +8 -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 +8 -6
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +2 -0
- 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 +61 -1
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +0 -10
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +273 -166
- package/dist/src/presentation/web/lib/is-same-shep-instance.d.ts +7 -0
- package/dist/src/presentation/web/lib/is-same-shep-instance.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/is-same-shep-instance.js +18 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -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 +28 -28
- 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 +28 -28
- 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 +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- 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 +36 -36
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- 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 +26 -26
- 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 +28 -28
- 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 +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- 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 +36 -36
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- 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 +26 -26
- 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 +26 -26
- 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.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/[root-of-the-server]__a402b567._.js +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]__2bdf88a0._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2bdf88a0._.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]__42faf5ae._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42faf5ae._.js.map +1 -0
- 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]__685ee565._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__685ee565._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__74756aae._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__74756aae._.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]__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/_02ec1aea._.js +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
- package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
- package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1c296899._.js → _362a65ec._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1c296899._.js.map → _362a65ec._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
- package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
- package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
- package/web/.next/server/chunks/ssr/_64bdfc6f._.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/_92a1e417._.js +3 -0
- package/web/.next/server/chunks/ssr/{_2119691d._.js.map → _92a1e417._.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/_b71645b4._.js +1 -1
- package/web/.next/server/chunks/ssr/_b71645b4._.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_8832f8a0._.js +3 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_844c9657._.js.map → src_presentation_web_8832f8a0._.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 +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 +44 -44
- package/web/.next/static/chunks/{c581e1010c5c217e.js → 1e4101146fba345a.js} +1 -1
- package/web/.next/static/chunks/{2e9491b73bcb5948.js → 2bc95df962e4ccb4.js} +1 -1
- package/web/.next/static/chunks/{4c760047d0972f96.js → 310de4832855feb0.js} +2 -2
- package/web/.next/static/chunks/{a2a9cfdc7ff45d62.js → 5241d86d18aea5a8.js} +1 -1
- package/web/.next/static/chunks/{6c097d096a289e07.js → 55a21a7f828091b4.js} +1 -1
- package/web/.next/static/chunks/656b8c7be54a9a62.js +1 -0
- package/web/.next/static/chunks/{f15f1f16948e7263.js → 784d4bcaebc16e66.js} +1 -1
- package/web/.next/static/chunks/{3722a9f53d9069d1.js → 7cddbd2eef52fb7d.js} +2 -2
- package/web/.next/static/chunks/{ec01c627aae92366.js → a083cbc927bb8708.js} +1 -1
- package/web/.next/static/chunks/ba967f7de77cd5ee.css +1 -0
- package/web/.next/static/chunks/{47ae402c9d3ad1ca.js → c4289472b20b5ca3.js} +1 -1
- package/web/.next/static/chunks/{ce8197531c98b4ea.js → dec195dca4c1ddc1.js} +1 -1
- package/web/.next/static/chunks/{ad74ee85368e7d04.js → e47d4364e6de6a3c.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2c703b78._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2c703b78._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__59a3897b._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__59a3897b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__78aecdd5._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__78aecdd5._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f222995d._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f222995d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_2119691d._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_844c9657._.js +0 -3
- package/web/.next/static/chunks/0e9ca746aadf6c8d.js +0 -1
- package/web/.next/static/chunks/eb35e98c31806836.css +0 -1
- /package/web/.next/static/{0zlf5ntHpnR5YfkgEsA-1 → mySbQkxwHdK9HUj3SJDSq}/_buildManifest.js +0 -0
- /package/web/.next/static/{0zlf5ntHpnR5YfkgEsA-1 → mySbQkxwHdK9HUj3SJDSq}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{0zlf5ntHpnR5YfkgEsA-1 → mySbQkxwHdK9HUj3SJDSq}/_ssgManifest.js +0 -0
package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployment.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/deployment.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,EAAmC,MAAM,oBAAoB,CAAC;AAK5E,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACT,MAAM,qEAAqE,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAiCzD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7D,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AA0CD,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,EAAE,CAAkC;gBAEhC,IAAI,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIrD;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIxC;;;;;;;;;;;;OAYG;IACH,UAAU,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"deployment.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/deployment.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,EAAmC,MAAM,oBAAoB,CAAC;AAK5E,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACT,MAAM,qEAAqE,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAiCzD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7D,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AA0CD,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,EAAE,CAAkC;gBAEhC,IAAI,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIrD;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAIxC;;;;;;;;;;;;OAYG;IACH,UAAU,IAAI,IAAI;IAqFlB;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,SAAe,GAAG,IAAI;IA6H5E;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IA4CpD;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0D3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAef;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI;IAM5C;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAM3D,OAAO,CAAC,QAAQ;IAuBhB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,MAAM;IAed,OAAO,CAAC,WAAW;IAQnB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;YA4Dd,aAAa;IAW3B,OAAO,CAAC,WAAW;IAUnB;;;;OAIG;YACW,kBAAkB;IAsChC;;;OAGG;IACH,OAAO,CAAC,SAAS;CAwBlB"}
|
|
@@ -99,6 +99,12 @@ export class DeploymentService {
|
|
|
99
99
|
recoverAll() {
|
|
100
100
|
if (!this.db)
|
|
101
101
|
return;
|
|
102
|
+
// Child dev servers spawned by DeploymentService share the same global DB.
|
|
103
|
+
// Skip recovery to avoid killing processes owned by the parent instance.
|
|
104
|
+
if (process.env.SHEP_SKIP_RECOVERY) {
|
|
105
|
+
log.info('SHEP_SKIP_RECOVERY set — skipping dev server recovery');
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
102
108
|
let rows;
|
|
103
109
|
try {
|
|
104
110
|
const stmt = this.db.prepare('SELECT * FROM dev_servers');
|
|
@@ -137,20 +143,16 @@ export class DeploymentService {
|
|
|
137
143
|
continue;
|
|
138
144
|
}
|
|
139
145
|
if (alive) {
|
|
140
|
-
// Strategy 2: Process alive but stuck in Booting —
|
|
141
|
-
//
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
// already dead
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
log.info(`Dev server "${row.target_id}" (pid=${row.pid}) is dead — will re-spawn`);
|
|
146
|
+
// Strategy 2: Process alive but stuck in Booting — leave it running.
|
|
147
|
+
// We can't re-attach stdout so we can't detect when it becomes Ready,
|
|
148
|
+
// but killing it would be destructive (another process on the same
|
|
149
|
+
// shared DB may have just spawned it). The user can restart manually.
|
|
150
|
+
log.info(`Orphan "${row.target_id}" (pid=${row.pid}) stuck in ${row.state} — leaving alive (cannot re-attach)`);
|
|
151
|
+
this.dbDelete(row.target_id);
|
|
152
|
+
continue;
|
|
152
153
|
}
|
|
153
|
-
// Strategy
|
|
154
|
+
// Strategy 3: Dead process — re-spawn if target directory still exists
|
|
155
|
+
log.info(`Dev server "${row.target_id}" (pid=${row.pid}) is dead — will re-spawn`);
|
|
154
156
|
this.dbDelete(row.target_id);
|
|
155
157
|
if (!existsSync(join(row.target_path, 'package.json'))) {
|
|
156
158
|
log.warn(`Skipping re-spawn for "${row.target_id}" — no package.json at "${row.target_path}"`);
|
|
@@ -215,6 +217,9 @@ export class DeploymentService {
|
|
|
215
217
|
// stdout/stderr — we don't need it because taskkill /F /T handles tree kill.
|
|
216
218
|
...(IS_WINDOWS ? { windowsHide: true } : { detached: true }),
|
|
217
219
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
220
|
+
// Prevent child shep instances (e.g. worktree dev servers) from running
|
|
221
|
+
// recoverAll() on the shared ~/.shep/data DB and killing our processes.
|
|
222
|
+
env: { ...process.env, SHEP_SKIP_RECOVERY: '1' },
|
|
218
223
|
});
|
|
219
224
|
if (!child.pid) {
|
|
220
225
|
log.error('spawn() returned no PID — process failed to start');
|
|
@@ -234,7 +239,10 @@ export class DeploymentService {
|
|
|
234
239
|
logs: new LogRingBuffer(),
|
|
235
240
|
};
|
|
236
241
|
this.deployments.set(targetId, entry);
|
|
237
|
-
|
|
242
|
+
// NOTE: Do NOT write to DB during Booting. The spawned process may be
|
|
243
|
+
// another shep instance sharing ~/.shep/data — its recoverAll() would
|
|
244
|
+
// find this Booting entry, see its own PID as alive, and SIGKILL itself.
|
|
245
|
+
// We persist to DB only when the state transitions to Ready (URL detected).
|
|
238
246
|
// Attach stdout/stderr listeners for port detection
|
|
239
247
|
this.attachOutputListener(entry, 'stdout');
|
|
240
248
|
this.attachOutputListener(entry, 'stderr');
|
|
@@ -245,12 +253,25 @@ export class DeploymentService {
|
|
|
245
253
|
this.deployments.delete(targetId);
|
|
246
254
|
this.dbDelete(targetId);
|
|
247
255
|
});
|
|
248
|
-
//
|
|
249
|
-
|
|
256
|
+
// Use 'close' instead of 'exit' — 'close' fires after stdio streams are
|
|
257
|
+
// fully consumed, so entry.logs will contain all captured output.
|
|
258
|
+
child.on('close', (code, signal) => {
|
|
250
259
|
const wasBooting = entry.state === DeploymentState.Booting;
|
|
251
|
-
log.info(`Process
|
|
260
|
+
log.info(`Process closed for "${targetId}" (pid=${entry.pid}) — code=${code}, signal=${signal}, wasBooting=${wasBooting}`);
|
|
252
261
|
if (wasBooting) {
|
|
253
|
-
log.warn(
|
|
262
|
+
log.warn(`Process exited while still in Booting state — dev server likely crashed on startup (code=${code}, signal=${signal}).`);
|
|
263
|
+
const allLogs = entry.logs.getAll();
|
|
264
|
+
const stdoutLines = allLogs.filter((l) => l.stream === 'stdout');
|
|
265
|
+
const stderrLines = allLogs.filter((l) => l.stream === 'stderr');
|
|
266
|
+
if (stdoutLines.length > 0) {
|
|
267
|
+
log.warn(`[${targetId}] stdout:\n${stdoutLines.map((l) => l.line).join('\n')}`);
|
|
268
|
+
}
|
|
269
|
+
if (stderrLines.length > 0) {
|
|
270
|
+
log.warn(`[${targetId}] stderr:\n${stderrLines.map((l) => l.line).join('\n')}`);
|
|
271
|
+
}
|
|
272
|
+
if (allLogs.length === 0) {
|
|
273
|
+
log.warn(`[${targetId}] No output captured from the process.`);
|
|
274
|
+
}
|
|
254
275
|
}
|
|
255
276
|
this.deployments.delete(targetId);
|
|
256
277
|
this.dbDelete(targetId);
|
|
@@ -485,7 +506,7 @@ export class DeploymentService {
|
|
|
485
506
|
log.info(`[${entry.targetId}] Port detected — url="${url}" (from ${stream})`);
|
|
486
507
|
entry.state = DeploymentState.Ready;
|
|
487
508
|
entry.url = url;
|
|
488
|
-
this.
|
|
509
|
+
this.dbUpsert(entry);
|
|
489
510
|
}
|
|
490
511
|
}
|
|
491
512
|
}
|
|
@@ -500,7 +521,7 @@ export class DeploymentService {
|
|
|
500
521
|
log.info(`[${entry.targetId}] Port detected in flushed buffer — url="${url}"`);
|
|
501
522
|
entry.state = DeploymentState.Ready;
|
|
502
523
|
entry.url = url;
|
|
503
|
-
this.
|
|
524
|
+
this.dbUpsert(entry);
|
|
504
525
|
}
|
|
505
526
|
}
|
|
506
527
|
entry[bufferKey] = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-feature.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-feature.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAKvE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAgDxE"}
|
|
@@ -4,6 +4,7 @@ import { resolve } from '../../lib/server-container.js';
|
|
|
4
4
|
import { createDeploymentLogger } from '../../../../../packages/core/src/infrastructure/services/deployment/deployment-logger.js';
|
|
5
5
|
import { computeWorktreePath } from '../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
|
|
6
6
|
import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
7
|
+
import { isSameShepInstance } from '../../lib/is-same-shep-instance.js';
|
|
7
8
|
const log = createDeploymentLogger('[deployFeature]');
|
|
8
9
|
export async function deployFeature(featureId) {
|
|
9
10
|
log.info(`called — featureId="${featureId}"`);
|
|
@@ -25,6 +26,13 @@ export async function deployFeature(featureId) {
|
|
|
25
26
|
log.warn(`worktree path does not exist on disk: "${worktreePath}"`);
|
|
26
27
|
return { success: false, error: `Worktree path does not exist: ${worktreePath}` };
|
|
27
28
|
}
|
|
29
|
+
if (isSameShepInstance(feature.repositoryPath)) {
|
|
30
|
+
log.warn('rejected — feature belongs to the running shep instance');
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
error: 'Cannot start a dev server for features of the repository Shep is running from',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
28
36
|
log.info('worktree path exists, calling deploymentService.start()');
|
|
29
37
|
const deploymentService = resolve('IDeploymentService');
|
|
30
38
|
deploymentService.start(featureId, worktreePath, 'feature');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-repository.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"deploy-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-repository.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAKvE,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAiCxE"}
|
|
@@ -4,6 +4,7 @@ import { isAbsolute } from 'node:path';
|
|
|
4
4
|
import { resolve } from '../../lib/server-container.js';
|
|
5
5
|
import { createDeploymentLogger } from '../../../../../packages/core/src/infrastructure/services/deployment/deployment-logger.js';
|
|
6
6
|
import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
7
|
+
import { isSameShepInstance } from '../../lib/is-same-shep-instance.js';
|
|
7
8
|
const log = createDeploymentLogger('[deployRepository]');
|
|
8
9
|
export async function deployRepository(repositoryPath) {
|
|
9
10
|
log.info(`called — repositoryPath="${repositoryPath}"`);
|
|
@@ -16,6 +17,13 @@ export async function deployRepository(repositoryPath) {
|
|
|
16
17
|
log.warn(`directory does not exist: "${repositoryPath}"`);
|
|
17
18
|
return { success: false, error: `Directory does not exist: ${repositoryPath}` };
|
|
18
19
|
}
|
|
20
|
+
if (isSameShepInstance(repositoryPath)) {
|
|
21
|
+
log.warn('rejected — target is the running shep instance');
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
error: 'Cannot start a dev server for the repository Shep is running from',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
19
27
|
log.info('directory exists, calling deploymentService.start()');
|
|
20
28
|
const deploymentService = resolve('IDeploymentService');
|
|
21
29
|
deploymentService.start(repositoryPath, repositoryPath, 'repository');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA4CnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAgcA"}
|
|
@@ -4,6 +4,7 @@ import { useState } from 'react';
|
|
|
4
4
|
import { Handle, Position } from '@xyflow/react';
|
|
5
5
|
import { Plus, Trash2, Zap, Loader2, Globe, RotateCcw, Play, Eye, Archive, ArchiveRestore, } from 'lucide-react';
|
|
6
6
|
import { cn } from '../../../lib/utils.js';
|
|
7
|
+
import { Button } from '../../ui/button.js';
|
|
7
8
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
|
|
8
9
|
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '../../ui/alert-dialog.js';
|
|
9
10
|
import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
|
|
@@ -75,7 +76,8 @@ export function FeatureNode({ data, selected, }) {
|
|
|
75
76
|
data.state !== 'archived' ? (_jsx(AlertDialog, { open: archiveConfirmOpen, onOpenChange: setArchiveConfirmOpen, children: _jsxs(AlertDialogContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Archive feature?" }), _jsxs(AlertDialogDescription, { children: [_jsx("strong", { children: data.name }), " will be hidden from the canvas. You can unarchive it later to restore it."] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { onClick: () => setArchiveConfirmOpen(false), children: "Cancel" }), _jsx(AlertDialogAction, { onClick: () => {
|
|
76
77
|
setArchiveConfirmOpen(false);
|
|
77
78
|
data.onArchive?.(data.featureId);
|
|
78
|
-
}, children: "Archive" })] })] }) })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm dark:bg-neutral-800/80', data.state === 'action-required' &&
|
|
79
|
+
}, children: "Archive" })] })] }) })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm dark:bg-neutral-800/80', data.state === 'action-required' &&
|
|
80
|
+
'border-l-[3px] border-l-rose-400 dark:border-l-amber-500', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60', data.state === 'archived' && 'opacity-50'), children: [data.state !== 'creating' ? (_jsx("div", { className: "absolute top-3 right-4", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { "data-testid": "feature-node-phase-badge", className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-[10px]", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("span", { className: cn('h-1.5 w-1.5 -translate-y-px rounded-full', lifecyclePhaseBadge[data.lifecycle].dot) })] }) }), _jsxs(TooltipContent, { side: "bottom", className: "max-w-56 bg-white text-neutral-900 shadow-lg dark:bg-neutral-100 dark:text-neutral-900 [&_svg]:!bg-white [&_svg]:!fill-white dark:[&_svg]:!bg-neutral-100 dark:[&_svg]:!fill-neutral-100", children: [_jsx("p", { className: "font-semibold", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("p", { className: "mt-1 text-xs leading-relaxed text-neutral-500", children: lifecyclePhaseBadge[data.lifecycle].description })] })] }) }) })) : null, _jsxs("div", { className: "flex items-center gap-1.5 pr-24", children: [data.agentType ? (_jsx(AgentIcon, { agentType: data.agentType, className: "h-4 w-4 shrink-0" })) : null, _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: data.name })] }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: data.description })) : null, _jsxs("div", { className: "mt-auto pt-2", children: [config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : null, !config.showProgressBar &&
|
|
79
81
|
![
|
|
80
82
|
'deleting',
|
|
81
83
|
'creating',
|
|
@@ -102,21 +104,21 @@ export function FeatureNode({ data, selected, }) {
|
|
|
102
104
|
? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
|
|
103
105
|
: 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3 w-3 text-green-600" })) }) }), _jsx(TooltipContent, { side: "top", children: data.deployment.status === DeploymentState.Booting
|
|
104
106
|
? 'Deploying...'
|
|
105
|
-
: (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'running' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs(
|
|
107
|
+
: (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'running' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs(Button, { variant: "default", size: "xs", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
|
|
106
108
|
// eslint-disable-next-line @typescript-eslint/no-empty-function -- click bubbles to card's onNodeClick
|
|
107
|
-
onClick: () => { }, className: "nodrag
|
|
109
|
+
onClick: () => { }, className: "nodrag dark:bg-primary dark:text-primary-foreground dark:hover:bg-primary/90 cursor-pointer bg-neutral-900 text-[11px] text-white hover:bg-neutral-800", children: [_jsx(Eye, { className: "h-3 w-3" }), getActionRequiredLabel(data)] })) : data.state === 'error' && data.onRetry ? (_jsxs(Button, { variant: "outline", size: "xs", "aria-label": "Retry", "data-testid": "feature-node-retry-button", onClick: (e) => {
|
|
108
110
|
e.stopPropagation();
|
|
109
111
|
data.onRetry(data.featureId);
|
|
110
|
-
}, className: "nodrag
|
|
112
|
+
}, className: "nodrag cursor-pointer text-[11px] font-medium", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), "Retry"] })) : data.state === 'blocked' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
|
|
111
113
|
const BadgeIcon = getBadgeIcon(data);
|
|
112
114
|
return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
|
|
113
115
|
})(), _jsx("span", { className: cn('truncate text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'done' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
|
|
114
116
|
const BadgeIcon = getBadgeIcon(data);
|
|
115
117
|
return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
|
|
116
|
-
})(), _jsx("span", { className: cn('text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'pending' && data.onStart ? (_jsxs(
|
|
118
|
+
})(), _jsx("span", { className: cn('text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'pending' && data.onStart ? (_jsxs(Button, { variant: "outline", size: "xs", "aria-label": "Start", "data-testid": "feature-node-start-button", onClick: (e) => {
|
|
117
119
|
e.stopPropagation();
|
|
118
120
|
data.onStart(data.featureId);
|
|
119
|
-
}, className: "nodrag
|
|
121
|
+
}, className: "nodrag cursor-pointer text-[11px] font-medium", children: [_jsx(Play, { className: "h-3 w-3" }), "Start"] })) : null] })] })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", style: { top: 70 }, children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
|
|
120
122
|
e.stopPropagation();
|
|
121
123
|
data.onAction?.();
|
|
122
124
|
}, className: "nodrag absolute top-1/2 left-1/2 flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-blue-500 text-white opacity-0 shadow-md transition-opacity group-hover:opacity-100 hover:bg-blue-600", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) })) : data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: false, className: "opacity-0!", style: { top: 70 } })) : null] }));
|
|
@@ -31,4 +31,6 @@ export declare const ArchivedWithUnarchive: Story;
|
|
|
31
31
|
export declare const DoneWithArchive: Story;
|
|
32
32
|
/** Shows the archive confirmation dialog in its open state. */
|
|
33
33
|
export declare const ArchiveConfirmationDialog: Story;
|
|
34
|
+
/** Side-by-side comparison of 10 highlight color options for action-required cards. */
|
|
35
|
+
export declare const HighlightColorExploration: Story;
|
|
34
36
|
//# sourceMappingURL=feature-node.stories.d.ts.map
|
package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAoCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAqB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AA+LF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAY5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAWnC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,yBAAyB,EAAE,KAyBvC,CAAC;AA0DF,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,EAAE,KAoCvC,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
3
|
import { expect, fn, userEvent, waitFor, within } from '@storybook/test';
|
|
4
4
|
import { ReactFlowProvider, ReactFlow, useNodesState } from '@xyflow/react';
|
|
5
|
+
import { Eye } from 'lucide-react';
|
|
5
6
|
import { DeploymentState, PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
6
7
|
import { FeatureNode } from './feature-node.js';
|
|
7
8
|
const nodeTypes = { featureNode: FeatureNode };
|
|
@@ -668,3 +669,62 @@ export const ArchiveConfirmationDialog = {
|
|
|
668
669
|
});
|
|
669
670
|
},
|
|
670
671
|
};
|
|
672
|
+
// ---------------------------------------------------------------------------
|
|
673
|
+
// Highlight color exploration — 10 candidate colors for action-required cards
|
|
674
|
+
// ---------------------------------------------------------------------------
|
|
675
|
+
const highlightColors = [
|
|
676
|
+
{
|
|
677
|
+
label: '1. Yellow (current)',
|
|
678
|
+
card: 'bg-[#fffef8]',
|
|
679
|
+
btn: 'bg-amber-50 text-amber-700 hover:bg-amber-100',
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
label: '2. Warm Peach',
|
|
683
|
+
card: 'bg-[#fff8f5]',
|
|
684
|
+
btn: 'bg-orange-50 text-orange-700 hover:bg-orange-100',
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
label: '3. Soft Rose',
|
|
688
|
+
card: 'bg-[#fff5f7]',
|
|
689
|
+
btn: 'bg-rose-50 text-rose-700 hover:bg-rose-100',
|
|
690
|
+
},
|
|
691
|
+
{
|
|
692
|
+
label: '4. Lavender',
|
|
693
|
+
card: 'bg-[#f8f5ff]',
|
|
694
|
+
btn: 'bg-violet-50 text-violet-700 hover:bg-violet-100',
|
|
695
|
+
},
|
|
696
|
+
{
|
|
697
|
+
label: '5. Ice Blue',
|
|
698
|
+
card: 'bg-[#f5f8ff]',
|
|
699
|
+
btn: 'bg-blue-50 text-blue-700 hover:bg-blue-100',
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
label: '6. Sky',
|
|
703
|
+
card: 'bg-[#f2f9ff]',
|
|
704
|
+
btn: 'bg-sky-50 text-sky-700 hover:bg-sky-100',
|
|
705
|
+
},
|
|
706
|
+
{
|
|
707
|
+
label: '7. Mint',
|
|
708
|
+
card: 'bg-[#f2fdf6]',
|
|
709
|
+
btn: 'bg-emerald-50 text-emerald-700 hover:bg-emerald-100',
|
|
710
|
+
},
|
|
711
|
+
{
|
|
712
|
+
label: '8. Teal',
|
|
713
|
+
card: 'bg-[#f0fdfa]',
|
|
714
|
+
btn: 'bg-teal-50 text-teal-700 hover:bg-teal-100',
|
|
715
|
+
},
|
|
716
|
+
{
|
|
717
|
+
label: '9. Neutral Warm',
|
|
718
|
+
card: 'bg-[#fdfcfa]',
|
|
719
|
+
btn: 'bg-stone-100 text-stone-700 hover:bg-stone-200',
|
|
720
|
+
},
|
|
721
|
+
{
|
|
722
|
+
label: '10. Pink',
|
|
723
|
+
card: 'bg-[#fef5ff]',
|
|
724
|
+
btn: 'bg-fuchsia-50 text-fuchsia-700 hover:bg-fuchsia-100',
|
|
725
|
+
},
|
|
726
|
+
];
|
|
727
|
+
/** Side-by-side comparison of 10 highlight color options for action-required cards. */
|
|
728
|
+
export const HighlightColorExploration = {
|
|
729
|
+
render: () => (_jsx("div", { className: "flex flex-wrap gap-6 p-4", children: highlightColors.map(({ label, card, btn }) => (_jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsxs("div", { className: `${card} flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm`, children: [_jsx("div", { className: "flex items-center gap-1.5", children: _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: "Rate Limiter" }) }), _jsx("p", { className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: "Sliding window \u2014 awaiting merge approval" }), _jsx("div", { className: "mt-auto pt-2", children: _jsxs("div", { className: "mt-1.5 flex min-h-[26px] items-center justify-between gap-2", children: [_jsx("div", { className: "flex items-center gap-1.5", style: { transform: 'translateY(1px)' }, children: _jsxs("div", { className: "flex items-baseline gap-1", children: [_jsx("span", { className: "text-muted-foreground/50 text-[10px]", children: "ID" }), _jsx("span", { className: "text-muted-foreground/60 font-mono text-[10px]", children: "3b5d7f" })] }) }), _jsxs("button", { className: `${btn} inline-flex shrink-0 items-center gap-1 rounded-md border-0 px-2 py-1 text-[11px] font-normal shadow-none`, children: [_jsx(Eye, { className: "h-3 w-3" }), "Review Changes"] })] }) })] })] }, label))) })),
|
|
730
|
+
};
|
package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts
CHANGED
|
@@ -5,16 +5,6 @@ export default meta;
|
|
|
5
5
|
type Story = StoryObj<typeof meta>;
|
|
6
6
|
export declare const Empty: Story;
|
|
7
7
|
export declare const WithFeatures: Story;
|
|
8
|
-
export declare const WithToolbar: Story;
|
|
9
|
-
export declare const WithNodeActions: Story;
|
|
10
|
-
/**
|
|
11
|
-
* Dagre auto-layout story — two repositories with interconnected feature trees.
|
|
12
|
-
*
|
|
13
|
-
* Demonstrates the Vertical / Horizontal toolbar buttons that re-layout the graph.
|
|
14
|
-
* Initial layout is LR (horizontal). Click "Vertical" to switch to TB, or
|
|
15
|
-
* "Horizontal" to switch back.
|
|
16
|
-
*/
|
|
17
|
-
export declare const DagreLayout: Story;
|
|
18
8
|
/**
|
|
19
9
|
* Canvas with active and archived features.
|
|
20
10
|
* The archive toggle button appears in the top-right corner ("Show archived").
|
package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAejD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAoBpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAyVnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAK1B,CAAC;AA4DF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KASlC,CAAC"}
|