Skip to content

fix(composer): show project skills in menus - #7909

Closed
t3-code[bot] wants to merge 23 commits into
mainfrom
fix/project-skills-menus
Closed

fix(composer): show project skills in menus#7909
t3-code[bot] wants to merge 23 commits into
mainfrom
fix/project-skills-menus

Conversation

@t3-code

@t3-code t3-code Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

problem

the composer only had a machine-level provider snapshot, so project/worktree skills could be missing from / and $ even though the provider loaded them correctly when a session started from that cwd.

fix

  • keep the machine snapshot as the fallback before any project session starts
  • after a provider session starts, ask that provider instance to probe a new snapshot from the session cwd
  • cache the resulting skill and slash-command catalog by provider instance plus cwd
  • reuse the cached snapshot for other threads on the same cwd, while keeping worktrees isolated
  • update codex, claude, cursor, grok, and opencode drivers to support cwd-scoped snapshot probes
  • let web, desktop, and mobile select the matching workspace snapshot, falling back to the machine snapshot when none exists
  • keep workspace snapshots volatile and bounded instead of persisting them into the machine status cache

this removes the generic filesystem discovery rpc from the earlier version. provider adapters remain authoritative for discovery.

testing

  • 175 focused tests passed across contracts, client runtime, provider drivers/registry, orchestration, web, and mobile
  • live cwd skill probes passed with Codex CLI 0.149.0 and OpenCode 1.18.21 against a real project-local SKILL.md
  • targeted typechecks passed for contracts, client runtime, server, web, and mobile
  • targeted formatting and lint passed

ui

no layout changes. this changes the catalog backing the existing / and $ menus.

model: gpt-5.6-sol
harness: Hermes Agent

request provenance

Note

Resolve provider skills and slash commands per workspace cwd in menus

  • Adds ServerProviderWorkspaceSnapshot type and optional workspaceSnapshots array on ServerProvider in server.ts so providers can carry cwd-scoped skills and slash commands
  • Adds snapshotForCwd(cwd) to Claude, Codex, and OpenCode driver instances; each probes skills for the given cwd and merges with the machine-level snapshot
  • Adds refreshWorkspaceSnapshot to ProviderRegistry and ProviderRegistryShape in ProviderRegistry.ts, capping stored snapshots at 16 per provider, stripping them from on-disk cache, and clearing them on instance rebuild
  • ProviderCommandReactor now forks a detached refreshWorkspaceSnapshot on session start (or awaits it on the no-restart fast path)
  • Adds resolveProviderSkillsForCwd / resolveProviderSlashCommandsForCwd in providerSkills.ts; web and mobile composers, timelines, and new-task flow now resolve skills and slash commands against the thread's worktree path or project cwd instead of the provider's flat list
  • Risk: upsertProviderWorkspaceSnapshot enforces a 16-snapshot cap via MAX_WORKSPACE_SNAPSHOTS_PER_PROVIDER; if a workspace uses many distinct cwds, older snapshots are evicted and skills fall back to machine-level data. OpenCodeRuntime.loadOpenCodeSkills now surfaces SDK errors instead of returning []; loadSkills preserves the old tolerant behavior but direct callers of loadOpenCodeSkills must handle failures.

Macroscope summarized 6651dc2.


Note

Medium Risk
Touches provider registry caching, subprocess/SDK probes on session start, and composer catalog resolution across web and mobile; incorrect cwd scoping could show wrong menus but is mostly read-path UI.

Overview
Composers and message timelines were driven only by the machine-level provider snapshot, so project/worktree skills and slash commands could be missing from / and $ menus until a session happened to refresh from that cwd.

This PR adds per-workspace catalogs on ServerProvider (workspaceSnapshots), populated after a thread session starts via ProviderRegistry.refreshWorkspaceSnapshot (single-flight, bounded cache, not written to the on-disk status cache). Claude, Codex, and OpenCode drivers expose snapshotForCwd to probe skills/commands for a directory; orchestration forks that refresh when starting or reusing a provider session.

Web and mobile resolve menus and $skill rendering with resolveProviderSkillsForCwd / resolveProviderSlashCommandsForCwd, keyed to the thread worktree or git cwd. Mobile new-task drafts use resolveNewTaskSkillsCwd so catalogs match local checkout vs new-worktree mode, and switching to new-worktree mode clears a stale worktree path from the draft.

Reviewed by Cursor Bugbot for commit 6651dc2. Bugbot is set up for automated code reviews on this repo. Configure here.

Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Aug 22, 2026
Comment thread apps/mobile/src/features/threads/ThreadComposer.tsx Outdated
@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.3 KiB 13.3 KiB −83 B (−0.6%) 15.1 KiB
Codex Thread snapshot wire 6.9 KiB 6.9 KiB −1 B (−0.0%) 7.3 KiB
Codex Live turn WebSocket wire 6.5 KiB 6.4 KiB −82 B (−1.2%) 7.8 KiB
Codex Live turn WebSocket decoded 55.6 KiB 55.5 KiB −88 B (−0.2%) 66.4 KiB
Codex Live turn messages 11 9 −2 (−18.2%) 21
Claude Total thread wire 13.4 KiB 13.4 KiB −1 B (−0.0%) 15.1 KiB
Claude Thread snapshot wire 6.9 KiB 6.9 KiB −3 B (−0.0%) 7.3 KiB
Claude Live turn WebSocket wire 6.5 KiB 6.5 KiB +2 B (+0.0%) 7.8 KiB
Claude Live turn WebSocket decoded 56.4 KiB 56.4 KiB 0 B (0.0%) 66.4 KiB
Claude Live turn messages 11 11 0 (0.0%) 21

Baseline: 082e6ea · PR result: 6651dc2 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the new slash-command branch of isComposerMenuLoading reaches an empty-state copy path in ComposerCommandMenu that only special-cases the skill trigger, so a pending project-skills query renders file-search copy in the / menu.

Posted via Macroscope — UI Consistency

Comment thread apps/web/src/components/chat/ChatComposer.tsx Outdated
Comment thread apps/mobile/src/features/threads/ThreadComposer.tsx
Comment thread apps/web/src/components/chat/ChatComposer.tsx Outdated
@macroscopeapp

macroscopeapp Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces workspace-scoped provider discovery and caching, including provider subprocess/SDK probes and session-lifecycle changes across server, web, and mobile. It also modifies Macroscope configuration files, so the change requires human review.

You can add or adjust custom eligibility rules. Learn more.

t3-code Bot and others added 2 commits August 22, 2026 15:47
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
t3-code Bot and others added 2 commits August 23, 2026 07:39

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the composer's new cwd-scoped skill list is not mirrored by the timeline's skill chip renderer, so project-scoped skills render inconsistently between the composer and the sent message.

Posted via Macroscope — UI Consistency

Comment on lines +893 to +898
const selectedProviderSkills = selectedProviderStatus
? resolveProviderSkillsForCwd(selectedProviderStatus, gitCwd)
: [];
const selectedProviderSlashCommands = selectedProviderStatus
? resolveProviderSlashCommandsForCwd(selectedProviderStatus, gitCwd)
: [];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The composer now resolves skills from the workspace snapshot for gitCwd, but the timeline chip renderer still reads the machine snapshot: ChatView.tsx passes skills={activeProviderStatus?.skills ?? EMPTY_PROVIDER_SKILLS} (line 6660) into MessagesTimeline, and SkillInlineText drops any $name it cannot find in that list. A project-only skill picked here therefore shows as a chip in ComposerPromptEditor and then as raw $name text once the message is sent — the same token rendered two different ways in one view.

Suggest resolving the timeline list the same way, e.g. skills={activeProviderStatus ? resolveProviderSkillsForCwd(activeProviderStatus, gitCwd) : EMPTY_PROVIDER_SKILLS} in ChatView.tsx (gitCwd is already in scope there).

Posted via Macroscope — UI Consistency

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in 48e7493: the sent-message timeline now resolves skills from the same cwd-scoped catalog as the composer.

Comment thread apps/server/src/orchestration/Layers/ProviderCommandReactor.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: one finding on error construction in the new Codex snapshotForCwd wrapper. The rest of the change (provider-owned per-instance+cwd snapshot cache, machine snapshot preserved as fallback, registry dependency taken from the environment, driver snapshotForCwd SPI) matches the conventions.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Drivers/CodexDriver.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts
Comment thread apps/mobile/src/features/threads/ThreadComposer.tsx
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the new ProviderRegistryLive.refreshWorkspaceSnapshot orchestration (per-instance+cwd cache dedupe, publish on change, stale-instance rejection, clearing cwd catalogs on instance rebuild) has no focused test. Everything else in the provider-scoped snapshot work looks consistent with the conventions — driver-owned snapshotForCwd probes, machine snapshot preserved as fallback, scoped data attached inside a single atomic Ref.modify, and workspaceSnapshots stripped from the on-disk cache.

Posted via Macroscope — Effect Service Conventions

return yield* Ref.get(providersRef);
});

const refreshWorkspaceSnapshot = Effect.fn("refreshWorkspaceSnapshot")(function* (input: {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is new backend behavior with several non-obvious invariants — dedupe by instanceId + cwd, publish only when the snapshot list actually changes, drop results from a stale ProviderInstance, and the rebuild path above (L597-L612) clearing workspaceSnapshots — but the only new registry test covers the pure upsertProviderWorkspaceSnapshot helper. Consider adding a focused ProviderRegistryLive test using the existing harness in ProviderRegistry.test.ts (fake ProviderInstance with snapshotForCwd) that asserts at least: a scoped probe is cached and published for one cwd without touching another cwd's menus or the machine snapshot, and an instance rebuild clears the cached cwd catalogs.

Posted via Macroscope — Effect Service Conventions

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in 236bb1f: ProviderRegistryLive now has focused coverage for publish, cwd dedupe, machine snapshot preservation, and rebuild invalidation.

Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
t3-code Bot and others added 2 commits August 23, 2026 18:37
# Conflicts:
#	apps/web/src/components/chat/ChatComposer.tsx
#	packages/client-runtime/src/providerSkills.test.ts
#	packages/client-runtime/src/providerSkills.ts
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/server/src/provider/Drivers/OpenCodeDriver.ts Outdated
Comment thread apps/server/src/provider/Drivers/CodexDriver.ts Outdated

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Effect service conventions review: three findings, all on the new snapshotForCwd wiring for post-session cwd catalog refreshes.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Drivers/CursorDriver.ts Outdated
Comment thread apps/server/src/provider/Drivers/GrokDriver.ts Outdated
Comment thread apps/server/src/provider/Drivers/CodexDriver.ts
Comment thread apps/server/src/provider/Layers/CodexProvider.ts
Comment thread apps/server/src/provider/Drivers/CodexDriver.ts
Comment thread apps/server/src/provider/opencodeRuntime.ts

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding: the OpenCode cwd catalog refresh reuses the full provider/model/agent inventory probe instead of a skills-only query. Codex, Claude, and the registry/rebuild handling look consistent with the conventions, and the previously missing ProviderRegistryLive coverage for refreshWorkspaceSnapshot is now present.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Drivers/OpenCodeDriver.ts Outdated
Comment thread apps/server/src/provider/Drivers/OpenCodeDriver.ts
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/server/src/provider/opencodeRuntime.ts Outdated
t3-code Bot and others added 2 commits August 23, 2026 20:18
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the Claude cwd catalog path; the Codex/OpenCode/registry items from earlier runs look addressed.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Drivers/ClaudeDriver.ts Outdated
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/server/src/provider/Layers/ClaudeProvider.ts

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the new refreshWorkspaceSnapshot cache-admission rule. The narrow cwd probes (Codex skills/list, Claude capabilities+skills, OpenCode skills-only), the stale-instance rejection, the atomic Ref.modify, and the rebuild-clears-and-publishes path all look correct.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
@github-actions github-actions Bot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Aug 23, 2026

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One finding on the workspace-snapshot admission guard in ProviderRegistry.refreshWorkspaceSnapshot.

Posted via Macroscope — Effect Service Conventions

Comment thread apps/server/src/provider/Layers/ProviderRegistry.ts Outdated
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

# Conflicts:
#	apps/server/src/provider/opencodeRuntime.inventory.test.ts
#	apps/server/src/provider/opencodeRuntime.ts
Comment thread apps/server/src/provider/opencodeRuntime.ts
Comment thread apps/server/src/provider/opencodeRuntime.ts
Comment thread apps/mobile/src/features/threads/ThreadComposer.tsx
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Comment thread apps/mobile/src/features/threads/new-task-flow-provider.tsx
Comment thread apps/mobile/src/features/threads/new-task-flow-provider.tsx Outdated
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 321b744. Configure here.

Comment thread apps/mobile/src/features/threads/new-task-flow-provider.tsx Outdated
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
@t3dotgg

t3dotgg commented Aug 26, 2026

Copy link
Copy Markdown
Member

This PR is an atrocity, and I have no idea why it's still up. It changes the review rule criteria because it couldn't pass reviews because of how much of a mess it is. The problem that it states in the title is entirely inaccurate and does not reflect the current state of the problem or the solution. I have no idea what it's trying to do, but I know it's not doing it right. I am closing it, and it should never be opened again.

If you want to fix this:

  1. Cut an issue that actually describes the problem.
  2. Follow up with a concise fix that doesn't touch a single Markdown file and actually fixes the problem as described.

I need evidence of both claims: that the problem exists and that the solution works. This PR provides neither and instead introduces a lot of noise.

@t3dotgg t3dotgg closed this Aug 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant