@shepai/cli 1.113.0-pr360.fc6e148 → 1.113.0-pr361.ed7b589
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/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 +11 -1
- 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 +9 -5
- 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]__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]__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/{_ab801a12._.js → _6c52da30._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_ab801a12._.js.map → _6c52da30._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_565603fc._.js → _7a9d917c._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_565603fc._.js.map → _7a9d917c._.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/{_4603402d._.js → _e4b4dd4b._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_4603402d._.js.map → _e4b4dd4b._.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_de814675._.js +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/{c1c7f9c0c96fe817.js → 178be4a9b9d51b47.js} +1 -1
- package/web/.next/static/chunks/{12add0abaf2ac4b0.js → 592b616fd042c298.js} +1 -1
- package/web/.next/static/chunks/{bbd02ba529a180fc.js → 5b1d3da9be6ced0b.js} +1 -1
- package/web/.next/static/chunks/{ce5c6ad4a1ede904.js → 76af16a44b9b75d1.js} +1 -1
- package/web/.next/static/chunks/822bcf5757f9d8ba.js +2 -0
- package/web/.next/static/chunks/{88f3415275c2ad9e.js → 9895b21d8cef7b75.js} +1 -1
- package/web/.next/static/chunks/{2af84bd0c307253a.js → bfbac0d053d899eb.js} +1 -1
- package/web/.next/static/chunks/{d5ebfa672d2e9180.js → f1127f107f719d88.js} +1 -1
- package/web/.next/static/chunks/{70b74a1ae1d1b18f.js → f7ad04843e26ef97.js} +2 -2
- package/web/.next/static/chunks/{b76a19045750d072.js → fb03f61a98bc0c1d.js} +1 -1
- package/web/.next/static/chunks/2f552a88a5ff3a45.js +0 -2
- /package/web/.next/static/{3CXrO5C1NLxhLgWhUsMiI → zSQaq5pEt-ygslhi_OFVS}/_buildManifest.js +0 -0
- /package/web/.next/static/{3CXrO5C1NLxhLgWhUsMiI → zSQaq5pEt-ygslhi_OFVS}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{3CXrO5C1NLxhLgWhUsMiI → zSQaq5pEt-ygslhi_OFVS}/_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/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,2CAgVzF"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -25,7 +25,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
25
25
|
const { guardedNavigate } = useDrawerCloseGuard();
|
|
26
26
|
const { fitView } = useReactFlow();
|
|
27
27
|
const drawerTimerRef = useRef(null);
|
|
28
|
-
const { defaultViewport, onMoveEnd: handleViewportChange, resetViewport, } = useViewportPersistence();
|
|
28
|
+
const { defaultViewport, hasSavedViewport, onMoveEnd: handleViewportChange, resetViewport, } = useViewportPersistence();
|
|
29
29
|
const { nodes, edges, onNodesChange, handleConnect, handleAddRepository, handleDeleteFeature, handleRetryFeature, handleDeleteRepository, createFeatureNode, setCallbacks, } = useControlCenterState(initialNodes, initialEdges);
|
|
30
30
|
// Publish sidebar features to context whenever feature node data changes
|
|
31
31
|
const { setFeatures: setSidebarFeatures } = useSidebarFeaturesContext();
|
|
@@ -204,6 +204,16 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
204
204
|
handleRepositoryClick,
|
|
205
205
|
handleDeleteRepository,
|
|
206
206
|
]);
|
|
207
|
+
// Auto-center on initial load when there's no saved viewport and nodes exist.
|
|
208
|
+
// This ensures the first repo is visible instead of being stuck in the top-left corner.
|
|
209
|
+
const didInitialFitRef = useRef(false);
|
|
210
|
+
useEffect(() => {
|
|
211
|
+
if (didInitialFitRef.current || hasSavedViewport || nodes.length === 0)
|
|
212
|
+
return;
|
|
213
|
+
didInitialFitRef.current = true;
|
|
214
|
+
// Yield to React so nodes are rendered in the DOM before fitView calculates bounds.
|
|
215
|
+
setTimeout(() => fitView(AUTO_FOCUS_OPTIONS), 0);
|
|
216
|
+
}, [hasSavedViewport, nodes.length, fitView]);
|
|
207
217
|
const handleMoveEnd = useCallback((_event, viewport) => {
|
|
208
218
|
handleViewportChange(viewport);
|
|
209
219
|
}, [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,CAqCrE"}
|
|
@@ -20,16 +20,20 @@ function readViewport() {
|
|
|
20
20
|
try {
|
|
21
21
|
const raw = localStorage.getItem(STORAGE_KEY);
|
|
22
22
|
if (raw == null)
|
|
23
|
-
return DEFAULT_VIEWPORT;
|
|
23
|
+
return { viewport: DEFAULT_VIEWPORT, fromStorage: false };
|
|
24
24
|
const parsed = JSON.parse(raw);
|
|
25
|
-
|
|
25
|
+
if (isValidViewport(parsed))
|
|
26
|
+
return { viewport: parsed, fromStorage: true };
|
|
27
|
+
return { viewport: DEFAULT_VIEWPORT, fromStorage: false };
|
|
26
28
|
}
|
|
27
29
|
catch {
|
|
28
|
-
return DEFAULT_VIEWPORT;
|
|
30
|
+
return { viewport: DEFAULT_VIEWPORT, fromStorage: false };
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
export function useViewportPersistence() {
|
|
32
|
-
const
|
|
34
|
+
const stored = useRef(readViewport()).current;
|
|
35
|
+
const defaultViewport = stored.viewport;
|
|
36
|
+
const hasSavedViewport = stored.fromStorage;
|
|
33
37
|
const timerRef = useRef(null);
|
|
34
38
|
useEffect(() => {
|
|
35
39
|
return () => {
|
|
@@ -60,5 +64,5 @@ export function useViewportPersistence() {
|
|
|
60
64
|
}
|
|
61
65
|
return DEFAULT_VIEWPORT;
|
|
62
66
|
}, []);
|
|
63
|
-
return { defaultViewport, onMoveEnd, resetViewport };
|
|
67
|
+
return { defaultViewport, hasSavedViewport, onMoveEnd, resetViewport };
|
|
64
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-with-dagre.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/layout-with-dagre.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AAkCF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,IAAI,EAC5C,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,GAAE,aAAkB,GACvB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"layout-with-dagre.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/layout-with-dagre.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB,EAAE,aAIpC,CAAC;AAkCF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,IAAI,EAC5C,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,GAAE,aAAkB,GACvB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CA8L/B"}
|
|
@@ -78,6 +78,10 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
|
|
|
78
78
|
// Add disconnected nodes to centerMap so they participate in root positioning.
|
|
79
79
|
// Use the same primary-axis position as connected roots (rank 0) so they align
|
|
80
80
|
// visually with repos that have features attached.
|
|
81
|
+
// When there are NO connected nodes (e.g. repos with no features), use half the
|
|
82
|
+
// node's own dimension so the leading edge sits at the canvas origin — preventing
|
|
83
|
+
// nodes from rendering off-screen with the default viewport.
|
|
84
|
+
const hasCenterMap = centerMap.size > 0;
|
|
81
85
|
let rootPrimaryAxis = 0;
|
|
82
86
|
for (const c of centerMap.values()) {
|
|
83
87
|
rootPrimaryAxis = isHorizontal ? c.cx : c.cy;
|
|
@@ -85,9 +89,14 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
|
|
|
85
89
|
}
|
|
86
90
|
for (const node of disconnectedNodes) {
|
|
87
91
|
const size = getNodeSize(node, nodeSize);
|
|
92
|
+
const primaryAxisCenter = hasCenterMap
|
|
93
|
+
? rootPrimaryAxis
|
|
94
|
+
: isHorizontal
|
|
95
|
+
? size.width / 2
|
|
96
|
+
: size.height / 2;
|
|
88
97
|
centerMap.set(node.id, {
|
|
89
|
-
cx: isHorizontal ?
|
|
90
|
-
cy: isHorizontal ? 0 :
|
|
98
|
+
cx: isHorizontal ? primaryAxisCenter : 0,
|
|
99
|
+
cy: isHorizontal ? 0 : primaryAxisCenter,
|
|
91
100
|
w: size.width,
|
|
92
101
|
h: size.height,
|
|
93
102
|
});
|