diff --git a/docs/assets/README.txt b/docs/assets/README.txt new file mode 100644 index 00000000..2b45ac48 --- /dev/null +++ b/docs/assets/README.txt @@ -0,0 +1 @@ +Place an optimized, muted, looping MP4 at assets/loop.mp4. Recommended: 1920x1080 or 1280x720, H.264, 24-30fps, 5-10MB, no audio. The site gracefully falls back to the dark CSS background if the video is absent. \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..45f5dac9 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,192 @@ + + + + + + + + PentestCode — Security, Orchestrated. + + + + + + +
+
+
+ + + + + +
+
+
+

01 AUTONOMOUS SECURITY OPERATIONS

+

PENTESTCODE

+

Security,
orchestrated.

+ +
+ + + +
SCROLL TO ENGAGE
+
+ +
+
+

02 THE ARCHITECTURE

+

One coordinator.
Specialized agents.
Shared context.

+
+ +
+
AGENTS
+
+
+ PENTEST + ORCHESTRATOR +
+
01RECON
+
02SCANNER
+
03WEB APP
+
04IDENTITY
+
05EXPLOIT
+
06REPORT
+ + + + + + + + +
+
+ +
+
+
+ + engagement://active + 01:42:17 +
+
+

$ pentestcode --target 10.0.0.42

+

01 coordinator initialized

+

02 dispatching reconnaissance agent ●

+

03 service enumeration synchronized ●

+

04 vulnerability analysis in progress ●

+

05 awaiting agent state...

+
+
+
+
+

03 ONE COMMAND

+

LET THE
AGENTS WORK.

+
+
+ +
+
+

04 ENGAGEMENT STATE

+

Context persists.
Relationships emerge.

+
+ +
+ +
+
+

05 SYSTEM CAPABILITIES

+
+
+
01MULTI-AGENTCOORDINATED SPECIALISTS
+
02PERSISTENT STATECONTEXT THAT SURVIVES
+
03PARALLEL OPERATIONSMORE WORK, LESS WAIT
+
0420+ PROVIDERSMODEL FLEXIBILITY
+
05ATTACK PATHSRELATIONSHIPS, NOT JUST FINDINGS
+
06REPORTINGFROM ENGAGEMENT TO OUTPUT
+
+
+ +
+
+

06 START AN ENGAGEMENT

+

ONE COMMAND.
THEN EVERYTHING MOVES.

+
+ $ + npm install -g pentestcode-ai + +
+
+
+ +
+
P
+

07 PENTESTCODE

+

RUN THE
ENGAGEMENT.

+ + OPEN GITHUB↗ + +
+
+ + + + + + \ No newline at end of file diff --git a/docs/script.js b/docs/script.js new file mode 100644 index 00000000..70a1148b --- /dev/null +++ b/docs/script.js @@ -0,0 +1,96 @@ +const $ = s => document.querySelector(s); +const $$ = s => [...document.querySelectorAll(s)]; + +const dot = $('.cursor-dot'); +const ring = $('.cursor-ring'); +let mx = innerWidth/2, my = innerHeight/2, rx = mx, ry = my; + +window.addEventListener('pointermove', e => { + mx=e.clientX; my=e.clientY; + if(dot){dot.style.left=mx+'px';dot.style.top=my+'px'} +}); +function cursorLoop(){ + rx += (mx-rx)*.13; ry += (my-ry)*.13; + if(ring){ring.style.left=rx+'px';ring.style.top=ry+'px'} + requestAnimationFrame(cursorLoop); +} +cursorLoop(); + +$$('.magnetic').forEach(el=>{ + el.addEventListener('pointermove',e=>{ + const r=el.getBoundingClientRect(), s=+(el.dataset.strength||10); + const x=(e.clientX-(r.left+r.width/2))/r.width*s; + const y=(e.clientY-(r.top+r.height/2))/r.height*s; + el.style.transform=`translate(${x}px,${y}px)`; + ring?.classList.add('hover'); + }); + el.addEventListener('pointerleave',()=>{el.style.transform='';ring?.classList.remove('hover')}); +}); + +$$('a,button,.arch-node,.graph-node,.cap').forEach(el=>{ + el.addEventListener('mouseenter',()=>ring?.classList.add('hover')); + el.addEventListener('mouseleave',()=>ring?.classList.remove('hover')); +}); + +// Subtle parallax without a framework. +const heroVisual=$('.hero-visual'); +window.addEventListener('pointermove',e=>{ + if(!heroVisual || innerWidth<901)return; + const x=(e.clientX/innerWidth-.5), y=(e.clientY/innerHeight-.5); + heroVisual.style.transform=`translate(${x*18}px,calc(-50% + ${y*12}px)) rotateY(${x*4}deg) rotateX(${-y*3}deg)`; +},{passive:true}); + +// Scroll choreography: sections translate their internal systems rather than simple reveal. +const arch=$('.architecture-stage'), terminal=$('.terminal-wrap'), graph=$('.state-graph'); +function clamp(v,a,b){return Math.max(a,Math.min(b,v))} +function scrollFX(){ + const vh=innerHeight; + const a=arch?.getBoundingClientRect(); + if(a){ + const p=clamp((vh-a.top)/(vh+a.height),0,1); + arch.style.transform=`perspective(1300px) rotateX(${(p-.5)*7}deg) translateY(${(p-.5)*-22}px)`; + } + const t=terminal?.getBoundingClientRect(); + if(t){ + const p=clamp((vh-t.top)/(vh+t.height),0,1); + terminal.style.transform=`perspective(1200px) rotateY(${(p-.5)*-9}deg) rotateX(${(p-.5)*3}deg) translateX(${(p-.5)*18}px)`; + } + const g=graph?.getBoundingClientRect(); + if(g){ + const p=clamp((vh-g.top)/(vh+g.height),0,1); + graph.style.transform=`perspective(1100px) rotateX(${(p-.5)*5}deg)`; + graph.querySelectorAll('.graph-node').forEach((n,i)=>{ + n.style.transform=`translate3d(${Math.sin(p*6+i)*5}px,${Math.cos(p*5+i)*5}px,${i*3}px)`; + }); + } + requestAnimationFrame(scrollFX); +} +scrollFX(); + +const copy=$('.copy'); +copy?.addEventListener('click',async()=>{ + try{ + await navigator.clipboard.writeText('npm install -g pentestcode-ai'); + copy.textContent='COPIED'; + setTimeout(()=>copy.textContent='COPY',1400); + }catch{copy.textContent='SELECT MANUALLY';} +}); + +// Tiny live terminal clock. +const clock=$('.terminal-top small:last-child'); +let start=Date.now(); +setInterval(()=>{ + if(!clock)return; + const s=Math.floor((Date.now()-start)/1000); + const h=String(Math.floor(s/3600)).padStart(2,'0'); + const m=String(Math.floor(s%3600/60)).padStart(2,'0'); + const sec=String(s%60).padStart(2,'0'); + clock.textContent=`${h}:${m}:${sec}`; +},1000); + +// Smooth active section accent. +const sections=$$('section'); +const observer=new IntersectionObserver(entries=>{ + entries.forEach(e=>e.target.classList.toggle('active',e.isIntersecting)); +},{threshold:.35}); +sections.forEach(s=>observer.observe(s)); diff --git a/docs/style.css b/docs/style.css new file mode 100644 index 00000000..d185af63 --- /dev/null +++ b/docs/style.css @@ -0,0 +1 @@ +*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:#070707;color:#f4f2ef;font-family:Inter,system-ui,sans-serif;overflow-x:hidden}.noise{position:fixed;inset:-50%;z-index:20;pointer-events:none;opacity:.035;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.9'/%3E%3C/svg%3E");animation:noise .18s steps(2) infinite}.site-bg{position:fixed;inset:0;z-index:-3;background:#070707;overflow:hidden}.site-bg video{width:100%;height:100%;object-fit:cover;opacity:.24;filter:saturate(.5) contrast(1.2)}.bg-vignette{position:absolute;inset:0;background:radial-gradient(circle at 55% 35%,transparent 0,rgba(7,7,7,.38) 42%,#070707 90%)}.grid{position:absolute;inset:0;opacity:.09;background-image:linear-gradient(rgba(255,255,255,.12) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.12) 1px,transparent 1px);background-size:80px 80px;mask-image:linear-gradient(to bottom,black,transparent 80%)}.nav{position:fixed;z-index:30;top:0;left:0;right:0;height:82px;padding:0 4vw;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid rgba(255,255,255,.07);backdrop-filter:blur(18px);background:rgba(7,7,7,.18)}.brand{display:flex;align-items:center;gap:11px;color:#fff;text-decoration:none;font:600 12px/1 "DM Mono",monospace;letter-spacing:.13em}.brand-mark{display:grid;place-items:center;width:28px;height:28px;border:1px solid rgba(255,255,255,.4);font:700 14px Inter;transform:skew(-8deg)}.dim{opacity:.35}.nav-meta{display:flex;gap:34px;align-items:center;font:500 10px "DM Mono",monospace;letter-spacing:.13em}.status{color:#aaa}.status i{display:inline-block;width:5px;height:5px;border-radius:50%;background:#ff4d3d;box-shadow:0 0 13px #ff4d3d;margin-right:8px}.nav-link{color:#eee;text-decoration:none}.section{position:relative;min-height:100vh;padding:130px 7vw}.hero{height:100vh;min-height:720px;padding-top:180px;display:flex;align-items:center}.hero-copy{position:relative;z-index:4;max-width:850px}.eyebrow{font:500 10px "DM Mono",monospace;letter-spacing:.16em;color:#999;margin:0 0 30px}.eyebrow span{color:#ff5848;margin-right:16px}.hero h1{font-size:clamp(76px,14vw,205px);line-height:.78;letter-spacing:-.085em;margin:0;white-space:nowrap;font-weight:800;transform:translateX(-.04em)}.hero h1 span{display:block;margin-left:.42em;color:transparent;-webkit-text-stroke:1px rgba(255,255,255,.65)}.hero-sub{font-size:clamp(25px,3vw,48px);line-height:.96;letter-spacing:-.04em;margin:42px 0 34px;color:#d8d5d1}.hero-sub em{color:#777;font-style:normal}.hero-actions{display:flex;gap:12px}.button{display:inline-flex;align-items:center;justify-content:space-between;gap:38px;height:50px;padding:0 18px;text-decoration:none;font:500 10px "DM Mono",monospace;letter-spacing:.08em;border:1px solid rgba(255,255,255,.2);transition:.3s ease}.button b{font-size:15px;font-weight:400}.button-primary{background:#f1efea;color:#080808;border-color:#f1efea}.button-primary:hover{background:#ff5949;border-color:#ff5949}.button-ghost{color:#eee}.button-ghost:hover{border-color:#aaa}.hero-visual{position:absolute;right:3vw;top:50%;width:min(50vw,680px);aspect-ratio:1;transform:translateY(-50%);opacity:.85}.orbital{position:absolute;inset:8%;border:1px solid rgba(255,255,255,.13);border-radius:50%;transform:rotate(26deg) skew(-10deg);animation:orbit 17s linear infinite}.o2{inset:20%;transform:rotate(-43deg) skew(13deg);animation-duration:11s;border-color:rgba(255,82,67,.3)}.o3{inset:1%;transform:rotate(75deg) skew(-18deg);animation-duration:28s;border-color:rgba(255,255,255,.08)}.core{position:absolute;left:50%;top:50%;width:150px;height:150px;transform:translate(-50%,-50%);border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.35);background:rgba(10,10,10,.58);backdrop-filter:blur(12px);box-shadow:0 0 70px rgba(255,69,54,.13),inset 0 0 35px rgba(255,255,255,.04)}.core-pulse{position:absolute;inset:-15px;border:1px solid rgba(255,70,55,.25);border-radius:50%;animation:pulse 2.8s ease-out infinite}.core-label{font:600 13px "DM Mono";letter-spacing:.08em}.core-code{font:9px "DM Mono";color:#777;margin-top:8px}.agent{position:absolute;font:500 9px "DM Mono";letter-spacing:.12em;display:flex;align-items:center;gap:7px;color:#bbb}.agent i{width:5px;height:5px;border-radius:50%;background:#ff5545;box-shadow:0 0 12px #ff5545}.a1{left:7%;top:20%}.a2{right:4%;top:30%}.a3{right:10%;bottom:17%}.a4{left:12%;bottom:13%}.hero-lines{position:absolute;inset:0;width:100%;height:100%;stroke:rgba(255,255,255,.12);stroke-width:1;fill:none;stroke-dasharray:4 8;animation:dash 12s linear infinite}.scroll-note{position:absolute;bottom:38px;left:7vw;font:500 9px "DM Mono";letter-spacing:.16em;color:#777}.scroll-note span{display:inline-block;width:35px;height:1px;background:#777;vertical-align:middle;margin-right:13px}.section-head{display:flex;justify-content:space-between;align-items:flex-start;position:relative;z-index:3}.section-note{font-size:clamp(18px,2vw,29px);line-height:1.02;letter-spacing:-.045em;color:#aaa;margin:0;text-align:right}.architecture{min-height:115vh}.architecture-stage{position:relative;height:650px;max-width:1200px;margin:20px auto 0}.arch-word{position:absolute;left:50%;top:45%;transform:translate(-50%,-50%);font-size:clamp(90px,16vw,220px);font-weight:800;letter-spacing:-.1em;color:rgba(255,255,255,.035);white-space:nowrap}.arch-center{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:170px;height:170px;border:1px solid rgba(255,255,255,.3);border-radius:50%;display:grid;place-content:center;text-align:center;background:#090909;z-index:3;box-shadow:0 0 100px rgba(255,67,51,.09)}.arch-center strong{font-size:16px;letter-spacing:-.04em}.arch-center small{font:9px "DM Mono";color:#777;margin-top:6px}.center-ring{position:absolute;inset:-22px;border:1px solid rgba(255,73,58,.22);border-radius:50%;animation:pulse 3s ease-out infinite}.arch-node{position:absolute;z-index:4;width:125px;padding:12px;border:1px solid rgba(255,255,255,.13);background:rgba(10,10,10,.7);backdrop-filter:blur(8px);font:10px "DM Mono";transition:transform .5s cubic-bezier(.2,.8,.2,1),border-color .3s}.arch-node:hover{transform:scale(1.08) translateY(-5px);border-color:#ff5545}.arch-node b{display:block;color:#ff5545;font-size:8px;margin-bottom:12px}.n1{left:3%;top:16%}.n2{left:27%;top:2%}.n3{left:45%;top:-2%}.n4{right:23%;top:7%}.n5{right:3%;top:20%}.n6{right:3%;bottom:12%}.arch-svg{position:absolute;inset:0;width:100%;height:100%;overflow:visible;fill:none;stroke:rgba(255,255,255,.13);stroke-width:1;stroke-dasharray:3 9;animation:dash 15s linear infinite}.terminal-section{min-height:120vh;display:flex;flex-direction:column;justify-content:center;gap:80px}.terminal-wrap{width:min(920px,100%);margin-left:auto;margin-right:5vw;background:rgba(8,8,8,.82);border:1px solid rgba(255,255,255,.14);box-shadow:0 40px 120px rgba(0,0,0,.35);transform:perspective(1200px) rotateY(-5deg) rotateX(2deg);transition:transform .2s ease}.terminal-top{height:38px;border-bottom:1px solid rgba(255,255,255,.1);display:flex;align-items:center;justify-content:space-between;padding:0 15px;font:9px "DM Mono";color:#666}.terminal-top span{display:flex;gap:5px}.terminal-top i{width:6px;height:6px;border-radius:50%;border:1px solid #555}.terminal-body{padding:38px 45px 55px;font:13px/2 "DM Mono";min-height:360px}.terminal-body p{margin:0}.terminal-body .muted{color:#666}.terminal-body .target{color:#ff5545}.log{color:#b9b7b4}.log b{color:#555;margin-right:14px}.log span{color:#ff5545}.dimmed{color:#555}.terminal-caret{width:7px;height:16px;background:#ff5545;display:inline-block;vertical-align:middle;animation:blink 1s steps(2) infinite}.terminal-caption{margin-left:7vw}.terminal-caption h2{font-size:clamp(55px,9vw,130px);line-height:.82;letter-spacing:-.085em;margin:0}.terminal-caption h2 span{color:transparent;-webkit-text-stroke:1px #eee}.state-section{min-height:110vh}.state-graph{height:560px;max-width:1200px;margin:45px auto 0;position:relative}.state-graph svg{position:absolute;inset:0;width:100%;height:100%;fill:none;stroke:rgba(255,255,255,.18);stroke-width:1;stroke-dasharray:3 8;animation:dash 14s linear infinite}.graph-node{position:absolute;z-index:2;min-width:145px;padding:15px 17px;border:1px solid rgba(255,255,255,.15);background:rgba(7,7,7,.8);backdrop-filter:blur(10px)}.graph-node small{display:block;font:8px "DM Mono";color:#777;margin-bottom:8px}.graph-node strong{font:500 10px "DM Mono";letter-spacing:.04em}.graph-node::after{content:"";position:absolute;inset:-5px;border:1px solid rgba(255,73,58,.12);opacity:0;transition:.4s}.graph-node:hover::after{opacity:1}.host{left:5%;top:37%}.service{left:31%;top:13%}.vuln{left:47%;top:42%}.cred{right:17%;top:18%}.access{right:3%;top:60%}.capabilities{min-height:100vh}.cap-list{margin-top:60px;border-top:1px solid rgba(255,255,255,.15)}.cap{display:grid;grid-template-columns:7% 1fr 28%;align-items:center;min-height:105px;border-bottom:1px solid rgba(255,255,255,.12);transition:padding .5s cubic-bezier(.2,.8,.2,1),background .4s}.cap span,.cap i{font:9px "DM Mono";color:#666}.cap strong{font-size:clamp(28px,5vw,72px);font-weight:700;letter-spacing:-.065em;line-height:1}.cap i{font-style:normal;text-align:right}.cap:hover{padding-left:22px;background:rgba(255,255,255,.025)}.cap:hover strong{color:#ff5848}.install{min-height:90vh;display:grid;place-items:center}.install-inner{width:min(1050px,100%)}.install h2{font-size:clamp(50px,8vw,115px);letter-spacing:-.08em;line-height:.82;margin:0 0 60px}.install h2 span{color:#666}.install-code{height:80px;border:1px solid rgba(255,255,255,.18);display:flex;align-items:center;padding:0 24px;background:rgba(255,255,255,.025);font:14px "DM Mono";transition:border-color .3s}.install-code:hover{border-color:#ff5848}.prompt{color:#ff5848;margin-right:15px}.copy{margin-left:auto;border:0;background:none;color:#888;font:9px "DM Mono";cursor:pointer}.copy:hover{color:#fff}.final{min-height:100vh;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;overflow:hidden}.final-mark{position:absolute;font-size:55vw;line-height:1;font-weight:900;letter-spacing:-.16em;color:rgba(255,255,255,.025);z-index:-1}.final h2{font-size:clamp(70px,13vw,190px);line-height:.76;letter-spacing:-.09em;margin:0 0 55px}.final h2 em{color:transparent;-webkit-text-stroke:1px rgba(255,255,255,.7);font-style:normal}footer{height:90px;border-top:1px solid rgba(255,255,255,.08);padding:0 7vw;display:flex;align-items:center;justify-content:space-between;font:9px "DM Mono";color:#666}footer a{color:#aaa;text-decoration:none}.cursor{position:fixed;pointer-events:none;z-index:100;mix-blend-mode:difference}.cursor-dot{width:5px;height:5px;background:#fff;border-radius:50%;transform:translate(-50%,-50%)}.cursor-ring{width:30px;height:30px;border:1px solid rgba(255,255,255,.7);border-radius:50%;transform:translate(-50%,-50%);transition:width .25s,height .25s,border-color .25s}.cursor-ring.hover{width:58px;height:58px;border-color:#ff5848}@keyframes orbit{to{transform:rotate(386deg) skew(-10deg)}}@keyframes dash{to{stroke-dashoffset:-200}}@keyframes pulse{0%{transform:scale(.8);opacity:.8}100%{transform:scale(1.35);opacity:0}}@keyframes blink{50%{opacity:0}}@keyframes noise{0%{transform:translate(0)}25%{transform:translate(2%,1%)}50%{transform:translate(-1%,-2%)}75%{transform:translate(1%,2%)}100%{transform:translate(-2%,-1%)}}@media(max-width:900px){.nav{height:68px}.nav-meta .status{display:none}.hero{padding-top:140px;min-height:850px}.hero h1{font-size:clamp(66px,16vw,130px)}.hero-visual{width:95vw;right:-28vw;opacity:.42}.hero-copy{margin-top:-130px}.section{padding:110px 6vw}.section-head{gap:30px}.architecture-stage{height:600px}.arch-node{width:105px}.n1{left:0}.n2{left:20%}.n3{left:42%}.n4{right:20%}.n5{right:0}.n6{right:0;bottom:6%}.terminal-wrap{margin:0;transform:none}.terminal-caption{margin-left:0}.state-graph{height:520px}.graph-node{min-width:125px}.host{left:0}.service{left:25%}.vuln{left:43%}.cred{right:8%}.access{right:0}.cap{grid-template-columns:10% 1fr}.cap i{display:none}footer{font-size:8px}.cursor{display:none}}@media(max-width:560px){.nav-link{display:none}.hero{min-height:760px}.hero-copy{margin-top:-180px}.hero h1{font-size:21vw}.hero-sub{font-size:27px}.hero-actions{flex-direction:column;align-items:flex-start}.hero-visual{right:-53vw;top:55%;width:120vw}.section-note{font-size:15px}.architecture-stage{height:520px}.arch-center{width:125px;height:125px}.arch-node{font-size:8px;width:92px;padding:9px}.n2{left:14%}.n3{top:7%}.n4{right:12%;top:9%}.terminal-body{padding:25px 20px;font-size:10px;min-height:300px}.terminal-caption h2{font-size:18vw}.state-graph{height:480px}.graph-node{min-width:105px;padding:10px}.graph-node strong{font-size:8px}.service{left:24%;top:5%}.vuln{left:37%;top:43%}.cred{right:0;top:25%}.access{right:0;top:70%}.cap{min-height:90px}.cap strong{font-size:27px}.install h2{font-size:15vw}.install-code{height:65px;padding:0 14px;font-size:10px;overflow:hidden}.install-code code{white-space:nowrap}.copy{font-size:8px}footer{height:auto;min-height:90px;gap:15px;flex-wrap:wrap;padding-top:22px;padding-bottom:22px}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.001ms!important;scroll-behavior:auto!important;transition:none!important}.site-bg video{display:none}} \ No newline at end of file