claudeship 0.2.22 → 0.2.24
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/apps/server/dist/tsconfig.tsbuildinfo +1 -1
- package/apps/server/package.json +1 -1
- package/apps/web/.next/BUILD_ID +1 -1
- package/apps/web/.next/app-build-manifest.json +6 -6
- package/apps/web/.next/build-manifest.json +2 -2
- package/apps/web/.next/cache/.previewinfo +1 -1
- package/apps/web/.next/cache/.rscinfo +1 -1
- package/apps/web/.next/cache/.tsbuildinfo +1 -1
- package/apps/web/.next/cache/config.json +3 -3
- package/apps/web/.next/cache/eslint/.cache_j3uhuz +1 -1
- package/apps/web/.next/cache/webpack/client-production/0.pack +0 -0
- package/apps/web/.next/cache/webpack/client-production/index.pack +0 -0
- package/apps/web/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/apps/web/.next/cache/webpack/server-production/0.pack +0 -0
- package/apps/web/.next/cache/webpack/server-production/index.pack +0 -0
- package/apps/web/.next/prerender-manifest.json +10 -10
- package/apps/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/server/app/_not-found.html +1 -1
- package/apps/web/.next/server/app/_not-found.rsc +1 -1
- package/apps/web/.next/server/app/index.html +1 -1
- package/apps/web/.next/server/app/index.rsc +2 -2
- package/apps/web/.next/server/app/page.js +1 -1
- package/apps/web/.next/server/app/page.js.nft.json +1 -1
- package/apps/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/server/app/project/[id]/page.js +2 -2
- package/apps/web/.next/server/app/project/[id]/page.js.nft.json +1 -1
- package/apps/web/.next/server/app/project/[id]/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/server/app/settings/page.js +1 -1
- package/apps/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/apps/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/apps/web/.next/server/app/settings.html +1 -1
- package/apps/web/.next/server/app/settings.rsc +2 -2
- package/apps/web/.next/server/chunks/392.js +1 -1
- package/apps/web/.next/server/chunks/{526.js → 490.js} +1 -1
- package/apps/web/.next/server/pages/404.html +1 -1
- package/apps/web/.next/server/pages/500.html +1 -1
- package/apps/web/.next/server/server-reference-manifest.json +1 -1
- package/apps/web/.next/static/chunks/253-ebb21cb223bb373d.js +1 -0
- package/apps/web/.next/static/chunks/app/{page-6f2bfb6c9202164b.js → page-f73b6424c8cbf96d.js} +1 -1
- package/apps/web/.next/static/chunks/app/project/[id]/{page-388d14835cae411b.js → page-e9304c25ba897608.js} +1 -1
- package/apps/web/.next/static/chunks/app/settings/{page-34c4ce9b8e645903.js → page-4512ba57f1c3914d.js} +1 -1
- package/apps/web/.next/trace +18 -18
- package/apps/web/node_modules/.bin/tailwind +2 -2
- package/apps/web/node_modules/.bin/tailwindcss +2 -2
- package/apps/web/package.json +1 -1
- package/package.json +1 -1
- package/apps/web/.next/static/chunks/193-9e44b5a1ad3e0586.js +0 -1
- /package/apps/web/.next/static/{WuTLXdJlN3bwUMxmeSPVx → fQQI0X4R8kXYUbd-0V8mo}/_buildManifest.js +0 -0
- /package/apps/web/.next/static/{WuTLXdJlN3bwUMxmeSPVx → fQQI0X4R8kXYUbd-0V8mo}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[662],{660:(e,t,s)=>{"use strict";s.d(t,{F:()=>l});let a="http://localhost:14000/api";async function r(e,t){let s="".concat(a).concat(e),r=await fetch(s,{...t,headers:{"Content-Type":"application/json",...null==t?void 0:t.headers}});if(!r.ok)throw Error((await r.json().catch(()=>({message:"Request failed"}))).message||"HTTP error! status: ".concat(r.status));if(204!==r.status)return r.json()}let l={get:e=>r(e),post:(e,t)=>r(e,{method:"POST",body:t?JSON.stringify(t):void 0}),put:(e,t)=>r(e,{method:"PUT",body:t?JSON.stringify(t):void 0}),delete:(e,t)=>r(e,{method:"DELETE",body:t?JSON.stringify(t):void 0}),uploadFiles:async(e,t)=>{let s=new FormData;t.forEach(e=>s.append("files",e));let r="".concat(a,"/projects/").concat(e,"/files/upload"),l=await fetch(r,{method:"POST",body:s});if(!l.ok)throw Error((await l.json().catch(()=>({message:"Upload failed"}))).message||"HTTP error! status: ".concat(l.status));return l.json()}}},794:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("FolderOpen",[["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"}]])},2718:(e,t,s)=>{Promise.resolve().then(s.bind(s,3701))},3701:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>f});var a=s(8481),r=s(8526),l=s(7176),n=s(5594),i=s(5338),o=s(794),c=s(8031),d=s(9696),u=s(6569),m=s(1858),h=s(3787),p=s(660),x=s(9426);function f(){let{t:e}=(0,x.B)(),[t,s]=(0,r.useState)(null),[f,g]=(0,r.useState)(""),[j,v]=(0,r.useState)(!0),[y,b]=(0,r.useState)(!1),[N,w]=(0,r.useState)(null),[k,P]=(0,r.useState)(!1),[A,S]=(0,r.useState)(null),[C,F]=(0,r.useState)(!0),[E,L]=(0,r.useState)(!1);(0,r.useEffect)(()=>{T(),B()},[]);let T=async()=>{try{let e=await p.F.get("/settings");s(e),g(e.projectsBasePath)}catch(e){w("Failed to load settings")}finally{v(!1)}},B=async()=>{try{let e=await p.F.get("/database/status");S(e)}catch(e){}finally{F(!1)}},O=async()=>{L(!0);try{let e=await p.F.post("/database/refresh");S(e)}catch(e){}finally{L(!1)}},D=async()=>{b(!0),w(null),P(!1);try{let e=await p.F.put("/settings/projects-path",{path:f});e.success?(P(!0),g(e.path||f),setTimeout(()=>P(!1),3e3)):w(e.error||"Failed to save")}catch(e){w(e instanceof Error?e.message:"Failed to save")}finally{b(!1)}},I=t&&f!==t.projectsBasePath;return(0,a.jsxs)("div",{className:"flex min-h-screen flex-col",children:[(0,a.jsx)(l.Y,{title:e("settings.title"),showBack:!0,backHref:"/"}),(0,a.jsx)("main",{className:"flex-1 p-6",children:(0,a.jsxs)("div",{className:"mx-auto max-w-2xl space-y-8",children:[(0,a.jsxs)("section",{className:"rounded-lg border bg-card p-6",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10",children:(0,a.jsx)(o.A,{className:"h-5 w-5 text-primary"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:e("settings.projectsPath.title")}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:e("settings.projectsPath.description")})]})]}),j?(0,a.jsx)("div",{className:"flex items-center justify-center py-8",children:(0,a.jsx)(c.A,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.p,{value:f,onChange:e=>g(e.target.value),placeholder:"~/claudeship-projects",className:"font-mono text-sm"}),(0,a.jsx)(n.$,{onClick:D,disabled:y||!I,children:y?(0,a.jsx)(c.A,{className:"h-4 w-4 animate-spin"}):e("common.save")})]}),N&&(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-destructive",children:[(0,a.jsx)(d.A,{className:"h-4 w-4"}),N]}),k&&(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-green-600",children:[(0,a.jsx)(u.A,{className:"h-4 w-4"}),e("settings.projectsPath.saved")]}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:e("settings.projectsPath.note")})]})]}),(0,a.jsxs)("section",{className:"rounded-lg border bg-card p-6",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10",children:(0,a.jsx)(m.A,{className:"h-5 w-5 text-primary"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"데이터베이스 인프라"}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:"프로젝트별 데이터베이스 자동 관리"})]})]}),(0,a.jsx)(n.$,{variant:"ghost",size:"icon",onClick:O,disabled:E,children:(0,a.jsx)(h.A,{className:"h-4 w-4 ".concat(E?"animate-spin":"")})})]}),C?(0,a.jsx)("div",{className:"flex items-center justify-center py-8",children:(0,a.jsx)(c.A,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):A?(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-muted/50 p-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"h-3 w-3 rounded-full ".concat(A.docker.available?"bg-green-500":"bg-yellow-500")}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Docker"}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:A.docker.available?"v".concat(A.docker.version):"설치되지 않음 또는 실행 중이 아님"})]})]}),(0,a.jsx)("span",{className:"text-sm font-medium ".concat(A.docker.available?"text-green-600":"text-yellow-600"),children:A.docker.available?"실행 중":"비활성"})]}),(0,a.jsxs)("div",{className:"rounded-lg bg-muted/50 p-4",children:[(0,a.jsx)("p",{className:"text-sm text-muted-foreground mb-2",children:"기본 데이터베이스"}),(0,a.jsx)("div",{className:"flex items-center gap-2",children:"postgres_docker"===A.defaultProvider?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"flex h-8 w-8 items-center justify-center rounded bg-blue-500/10",children:(0,a.jsx)("span",{className:"text-xs font-bold text-blue-600",children:"PG"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"PostgreSQL (Docker)"}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"프로젝트별 독립 컨테이너"})]})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"flex h-8 w-8 items-center justify-center rounded bg-amber-500/10",children:(0,a.jsx)("span",{className:"text-xs font-bold text-amber-600",children:"SL"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"SQLite"}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"경량 파일 기반 DB (폴백)"})]})]})})]}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:A.docker.available?"Docker가 감지되어 새 프로젝트에 PostgreSQL이 자동으로 생성됩니다.":"Docker가 없어 SQLite로 폴백됩니다. Docker를 설치하면 PostgreSQL을 사용할 수 있습니다."})]}):(0,a.jsx)("p",{className:"text-sm text-muted-foreground py-4",children:"인프라 상태를 불러올 수 없습니다."})]})]})})]})}},3787:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},5338:(e,t,s)=>{"use strict";s.d(t,{p:()=>n});var a=s(8481),r=s(8526),l=s(9049);let n=r.forwardRef((e,t)=>{let{className:s,type:r,...n}=e;return(0,a.jsx)("input",{type:r,className:(0,l.cn)("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",s),ref:t,...n})});n.displayName="Input"},5594:(e,t,s)=>{"use strict";s.d(t,{$:()=>o});var a=s(8481),r=s(8526),l=s(4176),n=s(9049);let i=(0,l.F)("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),o=r.forwardRef((e,t)=>{let{className:s,variant:r,size:l,...o}=e;return(0,a.jsx)("button",{className:(0,n.cn)(i({variant:r,size:l,className:s})),ref:t,...o})});o.displayName="Button"},6569:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},7176:(e,t,s)=>{"use strict";s.d(t,{Y:()=>m});var a=s(8481),r=s(4816),l=s.n(r),n=s(9432),i=s(9150),o=s(7746),c=s(5594),d=s(9426);function u(){let{locale:e,setLocale:t,t:s}=(0,d.B)();return(0,a.jsx)(c.$,{variant:"ghost",size:"icon",onClick:()=>{t("en"===e?"ko":"en")},className:"h-9 w-9 text-xs font-medium",title:s("language.select"),children:"en"===e?"EN":"KO"})}function m(e){let{title:t,showBack:s,backHref:r="/"}=e,{t:m}=(0,d.B)(),h=t||m("common.appName");return(0,a.jsx)("header",{className:"sticky top-0 z-40 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:(0,a.jsxs)("div",{className:"flex h-14 w-full items-center justify-between px-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[s?(0,a.jsx)(l(),{href:r,children:(0,a.jsx)(c.$,{variant:"ghost",size:"icon",className:"h-9 w-9",children:(0,a.jsx)(i.A,{className:"h-5 w-5"})})}):(0,a.jsx)(n.default,{src:"/logo.svg",alt:"ClaudeShip",width:36,height:36,className:"rounded-lg"}),(0,a.jsx)("h1",{className:"text-lg font-semibold",children:h})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(u,{}),(0,a.jsx)(l(),{href:"/settings",children:(0,a.jsx)(c.$,{variant:"ghost",size:"icon",className:"h-9 w-9",title:m("header.settings"),children:(0,a.jsx)(o.A,{className:"h-5 w-5"})})})]})]})})}},8031:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},9049:(e,t,s)=>{"use strict";s.d(t,{cn:()=>l});var a=s(5806),r=s(4159);function l(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,r.QP)((0,a.$)(t))}},9426:(e,t,s)=>{"use strict";s.d(t,{B:()=>i});var a=s(4876),r=s(1203);let l={en:JSON.parse('{"common":{"appName":"ClaudeShip","loading":"Loading...","error":"Error","save":"Save","cancel":"Cancel","delete":"Delete","create":"Create","close":"Close","refresh":"Refresh","settings":"Settings"},"header":{"home":"Home","settings":"Settings"},"home":{"title":"My Projects","noProjects":"No projects yet","createFirst":"Create your first project to get started"},"project":{"create":"New Project","createDescription":"Build with AI","createTitle":"Create New Project","name":"Project Name","namePlaceholder":"my-awesome-app","type":"Project Type","typeWeb":"Web App","typeNative":"Native App","backendStack":"Backend Stack","backendNone":"Frontend Only","backendExpress":"Express (Node.js)","backendFastapi":"FastAPI (Python)","delete":"Delete Project","deleteConfirm":"Are you sure you want to delete this project?","updated":"Updated"},"chat":{"title":"Chat","placeholder":"Describe what you want to build...","askPlaceholder":"Ask a question about your project...","queuePlaceholder":"Queue another message...","send":"Send","thinking":"AI is thinking...","uploading":"Uploading files...","queueCount":"{count} message(s) queued","toolRunning":"Running","toolCompleted":"Completed","newConversation":"New Chat","modeAsk":"Ask","modeBuild":"Build"},"preview":{"title":"Preview","start":"Start Preview","stop":"Stop Preview","starting":"Starting...","notReady":"Project not ready for preview","waitForAI":"Wait for AI to create the project files","openInNewTab":"Open in New Tab"},"fileExplorer":{"title":"Files","empty":"No files yet","loading":"Loading files...","error":"Failed to load files","open":"Open File Explorer","close":"Close File Explorer"},"language":{"select":"Language","en":"English","ko":"한국어"},"settings":{"title":"Settings","projectsPath":{"title":"Projects Folder","description":"Location where your projects are stored","saved":"Settings saved successfully","note":"New projects will be created in this folder. Existing projects are not affected."}}}'),ko:JSON.parse('{"common":{"appName":"ClaudeShip","loading":"로딩 중...","error":"오류","save":"저장","cancel":"취소","delete":"삭제","create":"생성","close":"닫기","refresh":"새로고침","settings":"설정"},"header":{"home":"홈","settings":"설정"},"home":{"title":"내 프로젝트","noProjects":"프로젝트가 없습니다","createFirst":"첫 번째 프로젝트를 만들어 시작하세요"},"project":{"create":"새 프로젝트","createDescription":"AI와 함께 만들기","createTitle":"새 프로젝트 생성","name":"프로젝트 이름","namePlaceholder":"my-awesome-app","type":"프로젝트 유형","typeWeb":"웹 앱","typeNative":"네이티브 앱","backendStack":"백엔드 스택","backendNone":"프론트엔드 전용","backendExpress":"Express (Node.js)","backendFastapi":"FastAPI (Python)","delete":"프로젝트 삭제","deleteConfirm":"이 프로젝트를 삭제하시겠습니까?","updated":"업데이트"},"chat":{"title":"채팅","placeholder":"만들고 싶은 것을 설명하세요...","askPlaceholder":"프로젝트에 대해 질문하세요...","queuePlaceholder":"다음 메시지를 입력하세요...","send":"전송","thinking":"AI가 생각 중...","uploading":"파일 업로드 중...","queueCount":"{count}개의 메시지가 대기 중","toolRunning":"실행 중","toolCompleted":"완료","newConversation":"새 대화","modeAsk":"Ask","modeBuild":"Build"},"preview":{"title":"미리보기","start":"미리보기 시작","stop":"미리보기 중지","starting":"시작 중...","notReady":"프로젝트가 미리보기 준비가 되지 않았습니다","waitForAI":"AI가 프로젝트 파일을 생성할 때까지 기다려주세요","openInNewTab":"새 탭에서 열기"},"fileExplorer":{"title":"파일","empty":"파일이 없습니다","loading":"파일 로딩 중...","error":"파일 로드 실패","open":"파일 탐색기 열기","close":"파일 탐색기 닫기"},"language":{"select":"언어","en":"English","ko":"한국어"},"settings":{"title":"설정","projectsPath":{"title":"프로젝트 폴더","description":"프로젝트가 저장되는 위치","saved":"설정이 저장되었습니다","note":"새 프로젝트는 이 폴더에 생성됩니다. 기존 프로젝트에는 영향을 주지 않습니다."}}}')},n=(0,a.v)()((0,r.Zr)(e=>({locale:"ko",setLocale:t=>e({locale:t})}),{name:"claudeship-locale"}));function i(){let e=n(e=>e.locale);return{t:(t,s)=>(function(e,t,s){let a=t||n.getState().locale,r=e.split("."),i=l[a];for(let t of r)if(i&&"object"==typeof i&&t in i)i=i[t];else{for(let t of(i=l.en,r))if(!i||"object"!=typeof i||!(t in i))return e;else i=i[t];break}let o="string"==typeof i?i:e;if(s)for(let[e,t]of Object.entries(s))o=o.replace(RegExp("\\{".concat(e,"\\}"),"g"),String(t));return o})(t,e,s),locale:e,setLocale:n(e=>e.setLocale)}}},9696:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])}},e=>{e.O(0,[193,59,498,358],()=>e(e.s=2718)),_N_E=e.O()}]);
|
|
1
|
+
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[662],{660:(e,t,s)=>{"use strict";s.d(t,{F:()=>l});let a="http://localhost:14000/api";async function r(e,t){let s="".concat(a).concat(e),r=await fetch(s,{...t,headers:{"Content-Type":"application/json",...null==t?void 0:t.headers}});if(!r.ok)throw Error((await r.json().catch(()=>({message:"Request failed"}))).message||"HTTP error! status: ".concat(r.status));if(204!==r.status)return r.json()}let l={get:e=>r(e),post:(e,t)=>r(e,{method:"POST",body:t?JSON.stringify(t):void 0}),put:(e,t)=>r(e,{method:"PUT",body:t?JSON.stringify(t):void 0}),delete:(e,t)=>r(e,{method:"DELETE",body:t?JSON.stringify(t):void 0}),uploadFiles:async(e,t)=>{let s=new FormData;t.forEach(e=>s.append("files",e));let r="".concat(a,"/projects/").concat(e,"/files/upload"),l=await fetch(r,{method:"POST",body:s});if(!l.ok)throw Error((await l.json().catch(()=>({message:"Upload failed"}))).message||"HTTP error! status: ".concat(l.status));return l.json()}}},794:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("FolderOpen",[["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"}]])},2718:(e,t,s)=>{Promise.resolve().then(s.bind(s,3701))},3701:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>f});var a=s(8481),r=s(8526),l=s(7176),n=s(5594),i=s(5338),o=s(794),c=s(8031),d=s(9696),u=s(6569),m=s(1858),h=s(3787),p=s(660),x=s(9426);function f(){let{t:e}=(0,x.B)(),[t,s]=(0,r.useState)(null),[f,g]=(0,r.useState)(""),[j,v]=(0,r.useState)(!0),[y,b]=(0,r.useState)(!1),[N,w]=(0,r.useState)(null),[k,P]=(0,r.useState)(!1),[A,S]=(0,r.useState)(null),[C,F]=(0,r.useState)(!0),[E,L]=(0,r.useState)(!1);(0,r.useEffect)(()=>{T(),B()},[]);let T=async()=>{try{let e=await p.F.get("/settings");s(e),g(e.projectsBasePath)}catch(e){w("Failed to load settings")}finally{v(!1)}},B=async()=>{try{let e=await p.F.get("/database/status");S(e)}catch(e){}finally{F(!1)}},O=async()=>{L(!0);try{let e=await p.F.post("/database/refresh");S(e)}catch(e){}finally{L(!1)}},D=async()=>{b(!0),w(null),P(!1);try{let e=await p.F.put("/settings/projects-path",{path:f});e.success?(P(!0),g(e.path||f),setTimeout(()=>P(!1),3e3)):w(e.error||"Failed to save")}catch(e){w(e instanceof Error?e.message:"Failed to save")}finally{b(!1)}},I=t&&f!==t.projectsBasePath;return(0,a.jsxs)("div",{className:"flex min-h-screen flex-col",children:[(0,a.jsx)(l.Y,{title:e("settings.title"),showBack:!0,backHref:"/"}),(0,a.jsx)("main",{className:"flex-1 p-6",children:(0,a.jsxs)("div",{className:"mx-auto max-w-2xl space-y-8",children:[(0,a.jsxs)("section",{className:"rounded-lg border bg-card p-6",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10",children:(0,a.jsx)(o.A,{className:"h-5 w-5 text-primary"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:e("settings.projectsPath.title")}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:e("settings.projectsPath.description")})]})]}),j?(0,a.jsx)("div",{className:"flex items-center justify-center py-8",children:(0,a.jsx)(c.A,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(i.p,{value:f,onChange:e=>g(e.target.value),placeholder:"~/claudeship-projects",className:"font-mono text-sm"}),(0,a.jsx)(n.$,{onClick:D,disabled:y||!I,children:y?(0,a.jsx)(c.A,{className:"h-4 w-4 animate-spin"}):e("common.save")})]}),N&&(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-destructive",children:[(0,a.jsx)(d.A,{className:"h-4 w-4"}),N]}),k&&(0,a.jsxs)("div",{className:"flex items-center gap-2 text-sm text-green-600",children:[(0,a.jsx)(u.A,{className:"h-4 w-4"}),e("settings.projectsPath.saved")]}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:e("settings.projectsPath.note")})]})]}),(0,a.jsxs)("section",{className:"rounded-lg border bg-card p-6",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10",children:(0,a.jsx)(m.A,{className:"h-5 w-5 text-primary"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"데이터베이스 인프라"}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:"프로젝트별 데이터베이스 자동 관리"})]})]}),(0,a.jsx)(n.$,{variant:"ghost",size:"icon",onClick:O,disabled:E,children:(0,a.jsx)(h.A,{className:"h-4 w-4 ".concat(E?"animate-spin":"")})})]}),C?(0,a.jsx)("div",{className:"flex items-center justify-center py-8",children:(0,a.jsx)(c.A,{className:"h-6 w-6 animate-spin text-muted-foreground"})}):A?(0,a.jsxs)("div",{className:"space-y-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between rounded-lg bg-muted/50 p-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"h-3 w-3 rounded-full ".concat(A.docker.available?"bg-green-500":"bg-yellow-500")}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Docker"}),(0,a.jsx)("p",{className:"text-sm text-muted-foreground",children:A.docker.available?"v".concat(A.docker.version):"설치되지 않음 또는 실행 중이 아님"})]})]}),(0,a.jsx)("span",{className:"text-sm font-medium ".concat(A.docker.available?"text-green-600":"text-yellow-600"),children:A.docker.available?"실행 중":"비활성"})]}),(0,a.jsxs)("div",{className:"rounded-lg bg-muted/50 p-4",children:[(0,a.jsx)("p",{className:"text-sm text-muted-foreground mb-2",children:"기본 데이터베이스"}),(0,a.jsx)("div",{className:"flex items-center gap-2",children:"postgres_docker"===A.defaultProvider?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"flex h-8 w-8 items-center justify-center rounded bg-blue-500/10",children:(0,a.jsx)("span",{className:"text-xs font-bold text-blue-600",children:"PG"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"PostgreSQL (Docker)"}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"프로젝트별 독립 컨테이너"})]})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"flex h-8 w-8 items-center justify-center rounded bg-amber-500/10",children:(0,a.jsx)("span",{className:"text-xs font-bold text-amber-600",children:"SL"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"SQLite"}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"경량 파일 기반 DB (폴백)"})]})]})})]}),(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:A.docker.available?"Docker가 감지되어 새 프로젝트에 PostgreSQL이 자동으로 생성됩니다.":"Docker가 없어 SQLite로 폴백됩니다. Docker를 설치하면 PostgreSQL을 사용할 수 있습니다."})]}):(0,a.jsx)("p",{className:"text-sm text-muted-foreground py-4",children:"인프라 상태를 불러올 수 없습니다."})]})]})})]})}},3787:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},5338:(e,t,s)=>{"use strict";s.d(t,{p:()=>n});var a=s(8481),r=s(8526),l=s(9049);let n=r.forwardRef((e,t)=>{let{className:s,type:r,...n}=e;return(0,a.jsx)("input",{type:r,className:(0,l.cn)("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",s),ref:t,...n})});n.displayName="Input"},5594:(e,t,s)=>{"use strict";s.d(t,{$:()=>o});var a=s(8481),r=s(8526),l=s(4176),n=s(9049);let i=(0,l.F)("inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",{variants:{variant:{default:"bg-primary text-primary-foreground shadow hover:bg-primary/90",destructive:"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",outline:"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",secondary:"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2",sm:"h-8 rounded-md px-3 text-xs",lg:"h-10 rounded-md px-8",icon:"h-9 w-9"}},defaultVariants:{variant:"default",size:"default"}}),o=r.forwardRef((e,t)=>{let{className:s,variant:r,size:l,...o}=e;return(0,a.jsx)("button",{className:(0,n.cn)(i({variant:r,size:l,className:s})),ref:t,...o})});o.displayName="Button"},6569:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]])},7176:(e,t,s)=>{"use strict";s.d(t,{Y:()=>m});var a=s(8481),r=s(4816),l=s.n(r),n=s(9432),i=s(9150),o=s(7746),c=s(5594),d=s(9426);function u(){let{locale:e,setLocale:t,t:s}=(0,d.B)();return(0,a.jsx)(c.$,{variant:"ghost",size:"icon",onClick:()=>{t("en"===e?"ko":"en")},className:"h-9 w-9 text-xs font-medium",title:s("language.select"),children:"en"===e?"EN":"KO"})}function m(e){let{title:t,showBack:s,backHref:r="/"}=e,{t:m}=(0,d.B)(),h=t||m("common.appName");return(0,a.jsx)("header",{className:"sticky top-0 z-40 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60",children:(0,a.jsxs)("div",{className:"flex h-14 w-full items-center justify-between px-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[s?(0,a.jsx)(l(),{href:r,children:(0,a.jsx)(c.$,{variant:"ghost",size:"icon",className:"h-9 w-9",children:(0,a.jsx)(i.A,{className:"h-5 w-5"})})}):(0,a.jsx)(n.default,{src:"/logo.svg",alt:"ClaudeShip",width:36,height:36,className:"rounded-lg"}),(0,a.jsx)("h1",{className:"text-lg font-semibold",children:h})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1",children:[(0,a.jsx)(u,{}),(0,a.jsx)(l(),{href:"/settings",children:(0,a.jsx)(c.$,{variant:"ghost",size:"icon",className:"h-9 w-9",title:m("header.settings"),children:(0,a.jsx)(o.A,{className:"h-5 w-5"})})})]})]})})}},8031:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("LoaderCircle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},9049:(e,t,s)=>{"use strict";s.d(t,{cn:()=>l});var a=s(5806),r=s(4159);function l(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return(0,r.QP)((0,a.$)(t))}},9426:(e,t,s)=>{"use strict";s.d(t,{B:()=>i});var a=s(6386),r=s(6782);let l={en:JSON.parse('{"common":{"appName":"ClaudeShip","loading":"Loading...","error":"Error","save":"Save","cancel":"Cancel","delete":"Delete","create":"Create","close":"Close","refresh":"Refresh","settings":"Settings"},"header":{"home":"Home","settings":"Settings"},"home":{"title":"My Projects","noProjects":"No projects yet","createFirst":"Create your first project to get started"},"project":{"create":"New Project","createDescription":"Build with AI","createTitle":"Create New Project","name":"Project Name","namePlaceholder":"my-awesome-app","type":"Project Type","typeWeb":"Web App","typeNative":"Native App","backendStack":"Backend Stack","backendNone":"Frontend Only","backendExpress":"Express (Node.js)","backendFastapi":"FastAPI (Python)","delete":"Delete Project","deleteConfirm":"Are you sure you want to delete this project?","updated":"Updated"},"chat":{"title":"Chat","placeholder":"Describe what you want to build...","askPlaceholder":"Ask a question about your project...","queuePlaceholder":"Queue another message...","send":"Send","thinking":"AI is thinking...","uploading":"Uploading files...","queueCount":"{count} message(s) queued","toolRunning":"Running","toolCompleted":"Completed","newConversation":"New Chat","modeAsk":"Ask","modeBuild":"Build"},"preview":{"title":"Preview","start":"Start Preview","stop":"Stop Preview","starting":"Starting...","notReady":"Project not ready for preview","waitForAI":"Wait for AI to create the project files","openInNewTab":"Open in New Tab"},"fileExplorer":{"title":"Files","empty":"No files yet","loading":"Loading files...","error":"Failed to load files","open":"Open File Explorer","close":"Close File Explorer"},"language":{"select":"Language","en":"English","ko":"한국어"},"settings":{"title":"Settings","projectsPath":{"title":"Projects Folder","description":"Location where your projects are stored","saved":"Settings saved successfully","note":"New projects will be created in this folder. Existing projects are not affected."}}}'),ko:JSON.parse('{"common":{"appName":"ClaudeShip","loading":"로딩 중...","error":"오류","save":"저장","cancel":"취소","delete":"삭제","create":"생성","close":"닫기","refresh":"새로고침","settings":"설정"},"header":{"home":"홈","settings":"설정"},"home":{"title":"내 프로젝트","noProjects":"프로젝트가 없습니다","createFirst":"첫 번째 프로젝트를 만들어 시작하세요"},"project":{"create":"새 프로젝트","createDescription":"AI와 함께 만들기","createTitle":"새 프로젝트 생성","name":"프로젝트 이름","namePlaceholder":"my-awesome-app","type":"프로젝트 유형","typeWeb":"웹 앱","typeNative":"네이티브 앱","backendStack":"백엔드 스택","backendNone":"프론트엔드 전용","backendExpress":"Express (Node.js)","backendFastapi":"FastAPI (Python)","delete":"프로젝트 삭제","deleteConfirm":"이 프로젝트를 삭제하시겠습니까?","updated":"업데이트"},"chat":{"title":"채팅","placeholder":"만들고 싶은 것을 설명하세요...","askPlaceholder":"프로젝트에 대해 질문하세요...","queuePlaceholder":"다음 메시지를 입력하세요...","send":"전송","thinking":"AI가 생각 중...","uploading":"파일 업로드 중...","queueCount":"{count}개의 메시지가 대기 중","toolRunning":"실행 중","toolCompleted":"완료","newConversation":"새 대화","modeAsk":"Ask","modeBuild":"Build"},"preview":{"title":"미리보기","start":"미리보기 시작","stop":"미리보기 중지","starting":"시작 중...","notReady":"프로젝트가 미리보기 준비가 되지 않았습니다","waitForAI":"AI가 프로젝트 파일을 생성할 때까지 기다려주세요","openInNewTab":"새 탭에서 열기"},"fileExplorer":{"title":"파일","empty":"파일이 없습니다","loading":"파일 로딩 중...","error":"파일 로드 실패","open":"파일 탐색기 열기","close":"파일 탐색기 닫기"},"language":{"select":"언어","en":"English","ko":"한국어"},"settings":{"title":"설정","projectsPath":{"title":"프로젝트 폴더","description":"프로젝트가 저장되는 위치","saved":"설정이 저장되었습니다","note":"새 프로젝트는 이 폴더에 생성됩니다. 기존 프로젝트에는 영향을 주지 않습니다."}}}')},n=(0,a.v)()((0,r.Zr)(e=>({locale:"ko",setLocale:t=>e({locale:t})}),{name:"claudeship-locale"}));function i(){let e=n(e=>e.locale);return{t:(t,s)=>(function(e,t,s){let a=t||n.getState().locale,r=e.split("."),i=l[a];for(let t of r)if(i&&"object"==typeof i&&t in i)i=i[t];else{for(let t of(i=l.en,r))if(!i||"object"!=typeof i||!(t in i))return e;else i=i[t];break}let o="string"==typeof i?i:e;if(s)for(let[e,t]of Object.entries(s))o=o.replace(RegExp("\\{".concat(e,"\\}"),"g"),String(t));return o})(t,e,s),locale:e,setLocale:n(e=>e.setLocale)}}},9696:(e,t,s)=>{"use strict";s.d(t,{A:()=>a});let a=(0,s(8964).A)("CircleAlert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])}},e=>{e.O(0,[253,59,498,358],()=>e(e.s=2718)),_N_E=e.O()}]);
|