chore: bump version to 0.5.0-dev#3
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5 tasks
donbeave
added a commit
that referenced
this pull request
Apr 19, 2026
Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent Matrix cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 20, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/MATRIX_GREEN/mid/MATRIX_DIM/MATRIX_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced Matrix-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent Matrix cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no Matrix moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark Matrix theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 20, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/ - Each file is a self-contained design doc with problem, options, and related source files for easy agent handoff - Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md - Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry - TODO.md becomes an index pointing to todo/ files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 20, 2026
* chore: bump version to 0.5.0-dev Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix rustfmt import formatting for CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 20, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced franchise-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent franchise cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no franchise moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark franchise theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/ - Each file is a self-contained design doc with problem, options, and related source files for easy agent handoff - Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md - Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry - TODO.md becomes an index pointing to todo/ files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
* chore: bump version to 0.5.0-dev Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix rustfmt import formatting for CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced franchise-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent franchise cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no franchise moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark franchise theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/ - Each file is a self-contained design doc with problem, options, and related source files for easy agent handoff - Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md - Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry - TODO.md becomes an index pointing to todo/ files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
* chore: bump version to 0.5.0-dev Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix rustfmt import formatting for CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced franchise-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent franchise cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no franchise moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark franchise theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/ - Each file is a self-contained design doc with problem, options, and related source files for easy agent handoff - Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md - Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry - TODO.md becomes an index pointing to todo/ files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
* chore: bump version to 0.5.0-dev Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix rustfmt import formatting for CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced product-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent product cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no product moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark product theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/ - Each file is a self-contained design doc with problem, options, and related source files for easy agent handoff - Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md - Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry - TODO.md becomes an index pointing to todo/ files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
* chore: bump version to 0.5.0-dev Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix rustfmt import formatting for CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 21, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced product-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent product cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no product moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark product theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6 tasks
donbeave
added a commit
that referenced
this pull request
Apr 23, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude OAuth forwarding path with a durable token-based auth contract backed by an operator-managed env resolver. - PR 1 (auth-sync-default): make sync the default, migrate copy configs in place with a deprecation notice, and drop the Copy variant from the enum. Fixes the 401-after-drift failure mode operators see today. - PR 2 (workspace-env-resolver): introduce four-layer env declarations (global / per-agent-class / per-workspace / per-workspace-x-agent) with scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side storage. Partially delivers onepassword-integration.mdx option #2. - PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the resolved env; provisions .claude.json as {} and skips credentials forwarding so Claude Code's documented env-var precedence (takes priority over /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3. Each spec is reviewable independently; PR 3 depends on PR 2. Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Claude <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
Apr 24, 2026
When `commit_editor_save` exits to the list view (create-mode save or Esc->Save path with `exit_on_success = true`), it replaced the whole `ManagerState` via `ManagerState::from_config`. That reset discarded the success toast the same function had just set -- leaving the two exit-to-list flows without any positive feedback, while direct `s` saves (which stay on the editor) kept theirs. Capture the toast before the reset, assign the fresh state, then restore the toast. Addresses finding #3 of the PR #166 current-branch review. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave
added a commit
that referenced
this pull request
Apr 24, 2026
The user-facing command is `jackin` / `jackin console`; `jackin launch`
is deprecated. The internal module name `src/launch/` was a relic of
the old CLI verb and forced future maintainers to translate between
the operator-facing "console" terminology and the source-tree's
"launch" terminology.
Rename the module wholesale:
- `src/launch/` -> `src/console/` (full directory rename via git mv).
- `crate::launch::` -> `crate::console::` in every importer
(src/app, tests/manager_flow.rs, and the renamed files themselves).
- `run_launch` -> `run_console` (entrypoint fn).
- `LaunchState` -> `ConsoleState`, `LaunchStage` -> `ConsoleStage`
(top-level state machine types).
- Internal doc-comments updated where they read "the launcher" /
"launch.rs" / "src/launch/mod.rs" - those become "the operator
console" / "console/" / "src/console/mod.rs".
- PROJECT_STRUCTURE.md row for the module updated to `console/` and
the `tui/` row's "separate from the launcher" prose updated to
"separate from the operator console".
Out of scope, intentionally untouched:
- `src/runtime/launch.rs` and its `for_launch` constructor - that file
is about agent-runtime launching (CLI surface `jackin load`), not the
operator console.
- `src/cli/dispatch.rs::LAUNCH_DEPRECATION_WARNING`,
`LaunchArgs = ConsoleArgs` alias, `Command::Launch` - explicitly about
the deprecated CLI verb, behavior and string content stay.
- `docs/src/content/docs/commands/launch.mdx` and the deprecation
`<Aside>` in `commands/console.mdx` - deprecation surface, unchanged.
- `manager::InputOutcome::LaunchNamed` / `LaunchCurrentDir` - intent
verbs ("user requested a workspace launch action"), not subsystem
names; renaming would be cosmetic churn.
- `git_prompt.rs` "when the launcher fails" - refers to the OS browser
launcher (`open::that_detached`), not the TUI.
CLI behavior unchanged: bare `jackin`, `jackin console`, and deprecated
`jackin launch` all dispatch to the same code paths as before.
Addresses finding #3 of the second-pass PR #166 review.
Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
Co-authored-by: Claude <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
May 6, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude OAuth forwarding path with a durable token-based auth contract backed by an operator-managed env resolver. - PR 1 (auth-sync-default): make sync the default, migrate copy configs in place with a deprecation notice, and drop the Copy variant from the enum. Fixes the 401-after-drift failure mode operators see today. - PR 2 (workspace-env-resolver): introduce four-layer env declarations (global / per-agent-class / per-workspace / per-workspace-x-agent) with scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side storage. Partially delivers onepassword-integration.mdx option #2. - PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the resolved env; provisions .claude.json as {} and skips credentials forwarding so Claude Code's documented env-var precedence (takes priority over /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3. Each spec is reviewable independently; PR 3 depends on PR 2. Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Claude <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/ - Each file is a self-contained design doc with problem, options, and related source files for easy agent handoff - Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md - Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry - TODO.md becomes an index pointing to todo/ files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
* chore: bump version to 0.5.0-dev Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix rustfmt import formatting for CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced product-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent product cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no product moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark product theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude OAuth forwarding path with a durable token-based auth contract backed by an operator-managed env resolver. - PR 1 (auth-sync-default): make sync the default, migrate copy configs in place with a deprecation notice, and drop the Copy variant from the enum. Fixes the 401-after-drift failure mode operators see today. - PR 2 (workspace-env-resolver): introduce four-layer env declarations (global / per-agent-class / per-workspace / per-workspace-x-agent) with scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side storage. Partially delivers onepassword-integration.mdx option #2. - PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the resolved env; provisions .claude.json as {} and skips credentials forwarding so Claude Code's documented env-var precedence (takes priority over /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3. Each spec is reviewable independently; PR 3 depends on PR 2. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/ - Each file is a self-contained design doc with problem, options, and related source files for easy agent handoff - Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md - Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry - TODO.md becomes an index pointing to todo/ files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
* chore: bump version to 0.5.0-dev Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * style: fix rustfmt import formatting for CI Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced product-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent product cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no product moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark product theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude OAuth forwarding path with a durable token-based auth contract backed by an operator-managed env resolver. - PR 1 (auth-sync-default): make sync the default, migrate copy configs in place with a deprecation notice, and drop the Copy variant from the enum. Fixes the 401-after-drift failure mode operators see today. - PR 2 (workspace-env-resolver): introduce four-layer env declarations (global / per-agent-class / per-workspace / per-workspace-x-agent) with scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side storage. Partially delivers onepassword-integration.mdx option #2. - PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the resolved env; provisions .claude.json as {} and skips credentials forwarding so Claude Code's documented env-var precedence (takes priority over /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3. Each spec is reviewable independently; PR 3 depends on PR 2. Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Claude <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
- Move 9 TODO items from monolithic TODO.md into separate files in todo/ - Each file is a self-contained design doc with problem, options, and related source files for easy agent handoff - Mark resolved security findings (#3, #4, #6, #7) in SECURITY_REVIEW_FINDINGS.md - Update PROJECT_STRUCTURE.md with todo/ section and TESTING.md entry - TODO.md becomes an index pointing to todo/ files Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
* chore: bump version to 0.5.0-dev * style: fix rustfmt import formatting for CI --------- Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Claude <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
* design: add landing page mockup for jackin.tailrocks.com Full-page mockup with editorial split hero and seven sections: Vocabulary, Problem, Mental Model (org × agent-class × workspace composition machine with mounts), How It Works, Security, Ecosystem + Install. Hero rain is a faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient, 35ms frame rate. Standalone HTML with inlined CSS/JS, no build step required. * design: landing page iteration — full-screen rain hero + scroll-driven glossary Hero: - Full-screen (min-height: 100vh) with flex-centered content - Nav moved inside hero-stage so rain falls from Y=0 through the nav - Nav dropped its border + nav-links; Star button now CTA-only (no count) - Trim pass: removed meta-row, pill band, sub-stats, footer, and duplicate brew-install buttons; tightened hero to headline + deck + CTA Rain: - Faithful port of src/tui.rs digital_rain — ASCII char pool, age-based color gradient (WHITE/pale/PHOSPHOR_GREEN/mid/PHOSPHOR_DIM/PHOSPHOR_DARK), per-column speed/fade, mutation probabilities, 35ms frame rate - 32% canvas opacity + radial vignette + bottom-fade so text stays legible Section 2 (Vocabulary) — full redesign: - Replaced product-mapping table with scroll-driven dictionary - Sticky rail (300px) + Fraunces-serif detail panel - Nine entries now include Agent class + Workspace with explicit relationships (Agent class "built on top of the Construct"; Workspace is "a named list of mounts and access rules"; Jacking in is "Loading an agent into a workspace") - Section is 500vh tall; scroll progress drives which entry is active; rail items are also click-to-jump with smooth scrollTo - Introduces Fraunces serif alongside Inter + JetBrains Mono Section 4 (Composition Machine): - Extended to three dimensions: organization × agent-class × workspace - Three orgs preloaded (jackin-project, chainargos, acme) with realistic agent/workspace configs; workspaces show per-mount rw/ro tags - Cross-path mounts render src → dst; same-path mounts render once - Allowed-agents rejection renders a red "not loaded" state Section 7 (Ecosystem): - Repo names follow the jackin- prefix convention (jackin-project/jackin-agent-smith, your-org/jackin-your-agent) - Install block shows the cd step before jackin load; copy button removed * design: red pill/blue pill, cloning section, 5-agent cast Section 03 — "The false choice" reframed as red pill / blue pill: - Two-tone CSS pill capsules (colored + white halves with gloss highlight) - Blue pill = "Babysit every prompt" (gated, productivity destroyed) - Red pill = "Full YOLO on host" (unfiltered, risk maximum) - Transition: "Refuse the pill. You're the Operator — define the construct instead." — operator = Morpheus, above the choice Section 04 — Kitchen-Sink vs Role-Specific callout: - Two-card insight block below the composition machine's axis note - Left: neutral "Kitchen-Sink Agent" (Every toolchain/plugin/convention) - Right: green-accented "Role-Specific Agent" (Only relevant tools/plugins) - Argues the *why* of narrow agent classes without adding a new section Section 06 — New: "Parallel work" (clone the agent, split the work): - Three clone cards: agent-smith #1/#2/#3 on different branches (feature/auth-redesign, feature/payment-v2, fix/api-timeout) - Each card: pulsing live dot, branch name, container/DinD/history/network - Four scenarios: parallel features, service fan-out, divide and conquer, experiment safely - Old Section 06 (Security) renumbered to 07; old 07 (Ecosystem) to 08 Section 08 — Ecosystem rewritten with 5-agent product cast: - agent-smith (built-in, default) - the-architect (built-in, Rust dev) - agent-jones (archetype: company specialist — scentbird/jackin-agent-jones) - agent-brown (archetype: role-specific frontend) - your-own (build-your-own template) - Section title: "Every org builds a cast" * design: real agent-class structure + redesigned Cast section Section 04 (The Approach): - Route 01 is now prose + toolset chips (no Dockerfile), describing the-architect concretely: what it adds on top of the construct - Route 02 uses tabbed builder (manifest / Dockerfile) showing both files that make up a real jackin agent class - Dockerfile patterns now match jackin conventions: FROM projectjackin (not jackin-project), mise install … && mise use --global, and the USER root / apt-get / USER claude pattern for system packages - Dropped fictional features (password-manager ENV, EXPOSE port) since they're not part of jackin today - Each route now shows CLI + REPO mapping (e.g. jackin load the-architect vs github.com/jackin-project/jackin-the-architect) Section 05 (Cast) — full redesign: - Reduced from 6 cards to 3 character cards + 1 full-width invite strip - Dropped the Architect (covered in Section 04 Route 01) and DB maintainer (no product moniker) — zero duplication with Section 04 - Cards lead with the Fraunces-serif character name, not the role identifier, making Smith/Jones/Brown the visual anchors - Removed placeholder repo paths — they were fake noise - "Create your own role" is now a distinctly-styled full-width strip below the character trio, with a real link to the developing/creating-agents docs - Intro updated: "Smith, Jones, Brown — archetypes to adopt. Every other role, yours to cast." Section 02 (Vocabulary): - Construct image reference fixed to projectjackin/construct:trixie (matches docs/developing/construct-image.mdx) * design: tighten Section 06 Mental Model copy - Intro shortened from ~60 words to 15: "Same agent in different workspaces. Same workspace with different agents. Pick both — see what runs." - Dropped the axis-note block entirely (it was re-teaching Section 02's dictionary definitions) - Simplified machine sublabels: "the tool profile" / "workdir + mounts" / "the resulting container" (down from 2-3 words each) - Kitchen-Sink/Role-Specific callout notes compressed to single lines: "Too much context — worse decisions." and "Focused context — better results, faster." - Section is now ~60% shorter on copy with the interactive machine unchanged * design: daily-loop redesign, drop Security, simplify Install, add wordmark footer Section 06 (Mental Model): - acme → your-org across composition machine data and tabs Section 07 (How it Works): - Redesigned from vertical filmstrip into "The daily loop" with five vertical frames, each using a 2-column layout (info left, full terminal right with chrome dots) - Added new "clone" frame between load and hardline that demonstrates parallel agents with cd setup and two load cycles on different paths - Each frame: Fraunces-serif command name, italic mythos line (Jacking in, More of me, The hardline, Pulling out, Casting out), description paragraph, full terminal with colored output - Frame 01 load now shows the cd ~/Projects/my-app setup step Section 08 (Parallel work — clone cards + scenarios): - Deleted entirely. The clone story is now Entry 02 of the daily loop. Old CSS (.clones, .clone-card, .scenarios, .scenario) also removed. Section 08 (Security Model — honest version): - Deleted. The section is documented elsewhere; on the landing it was slowing down the path to install. Section 08 (Install — was 09/10): - Simplified: dropped the rehash intro "Load an agent. Give it full autonomy inside..." that restated Section 07's loop - Dropped the cd step from the install block (shown in Section 07) - Dropped comment lines inside the code block - Dropped "Your host stays untouched" closing h2 (repeats the hero) - Title is now one word: "Install." - Sec-label changed to "08 · Jack in" to avoid duplicating the title and to bookend the hero's Operator narrative - CTA links point to real URLs (tailrocks.com/ and GitHub) Terminal chrome: - Removed "operator@construct" label from all six terminal bars (one in hero code panel, five in Section 07 loop) Footer (new): - Added big Inter 900 "jackin'" wordmark at clamp(120px, 24vw, 300px) with green accent apostrophe — modern full-width branding end-mark - Small mono meta row above: GitHub · Docs · Apache 2.0 Page total: 8 sections (was 10). ~250 lines lighter. * design: fix Install copy — accurate count + bookend the hero The previous intro "Three lines, then load" was misleading: load IS the third line, not a follow-up. Swapped to "Tap, install, load — you're in." — three verbs that map 1:1 to the three install block lines, with "you're in" echoing the hero tagline's "inside." * design: add spec for landing page implementation Captures the design decisions from the landing-v2.html mockup and specifies the Vocs/React integration plan. Option 3 (landing at /, docs URLs unchanged) — replaces the current HomePage.Root in docs/pages/index.mdx with a set of React components under layout: landing frontmatter. Spec covers palette, typography trio (Inter + JetBrains Mono + Fraunces), section-by-section structure, interaction patterns (tabs, scroll-driven rail+detail, composition machine), a component inventory mapping the mockup to ~14 React components, and technical constraints (Vocs 1.4+, React 19, Tailwind v4, Bun). The mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; this spec is the design intent + integration plan for implementation. * plan: landing page implementation plan — 18 tasks across 5 phases Task-by-task plan for converting the landing-v2.html mockup into Vocs React components under docs/components/landing/. Covers: - Scaffold + design tokens (tasks 1-2) - Simple static sections first to establish patterns (tasks 3-5): InstallBlock, WordmarkFooter, PillCards - Shared TabbedBuilder + ApproachCards + CastRoster (tasks 6-8) - CompositionMachine with state + FocusCallout (tasks 9-10) - Scroll-driven VocabularyDictionary (task 11) - DailyLoop with 5 frames (task 12) - Hero stack: rainEngine (TDD with unit tests), DigitalRain, CodePanel, HeroStage + HeroContent (tasks 13-16) - Responsive + accessibility pass (task 17) - Build verification + visual regression (task 18) Each task: exact file paths, step-by-step instructions with code, TDD for pure logic (rain engine), dev-server visual verification for React components, commit at end. Mockup at docs/superpowers/mockups/landing-v2.html remains the source of truth for pixel-level details; plan references it for CSS copying. * landing: scaffold Landing component and mount under layout: landing * landing: add design tokens, base CSS, font imports * landing: add InstallBlock (Section 08 · Jack in) * landing: add WordmarkFooter * landing: add PillCards (Section 03) * landing: add TabbedBuilder component * landing: add ApproachCards (Section 04) with TabbedBuilder * landing: add CastRoster (Section 05) * landing: add CompositionMachine (Section 06) * landing: add FocusCallout inside Section 06 * landing: add VocabularyDictionary (Section 02) scroll-driven * landing: add DailyLoop (Section 07) * landing: add rainEngine (ported from src/tui.rs) with unit tests * landing: add DigitalRain React component wrapping rainEngine * landing: add CodePanel with tabbed typing animations * landing: add HeroStage + HeroContent, assemble full page * landing: remove duplicate .landing-btn-primary rule from hero block * landing: a11y polish (buttons + focus styles), rAF cleanup, reduced-motion CSS * landing: inset focus outline on voc items (avoid overflow-hidden clip) * landing: final a11y polish — unnest hero section, guard window in jumpTo * landing: fix CSS delivery + layout chrome - Move global CSS from docs/pages/_root.css (Vocs ignores) to docs/styles.css (the file Vocs actually loads via virtual:styles). Old _root.css deleted. - Reorder @import before non-@import rules so they aren't invalidated. - Set showTopNav/showLogo/showSidebar/showOutline/showAiCta to false in index.mdx frontmatter — Vocs defaults these to true regardless of layout. - Override max-width on .vocs_DocsLayout_content when data-layout is landing so the page renders full-bleed. * landing: also zero .vocs_Content max-width + padding for full-bleed The Vocs <article class="vocs_Content"> wrapper sits inside .vocs_DocsLayout_content and has its own max-width cap plus horizontal padding, so overriding DocsLayout_content alone still left the landing boxed. Extend the override to vocs_Content too. * landing: load Google Fonts at runtime + fix Docs CTA href - Runtime font injection in Landing.tsx. The CSS @import url() for Google Fonts was stripped by Tailwind v4's bundler, so neither Inter (beyond fallback) nor Fraunces was actually reaching the browser. Injecting the link tags from useEffect guarantees the fonts actually load (Inter 400-900, JetBrains Mono 400-600, Fraunces 400-700). - Dead @import url() removed from styles.css (it was silently being dropped by the bundler anyway). - Read the Docs CTA in InstallBlock now uses /getting-started/why relative link instead of pointing to its own hostname. * landing: hide Vocs footer on landing + WordmarkFooter flex layout * landing: fix Vocs cascade + shell width + relative links * landing: align OK columns in terminal output blocks * landing: denied-state code inherits font + exile column alignment * landing: exile frame — one more space before OK for agent lines * docs: apply dark product theme + shared font loader - Add theme block in vocs.config.ts with dark colorScheme, #00ff41 accentColor, and Inter / JetBrains Mono font families. Overrides vocs color tokens (background, text, border, heading) to match the landing palette (--landing-bg = #0a0b0a, etc). - Move runtime font-link injection from Landing.tsx to a shared docs/layout.tsx consumer component, so fonts load on every page rather than only the landing. - Landing.tsx no longer needs to inject fonts (picked up by layout). * docs: deeper chrome theming — mono nav + green hairline sidebar headers * docs: neutral inline-code chip + terminal-like code block bg * docs: bump Vocs fontWeight tokens (300->400 regular, 500->600 semibold) * docs: code blocks as framed terminal cards * docs: scope inline-code bg + reset Ask-in-ChatGPT button styling * docs: switch to Tempo-inspired neutral look for docs chrome * docs: adopt Tempo's Radix color ramps + semantic tokens * docs: Tempo 1:1 — single light-dark() rule, no theme config Matches tempoxyz/docs approach as closely as Vocs 1.4.1 allows: - Remove the 'theme' key from vocs.config.ts entirely (Tempo has none). All Vocs chrome colors are mapped to Radix gray tokens via CSS in docs-theme.css using the light-dark() function, so a single declaration covers both modes. - Mirror Tempo's src/pages/_root.css structure in docs/styles.css: @import 'tailwindcss' important, @source './', the @Utility scrollbar-* blocks, [data-v-logo] img sizing, and the @custom-variant dark selector (broadened to match both Vocs's .dark class AND the inline color-scheme style Tempo uses). - Bridge Vocs's .dark class toggle to CSS color-scheme so the light-dark() tokens resolve correctly without injecting a script. - Use :root, :root.dark selectors for the Vocs overrides so they match Vocs's internal specificity (Vocs uses :root.dark in dark mode — plain :root loses the cascade battle). Monochrome accent (black-on-light, white-on-dark) matches Tempo's branding choice. Landing page is untouched — scoped by .landing-root and data-layout='landing'. * docs: default-to-dark init script + more visible theme toggle * docs: Tempo-style outline indicator + Ask AI label * docs: fix outline double-border + match Tempo indicator behavior 1:1 --------- Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Claude <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
May 7, 2026
Add design specs for a three-PR series that replaces the copy-drift Claude OAuth forwarding path with a durable token-based auth contract backed by an operator-managed env resolver. - PR 1 (auth-sync-default): make sync the default, migrate copy configs in place with a deprecation notice, and drop the Copy variant from the enum. Fixes the 401-after-drift failure mode operators see today. - PR 2 (workspace-env-resolver): introduce four-layer env declarations (global / per-agent-class / per-workspace / per-workspace-x-agent) with scheme-dispatched values (literal / \$VAR / op://). Launch-time resolution via the 1Password CLI unlocks Touch-ID-gated secrets with no jackin-side storage. Partially delivers onepassword-integration.mdx option #2. - PR 3 (claude-token-auth-mode): add auth_forward = "token" as a thin consumer of PR 2's resolver. Requires CLAUDE_CODE_OAUTH_TOKEN in the resolved env; provisions .claude.json as {} and skips credentials forwarding so Claude Code's documented env-var precedence (takes priority over /login) applies cleanly. Delivers claude-auth-strategy.mdx option #3. Each spec is reviewable independently; PR 3 depends on PR 2. Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Claude <noreply@anthropic.com>
donbeave
added a commit
that referenced
this pull request
May 12, 2026
…very Simplify-pass review #3 fixes: - Extract `instance::naming::instance_id_from_container_base` and route both `InstanceManifest::new` and `runtime::naming::format_role_display` through it. The container-name shape `jackin-[<workspace>-]<role>-<id>` now has one parser instead of two parallel `rsplit_once(`-`)` calls. - `provision_claude_slot` opens `~/.claude.json` with explicit `0o600` mode on unix (matching `write_private_file`-shaped sibling auth files) so the skeleton lands private-by-default even when the host umask is permissive. The file is bind-mounted RW and the Claude CLI may later persist OAuth state into it. - `agent_mounts` codex/amp branches mirror the Claude arm via `if let Some(codex) = &state.auth.codex { ... }` instead of the double-traversal `is_some()` + `as_ref().and_then(...)` shape. - `mark_purged` now delegates to `mark_many_purged(&[base])` so the single-shot and batch paths share one mutate-or-backfill code path. The intermediate `mark_purged_in_memory` helper is gone; only `backfill_purge_tombstone` remains for the index-miss branch. - Trim narration: drop `O(N+M)` implementation hint on `mark_many_purged` and the `lock is advisory` clause on the `claim_container_name` lock-cleanup comment (conflated unlink semantics with flock semantics). Legacy discovery cut (continuation of the legacy-path purge in 3e49f5b): - Drop `runtime::discovery::list_legacy_managed_role_names`, `capture_managed_container_rows`, and the `list_running_agent_display_names` legacy-output stitching path. The remaining flow uses `label=jackin.kind=role` only — every jackin-managed container carries that label. - Remove the obsolete `list_managed_agent_names_includes_legacy_agents_without_role_label` test. - `exile_all_ejects_all_managed_agents` and `exile_all_continues_when_some_runtime_resources_are_missing` now use random-instance-id container names and assert the single-filter ps recording. Verify: ``` cargo fmt --check cargo clippy --all-targets --locked -- -D warnings cargo test --all-targets --locked ``` All green: 1803 lib tests + 14 integration suites pass. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave
added a commit
that referenced
this pull request
May 12, 2026
…very Simplify-pass review #3 fixes: - Extract `instance::naming::instance_id_from_container_base` and route both `InstanceManifest::new` and `runtime::naming::format_role_display` through it. The container-name shape `jackin-[<workspace>-]<role>-<id>` now has one parser instead of two parallel `rsplit_once(`-`)` calls. - `provision_claude_slot` opens `~/.claude.json` with explicit `0o600` mode on unix (matching `write_private_file`-shaped sibling auth files) so the skeleton lands private-by-default even when the host umask is permissive. The file is bind-mounted RW and the Claude CLI may later persist OAuth state into it. - `agent_mounts` codex/amp branches mirror the Claude arm via `if let Some(codex) = &state.auth.codex { ... }` instead of the double-traversal `is_some()` + `as_ref().and_then(...)` shape. - `mark_purged` now delegates to `mark_many_purged(&[base])` so the single-shot and batch paths share one mutate-or-backfill code path. The intermediate `mark_purged_in_memory` helper is gone; only `backfill_purge_tombstone` remains for the index-miss branch. - Trim narration: drop `O(N+M)` implementation hint on `mark_many_purged` and the `lock is advisory` clause on the `claim_container_name` lock-cleanup comment (conflated unlink semantics with flock semantics). Legacy discovery cut (continuation of the legacy-path purge in 3e49f5b): - Drop `runtime::discovery::list_legacy_managed_role_names`, `capture_managed_container_rows`, and the `list_running_agent_display_names` legacy-output stitching path. The remaining flow uses `label=jackin.kind=role` only — every jackin-managed container carries that label. - Remove the obsolete `list_managed_agent_names_includes_legacy_agents_without_role_label` test. - `exile_all_ejects_all_managed_agents` and `exile_all_continues_when_some_runtime_resources_are_missing` now use random-instance-id container names and assert the single-filter ps recording. Verify: ``` cargo fmt --check cargo clippy --all-targets --locked -- -D warnings cargo test --all-targets --locked ``` All green: 1803 lib tests + 14 integration suites pass. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave
added a commit
that referenced
this pull request
May 23, 2026
Trust-but-verify pass on the 15-item /code-review max-effort report that followed the parallel-agent capture commit. Splits cleanly from the in-flight env-config refactor by touching only the host-side session-inventory and snapshot-fanout paths plus the capsule socket layer; parallel-agent territory (main.rs, daemon.rs, session.rs, launch.rs, env_model.rs, derived_image.rs, entrypoint.sh) stays untouched. Findings addressed: * `src/console/manager/state.rs` — fan-out worker panics now surface through the existing `debug_log` path: `h.join()` failures are downcast to a string and re-routed as `Err(anyhow!)` so the slot is no longer dropped by `filter_map(|h| h.join().ok())`. Snapshot fan-out is also bounded by `SNAPSHOT_FANOUT_CHUNK = 8` so a host with dozens of active containers does not spawn dozens of OS threads per 500 ms refresh tick; each chunk's wall-clock cost is still bounded by the slowest fetch in that chunk. The fan-out body moves into a free `fetch_snapshots_parallel` helper so `refresh_instances` stays under the clippy line-count gate. * `src/runtime/attach.rs` — `JACKIN_STATUS_CMD` now gates on `test -S /jackin/run/jackin.sock` so the early-bring-up window (between container start and the daemon binding its socket, plus any pre-`setup-once` time) does not leak operator-visible stderr from a binary that exists but cannot serve yet. `test -S` exits silently with status 1 if the socket is absent; `||` short- circuits at the first failure only — no `|| true` masking the second command's errors once the socket exists. `parse_jackin_sessions` drops the strict `len() != expected` equality in favour of `take(expected)` so trailing footer lines or labels that `Display`-emit a non-`[` continuation line no longer flip the parse to Unavailable; the count check is now a lower-bound (`< expected`), which still catches real format drift but tolerates harmless decoration. The header search lifts a shared `parse_session_count` helper used by both `inspect_agent_sessions` here and `isolation::finalize::has_jackin_sessions`, replacing the duplicate parser that was warned about in finding #3. * `src/isolation/finalize.rs` — `parse_session_count` is now `runtime::attach::parse_session_count`; the local copy is gone. One header parser, one definition of malformed, no silent divergence on edge cases. * `crates/jackin-capsule/src/socket.rs` — accept-loop cap-rejection log now fires exactly once on the saturation transition + once on the recovery transition, with per-drop messages demoted to `cdebug!` so a flood attacker (the exact threat `MAX_CONCURRENT_CLIENTS` defends against) cannot drown the compact-tier log. Per-backoff line also demoted to `cdebug!` — the accept-error clog above already names the failure, so the 1-line-per-failure compact-log invariant holds. `start_listener_at` splits behind a new `start_listener_at_with_limiter` test-only helper that returns the inner `Arc<Semaphore>`. The cap regression test now reads `limiter.available_permits()` directly instead of racing `rx.recv()` against a 300 ms wall-clock deadline — cap-sensitive, not timing-sensitive. Wall-clock `timeout()` windows widen to 2 s for the remaining positive assertions so a slow CI runner does not produce spurious failures. * `crates/jackin-capsule/src/protocol/attach.rs` — new `hello_env_count_over_cap_is_rejected_by_decoder_with_full_payload` variant supplies a fully-populated payload of `MAX_HELLO_ENV + 1` real entries so the per-entry boundary is verified after the read loop, not just at the count declaration. The earlier test only exercised the front-of-loop guard; a regression that moved the cap check below the per-entry loop would slip past it silently. Deferred (parallel-agent territory or out-of-scope for this pass): * `crates/jackin-capsule/src/session.rs` kitty single-pop vs N-push asymmetry (finding #6) and `focus_swap_reset_*` test-name overpromises (finding #12) — `session.rs` is mid-rebase by the parallel agent. * `crates/jackin-capsule/src/main.rs` `--focus` eprintln eaten by alt-screen swap (finding #8) — `main.rs` mid-rebase. * `src/runtime/launch.rs` `fake_docker_for_clean_attached_exit` fixture ordering (finding #14) — `launch.rs` mid-rebase under the env-config migration. Setup-once gating left untouched: `docker/runtime/entrypoint.sh` already gates on `/jackin/state/hooks/setup-once.done` (line 78, runs only if marker absent; line 88 writes the marker on success). The new `test -S` socket gate on the host-side status query is the orthogonal half of the "don't query during early bring-up" rule. Co-authored-by: Claude <noreply@anthropic.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave
added a commit
that referenced
this pull request
May 23, 2026
Trust-but-verify pass on the 15-item /code-review max-effort report that followed the parallel-agent capture commit. Splits cleanly from the in-flight env-config refactor by touching only the host-side session-inventory and snapshot-fanout paths plus the capsule socket layer; parallel-agent territory (main.rs, daemon.rs, session.rs, launch.rs, env_model.rs, derived_image.rs, entrypoint.sh) stays untouched. Findings addressed: * `src/console/manager/state.rs` — fan-out worker panics now surface through the existing `debug_log` path: `h.join()` failures are downcast to a string and re-routed as `Err(anyhow!)` so the slot is no longer dropped by `filter_map(|h| h.join().ok())`. Snapshot fan-out is also bounded by `SNAPSHOT_FANOUT_CHUNK = 8` so a host with dozens of active containers does not spawn dozens of OS threads per 500 ms refresh tick; each chunk's wall-clock cost is still bounded by the slowest fetch in that chunk. The fan-out body moves into a free `fetch_snapshots_parallel` helper so `refresh_instances` stays under the clippy line-count gate. * `src/runtime/attach.rs` — `JACKIN_STATUS_CMD` now gates on `test -S /jackin/run/jackin.sock` so the early-bring-up window (between container start and the daemon binding its socket, plus any pre-`setup-once` time) does not leak operator-visible stderr from a binary that exists but cannot serve yet. `test -S` exits silently with status 1 if the socket is absent; `||` short- circuits at the first failure only — no `|| true` masking the second command's errors once the socket exists. `parse_jackin_sessions` drops the strict `len() != expected` equality in favour of `take(expected)` so trailing footer lines or labels that `Display`-emit a non-`[` continuation line no longer flip the parse to Unavailable; the count check is now a lower-bound (`< expected`), which still catches real format drift but tolerates harmless decoration. The header search lifts a shared `parse_session_count` helper used by both `inspect_agent_sessions` here and `isolation::finalize::has_jackin_sessions`, replacing the duplicate parser that was warned about in finding #3. * `src/isolation/finalize.rs` — `parse_session_count` is now `runtime::attach::parse_session_count`; the local copy is gone. One header parser, one definition of malformed, no silent divergence on edge cases. * `crates/jackin-capsule/src/socket.rs` — accept-loop cap-rejection log now fires exactly once on the saturation transition + once on the recovery transition, with per-drop messages demoted to `cdebug!` so a flood attacker (the exact threat `MAX_CONCURRENT_CLIENTS` defends against) cannot drown the compact-tier log. Per-backoff line also demoted to `cdebug!` — the accept-error clog above already names the failure, so the 1-line-per-failure compact-log invariant holds. `start_listener_at` splits behind a new `start_listener_at_with_limiter` test-only helper that returns the inner `Arc<Semaphore>`. The cap regression test now reads `limiter.available_permits()` directly instead of racing `rx.recv()` against a 300 ms wall-clock deadline — cap-sensitive, not timing-sensitive. Wall-clock `timeout()` windows widen to 2 s for the remaining positive assertions so a slow CI runner does not produce spurious failures. * `crates/jackin-capsule/src/protocol/attach.rs` — new `hello_env_count_over_cap_is_rejected_by_decoder_with_full_payload` variant supplies a fully-populated payload of `MAX_HELLO_ENV + 1` real entries so the per-entry boundary is verified after the read loop, not just at the count declaration. The earlier test only exercised the front-of-loop guard; a regression that moved the cap check below the per-entry loop would slip past it silently. Deferred (parallel-agent territory or out-of-scope for this pass): * `crates/jackin-capsule/src/session.rs` kitty single-pop vs N-push asymmetry (finding #6) and `focus_swap_reset_*` test-name overpromises (finding #12) — `session.rs` is mid-rebase by the parallel agent. * `crates/jackin-capsule/src/main.rs` `--focus` eprintln eaten by alt-screen swap (finding #8) — `main.rs` mid-rebase. * `src/runtime/launch.rs` `fake_docker_for_clean_attached_exit` fixture ordering (finding #14) — `launch.rs` mid-rebase under the env-config migration. Setup-once gating left untouched: `docker/runtime/entrypoint.sh` already gates on `/jackin/state/hooks/setup-once.done` (line 78, runs only if marker absent; line 88 writes the marker on success). The new `test -S` socket gate on the host-side status query is the orthogonal half of the "don't query during early bring-up" rule. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave
added a commit
that referenced
this pull request
May 23, 2026
Trust-but-verify pass on the 15-item /code-review max-effort report that followed the parallel-agent capture commit. Splits cleanly from the in-flight env-config refactor by touching only the host-side session-inventory and snapshot-fanout paths plus the capsule socket layer; parallel-agent territory (main.rs, daemon.rs, session.rs, launch.rs, env_model.rs, derived_image.rs, entrypoint.sh) stays untouched. Findings addressed: * `src/console/manager/state.rs` — fan-out worker panics now surface through the existing `debug_log` path: `h.join()` failures are downcast to a string and re-routed as `Err(anyhow!)` so the slot is no longer dropped by `filter_map(|h| h.join().ok())`. Snapshot fan-out is also bounded by `SNAPSHOT_FANOUT_CHUNK = 8` so a host with dozens of active containers does not spawn dozens of OS threads per 500 ms refresh tick; each chunk's wall-clock cost is still bounded by the slowest fetch in that chunk. The fan-out body moves into a free `fetch_snapshots_parallel` helper so `refresh_instances` stays under the clippy line-count gate. * `src/runtime/attach.rs` — `JACKIN_STATUS_CMD` now gates on `test -S /jackin/run/jackin.sock` so the early-bring-up window (between container start and the daemon binding its socket, plus any pre-`setup-once` time) does not leak operator-visible stderr from a binary that exists but cannot serve yet. `test -S` exits silently with status 1 if the socket is absent; `||` short- circuits at the first failure only — no `|| true` masking the second command's errors once the socket exists. `parse_jackin_sessions` drops the strict `len() != expected` equality in favour of `take(expected)` so trailing footer lines or labels that `Display`-emit a non-`[` continuation line no longer flip the parse to Unavailable; the count check is now a lower-bound (`< expected`), which still catches real format drift but tolerates harmless decoration. The header search lifts a shared `parse_session_count` helper used by both `inspect_agent_sessions` here and `isolation::finalize::has_jackin_sessions`, replacing the duplicate parser that was warned about in finding #3. * `src/isolation/finalize.rs` — `parse_session_count` is now `runtime::attach::parse_session_count`; the local copy is gone. One header parser, one definition of malformed, no silent divergence on edge cases. * `crates/jackin-capsule/src/socket.rs` — accept-loop cap-rejection log now fires exactly once on the saturation transition + once on the recovery transition, with per-drop messages demoted to `cdebug!` so a flood attacker (the exact threat `MAX_CONCURRENT_CLIENTS` defends against) cannot drown the compact-tier log. Per-backoff line also demoted to `cdebug!` — the accept-error clog above already names the failure, so the 1-line-per-failure compact-log invariant holds. `start_listener_at` splits behind a new `start_listener_at_with_limiter` test-only helper that returns the inner `Arc<Semaphore>`. The cap regression test now reads `limiter.available_permits()` directly instead of racing `rx.recv()` against a 300 ms wall-clock deadline — cap-sensitive, not timing-sensitive. Wall-clock `timeout()` windows widen to 2 s for the remaining positive assertions so a slow CI runner does not produce spurious failures. * `crates/jackin-capsule/src/protocol/attach.rs` — new `hello_env_count_over_cap_is_rejected_by_decoder_with_full_payload` variant supplies a fully-populated payload of `MAX_HELLO_ENV + 1` real entries so the per-entry boundary is verified after the read loop, not just at the count declaration. The earlier test only exercised the front-of-loop guard; a regression that moved the cap check below the per-entry loop would slip past it silently. Deferred (parallel-agent territory or out-of-scope for this pass): * `crates/jackin-capsule/src/session.rs` kitty single-pop vs N-push asymmetry (finding #6) and `focus_swap_reset_*` test-name overpromises (finding #12) — `session.rs` is mid-rebase by the parallel agent. * `crates/jackin-capsule/src/main.rs` `--focus` eprintln eaten by alt-screen swap (finding #8) — `main.rs` mid-rebase. * `src/runtime/launch.rs` `fake_docker_for_clean_attached_exit` fixture ordering (finding #14) — `launch.rs` mid-rebase under the env-config migration. Setup-once gating left untouched: `docker/runtime/entrypoint.sh` already gates on `/jackin/state/hooks/setup-once.done` (line 78, runs only if marker absent; line 88 writes the marker on success). The new `test -S` socket gate on the host-side status query is the orthogonal half of the "don't query during early bring-up" rule. Co-authored-by: Codex <codex@openai.com> Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com>
donbeave
added a commit
that referenced
this pull request
May 23, 2026
Trust-but-verify pass on the 15-item /code-review max-effort report that followed the parallel-agent capture commit. Splits cleanly from the in-flight env-config refactor by touching only the host-side session-inventory and snapshot-fanout paths plus the capsule socket layer; parallel-agent territory (main.rs, daemon.rs, session.rs, launch.rs, env_model.rs, derived_image.rs, entrypoint.sh) stays untouched. Findings addressed: * `src/console/manager/state.rs` — fan-out worker panics now surface through the existing `debug_log` path: `h.join()` failures are downcast to a string and re-routed as `Err(anyhow!)` so the slot is no longer dropped by `filter_map(|h| h.join().ok())`. Snapshot fan-out is also bounded by `SNAPSHOT_FANOUT_CHUNK = 8` so a host with dozens of active containers does not spawn dozens of OS threads per 500 ms refresh tick; each chunk's wall-clock cost is still bounded by the slowest fetch in that chunk. The fan-out body moves into a free `fetch_snapshots_parallel` helper so `refresh_instances` stays under the clippy line-count gate. * `src/runtime/attach.rs` — `JACKIN_STATUS_CMD` now gates on `test -S /jackin/run/jackin.sock` so the early-bring-up window (between container start and the daemon binding its socket, plus any pre-`setup-once` time) does not leak operator-visible stderr from a binary that exists but cannot serve yet. `test -S` exits silently with status 1 if the socket is absent; `||` short- circuits at the first failure only — no `|| true` masking the second command's errors once the socket exists. `parse_jackin_sessions` drops the strict `len() != expected` equality in favour of `take(expected)` so trailing footer lines or labels that `Display`-emit a non-`[` continuation line no longer flip the parse to Unavailable; the count check is now a lower-bound (`< expected`), which still catches real format drift but tolerates harmless decoration. The header search lifts a shared `parse_session_count` helper used by both `inspect_agent_sessions` here and `isolation::finalize::has_jackin_sessions`, replacing the duplicate parser that was warned about in finding #3. * `src/isolation/finalize.rs` — `parse_session_count` is now `runtime::attach::parse_session_count`; the local copy is gone. One header parser, one definition of malformed, no silent divergence on edge cases. * `crates/jackin-capsule/src/socket.rs` — accept-loop cap-rejection log now fires exactly once on the saturation transition + once on the recovery transition, with per-drop messages demoted to `cdebug!` so a flood attacker (the exact threat `MAX_CONCURRENT_CLIENTS` defends against) cannot drown the compact-tier log. Per-backoff line also demoted to `cdebug!` — the accept-error clog above already names the failure, so the 1-line-per-failure compact-log invariant holds. `start_listener_at` splits behind a new `start_listener_at_with_limiter` test-only helper that returns the inner `Arc<Semaphore>`. The cap regression test now reads `limiter.available_permits()` directly instead of racing `rx.recv()` against a 300 ms wall-clock deadline — cap-sensitive, not timing-sensitive. Wall-clock `timeout()` windows widen to 2 s for the remaining positive assertions so a slow CI runner does not produce spurious failures. * `crates/jackin-capsule/src/protocol/attach.rs` — new `hello_env_count_over_cap_is_rejected_by_decoder_with_full_payload` variant supplies a fully-populated payload of `MAX_HELLO_ENV + 1` real entries so the per-entry boundary is verified after the read loop, not just at the count declaration. The earlier test only exercised the front-of-loop guard; a regression that moved the cap check below the per-entry loop would slip past it silently. Deferred (parallel-agent territory or out-of-scope for this pass): * `crates/jackin-capsule/src/session.rs` kitty single-pop vs N-push asymmetry (finding #6) and `focus_swap_reset_*` test-name overpromises (finding #12) — `session.rs` is mid-rebase by the parallel agent. * `crates/jackin-capsule/src/main.rs` `--focus` eprintln eaten by alt-screen swap (finding #8) — `main.rs` mid-rebase. * `src/runtime/launch.rs` `fake_docker_for_clean_attached_exit` fixture ordering (finding #14) — `launch.rs` mid-rebase under the env-config migration. Setup-once gating left untouched: `docker/runtime/entrypoint.sh` already gates on `/jackin/state/hooks/setup-once.done` (line 78, runs only if marker absent; line 88 writes the marker on success). The new `test -S` socket gate on the host-side status query is the orthogonal half of the "don't query during early bring-up" rule. Signed-off-by: Alexey Zhokhov <alexey@zhokhov.com> Co-authored-by: Codex <codex@openai.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
🤖 Generated with Claude Code