@leanspec/ui 0.2.6-dev.20251125092039 → 0.2.6-dev.20251125092944

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 (53) hide show
  1. package/.next/standalone/packages/ui/.next/BUILD_ID +1 -1
  2. package/.next/standalone/packages/ui/.next/build-manifest.json +2 -2
  3. package/.next/standalone/packages/ui/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/packages/ui/.next/server/app/_global-error.html +2 -2
  5. package/.next/standalone/packages/ui/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  9. package/.next/standalone/packages/ui/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/standalone/packages/ui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/packages/ui/.next/server/app/_not-found.html +2 -2
  12. package/.next/standalone/packages/ui/.next/server/app/_not-found.rsc +15 -15
  13. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  14. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  15. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
  16. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  17. package/.next/standalone/packages/ui/.next/server/app/_not-found.segments/_tree.segment.rsc +4 -4
  18. package/.next/standalone/packages/ui/.next/server/app/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/[specId]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/packages/ui/.next/server/app/projects/[projectId]/specs/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/packages/ui/.next/server/app/projects/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/packages/ui/.next/server/app/projects.html +2 -2
  24. package/.next/standalone/packages/ui/.next/server/app/projects.rsc +9 -9
  25. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_full.segment.rsc +9 -9
  26. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_index.segment.rsc +8 -8
  27. package/.next/standalone/packages/ui/.next/server/app/projects.segments/_tree.segment.rsc +1 -1
  28. package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +2 -2
  29. package/.next/standalone/packages/ui/.next/server/app/projects.segments/projects.segment.rsc +1 -1
  30. package/.next/standalone/packages/ui/.next/server/app/specs/[id]/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/packages/ui/.next/server/app/specs/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/packages/ui/.next/server/app/stats/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__73f60f12._.js +1 -1
  34. package/.next/standalone/packages/ui/.next/server/chunks/ssr/[root-of-the-server]__a7ae8552._.js +1 -1
  35. package/.next/standalone/packages/ui/.next/server/pages/404.html +2 -2
  36. package/.next/standalone/packages/ui/.next/server/pages/500.html +2 -2
  37. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.js +1 -1
  38. package/.next/standalone/packages/ui/.next/server/server-reference-manifest.json +1 -1
  39. package/.next/standalone/packages/ui/.next/static/chunks/7e0dbfe036ccd85d.js +1 -0
  40. package/.next/standalone/packages/ui/leanspec.db +0 -0
  41. package/.next/standalone/packages/ui/package.json +1 -1
  42. package/.next/standalone/packages/ui/src/contexts/project-context.tsx +14 -14
  43. package/.next/standalone/packages/ui/tsconfig.tsbuildinfo +1 -1
  44. package/.next/static/chunks/7e0dbfe036ccd85d.js +1 -0
  45. package/package.json +1 -1
  46. package/.next/standalone/packages/ui/.next/static/chunks/220ba5cb8fe4dd69.js +0 -1
  47. package/.next/static/chunks/220ba5cb8fe4dd69.js +0 -1
  48. /package/.next/standalone/packages/ui/.next/static/{XaKCij6ONZQYRwoNl_cx7 → iWGI_kVMs-xybaG9ZCyWK}/_buildManifest.js +0 -0
  49. /package/.next/standalone/packages/ui/.next/static/{XaKCij6ONZQYRwoNl_cx7 → iWGI_kVMs-xybaG9ZCyWK}/_clientMiddlewareManifest.json +0 -0
  50. /package/.next/standalone/packages/ui/.next/static/{XaKCij6ONZQYRwoNl_cx7 → iWGI_kVMs-xybaG9ZCyWK}/_ssgManifest.js +0 -0
  51. /package/.next/static/{XaKCij6ONZQYRwoNl_cx7 → iWGI_kVMs-xybaG9ZCyWK}/_buildManifest.js +0 -0
  52. /package/.next/static/{XaKCij6ONZQYRwoNl_cx7 → iWGI_kVMs-xybaG9ZCyWK}/_clientMiddlewareManifest.json +0 -0
  53. /package/.next/static/{XaKCij6ONZQYRwoNl_cx7 → iWGI_kVMs-xybaG9ZCyWK}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "O5bxazl4iXyIN7spYjHtoQDFzGwrlIugSkx+swhCtGk="
4
+ "encryptionKey": "o7nfpwOpNXTFx501M6Up7riddq/vwKUEZ2yjdanGoGU="
5
5
  }
@@ -0,0 +1 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,20648,e=>{"use strict";var t=e.i(90022),r=e.i(31231);let a=(0,r.createContext)(null);function o(){let e=(0,r.useContext)(a);if(!e)throw Error("useProject must be used within ProjectProvider");return e}function s({children:e,initialProjectId:o}){let[s,l]=(0,r.useState)("single-project"),[i,c]=(0,r.useState)(null),[n,d]=(0,r.useState)([]),[h,u]=(0,r.useState)([]),[p,f]=(0,r.useState)([]),[m,j]=(0,r.useState)(!0),[x,g]=(0,r.useState)(null),y=(0,r.useCallback)(async()=>{try{j(!0),g(null);let e=await fetch("/api/projects");if(!e.ok)throw Error("Failed to fetch projects");let t=await e.json();if(l(t.mode||"single-project"),d(t.projects||[]),u(t.recentProjects||[]),f(t.favoriteProjects||[]),!i&&t.projects.length>0){let e=o?t.projects.find(e=>e.id===o):t.recentProjects?.[0]||t.projects[0];e&&c(e)}}catch(e){console.error("Error fetching projects:",e),g(e instanceof Error?e.message:"Failed to load projects")}finally{j(!1)}},[i,o]),v=(0,r.useCallback)(async e=>{try{let t=await fetch(`/api/projects/${e}`);if(!t.ok)throw Error("Failed to fetch project");let r=await t.json();c(r.project),await y()}catch(e){throw console.error("Error switching project:",e),g(e instanceof Error?e.message:"Failed to switch project"),e}},[y]),w=(0,r.useCallback)(async(e,t)=>{try{let r=await fetch("/api/projects",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e,...t})});if(!r.ok){let e=await r.json();throw Error(e.details||"Failed to add project")}let a=await r.json();return await y(),a.project}catch(e){throw console.error("Error adding project:",e),g(e instanceof Error?e.message:"Failed to add project"),e}},[y]),b=(0,r.useCallback)(async e=>{try{if(!(await fetch(`/api/projects/${e}`,{method:"DELETE"})).ok)throw Error("Failed to remove project");if(i?.id===e){let t=n.find(t=>t.id!==e);c(t||null)}await y()}catch(e){throw console.error("Error removing project:",e),g(e instanceof Error?e.message:"Failed to remove project"),e}},[i,n,y]),k=(0,r.useCallback)(async e=>{try{if(!(await fetch(`/api/projects/${e}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({favorite:!0})})).ok)throw Error("Failed to toggle favorite");await y()}catch(e){throw console.error("Error toggling favorite:",e),g(e instanceof Error?e.message:"Failed to toggle favorite"),e}},[y]),N=(0,r.useCallback)(async(e,t)=>{try{if(!(await fetch(`/api/projects/${e}`,{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})).ok)throw Error("Failed to update project");await y()}catch(e){throw console.error("Error updating project:",e),g(e instanceof Error?e.message:"Failed to update project"),e}},[y]);return(0,r.useEffect)(()=>{y()},[y]),(0,t.jsx)(a.Provider,{value:{mode:s,currentProject:i,projects:n,recentProjects:h,favoriteProjects:p,isLoading:m,error:x,switchProject:v,addProject:w,removeProject:b,toggleFavorite:k,updateProject:N,refreshProjects:y},children:e})}e.s(["ProjectProvider",()=>s,"useProject",()=>o])},87949,e=>{"use strict";let t=(0,e.i(22436).default)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]]);e.s(["Loader2",()=>t],87949)},52186,23882,28964,61877,e=>{"use strict";var t=e.i(22436);let r=(0,t.default)("plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);e.s(["Plus",()=>r],52186);let a=(0,t.default)("folder-open",[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]);e.s(["FolderOpen",()=>a],23882);let o=(0,t.default)("star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);e.s(["Star",()=>o],28964);var s=e.i(90022),l=e.i(31231),i=e.i(30827),c=e.i(20648),n=e.i(35893),d=e.i(21079);let h=(0,t.default)("folder",[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]]);var u=e.i(87949);let p=(0,t.default)("arrow-left",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]]);var f=e.i(97332),m=e.i(25761),j=e.i(32137);function x({onSelect:e,onCancel:t,initialPath:r,actionLabel:a="Select This Folder",isLoading:o}){let[i,c]=(0,l.useState)(r||""),[d,x]=(0,l.useState)([]),[g,y]=(0,l.useState)(!1),[v,w]=(0,l.useState)(null),b=(0,l.useRef)(null),k=o||g;(0,l.useEffect)(()=>{N(i)},[i]),(0,l.useEffect)(()=>{b.current&&(b.current.scrollLeft=b.current.scrollWidth)},[i]);let N=async e=>{try{y(!0),w(null);let t=await fetch("/api/local-projects/list-directory",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e})});if(!t.ok)throw Error("Failed to list directory");let r=await t.json();x(r.items),e||c(r.path)}catch(e){w(e instanceof Error?e.message:String(e))}finally{y(!1)}},C=e=>{c(e)},E=d.find(e=>".."===e.name),S=d.filter(e=>".."!==e.name),P=(e=>{if(!e)return[];let t=e.includes("\\")?"\\":"/",r=e.split(t).filter(Boolean),a=e.startsWith("/");return r.map((e,o)=>{let s=r.slice(0,o+1).join(t);return a&&(s="/"+s),{name:e,path:s}})})(i);return(0,s.jsxs)("div",{className:"flex flex-col h-[400px] gap-4 min-w-0",children:[(0,s.jsxs)("div",{className:"flex items-center border rounded-md p-1 gap-1 bg-muted/30",children:[(0,s.jsx)(n.Button,{variant:"ghost",size:"icon",className:"h-8 w-8 shrink-0",disabled:!E||k,onClick:()=>E&&C(E.path),title:"Go to parent directory",children:(0,s.jsx)(p,{className:"h-4 w-4"})}),(0,s.jsx)("div",{className:"w-px h-5 bg-border mx-1"}),(0,s.jsxs)("div",{ref:b,className:"flex-1 overflow-x-auto whitespace-nowrap flex items-center scrollbar-hide px-1 min-w-0",children:[(0,s.jsx)("button",{onClick:()=>C("/"),className:"hover:bg-accent p-1 rounded-sm transition-colors shrink-0",title:"Go to root",children:(0,s.jsx)(f.Home,{className:"h-4 w-4 text-muted-foreground"})}),P.map((e,t)=>(0,s.jsxs)("div",{className:"flex items-center shrink-0",children:[(0,s.jsx)(m.ChevronRight,{className:"h-3 w-3 text-muted-foreground mx-0.5 shrink-0"}),(0,s.jsx)("button",{onClick:()=>C(e.path),className:(0,j.cn)("px-1.5 py-0.5 rounded-sm transition-colors text-sm hover:bg-accent hover:text-accent-foreground",t===P.length-1?"font-medium text-foreground":"text-muted-foreground"),children:e.name})]},e.path))]})]}),(0,s.jsxs)("div",{className:"flex-1 border rounded-md overflow-hidden relative bg-background min-h-0",children:[k&&(0,s.jsx)("div",{className:"absolute inset-0 bg-background/50 flex items-center justify-center z-10",children:(0,s.jsx)(u.Loader2,{className:"h-6 w-6 animate-spin"})}),v?(0,s.jsxs)("div",{className:"p-4 text-destructive text-sm text-center",children:[v,(0,s.jsx)(n.Button,{variant:"link",onClick:()=>N(i),className:"block mx-auto mt-2",children:"Retry"})]}):(0,s.jsx)("div",{className:"h-full overflow-auto",children:(0,s.jsx)("div",{className:"p-1",children:0!==S.length||k?S.map(e=>(0,s.jsxs)("button",{onClick:()=>C(e.path),className:"flex items-center gap-3 w-full px-3 py-2 text-sm rounded-sm hover:bg-accent hover:text-accent-foreground text-left group transition-colors",children:[(0,s.jsx)(h,{className:"h-4 w-4 text-blue-500 fill-blue-500/20 group-hover:fill-blue-500/30 transition-colors shrink-0"}),(0,s.jsx)("span",{className:"truncate",children:e.name})]},e.path)):(0,s.jsx)("div",{className:"p-4 text-center text-sm text-muted-foreground",children:"Empty directory"})})})]}),(0,s.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,s.jsx)(n.Button,{variant:"outline",onClick:t,disabled:k,children:"Cancel"}),(0,s.jsx)(n.Button,{onClick:()=>e(i),disabled:k||!i,children:a})]})]})}var g=e.i(39779),y=e.i(95403);function v({open:e,onOpenChange:t}){let{addProject:r,switchProject:o}=(0,c.useProject)(),[h,u]=(0,l.useState)(""),[p,f]=(0,l.useState)(!1),[m,j]=(0,l.useState)("picker"),v=(0,i.useRouter)();(0,l.useEffect)(()=>{e&&(j("picker"),u(""))},[e]);let w=async e=>{try{f(!0);let a=await r(e);await o(a.id),y.toast.success("Project added successfully"),t(!1),v.push("/")}catch(t){let e=t instanceof Error?t.message:"Failed to add project";y.toast.error(e)}finally{f(!1)}};return(0,s.jsx)(g.Dialog,{open:e,onOpenChange:t,children:(0,s.jsxs)(g.DialogContent,{className:"sm:max-w-[600px]",children:[(0,s.jsxs)(g.DialogHeader,{children:[(0,s.jsx)(g.DialogTitle,{children:"Add Project"}),(0,s.jsx)(g.DialogDescription,{children:"picker"===m?"Browse and select the project directory.":"Enter the absolute path to your local project directory."})]}),"picker"===m?(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)(x,{onSelect:w,onCancel:()=>t(!1),initialPath:h,actionLabel:p?"Adding...":"Add Project",isLoading:p}),(0,s.jsx)("div",{className:"flex justify-center",children:(0,s.jsx)(n.Button,{variant:"link",size:"sm",onClick:()=>j("manual"),className:"text-muted-foreground",children:"Enter path manually"})})]}):(0,s.jsxs)("form",{onSubmit:e=>{e.preventDefault(),h&&w(h)},children:[(0,s.jsx)("div",{className:"grid gap-4 py-4",children:(0,s.jsxs)("div",{className:"grid gap-2",children:[(0,s.jsx)("label",{htmlFor:"path",className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",children:"Project Path"}),(0,s.jsx)("div",{className:"flex gap-2",children:(0,s.jsx)(d.Input,{id:"path",value:h,onChange:e=>u(e.target.value),placeholder:"/path/to/your/project",className:"flex-1",disabled:p})}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"Select the root directory of your project."})]})}),(0,s.jsxs)(g.DialogFooter,{className:"flex-col sm:flex-row gap-2",children:[(0,s.jsx)("div",{className:"flex-1 flex justify-start",children:(0,s.jsxs)(n.Button,{type:"button",variant:"ghost",size:"sm",onClick:()=>j("picker"),children:[(0,s.jsx)(a,{className:"h-4 w-4 mr-2"}),"Browse folders"]})}),(0,s.jsx)(n.Button,{type:"button",variant:"outline",onClick:()=>t(!1),disabled:p,children:"Cancel"}),(0,s.jsx)(n.Button,{type:"submit",disabled:p||!h,children:p?"Adding...":"Add Project"})]})]})]})})}e.s(["CreateProjectDialog",()=>v],61877)}]);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leanspec/ui",
3
- "version": "0.2.6-dev.20251125092039",
3
+ "version": "0.2.6-dev.20251125092944",
4
4
  "description": "LeanSpec web UI launcher for visual spec management",
5
5
  "type": "module",
6
6
  "bin": {
@@ -69,15 +69,15 @@ export function ProjectProvider({ children, initialProjectId }: ProjectProviderP
69
69
  if (!currentProject && data.projects.length > 0) {
70
70
  const projectToSet = initialProjectId
71
71
  ? data.projects.find((p: LocalProject) => p.id === initialProjectId)
72
- : data.recentProjects[0] || data.projects[0];
72
+ : data.recentProjects?.[0] || data.projects[0];
73
73
 
74
74
  if (projectToSet) {
75
75
  setCurrentProject(projectToSet);
76
76
  }
77
77
  }
78
- } catch (err: any) {
78
+ } catch (err: unknown) {
79
79
  console.error('Error fetching projects:', err);
80
- setError(err.message || 'Failed to load projects');
80
+ setError(err instanceof Error ? err.message : 'Failed to load projects');
81
81
  } finally {
82
82
  setIsLoading(false);
83
83
  }
@@ -96,9 +96,9 @@ export function ProjectProvider({ children, initialProjectId }: ProjectProviderP
96
96
 
97
97
  // Refresh recent projects list
98
98
  await refreshProjects();
99
- } catch (err: any) {
99
+ } catch (err: unknown) {
100
100
  console.error('Error switching project:', err);
101
- setError(err.message || 'Failed to switch project');
101
+ setError(err instanceof Error ? err.message : 'Failed to switch project');
102
102
  throw err;
103
103
  }
104
104
  }, [refreshProjects]);
@@ -123,9 +123,9 @@ export function ProjectProvider({ children, initialProjectId }: ProjectProviderP
123
123
  const data = await response.json();
124
124
  await refreshProjects();
125
125
  return data.project;
126
- } catch (err: any) {
126
+ } catch (err: unknown) {
127
127
  console.error('Error adding project:', err);
128
- setError(err.message || 'Failed to add project');
128
+ setError(err instanceof Error ? err.message : 'Failed to add project');
129
129
  throw err;
130
130
  }
131
131
  }, [refreshProjects]);
@@ -148,9 +148,9 @@ export function ProjectProvider({ children, initialProjectId }: ProjectProviderP
148
148
  }
149
149
 
150
150
  await refreshProjects();
151
- } catch (err: any) {
151
+ } catch (err: unknown) {
152
152
  console.error('Error removing project:', err);
153
- setError(err.message || 'Failed to remove project');
153
+ setError(err instanceof Error ? err.message : 'Failed to remove project');
154
154
  throw err;
155
155
  }
156
156
  }, [currentProject, projects, refreshProjects]);
@@ -169,9 +169,9 @@ export function ProjectProvider({ children, initialProjectId }: ProjectProviderP
169
169
  }
170
170
 
171
171
  await refreshProjects();
172
- } catch (err: any) {
172
+ } catch (err: unknown) {
173
173
  console.error('Error toggling favorite:', err);
174
- setError(err.message || 'Failed to toggle favorite');
174
+ setError(err instanceof Error ? err.message : 'Failed to toggle favorite');
175
175
  throw err;
176
176
  }
177
177
  }, [refreshProjects]);
@@ -193,9 +193,9 @@ export function ProjectProvider({ children, initialProjectId }: ProjectProviderP
193
193
  }
194
194
 
195
195
  await refreshProjects();
196
- } catch (err: any) {
196
+ } catch (err: unknown) {
197
197
  console.error('Error updating project:', err);
198
- setError(err.message || 'Failed to update project');
198
+ setError(err instanceof Error ? err.message : 'Failed to update project');
199
199
  throw err;
200
200
  }
201
201
  }, [refreshProjects]);
@@ -203,7 +203,7 @@ export function ProjectProvider({ children, initialProjectId }: ProjectProviderP
203
203
  // Load projects on mount
204
204
  useEffect(() => {
205
205
  refreshProjects();
206
- }, []);
206
+ }, [refreshProjects]);
207
207
 
208
208
  const value: ProjectContextType = {
209
209
  mode,