Fix workspace-scoped Codex skill discovery#3059
Conversation
- Propagate cwd through provider status probes - Add server RPC for workspace skill discovery - Load workspace skills in the composer UI
- Clarify bogus skill as a durable discovery test fixture - Stabilize composer fallback skill array identity
- Skip Codex skill spawning for disabled instances - Move bogus skill fixture out of workspace discovery
- Refresh workspace skill cache on provider and connection changes - Validate Codex skill cwd before spawning the app server - Cover server.listProviderSkills RPC branches
- Track the active workspace key in provider skill state - Reset pending skills when switching workspace targets
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
ApprovabilityVerdict: Needs human review This PR introduces workspace-scoped Codex skill discovery as a new feature with a new server RPC endpoint, bounded caching infrastructure, new error handling, and cross-platform client state management. Despite the 'fix' framing, it adds significant new capability and user-facing behavior that warrants human review. You can customize Macroscope's approvability policy. Learn more. |
- Keep pending skill lookups scoped to the active workspace key - Surface Codex skill-list timeout errors in the composer - Add regression coverage for stale pending skills
# Conflicts: # apps/server/src/provider/Layers/CursorProvider.ts # apps/web/src/components/chat/ChatComposer.tsx
6acc264 to
9f66820
Compare
# Conflicts: # apps/web/src/environments/runtime/connection.test.ts # apps/web/src/environments/runtime/service.savedEnvironments.test.ts # apps/web/src/environments/runtime/service.threadSubscriptions.test.ts # apps/web/src/localApi.ts # packages/client-runtime/src/wsRpcClient.ts
Co-authored-by: codex <codex@users.noreply.github.com>
9f66820 to
00cebad
Compare
- Keep prior workspace skills visible while refreshes are pending - Add tests for loaded, pending, workspace-switch, and empty states
- Preserve and clear cached workspace skills by query state - Cover pending data, empty data, and workspace switches
Co-authored-by: codex <codex@users.noreply.github.com>
- Show lookup failures even when provider snapshot skills remain - Cover the web command menu fallback-and-error rendering path
- Document expected workspace-aware skill behavior - Record primary files, focused tests, and development ports
- Avoid workspace skill probes for empty drafts and unrelated messages - Add focused coverage for complete user skill tokens - Refresh branch details after merging upstream main
- Share sent-message skill parsing with timeline rendering - Cover skill references at the end of sent prompts
- Recognize skill tokens followed by punctuation - Cache sent-message matches and avoid token-array allocation - Remove stale branch snapshot metadata
- Share punctuation-aware parsing across web and mobile - Reject path and statement continuations when gating skill loading - Cover sentence boundaries and code-variable continuations
- Add the shared workspace package to peer dependencies - Refresh the mobile markdown package snapshot hash
- Update Effect Vitest peer dependency wiring for the patched beta release - Refresh lockfile metadata and Alchemy dependency resolution
# Conflicts: # apps/server/src/provider/Layers/CodexProvider.ts
- Remove fallback-driven workspace query refreshes on web and mobile - Drop the unused no-op web invalidation helper - Document the corrected workspace query behavior
|
My PR #3982 solves for both codex and Grok |
- Forward configured launch arguments to workspace skill probes - Clear retained workspace skills after failed refreshes - Add focused probe and snapshot regressions
|
@jakeleventhal Thanks for the pointer. I confirmed #3982 carries the provider-neutral Codex/Grok approach and explicitly supersedes #3901. This branch still includes additional mobile composer/feed coverage, timeline skill decoration, shared web/mobile refresh/error policy, and bounded structured failure handling, so I’ll leave the overlap visible for maintainers to decide what to merge or port. |
- Explain why provider snapshots stay hidden during pending lookups
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit a973e27. Configure here.
- Pass a null skill cwd until a draft worktree materializes - Keep local checkout skill queries and path searches unchanged - Cover local, materialized, and future worktree resolution

Summary
Fix Codex repo-local skill discovery by resolving skills for the active project or worktree cwd instead of relying on the provider-wide status snapshot.
The implementation adds a workspace-scoped provider-skills RPC and a shared web/mobile resolution policy so composer suggestions and rendered skill chips refresh for the correct workspace without leaking stale skills across workspace, environment, or provider changes.
What Changed
server.listProviderSkillscontracts, WebSocket and local API handlers, and environment-query wiring keyed by environment, provider instance, and cwd.ProviderSkillsListerto return snapshot skills for non-Codex or disabled Codex providers and run Codexskills/listin the validated workspace cwd for enabled Codex providers.$menu or existing complete$skillreferences, and load timeline skills only when a sent user prompt contains a complete skill reference, including one at the end of the message; web and mobile new-worktree drafts deliberately use snapshot fallback until their cwd exists and never probe the base checkout for repo-local skills.Why
Fixes #3040.
Codex discovers repo-local skills relative to the cwd supplied to
skills/list, but a provider status snapshot is global to the provider instance. A workspace-scoped query is therefore required to show the correct skills for each project and worktree, especially while switching between workspaces or refreshing under failure.Validation
pnpm exec vp test --maxWorkers=1 apps/server/src/provider/ProviderSkillsLister.test.ts apps/server/src/provider/Layers/CodexProvider.test.ts packages/client-runtime/src/state/providerWorkspaceSkills.test.ts packages/client-runtime/src/state/runtime.test.ts apps/web/src/lib/providerWorkspaceSkillsState.test.ts apps/web/src/composer-editor-mentions.test.ts apps/web/src/components/chat/ComposerCommandMenu.test.tsx apps/web/src/components/chat/MessagesTimeline.test.tsx apps/mobile/src/features/threads/new-task-provider-skills.test.ts apps/mobile/src/features/threads/thread-composer-skill-items.test.ts(10 files, 92 tests passed)pnpm exec vp test --maxWorkers=1 apps/server/src/server.test.ts -t "server.listProviderSkills"(5 tests passed)pnpm exec vp test run --passWithNoTests apps/mobile/src/lib/nativeMarkdownText.test.ts packages/shared/src/skillInlineTokens.test.ts(native and shared inline-token coverage passed as part of the focused 4-file run)pnpm exec vp check apps/server/src/provider/Layers/CodexProvider.ts apps/server/src/provider/Layers/CodexProvider.test.ts apps/server/src/provider/ProviderSkillsLister.ts apps/server/scripts/codex-skills-mock-app-server.ts packages/client-runtime/src/state/providerWorkspaceSkills.ts packages/client-runtime/src/state/providerWorkspaceSkills.test.ts apps/web/src/lib/providerWorkspaceSkillsState.ts apps/web/src/lib/providerWorkspaceSkillsState.test.ts apps/mobile/src/state/providerWorkspaceSkillsState.ts(9 files passed formatting and lint/type-aware checks)pnpm exec vp check(0 errors; 9 existing React warnings)pnpm exec vp run typecheck(15 tasks passed)pnpm exec vp run lint:mobile(passed; SwiftLint, ktlint, and detekt were unavailable)5735and server13775: paired the isolated app, added thecodex-skillsworktree, and verified that typing$opened the skill picker with repo-scoped entries such asiOS Debugger Agentalongside system skills.pnpm exec vp test run --passWithNoTests --project unit src/components/ChatView.logic.test.ts src/components/chat/ComposerCommandMenu.test.tsx src/lib/providerWorkspaceSkillsState.test.tsfromapps/web(3 files, 47 tests passed after the future-worktree review fix)pnpm exec vp check src/components/ChatView.logic.ts src/components/ChatView.logic.test.ts src/components/ChatView.tsx src/components/chat/ChatComposer.tsxfromapps/web(4 files passed formatting and lint/type-aware checks)5735and server13775: with$open, a future-worktree draft sent 0server.listProviderSkillsframes; switching the same draft to the current checkout sent 1 request with the assigned worktree cwd.Proof
Note
Medium Risk
Spawns external Codex app-server processes per workspace lookup (bounded and cached); incorrect cwd or stale-skill policy could affect composer/timeline UX but not auth or data persistence.
Overview
Fixes repo-local Codex skills showing up in the wrong workspace by listing skills for the active project/worktree cwd instead of the global provider status snapshot.
Server: New
server.listProviderSkillsRPC. Codex runs a short-lived app-server probe withskills/listfor the requested cwd (15s timeout, process kill on hang).ProviderSkillsListercoalesces identical provider+cwd requests, caps concurrency, and uses a 1s TTL cache. Non-Codex or disabled Codex still return snapshot skills. Failures use structuredServerProviderSkillsListErrorwith sanitized causes.Clients (web + mobile): Shared
useProviderWorkspaceSkillspolicy keyed by environment, instance, and cwd—lazy fetch when the$menu is open or the prompt/timeline has a complete$skilltoken; preserve skills on same-workspace refresh; clear on workspace switch or failed refresh; fall back to provider snapshot on empty/error while surfacing errors in the skill picker. Future worktree drafts skip cwd probes until a directory exists.Tokens: Shared
parseInlineSkillTokens/hasInlineSkillTokentighten boundaries (e.g. sentence punctuation vs$HOME/$value).Reviewed by Cursor Bugbot for commit a9b4a6a. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Fix workspace-scoped Codex skill discovery in composer and timeline
server.listProviderSkillsWebSocket RPC endpoint that spawns the Codex app-server for a givencwdand returns workspace-scoped skills, with a bounded request cache and semaphore to limit concurrency.useProviderWorkspaceSkillshooks (web and mobile) that query workspace skills, snapshot prior results, fall back to provider-snapshot skills on error, and expose loading/error state.ChatComposer,ThreadComposer, andChatViewnow consume workspace skills instead of the static provider snapshot; skill fetching is triggered when the prompt or timeline contains a complete$skilltoken.ComposerCommandMenu,ComposerCommandPopover) surface skill fetch errors as inline alerts and show a loading state while skills are pending.parseInlineSkillTokens/hasInlineSkillTokenutilities in@t3tools/sharedwith sentence-boundary rules that exclude code-like tokens ($HOME/.codex,$value;).Macroscope summarized a9b4a6a.