@shepai/cli 1.114.0-pr360.d483d29 → 1.114.0-pr361.c9914c5
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/tool-installer/tool-installer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +3 -10
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +6 -11
- package/dist/src/presentation/cli/commands/install.command.js +1 -8
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -0
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +6 -1
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +6 -1
- package/dist/src/presentation/web/app/actions/get-feature-drawer-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/get-feature-drawer-data.js +4 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts +4 -0
- package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +5 -0
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts +7 -1
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +9 -12
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +17 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +69 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +14 -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/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +28 -7
- package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +2 -0
- package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-viewport-persistence.js +19 -6
- package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/layout-with-dagre.js +11 -2
- 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 +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
- 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 +26 -26
- 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 +26 -26
- 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 +18 -18
- 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 +20 -20
- 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 +26 -26
- 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 +26 -26
- 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 +18 -18
- 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 +18 -18
- 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 +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- 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 +6 -6
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- 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/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- 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]__c16bf5de._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_43770eb2._.js → _174489cc._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_43770eb2._.js.map → _174489cc._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_48c829f1._.js → _5f564526._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_48c829f1._.js.map → _5f564526._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_f3c59b1f._.js → _605157e5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_f3c59b1f._.js.map → _605157e5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.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__next-internal_server_app_(dashboard)_page_actions_888633e1.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- 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_ce7cbc3c._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.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 +31 -31
- package/web/.next/static/chunks/{cf1fbc1964ad0a7b.js → 04de201e125688be.js} +1 -1
- package/web/.next/static/chunks/{c3cad609d7f01af9.js → 1b9cd00f0260dc94.js} +2 -2
- package/web/.next/static/chunks/{e13524c537ba83f4.js → 285373584362256a.js} +1 -1
- package/web/.next/static/chunks/{3eb1e79b22bf051a.js → 4ae58f388ee0a927.js} +1 -1
- package/web/.next/static/chunks/{421c707530b44f35.js → 4ec746230535814b.js} +1 -1
- package/web/.next/static/chunks/{09a74264e5ed304f.js → 9b8df96f693d7509.js} +1 -1
- package/web/.next/static/chunks/{b6d8a6171c303fec.js → ca316d69021e3799.js} +2 -2
- package/web/.next/static/chunks/{9638ec87d5c2c118.js → d36f7fcbbd2bc9e5.js} +1 -1
- package/web/.next/static/chunks/{33ccbc18b3e012a9.js → d5a710e0c22e97f7.js} +1 -1
- package/web/.next/static/chunks/{300cd5f76cc1144a.js → f4a43c0fecb47dbd.js} +1 -1
- /package/web/.next/static/{TjpT2DsAHrsnldHKzuinM → qW3bkLKlrX8uFT2umfH8C}/_buildManifest.js +0 -0
- /package/web/.next/static/{TjpT2DsAHrsnldHKzuinM → qW3bkLKlrX8uFT2umfH8C}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{TjpT2DsAHrsnldHKzuinM → qW3bkLKlrX8uFT2umfH8C}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AA2B7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AA2B7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAgFlC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js
CHANGED
|
@@ -107,14 +107,9 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
|
|
|
107
107
|
}
|
|
108
108
|
return new Promise((resolve) => {
|
|
109
109
|
let output = '';
|
|
110
|
-
// Inherit stdin when running in an interactive terminal so that commands
|
|
111
|
-
// requiring sudo can prompt the user for a password. In non-interactive
|
|
112
|
-
// contexts (web UI, CI) stdin is piped and closed immediately to prevent
|
|
113
|
-
// the process from hanging waiting for input.
|
|
114
|
-
const isInteractive = process.stdin.isTTY === true;
|
|
115
110
|
const child = spawn(installCommand.command, [], {
|
|
116
111
|
shell: true,
|
|
117
|
-
stdio: [
|
|
112
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
118
113
|
env: {
|
|
119
114
|
...process.env,
|
|
120
115
|
DEBIAN_FRONTEND: 'noninteractive',
|
|
@@ -122,10 +117,8 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
|
|
|
122
117
|
GPG_TTY: '',
|
|
123
118
|
},
|
|
124
119
|
});
|
|
125
|
-
// Close stdin
|
|
126
|
-
|
|
127
|
-
child.stdin?.end();
|
|
128
|
-
}
|
|
120
|
+
// Close stdin immediately to prevent interactive prompts
|
|
121
|
+
child.stdin?.end();
|
|
129
122
|
// Stream output from stdout and stderr
|
|
130
123
|
const pipeOutput = (stream) => {
|
|
131
124
|
if (!stream)
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json
CHANGED
|
@@ -8,21 +8,17 @@
|
|
|
8
8
|
"platforms": ["linux", "darwin", "win32"],
|
|
9
9
|
"iconUrl": "https://cdn.simpleicons.org/claude",
|
|
10
10
|
"binary": "claude",
|
|
11
|
-
"packageManager": "
|
|
11
|
+
"packageManager": "curl",
|
|
12
12
|
"commands": {
|
|
13
|
-
"linux": "
|
|
14
|
-
"darwin": "
|
|
13
|
+
"linux": "curl -fsSL https://claude.ai/install.sh | bash",
|
|
14
|
+
"darwin": "curl -fsSL https://claude.ai/install.sh | bash",
|
|
15
15
|
"win32": "npm install -g @anthropic-ai/claude-code"
|
|
16
16
|
},
|
|
17
17
|
"timeout": 300000,
|
|
18
|
-
"documentationUrl": "https://
|
|
18
|
+
"documentationUrl": "https://code.claude.com/docs/en/overview",
|
|
19
19
|
"verifyCommand": "claude --version",
|
|
20
20
|
"autoInstall": true,
|
|
21
|
-
"openDirectory": {
|
|
22
|
-
"linux": "cd {dir} && exec claude",
|
|
23
|
-
"darwin": "cd {dir} && exec claude",
|
|
24
|
-
"win32": "cd /d {dir} && claude"
|
|
25
|
-
},
|
|
21
|
+
"openDirectory": "cd {dir} && exec claude",
|
|
26
22
|
"spawnOptions": {
|
|
27
23
|
"shell": true,
|
|
28
24
|
"stdio": "inherit",
|
|
@@ -30,7 +26,6 @@
|
|
|
30
26
|
},
|
|
31
27
|
"terminalCommand": {
|
|
32
28
|
"linux": "x-terminal-emulator -e bash -c 'cd {dir} && exec claude'",
|
|
33
|
-
"darwin": "
|
|
34
|
-
"win32": "start cmd /k \"cd /d {dir} && claude\""
|
|
29
|
+
"darwin": "open -a Terminal.app bash -c 'cd {dir} && exec claude'"
|
|
35
30
|
}
|
|
36
31
|
}
|
|
@@ -117,14 +117,7 @@ function printInstallInstructions(metadata) {
|
|
|
117
117
|
// Print open directory command if available
|
|
118
118
|
if (metadata.openDirectory) {
|
|
119
119
|
console.log(fmt.heading('Open Directory'));
|
|
120
|
-
|
|
121
|
-
console.log(`${colors.muted('$')} ${metadata.openDirectory}`);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
for (const [platform, cmd] of Object.entries(metadata.openDirectory)) {
|
|
125
|
-
console.log(`${colors.muted(`[${platform}]`)} ${cmd}`);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
120
|
+
console.log(`${colors.muted('$')} ${metadata.openDirectory}`);
|
|
128
121
|
console.log();
|
|
129
122
|
}
|
|
130
123
|
// Print documentation link
|
package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"AAcA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,yBAAyB;IACjC,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,wBAA8B,oBAAoB,CAAC,EAAE,MAAM,EAAE,EAAE,yBAAyB,2DAiDvF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { resolve } from '../../../../../../lib/server-container.js';
|
|
3
3
|
import { buildFeatureNodeData } from '../../../../../build-feature-node-data.js';
|
|
4
|
+
import { getSettings } from '../../../../../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
4
5
|
import { computeDrawerView, parseTabKey, } from '../../../../../../components/common/control-center-drawer/drawer-view.js';
|
|
5
6
|
import { FeatureDrawerClient } from '../../../../../../components/common/control-center-drawer/feature-drawer-client.js';
|
|
6
7
|
/** Skip static pre-rendering since we need runtime DI container. */
|
|
@@ -24,11 +25,14 @@ export default async function FeatureDrawerTabPage({ params }) {
|
|
|
24
25
|
getArtifact.execute(featureId).catch(() => null),
|
|
25
26
|
gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
|
|
26
27
|
]);
|
|
28
|
+
const { workflow } = getSettings();
|
|
27
29
|
const nodeData = buildFeatureNodeData(feature, run, {
|
|
28
30
|
repositoryName: repo?.name,
|
|
29
31
|
baseBranch,
|
|
30
32
|
oneLiner: artifact?.oneLiner,
|
|
31
33
|
remoteUrl: remoteUrl ?? undefined,
|
|
34
|
+
enableEvidence: workflow.enableEvidence,
|
|
35
|
+
commitEvidence: workflow.commitEvidence,
|
|
32
36
|
});
|
|
33
37
|
const view = computeDrawerView({
|
|
34
38
|
selectedNode: nodeData,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"AAQA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,wBAA8B,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,2DAuCjF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { resolve } from '../../../../../lib/server-container.js';
|
|
3
3
|
import { buildFeatureNodeData } from '../../../../build-feature-node-data.js';
|
|
4
|
+
import { getSettings } from '../../../../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
4
5
|
import { computeDrawerView } from '../../../../../components/common/control-center-drawer/drawer-view.js';
|
|
5
6
|
import { FeatureDrawerClient } from '../../../../../components/common/control-center-drawer/feature-drawer-client.js';
|
|
6
7
|
/** Skip static pre-rendering since we need runtime DI container. */
|
|
@@ -18,7 +19,11 @@ export default async function FeatureDrawerPage({ params }) {
|
|
|
18
19
|
if (!feature)
|
|
19
20
|
return null;
|
|
20
21
|
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
21
|
-
const
|
|
22
|
+
const { workflow } = getSettings();
|
|
23
|
+
const nodeData = buildFeatureNodeData(feature, run, {
|
|
24
|
+
enableEvidence: workflow.enableEvidence,
|
|
25
|
+
commitEvidence: workflow.commitEvidence,
|
|
26
|
+
});
|
|
22
27
|
const view = computeDrawerView({
|
|
23
28
|
selectedNode: nodeData,
|
|
24
29
|
isCreateDrawerOpen: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAQ1C,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CAsFxF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { resolve } from '../../lib/server-container.js';
|
|
2
2
|
import { CiStatus } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
3
|
+
import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
3
4
|
import { layoutWithDagre, CANVAS_LAYOUT_DEFAULTS } from '../../lib/layout-with-dagre.js';
|
|
4
5
|
import { buildGraphNodes } from '../build-graph-nodes.js';
|
|
5
6
|
const CI_STATUS_MAP = {
|
|
@@ -53,7 +54,11 @@ export async function getGraphData() {
|
|
|
53
54
|
const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
|
|
54
55
|
return { feature, run };
|
|
55
56
|
}));
|
|
56
|
-
const {
|
|
57
|
+
const { workflow } = getSettings();
|
|
58
|
+
const { nodes, edges } = buildGraphNodes(repositories, featuresWithRuns, {
|
|
59
|
+
enableEvidence: workflow.enableEvidence,
|
|
60
|
+
commitEvidence: workflow.commitEvidence,
|
|
61
|
+
});
|
|
57
62
|
// Enrich feature nodes with deployment status
|
|
58
63
|
let deploymentService = null;
|
|
59
64
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-feature-drawer-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-drawer-data.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-feature-drawer-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-drawer-data.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAoC7F"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use server';
|
|
2
2
|
import { resolve } from '../../lib/server-container.js';
|
|
3
3
|
import { buildFeatureNodeData } from '../build-feature-node-data.js';
|
|
4
|
+
import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
4
5
|
/**
|
|
5
6
|
* Fetches full FeatureNodeData for a given feature ID.
|
|
6
7
|
* Used by the drawer for targeted data syncing without triggering
|
|
@@ -29,11 +30,14 @@ export async function getFeatureDrawerData(featureId) {
|
|
|
29
30
|
getArtifact.execute(featureId).catch(() => null),
|
|
30
31
|
gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
|
|
31
32
|
]);
|
|
33
|
+
const { workflow } = getSettings();
|
|
32
34
|
return buildFeatureNodeData(feature, run, {
|
|
33
35
|
repositoryName: repo?.name,
|
|
34
36
|
baseBranch,
|
|
35
37
|
oneLiner: artifact?.oneLiner,
|
|
36
38
|
remoteUrl: remoteUrl ?? undefined,
|
|
39
|
+
enableEvidence: workflow.enableEvidence,
|
|
40
|
+
commitEvidence: workflow.commitEvidence,
|
|
37
41
|
});
|
|
38
42
|
}
|
|
39
43
|
catch {
|
|
@@ -7,6 +7,10 @@ export interface BuildFeatureNodeDataOptions {
|
|
|
7
7
|
oneLiner?: string;
|
|
8
8
|
/** Remote URL for the repository (HTTPS) */
|
|
9
9
|
remoteUrl?: string;
|
|
10
|
+
/** Whether evidence collection is enabled (global workflow setting) */
|
|
11
|
+
enableEvidence?: boolean;
|
|
12
|
+
/** Whether evidence is committed to the PR body (global workflow setting) */
|
|
13
|
+
commitEvidence?: boolean;
|
|
10
14
|
}
|
|
11
15
|
/**
|
|
12
16
|
* Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAQ9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CA+CjB"}
|
|
@@ -23,6 +23,11 @@ export function buildFeatureNodeData(feature, run, options) {
|
|
|
23
23
|
userQuery: feature.userQuery,
|
|
24
24
|
createdAt: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
|
|
25
25
|
...(feature.fast && { fastMode: true }),
|
|
26
|
+
approvalGates: feature.approvalGates,
|
|
27
|
+
push: feature.push,
|
|
28
|
+
openPr: feature.openPr,
|
|
29
|
+
...(options?.enableEvidence != null && { enableEvidence: options.enableEvidence }),
|
|
30
|
+
...(options?.commitEvidence != null && { commitEvidence: options.commitEvidence }),
|
|
26
31
|
...(options?.repositoryName && { repositoryName: options.repositoryName }),
|
|
27
32
|
...(options?.baseBranch && { baseBranch: options.baseBranch }),
|
|
28
33
|
...(options?.oneLiner && { oneLiner: options.oneLiner }),
|
|
@@ -13,7 +13,13 @@ export interface FeatureWithRun {
|
|
|
13
13
|
* (id: `virtual-repo-${repositoryPath}`). This ensures the dashboard never
|
|
14
14
|
* renders empty when features exist but their repository rows are missing.
|
|
15
15
|
*/
|
|
16
|
-
export
|
|
16
|
+
export interface BuildGraphNodesOptions {
|
|
17
|
+
/** Whether evidence collection is enabled (global workflow setting) */
|
|
18
|
+
enableEvidence?: boolean;
|
|
19
|
+
/** Whether evidence is committed to the PR body (global workflow setting) */
|
|
20
|
+
commitEvidence?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function buildGraphNodes(repositories: Repository[], featuresWithRuns: FeatureWithRun[], options?: BuildGraphNodesOptions): {
|
|
17
23
|
nodes: CanvasNodeType[];
|
|
18
24
|
edges: Edge[];
|
|
19
25
|
};
|
|
@@ -1 +1 @@
|
|
|
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;AAQ1F,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,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,
|
|
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;AAQ1F,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;CAC1B;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,CA2F5C"}
|
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
|
|
2
2
|
import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
|
|
3
3
|
import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
|
|
4
|
-
|
|
5
|
-
* Builds React Flow nodes and edges from persisted repositories and features.
|
|
6
|
-
*
|
|
7
|
-
* Features whose repositoryPath is not covered by any real repository row are
|
|
8
|
-
* grouped under a synthetic "virtual" repository node
|
|
9
|
-
* (id: `virtual-repo-${repositoryPath}`). This ensures the dashboard never
|
|
10
|
-
* renders empty when features exist but their repository rows are missing.
|
|
11
|
-
*/
|
|
12
|
-
export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
4
|
+
export function buildGraphNodes(repositories, featuresWithRuns, options) {
|
|
13
5
|
// Normalize path separators so Windows backslash paths match forward-slash paths
|
|
14
6
|
const normalizePath = (p) => p.replace(/\\/g, '/');
|
|
15
7
|
// Group features by normalized repository path
|
|
@@ -42,7 +34,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
42
34
|
},
|
|
43
35
|
});
|
|
44
36
|
const repoFeatures = featuresByRepo[normalizedRepoPath] ?? [];
|
|
45
|
-
appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges, repo.name);
|
|
37
|
+
appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges, repo.name, options);
|
|
46
38
|
}
|
|
47
39
|
// Second pass: group orphaned features under virtual repository nodes
|
|
48
40
|
for (const [repoPath, orphanFeatures] of Object.entries(featuresByRepo)) {
|
|
@@ -56,7 +48,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
56
48
|
position: { x: 0, y: 0 },
|
|
57
49
|
data: { name: repoName, repositoryPath: repoPath },
|
|
58
50
|
});
|
|
59
|
-
appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges, repoName);
|
|
51
|
+
appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges, repoName, options);
|
|
60
52
|
}
|
|
61
53
|
// Add parent→child dependency edges
|
|
62
54
|
for (const { feature } of featuresWithRuns) {
|
|
@@ -75,7 +67,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
|
|
|
75
67
|
}
|
|
76
68
|
return { nodes, edges };
|
|
77
69
|
}
|
|
78
|
-
function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges, repoName) {
|
|
70
|
+
function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges, repoName, options) {
|
|
79
71
|
// Sort by createdAt so newest features appear last (bottom) in the layout
|
|
80
72
|
const sorted = [...repoFeatures].sort((a, b) => {
|
|
81
73
|
const aTime = a.feature.createdAt instanceof Date
|
|
@@ -112,6 +104,11 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
|
|
|
112
104
|
userQuery: feature.userQuery,
|
|
113
105
|
createdAt: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
|
|
114
106
|
...(feature.fast && { fastMode: true }),
|
|
107
|
+
approvalGates: feature.approvalGates,
|
|
108
|
+
push: feature.push,
|
|
109
|
+
openPr: feature.openPr,
|
|
110
|
+
...(options?.enableEvidence != null && { enableEvidence: options.enableEvidence }),
|
|
111
|
+
...(options?.commitEvidence != null && { commitEvidence: options.commitEvidence }),
|
|
115
112
|
...(repoName && { repositoryName: repoName }),
|
|
116
113
|
...(run?.agentType && { agentType: run.agentType }),
|
|
117
114
|
...(run?.modelId && { modelId: run.modelId }),
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAqDrD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect, useRef } from 'react';
|
|
4
|
-
import { AlertTriangle, ExternalLink, GitBranch, GitCommitHorizontal, RotateCcw, Zap, } from 'lucide-react';
|
|
4
|
+
import { AlertTriangle, Check, ExternalLink, FileSearch, GitBranch, GitCommitHorizontal, RotateCcw, ShieldCheck, X, Zap, } from 'lucide-react';
|
|
5
5
|
import { InlineAttachments } from '../../common/inline-attachments/index.js';
|
|
6
6
|
import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
7
7
|
import { cn } from '../../../lib/utils.js';
|
|
@@ -11,10 +11,11 @@ import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
|
|
|
11
11
|
import { CometSpinner } from '../../ui/comet-spinner.js';
|
|
12
12
|
import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
|
|
13
13
|
import { getAgentTypeIcon, agentTypeLabels, } from '../../common/feature-node/agent-type-icons.js';
|
|
14
|
+
import { getModelMeta } from '../../../lib/model-metadata.js';
|
|
14
15
|
import { formatDuration } from '../../../lib/format-duration.js';
|
|
15
16
|
export function OverviewTab({ data }) {
|
|
16
17
|
const isCompleted = data.lifecycle === 'maintain';
|
|
17
|
-
return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data })] }));
|
|
18
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data }), _jsx(FeatureSettings, { data: data })] }));
|
|
18
19
|
}
|
|
19
20
|
function FeatureStateBadge({ data }) {
|
|
20
21
|
const config = featureNodeStateConfig[data.state];
|
|
@@ -108,6 +109,20 @@ function AgentDetailRow({ agentType }) {
|
|
|
108
109
|
const label = agentTypeLabels[agentType] ?? agentType;
|
|
109
110
|
return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Agent" }), _jsxs("span", { className: "flex items-center gap-2 text-sm", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), label] })] }));
|
|
110
111
|
}
|
|
112
|
+
// ── Settings section ─────────────────────────────────────────────────
|
|
113
|
+
function SettingBadge({ enabled, label }) {
|
|
114
|
+
return (_jsxs("span", { className: cn('inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium', enabled ? 'bg-emerald-50 text-emerald-700' : 'bg-muted text-muted-foreground'), children: [enabled ? _jsx(Check, { className: "h-3 w-3" }) : _jsx(X, { className: "h-3 w-3" }), label] }));
|
|
115
|
+
}
|
|
116
|
+
function FeatureSettings({ data }) {
|
|
117
|
+
const hasSettings = data.approvalGates != null ||
|
|
118
|
+
data.push != null ||
|
|
119
|
+
data.openPr != null ||
|
|
120
|
+
data.enableEvidence != null ||
|
|
121
|
+
data.modelId;
|
|
122
|
+
if (!hasSettings)
|
|
123
|
+
return null;
|
|
124
|
+
return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-settings", className: "flex flex-col gap-3 p-4", children: [_jsx("span", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "SETTINGS" }), data.modelId ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Model" }), _jsx("span", { className: "text-sm", children: getModelMeta(data.modelId).displayName || data.modelId })] })) : null, data.approvalGates ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(ShieldCheck, { className: "h-3 w-3" }), "Auto-Approve"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsx(SettingBadge, { enabled: data.approvalGates.allowPrd, label: "PRD" }), _jsx(SettingBadge, { enabled: data.approvalGates.allowPlan, label: "Plan" }), _jsx(SettingBadge, { enabled: data.approvalGates.allowMerge, label: "Merge" })] })] })) : null, data.enableEvidence != null ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(FileSearch, { className: "h-3 w-3" }), "Evidence"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsx(SettingBadge, { enabled: data.enableEvidence, label: "Collect" }), data.commitEvidence != null ? (_jsx(SettingBadge, { enabled: data.commitEvidence, label: "Add to PR" })) : null] })] })) : null, data.push != null || data.openPr != null ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(GitBranch, { className: "h-3 w-3" }), "Git"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [data.push != null ? _jsx(SettingBadge, { enabled: data.push, label: "Push" }) : null, data.openPr != null ? _jsx(SettingBadge, { enabled: data.openPr, label: "PR" }) : null] })] })) : null] })] }));
|
|
125
|
+
}
|
|
111
126
|
function DetailRow({ label, value }) {
|
|
112
127
|
return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-sm", children: value })] }));
|
|
113
128
|
}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts
CHANGED
|
@@ -37,4 +37,14 @@ export declare const DuplicateSummaryHidden: Story;
|
|
|
37
37
|
export declare const DifferentSummary: Story;
|
|
38
38
|
/** Completed feature with PR — progress hidden, PR shown in status section without borders. */
|
|
39
39
|
export declare const CompletedWithPr: Story;
|
|
40
|
+
/** Feature with all settings visible — approval gates, evidence, git, and model. */
|
|
41
|
+
export declare const WithAllSettings: Story;
|
|
42
|
+
/** Feature with no auto-approve gates enabled. */
|
|
43
|
+
export declare const WithSettingsAllDisabled: Story;
|
|
44
|
+
/** Feature with all auto-approve gates enabled. */
|
|
45
|
+
export declare const WithSettingsAllApproved: Story;
|
|
46
|
+
/** Feature with settings and fast mode. */
|
|
47
|
+
export declare const FastModeWithSettings: Story;
|
|
48
|
+
/** Feature with evidence enabled but commit to PR disabled. */
|
|
49
|
+
export declare const EvidenceCollectOnly: Story;
|
|
40
50
|
//# sourceMappingURL=overview-tab.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC"}
|
|
1
|
+
{"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC;AAMF,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,KAY7B,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,EAAE,KAQjC,CAAC"}
|
package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js
CHANGED
|
@@ -252,3 +252,72 @@ export const CompletedWithPr = {
|
|
|
252
252
|
},
|
|
253
253
|
},
|
|
254
254
|
};
|
|
255
|
+
/* ---------------------------------------------------------------------------
|
|
256
|
+
* Settings section stories
|
|
257
|
+
* ------------------------------------------------------------------------- */
|
|
258
|
+
/** Feature with all settings visible — approval gates, evidence, git, and model. */
|
|
259
|
+
export const WithAllSettings = {
|
|
260
|
+
args: {
|
|
261
|
+
data: {
|
|
262
|
+
...noPrData,
|
|
263
|
+
modelId: 'claude-sonnet-4-6',
|
|
264
|
+
approvalGates: { allowPrd: true, allowPlan: true, allowMerge: false },
|
|
265
|
+
enableEvidence: true,
|
|
266
|
+
commitEvidence: true,
|
|
267
|
+
push: true,
|
|
268
|
+
openPr: true,
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
/** Feature with no auto-approve gates enabled. */
|
|
273
|
+
export const WithSettingsAllDisabled = {
|
|
274
|
+
args: {
|
|
275
|
+
data: {
|
|
276
|
+
...noPrData,
|
|
277
|
+
modelId: 'gemini-2.5-pro',
|
|
278
|
+
approvalGates: { allowPrd: false, allowPlan: false, allowMerge: false },
|
|
279
|
+
enableEvidence: false,
|
|
280
|
+
commitEvidence: false,
|
|
281
|
+
push: false,
|
|
282
|
+
openPr: false,
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
/** Feature with all auto-approve gates enabled. */
|
|
287
|
+
export const WithSettingsAllApproved = {
|
|
288
|
+
args: {
|
|
289
|
+
data: {
|
|
290
|
+
...noPrData,
|
|
291
|
+
modelId: 'claude-opus-4-6',
|
|
292
|
+
approvalGates: { allowPrd: true, allowPlan: true, allowMerge: true },
|
|
293
|
+
enableEvidence: true,
|
|
294
|
+
commitEvidence: true,
|
|
295
|
+
push: true,
|
|
296
|
+
openPr: true,
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
/** Feature with settings and fast mode. */
|
|
301
|
+
export const FastModeWithSettings = {
|
|
302
|
+
args: {
|
|
303
|
+
data: {
|
|
304
|
+
...fastModeData,
|
|
305
|
+
modelId: 'claude-sonnet-4-6',
|
|
306
|
+
approvalGates: { allowPrd: false, allowPlan: false, allowMerge: true },
|
|
307
|
+
enableEvidence: true,
|
|
308
|
+
commitEvidence: false,
|
|
309
|
+
push: true,
|
|
310
|
+
openPr: true,
|
|
311
|
+
},
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
/** Feature with evidence enabled but commit to PR disabled. */
|
|
315
|
+
export const EvidenceCollectOnly = {
|
|
316
|
+
args: {
|
|
317
|
+
data: {
|
|
318
|
+
...noPrData,
|
|
319
|
+
enableEvidence: true,
|
|
320
|
+
commitEvidence: false,
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
};
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts
CHANGED
|
@@ -59,6 +59,20 @@ export interface FeatureNodeData {
|
|
|
59
59
|
commitHash?: string;
|
|
60
60
|
mergeable?: boolean;
|
|
61
61
|
};
|
|
62
|
+
/** Approval gates configuration for phase transitions */
|
|
63
|
+
approvalGates?: {
|
|
64
|
+
allowPrd: boolean;
|
|
65
|
+
allowPlan: boolean;
|
|
66
|
+
allowMerge: boolean;
|
|
67
|
+
};
|
|
68
|
+
/** Whether to push branch to remote after implementation */
|
|
69
|
+
push?: boolean;
|
|
70
|
+
/** Whether to open a PR after implementation */
|
|
71
|
+
openPr?: boolean;
|
|
72
|
+
/** Whether evidence collection is enabled for this feature */
|
|
73
|
+
enableEvidence?: boolean;
|
|
74
|
+
/** Whether evidence is committed to the PR body */
|
|
75
|
+
commitEvidence?: boolean;
|
|
62
76
|
/** Whether the feature has plan data available */
|
|
63
77
|
hasPlan?: boolean;
|
|
64
78
|
/** Deployment status for features with an active deployment */
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CA4VzF"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -124,16 +124,22 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
124
124
|
const handler = (e) => {
|
|
125
125
|
const path = e.detail.path;
|
|
126
126
|
const { wasEmpty, repoPath } = handleAddRepository(path);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
127
|
+
// Always center the viewport on the new repo, ignoring any stored
|
|
128
|
+
// pan/zoom position. This guarantees the repo is visible after adding
|
|
129
|
+
// — even if the user previously panned far away or deleted everything.
|
|
130
|
+
resetViewport();
|
|
131
|
+
// Use a short delay to allow React to flush the state update and
|
|
132
|
+
// the showCanvas latch to transition, ensuring ReactFlow has the
|
|
133
|
+
// new nodes rendered before fitView calculates bounds.
|
|
134
|
+
requestAnimationFrame(() => {
|
|
135
|
+
fitView(AUTO_FOCUS_OPTIONS);
|
|
136
|
+
if (wasEmpty) {
|
|
131
137
|
// Open the create-feature drawer after the fitView animation completes
|
|
132
138
|
drawerTimerRef.current = setTimeout(() => {
|
|
133
139
|
guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));
|
|
134
140
|
}, AUTO_FOCUS_DRAWER_DELAY_MS);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
137
143
|
};
|
|
138
144
|
window.addEventListener('shep:add-repository', handler);
|
|
139
145
|
return () => {
|
|
@@ -142,7 +148,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
142
148
|
clearTimeout(drawerTimerRef.current);
|
|
143
149
|
}
|
|
144
150
|
};
|
|
145
|
-
}, [handleAddRepository, fitView, guardedNavigate, router]);
|
|
151
|
+
}, [handleAddRepository, fitView, guardedNavigate, router, resetViewport]);
|
|
146
152
|
// Listen for create events from the create drawer (with real feature ID from server)
|
|
147
153
|
useEffect(() => {
|
|
148
154
|
const handler = (e) => {
|
|
@@ -204,6 +210,21 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
204
210
|
handleRepositoryClick,
|
|
205
211
|
handleDeleteRepository,
|
|
206
212
|
]);
|
|
213
|
+
// Auto-center whenever the canvas transitions from empty to having nodes.
|
|
214
|
+
// This covers both initial page load AND re-adding repos after deleting
|
|
215
|
+
// everything — the view always centers so the repo is visible, ignoring
|
|
216
|
+
// any previously stored pan/zoom position.
|
|
217
|
+
const hadNodesRef = useRef(nodes.length > 0);
|
|
218
|
+
useEffect(() => {
|
|
219
|
+
const hasNodes = nodes.length > 0;
|
|
220
|
+
if (hasNodes && !hadNodesRef.current) {
|
|
221
|
+
// Went from empty → has nodes — center the view
|
|
222
|
+
resetViewport();
|
|
223
|
+
// Yield to React so nodes are rendered in the DOM before fitView calculates bounds.
|
|
224
|
+
setTimeout(() => fitView(AUTO_FOCUS_OPTIONS), 0);
|
|
225
|
+
}
|
|
226
|
+
hadNodesRef.current = hasNodes;
|
|
227
|
+
}, [nodes.length, fitView, resetViewport]);
|
|
207
228
|
const handleMoveEnd = useCallback((_event, viewport) => {
|
|
208
229
|
handleViewportChange(viewport);
|
|
209
230
|
}, [handleViewportChange]);
|
|
@@ -5,6 +5,8 @@ export declare const DEBOUNCE_MS = 500;
|
|
|
5
5
|
export declare const DEFAULT_VIEWPORT: Viewport;
|
|
6
6
|
export interface UseViewportPersistenceResult {
|
|
7
7
|
defaultViewport: Viewport;
|
|
8
|
+
/** True when a valid viewport was restored from localStorage. */
|
|
9
|
+
hasSavedViewport: boolean;
|
|
8
10
|
onMoveEnd: (viewport: Viewport) => void;
|
|
9
11
|
resetViewport: () => Viewport;
|
|
10
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-viewport-persistence.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-viewport-persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAClD,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B,eAAO,MAAM,gBAAgB,EAAE,QAAuC,CAAC;AAEvE,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,QAAQ,CAAC;IAC1B,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,MAAM,QAAQ,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"use-viewport-persistence.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-viewport-persistence.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAClD,eAAO,MAAM,WAAW,MAAM,CAAC;AAE/B,eAAO,MAAM,gBAAgB,EAAE,QAAuC,CAAC;AAEvE,MAAM,WAAW,4BAA4B;IAC3C,eAAe,EAAE,QAAQ,CAAC;IAC1B,iEAAiE;IACjE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,MAAM,QAAQ,CAAC;CAC/B;AA8BD,wBAAgB,sBAAsB,IAAI,4BAA4B,CA8CrE"}
|