feat: Codex skill picker (desktop + mobile)#75
Merged
Conversation
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>
- 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>
|
Vercel preview is ready. |
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
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.
skills/listis loaded once at executor start, cached, and carried on the existingregister_nodecapability payload (ExecutorCapabilities→ExecutorNodeExecutor→BroExecutorCapabilitySummary), projected per-bro into the session snapshot. Refreshes on executor reconnect (no liveskills/changedwiring in v1).plan_mode: webskillName→ APIskill_name→ instruction/task/outboundmetadata["skill"]→ all threeCodexExecutorturn-start sites →turn/startwith a{type:"skill", name, path}input item +$namemarker. Skill and plan-mode are independent/combinable.skill_droppedmarker and the turn runs plainly (never implies the skill ran).ExecutorSkillcarries 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, specdocs/superpowers/specs/2026-06-08-skill-picker-design.md, plandocs/superpowers/plans/2026-06-08-skill-picker.md.Deferred follow-ups (documented in the spec): inline
/filter trigger; surfacing theskill_droppedmarker as a UI notice.Test Plan
.venv/bin/python -m pytest— 710 passednpx tsc --noEmitclean;vitesttargeted suites (SkillPicker, skill-payload, skill-metadata, session-client) — 85 passedtest_codex_multi_message_turn.py) green🤖 Generated with Claude Code