Skip to content

feat: Codex skill picker (desktop + mobile)#75

Merged
plutoless merged 38 commits into
mainfrom
feat/design-update
Jun 8, 2026
Merged

feat: Codex skill picker (desktop + mobile)#75
plutoless merged 38 commits into
mainfrom
feat/design-update

Conversation

@plutoless

Copy link
Copy Markdown
Contributor

Summary

Adds a per-bro Codex skill picker to the active-session composer on desktop and mobile. Skills are discovered per-executor and a chosen skill rides a turn, activating the agent-native Codex skill via the app-server.

  • Discoveryskills/list is loaded once at executor start, cached, and carried on the existing register_node capability payload (ExecutorCapabilitiesExecutorNodeExecutorBroExecutorCapabilitySummary), projected per-bro into the session snapshot. Refreshes on executor reconnect (no live skills/changed wiring in v1).
  • Activation — the chosen skill rides turn metadata like plan_mode: web skillName → API skill_name → instruction/task/outbound metadata["skill"] → all three CodexExecutor turn-start sites → turn/start with a {type:"skill", name, path} input item + $name marker. Skill and plan-mode are independent/combinable.
  • Vanished-skill contract — validate-before-write: a skill is only written onto the turn/timeline if present + enabled in the bro's current catalog; otherwise it is dropped with an observable skill_dropped marker and the turn runs plainly (never implies the skill ran).
  • UI — desktop popover + mobile bottom sheet (ported from the design prototype) read the real per-bro catalog; the chosen skill renders as a pill on the user's timeline bubble.
  • Lean snapshotExecutorSkill carries only name/display_name/short description/hint/path/enabled (no full descriptions, dependencies, or node-local icons), keeping the snapshot small.

Design + protocol contract were verified against a live Codex app-server (codex-cli 0.137.0); a curated fixture is committed at docs/protocol/fixtures/codex-skills-list-sample.json.

Docs: docs/protocol/skills.md, spec docs/superpowers/specs/2026-06-08-skill-picker-design.md, plan docs/superpowers/plans/2026-06-08-skill-picker.md.

Deferred follow-ups (documented in the spec): inline / filter trigger; surfacing the skill_dropped marker as a UI notice.

Test Plan

  • Backend: .venv/bin/python -m pytest — 710 passed
  • Web: npx tsc --noEmit clean; vitest targeted suites (SkillPicker, skill-payload, skill-metadata, session-client) — 85 passed
  • Codex turn-streaming regression (test_codex_multi_message_turn.py) green
  • Manual smoke: connect a Codex executor, open a bro's active session, pick a skill, send — verify the picker lists real skills, the pill renders, and the turn runs; disable/uninstall a skill and reconnect to confirm it leaves the picker

🤖 Generated with Claude Code

plutoless and others added 30 commits June 8, 2026 01:25
Per-executor Codex skill discovery + chosen-skill-rides-the-turn,
mirroring the plan_mode plumbing end to end.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- model skills across all three capability models (core, wire, summary)
  + the manual _descriptor copy; discovery otherwise never reaches snapshot
- add node_capabilities message for skills/changed (node_status doesn't
  update registry today)
- thread skill explicitly through API → instruction/command metadata → all
  three codex turn_start sites
- vanished-skill: validate-before-write observable contract, no fake fallback
- path optional + marker-only activation fallback; dependencies structured;
  add fixture-first testing and open questions

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Probed codex-cli 0.137.0 skills/list and captured a curated fixture.
Verified: path always returned (full skill-item activation is primary);
dependencies is structured not list[str]; response grouped per cwd with
errors; icons exist but as node-local paths (deferred); defaultPrompt is
the picker hint. Snapshot carries a lean ~15KB projection (vs ~40KB raw).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Drop the skills/changed subscription and node_capabilities message.
Skills load once when the executor starts, cache on the executor, and
ride the existing register_node capability payload — zero protocol
additions. Catalog refreshes on executor reconnect; live refresh moves
to a documented future enhancement.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
21 TDD tasks across shared models, codex discovery (load-once),
runtime/API skill threading, vanished-skill contract, and the web
picker + timeline pill. Grounded in the live-app-server fixture.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add skills=capabilities.skills to the ExecutorNodeExecutor construction
in _descriptor so discovered skills reach the backend wire model.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds _mark_timeline_message_skill helper next to _mark_timeline_message_plan_mode
and applies it at all three projection sites so the user message bubble carries
skill metadata for the web UI skill-pill renderer (Task 14).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy all dt-cmp-lead, dt-cmp-skill*, dt-skill-* (desktop) and
thr-skill*, thr-skillchip*, thr-skillpill* (mobile) rule blocks
verbatim from prototypes/design into the web stylesheets so the
already-built SkillPicker component renders with the approved design.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
plutoless and others added 8 commits June 8, 2026 04:31
- Import SkillLeadCluster into ArtboardShell.tsx; add ExecutorSkill type import
- Add skill state to DesktopComposerBar; reset on bro change and after submit
- Derive catalog via broSkillsMap[bro.id] passed as skills prop from DesktopDetail
- Add broSkillsMap to NewbroShell (populated from BroListResponse codex.skills)
- Render SkillLeadCluster in the bar lead area when skills.length > 0
- Update input placeholder to prefer skill.hint when a skill is selected
- Extract buildExecutorTextPayload pure helper; wire into submitText for skillName
- Add skill-payload.test.ts (7 tests, all green); tsc --noEmit clean

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add MobileSkillSheet, skill state, chip/pill toggle, and skill payload
wiring to MobileThreadSurface; pass skills from broSkillsMap at the
MobileDetail render site; clear skill on bro change.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Surface Task 14's metadata.skill on the user bubble via a read-only pill,
mirroring the plan-mode indicator; extract skillFromMessageMetadata to a
testable lib file and thread it through timelineSkill → ChatMessage → ConversationMessageBubble.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… hint

Addresses final-review findings:
- reset _skills_loaded in _close_app_session so a skill installed while
  disconnected is discovered on reconnect (matches docs)
- _apply_skill_marker only treats the marker as present as a standalone token
- remove the non-functional '/' filter affordance from the desktop chip/popover
  (inline '/' trigger is a documented follow-up)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jun 8, 2026

Copy link
Copy Markdown

Vercel preview is ready.

https://newbro-djm30w1gt-agora-devx.vercel.app

@plutoless
plutoless merged commit 3e0342b into main Jun 8, 2026
4 checks passed
@plutoless
plutoless deleted the feat/design-update branch June 8, 2026 14:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant