viewcc 1.0.0 β†’ 1.0.1

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/README.md CHANGED
@@ -18,8 +18,18 @@
18
18
 
19
19
  ### Prerequisites
20
20
 
21
- - [Claude Code](https://github.com/anthropics/claude-code) installed (optional)
22
- - Node.js 18+
21
+ **Required:**
22
+ - **Node.js 18+** - The visualizer runs on Node.js. [Download here](https://nodejs.org/)
23
+ - Includes `npx` (required to run the command)
24
+ - Check your version: `node --version`
25
+
26
+ **Project Requirements:**
27
+ - A **Claude Code project** with a `.claude/` directory
28
+ - If you don't have one, run `claude init` in your project folder
29
+ - Or use this tool to explore any existing Claude Code project
30
+
31
+ **Optional:**
32
+ - [Claude Code CLI](https://github.com/anthropics/claude-code) - For executing agents/skills from the UI
23
33
 
24
34
  ### Installation
25
35
 
@@ -59,7 +69,7 @@ If you want to modify or contribute:
59
69
 
60
70
  ```bash
61
71
  # Clone the repository
62
- git clone https://github.com/YOUR_USERNAME/claude-code-visualizer
72
+ git clone https://github.com/kubony/claude-code-visualizer
63
73
  cd claude-code-visualizer
64
74
 
65
75
  # Install dependencies
@@ -152,8 +162,8 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
152
162
 
153
163
  ## πŸ“§ Contact
154
164
 
155
- - GitHub: [@YOUR_USERNAME](https://github.com/YOUR_USERNAME)
156
- - Issues: [GitHub Issues](https://github.com/YOUR_USERNAME/claude-code-visualizer/issues)
165
+ - GitHub: [@kubony](https://github.com/kubony)
166
+ - Issues: [GitHub Issues](https://github.com/kubony/claude-code-visualizer/issues)
157
167
 
158
168
  ---
159
169
 
@@ -101,10 +101,10 @@ Error generating stack: `+i.message+`
101
101
  margin-top: 12px;
102
102
  font-size: 12px;
103
103
  }
104
- `})]})}const sp="http://localhost:3001";function ap({nodes:e,selectedNode:t}){const[n,r]=L.useState(""),[l,i]=L.useState(""),[o,u]=L.useState(!1),[s,f]=L.useState(""),[h,g]=L.useState(!1),m=e.filter(P=>P.type==="agent");e.filter(P=>P.type==="skill"),L.useEffect(()=>{t&&(tt(t)?(r(`(${t.name} μ—μ΄μ „νŠΈλ₯Ό μ‚¬μš©ν•΄μ„œ 처리)`),i(t.name)):ml(t)&&r(`${t.name} μŠ€ν‚¬μ„ μ‹€ν–‰ν•΄μ€˜`))},[t]);const w=async()=>{if(!n.trim()){f("⚠️ μ§€μ‹œμ‚¬ν•­μ„ μž…λ ₯ν•˜μ„Έμš”.");return}u(!0),f("");try{const P=await fetch(`${sp}/api/execute`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({instruction:n.trim(),skipPermissions:h})}),d=await P.json();P.ok?(f(`βœ… ${d.message}`),r(""),setTimeout(()=>f(""),5e3)):f(`❌ μ‹€ν–‰ μ‹€νŒ¨: ${d.error}`)}catch(P){f(`❌ μ„œλ²„ μ—°κ²° μ‹€νŒ¨: ${P instanceof Error?P.message:String(P)}`)}finally{u(!1)}},x=()=>{l&&r(P=>`${P}
104
+ `})]})}const sp="";function ap({nodes:e,selectedNode:t}){const[n,r]=L.useState(""),[l,i]=L.useState(""),[o,u]=L.useState(!1),[s,f]=L.useState(""),[h,g]=L.useState(!1),m=e.filter(P=>P.type==="agent");e.filter(P=>P.type==="skill"),L.useEffect(()=>{t&&(tt(t)?(r(`(${t.name} μ—μ΄μ „νŠΈλ₯Ό μ‚¬μš©ν•΄μ„œ 처리)`),i(t.name)):ml(t)&&r(`${t.name} μŠ€ν‚¬μ„ μ‹€ν–‰ν•΄μ€˜`))},[t]);const w=async()=>{if(!n.trim()){f("⚠️ μ§€μ‹œμ‚¬ν•­μ„ μž…λ ₯ν•˜μ„Έμš”.");return}u(!0),f("");try{const P=await fetch(`${sp}/api/execute`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({instruction:n.trim(),skipPermissions:h})}),d=await P.json();P.ok?(f(`βœ… ${d.message}`),r(""),setTimeout(()=>f(""),5e3)):f(`❌ μ‹€ν–‰ μ‹€νŒ¨: ${d.error}`)}catch(P){f(`❌ μ„œλ²„ μ—°κ²° μ‹€νŒ¨: ${P instanceof Error?P.message:String(P)}`)}finally{u(!1)}},x=()=>{l&&r(P=>`${P}
105
105
  (${l} μ—μ΄μ „νŠΈλ₯Ό μ‚¬μš©ν•΄μ„œ 처리)`.trim())},k=[{label:"볼트 정리",cmd:"볼트 μ •λ¦¬ν•΄μ€˜"},{label:"YAML 헀더 μΆ”κ°€",cmd:"YAML 헀더가 λˆ„λ½λœ νŒŒμΌλ“€μ— 헀더 μΆ”κ°€ν•΄μ€˜"},{label:"인물사전 μ—…λ°μ΄νŠΈ",cmd:"졜근 μΆ”κ°€λœ 인물 νŒŒμΌλ“€λ‘œ 인물사전 μ—…λ°μ΄νŠΈν•΄μ€˜"}];return c.jsxs("div",{className:"command-builder",children:[c.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[c.jsxs("select",{value:l,onChange:P=>i(P.target.value),className:"flex-1 px-3 py-2 bg-gray-800 border border-gray-700 rounded text-sm text-gray-300",children:[c.jsx("option",{value:"",children:"μ—μ΄μ „νŠΈ 선택..."}),m.map(P=>c.jsx("option",{value:P.name,children:P.name},P.id))]}),c.jsx("button",{onClick:x,disabled:!l,className:"px-4 py-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-700 disabled:text-gray-500 text-white text-sm rounded transition-colors",children:"μ‚½μž…"})]}),c.jsx("div",{className:"flex gap-2 mb-3 flex-wrap",children:k.map((P,d)=>c.jsx("button",{onClick:()=>r(P.cmd),className:"px-3 py-1 bg-gray-800 hover:bg-gray-700 text-gray-300 text-xs rounded transition-colors",children:P.label},d))}),c.jsx("textarea",{value:n,onChange:P=>r(P.target.value),placeholder:`Claude Code에 보낼 μ§€μ‹œμ‚¬ν•­μ„ μž…λ ₯ν•˜μ„Έμš”...
106
106
 
107
107
  μ˜ˆμ‹œ:
108
108
  - 볼트 μ •λ¦¬ν•΄μ€˜
109
109
  - YAML 헀더가 λˆ„λ½λœ νŒŒμΌλ“€ μ°Ύμ•„μ„œ μΆ”κ°€ν•΄μ€˜
110
- - vault-organizer μ—μ΄μ „νŠΈλ‘œ 전체 정리 μ‹€ν–‰`,className:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded text-gray-200 placeholder-gray-500 focus:border-blue-500 focus:outline-none resize-none",rows:4,disabled:o}),c.jsx("div",{className:"mt-3",children:c.jsxs("label",{className:"flex items-center gap-2 text-sm text-gray-400 hover:text-gray-300 cursor-pointer",children:[c.jsx("input",{type:"checkbox",checked:h,onChange:P=>g(P.target.checked),className:"w-4 h-4 rounded border-gray-600 bg-gray-800 text-blue-600 focus:ring-blue-500 focus:ring-offset-gray-900"}),c.jsx("span",{children:"κΆŒν•œ 확인 κ±΄λ„ˆλ›°κΈ° (--dangerously-skip-permissions)"}),c.jsx("span",{className:"text-xs text-yellow-500",children:"⚠️ μ‹ λ’°ν•  수 μžˆλŠ” ν”„λ‘œμ νŠΈμ—μ„œλ§Œ μ‚¬μš©"})]})}),c.jsxs("div",{className:"flex items-center gap-3 mt-3",children:[c.jsx("button",{onClick:w,disabled:o||!n.trim(),className:"px-6 py-2 bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 disabled:from-gray-700 disabled:to-gray-700 text-white font-medium rounded-lg transition-all transform hover:scale-105 disabled:scale-100 disabled:cursor-not-allowed flex items-center gap-2",children:o?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"animate-spin",children:"⏳"}),"μ‹€ν–‰ 쀑..."]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{children:"▢️"}),"μ‹€ν–‰"]})}),s&&c.jsx("div",{className:`flex-1 px-4 py-2 rounded text-sm ${s.startsWith("βœ…")?"bg-green-900/30 text-green-400 border border-green-700":"bg-red-900/30 text-red-400 border border-red-700"}`,children:s})]}),c.jsx("p",{className:"mt-3 text-xs text-gray-500",children:"πŸ’‘ μ‹€ν–‰ν•˜λ©΄ μƒˆλ‘œμš΄ Claude Code μ„Έμ…˜μ΄ μ‹œμž‘λ˜λ©°, μ‹€μ‹œκ°„ 진행상황은 μ•„λž˜ κ·Έλž˜ν”„μ™€ Activity Streamμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€."})]})}function cp(e="/api/graph-data"){const[t,n]=L.useState(null),[r,l]=L.useState(!0),[i,o]=L.useState(null),u=async()=>{l(!0),o(null);try{const s=await fetch(e);if(!s.ok)throw new Error(`Failed to load data: ${s.status} ${s.statusText}`);const f=await s.json();if(!f.nodes||!f.edges||!f.metadata)throw new Error("Invalid graph data structure");n(f)}catch(s){const f=s instanceof Error?s.message:"Unknown error occurred";o(f),console.error("Error loading graph data:",s)}finally{l(!1)}};return L.useEffect(()=>{u()},[e]),{data:t,loading:r,error:i,reload:u}}const fp="http://localhost:3001/events";function dp(e=!0){const[t,n]=L.useState(new Set),[r,l]=L.useState([]),[i,o]=L.useState(!1),[u,s]=L.useState(null),f=L.useCallback(m=>{const w=`${m.type}:${m.name}`;n(x=>{const k=new Set(x);return m.event==="start"?k.add(w):m.event==="end"&&k.delete(w),k}),l(x=>[...x.slice(-99),m])},[]);L.useEffect(()=>{if(!e){o(!1);return}let m=null,w=null;const x=()=>{try{m=new EventSource(fp),m.addEventListener("connected",()=>{o(!0),s(null),console.log("πŸ”— Activity stream connected")}),m.addEventListener("activity",k=>{try{const P=JSON.parse(k.data);f(P)}catch(P){console.error("Failed to parse activity event:",P)}}),m.onerror=()=>{o(!1),s("Connection lost. Retrying..."),m==null||m.close(),w=setTimeout(x,3e3)}}catch{s("Failed to connect to activity stream"),o(!1)}};return x(),()=>{m==null||m.close(),w&&clearTimeout(w)}},[e,f]);const h=L.useCallback(()=>{l([])},[]),g=L.useCallback(()=>{n(new Set)},[]);return{activeNodes:t,events:r,isConnected:i,error:u,clearEvents:h,clearActiveNodes:g}}const oi=240,os=140,us=200,ss=80;function pp(){const{data:e,loading:t,error:n,reload:r}=cp(),[l,i]=L.useState(null),[o,u]=L.useState(""),[s,f]=L.useState({}),[h,g]=L.useState({scale:1,x:0,y:0}),[m,w]=L.useState(0),[x,k]=L.useState(!0),[P,d]=L.useState(!0),[a,p]=L.useState(!1),[v,S]=L.useState(!1),{activeNodes:j,events:_,isConnected:z,error:K}=dp(x),R=L.useRef(null),q=L.useRef(null),Fe=L.useRef(null),Ze=L.useCallback((C,F)=>{const D={};C.forEach(I=>D[I.id]=0),F.forEach(I=>{D[I.source]=(D[I.source]||0)+1,D[I.target]=(D[I.target]||0)+1});const B=new Set,le=new Set;F.forEach(I=>{I.type==="calls"&&(le.add(I.source),B.add(I.target))});const M={},Le=C.filter(tt);Le.forEach(I=>{B.has(I.id)||F.some(me=>me.type==="calls"&&me.source===I.id)&&(M[I.id]=0)});const st=Le.filter(I=>M[I.id]===0).map(I=>I.id);for(;st.length>0;){const I=st.shift(),b=M[I];F.forEach(me=>{if(me.type==="calls"&&me.source===I){const ct=me.target;(M[ct]===void 0||M[ct]<b+1)&&(M[ct]=b+1,st.push(ct))}})}const at=Object.values(M).length>0?Math.max(...Object.values(M),0):0;Le.forEach(I=>{M[I.id]===void 0&&(M[I.id]=at+1)});const Cc=Math.max(...Object.values(M),0),Tt={};Le.forEach(I=>{const b=M[I.id];Tt[b]||(Tt[b]=[]),Tt[b].push(I)}),Object.keys(Tt).forEach(I=>{Tt[Number(I)].sort((b,me)=>D[me.id]-D[b.id])});const En={},Xo=100,Go=80;Object.keys(Tt).forEach(I=>{const b=Number(I);Tt[b].forEach((ct,_c)=>{En[ct.id]={x:Xo+b*(oi+us),y:Go+_c*(os+ss)}})});const Ml=C.filter(I=>!tt(I)),Rl={};Ml.forEach(I=>{const b=[];F.forEach(me=>{me.target===I.id&&En[me.source]&&b.push(En[me.source].y)}),Rl[I.id]=b.length>0?b.reduce((me,ct)=>me+ct,0)/b.length:1/0}),Ml.sort((I,b)=>Rl[I.id]-Rl[b.id]);const jc=Xo+(Cc+1)*(oi+us);return Ml.forEach((I,b)=>{En[I.id]={x:jc,y:Go+b*(os+ss)}}),En},[]);L.useEffect(()=>{e!=null&&e.nodes&&(e!=null&&e.edges)&&Object.keys(s).length===0&&f(Ze(e.nodes,e.edges))},[e,s,Ze]),L.useEffect(()=>{if(Object.keys(s).length>0){const C=requestAnimationFrame(()=>{w(F=>F+1)});return()=>cancelAnimationFrame(C)}},[s]),L.useCallback(C=>{const F=document.getElementById(C);if(!F||!R.current)return null;const D=F.getBoundingClientRect(),B=R.current.getBoundingClientRect(),le=D.left+D.width/2-B.left,M=D.top+D.height/2-B.top,Le=(le-h.x)/h.scale,st=(M-h.y)/h.scale;return{x:Le,y:st}},[h]);const mr=L.useCallback(C=>{const F=s[C.source],D=s[C.target];return!F||!D?null:{start:{x:F.x+oi,y:F.y+50},end:{x:D.x,y:D.y+50}}},[s]),Tl=L.useCallback((C,F)=>{if(C.button!==0)return;const D=s[F];D&&(q.current={nodeId:F,startPos:{...D},startMouse:{x:C.clientX,y:C.clientY}},C.preventDefault())},[s]),Sn=L.useCallback(C=>{C.button===0&&(q.current||(Fe.current={startX:C.clientX-h.x,startY:C.clientY-h.y},C.preventDefault()))},[h]),Nn=L.useCallback(C=>{if(q.current){const F=(C.clientX-q.current.startMouse.x)/h.scale,D=(C.clientY-q.current.startMouse.y)/h.scale;f(B=>({...B,[q.current.nodeId]:{x:q.current.startPos.x+F,y:q.current.startPos.y+D}}))}else Fe.current&&g(F=>({...F,x:C.clientX-Fe.current.startX,y:C.clientY-Fe.current.startY}))},[h.scale]),N=L.useCallback(()=>{q.current=null,Fe.current=null},[]),T=L.useCallback(C=>{var st;C.preventDefault();const F=C.deltaY>0?.9:1.1,D=Math.min(Math.max(h.scale*F,.3),2),B=(st=R.current)==null?void 0:st.getBoundingClientRect();if(!B)return;const le=C.clientX-B.left,M=C.clientY-B.top,Le=D-h.scale;g(at=>({scale:D,x:at.x-(le-at.x)*(Le/at.scale),y:at.y-(M-at.y)*(Le/at.scale)}))},[h]),{visibleNodes:O,highlightedEdges:Q}=L.useMemo(()=>{if(!e)return{visibleNodes:[],highlightedEdges:new Set};const C=M=>{if(!o)return!0;const Le=o.toLowerCase();return M.name.toLowerCase().includes(Le)||M.description.toLowerCase().includes(Le)},F=M=>M.type==="skill"&&(M.name.endsWith("-creator")||M.name==="agent-skill-visualizer"),D=M=>!a&&F(M)?!1:C(M),B=new Set;l&&(B.add(l.id),e.edges.forEach(M=>{M.source===l.id&&B.add(M.target),M.target===l.id&&B.add(M.source)}));const le=new Set;return l&&e.edges.forEach(M=>{(M.source===l.id||M.target===l.id)&&le.add(`${M.source}-${M.target}`)}),{visibleNodes:e.nodes.filter(D),highlightedEdges:le}},[e,o,l,a]);return t?c.jsx("div",{className:"min-h-screen bg-gray-900 flex items-center justify-center",children:c.jsxs("div",{className:"text-center",children:[c.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500 mx-auto mb-4"}),c.jsx("p",{className:"text-gray-400",children:"κ·Έλž˜ν”„ 데이터 λ‘œλ”© 쀑..."})]})}):n||!e?c.jsx("div",{className:"min-h-screen bg-gray-900 flex items-center justify-center",children:c.jsxs("div",{className:"text-center max-w-md px-4",children:[c.jsx("div",{className:"text-red-500 text-5xl mb-4",children:"⚠️"}),c.jsx("h1",{className:"text-xl font-bold text-white mb-2",children:"데이터 λ‘œλ“œ μ‹€νŒ¨"}),c.jsx("p",{className:"text-gray-400 mb-4",children:n}),c.jsx("button",{onClick:r,className:"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",children:"λ‹€μ‹œ μ‹œλ„"})]})}):c.jsxs("div",{className:"h-screen w-screen bg-gray-900 flex overflow-hidden",children:[c.jsxs("div",{className:"flex-1 relative",children:[c.jsxs("div",{className:"absolute top-4 left-4 right-4 z-20 flex items-center gap-4",children:[c.jsx("div",{className:"flex-1 max-w-md",children:c.jsx(op,{value:o,onChange:u})}),c.jsx("button",{onClick:()=>{f(Ze(e.nodes,e.edges)),g({scale:1,x:0,y:0})},className:"p-2 bg-gray-800 rounded-lg text-gray-400 hover:text-white hover:bg-gray-700 transition-colors",title:"λ ˆμ΄μ•„μ›ƒ μ΄ˆκΈ°ν™”",children:c.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:c.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})})]}),c.jsx("div",{className:"absolute bottom-4 left-4 z-20",children:c.jsx(ip,{metadata:e.metadata})}),c.jsxs("div",{className:"absolute top-4 right-4 z-20 flex items-center gap-2",children:[c.jsxs("button",{onClick:()=>p(!a),className:`px-3 py-2 rounded-lg transition-colors flex items-center gap-2 ${a?"bg-purple-600 text-white":"bg-gray-800 text-gray-400"}`,title:"Creator μŠ€ν‚¬ ν‘œμ‹œ/숨기기",children:[c.jsx("span",{className:"text-sm",children:"πŸ› οΈ"}),"Creator"]}),c.jsxs("button",{onClick:()=>d(!P),className:`px-3 py-2 rounded-lg transition-colors flex items-center gap-2 ${P?"bg-blue-600 text-white":"bg-gray-800 text-gray-400"}`,title:"Activity Stream νŒ¨λ„",children:[c.jsx("span",{className:`w-2 h-2 rounded-full ${z?"bg-green-400 animate-pulse":"bg-red-400"}`}),"Activity"]}),c.jsx("button",{onClick:()=>k(!x),className:`p-2 rounded-lg transition-colors ${x?"bg-green-600 text-white":"bg-gray-800 text-gray-400"}`,title:x?"Live λͺ¨λ“œ 끄기":"Live λͺ¨λ“œ 켜기",children:x?"πŸ”΄":"⏸️"})]}),P&&c.jsx("div",{className:"absolute top-16 right-4 z-20 w-72",children:c.jsx(up,{activeNodes:j,events:_,isConnected:z,error:K})}),c.jsx("div",{ref:R,className:"absolute inset-0 overflow-hidden cursor-grab active:cursor-grabbing",onMouseDown:Sn,onMouseMove:Nn,onMouseUp:N,onMouseLeave:N,onWheel:T,onClick:()=>i(null),children:c.jsxs("div",{style:{transform:`translate(${h.x}px, ${h.y}px) scale(${h.scale})`,transformOrigin:"0 0",width:"6000px",height:"4000px",position:"relative"},children:[c.jsx("svg",{className:"absolute inset-0 pointer-events-none z-10",style:{width:"6000px",height:"4000px"},children:e.edges.map(C=>{const F=mr(C);if(!F)return null;const D=`${C.source}-${C.target}`,B=Q.has(D),le=l&&!Q.has(D);return c.jsx(Ec,{start:F.start,end:F.end,type:C.type,isHighlighted:B,isDimmed:!!le},D)})}),O.map(C=>{const F=s[C.id];if(!F)return null;const D=l&&l.id!==C.id&&!e.edges.some(B=>B.source===l.id&&B.target===C.id||B.target===l.id&&B.source===C.id);return c.jsx("div",{style:{opacity:D?.3:1,transition:"opacity 0.2s"},children:c.jsx(Nc,{node:C,position:F,isSelected:(l==null?void 0:l.id)===C.id,isActive:j.has(C.id),onMouseDown:Tl,onClick:i})},C.id)})]})})]}),c.jsx("div",{className:`w-96 bg-gray-800 border-l border-gray-700 transition-transform duration-300 ${l?"translate-x-0":"translate-x-full"}`,style:{position:"absolute",right:0,top:0,bottom:0},children:c.jsx(lp,{node:l,data:e,onClose:()=>i(null),onOpenCommandModal:()=>S(!0)})}),v&&c.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm",children:c.jsxs("div",{className:"bg-gray-900 border border-gray-700 rounded-lg shadow-2xl max-w-3xl w-full mx-4 max-h-[80vh] overflow-y-auto",children:[c.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-gray-700",children:[c.jsxs("h2",{className:"text-xl font-bold text-white flex items-center gap-2",children:[c.jsx("span",{children:"⚑"}),"Claude Code μ‹€ν–‰"]}),c.jsx("button",{onClick:()=>S(!1),className:"text-gray-400 hover:text-white transition-colors","aria-label":"Close modal",children:c.jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:c.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),c.jsx("div",{className:"p-4",children:c.jsx(ap,{nodes:e.nodes,selectedNode:l})})]})})]})}Sc(document.getElementById("root")).render(c.jsx(L.StrictMode,{children:c.jsx(pp,{})}));
110
+ - vault-organizer μ—μ΄μ „νŠΈλ‘œ 전체 정리 μ‹€ν–‰`,className:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded text-gray-200 placeholder-gray-500 focus:border-blue-500 focus:outline-none resize-none",rows:4,disabled:o}),c.jsx("div",{className:"mt-3",children:c.jsxs("label",{className:"flex items-center gap-2 text-sm text-gray-400 hover:text-gray-300 cursor-pointer",children:[c.jsx("input",{type:"checkbox",checked:h,onChange:P=>g(P.target.checked),className:"w-4 h-4 rounded border-gray-600 bg-gray-800 text-blue-600 focus:ring-blue-500 focus:ring-offset-gray-900"}),c.jsx("span",{children:"κΆŒν•œ 확인 κ±΄λ„ˆλ›°κΈ° (--dangerously-skip-permissions)"}),c.jsx("span",{className:"text-xs text-yellow-500",children:"⚠️ μ‹ λ’°ν•  수 μžˆλŠ” ν”„λ‘œμ νŠΈμ—μ„œλ§Œ μ‚¬μš©"})]})}),c.jsxs("div",{className:"flex items-center gap-3 mt-3",children:[c.jsx("button",{onClick:w,disabled:o||!n.trim(),className:"px-6 py-2 bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 disabled:from-gray-700 disabled:to-gray-700 text-white font-medium rounded-lg transition-all transform hover:scale-105 disabled:scale-100 disabled:cursor-not-allowed flex items-center gap-2",children:o?c.jsxs(c.Fragment,{children:[c.jsx("span",{className:"animate-spin",children:"⏳"}),"μ‹€ν–‰ 쀑..."]}):c.jsxs(c.Fragment,{children:[c.jsx("span",{children:"▢️"}),"μ‹€ν–‰"]})}),s&&c.jsx("div",{className:`flex-1 px-4 py-2 rounded text-sm ${s.startsWith("βœ…")?"bg-green-900/30 text-green-400 border border-green-700":"bg-red-900/30 text-red-400 border border-red-700"}`,children:s})]}),c.jsx("p",{className:"mt-3 text-xs text-gray-500",children:"πŸ’‘ μ‹€ν–‰ν•˜λ©΄ μƒˆλ‘œμš΄ Claude Code μ„Έμ…˜μ΄ μ‹œμž‘λ˜λ©°, μ‹€μ‹œκ°„ 진행상황은 μ•„λž˜ κ·Έλž˜ν”„μ™€ Activity Streamμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€."})]})}function cp(e="/api/graph-data"){const[t,n]=L.useState(null),[r,l]=L.useState(!0),[i,o]=L.useState(null),u=async()=>{l(!0),o(null);try{const s=await fetch(e);if(!s.ok)throw new Error(`Failed to load data: ${s.status} ${s.statusText}`);const f=await s.json();if(!f.nodes||!f.edges||!f.metadata)throw new Error("Invalid graph data structure");n(f)}catch(s){const f=s instanceof Error?s.message:"Unknown error occurred";o(f),console.error("Error loading graph data:",s)}finally{l(!1)}};return L.useEffect(()=>{u()},[e]),{data:t,loading:r,error:i,reload:u}}const fp="/api/events";function dp(e=!0){const[t,n]=L.useState(new Set),[r,l]=L.useState([]),[i,o]=L.useState(!1),[u,s]=L.useState(null),f=L.useCallback(m=>{const w=`${m.type}:${m.name}`;n(x=>{const k=new Set(x);return m.event==="start"?k.add(w):m.event==="end"&&k.delete(w),k}),l(x=>[...x.slice(-99),m])},[]);L.useEffect(()=>{if(!e){o(!1);return}let m=null,w=null;const x=()=>{try{m=new EventSource(fp),m.addEventListener("connected",()=>{o(!0),s(null),console.log("πŸ”— Activity stream connected")}),m.addEventListener("activity",k=>{try{const P=JSON.parse(k.data);f(P)}catch(P){console.error("Failed to parse activity event:",P)}}),m.onerror=()=>{o(!1),s("Connection lost. Retrying..."),m==null||m.close(),w=setTimeout(x,3e3)}}catch{s("Failed to connect to activity stream"),o(!1)}};return x(),()=>{m==null||m.close(),w&&clearTimeout(w)}},[e,f]);const h=L.useCallback(()=>{l([])},[]),g=L.useCallback(()=>{n(new Set)},[]);return{activeNodes:t,events:r,isConnected:i,error:u,clearEvents:h,clearActiveNodes:g}}const oi=240,os=140,us=200,ss=80;function pp(){const{data:e,loading:t,error:n,reload:r}=cp(),[l,i]=L.useState(null),[o,u]=L.useState(""),[s,f]=L.useState({}),[h,g]=L.useState({scale:1,x:0,y:0}),[m,w]=L.useState(0),[x,k]=L.useState(!0),[P,d]=L.useState(!0),[a,p]=L.useState(!1),[v,S]=L.useState(!1),{activeNodes:j,events:_,isConnected:z,error:K}=dp(x),R=L.useRef(null),q=L.useRef(null),Fe=L.useRef(null),Ze=L.useCallback((C,F)=>{const D={};C.forEach(I=>D[I.id]=0),F.forEach(I=>{D[I.source]=(D[I.source]||0)+1,D[I.target]=(D[I.target]||0)+1});const B=new Set,le=new Set;F.forEach(I=>{I.type==="calls"&&(le.add(I.source),B.add(I.target))});const M={},Le=C.filter(tt);Le.forEach(I=>{B.has(I.id)||F.some(me=>me.type==="calls"&&me.source===I.id)&&(M[I.id]=0)});const st=Le.filter(I=>M[I.id]===0).map(I=>I.id);for(;st.length>0;){const I=st.shift(),b=M[I];F.forEach(me=>{if(me.type==="calls"&&me.source===I){const ct=me.target;(M[ct]===void 0||M[ct]<b+1)&&(M[ct]=b+1,st.push(ct))}})}const at=Object.values(M).length>0?Math.max(...Object.values(M),0):0;Le.forEach(I=>{M[I.id]===void 0&&(M[I.id]=at+1)});const Cc=Math.max(...Object.values(M),0),Tt={};Le.forEach(I=>{const b=M[I.id];Tt[b]||(Tt[b]=[]),Tt[b].push(I)}),Object.keys(Tt).forEach(I=>{Tt[Number(I)].sort((b,me)=>D[me.id]-D[b.id])});const En={},Xo=100,Go=80;Object.keys(Tt).forEach(I=>{const b=Number(I);Tt[b].forEach((ct,_c)=>{En[ct.id]={x:Xo+b*(oi+us),y:Go+_c*(os+ss)}})});const Ml=C.filter(I=>!tt(I)),Rl={};Ml.forEach(I=>{const b=[];F.forEach(me=>{me.target===I.id&&En[me.source]&&b.push(En[me.source].y)}),Rl[I.id]=b.length>0?b.reduce((me,ct)=>me+ct,0)/b.length:1/0}),Ml.sort((I,b)=>Rl[I.id]-Rl[b.id]);const jc=Xo+(Cc+1)*(oi+us);return Ml.forEach((I,b)=>{En[I.id]={x:jc,y:Go+b*(os+ss)}}),En},[]);L.useEffect(()=>{e!=null&&e.nodes&&(e!=null&&e.edges)&&Object.keys(s).length===0&&f(Ze(e.nodes,e.edges))},[e,s,Ze]),L.useEffect(()=>{if(Object.keys(s).length>0){const C=requestAnimationFrame(()=>{w(F=>F+1)});return()=>cancelAnimationFrame(C)}},[s]),L.useCallback(C=>{const F=document.getElementById(C);if(!F||!R.current)return null;const D=F.getBoundingClientRect(),B=R.current.getBoundingClientRect(),le=D.left+D.width/2-B.left,M=D.top+D.height/2-B.top,Le=(le-h.x)/h.scale,st=(M-h.y)/h.scale;return{x:Le,y:st}},[h]);const mr=L.useCallback(C=>{const F=s[C.source],D=s[C.target];return!F||!D?null:{start:{x:F.x+oi,y:F.y+50},end:{x:D.x,y:D.y+50}}},[s]),Tl=L.useCallback((C,F)=>{if(C.button!==0)return;const D=s[F];D&&(q.current={nodeId:F,startPos:{...D},startMouse:{x:C.clientX,y:C.clientY}},C.preventDefault())},[s]),Sn=L.useCallback(C=>{C.button===0&&(q.current||(Fe.current={startX:C.clientX-h.x,startY:C.clientY-h.y},C.preventDefault()))},[h]),Nn=L.useCallback(C=>{if(q.current){const F=(C.clientX-q.current.startMouse.x)/h.scale,D=(C.clientY-q.current.startMouse.y)/h.scale;f(B=>({...B,[q.current.nodeId]:{x:q.current.startPos.x+F,y:q.current.startPos.y+D}}))}else Fe.current&&g(F=>({...F,x:C.clientX-Fe.current.startX,y:C.clientY-Fe.current.startY}))},[h.scale]),N=L.useCallback(()=>{q.current=null,Fe.current=null},[]),T=L.useCallback(C=>{var st;C.preventDefault();const F=C.deltaY>0?.9:1.1,D=Math.min(Math.max(h.scale*F,.3),2),B=(st=R.current)==null?void 0:st.getBoundingClientRect();if(!B)return;const le=C.clientX-B.left,M=C.clientY-B.top,Le=D-h.scale;g(at=>({scale:D,x:at.x-(le-at.x)*(Le/at.scale),y:at.y-(M-at.y)*(Le/at.scale)}))},[h]),{visibleNodes:O,highlightedEdges:Q}=L.useMemo(()=>{if(!e)return{visibleNodes:[],highlightedEdges:new Set};const C=M=>{if(!o)return!0;const Le=o.toLowerCase();return M.name.toLowerCase().includes(Le)||M.description.toLowerCase().includes(Le)},F=M=>M.type==="skill"&&(M.name.endsWith("-creator")||M.name==="agent-skill-visualizer"),D=M=>!a&&F(M)?!1:C(M),B=new Set;l&&(B.add(l.id),e.edges.forEach(M=>{M.source===l.id&&B.add(M.target),M.target===l.id&&B.add(M.source)}));const le=new Set;return l&&e.edges.forEach(M=>{(M.source===l.id||M.target===l.id)&&le.add(`${M.source}-${M.target}`)}),{visibleNodes:e.nodes.filter(D),highlightedEdges:le}},[e,o,l,a]);return t?c.jsx("div",{className:"min-h-screen bg-gray-900 flex items-center justify-center",children:c.jsxs("div",{className:"text-center",children:[c.jsx("div",{className:"animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500 mx-auto mb-4"}),c.jsx("p",{className:"text-gray-400",children:"κ·Έλž˜ν”„ 데이터 λ‘œλ”© 쀑..."})]})}):n||!e?c.jsx("div",{className:"min-h-screen bg-gray-900 flex items-center justify-center",children:c.jsxs("div",{className:"text-center max-w-md px-4",children:[c.jsx("div",{className:"text-red-500 text-5xl mb-4",children:"⚠️"}),c.jsx("h1",{className:"text-xl font-bold text-white mb-2",children:"데이터 λ‘œλ“œ μ‹€νŒ¨"}),c.jsx("p",{className:"text-gray-400 mb-4",children:n}),c.jsx("button",{onClick:r,className:"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",children:"λ‹€μ‹œ μ‹œλ„"})]})}):c.jsxs("div",{className:"h-screen w-screen bg-gray-900 flex overflow-hidden",children:[c.jsxs("div",{className:"flex-1 relative",children:[c.jsxs("div",{className:"absolute top-4 left-4 right-4 z-20 flex items-center gap-4",children:[c.jsx("div",{className:"flex-1 max-w-md",children:c.jsx(op,{value:o,onChange:u})}),c.jsx("button",{onClick:()=>{f(Ze(e.nodes,e.edges)),g({scale:1,x:0,y:0})},className:"p-2 bg-gray-800 rounded-lg text-gray-400 hover:text-white hover:bg-gray-700 transition-colors",title:"λ ˆμ΄μ•„μ›ƒ μ΄ˆκΈ°ν™”",children:c.jsx("svg",{className:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:c.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})})]}),c.jsx("div",{className:"absolute bottom-4 left-4 z-20",children:c.jsx(ip,{metadata:e.metadata})}),c.jsxs("div",{className:"absolute top-4 right-4 z-20 flex items-center gap-2",children:[c.jsxs("button",{onClick:()=>p(!a),className:`px-3 py-2 rounded-lg transition-colors flex items-center gap-2 ${a?"bg-purple-600 text-white":"bg-gray-800 text-gray-400"}`,title:"Creator μŠ€ν‚¬ ν‘œμ‹œ/숨기기",children:[c.jsx("span",{className:"text-sm",children:"πŸ› οΈ"}),"Creator"]}),c.jsxs("button",{onClick:()=>d(!P),className:`px-3 py-2 rounded-lg transition-colors flex items-center gap-2 ${P?"bg-blue-600 text-white":"bg-gray-800 text-gray-400"}`,title:"Activity Stream νŒ¨λ„",children:[c.jsx("span",{className:`w-2 h-2 rounded-full ${z?"bg-green-400 animate-pulse":"bg-red-400"}`}),"Activity"]}),c.jsx("button",{onClick:()=>k(!x),className:`p-2 rounded-lg transition-colors ${x?"bg-green-600 text-white":"bg-gray-800 text-gray-400"}`,title:x?"Live λͺ¨λ“œ 끄기":"Live λͺ¨λ“œ 켜기",children:x?"πŸ”΄":"⏸️"})]}),P&&c.jsx("div",{className:"absolute top-16 right-4 z-20 w-72",children:c.jsx(up,{activeNodes:j,events:_,isConnected:z,error:K})}),c.jsx("div",{ref:R,className:"absolute inset-0 overflow-hidden cursor-grab active:cursor-grabbing",onMouseDown:Sn,onMouseMove:Nn,onMouseUp:N,onMouseLeave:N,onWheel:T,onClick:()=>i(null),children:c.jsxs("div",{style:{transform:`translate(${h.x}px, ${h.y}px) scale(${h.scale})`,transformOrigin:"0 0",width:"6000px",height:"4000px",position:"relative"},children:[c.jsx("svg",{className:"absolute inset-0 pointer-events-none z-10",style:{width:"6000px",height:"4000px"},children:e.edges.map(C=>{const F=mr(C);if(!F)return null;const D=`${C.source}-${C.target}`,B=Q.has(D),le=l&&!Q.has(D);return c.jsx(Ec,{start:F.start,end:F.end,type:C.type,isHighlighted:B,isDimmed:!!le},D)})}),O.map(C=>{const F=s[C.id];if(!F)return null;const D=l&&l.id!==C.id&&!e.edges.some(B=>B.source===l.id&&B.target===C.id||B.target===l.id&&B.source===C.id);return c.jsx("div",{style:{opacity:D?.3:1,transition:"opacity 0.2s"},children:c.jsx(Nc,{node:C,position:F,isSelected:(l==null?void 0:l.id)===C.id,isActive:j.has(C.id),onMouseDown:Tl,onClick:i})},C.id)})]})})]}),c.jsx("div",{className:`w-96 bg-gray-800 border-l border-gray-700 transition-transform duration-300 ${l?"translate-x-0":"translate-x-full"}`,style:{position:"absolute",right:0,top:0,bottom:0},children:c.jsx(lp,{node:l,data:e,onClose:()=>i(null),onOpenCommandModal:()=>S(!0)})}),v&&c.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 backdrop-blur-sm",children:c.jsxs("div",{className:"bg-gray-900 border border-gray-700 rounded-lg shadow-2xl max-w-3xl w-full mx-4 max-h-[80vh] overflow-y-auto",children:[c.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-gray-700",children:[c.jsxs("h2",{className:"text-xl font-bold text-white flex items-center gap-2",children:[c.jsx("span",{children:"⚑"}),"Claude Code μ‹€ν–‰"]}),c.jsx("button",{onClick:()=>S(!1),className:"text-gray-400 hover:text-white transition-colors","aria-label":"Close modal",children:c.jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:c.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),c.jsx("div",{className:"p-4",children:c.jsx(ap,{nodes:e.nodes,selectedNode:l})})]})})]})}Sc(document.getElementById("root")).render(c.jsx(L.StrictMode,{children:c.jsx(pp,{})}));
package/dist/index.html CHANGED
@@ -14,7 +14,7 @@
14
14
  overflow: hidden;
15
15
  }
16
16
  </style>
17
- <script type="module" crossorigin src="./assets/index-BQSevtzO.js"></script>
17
+ <script type="module" crossorigin src="./assets/index-DpR-d7WJ.js"></script>
18
18
  <link rel="stylesheet" crossorigin href="./assets/index-lL8g_3Ei.css">
19
19
  </head>
20
20
  <body>
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAkFzE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAG9B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAuIzE"}
package/lib/server.js CHANGED
@@ -1,11 +1,14 @@
1
1
  import express from 'express';
2
2
  import * as fs from 'fs/promises';
3
3
  import * as path from 'path';
4
+ import { exec } from 'child_process';
4
5
  /**
5
6
  * Start the Express server for serving the visualizer webapp
6
7
  */
7
8
  export async function startServer(options) {
8
9
  const app = express();
10
+ // Parse JSON request bodies
11
+ app.use(express.json());
9
12
  // CORS headers for development
10
13
  app.use((req, res, next) => {
11
14
  res.header('Access-Control-Allow-Origin', '*');
@@ -13,6 +16,51 @@ export async function startServer(options) {
13
16
  res.header('Access-Control-Allow-Headers', 'Content-Type');
14
17
  next();
15
18
  });
19
+ // API: Execute Claude Code commands
20
+ app.post('/api/execute', (req, res) => {
21
+ const { instruction, skipPermissions } = req.body;
22
+ // Validate instruction
23
+ if (!instruction || typeof instruction !== 'string' || !instruction.trim()) {
24
+ return res.status(400).json({ error: 'instruction is required and must be a non-empty string' });
25
+ }
26
+ // Build Claude Code command
27
+ const flag = skipPermissions ? '--dangerously-skip-permissions ' : '';
28
+ const escapedInstruction = instruction.replace(/'/g, "'\\''");
29
+ const claudeCmd = `claude ${flag}'${escapedInstruction}'`;
30
+ // Platform-specific terminal command
31
+ let terminalCmd;
32
+ const platform = process.platform;
33
+ if (platform === 'darwin') {
34
+ // macOS - AppleScript
35
+ const projectPath = options.projectRoot.replace(/'/g, "'\\''");
36
+ const escapedClaudeCmd = claudeCmd.replace(/'/g, "'\\''");
37
+ const applescript = `tell application "Terminal"\nactivate\ndo script "cd '${projectPath}' && ${escapedClaudeCmd}"\nend tell`;
38
+ terminalCmd = `osascript -e '${applescript.replace(/'/g, "'\\''")}'`;
39
+ }
40
+ else if (platform === 'win32') {
41
+ // Windows
42
+ terminalCmd = `start cmd /K "cd /d "${options.projectRoot}" && ${claudeCmd}"`;
43
+ }
44
+ else {
45
+ // Linux
46
+ terminalCmd = `gnome-terminal -- bash -c "cd '${options.projectRoot}' && ${claudeCmd}; exec bash"`;
47
+ }
48
+ // Execute terminal command
49
+ exec(terminalCmd, (error) => {
50
+ if (error) {
51
+ console.error('Execute error:', error);
52
+ return res.status(500).json({
53
+ error: error.message,
54
+ message: 'Failed to open terminal. Make sure your terminal application is available.'
55
+ });
56
+ }
57
+ res.json({
58
+ status: 'started',
59
+ instruction,
60
+ message: 'Terminal started with Claude Code command'
61
+ });
62
+ });
63
+ });
16
64
  // API: Serve graph data from user's project
17
65
  app.get('/api/graph-data', async (req, res) => {
18
66
  try {
package/lib/server.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "viewcc",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Interactive visualization for Claude Code projects - run with npx",
5
5
  "main": "./lib/cli.js",
6
6
  "bin": {
@@ -50,10 +50,10 @@
50
50
  },
51
51
  "repository": {
52
52
  "type": "git",
53
- "url": "https://github.com/YOUR_USERNAME/claude-code-visualizer.git"
53
+ "url": "https://github.com/kubony/claude-code-visualizer.git"
54
54
  },
55
55
  "bugs": {
56
- "url": "https://github.com/YOUR_USERNAME/claude-code-visualizer/issues"
56
+ "url": "https://github.com/kubony/claude-code-visualizer/issues"
57
57
  },
58
- "homepage": "https://github.com/YOUR_USERNAME/claude-code-visualizer#readme"
58
+ "homepage": "https://github.com/kubony/claude-code-visualizer#readme"
59
59
  }