@shepai/cli 1.114.0-pr361.c9914c5 → 1.115.0

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.
Files changed (138) hide show
  1. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  2. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +7 -28
  3. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +0 -2
  4. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -1
  5. package/dist/src/presentation/web/hooks/use-viewport-persistence.js +6 -19
  6. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
  7. package/dist/src/presentation/web/lib/layout-with-dagre.js +2 -11
  8. package/dist/tsconfig.build.tsbuildinfo +1 -1
  9. package/package.json +1 -1
  10. package/web/.next/BUILD_ID +1 -1
  11. package/web/.next/build-manifest.json +2 -2
  12. package/web/.next/fallback-build-manifest.json +2 -2
  13. package/web/.next/prerender-manifest.json +3 -3
  14. package/web/.next/required-server-files.js +2 -2
  15. package/web/.next/required-server-files.json +2 -2
  16. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
  17. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  18. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  20. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  21. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +26 -26
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  25. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  26. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
  29. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  30. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  31. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  32. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  33. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  34. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +26 -26
  35. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  36. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
  38. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  41. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/_global-error.html +2 -2
  44. package/web/.next/server/app/_global-error.rsc +1 -1
  45. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  46. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  47. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  48. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  49. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  50. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  51. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  53. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  54. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  56. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  58. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  59. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  60. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  62. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  63. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  64. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  65. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  66. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +1 -1
  67. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
  68. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
  69. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
  70. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  76. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
  77. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  90. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  91. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  92. package/web/.next/server/chunks/ssr/{_605157e5._.js → _7d4c400f._.js} +2 -2
  93. package/web/.next/server/chunks/ssr/{_605157e5._.js.map → _7d4c400f._.js.map} +1 -1
  94. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  95. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  97. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/{_174489cc._.js → _d6fedbbf._.js} +2 -2
  99. package/web/.next/server/chunks/ssr/{_174489cc._.js.map → _d6fedbbf._.js.map} +1 -1
  100. package/web/.next/server/chunks/ssr/{_5f564526._.js → _f166a7ed._.js} +2 -2
  101. package/web/.next/server/chunks/ssr/{_5f564526._.js.map → _f166a7ed._.js.map} +1 -1
  102. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  103. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +1 -1
  105. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  107. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  109. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  111. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +2 -2
  113. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +2 -2
  121. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js.map +1 -1
  122. package/web/.next/server/pages/500.html +2 -2
  123. package/web/.next/server/server-reference-manifest.js +1 -1
  124. package/web/.next/server/server-reference-manifest.json +31 -31
  125. package/web/.next/static/chunks/{d36f7fcbbd2bc9e5.js → 08c3f6e304e8d7b4.js} +1 -1
  126. package/web/.next/static/chunks/{d5a710e0c22e97f7.js → 29a45df76aba845e.js} +1 -1
  127. package/web/.next/static/chunks/{04de201e125688be.js → 36e2bf6ac6e90282.js} +1 -1
  128. package/web/.next/static/chunks/{4ec746230535814b.js → 36ff38fd6b9d647d.js} +1 -1
  129. package/web/.next/static/chunks/{1b9cd00f0260dc94.js → b6d30842eaeb3166.js} +2 -2
  130. package/web/.next/static/chunks/{9b8df96f693d7509.js → c50772767c14f013.js} +1 -1
  131. package/web/.next/static/chunks/{4ae58f388ee0a927.js → c62c393c5d0912b7.js} +1 -1
  132. package/web/.next/static/chunks/{285373584362256a.js → d4350f1fe1625279.js} +1 -1
  133. package/web/.next/static/chunks/{f4a43c0fecb47dbd.js → d4bebfde2bed6130.js} +1 -1
  134. package/web/.next/static/chunks/ea784857fcad9e04.js +2 -0
  135. package/web/.next/static/chunks/ca316d69021e3799.js +0 -2
  136. /package/web/.next/static/{qW3bkLKlrX8uFT2umfH8C → 8fO4nSkLwXorpa4D0V82M}/_buildManifest.js +0 -0
  137. /package/web/.next/static/{qW3bkLKlrX8uFT2umfH8C → 8fO4nSkLwXorpa4D0V82M}/_clientMiddlewareManifest.json +0 -0
  138. /package/web/.next/static/{qW3bkLKlrX8uFT2umfH8C → 8fO4nSkLwXorpa4D0V82M}/_ssgManifest.js +0 -0
@@ -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,2CA4VzF"}
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,2CAqUzF"}
@@ -124,22 +124,16 @@ 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
- // 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) {
127
+ if (wasEmpty) {
128
+ // Wait for next render so the repo node exists in the DOM, then auto-focus
129
+ setTimeout(() => {
130
+ fitView(AUTO_FOCUS_OPTIONS);
137
131
  // Open the create-feature drawer after the fitView animation completes
138
132
  drawerTimerRef.current = setTimeout(() => {
139
133
  guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));
140
134
  }, AUTO_FOCUS_DRAWER_DELAY_MS);
141
- }
142
- });
135
+ }, 0);
136
+ }
143
137
  };
144
138
  window.addEventListener('shep:add-repository', handler);
145
139
  return () => {
@@ -148,7 +142,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
148
142
  clearTimeout(drawerTimerRef.current);
149
143
  }
150
144
  };
151
- }, [handleAddRepository, fitView, guardedNavigate, router, resetViewport]);
145
+ }, [handleAddRepository, fitView, guardedNavigate, router]);
152
146
  // Listen for create events from the create drawer (with real feature ID from server)
153
147
  useEffect(() => {
154
148
  const handler = (e) => {
@@ -210,21 +204,6 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
210
204
  handleRepositoryClick,
211
205
  handleDeleteRepository,
212
206
  ]);
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]);
228
207
  const handleMoveEnd = useCallback((_event, viewport) => {
229
208
  handleViewportChange(viewport);
230
209
  }, [handleViewportChange]);
@@ -5,8 +5,6 @@ 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;
10
8
  onMoveEnd: (viewport: Viewport) => void;
11
9
  resetViewport: () => Viewport;
12
10
  }
@@ -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,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"}
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;AA6BD,wBAAgB,sBAAsB,IAAI,4BAA4B,CAmCrE"}
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- import { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { useCallback, useEffect, useRef } from 'react';
3
3
  export const STORAGE_KEY = 'shep-canvas-viewport';
4
4
  export const DEBOUNCE_MS = 500;
5
5
  export const DEFAULT_VIEWPORT = { x: 30, y: 30, zoom: 0.85 };
@@ -20,20 +20,16 @@ function readViewport() {
20
20
  try {
21
21
  const raw = localStorage.getItem(STORAGE_KEY);
22
22
  if (raw == null)
23
- return { viewport: DEFAULT_VIEWPORT, fromStorage: false };
23
+ return DEFAULT_VIEWPORT;
24
24
  const parsed = JSON.parse(raw);
25
- if (isValidViewport(parsed))
26
- return { viewport: parsed, fromStorage: true };
27
- return { viewport: DEFAULT_VIEWPORT, fromStorage: false };
25
+ return isValidViewport(parsed) ? parsed : DEFAULT_VIEWPORT;
28
26
  }
29
27
  catch {
30
- return { viewport: DEFAULT_VIEWPORT, fromStorage: false };
28
+ return DEFAULT_VIEWPORT;
31
29
  }
32
30
  }
33
31
  export function useViewportPersistence() {
34
- const stored = useRef(readViewport()).current;
35
- const [defaultViewport, setDefaultViewport] = useState(stored.viewport);
36
- const hasSavedViewport = stored.fromStorage;
32
+ const defaultViewport = useRef(readViewport()).current;
37
33
  const timerRef = useRef(null);
38
34
  useEffect(() => {
39
35
  return () => {
@@ -56,22 +52,13 @@ export function useViewportPersistence() {
56
52
  }, DEBOUNCE_MS);
57
53
  }, []);
58
54
  const resetViewport = useCallback(() => {
59
- // Cancel any pending debounced save so it cannot overwrite the reset
60
- if (timerRef.current != null) {
61
- clearTimeout(timerRef.current);
62
- timerRef.current = null;
63
- }
64
55
  try {
65
56
  localStorage.removeItem(STORAGE_KEY);
66
57
  }
67
58
  catch {
68
59
  // Silently ignore localStorage errors
69
60
  }
70
- // Update the defaultViewport so that if ReactFlow re-mounts (e.g. after
71
- // showCanvas toggles), it initializes at the default position instead of
72
- // the stale saved viewport.
73
- setDefaultViewport(DEFAULT_VIEWPORT);
74
61
  return DEFAULT_VIEWPORT;
75
62
  }, []);
76
- return { defaultViewport, hasSavedViewport, onMoveEnd, resetViewport };
63
+ return { defaultViewport, onMoveEnd, resetViewport };
77
64
  }
@@ -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,CA8L/B"}
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,CAqL/B"}
@@ -78,10 +78,6 @@ 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;
85
81
  let rootPrimaryAxis = 0;
86
82
  for (const c of centerMap.values()) {
87
83
  rootPrimaryAxis = isHorizontal ? c.cx : c.cy;
@@ -89,14 +85,9 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
89
85
  }
90
86
  for (const node of disconnectedNodes) {
91
87
  const size = getNodeSize(node, nodeSize);
92
- const primaryAxisCenter = hasCenterMap
93
- ? rootPrimaryAxis
94
- : isHorizontal
95
- ? size.width / 2
96
- : size.height / 2;
97
88
  centerMap.set(node.id, {
98
- cx: isHorizontal ? primaryAxisCenter : 0,
99
- cy: isHorizontal ? 0 : primaryAxisCenter,
89
+ cx: isHorizontal ? rootPrimaryAxis : 0,
90
+ cy: isHorizontal ? 0 : rootPrimaryAxis,
100
91
  w: size.width,
101
92
  h: size.height,
102
93
  });