From 0e42cc73c7dd62684750d47d6d8f64046a55ed3c Mon Sep 17 00:00:00 2001 From: dbpolito Date: Thu, 26 Mar 2026 09:56:11 -0300 Subject: [PATCH 1/7] feat: Add animated command showcase with working tabs to homepage - Replace static command showcase with animated session visualization - Add 5 interactive command scenarios (/ask, /ticket/plan, /pr/create, /review, /dev) - Each scenario shows agent type, thinking process, tool calls, and output - Implement typewriter effect and step-by-step animations - Add visual effects: drifting grid, rotating orbits, pulsing glows - Include TUI-style navigation hints (Parent/Prev/Next) --- .../web/src/components/CommandShowcase.astro | 1189 +++++++++++++---- .../web/src/layouts/MarketingLayout.astro | 2 +- packages/web/src/pages/index.astro | 2 +- 3 files changed, 895 insertions(+), 298 deletions(-) diff --git a/packages/web/src/components/CommandShowcase.astro b/packages/web/src/components/CommandShowcase.astro index c914fa9..bac48ea 100644 --- a/packages/web/src/components/CommandShowcase.astro +++ b/packages/web/src/components/CommandShowcase.astro @@ -1,273 +1,218 @@ --- -const scenarios = [ - { - id: "ask", - label: "/ask", - prompt: "/ask how does command config merging work?", - notes: [ - "# load only the relevant project context", - "# answer directly without drifting into implementation" - ], - tools: ["read", "grep", "task(explore)"], - output: [ - "> loaded config and command registry context", - "> returned a concise project-grounded answer" - ] - }, - { - id: "branch", - label: "/branch", - prompt: "/branch docs site refresh", - notes: [ - "# summarize uncommitted work", - "# create a categorized branch name from the change themes" - ], - tools: ["changes_load", "bash(git checkout -b)"], - output: [ - "> created branch: docs/site-refresh", - "> switched from main to the new work branch" - ] - }, - { - id: "commit", - label: "/commit", - prompt: "/commit", - notes: [ - "# inspect staged and unstaged changes", - "# generate a why-focused commit message" - ], - tools: ["changes_load(uncommitted)", "bash(git add)", "bash(git commit)"], - output: [ - "> staged relevant files", - "> created a new commit with generated message" - ] - }, - { - id: "commit-and-push", - label: "/commit-and-push", - prompt: "/commit-and-push", - notes: [ - "# commit the current work", - "# push the branch upstream in one pass" - ], - tools: ["changes_load(uncommitted)", "bash(git add)", "bash(git commit)", "bash(git push)"], - output: [ - "> committed current changes", - "> pushed branch to origin" - ] - }, - { - id: "dev", - label: "/dev", - prompt: "/dev implement the approved workflow in packages/core", - notes: [ - "# load ticket context only when the request looks like a ticket source", - "# edit only the relevant files and validate the result" - ], - tools: ["read", "apply_patch", "bash(validation)", "task(worker)"], - output: [ - "> implemented focused code changes", - "> returned validation results and PR handoff notes" - ] - }, - { - id: "learn", - label: "/learn", - prompt: "/learn how AGENTS.md conventions are used here", - notes: [ - "# inspect existing patterns in the repo", - "# extract reusable guidance into AGENTS.md targets" - ], - tools: ["read(AGENTS.md)", "grep", "apply_patch"], - output: [ - "> summarized established conventions", - "> updated agent guidance where the pattern belongs" - ] - }, - { - id: "reload", - label: "/reload", - prompt: "/reload", - notes: [ - "# refresh config, commands, agents, and tools", - "# use after changing kompass config or templates" - ], - tools: ["reload"], - output: [ - "> refreshed the active OpenCode project cache", - "> new config is ready without restarting" - ] - }, - { - id: "pr-create", - label: "/pr/create", - prompt: "/pr/create", - notes: [ - "# summarize branch work and resolve ticket handling", - "# push if needed, then publish a structured PR" - ], - tools: ["changes_load", "question", "ticket_sync", "bash(git push)", "pr_sync"], - output: [ - "> created PR body with ticket, description, and checklist", - "> returned the PR URL and push status" - ] - }, - { - id: "pr-fix", - label: "/pr/fix", - prompt: "/pr/fix", - notes: [ - "# load PR history and outstanding feedback", - "# review proposed fixes with the user unless auto mode was requested" - ], - tools: ["pr_load", "apply_patch", "bash(validation)", "question", "bash(git push)", "pr_sync"], - output: [ - "> fixed requested issues on the branch", - "> posted replies to the relevant review threads" - ] - }, - { - id: "pr-review", - label: "/pr/review", - prompt: "/pr/review", - notes: [ - "# load pr, reviews, comments, files, and diff context", - "# if the pr references a ticket, load that ticket too before reviewing" - ], - tools: ["pr_load", "ticket_load", "changes_load", "task(reviewer)", "pr_sync"], - output: [ - "> added inline comments and review summary", - "> approved or requested changes based on the findings" - ] - }, - { - id: "review", - label: "/review", - prompt: "/review", - notes: [ - "# auto-discover uncommitted or branch comparison scope", - "# return findings without mutating the working tree" - ], - tools: ["changes_load", "read(changed files)", "task(reviewer)"], - output: [ - "> produced a concise branch review", - "> highlighted issues, risks, and follow-ups" - ] - }, - { - id: "ship", - label: "/ship", - prompt: "/ship", - notes: [ - "# create a work branch when current changes are still on the base branch", - "# delegate commit and pr creation as a fast path to shipping" - ], - tools: ["dispatch(/branch)", "dispatch(/commit)", "dispatch(/pr/create)"], - output: [ - "> moved the branch through commit and PR creation", - "> returned the final PR handoff" - ] - }, - { - id: "rmslop", - label: "/rmslop", - prompt: "/rmslop", - notes: [ - "# inspect the branch for unnecessary complexity", - "# simplify code, prompts, and workflow glue where possible" - ], - tools: ["changes_load", "read(changed files)", "apply_patch", "bash(validation)", "bash(git commit)"], - output: [ - "> removed unnecessary code and duplication", - "> left a smaller, clearer diff" - ] - }, +// Command showcase with working tabs - each command shows its own scenario +interface ToolCall { + tool: string; + args: string; + status: 'pending' | 'running' | 'complete'; +} + +interface SessionStep { + id: string; + phase: 'thinking' | 'tool_calls' | 'output'; + content?: string; + toolCalls?: ToolCall[]; + output?: string[]; +} + +interface CommandScenario { + id: string; + label: string; + command: string; + agentName: string; + task: string; + steps: SessionStep[]; +} + +const scenarios: CommandScenario[] = [ { - id: "todo", - label: "/todo", - prompt: "/todo @TODO.md", - notes: [ - "# load the todo list and keep orchestration local", - "# ask for plan approval before implementation starts" - ], - tools: ["read", "dispatch(/ticket/plan)", "question", "dispatch(/dev)", "dispatch(/commit)"], - output: [ - "> completed the current todo item", - "> reported what is done, blocked, or next" + id: 'ask', + label: '/ask', + command: '/ask is this project cool?', + agentName: 'Build Agent', + task: 'Answer questions about the current project or code', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Evaluating project appeal — need to determine if this project is cool by inspecting repository structure, README, and command architecture. Will check relevant files and keep analysis concise.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'glob', args: 'README* in . (5 matches)', status: 'complete' }, + { tool: 'read', args: 'package.json', status: 'complete' }, + { tool: 'read', args: 'README.md [limit=220]', status: 'complete' }, + { tool: 'read', args: 'packages/core/README.md [limit=220]', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'It has a clear point of view: keep AI coding agents "on course" with token-efficient, composable workflows instead of giant ad-hoc prompts.', + 'The repo is structured thoughtfully: shared logic lives in packages/core, adapter-specific wiring in packages/opencode.', + 'The command surface is unusually coherent — /ask, /review, /pr/create, /ticket/plan all fit the same workflow philosophy.', + 'No additional steps are required.' + ] + } ] }, { - id: "ticket-ask", - label: "/ticket/ask", - prompt: "/ticket/ask #128 what changed since the first draft?", - notes: [ - "# load the ticket plus discussion history", - "# answer with repo-aware context and post back to the ticket" - ], - tools: ["ticket_load", "read", "grep", "ticket_sync"], - output: [ - "> generated a contextual answer", - "> posted the response as a ticket comment" + id: 'ticket-plan', + label: '/ticket/plan', + command: '/ticket/plan #128 rollout the new review workflow', + agentName: 'Planner', + task: 'Turn a request or ticket into a scoped implementation plan', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Planning the rollout — need to break down the review workflow into actionable steps. Will examine existing patterns and create a scoped plan with clear milestones.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'ticket_load', args: '#128', status: 'complete' }, + { tool: 'read', args: 'packages/core/commands/pr/review.md', status: 'complete' }, + { tool: 'glob', args: 'packages/core/components/*.md', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'Phase 1: Extract reusable review components from existing commands', + 'Phase 2: Update navigator agent to coordinate review workflows', + 'Phase 3: Add checklist generation and feedback threading', + 'Plan ready for implementation. No additional steps required.' + ] + } ] }, { - id: "ticket-create", - label: "/ticket/create", - prompt: "/ticket/create", - notes: [ - "# auto-discover current change comparison when no base was passed", - "# create a structured issue with checklist sections" - ], - tools: ["changes_load", "ticket_sync"], - output: [ - "> created a GitHub issue with scoped checklist items", - "> returned the new ticket reference" + id: 'pr-create', + label: '/pr/create', + command: '/pr/create', + agentName: 'Navigator', + task: 'Summarize branch work and publish a structured PR', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Creating PR — need to load branch changes, check for linked tickets, and generate a structured PR description with checklist sections.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'changes_load', args: 'HEAD...main', status: 'complete' }, + { tool: 'ticket_load', args: '#42', status: 'complete' }, + { tool: 'bash', args: 'git push origin HEAD', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'Created PR #47: Add workflow visualization to homepage', + 'Linked to ticket #42 with structured checklist', + 'PR body includes summary, changes, and testing notes', + 'No additional steps are required.' + ] + } ] }, { - id: "ticket-dev", - label: "/ticket/dev", - prompt: "/ticket/dev #128", - notes: [ - "# load the ticket, create a plan, then execute the work", - "# keep ticket context attached throughout implementation" - ], - tools: ["ticket_load", "dispatch(/dev)", "dispatch(/branch)", "dispatch(/commit-and-push)", "dispatch(/pr/create)"], - output: [ - "> produced an implementation plan and finished the requested work", - "> returned validation notes and PR-ready context" + id: 'review', + label: '/review', + command: '/review', + agentName: 'Reviewer', + task: 'Review branch changes without editing files', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Reviewing changes — need to load the diff context and examine modified files for potential issues, risks, and improvements without making edits.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'changes_load', args: 'uncommitted', status: 'complete' }, + { tool: 'read', args: 'packages/web/src/components/CommandShowcase.astro', status: 'complete' }, + { tool: 'task', args: 'reviewer analysis', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'Strong separation of concerns between scenarios and rendering', + 'Consider adding error handling for failed tool calls', + 'Animation timing is appropriate for the UX flow', + 'No additional steps are required.' + ] + } ] }, { - id: "ticket-plan", - label: "/ticket/plan", - prompt: "/ticket/plan #128 rollout the new review workflow", - notes: [ - "# load ticket context, comments, and attached constraints", - "# draft a scoped plan before any code changes happen" - ], - tools: ["ticket_load", "changes_load", "task(planner)"], - output: [ - "> created a detailed implementation plan", - "> stored the result as a reusable handoff" + id: 'dev', + label: '/dev', + command: '/dev implement the approved workflow in packages/core', + agentName: 'Worker', + task: 'Implement approved plans with validation', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Implementing workflow — loading ticket context and executing the approved plan. Will edit only relevant files and validate changes as I go.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'ticket_load', args: '#128', status: 'complete' }, + { tool: 'apply_patch', args: 'packages/core/commands/pr/review.md', status: 'complete' }, + { tool: 'bash', args: 'npm run typecheck', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'Implemented review workflow in packages/core/commands/pr/', + 'Added navigator coordination and feedback threading', + 'All validation checks passed successfully', + 'No additional steps are required.' + ] + } ] } ]; + +const allCommands = [ + "/ask", "/branch", "/commit", "/commit-and-push", "/dev", "/learn", + "/reload", "/pr/create", "/pr/fix", "/pr/review", "/review", "/ship", + "/rmslop", "/todo", "/ticket/ask", "/ticket/create", "/ticket/dev", "/ticket/plan" +]; ---
- + + \ No newline at end of file diff --git a/packages/web/src/layouts/MarketingLayout.astro b/packages/web/src/layouts/MarketingLayout.astro index 70c5980..237e641 100644 --- a/packages/web/src/layouts/MarketingLayout.astro +++ b/packages/web/src/layouts/MarketingLayout.astro @@ -32,4 +32,4 @@ const { + \ No newline at end of file diff --git a/packages/web/src/pages/index.astro b/packages/web/src/pages/index.astro index 3fb5127..cb0a64d 100644 --- a/packages/web/src/pages/index.astro +++ b/packages/web/src/pages/index.astro @@ -173,4 +173,4 @@ const heroHighlights = [
- + \ No newline at end of file From 44a3946058b6766c97a54c1c183645bb55d19b91 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Thu, 26 Mar 2026 10:15:26 -0300 Subject: [PATCH 2/7] feat: Add 4 more command scenarios to showcase - Add /ship scenario showing fast path from changes to PR - Add /rmslop scenario for removing unnecessary complexity - Add /todo scenario for working through todo lists - Add /commit-and-push scenario for one-pass commits - Total: 9 interactive command tabs with unique agent workflows --- .../web/src/components/CommandShowcase.astro | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/packages/web/src/components/CommandShowcase.astro b/packages/web/src/components/CommandShowcase.astro index bac48ea..2375a49 100644 --- a/packages/web/src/components/CommandShowcase.astro +++ b/packages/web/src/components/CommandShowcase.astro @@ -189,6 +189,140 @@ const scenarios: CommandScenario[] = [ ] } ] + }, + { + id: 'ship', + label: '/ship', + command: '/ship', + agentName: 'Navigator', + task: 'Fast path from changes to PR', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Shipping — need to create a work branch, commit changes, and publish a PR. Will orchestrate the full workflow from current state to pull request.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'dispatch', args: '/branch feature/new-workflow', status: 'complete' }, + { tool: 'dispatch', args: '/commit', status: 'complete' }, + { tool: 'dispatch', args: '/pr/create', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'Created branch: feature/new-workflow', + 'Committed 3 files with generated message', + 'Published PR #48: Add new workflow command', + 'No additional steps are required.' + ] + } + ] + }, + { + id: 'rmslop', + label: '/rmslop', + command: '/rmslop', + agentName: 'Worker', + task: 'Remove unnecessary complexity and duplication', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Inspecting for slop — need to examine the branch for unnecessary complexity, duplicate code, and workflow glue that can be simplified or removed.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'changes_load', args: 'HEAD~3...HEAD', status: 'complete' }, + { tool: 'read', args: 'packages/core/commands/*.md', status: 'complete' }, + { tool: 'grep', args: 'TODO|FIXME|XXX', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'Removed 47 lines of duplicate validation logic', + 'Simplified 3 overly-abstract helper functions', + 'Consolidated similar command patterns into shared components', + 'No additional steps are required.' + ] + } + ] + }, + { + id: 'todo', + label: '/todo', + command: '/todo @TODO.md', + agentName: 'Navigator', + task: 'Work through a todo list with checkpoint reviews', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Processing todo — loading the todo list and keeping orchestration local. Will ask for plan approval before implementation starts.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'read', args: 'TODO.md', status: 'complete' }, + { tool: 'dispatch', args: '/ticket/plan #42', status: 'complete' }, + { tool: 'dispatch', args: '/dev', status: 'complete' }, + { tool: 'dispatch', args: '/commit', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'Completed: Update command showcase with more examples', + 'Blocked: Waiting for review on PR #47', + 'Next: Add mobile responsive styling', + 'No additional steps are required.' + ] + } + ] + }, + { + id: 'commit-and-push', + label: '/commit-and-push', + command: '/commit-and-push', + agentName: 'Worker', + task: 'Commit and push in one pass', + steps: [ + { + id: 'thinking', + phase: 'thinking', + content: 'Committing and pushing — need to stage relevant files, generate a commit message, and push the branch upstream in a single operation.' + }, + { + id: 'tools', + phase: 'tool_calls', + toolCalls: [ + { tool: 'changes_load', args: 'uncommitted', status: 'complete' }, + { tool: 'bash', args: 'git add packages/web/src/', status: 'complete' }, + { tool: 'bash', args: 'git commit -m "feat: add command showcase"', status: 'complete' }, + { tool: 'bash', args: 'git push origin HEAD', status: 'complete' } + ] + }, + { + id: 'output', + phase: 'output', + output: [ + 'Staged 3 modified files', + 'Created commit: feat: add command showcase with animations', + 'Pushed to origin/feature/showcase', + 'No additional steps are required.' + ] + } + ] } ]; From 60251c5990ba05b24a8c4cde6de5fe3d5ea31cf7 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Thu, 26 Mar 2026 10:26:44 -0300 Subject: [PATCH 3/7] feat: Redesign command showcase with parent/child session hierarchy - Add clear parent/child visual hierarchy with subagent session styling - Parent level shows command input with status and timer - Subagent session has yellow left border and navigation hints (Parent/Prev/Next) - Subagent header shows agent name, task description, and tool call count - Improved visual separation between parent command and child session - Mix of desktop UI and TUI aesthetics for better hierarchy clarity --- .../web/src/components/CommandShowcase.astro | 386 ++++++++++-------- 1 file changed, 208 insertions(+), 178 deletions(-) diff --git a/packages/web/src/components/CommandShowcase.astro b/packages/web/src/components/CommandShowcase.astro index 2375a49..5de4f0e 100644 --- a/packages/web/src/components/CommandShowcase.astro +++ b/packages/web/src/components/CommandShowcase.astro @@ -1,5 +1,5 @@ --- -// Command showcase with working tabs - each command shows its own scenario +// Command showcase with parent/child session hierarchy interface ToolCall { tool: string; args: string; @@ -371,86 +371,85 @@ const allCommands = [ hidden={index !== 0} >
-
-
- - - -
-
- - {scenario.agentName} + +
+
+ $ + {scenario.command}
- 0 toolcalls + 0.0s
-
- -
- $ - {scenario.command} -
- - -
- - {scenario.task} + +
+ +
+
+ Parent + Prev + Next +
+
+ + {scenario.agentName} + + {scenario.task} +
+
+ 0 toolcalls +
- -
- {scenario.steps.map((step) => ( -
- {step.phase === 'thinking' && step.content && ( -
-
- - - - Thinking + +
+ +
+ {scenario.steps.map((step) => ( +
+ {step.phase === 'thinking' && step.content && ( +
+
+ + + + Thinking +
+

{step.content}

-

{step.content}

-
- )} - - {step.phase === 'tool_calls' && step.toolCalls && ( -
-
- - Explored - {step.toolCalls.length} reads, 1 search + )} + + {step.phase === 'tool_calls' && step.toolCalls && ( +
+
+ + Explored + {step.toolCalls.length} reads, 1 search +
+
+ {step.toolCalls.map((tool) => ( +
+ + {tool.tool} + {tool.args} +
+ ))} +
-
- {step.toolCalls.map((tool) => ( -
- - {tool.tool} - {tool.args} -
+ )} + + {step.phase === 'output' && step.output && ( +
+ {step.output.map((line) => ( +

{line}

))}
-
- )} - - {step.phase === 'output' && step.output && ( -
- {step.output.map((line) => ( -

{line}

- ))} -
- )} -
- ))} -
- - -
- Parent - Prev - Next + )} +
+ ))} +
@@ -491,14 +490,12 @@ const allCommands = [ const statusDot = panel.querySelector('[data-status-dot]') as HTMLElement; const toolCount = panel.querySelector('[data-tool-count]') as HTMLElement; const sessionTime = panel.querySelector('[data-session-time]') as HTMLElement; - const navHint = panel.querySelector('.session-nav-hint') as HTMLElement; // Reset all animations steps.forEach(step => step.classList.remove('is-visible')); panel.querySelectorAll('.tool-call').forEach(tool => tool.classList.remove('is-visible')); panel.querySelectorAll('.output-block__line').forEach(line => line.classList.remove('is-visible')); if (statusDot) statusDot.classList.remove('is-complete'); - if (navHint) navHint.style.opacity = '0'; let toolcallCounter = 0; let startTime = Date.now(); @@ -543,7 +540,6 @@ const allCommands = [ clearInterval(timerInterval); if (statusDot) statusDot.classList.add('is-complete'); - if (navHint) navHint.style.opacity = '1'; } // Initialize showcase @@ -739,35 +735,7 @@ const allCommands = [ display: block; } - /* Decorative command strip */ - .all-commands { - display: flex; - flex-wrap: nowrap; - gap: 0.5rem; - justify-content: center; - margin-top: 2rem; - padding: 0 1rem; - overflow-x: auto; - opacity: 0.5; - scrollbar-width: none; - } - - .all-commands::-webkit-scrollbar { - display: none; - } - - .command-pill-decorative { - flex-shrink: 0; - padding: 0.4rem 0.7rem; - border: 1px solid rgba(125, 166, 196, 0.1); - border-radius: 999px; - background: rgba(8, 18, 29, 0.4); - color: var(--muted); - font-family: var(--font-mono); - font-size: 0.75rem; - } - - /* Terminal styles */ + /* Terminal container */ .session-terminal { max-width: 900px; margin: 0 auto; @@ -775,42 +743,48 @@ const allCommands = [ border-radius: 1rem; background: radial-gradient(circle at 80% 5%, rgba(248, 184, 78, 0.05), transparent 25%), - linear-gradient(180deg, rgba(5, 12, 20, 0.9), rgba(7, 17, 28, 0.85)); + linear-gradient(180deg, rgba(5, 12, 20, 0.95), rgba(7, 17, 28, 0.9)); box-shadow: - 0 24px 80px rgba(0, 0, 0, 0.35), + 0 24px 80px rgba(0, 0, 0, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.03); overflow: hidden; } - .session-terminal__header { + /* Parent Session Header */ + .session-terminal__header--parent { display: flex; align-items: center; + justify-content: space-between; gap: 1rem; - padding: 0.9rem 1.2rem; - border-bottom: 1px solid rgba(125, 166, 196, 0.08); - background: rgba(0, 0, 0, 0.2); + padding: 1rem 1.2rem; + border-bottom: 1px solid rgba(125, 166, 196, 0.1); + background: rgba(0, 0, 0, 0.3); } - .session-terminal__window-controls { + .session-terminal__parent-info { display: flex; - gap: 0.4rem; + align-items: center; + gap: 0.6rem; + font-family: var(--font-mono); + font-size: 1rem; } - .session-terminal__window-controls span { - width: 0.7rem; - height: 0.7rem; - border-radius: 50%; - background: rgba(159, 179, 195, 0.4); + .session-terminal__prompt { + color: var(--accent); + font-weight: 500; } - .session-terminal__title { + .session-terminal__command { + color: var(--text); + } + + .session-terminal__meta { display: flex; align-items: center; - gap: 0.6rem; - flex: 1; + gap: 0.8rem; font-family: var(--font-mono); - font-size: 0.85rem; - color: var(--text); + font-size: 0.8rem; + color: var(--muted); } .session-terminal__status { @@ -833,55 +807,94 @@ const allCommands = [ 50% { opacity: 0.6; transform: scale(0.9); } } - .session-terminal__meta { + /* Subagent Session */ + .subagent-session { + background: rgba(0, 0, 0, 0.2); + border-left: 2px solid rgba(248, 184, 78, 0.3); + margin: 0.5rem; + border-radius: 0 0.5rem 0.5rem 0; + } + + .subagent-session__header { display: flex; + align-items: center; + justify-content: space-between; gap: 1rem; - font-family: var(--font-mono); - font-size: 0.78rem; - color: var(--muted); + padding: 0.75rem 1rem; + border-bottom: 1px solid rgba(125, 166, 196, 0.08); + background: rgba(248, 184, 78, 0.05); } - .session-terminal__body { - padding: 1.2rem; + .subagent-session__nav { + display: flex; + gap: 1rem; font-family: var(--font-mono); - font-size: 0.9rem; - line-height: 1.6; + font-size: 0.75rem; + color: var(--muted); } - .session-line { - margin-bottom: 0.8rem; + .subagent-session__nav kbd { + padding: 0.1rem 0.35rem; + border: 1px solid rgba(125, 166, 196, 0.25); + border-radius: 0.25rem; + background: rgba(125, 166, 196, 0.1); + font-family: var(--font-mono); + font-size: 0.7rem; } - .session-line--input { + .subagent-session__title { display: flex; align-items: center; - gap: 0.6rem; - color: var(--text); + gap: 0.5rem; + font-family: var(--font-mono); + font-size: 0.85rem; + } + + .subagent-session__indicator { + width: 0.5rem; + height: 0.5rem; + border-radius: 50%; + background: var(--accent); + animation: subagentPulse 1.5s ease-in-out infinite; + } + + @keyframes subagentPulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.4; } } - .session-line__prompt { + .subagent-session__agent { color: var(--accent); font-weight: 500; } - .session-line__command { - color: #d8e5ee; + .subagent-session__divider { + color: var(--muted); + opacity: 0.5; } - .session-line--task { - display: flex; - align-items: center; - gap: 0.5rem; + .subagent-session__task { color: var(--muted); - font-size: 0.85rem; + font-size: 0.8rem; } - .session-line__icon { - color: var(--accent); + .subagent-session__stats { + font-family: var(--font-mono); + font-size: 0.75rem; + color: var(--muted); + } + + .subagent-session__body { + padding: 1rem; + font-family: var(--font-mono); + font-size: 0.9rem; + line-height: 1.6; } .session-steps { - margin-top: 1rem; + display: flex; + flex-direction: column; + gap: 0.75rem; } .session-step { @@ -896,17 +909,17 @@ const allCommands = [ } .thinking-block { - margin-bottom: 1rem; - padding: 1rem; + padding: 0.75rem 1rem; border-left: 2px solid rgba(248, 184, 78, 0.4); background: rgba(248, 184, 78, 0.05); + border-radius: 0 0.25rem 0.25rem 0; } .thinking-block__header { display: flex; align-items: center; gap: 0.5rem; - margin-bottom: 0.6rem; + margin-bottom: 0.5rem; } .thinking-block__indicator { @@ -945,14 +958,15 @@ const allCommands = [ } .tool-calls-block { - margin-bottom: 1rem; + padding: 0.5rem 0; } .tool-calls-block__header { display: flex; align-items: center; gap: 0.5rem; - margin-bottom: 0.6rem; + margin-bottom: 0.5rem; + padding-left: 0.5rem; color: var(--accent); font-size: 0.8rem; } @@ -974,16 +988,17 @@ const allCommands = [ .tool-calls-block__list { display: flex; flex-direction: column; - gap: 0.4rem; + gap: 0.3rem; + padding-left: 0.5rem; } .tool-call { display: flex; align-items: center; gap: 0.6rem; - padding: 0.5rem 0.7rem; - border-radius: 0.4rem; - background: rgba(125, 166, 196, 0.08); + padding: 0.4rem 0.6rem; + border-radius: 0.3rem; + background: rgba(125, 166, 196, 0.06); font-size: 0.85rem; opacity: 0; transform: translateX(-10px); @@ -1011,13 +1026,13 @@ const allCommands = [ } .output-block { - margin-top: 1rem; - padding-top: 1rem; - border-top: 1px solid rgba(125, 166, 196, 0.15); + margin-top: 0.5rem; + padding: 0.75rem 1rem; + border-top: 1px solid rgba(125, 166, 196, 0.1); } .output-block__line { - margin: 0.5rem 0; + margin: 0.4rem 0; color: var(--text); line-height: 1.7; opacity: 0; @@ -1033,26 +1048,35 @@ const allCommands = [ .output-block__line:last-child { color: var(--muted); font-size: 0.85rem; - margin-top: 1rem; + margin-top: 0.75rem; + padding-top: 0.5rem; + border-top: 1px solid rgba(125, 166, 196, 0.08); } - .session-nav-hint { + /* Decorative commands */ + .all-commands { display: flex; - gap: 1.5rem; - margin-top: 1.5rem; - padding-top: 1rem; - border-top: 1px solid rgba(125, 166, 196, 0.1); - color: var(--muted); - font-size: 0.8rem; - opacity: 0; - transition: opacity 0.5s ease 0.3s; + flex-wrap: nowrap; + gap: 0.5rem; + justify-content: center; + margin-top: 2rem; + padding: 0 1rem; + overflow-x: auto; + opacity: 0.5; + scrollbar-width: none; } - .session-nav-hint kbd { - padding: 0.15rem 0.4rem; - border: 1px solid rgba(125, 166, 196, 0.25); - border-radius: 0.3rem; - background: rgba(125, 166, 196, 0.1); + .all-commands::-webkit-scrollbar { + display: none; + } + + .command-pill-decorative { + flex-shrink: 0; + padding: 0.4rem 0.7rem; + border: 1px solid rgba(125, 166, 196, 0.1); + border-radius: 999px; + background: rgba(8, 18, 29, 0.4); + color: var(--muted); font-family: var(--font-mono); font-size: 0.75rem; } @@ -1062,8 +1086,19 @@ const allCommands = [ margin: 0 0.5rem; } - .session-terminal__body { - padding: 1rem; + .subagent-session__header { + flex-wrap: wrap; + gap: 0.5rem; + } + + .subagent-session__nav { + order: 3; + width: 100%; + font-size: 0.7rem; + } + + .subagent-session__body { + padding: 0.75rem; font-size: 0.85rem; } @@ -1071,10 +1106,5 @@ const allCommands = [ padding: 0.45rem 0.7rem; font-size: 0.78rem; } - - .session-nav-hint { - gap: 0.8rem; - font-size: 0.75rem; - } } \ No newline at end of file From c905ffb4948c7c341bac6e6e017c77c2d7d9ddc7 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Thu, 26 Mar 2026 10:31:17 -0300 Subject: [PATCH 4/7] style: Make terminal full-width and remove decorative command strip - Remove max-width constraint from terminal to fit container - Remove all-commands decorative strip from bottom - Terminal now takes full available width for better visual impact --- .../web/src/components/CommandShowcase.astro | 45 ++----------------- 1 file changed, 3 insertions(+), 42 deletions(-) diff --git a/packages/web/src/components/CommandShowcase.astro b/packages/web/src/components/CommandShowcase.astro index 5de4f0e..09f1206 100644 --- a/packages/web/src/components/CommandShowcase.astro +++ b/packages/web/src/components/CommandShowcase.astro @@ -326,11 +326,7 @@ const scenarios: CommandScenario[] = [ } ]; -const allCommands = [ - "/ask", "/branch", "/commit", "/commit-and-push", "/dev", "/learn", - "/reload", "/pr/create", "/pr/fix", "/pr/review", "/review", "/ship", - "/rmslop", "/todo", "/ticket/ask", "/ticket/create", "/ticket/dev", "/ticket/plan" -]; + ---
@@ -456,13 +452,7 @@ const allCommands = [
))} - - -
@@ -865,44 +888,81 @@ const orchestratorScenarios = scenarios.filter(s => ['pr-create', 'pr-fix', 'pr- z-index: 1; } - /* Tab Groups */ - .tab-groups { + /* Tabs - two fieldsets side-by-side on single line with horizontal scroll */ + .command-groups-wrapper { + position: relative; + width: 100vw; + left: 50%; + right: 50%; + margin-left: -50vw; + margin-right: -50vw; + margin-bottom: 2rem; + overflow-x: auto; + scrollbar-width: thin; + scrollbar-color: rgba(125, 166, 196, 0.2) transparent; + scroll-snap-type: x proximity; + } + + .command-groups-wrapper::-webkit-scrollbar { + height: 6px; + } + + .command-groups-wrapper::-webkit-scrollbar-track { + background: transparent; + } + + .command-groups-wrapper::-webkit-scrollbar-thumb { + background: rgba(125, 166, 196, 0.25); + border-radius: 3px; + } + + .command-groups { display: flex; - align-items: center; + flex-wrap: nowrap; justify-content: center; + align-items: flex-start; gap: 1rem; - margin-bottom: 0.75rem; + padding: 1rem 2rem; + min-width: min-content; + } + + .command-group { + margin: 0; + padding: 1rem 1.25rem 1.25rem; + border: 1px solid rgba(125, 166, 196, 0.2); + border-radius: 0.75rem; + background: rgba(8, 18, 29, 0.5); + flex-shrink: 0; + scroll-snap-align: center; + } + + .command-group--orchestrators { + border-color: rgba(95, 158, 197, 0.25); + background: rgba(95, 158, 197, 0.1); + } + + .command-group__legend { + padding: 0.25rem 0.75rem; font-family: var(--font-mono); - font-size: 0.75rem; + font-size: 0.7rem; color: var(--muted); text-transform: uppercase; - letter-spacing: 0.1em; + letter-spacing: 0.08em; + background: rgba(125, 166, 196, 0.15); + border-radius: 0.25rem; } - .tab-group-divider { - width: 1px; - height: 1rem; - background: rgba(125, 166, 196, 0.3); + .command-group--orchestrators .command-group__legend { + color: rgba(95, 158, 197, 0.9); + background: rgba(95, 158, 197, 0.2); } - /* Tabs */ - .command-strip { + .command-group__tabs { display: flex; flex-wrap: nowrap; - gap: 0.6rem; + gap: 0.5rem; justify-content: center; - margin-bottom: 0.75rem; - padding: 0.25rem 1rem; - overflow-x: auto; - scrollbar-width: none; - } - - .command-strip--orchestrators { - margin-bottom: 1.5rem; - } - - .command-strip::-webkit-scrollbar { - display: none; + padding-top: 0.5rem; } .command-tab { @@ -1352,5 +1412,26 @@ const orchestratorScenarios = scenarios.filter(s => ['pr-create', 'pr-fix', 'pr- padding: 0.45rem 0.7rem; font-size: 0.78rem; } + + .command-groups-wrapper { + margin-bottom: 1.5rem; + } + + .command-groups { + padding: 0.75rem 1rem; + gap: 0.75rem; + } + + .command-group { + padding: 0.875rem 1rem 1rem; + } + + .command-group__legend { + font-size: 0.65rem; + } + + .command-group__tabs { + gap: 0.4rem; + } } \ No newline at end of file From a678674f1f96a31abf832b738bc0312791e45c08 Mon Sep 17 00:00:00 2001 From: dbpolito Date: Thu, 26 Mar 2026 14:09:36 -0300 Subject: [PATCH 7/7] fix: update agent assignments and remove scroll centering from showcase - Update dev command agent assertion from build to navigator in test - Fix pr-create and pr-fix agent names from Navigator to Build in showcase - Remove scroll centering logic and scroll-snap CSS from CommandShowcase --- .../opencode/test/commands-config.test.ts | 2 +- .../web/src/components/CommandShowcase.astro | 22 +++---------------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/packages/opencode/test/commands-config.test.ts b/packages/opencode/test/commands-config.test.ts index db0f44e..dc6a1ba 100644 --- a/packages/opencode/test/commands-config.test.ts +++ b/packages/opencode/test/commands-config.test.ts @@ -68,7 +68,7 @@ describe("applyCommandsConfig", () => { assert.equal(cfg.command!["ticket/plan-and-sync"]?.agent, "planner"); assert.equal(cfg.command!["ask"]?.agent, "build"); assert.equal(cfg.command!["ticket/ask"]?.agent, "build"); - assert.equal(cfg.command!["dev"]?.agent, "build"); + assert.equal(cfg.command!["dev"]?.agent, "navigator"); assert.equal(cfg.command!["ship"]?.agent, "navigator"); assert.equal(cfg.command!["todo"]?.agent, "navigator"); assert.ok(cfg.command!["pr/review"]?.description); diff --git a/packages/web/src/components/CommandShowcase.astro b/packages/web/src/components/CommandShowcase.astro index b7cfa92..a1483df 100644 --- a/packages/web/src/components/CommandShowcase.astro +++ b/packages/web/src/components/CommandShowcase.astro @@ -93,7 +93,7 @@ const scenarios: CommandScenario[] = [ id: 'pr-create', label: '/pr/create', command: '/pr/create', - agentName: 'Navigator', + agentName: 'Build', task: 'Summarize branch work and publish a structured PR', steps: [ { @@ -412,7 +412,7 @@ const scenarios: CommandScenario[] = [ id: 'pr-fix', label: '/pr/fix', command: '/pr/fix', - agentName: 'Navigator', + agentName: 'Build', task: 'Fix requested PR changes', steps: [ { @@ -782,24 +782,10 @@ const commandScenarios = scenarios.filter(s => s.agentName !== 'Navigator'); } } - // Center the scroll position on load - function centerScroll() { - const wrapper = document.querySelector('.command-groups-wrapper') as HTMLElement; - if (wrapper) { - const scrollWidth = wrapper.scrollWidth; - const clientWidth = wrapper.clientWidth; - wrapper.scrollLeft = (scrollWidth - clientWidth) / 2; - } - } - if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', () => { - initShowcase(); - centerScroll(); - }); + document.addEventListener('DOMContentLoaded', initShowcase); } else { initShowcase(); - centerScroll(); } @@ -900,7 +886,6 @@ const commandScenarios = scenarios.filter(s => s.agentName !== 'Navigator'); overflow-x: auto; scrollbar-width: thin; scrollbar-color: rgba(125, 166, 196, 0.2) transparent; - scroll-snap-type: x proximity; } .command-groups-wrapper::-webkit-scrollbar { @@ -933,7 +918,6 @@ const commandScenarios = scenarios.filter(s => s.agentName !== 'Navigator'); border-radius: 0.75rem; background: rgba(8, 18, 29, 0.5); flex-shrink: 0; - scroll-snap-align: center; } .command-group--orchestrators {