diff --git a/README.md b/README.md index d622534..086687d 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,10 @@ Documentation

+

+ Open the interactive project guide → +

+ --- ## Why Codesemble? diff --git a/artifacts/CHECKSUMS.sha256 b/artifacts/CHECKSUMS.sha256 index 5cfc299..c9ccfe1 100644 --- a/artifacts/CHECKSUMS.sha256 +++ b/artifacts/CHECKSUMS.sha256 @@ -21,14 +21,20 @@ ca34cfa4c7ad03edfc6b1dcf764fe44f6cb3465480f7177392ecf2c22e3c979c assets/social/ 11bb7eb8dc8752d0320f00b10d356c950c00b029394562c13da58a8421fa3b23 CHANGELOG.md 8237734d45581f5ae60b5c0ba597b729846e8a5dcd3d3d50a6535fd0d09f6a5f CODE_OF_CONDUCT.md e5f38de7b71097b9017788638f7972d9e45e6ea98022131290f4742eaca0e66d CONTRIBUTING.md +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 docs/.nojekyll 436f4f88fe38c9371ada5091b152e180f1399668d29691cf3293f7f9899673b8 docs/ARCHITECTURE.md +d452b9a068b7edf94b916e093755563701a0a9aed9fae914d857421377087e89 docs/assets/codsemble-concept-native-compiler.webp +beaae606bcf49d4c99490daec3cfafff54b5ceb41765a9bffb832bfb2136acd2 docs/assets/codsemble-prism-flow.webp f929dfc14de476c5ed1ce3c6e27f4cb9d7c9c45f7d3884c9b793174b74a1397c docs/BRAND.md f41132adc833328e17b1e304ef41c4a3f72401b674d997f56269b3481e7b45d6 docs/CONFIG_SAFETY.md 015308700a7ceb71a073b7e7a619d44ec3367db0a33a49b73aab4f3346c209ab docs/DEFINITION_OF_DONE.md +2e259a451763d030d30864a118c0c7e9302fb0d0413d21a0280244230d48e40c docs/index.html 7f585f942f10a18f836b53d822028f39a2d5b6bf91f16b1218ab73aeee140047 docs/MIGRATION_V0_2.md 7b1b0fae02c9f36405ab7ca0ac97b5bf69e71b23a23e9e7ab8af484170fdd8ee docs/PRIVACY.md 5a54e204e4c0e9357442784225835f2bf0c865fb174351d175b4167e990addf9 docs/PROJECT_CAPABILITY_COMPILER.md 5bbc7300b711e5e25085d3282e2e234f264baf96d189305e33e5fd9e7832d3de docs/ROLE_CATALOG.md +38447c010dda4a69fe2c5963dd205366797901eb6865e95abd1507f5f16aca9c docs/script.js +2f12582b7da4af3174bb8630900ce8f2e6ef01c5e5d999ab248d5e24031bc1df docs/styles.css a992f4b3cb388bac1a5d43b9a31a13be80505778894211aa46761e64e4fe56af docs/THREAT_MODEL.md e03c31ce5087e8a203f2500791228e3c5fa9dfbb8bebf2f7352e2c31e14ee93e docs/USAGE.md 05575afa5edbb76589ee5ee00fcc3b1a07cb62a02c2b42fa204115c4e4742540 docs/USEFULNESS_COMPARISON.md @@ -54,7 +60,7 @@ ec89a95f29bb67625a44663c08b0939cf522158cd094e31015b83c1a20c2062b plugins/codsem a6689d5a15007ba0942ca9ff9538be7a3fc8e1c4b0993191b928063161f57098 plugins/codsemble/skills/update-team/agents/openai.yaml d9297755666b1e88886564fc71bc060872d813c9fe043dd94954a210612491ba plugins/codsemble/skills/update-team/SKILL.md 152eb46211db24f9e4bdb3dd38a11ab0aa7ea6a19bc8a95c0b5d9521fc8ed289 PROJECT_GOAL.md -ffc6a562725255b92d420ecf5b25421573dc386c97052a59ca240fa72334f327 README.md +29c0ecda59afb32e5a2a3cad0ee0751a6dd8073a53d51f519faf52b12dca0a12 README.md 0504448900848d23d063b412d816ad2f5c5e786b4e6e0cb8754803f8f588cc2d ROADMAP.md d2d0dd1a73d5d788475bc040d23b617f7d0ee324d8b40bd081a68b27eada18d2 scripts/build.mjs c6581520fed9f775f87ef1e054c46e786129f03d79b7ad31a441c59e4bdd343a scripts/checksums.mjs diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/assets/codsemble-concept-native-compiler.webp b/docs/assets/codsemble-concept-native-compiler.webp new file mode 100644 index 0000000..1076e8a Binary files /dev/null and b/docs/assets/codsemble-concept-native-compiler.webp differ diff --git a/docs/assets/codsemble-prism-flow.webp b/docs/assets/codsemble-prism-flow.webp new file mode 100644 index 0000000..cc96a27 Binary files /dev/null and b/docs/assets/codsemble-prism-flow.webp differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..3eb6461 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,116 @@ + + + + + + + + Codesemble — the repository-aware team builder for Codex + + + + + + + +
+
+
+

Open source · project-scoped · preview before apply

+

Audit your repository.
Assemble the smallest capable Codex team.

+

Codesemble turns repository evidence and your goal into a reviewable, native Codex team—without asking you to design every role by hand.

+ +
Evidence-ledNative outputHuman approval
+
+
+ + A glass prism transforms repository fragments into a small team of colorful project outputs. +

01 Evidence in Native team out

+
+
+ +
+

The compiler loop

From a messy project to a useful team in three clear moves.

Codesemble keeps the reasoning visible, so the team is explainable before it is ever written.

+
+
01

Audit

Read bounded, typed project signals locally and pair them with the goal you state.

repository + goal
+
02

Compile

Translate required work into the smallest complete set of evidence-backed roles.

work packages → roles
+
03

Review & apply

See the exact project diff, approve a fresh plan, then use Doctor and rollback when needed.

preview → apply → verify
+
+
+ +
+

A team that fits the evidence

Pick the level of coverage your project actually needs.

The names and count change with the repository. These options show the decision, not a fixed roster.

+
+
+
Example project signal
+

Release a payment flow safely

+

Codesemble found evidence for delivery, security review, and an existing test boundary.

+
+ + + +
+
Why this matters

A delivery goal activates a delivery work package and makes its evidence traceable.

+
+
+
+ + + +
+
+
Smallest complete coverage3 roles
Delivery specialistowns the release work
Security specialistreviews the security boundary
Test specialistchecks the payment flow
+ + +
Spawned-worker ceiling: 4 primary thread excluded
+
+
+
+
+ +
+

You keep the wheel

The primary thread coordinates. You decide.

Generated specialists are available capabilities, not an always-running swarm. The primary Codex thread delegates bounded work, reconciles evidence, and owns the final result.

01

Preview first. Audit and planning are read-only.

02

Confirm exactly. Apply requires a fresh plan and human approval.

03

Recover cleanly. Doctor and rollback preserve project-local control.

Read the safety boundary
+
+ Codesemble control flowYou direct the primary Codex thread. The primary delegates bounded work to specialists and integrates their evidence.YouPrimary threadSpecialistsResultdirectdelegatesintegrates +
You → primary Codex thread → bounded specialists → integrated result
+
+
+ +
+

Project-local output

Useful files, visible before they land.

Codesemble configures the project boundary. It does not edit personal Codex settings, trust, credentials, or runtime permissions.

+
+
AAGENTS.mdorchestration guidance
T.codex/agents/<role>.tomlnative specialists
C.codex/config.tomloptional ceiling
M.codex/codsemble/manifest.jsonteam ownership
.codex/codsemble/transactions/rollback history
+
What does “preview” mean?Expand the review boundary

Before apply, the plan names the roles, instructions, sandbox/profile requests, worker ceiling, and every managed path. Apply rechecks the current plan, relevant evidence, and output preimages.

+ .codex/agents/security.toml
+ .codex/codsemble/manifest.json
· personal ~/.codex/config.toml untouched
+
+
+ +
+

A common misconception

111 is a library, not a roster.

The catalog contains reusable capability primitives. Codesemble selects only roles justified by your project and goal; installed roles and active workers remain separate.

Explore the primitive library
+ +
+ +
+

Start with your repository

Let the project tell you what team it needs.

Install the plugin, open a fresh Codex session, and ask Codesemble to audit before you choose a team.

Install from the validated v0.2 candidate
codex plugin marketplace add VAMFI/codsemble --ref fc247152961c25e79b525a969806991f499a2bac
+codex plugin add codsemble@codsemble

Then ask:$codsemble:initialize-team Audit this workspace and help me choose the smallest useful team.
+
+ +
+

Go deeper when you are ready

The short version lives here. The contracts live in the repo.

+ +
+
+ + + diff --git a/docs/script.js b/docs/script.js new file mode 100644 index 0000000..22eb262 --- /dev/null +++ b/docs/script.js @@ -0,0 +1,79 @@ +const evidenceCopy = { + delivery: "A delivery goal activates a delivery work package and makes its evidence traceable.", + security: "A security requirement justifies a specialist review instead of a generic extra agent.", + tests: "An existing test boundary gives the compiler a concrete validation owner to cover.", +}; + +const menuToggle = document.querySelector(".menu-toggle"); +const siteNav = document.querySelector(".site-nav"); +menuToggle?.addEventListener("click", () => { + const open = menuToggle.getAttribute("aria-expanded") === "true"; + menuToggle.setAttribute("aria-expanded", String(!open)); + siteNav?.classList.toggle("is-open", !open); +}); +siteNav?.querySelectorAll("a").forEach((link) => { + link.addEventListener("click", () => { + menuToggle?.setAttribute("aria-expanded", "false"); + siteNav.classList.remove("is-open"); + }); +}); + +const tabs = [...document.querySelectorAll('[role="tab"]')]; +const panels = [...document.querySelectorAll("[data-team-panel]")]; +function selectTeam(team, focus = false) { + tabs.forEach((tab) => { + const selected = tab.dataset.team === team; + tab.setAttribute("aria-selected", String(selected)); + tab.tabIndex = selected ? 0 : -1; + }); + panels.forEach((panel) => { panel.hidden = panel.dataset.teamPanel !== team; }); + if (focus) tabs.find((tab) => tab.dataset.team === team)?.focus(); +} +tabs.forEach((tab, index) => { + tab.addEventListener("click", () => selectTeam(tab.dataset.team)); + tab.addEventListener("keydown", (event) => { + if (!["ArrowRight", "ArrowLeft", "Home", "End"].includes(event.key)) return; + event.preventDefault(); + const next = event.key === "Home" ? 0 : event.key === "End" ? tabs.length - 1 : (index + (event.key === "ArrowRight" ? 1 : -1) + tabs.length) % tabs.length; + selectTeam(tabs[next].dataset.team, true); + }); +}); + +const evidenceDetail = document.querySelector("#evidence-detail-text"); +document.querySelectorAll("[data-evidence]").forEach((chip) => { + chip.addEventListener("click", () => { + document.querySelectorAll("[data-evidence]").forEach((item) => item.classList.toggle("is-active", item === chip)); + if (evidenceDetail) evidenceDetail.textContent = evidenceCopy[chip.dataset.evidence] ?? "This signal contributes to a bounded work package."; + }); +}); + +document.querySelectorAll("[data-copy-target]").forEach((button) => { + button.addEventListener("click", async () => { + const target = document.getElementById(button.dataset.copyTarget); + const status = button.closest(".command-box")?.querySelector(".copy-status"); + if (!target) return; + try { + await navigator.clipboard.writeText(target.textContent.trim()); + button.textContent = "Copied"; + if (status) status.textContent = "Install commands copied to your clipboard."; + } catch { + if (status) status.textContent = "Copy is unavailable here; select the commands above instead."; + } + window.setTimeout(() => { button.textContent = "Copy"; }, 1800); + }); +}); + +const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; +if (!reduceMotion && "IntersectionObserver" in window) { + const observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + entry.target.classList.add("is-visible"); + observer.unobserve(entry.target); + } + }); + }, { threshold: .12 }); + document.querySelectorAll(".reveal").forEach((element) => observer.observe(element)); +} else { + document.querySelectorAll(".reveal").forEach((element) => element.classList.add("is-visible")); +} diff --git a/docs/styles.css b/docs/styles.css new file mode 100644 index 0000000..e5a49e5 --- /dev/null +++ b/docs/styles.css @@ -0,0 +1,19 @@ +:root{--ink:#edf5ff;--muted:#94aac8;--faint:#6d83a4;--navy:#071326;--panel:rgba(15,34,62,.74);--line:rgba(157,185,224,.18);--cyan:#65e3ff;--violet:#9b7bff;--coral:#ff9b8e;--radius:24px;color-scheme:dark;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;font-synthesis:none} ++*{box-sizing:border-box}html{scroll-behavior:smooth;background:var(--navy)}body{margin:0;color:var(--ink);background:radial-gradient(circle at 75% 4%,rgba(92,116,255,.14),transparent 32rem),var(--navy);line-height:1.55}body:before{content:"";position:fixed;inset:0;pointer-events:none;opacity:.24;background-image:linear-gradient(rgba(255,255,255,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.018) 1px,transparent 1px);background-size:56px 56px;mask-image:linear-gradient(to bottom,#000,transparent 70%)} ++a{color:inherit}.shell{width:min(1180px,calc(100% - 48px));margin-inline:auto}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip-link{position:fixed;z-index:20;top:-4rem;left:1rem;padding:.7rem 1rem;background:var(--cyan);color:#061222;border-radius:0 0 10px 10px;font-weight:800}.skip-link:focus{top:0} ++.site-header{position:sticky;top:0;z-index:10;border-bottom:1px solid rgba(157,185,224,.12);background:rgba(7,19,38,.76);backdrop-filter:blur(18px)}.header-inner,.footer-inner{display:flex;align-items:center;min-height:74px;gap:2rem}.brand{display:inline-flex;align-items:center;gap:.65rem;color:var(--ink);font-weight:800;letter-spacing:-.03em;text-decoration:none;font-size:1.1rem}.brand-mark{position:relative;display:inline-block;width:25px;height:25px;transform:rotate(30deg)}.brand-mark i,.brand-mark b,.brand-mark em{position:absolute;display:block;border:2px solid var(--cyan);border-radius:3px;width:13px;height:13px}.brand-mark i{top:0;left:6px;border-color:var(--violet)}.brand-mark b{bottom:0;left:0;border-color:var(--cyan)}.brand-mark em{right:0;bottom:0;border-color:var(--coral)}.site-nav{display:flex;align-items:center;gap:1.35rem;margin-left:auto;font-size:.88rem;color:var(--muted)}.site-nav a{text-decoration:none}.site-nav a:hover,.site-nav a:focus-visible{color:var(--ink)}.site-nav .nav-cta{color:#061222;background:var(--cyan);padding:.52rem .95rem;border-radius:999px;font-weight:800}.menu-toggle{display:none;margin-left:auto;border:1px solid var(--line);border-radius:10px;padding:.5rem .65rem;color:var(--ink);background:transparent;font-size:1.2rem} ++.hero{min-height:700px;display:grid;grid-template-columns:minmax(0,.92fr) minmax(0,1.08fr);align-items:center;gap:2rem;padding-block:5.5rem 5rem;position:relative}.hero-copy{position:relative;z-index:1;max-width:620px}.eyebrow{margin:0 0 1rem;text-transform:uppercase;letter-spacing:.14em;font-size:.7rem;font-weight:800;color:var(--cyan)}.pulse-dot,.status-dot{width:7px;height:7px;display:inline-block;border-radius:99px;background:var(--cyan);box-shadow:0 0 0 5px rgba(101,227,255,.1),0 0 18px var(--cyan);margin-right:.55rem;vertical-align:1px} ++h1,h2,h3,p{margin-top:0}h1{max-width:680px;margin-bottom:1.5rem;font-size:clamp(3.1rem,6.6vw,6.4rem);line-height:.98;letter-spacing:-.075em}h1 span{color:#b7c9ff}h2{max-width:680px;margin-bottom:1rem;font-size:clamp(2rem,4vw,3.5rem);line-height:1.03;letter-spacing:-.06em}h3{letter-spacing:-.035em}p{color:var(--muted)}.hero-lede{max-width:530px;font-size:1.12rem}.hero-actions{display:flex;flex-wrap:wrap;gap:.8rem;margin:2.2rem 0 1.8rem}.button{display:inline-flex;gap:.65rem;align-items:center;min-height:48px;padding:.75rem 1.1rem;border-radius:999px;font-weight:800;text-decoration:none}.button-primary{background:var(--cyan);color:#061222;box-shadow:0 10px 30px rgba(101,227,255,.16)}.button-quiet{border:1px solid var(--line);color:var(--ink)}.button:hover,.button:focus-visible{transform:translateY(-2px)}.hero-proof{display:flex;flex-wrap:wrap;gap:1.2rem;color:var(--faint);font-size:.82rem}.hero-proof span:before{content:"·";color:var(--coral);margin-right:.45rem} ++.hero-art{min-width:0;position:relative;transform:translateX(4%)}.hero-art img{position:relative;z-index:1;display:block;width:120%;max-width:none;margin-left:-14%;border-radius:28px;mix-blend-mode:screen;opacity:.94}.art-glow{position:absolute;width:55%;aspect-ratio:1;right:14%;top:18%;border-radius:50%;background:rgba(101,227,255,.16);filter:blur(70px)}.art-caption{position:absolute;z-index:2;bottom:3%;left:12%;margin:0;color:#d5e4ff;font-size:.7rem;text-transform:uppercase;letter-spacing:.16em}.art-caption span{color:var(--coral);margin-right:.55rem}.art-caption i{display:inline-block;width:48px;height:1px;margin:0 .5rem;background:var(--cyan);vertical-align:middle} ++.section-block{padding-block:7rem}.section-heading{max-width:760px;margin-bottom:3rem}.section-heading>p:last-child{max-width:590px;font-size:1.05rem}.flow-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}.flow-card{min-height:330px;padding:1.6rem;border:1px solid var(--line);border-radius:var(--radius);background:linear-gradient(145deg,rgba(23,48,82,.85),rgba(10,28,52,.7));position:relative;overflow:hidden}.flow-card:after{content:"";position:absolute;width:160px;height:160px;border-radius:50%;right:-80px;top:-80px;background:rgba(101,227,255,.08)}.card-index{color:var(--coral);font-size:.7rem;letter-spacing:.1em;font-weight:800}.flow-icon{height:76px;display:flex;align-items:center;gap:8px;margin:1.8rem 0 1.3rem}.flow-icon span{display:block;width:13px;border-radius:5px;background:linear-gradient(to top,var(--cyan),var(--violet))}.icon-scan span:nth-child(1){height:28px}.icon-scan span:nth-child(2){height:54px}.icon-scan span:nth-child(3){height:40px}.icon-compile{position:relative}.icon-compile span{width:38px;height:38px;border-radius:11px}.icon-compile span:nth-child(2){margin-left:-22px;opacity:.55}.icon-compile span:nth-child(3){margin-left:-22px;opacity:.28}.icon-approve span{width:70px;height:11px;border-radius:99px}.icon-approve span:nth-child(2){width:45px;margin-left:-30px;opacity:.6}.icon-approve span:nth-child(3){width:22px;margin-left:-30px;opacity:.28}.flow-card h3{font-size:1.45rem;margin-bottom:.55rem}.flow-card p{max-width:270px;min-height:74px}.flow-card code{color:var(--cyan);font-size:.75rem} ++.explorer-layout{display:grid;grid-template-columns:.82fr 1.18fr;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;background:rgba(7,19,38,.52)}.evidence-panel{padding:2rem;background:linear-gradient(165deg,rgba(30,45,91,.7),rgba(11,28,54,.72))}.panel-label{color:var(--cyan);font-size:.72rem;text-transform:uppercase;letter-spacing:.12em;font-weight:800}.evidence-panel h3{margin:3.5rem 0 .7rem;font-size:1.55rem}.evidence-chips{display:flex;flex-wrap:wrap;gap:.5rem;margin:1.5rem 0}.evidence-chip{cursor:pointer;border:1px solid rgba(101,227,255,.27);border-radius:999px;padding:.45rem .65rem;color:#cce7ff;background:rgba(101,227,255,.07);font:inherit;font-size:.72rem}.evidence-chip.is-active,.evidence-chip:hover{border-color:var(--cyan);color:var(--cyan)}.evidence-detail{padding-top:1.1rem;border-top:1px solid var(--line)}.detail-kicker{color:var(--faint);font-size:.68rem;text-transform:uppercase;letter-spacing:.12em}.evidence-detail p{margin:.4rem 0 0;font-size:.84rem}.team-panel{min-width:0}.tabs{display:flex;border-bottom:1px solid var(--line);padding:0 .8rem}.tabs button{cursor:pointer;position:relative;padding:1.15rem .9rem;border:0;color:var(--muted);background:transparent;font:inherit;font-size:.8rem;font-weight:800}.tabs button[aria-selected=true]{color:var(--ink)}.tabs button[aria-selected=true]:after{content:"";position:absolute;height:2px;left:.9rem;right:.9rem;bottom:-1px;background:var(--cyan)}.team-panel-content{padding:2rem}.panel-topline{display:flex;justify-content:space-between;gap:1rem;color:var(--muted);font-size:.84rem}.panel-topline strong{color:var(--cyan)}.role-list{display:grid;gap:.75rem;margin:1.5rem 0 2rem}.role-list div{display:flex;justify-content:space-between;align-items:center;gap:1rem;border-bottom:1px solid rgba(157,185,224,.1);padding-bottom:.8rem}.role-list b{font-size:.92rem}.role-list span{color:var(--muted);font-size:.75rem;text-align:right}.ceiling-note{border:1px solid rgba(255,155,142,.2);border-radius:12px;padding:.8rem 1rem;color:var(--coral);font-size:.78rem}.ceiling-note strong{color:var(--ink)}.ceiling-note small{color:var(--faint);margin-left:.4rem} ++.control-section{display:grid;grid-template-columns:.92fr 1.08fr;gap:4rem;align-items:center}.control-copy>p:not(.eyebrow){max-width:520px;font-size:1.04rem}.control-list{display:grid;gap:.85rem;margin:2rem 0}.control-list div{display:grid;grid-template-columns:30px 1fr;gap:.8rem;align-items:baseline;border-bottom:1px solid var(--line);padding-bottom:.85rem}.control-list span{color:var(--coral);font-size:.7rem;font-weight:800}.control-list p{margin:0;font-size:.88rem}.control-list b{color:var(--ink)}.text-link{color:var(--cyan);text-decoration:none;font-weight:800;font-size:.86rem}.text-link:hover{color:#fff}.control-figure{margin:0;padding:1.5rem;border:1px solid var(--line);border-radius:var(--radius);background:radial-gradient(circle at 50% 50%,rgba(113,93,255,.18),transparent 50%),var(--panel)}.control-figure svg{display:block;width:100%;height:auto}.control-figure figcaption{margin-top:.8rem;color:var(--muted);text-align:center;font-size:.76rem} ++.outputs-section{padding-top:2rem}.outputs-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:1rem;align-items:start}.file-stack{display:grid;gap:.6rem}.file-row{display:grid;grid-template-columns:30px 1fr auto;align-items:center;gap:.8rem;padding:.9rem 1rem;border:1px solid var(--line);border-radius:13px;background:rgba(14,32,58,.6)}.file-icon{display:grid;place-items:center;width:24px;height:24px;border-radius:7px;background:rgba(101,227,255,.1);color:var(--cyan);font-size:.65rem;font-weight:800}.file-row code{overflow-wrap:anywhere;color:#cfddf3;font-size:.77rem}.file-row>span:last-child{color:var(--faint);font-size:.72rem}.diff-card{border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;background:linear-gradient(145deg,rgba(30,45,91,.6),rgba(11,28,54,.7))}.diff-card summary{display:grid;grid-template-columns:36px 1fr 20px;align-items:center;gap:.8rem;cursor:pointer;list-style:none;padding:1.25rem}.diff-card summary::-webkit-details-marker{display:none}.summary-icon{display:grid;place-items:center;width:33px;height:33px;color:var(--cyan);border:1px solid rgba(101,227,255,.3);border-radius:10px}.diff-card summary b,.diff-card summary small{display:block}.diff-card summary small{color:var(--muted);font-size:.75rem;margin-top:.2rem}.summary-arrow{color:var(--cyan);font-size:1.2rem}.diff-card[open] .summary-arrow{transform:rotate(45deg)}.diff-content{padding:0 1.25rem 1.25rem}.diff-content p{font-size:.83rem}.diff-line{padding:.5rem .7rem;margin-top:.4rem;border-radius:7px;font-family:ui-monospace,SFMono-Regular,monospace;font-size:.7rem}.diff-add{color:#aef6d6;background:rgba(60,210,150,.08)}.diff-neutral{color:var(--muted);background:rgba(157,185,224,.07)} ++.primitive-section{display:grid;grid-template-columns:.9fr 1.1fr;align-items:center;gap:4rem}.primitive-copy>p:not(.eyebrow){max-width:500px}.primitive-visual{min-height:280px;position:relative;display:grid;place-items:center;border:1px solid var(--line);border-radius:var(--radius);background:radial-gradient(circle at 50% 50%,rgba(101,227,255,.12),transparent 45%),rgba(11,28,54,.65);overflow:hidden}.primitive-count{position:relative;z-index:1;font-size:clamp(4rem,9vw,8rem);line-height:1;letter-spacing:-.1em;color:transparent;-webkit-text-stroke:1px rgba(101,227,255,.7)}.primitive-label{position:absolute;z-index:1;top:53%;left:50%;transform:translate(-50%,0);text-align:center;color:var(--muted);text-transform:uppercase;letter-spacing:.15em;font-size:.68rem}.selection-line{position:absolute;width:76%;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);transform:rotate(-25deg)}.selected-role{position:absolute;padding:.45rem .65rem;border-radius:8px;border:1px solid rgba(255,155,142,.4);background:rgba(255,155,142,.1);color:#ffd8d2;font-size:.7rem}.role-one{top:18%;right:14%}.role-two{bottom:17%;right:20%}.role-three{top:31%;left:15%} ++.install-section{padding-top:3rem}.install-card{display:grid;grid-template-columns:.9fr 1.1fr;gap:2rem;padding:clamp(1.5rem,4vw,3rem);border:1px solid rgba(101,227,255,.24);border-radius:30px;background:linear-gradient(120deg,rgba(23,53,91,.9),rgba(25,34,79,.8));box-shadow:0 20px 70px rgba(0,0,0,.18)}.install-card h2{font-size:clamp(1.8rem,3.4vw,2.8rem)}.install-card>div>p:last-child{max-width:460px}.command-box{align-self:center;overflow:hidden;border:1px solid rgba(157,185,224,.24);border-radius:14px;background:#061122}.command-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.8rem .95rem;border-bottom:1px solid var(--line);color:var(--muted);font-size:.7rem}.copy-button{cursor:pointer;border:1px solid rgba(101,227,255,.35);border-radius:999px;padding:.35rem .7rem;color:var(--cyan);background:rgba(101,227,255,.08);font:inherit;font-weight:800}.command-box pre{overflow-x:auto;margin:0;padding:1.1rem}.command-box code{color:#c9e6ff;font-size:.72rem;line-height:1.8}.copy-status{min-height:1.3rem;padding:0 1.1rem .5rem;margin:0;color:var(--cyan);font-size:.7rem}.install-next{grid-column:1/-1;display:flex;flex-wrap:wrap;align-items:center;gap:.8rem;padding-top:1.15rem;border-top:1px solid rgba(157,185,224,.15);color:var(--muted);font-size:.78rem}.install-next code{color:#c9e6ff} ++.docs-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.75rem}.docs-grid a{position:relative;display:block;min-height:180px;padding:1.2rem;border:1px solid var(--line);border-radius:18px;color:var(--ink);text-decoration:none;background:rgba(14,32,58,.55)}.docs-grid a:hover,.docs-grid a:focus-visible{border-color:rgba(101,227,255,.6);transform:translateY(-4px)}.docs-grid span,.docs-grid i{color:var(--cyan);font-size:.7rem;font-style:normal}.docs-grid i{position:absolute;top:1.2rem;right:1.2rem}.docs-grid b,.docs-grid small{display:block;margin-top:2.6rem}.docs-grid small{margin-top:.45rem;color:var(--muted);font-size:.75rem} ++.site-footer{border-top:1px solid var(--line)}.footer-inner{justify-content:space-between;min-height:110px}.footer-inner p{margin:0;font-size:.8rem}.footer-inner>div{display:flex;gap:1rem;color:var(--muted);font-size:.78rem}.footer-inner a:hover{color:var(--cyan)} ++.reveal{opacity:0;transform:translateY(16px);transition:opacity .7s ease,transform .7s ease}.reveal.is-visible{opacity:1;transform:none}.reveal-delay{transition-delay:.1s}.reveal-delay-2{transition-delay:.2s}:focus-visible{outline:3px solid var(--coral);outline-offset:4px} ++@media(max-width:920px){.hero{grid-template-columns:1fr;min-height:auto;padding-top:4.5rem}.hero-art{transform:none;margin-top:-1rem}.hero-art img{width:110%;margin-left:-5%}.flow-grid,.docs-grid{grid-template-columns:repeat(2,1fr)}.explorer-layout,.control-section,.primitive-section,.outputs-grid,.install-card{grid-template-columns:1fr}.control-section,.primitive-section{gap:2rem}.outputs-section{padding-top:4rem}.install-next{grid-column:auto}} ++@media(max-width:680px){.shell{width:min(100% - 32px,560px)}.header-inner{min-height:64px}.menu-toggle{display:block}.site-nav{position:absolute;display:none;top:64px;left:0;right:0;padding:1rem;flex-direction:column;align-items:stretch;background:#09182c;border-bottom:1px solid var(--line)}.site-nav.is-open{display:flex}.site-nav a{padding:.55rem .35rem}.site-nav .nav-cta{text-align:center}.hero{padding-block:4rem 3rem}.hero-art{margin-inline:-1rem}.hero-art img{width:125%;margin-left:-12%}.art-caption{left:9%;bottom:5%;font-size:.58rem}.flow-grid,.docs-grid{grid-template-columns:1fr}.flow-card{min-height:0}.section-block{padding-block:4.5rem}.explorer-layout{border-radius:18px}.evidence-panel,.team-panel-content{padding:1.25rem}.evidence-panel h3{margin-top:2rem}.tabs{padding-inline:.2rem;overflow-x:auto}.tabs button{flex:1 0 auto;padding-inline:.75rem}.role-list div{align-items:flex-start;flex-direction:column;gap:.2rem}.role-list span{text-align:left}.control-figure{padding:.5rem}.control-figure figcaption{font-size:.65rem}.file-row{grid-template-columns:26px 1fr}.file-row>span:last-child{grid-column:2}.install-card{padding:1.25rem;border-radius:20px}.install-next{align-items:flex-start;flex-direction:column}.install-next code{overflow-wrap:anywhere}.footer-inner{align-items:flex-start;flex-wrap:wrap;padding-block:1.5rem}.footer-inner p{order:3;width:100%}.footer-inner>div{margin-left:auto}} ++@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.reveal{opacity:1;transform:none;transition:none}.button:hover,.docs-grid a:hover{transform:none}}