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 +15 -5
- package/dist/assets/{index-BQSevtzO.js β index-DpR-d7WJ.js} +2 -2
- package/dist/index.html +1 -1
- package/lib/server.d.ts.map +1 -1
- package/lib/server.js +48 -0
- package/lib/server.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -18,8 +18,18 @@
|
|
|
18
18
|
|
|
19
19
|
### Prerequisites
|
|
20
20
|
|
|
21
|
-
|
|
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/
|
|
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: [@
|
|
156
|
-
- Issues: [GitHub Issues](https://github.com/
|
|
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="
|
|
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-
|
|
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>
|
package/lib/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
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":"AAAA,OAAO,OAA8B,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
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.
|
|
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/
|
|
53
|
+
"url": "https://github.com/kubony/claude-code-visualizer.git"
|
|
54
54
|
},
|
|
55
55
|
"bugs": {
|
|
56
|
-
"url": "https://github.com/
|
|
56
|
+
"url": "https://github.com/kubony/claude-code-visualizer/issues"
|
|
57
57
|
},
|
|
58
|
-
"homepage": "https://github.com/
|
|
58
|
+
"homepage": "https://github.com/kubony/claude-code-visualizer#readme"
|
|
59
59
|
}
|