@shepai/cli 1.45.0 → 1.46.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 (66) hide show
  1. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  2. package/dist/src/presentation/web/app/page.js +18 -10
  3. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  4. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +4 -0
  5. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
  6. package/dist/src/presentation/web/lib/layout-with-dagre.js +3 -0
  7. package/dist/tsconfig.build.tsbuildinfo +1 -1
  8. package/package.json +1 -1
  9. package/web/.next/BUILD_ID +1 -1
  10. package/web/.next/build-manifest.json +2 -2
  11. package/web/.next/cache/.previewinfo +1 -1
  12. package/web/.next/cache/.rscinfo +1 -1
  13. package/web/.next/cache/.tsbuildinfo +1 -1
  14. package/web/.next/cache/config.json +3 -3
  15. package/web/.next/fallback-build-manifest.json +2 -2
  16. package/web/.next/prerender-manifest.json +3 -3
  17. package/web/.next/required-server-files.js +1 -1
  18. package/web/.next/required-server-files.json +1 -1
  19. package/web/.next/server/app/_global-error.html +2 -2
  20. package/web/.next/server/app/_global-error.rsc +1 -1
  21. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  22. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  23. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  24. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  25. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  26. package/web/.next/server/app/page/server-reference-manifest.json +11 -11
  27. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +2 -2
  29. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
  30. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  31. package/web/.next/server/chunks/ssr/[root-of-the-server]__4e8ca89c._.js +2 -2
  32. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  33. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  34. package/web/.next/server/pages/500.html +2 -2
  35. package/web/.next/server/server-reference-manifest.js +1 -1
  36. package/web/.next/server/server-reference-manifest.json +12 -12
  37. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  38. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  39. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  40. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  41. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  42. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  43. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  44. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  45. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  46. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  47. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  48. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +11 -11
  49. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  50. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +2 -2
  51. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  52. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__4e8ca89c._.js +2 -2
  53. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  54. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  55. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  56. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +12 -12
  57. package/web/.next/standalone/src/presentation/web/app/page.tsx +19 -10
  58. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +17 -0
  59. package/web/.next/standalone/src/presentation/web/lib/layout-with-dagre.ts +3 -0
  60. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  61. package/web/.next/static/chunks/{22f9e39aab128063.js → ecf44fa8a155c854.js} +2 -2
  62. package/web/.next/trace +1 -1
  63. package/web/.next/trace-build +1 -1
  64. /package/web/.next/static/{z34pr57Jw4sBfoDeMMuGn → nM-uXIiW9k_0Z_GM_4bI4}/_buildManifest.js +0 -0
  65. /package/web/.next/static/{z34pr57Jw4sBfoDeMMuGn → nM-uXIiW9k_0Z_GM_4bI4}/_clientMiddlewareManifest.json +0 -0
  66. /package/web/.next/static/{z34pr57Jw4sBfoDeMMuGn → nM-uXIiW9k_0Z_GM_4bI4}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/page.tsx"],"names":[],"mappings":"AAcA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAqBvC,wBAA8B,QAAQ,qDA+GrC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/page.tsx"],"names":[],"mappings":"AAcA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAqBvC,wBAA8B,QAAQ,qDAwHrC"}
@@ -93,19 +93,27 @@ export default async function HomePage() {
93
93
  ranksep: 200,
94
94
  nodesep: 15,
95
95
  });
96
- // Position "+ Add Repository" vertically centered with the bottom-most feature node,
97
- // mirroring how Dagre centers repo nodes with their connected features.
96
+ // Position "+ Add Repository" below the last repo node (no-features case) or
97
+ // vertically centered with a bottom feature node (features case).
98
98
  const repoNodes = laid.nodes.filter((n) => n.type === 'repositoryNode');
99
99
  const featureNodes = laid.nodes.filter((n) => n.type === 'featureNode');
100
- const sortedFeatures = [...featureNodes].sort((a, b) => a.position.y - b.position.y);
101
- // Pick the feature node just below center (one past the midpoint index)
102
- const centerIdx = Math.floor(sortedFeatures.length / 2);
103
- const targetFeature = sortedFeatures[centerIdx + 1] ?? sortedFeatures[sortedFeatures.length - 1];
104
100
  const repoX = repoNodes[0]?.position.x ?? 0;
105
- // Center the add-repo node (h=50) with the target feature node (h=140)
106
- const addRepoPosition = targetFeature
107
- ? { x: repoX, y: targetFeature.position.y + 70 - 25 }
108
- : { x: repoX, y: (repoNodes[0]?.position.y ?? 0) + 150 };
101
+ let addRepoPosition;
102
+ if (featureNodes.length > 0) {
103
+ // Mirror how dagre centers repo nodes with their connected features
104
+ const sortedFeatures = [...featureNodes].sort((a, b) => a.position.y - b.position.y);
105
+ const centerIdx = Math.floor(sortedFeatures.length / 2);
106
+ const targetFeature = sortedFeatures[centerIdx + 1] ?? sortedFeatures[sortedFeatures.length - 1];
107
+ // Center the add-repo node (h=50) with the target feature node (h=140)
108
+ addRepoPosition = { x: repoX, y: targetFeature.position.y + 70 - 25 };
109
+ }
110
+ else {
111
+ // No features — place below the bottom-most repo node with a gap
112
+ const lastRepoY = repoNodes.length > 0 ? Math.max(...repoNodes.map((n) => n.position.y)) : 0;
113
+ const repoHeight = 50;
114
+ const gap = 200;
115
+ addRepoPosition = { x: repoX, y: lastRepoY + repoHeight + gap };
116
+ }
109
117
  laid.nodes.push({
110
118
  id: 'add-repository',
111
119
  type: 'addRepositoryNode',
@@ -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":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAO1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAS5E,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,2CA8OzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAO1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAS5E,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,2CA+PzF"}
@@ -138,11 +138,15 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
138
138
  cancelled = true;
139
139
  };
140
140
  }, [techDecisionsFeatureId]);
141
+ const hasRepositories = nodes.some((n) => n.type === 'repositoryNode');
141
142
  // Listen for global "open create drawer" events from the sidebar
142
143
  useEffect(() => {
143
144
  const handler = () => handleAddFeature();
144
145
  window.addEventListener('shep:open-create-drawer', handler);
145
146
  return () => window.removeEventListener('shep:open-create-drawer', handler);
146
147
  }, [handleAddFeature]);
148
+ if (!hasRepositories) {
149
+ return (_jsxs(_Fragment, { children: [_jsx(NotificationPermissionBanner, {}), _jsx(ControlCenterEmptyState, { onRepositorySelect: handleAddRepository }), _jsx(FeatureCreateDrawer, { open: isCreateDrawerOpen, onClose: closeCreateDrawer, onSubmit: handleCreateFeatureSubmit, repositoryPath: pendingRepositoryPath })] }));
150
+ }
147
151
  return (_jsxs(_Fragment, { children: [_jsx(NotificationPermissionBanner, {}), _jsx(FeaturesCanvas, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeAction: handleAddFeatureToFeature, onNodeClick: handleNodeClick, onPaneClick: clearSelection, onRepositoryAdd: handleAddFeatureToRepo, onRepositoryDelete: handleDeleteRepository, onRepositorySelect: handleAddRepository, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: handleAddRepository }) }), _jsx(FeatureDrawer, { selectedNode: showPrdDrawer || showTechDecisionsDrawer ? null : selectedNode, onClose: clearSelection, onDelete: handleDeleteFeature, isDeleting: isDeleting }), questionnaireData ? (_jsx(PrdQuestionnaireDrawer, { open: showPrdDrawer, onClose: clearSelection, featureName: selectedNode?.name ?? '', featureDescription: selectedNode?.description, featureId: selectedNode?.featureId, repositoryPath: selectedNode?.repositoryPath, branch: selectedNode?.branch, specPath: selectedNode?.specPath, data: questionnaireData, selections: prdSelections, onSelect: handlePrdSelect, onRefine: handlePrdRefine, onApprove: handlePrdApprove, onDelete: handleDeleteFeature, isDeleting: isDeleting, isProcessing: isPrdProcessing || isLoadingQuestionnaire })) : null, techDecisionsData ? (_jsx(TechDecisionsDrawer, { open: showTechDecisionsDrawer, onClose: clearSelection, featureName: selectedNode?.name ?? '', featureId: selectedNode?.featureId, repositoryPath: selectedNode?.repositoryPath, branch: selectedNode?.branch, specPath: selectedNode?.specPath, data: techDecisionsData, onRefine: handleTechDecisionsRefine, onApprove: handleTechDecisionsApprove, onDelete: handleDeleteFeature, isDeleting: isDeleting, isProcessing: isLoadingTechDecisions })) : null, _jsx(FeatureCreateDrawer, { open: isCreateDrawerOpen, onClose: closeCreateDrawer, onSubmit: handleCreateFeatureSubmit, repositoryPath: pendingRepositoryPath })] }));
148
152
  }
@@ -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;AAmCD;;;;;;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,CA+E/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;AAmCD;;;;;;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,CAkF/B"}
@@ -83,6 +83,9 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
83
83
  maxY = Math.max(maxY, n.position.y + size.height);
84
84
  minX = Math.min(minX, n.position.x);
85
85
  }
86
+ // When no graph nodes exist (all disconnected), default to origin
87
+ if (minX === Infinity)
88
+ minX = 0;
86
89
  for (let i = 0; i < disconnectedNodes.length; i++) {
87
90
  const node = disconnectedNodes[i];
88
91
  const size = getNodeSize(node, nodeSize);