fix(server): discover project skills for Claude - #9210

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills
Sep 2, 2026
Merged

fix(server): discover project skills for Claude#9210
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills

Conversation

@anirudhsama

@anirudhsamaanirudhsama commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes#6449

What changed

The Claude driver now exposes snapshotForCwd, so the workspace snapshot plumbing that #8778 added for Codex and OpenCode applies to Claude as well. The hook reuses the existing filesystem scanner (discoverClaudeSkills) with the thread's working directory and overlays the result on the machine snapshot. Thirteen lines in ClaudeDriver.ts, nothing else.

Why

Claude project skills were scanned from the server's own startup directory (ServerConfig.cwd), so a project's .claude/skills never reached the $ picker or the / menu. #8778 by @UtkarshUsername built the per-cwd snapshot mechanism (registry, reactor trigger, client resolvers) but only wired Codex and OpenCode into it. This is the minimal follow-up for Claude; no subprocess is needed because the scanner already knows Claude Code's discovery rules, so there is no timeout or error mapping either.

Slash commands stay machine-level, matching the Codex and OpenCode implementations. Related but not fixed here: #8757 (scope label collision when the packaged server cwd is $HOME).

Overlaps with #9090 and #9180, which take on more (chip styling, docs, Cursor, Grok, mobile, registry cache changes). This one is offered as the smallest change that closes the Claude gap on its own.

Surfaces

  • Web and desktop: fixed, they already read workspace snapshots.
  • Mobile: not covered. It reads the machine-level skills list directly for every provider, so it needs its own change regardless of this PR.

Verification

  • ClaudeSkills.test.ts and ProviderRegistry.test.ts pass (61 tests).
  • Server typecheck and targeted lint clean.
  • Manual pass on web over the tailnet: a .claude/skills/hello-project skill in a project outside the server cwd appears in the $ picker after the session starts.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots: server-only change, verified manually in the web client

Built with GPT-5.6 Sol in the Codex harness, orchestrated by Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Small driver-only change reusing existing skill discovery and snapshot overlay pattern; no auth or data-handling changes.

Overview
Claude now participates in the per-workspace snapshot path so project-local .claude/skills show up in the client instead of only skills scanned from the server’s startup directory.

The driver exposes snapshotForCwd, matching Codex and OpenCode: when the provider is enabled it runs getSnapshot and discoverClaudeSkills for the thread’s cwd, then merges the discovered skills onto the machine snapshot (with filesystem/path services provided). When disabled it keeps using the plain machine snapshot.

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

Note

Fix ClaudeDriver.create to discover project skills per working directory

The provider factory now returns an instance with a snapshotForCwd function. Enabled instances load the base machine snapshot, run Claude skill discovery scoped to the supplied working directory, and merge discovered skills into the snapshot before returning it. Disabled instances expose the same function but return the existing snapshot without running discovery.

  • Behavioral Change: enabled Claude provider instances now produce cwd-specific snapshots that include newly discovered skills, whereas they previously returned a static snapshot.

Macroscope summarized 8a868fc.

The Claude driver scanned project skills from the server's own startup
directory, so a project's .claude/skills never reached the composer.
Expose snapshotForCwd on the Claude instance, reusing the existing
filesystem scanner with the thread's working directory, so the
workspace snapshot plumbing from pingdotgg#8778 applies to Claude too.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8a868fc

Macroscope's review found this PR approvable — The change is a narrow integration fix that reuses the existing Claude skill scanner to populate workspace-specific snapshots, with no changes to defaults, schemas, deployment, or execution workflows. Its runtime effect is limited to best-effort filesystem discovery for the requested project directory.

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

@maria-rcks
maria-rcks merged commit bc918e7 into pingdotgg:mainSep 2, 2026
22 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Renumbers the v2 migrations 044-052 to 045-053 behind main's
044_ClearAutomaticProjectModelDefaults, and adopts main's sticky
new-thread selection (#9164), local-only worktree bases in the v2 launch
path (#8751), the PR summary read for settlement (#9176), Claude per-cwd
skills (#9210), the provider editor redesign with the branch's dedicated
environment fields re-grafted (#8508), and the client half of
continue-threads-across-restart (#9167). The server-side continuation
markers stay unported: they live in the v1 session directory, and v2
recovery terminalizes running runs on restart, so the capability is
withheld until the v2 runtime carries them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* fix(server): discover project skills for Claude by @anirudhsama in pingdotgg/t3code#9210
* feat(web): redesign provider editor and models list by @StiensWout in pingdotgg/t3code#8508
* fix(web): prevent connection rows from wrapping during removal by @MatthewFeroz in pingdotgg/t3code#8706
* fix(pull-requests): align checkout control with author by @maria-rcks in pingdotgg/t3code#9196
* fix(release): pin patched expo-sharing version by @willsheldon in pingdotgg/t3code#9250
* chore(mobile): update Expo Sharing to 57.0.17 by @StiensWout in pingdotgg/t3code#9248
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1257...v0.0.39-nightly.20260902.1260
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1260
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Sep 2, 2026
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries)
Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue
active threads across server self-updates (pingdotgg#9167), provider editor and models
list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary
RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry
(pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project
skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile
long-press file references (pingdotgg#9258).
Conflict resolutions (14 files), keep-both unless noted:
- RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and
upstream-release RPCs sit beside upstream's new pullRequestsSummary.
- ws.ts route layer: fork's computer task/view brokers plus upstream's
serverSelfUpdate wrapped in withRunningThreadContinuation.
- PullRequestService: fork's upstream-project reads and scoped diff epochs
kept; upstream's summary read, refCacheKey and viewer-flight invalidation
added. invalidate() now scopes diff-only invalidation AND clears viewer
flights on a whole-workspace refresh. Test file keeps both new suites.
- client-runtime pullRequests: fork's PR stack atoms kept, TTL constant
takes upstream's new name.
- ChatMarkdown: upstream's one-character gutter rule replaces the fork's
equivalent digitWidth fix.
- ChatComposer: fork's voice-session button kept; context meter now honours
settings.contextWindowMeterEnabled.
- ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's
min-w-0 truncate.
- mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's
onCancelQueuedMessage.
- ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and
arch both threaded through.
Integration: upstream's restart continuation and the fork's resume-on-restart
both ran at boot on the same orphans. The continuation-marker helpers move to
provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers
any binding carrying the marker to upstream's pass (logged as deferred), so a
thread is never continued twice. Test added.
Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of
@t3tools/mobile-markdown-text was what broke the mobile typecheck.
Typecheck clean: contracts, shared, client-runtime, server, web, mobile
(desktop exits 1 on a pre-existing warning-level diagnostic). Startup and
self-update suites 36 passing; web sidebar/composer/settings suites 419
passing; fork guard script OK.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
donjor added a commit to RSI-Software/t3code-hyprws that referenced this pull request Sep 2, 2026
… commit
## What Changed
Record `fix(provider): resolve repo skills per workspace (#188)` as a partial retirement in `docs/internals/fork-delta.md`. The superseded scope goes in Retired. The remainder stays in Kept.
## Why
The unblock walk onto `v0.0.39-nightly.20260902.1261` reduced that commit from 546 insertions across 17 files to 35 insertions across 2 server files.
```diff
- providers.workspaceSkills RPC, contract schemas, client atom family, chat-view preference, Codex pair
+ cwd-keyed Claude capabilities probe cache at capacity 16
+ slashCommands merged alongside skills in upstream's snapshotForCwd
```
Upstream `bc918e7` (`pingdotgg#9210`) supplies per-workspace provider snapshots: `snapshotForCwd` on every driver, `refreshWorkspaceSnapshot` in the registry, `workspaceSnapshots` on `ServerProvider`, and the client resolvers. That is what supersedes the dropped scope.
Upstream's `snapshotForCwd` merges `skills` alone. Its capabilities probe cache stays capacity 1, keyed on binary plus resolved HOME. The remainder covers exactly that gap.
A subject in both Retired and Kept is how the ledger spells a partial, so the commit stays in the stack.
**Checks**
- `vp run fork:delta --check`: ok, 220 fork commits tagged.
- `vp run fork:upstream-refs docs/internals/fork-delta.md`: unchanged at 8 pre-existing live references. The new Retired row code-spans its subject and adds none. The 8 predate this branch.
`#492` stays open. Its first `Done when` is a user-visible claim, that a project's `.claude/commands` appear in the Claude menu for a worktree thread. No client pass has been run, so this cannot close it.
Refs #492
Refs #481
Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <38745786+donjor@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill picker lists the server's startup-directory skills, not the active project's

2 participants

@anirudhsama@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(server): discover project skills for Claude - #9210

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills
Sep 2, 2026
Merged

fix(server): discover project skills for Claude#9210
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills

Conversation

@anirudhsama

@anirudhsamaanirudhsama commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes#6449

What changed

The Claude driver now exposes snapshotForCwd, so the workspace snapshot plumbing that #8778 added for Codex and OpenCode applies to Claude as well. The hook reuses the existing filesystem scanner (discoverClaudeSkills) with the thread's working directory and overlays the result on the machine snapshot. Thirteen lines in ClaudeDriver.ts, nothing else.

Why

Claude project skills were scanned from the server's own startup directory (ServerConfig.cwd), so a project's .claude/skills never reached the $ picker or the / menu. #8778 by @UtkarshUsername built the per-cwd snapshot mechanism (registry, reactor trigger, client resolvers) but only wired Codex and OpenCode into it. This is the minimal follow-up for Claude; no subprocess is needed because the scanner already knows Claude Code's discovery rules, so there is no timeout or error mapping either.

Slash commands stay machine-level, matching the Codex and OpenCode implementations. Related but not fixed here: #8757 (scope label collision when the packaged server cwd is $HOME).

Overlaps with #9090 and #9180, which take on more (chip styling, docs, Cursor, Grok, mobile, registry cache changes). This one is offered as the smallest change that closes the Claude gap on its own.

Surfaces

  • Web and desktop: fixed, they already read workspace snapshots.
  • Mobile: not covered. It reads the machine-level skills list directly for every provider, so it needs its own change regardless of this PR.

Verification

  • ClaudeSkills.test.ts and ProviderRegistry.test.ts pass (61 tests).
  • Server typecheck and targeted lint clean.
  • Manual pass on web over the tailnet: a .claude/skills/hello-project skill in a project outside the server cwd appears in the $ picker after the session starts.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots: server-only change, verified manually in the web client

Built with GPT-5.6 Sol in the Codex harness, orchestrated by Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Small driver-only change reusing existing skill discovery and snapshot overlay pattern; no auth or data-handling changes.

Overview
Claude now participates in the per-workspace snapshot path so project-local .claude/skills show up in the client instead of only skills scanned from the server’s startup directory.

The driver exposes snapshotForCwd, matching Codex and OpenCode: when the provider is enabled it runs getSnapshot and discoverClaudeSkills for the thread’s cwd, then merges the discovered skills onto the machine snapshot (with filesystem/path services provided). When disabled it keeps using the plain machine snapshot.

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

Note

Fix ClaudeDriver.create to discover project skills per working directory

The provider factory now returns an instance with a snapshotForCwd function. Enabled instances load the base machine snapshot, run Claude skill discovery scoped to the supplied working directory, and merge discovered skills into the snapshot before returning it. Disabled instances expose the same function but return the existing snapshot without running discovery.

  • Behavioral Change: enabled Claude provider instances now produce cwd-specific snapshots that include newly discovered skills, whereas they previously returned a static snapshot.

Macroscope summarized 8a868fc.

The Claude driver scanned project skills from the server's own startup
directory, so a project's .claude/skills never reached the composer.
Expose snapshotForCwd on the Claude instance, reusing the existing
filesystem scanner with the thread's working directory, so the
workspace snapshot plumbing from pingdotgg#8778 applies to Claude too.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8a868fc

Macroscope's review found this PR approvable — The change is a narrow integration fix that reuses the existing Claude skill scanner to populate workspace-specific snapshots, with no changes to defaults, schemas, deployment, or execution workflows. Its runtime effect is limited to best-effort filesystem discovery for the requested project directory.

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

@maria-rcks
maria-rcks merged commit bc918e7 into pingdotgg:mainSep 2, 2026
22 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Renumbers the v2 migrations 044-052 to 045-053 behind main's
044_ClearAutomaticProjectModelDefaults, and adopts main's sticky
new-thread selection (#9164), local-only worktree bases in the v2 launch
path (#8751), the PR summary read for settlement (#9176), Claude per-cwd
skills (#9210), the provider editor redesign with the branch's dedicated
environment fields re-grafted (#8508), and the client half of
continue-threads-across-restart (#9167). The server-side continuation
markers stay unported: they live in the v1 session directory, and v2
recovery terminalizes running runs on restart, so the capability is
withheld until the v2 runtime carries them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* fix(server): discover project skills for Claude by @anirudhsama in pingdotgg/t3code#9210
* feat(web): redesign provider editor and models list by @StiensWout in pingdotgg/t3code#8508
* fix(web): prevent connection rows from wrapping during removal by @MatthewFeroz in pingdotgg/t3code#8706
* fix(pull-requests): align checkout control with author by @maria-rcks in pingdotgg/t3code#9196
* fix(release): pin patched expo-sharing version by @willsheldon in pingdotgg/t3code#9250
* chore(mobile): update Expo Sharing to 57.0.17 by @StiensWout in pingdotgg/t3code#9248
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1257...v0.0.39-nightly.20260902.1260
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1260
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Sep 2, 2026
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries)
Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue
active threads across server self-updates (pingdotgg#9167), provider editor and models
list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary
RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry
(pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project
skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile
long-press file references (pingdotgg#9258).
Conflict resolutions (14 files), keep-both unless noted:
- RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and
upstream-release RPCs sit beside upstream's new pullRequestsSummary.
- ws.ts route layer: fork's computer task/view brokers plus upstream's
serverSelfUpdate wrapped in withRunningThreadContinuation.
- PullRequestService: fork's upstream-project reads and scoped diff epochs
kept; upstream's summary read, refCacheKey and viewer-flight invalidation
added. invalidate() now scopes diff-only invalidation AND clears viewer
flights on a whole-workspace refresh. Test file keeps both new suites.
- client-runtime pullRequests: fork's PR stack atoms kept, TTL constant
takes upstream's new name.
- ChatMarkdown: upstream's one-character gutter rule replaces the fork's
equivalent digitWidth fix.
- ChatComposer: fork's voice-session button kept; context meter now honours
settings.contextWindowMeterEnabled.
- ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's
min-w-0 truncate.
- mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's
onCancelQueuedMessage.
- ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and
arch both threaded through.
Integration: upstream's restart continuation and the fork's resume-on-restart
both ran at boot on the same orphans. The continuation-marker helpers move to
provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers
any binding carrying the marker to upstream's pass (logged as deferred), so a
thread is never continued twice. Test added.
Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of
@t3tools/mobile-markdown-text was what broke the mobile typecheck.
Typecheck clean: contracts, shared, client-runtime, server, web, mobile
(desktop exits 1 on a pre-existing warning-level diagnostic). Startup and
self-update suites 36 passing; web sidebar/composer/settings suites 419
passing; fork guard script OK.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
donjor added a commit to RSI-Software/t3code-hyprws that referenced this pull request Sep 2, 2026
… commit
## What Changed
Record `fix(provider): resolve repo skills per workspace (#188)` as a partial retirement in `docs/internals/fork-delta.md`. The superseded scope goes in Retired. The remainder stays in Kept.
## Why
The unblock walk onto `v0.0.39-nightly.20260902.1261` reduced that commit from 546 insertions across 17 files to 35 insertions across 2 server files.
```diff
- providers.workspaceSkills RPC, contract schemas, client atom family, chat-view preference, Codex pair
+ cwd-keyed Claude capabilities probe cache at capacity 16
+ slashCommands merged alongside skills in upstream's snapshotForCwd
```
Upstream `bc918e7` (`pingdotgg#9210`) supplies per-workspace provider snapshots: `snapshotForCwd` on every driver, `refreshWorkspaceSnapshot` in the registry, `workspaceSnapshots` on `ServerProvider`, and the client resolvers. That is what supersedes the dropped scope.
Upstream's `snapshotForCwd` merges `skills` alone. Its capabilities probe cache stays capacity 1, keyed on binary plus resolved HOME. The remainder covers exactly that gap.
A subject in both Retired and Kept is how the ledger spells a partial, so the commit stays in the stack.
**Checks**
- `vp run fork:delta --check`: ok, 220 fork commits tagged.
- `vp run fork:upstream-refs docs/internals/fork-delta.md`: unchanged at 8 pre-existing live references. The new Retired row code-spans its subject and adds none. The 8 predate this branch.
`#492` stays open. Its first `Done when` is a user-visible claim, that a project's `.claude/commands` appear in the Claude menu for a worktree thread. No client pass has been run, so this cannot close it.
Refs #492
Refs #481
Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <38745786+donjor@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill picker lists the server's startup-directory skills, not the active project's

2 participants

@anirudhsama@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): discover project skills for Claude - #9210

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills
Sep 2, 2026
Merged

fix(server): discover project skills for Claude#9210
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills

Conversation

@anirudhsama

@anirudhsamaanirudhsama commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes#6449

What changed

The Claude driver now exposes snapshotForCwd, so the workspace snapshot plumbing that #8778 added for Codex and OpenCode applies to Claude as well. The hook reuses the existing filesystem scanner (discoverClaudeSkills) with the thread's working directory and overlays the result on the machine snapshot. Thirteen lines in ClaudeDriver.ts, nothing else.

Why

Claude project skills were scanned from the server's own startup directory (ServerConfig.cwd), so a project's .claude/skills never reached the $ picker or the / menu. #8778 by @UtkarshUsername built the per-cwd snapshot mechanism (registry, reactor trigger, client resolvers) but only wired Codex and OpenCode into it. This is the minimal follow-up for Claude; no subprocess is needed because the scanner already knows Claude Code's discovery rules, so there is no timeout or error mapping either.

Slash commands stay machine-level, matching the Codex and OpenCode implementations. Related but not fixed here: #8757 (scope label collision when the packaged server cwd is $HOME).

Overlaps with #9090 and #9180, which take on more (chip styling, docs, Cursor, Grok, mobile, registry cache changes). This one is offered as the smallest change that closes the Claude gap on its own.

Surfaces

  • Web and desktop: fixed, they already read workspace snapshots.
  • Mobile: not covered. It reads the machine-level skills list directly for every provider, so it needs its own change regardless of this PR.

Verification

  • ClaudeSkills.test.ts and ProviderRegistry.test.ts pass (61 tests).
  • Server typecheck and targeted lint clean.
  • Manual pass on web over the tailnet: a .claude/skills/hello-project skill in a project outside the server cwd appears in the $ picker after the session starts.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots: server-only change, verified manually in the web client

Built with GPT-5.6 Sol in the Codex harness, orchestrated by Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Small driver-only change reusing existing skill discovery and snapshot overlay pattern; no auth or data-handling changes.

Overview
Claude now participates in the per-workspace snapshot path so project-local .claude/skills show up in the client instead of only skills scanned from the server’s startup directory.

The driver exposes snapshotForCwd, matching Codex and OpenCode: when the provider is enabled it runs getSnapshot and discoverClaudeSkills for the thread’s cwd, then merges the discovered skills onto the machine snapshot (with filesystem/path services provided). When disabled it keeps using the plain machine snapshot.

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

Note

Fix ClaudeDriver.create to discover project skills per working directory

The provider factory now returns an instance with a snapshotForCwd function. Enabled instances load the base machine snapshot, run Claude skill discovery scoped to the supplied working directory, and merge discovered skills into the snapshot before returning it. Disabled instances expose the same function but return the existing snapshot without running discovery.

  • Behavioral Change: enabled Claude provider instances now produce cwd-specific snapshots that include newly discovered skills, whereas they previously returned a static snapshot.

Macroscope summarized 8a868fc.

The Claude driver scanned project skills from the server's own startup
directory, so a project's .claude/skills never reached the composer.
Expose snapshotForCwd on the Claude instance, reusing the existing
filesystem scanner with the thread's working directory, so the
workspace snapshot plumbing from pingdotgg#8778 applies to Claude too.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8a868fc

Macroscope's review found this PR approvable — The change is a narrow integration fix that reuses the existing Claude skill scanner to populate workspace-specific snapshots, with no changes to defaults, schemas, deployment, or execution workflows. Its runtime effect is limited to best-effort filesystem discovery for the requested project directory.

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

@maria-rcks
maria-rcks merged commit bc918e7 into pingdotgg:mainSep 2, 2026
22 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Renumbers the v2 migrations 044-052 to 045-053 behind main's
044_ClearAutomaticProjectModelDefaults, and adopts main's sticky
new-thread selection (#9164), local-only worktree bases in the v2 launch
path (#8751), the PR summary read for settlement (#9176), Claude per-cwd
skills (#9210), the provider editor redesign with the branch's dedicated
environment fields re-grafted (#8508), and the client half of
continue-threads-across-restart (#9167). The server-side continuation
markers stay unported: they live in the v1 session directory, and v2
recovery terminalizes running runs on restart, so the capability is
withheld until the v2 runtime carries them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* fix(server): discover project skills for Claude by @anirudhsama in pingdotgg/t3code#9210
* feat(web): redesign provider editor and models list by @StiensWout in pingdotgg/t3code#8508
* fix(web): prevent connection rows from wrapping during removal by @MatthewFeroz in pingdotgg/t3code#8706
* fix(pull-requests): align checkout control with author by @maria-rcks in pingdotgg/t3code#9196
* fix(release): pin patched expo-sharing version by @willsheldon in pingdotgg/t3code#9250
* chore(mobile): update Expo Sharing to 57.0.17 by @StiensWout in pingdotgg/t3code#9248
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1257...v0.0.39-nightly.20260902.1260
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1260
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Sep 2, 2026
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries)
Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue
active threads across server self-updates (pingdotgg#9167), provider editor and models
list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary
RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry
(pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project
skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile
long-press file references (pingdotgg#9258).
Conflict resolutions (14 files), keep-both unless noted:
- RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and
upstream-release RPCs sit beside upstream's new pullRequestsSummary.
- ws.ts route layer: fork's computer task/view brokers plus upstream's
serverSelfUpdate wrapped in withRunningThreadContinuation.
- PullRequestService: fork's upstream-project reads and scoped diff epochs
kept; upstream's summary read, refCacheKey and viewer-flight invalidation
added. invalidate() now scopes diff-only invalidation AND clears viewer
flights on a whole-workspace refresh. Test file keeps both new suites.
- client-runtime pullRequests: fork's PR stack atoms kept, TTL constant
takes upstream's new name.
- ChatMarkdown: upstream's one-character gutter rule replaces the fork's
equivalent digitWidth fix.
- ChatComposer: fork's voice-session button kept; context meter now honours
settings.contextWindowMeterEnabled.
- ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's
min-w-0 truncate.
- mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's
onCancelQueuedMessage.
- ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and
arch both threaded through.
Integration: upstream's restart continuation and the fork's resume-on-restart
both ran at boot on the same orphans. The continuation-marker helpers move to
provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers
any binding carrying the marker to upstream's pass (logged as deferred), so a
thread is never continued twice. Test added.
Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of
@t3tools/mobile-markdown-text was what broke the mobile typecheck.
Typecheck clean: contracts, shared, client-runtime, server, web, mobile
(desktop exits 1 on a pre-existing warning-level diagnostic). Startup and
self-update suites 36 passing; web sidebar/composer/settings suites 419
passing; fork guard script OK.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
donjor added a commit to RSI-Software/t3code-hyprws that referenced this pull request Sep 2, 2026
… commit
## What Changed
Record `fix(provider): resolve repo skills per workspace (#188)` as a partial retirement in `docs/internals/fork-delta.md`. The superseded scope goes in Retired. The remainder stays in Kept.
## Why
The unblock walk onto `v0.0.39-nightly.20260902.1261` reduced that commit from 546 insertions across 17 files to 35 insertions across 2 server files.
```diff
- providers.workspaceSkills RPC, contract schemas, client atom family, chat-view preference, Codex pair
+ cwd-keyed Claude capabilities probe cache at capacity 16
+ slashCommands merged alongside skills in upstream's snapshotForCwd
```
Upstream `bc918e7` (`pingdotgg#9210`) supplies per-workspace provider snapshots: `snapshotForCwd` on every driver, `refreshWorkspaceSnapshot` in the registry, `workspaceSnapshots` on `ServerProvider`, and the client resolvers. That is what supersedes the dropped scope.
Upstream's `snapshotForCwd` merges `skills` alone. Its capabilities probe cache stays capacity 1, keyed on binary plus resolved HOME. The remainder covers exactly that gap.
A subject in both Retired and Kept is how the ledger spells a partial, so the commit stays in the stack.
**Checks**
- `vp run fork:delta --check`: ok, 220 fork commits tagged.
- `vp run fork:upstream-refs docs/internals/fork-delta.md`: unchanged at 8 pre-existing live references. The new Retired row code-spans its subject and adds none. The 8 predate this branch.
`#492` stays open. Its first `Done when` is a user-visible claim, that a project's `.claude/commands` appear in the Claude menu for a worktree thread. No client pass has been run, so this cannot close it.
Refs #492
Refs #481
Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <38745786+donjor@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill picker lists the server's startup-directory skills, not the active project's

2 participants

@anirudhsama@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): discover project skills for Claude - #9210

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills
Sep 2, 2026
Merged

fix(server): discover project skills for Claude#9210
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills

Conversation

@anirudhsama

@anirudhsamaanirudhsama commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes#6449

What changed

The Claude driver now exposes snapshotForCwd, so the workspace snapshot plumbing that #8778 added for Codex and OpenCode applies to Claude as well. The hook reuses the existing filesystem scanner (discoverClaudeSkills) with the thread's working directory and overlays the result on the machine snapshot. Thirteen lines in ClaudeDriver.ts, nothing else.

Why

Claude project skills were scanned from the server's own startup directory (ServerConfig.cwd), so a project's .claude/skills never reached the $ picker or the / menu. #8778 by @UtkarshUsername built the per-cwd snapshot mechanism (registry, reactor trigger, client resolvers) but only wired Codex and OpenCode into it. This is the minimal follow-up for Claude; no subprocess is needed because the scanner already knows Claude Code's discovery rules, so there is no timeout or error mapping either.

Slash commands stay machine-level, matching the Codex and OpenCode implementations. Related but not fixed here: #8757 (scope label collision when the packaged server cwd is $HOME).

Overlaps with #9090 and #9180, which take on more (chip styling, docs, Cursor, Grok, mobile, registry cache changes). This one is offered as the smallest change that closes the Claude gap on its own.

Surfaces

  • Web and desktop: fixed, they already read workspace snapshots.
  • Mobile: not covered. It reads the machine-level skills list directly for every provider, so it needs its own change regardless of this PR.

Verification

  • ClaudeSkills.test.ts and ProviderRegistry.test.ts pass (61 tests).
  • Server typecheck and targeted lint clean.
  • Manual pass on web over the tailnet: a .claude/skills/hello-project skill in a project outside the server cwd appears in the $ picker after the session starts.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots: server-only change, verified manually in the web client

Built with GPT-5.6 Sol in the Codex harness, orchestrated by Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Small driver-only change reusing existing skill discovery and snapshot overlay pattern; no auth or data-handling changes.

Overview
Claude now participates in the per-workspace snapshot path so project-local .claude/skills show up in the client instead of only skills scanned from the server’s startup directory.

The driver exposes snapshotForCwd, matching Codex and OpenCode: when the provider is enabled it runs getSnapshot and discoverClaudeSkills for the thread’s cwd, then merges the discovered skills onto the machine snapshot (with filesystem/path services provided). When disabled it keeps using the plain machine snapshot.

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

Note

Fix ClaudeDriver.create to discover project skills per working directory

The provider factory now returns an instance with a snapshotForCwd function. Enabled instances load the base machine snapshot, run Claude skill discovery scoped to the supplied working directory, and merge discovered skills into the snapshot before returning it. Disabled instances expose the same function but return the existing snapshot without running discovery.

  • Behavioral Change: enabled Claude provider instances now produce cwd-specific snapshots that include newly discovered skills, whereas they previously returned a static snapshot.

Macroscope summarized 8a868fc.

The Claude driver scanned project skills from the server's own startup
directory, so a project's .claude/skills never reached the composer.
Expose snapshotForCwd on the Claude instance, reusing the existing
filesystem scanner with the thread's working directory, so the
workspace snapshot plumbing from pingdotgg#8778 applies to Claude too.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8a868fc

Macroscope's review found this PR approvable — The change is a narrow integration fix that reuses the existing Claude skill scanner to populate workspace-specific snapshots, with no changes to defaults, schemas, deployment, or execution workflows. Its runtime effect is limited to best-effort filesystem discovery for the requested project directory.

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

@maria-rcks
maria-rcks merged commit bc918e7 into pingdotgg:mainSep 2, 2026
22 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Renumbers the v2 migrations 044-052 to 045-053 behind main's
044_ClearAutomaticProjectModelDefaults, and adopts main's sticky
new-thread selection (#9164), local-only worktree bases in the v2 launch
path (#8751), the PR summary read for settlement (#9176), Claude per-cwd
skills (#9210), the provider editor redesign with the branch's dedicated
environment fields re-grafted (#8508), and the client half of
continue-threads-across-restart (#9167). The server-side continuation
markers stay unported: they live in the v1 session directory, and v2
recovery terminalizes running runs on restart, so the capability is
withheld until the v2 runtime carries them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* fix(server): discover project skills for Claude by @anirudhsama in pingdotgg/t3code#9210
* feat(web): redesign provider editor and models list by @StiensWout in pingdotgg/t3code#8508
* fix(web): prevent connection rows from wrapping during removal by @MatthewFeroz in pingdotgg/t3code#8706
* fix(pull-requests): align checkout control with author by @maria-rcks in pingdotgg/t3code#9196
* fix(release): pin patched expo-sharing version by @willsheldon in pingdotgg/t3code#9250
* chore(mobile): update Expo Sharing to 57.0.17 by @StiensWout in pingdotgg/t3code#9248
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1257...v0.0.39-nightly.20260902.1260
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1260
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Sep 2, 2026
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries)
Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue
active threads across server self-updates (pingdotgg#9167), provider editor and models
list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary
RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry
(pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project
skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile
long-press file references (pingdotgg#9258).
Conflict resolutions (14 files), keep-both unless noted:
- RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and
upstream-release RPCs sit beside upstream's new pullRequestsSummary.
- ws.ts route layer: fork's computer task/view brokers plus upstream's
serverSelfUpdate wrapped in withRunningThreadContinuation.
- PullRequestService: fork's upstream-project reads and scoped diff epochs
kept; upstream's summary read, refCacheKey and viewer-flight invalidation
added. invalidate() now scopes diff-only invalidation AND clears viewer
flights on a whole-workspace refresh. Test file keeps both new suites.
- client-runtime pullRequests: fork's PR stack atoms kept, TTL constant
takes upstream's new name.
- ChatMarkdown: upstream's one-character gutter rule replaces the fork's
equivalent digitWidth fix.
- ChatComposer: fork's voice-session button kept; context meter now honours
settings.contextWindowMeterEnabled.
- ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's
min-w-0 truncate.
- mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's
onCancelQueuedMessage.
- ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and
arch both threaded through.
Integration: upstream's restart continuation and the fork's resume-on-restart
both ran at boot on the same orphans. The continuation-marker helpers move to
provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers
any binding carrying the marker to upstream's pass (logged as deferred), so a
thread is never continued twice. Test added.
Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of
@t3tools/mobile-markdown-text was what broke the mobile typecheck.
Typecheck clean: contracts, shared, client-runtime, server, web, mobile
(desktop exits 1 on a pre-existing warning-level diagnostic). Startup and
self-update suites 36 passing; web sidebar/composer/settings suites 419
passing; fork guard script OK.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
donjor added a commit to RSI-Software/t3code-hyprws that referenced this pull request Sep 2, 2026
… commit
## What Changed
Record `fix(provider): resolve repo skills per workspace (#188)` as a partial retirement in `docs/internals/fork-delta.md`. The superseded scope goes in Retired. The remainder stays in Kept.
## Why
The unblock walk onto `v0.0.39-nightly.20260902.1261` reduced that commit from 546 insertions across 17 files to 35 insertions across 2 server files.
```diff
- providers.workspaceSkills RPC, contract schemas, client atom family, chat-view preference, Codex pair
+ cwd-keyed Claude capabilities probe cache at capacity 16
+ slashCommands merged alongside skills in upstream's snapshotForCwd
```
Upstream `bc918e7` (`pingdotgg#9210`) supplies per-workspace provider snapshots: `snapshotForCwd` on every driver, `refreshWorkspaceSnapshot` in the registry, `workspaceSnapshots` on `ServerProvider`, and the client resolvers. That is what supersedes the dropped scope.
Upstream's `snapshotForCwd` merges `skills` alone. Its capabilities probe cache stays capacity 1, keyed on binary plus resolved HOME. The remainder covers exactly that gap.
A subject in both Retired and Kept is how the ledger spells a partial, so the commit stays in the stack.
**Checks**
- `vp run fork:delta --check`: ok, 220 fork commits tagged.
- `vp run fork:upstream-refs docs/internals/fork-delta.md`: unchanged at 8 pre-existing live references. The new Retired row code-spans its subject and adds none. The 8 predate this branch.
`#492` stays open. Its first `Done when` is a user-visible claim, that a project's `.claude/commands` appear in the Claude menu for a worktree thread. No client pass has been run, so this cannot close it.
Refs #492
Refs #481
Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <38745786+donjor@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill picker lists the server's startup-directory skills, not the active project's

2 participants

@anirudhsama@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(server): discover project skills for Claude - #9210

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills
Sep 2, 2026
Merged

fix(server): discover project skills for Claude#9210
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills

Conversation

@anirudhsama

@anirudhsamaanirudhsama commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes#6449

What changed

The Claude driver now exposes snapshotForCwd, so the workspace snapshot plumbing that #8778 added for Codex and OpenCode applies to Claude as well. The hook reuses the existing filesystem scanner (discoverClaudeSkills) with the thread's working directory and overlays the result on the machine snapshot. Thirteen lines in ClaudeDriver.ts, nothing else.

Why

Claude project skills were scanned from the server's own startup directory (ServerConfig.cwd), so a project's .claude/skills never reached the $ picker or the / menu. #8778 by @UtkarshUsername built the per-cwd snapshot mechanism (registry, reactor trigger, client resolvers) but only wired Codex and OpenCode into it. This is the minimal follow-up for Claude; no subprocess is needed because the scanner already knows Claude Code's discovery rules, so there is no timeout or error mapping either.

Slash commands stay machine-level, matching the Codex and OpenCode implementations. Related but not fixed here: #8757 (scope label collision when the packaged server cwd is $HOME).

Overlaps with #9090 and #9180, which take on more (chip styling, docs, Cursor, Grok, mobile, registry cache changes). This one is offered as the smallest change that closes the Claude gap on its own.

Surfaces

  • Web and desktop: fixed, they already read workspace snapshots.
  • Mobile: not covered. It reads the machine-level skills list directly for every provider, so it needs its own change regardless of this PR.

Verification

  • ClaudeSkills.test.ts and ProviderRegistry.test.ts pass (61 tests).
  • Server typecheck and targeted lint clean.
  • Manual pass on web over the tailnet: a .claude/skills/hello-project skill in a project outside the server cwd appears in the $ picker after the session starts.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots: server-only change, verified manually in the web client

Built with GPT-5.6 Sol in the Codex harness, orchestrated by Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Small driver-only change reusing existing skill discovery and snapshot overlay pattern; no auth or data-handling changes.

Overview
Claude now participates in the per-workspace snapshot path so project-local .claude/skills show up in the client instead of only skills scanned from the server’s startup directory.

The driver exposes snapshotForCwd, matching Codex and OpenCode: when the provider is enabled it runs getSnapshot and discoverClaudeSkills for the thread’s cwd, then merges the discovered skills onto the machine snapshot (with filesystem/path services provided). When disabled it keeps using the plain machine snapshot.

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

Note

Fix ClaudeDriver.create to discover project skills per working directory

The provider factory now returns an instance with a snapshotForCwd function. Enabled instances load the base machine snapshot, run Claude skill discovery scoped to the supplied working directory, and merge discovered skills into the snapshot before returning it. Disabled instances expose the same function but return the existing snapshot without running discovery.

  • Behavioral Change: enabled Claude provider instances now produce cwd-specific snapshots that include newly discovered skills, whereas they previously returned a static snapshot.

Macroscope summarized 8a868fc.

The Claude driver scanned project skills from the server's own startup
directory, so a project's .claude/skills never reached the composer.
Expose snapshotForCwd on the Claude instance, reusing the existing
filesystem scanner with the thread's working directory, so the
workspace snapshot plumbing from pingdotgg#8778 applies to Claude too.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8a868fc

Macroscope's review found this PR approvable — The change is a narrow integration fix that reuses the existing Claude skill scanner to populate workspace-specific snapshots, with no changes to defaults, schemas, deployment, or execution workflows. Its runtime effect is limited to best-effort filesystem discovery for the requested project directory.

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

@maria-rcks
maria-rcks merged commit bc918e7 into pingdotgg:mainSep 2, 2026
22 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Renumbers the v2 migrations 044-052 to 045-053 behind main's
044_ClearAutomaticProjectModelDefaults, and adopts main's sticky
new-thread selection (#9164), local-only worktree bases in the v2 launch
path (#8751), the PR summary read for settlement (#9176), Claude per-cwd
skills (#9210), the provider editor redesign with the branch's dedicated
environment fields re-grafted (#8508), and the client half of
continue-threads-across-restart (#9167). The server-side continuation
markers stay unported: they live in the v1 session directory, and v2
recovery terminalizes running runs on restart, so the capability is
withheld until the v2 runtime carries them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* fix(server): discover project skills for Claude by @anirudhsama in pingdotgg/t3code#9210
* feat(web): redesign provider editor and models list by @StiensWout in pingdotgg/t3code#8508
* fix(web): prevent connection rows from wrapping during removal by @MatthewFeroz in pingdotgg/t3code#8706
* fix(pull-requests): align checkout control with author by @maria-rcks in pingdotgg/t3code#9196
* fix(release): pin patched expo-sharing version by @willsheldon in pingdotgg/t3code#9250
* chore(mobile): update Expo Sharing to 57.0.17 by @StiensWout in pingdotgg/t3code#9248
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1257...v0.0.39-nightly.20260902.1260
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1260
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Sep 2, 2026
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries)
Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue
active threads across server self-updates (pingdotgg#9167), provider editor and models
list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary
RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry
(pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project
skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile
long-press file references (pingdotgg#9258).
Conflict resolutions (14 files), keep-both unless noted:
- RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and
upstream-release RPCs sit beside upstream's new pullRequestsSummary.
- ws.ts route layer: fork's computer task/view brokers plus upstream's
serverSelfUpdate wrapped in withRunningThreadContinuation.
- PullRequestService: fork's upstream-project reads and scoped diff epochs
kept; upstream's summary read, refCacheKey and viewer-flight invalidation
added. invalidate() now scopes diff-only invalidation AND clears viewer
flights on a whole-workspace refresh. Test file keeps both new suites.
- client-runtime pullRequests: fork's PR stack atoms kept, TTL constant
takes upstream's new name.
- ChatMarkdown: upstream's one-character gutter rule replaces the fork's
equivalent digitWidth fix.
- ChatComposer: fork's voice-session button kept; context meter now honours
settings.contextWindowMeterEnabled.
- ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's
min-w-0 truncate.
- mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's
onCancelQueuedMessage.
- ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and
arch both threaded through.
Integration: upstream's restart continuation and the fork's resume-on-restart
both ran at boot on the same orphans. The continuation-marker helpers move to
provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers
any binding carrying the marker to upstream's pass (logged as deferred), so a
thread is never continued twice. Test added.
Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of
@t3tools/mobile-markdown-text was what broke the mobile typecheck.
Typecheck clean: contracts, shared, client-runtime, server, web, mobile
(desktop exits 1 on a pre-existing warning-level diagnostic). Startup and
self-update suites 36 passing; web sidebar/composer/settings suites 419
passing; fork guard script OK.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
donjor added a commit to RSI-Software/t3code-hyprws that referenced this pull request Sep 2, 2026
… commit
## What Changed
Record `fix(provider): resolve repo skills per workspace (#188)` as a partial retirement in `docs/internals/fork-delta.md`. The superseded scope goes in Retired. The remainder stays in Kept.
## Why
The unblock walk onto `v0.0.39-nightly.20260902.1261` reduced that commit from 546 insertions across 17 files to 35 insertions across 2 server files.
```diff
- providers.workspaceSkills RPC, contract schemas, client atom family, chat-view preference, Codex pair
+ cwd-keyed Claude capabilities probe cache at capacity 16
+ slashCommands merged alongside skills in upstream's snapshotForCwd
```
Upstream `bc918e7` (`pingdotgg#9210`) supplies per-workspace provider snapshots: `snapshotForCwd` on every driver, `refreshWorkspaceSnapshot` in the registry, `workspaceSnapshots` on `ServerProvider`, and the client resolvers. That is what supersedes the dropped scope.
Upstream's `snapshotForCwd` merges `skills` alone. Its capabilities probe cache stays capacity 1, keyed on binary plus resolved HOME. The remainder covers exactly that gap.
A subject in both Retired and Kept is how the ledger spells a partial, so the commit stays in the stack.
**Checks**
- `vp run fork:delta --check`: ok, 220 fork commits tagged.
- `vp run fork:upstream-refs docs/internals/fork-delta.md`: unchanged at 8 pre-existing live references. The new Retired row code-spans its subject and adds none. The 8 predate this branch.
`#492` stays open. Its first `Done when` is a user-visible claim, that a project's `.claude/commands` appear in the Claude menu for a worktree thread. No client pass has been run, so this cannot close it.
Refs #492
Refs #481
Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <38745786+donjor@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill picker lists the server's startup-directory skills, not the active project's

2 participants

@anirudhsama@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): discover project skills for Claude - #9210

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills
Sep 2, 2026
Merged

fix(server): discover project skills for Claude#9210
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills

Conversation

@anirudhsama

@anirudhsamaanirudhsama commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes#6449

What changed

The Claude driver now exposes snapshotForCwd, so the workspace snapshot plumbing that #8778 added for Codex and OpenCode applies to Claude as well. The hook reuses the existing filesystem scanner (discoverClaudeSkills) with the thread's working directory and overlays the result on the machine snapshot. Thirteen lines in ClaudeDriver.ts, nothing else.

Why

Claude project skills were scanned from the server's own startup directory (ServerConfig.cwd), so a project's .claude/skills never reached the $ picker or the / menu. #8778 by @UtkarshUsername built the per-cwd snapshot mechanism (registry, reactor trigger, client resolvers) but only wired Codex and OpenCode into it. This is the minimal follow-up for Claude; no subprocess is needed because the scanner already knows Claude Code's discovery rules, so there is no timeout or error mapping either.

Slash commands stay machine-level, matching the Codex and OpenCode implementations. Related but not fixed here: #8757 (scope label collision when the packaged server cwd is $HOME).

Overlaps with #9090 and #9180, which take on more (chip styling, docs, Cursor, Grok, mobile, registry cache changes). This one is offered as the smallest change that closes the Claude gap on its own.

Surfaces

  • Web and desktop: fixed, they already read workspace snapshots.
  • Mobile: not covered. It reads the machine-level skills list directly for every provider, so it needs its own change regardless of this PR.

Verification

  • ClaudeSkills.test.ts and ProviderRegistry.test.ts pass (61 tests).
  • Server typecheck and targeted lint clean.
  • Manual pass on web over the tailnet: a .claude/skills/hello-project skill in a project outside the server cwd appears in the $ picker after the session starts.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots: server-only change, verified manually in the web client

Built with GPT-5.6 Sol in the Codex harness, orchestrated by Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Small driver-only change reusing existing skill discovery and snapshot overlay pattern; no auth or data-handling changes.

Overview
Claude now participates in the per-workspace snapshot path so project-local .claude/skills show up in the client instead of only skills scanned from the server’s startup directory.

The driver exposes snapshotForCwd, matching Codex and OpenCode: when the provider is enabled it runs getSnapshot and discoverClaudeSkills for the thread’s cwd, then merges the discovered skills onto the machine snapshot (with filesystem/path services provided). When disabled it keeps using the plain machine snapshot.

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

Note

Fix ClaudeDriver.create to discover project skills per working directory

The provider factory now returns an instance with a snapshotForCwd function. Enabled instances load the base machine snapshot, run Claude skill discovery scoped to the supplied working directory, and merge discovered skills into the snapshot before returning it. Disabled instances expose the same function but return the existing snapshot without running discovery.

  • Behavioral Change: enabled Claude provider instances now produce cwd-specific snapshots that include newly discovered skills, whereas they previously returned a static snapshot.

Macroscope summarized 8a868fc.

The Claude driver scanned project skills from the server's own startup
directory, so a project's .claude/skills never reached the composer.
Expose snapshotForCwd on the Claude instance, reusing the existing
filesystem scanner with the thread's working directory, so the
workspace snapshot plumbing from pingdotgg#8778 applies to Claude too.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8a868fc

Macroscope's review found this PR approvable — The change is a narrow integration fix that reuses the existing Claude skill scanner to populate workspace-specific snapshots, with no changes to defaults, schemas, deployment, or execution workflows. Its runtime effect is limited to best-effort filesystem discovery for the requested project directory.

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

@maria-rcks
maria-rcks merged commit bc918e7 into pingdotgg:mainSep 2, 2026
22 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Renumbers the v2 migrations 044-052 to 045-053 behind main's
044_ClearAutomaticProjectModelDefaults, and adopts main's sticky
new-thread selection (#9164), local-only worktree bases in the v2 launch
path (#8751), the PR summary read for settlement (#9176), Claude per-cwd
skills (#9210), the provider editor redesign with the branch's dedicated
environment fields re-grafted (#8508), and the client half of
continue-threads-across-restart (#9167). The server-side continuation
markers stay unported: they live in the v1 session directory, and v2
recovery terminalizes running runs on restart, so the capability is
withheld until the v2 runtime carries them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* fix(server): discover project skills for Claude by @anirudhsama in pingdotgg/t3code#9210
* feat(web): redesign provider editor and models list by @StiensWout in pingdotgg/t3code#8508
* fix(web): prevent connection rows from wrapping during removal by @MatthewFeroz in pingdotgg/t3code#8706
* fix(pull-requests): align checkout control with author by @maria-rcks in pingdotgg/t3code#9196
* fix(release): pin patched expo-sharing version by @willsheldon in pingdotgg/t3code#9250
* chore(mobile): update Expo Sharing to 57.0.17 by @StiensWout in pingdotgg/t3code#9248
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1257...v0.0.39-nightly.20260902.1260
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1260
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Sep 2, 2026
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries)
Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue
active threads across server self-updates (pingdotgg#9167), provider editor and models
list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary
RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry
(pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project
skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile
long-press file references (pingdotgg#9258).
Conflict resolutions (14 files), keep-both unless noted:
- RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and
upstream-release RPCs sit beside upstream's new pullRequestsSummary.
- ws.ts route layer: fork's computer task/view brokers plus upstream's
serverSelfUpdate wrapped in withRunningThreadContinuation.
- PullRequestService: fork's upstream-project reads and scoped diff epochs
kept; upstream's summary read, refCacheKey and viewer-flight invalidation
added. invalidate() now scopes diff-only invalidation AND clears viewer
flights on a whole-workspace refresh. Test file keeps both new suites.
- client-runtime pullRequests: fork's PR stack atoms kept, TTL constant
takes upstream's new name.
- ChatMarkdown: upstream's one-character gutter rule replaces the fork's
equivalent digitWidth fix.
- ChatComposer: fork's voice-session button kept; context meter now honours
settings.contextWindowMeterEnabled.
- ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's
min-w-0 truncate.
- mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's
onCancelQueuedMessage.
- ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and
arch both threaded through.
Integration: upstream's restart continuation and the fork's resume-on-restart
both ran at boot on the same orphans. The continuation-marker helpers move to
provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers
any binding carrying the marker to upstream's pass (logged as deferred), so a
thread is never continued twice. Test added.
Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of
@t3tools/mobile-markdown-text was what broke the mobile typecheck.
Typecheck clean: contracts, shared, client-runtime, server, web, mobile
(desktop exits 1 on a pre-existing warning-level diagnostic). Startup and
self-update suites 36 passing; web sidebar/composer/settings suites 419
passing; fork guard script OK.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
donjor added a commit to RSI-Software/t3code-hyprws that referenced this pull request Sep 2, 2026
… commit
## What Changed
Record `fix(provider): resolve repo skills per workspace (#188)` as a partial retirement in `docs/internals/fork-delta.md`. The superseded scope goes in Retired. The remainder stays in Kept.
## Why
The unblock walk onto `v0.0.39-nightly.20260902.1261` reduced that commit from 546 insertions across 17 files to 35 insertions across 2 server files.
```diff
- providers.workspaceSkills RPC, contract schemas, client atom family, chat-view preference, Codex pair
+ cwd-keyed Claude capabilities probe cache at capacity 16
+ slashCommands merged alongside skills in upstream's snapshotForCwd
```
Upstream `bc918e7` (`pingdotgg#9210`) supplies per-workspace provider snapshots: `snapshotForCwd` on every driver, `refreshWorkspaceSnapshot` in the registry, `workspaceSnapshots` on `ServerProvider`, and the client resolvers. That is what supersedes the dropped scope.
Upstream's `snapshotForCwd` merges `skills` alone. Its capabilities probe cache stays capacity 1, keyed on binary plus resolved HOME. The remainder covers exactly that gap.
A subject in both Retired and Kept is how the ledger spells a partial, so the commit stays in the stack.
**Checks**
- `vp run fork:delta --check`: ok, 220 fork commits tagged.
- `vp run fork:upstream-refs docs/internals/fork-delta.md`: unchanged at 8 pre-existing live references. The new Retired row code-spans its subject and adds none. The 8 predate this branch.
`#492` stays open. Its first `Done when` is a user-visible claim, that a project's `.claude/commands` appear in the Claude menu for a worktree thread. No client pass has been run, so this cannot close it.
Refs #492
Refs #481
Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <38745786+donjor@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill picker lists the server's startup-directory skills, not the active project's

2 participants

@anirudhsama@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(server): discover project skills for Claude - #9210

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills
Sep 2, 2026
Merged

fix(server): discover project skills for Claude#9210
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills

Conversation

@anirudhsama

@anirudhsamaanirudhsama commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes#6449

What changed

The Claude driver now exposes snapshotForCwd, so the workspace snapshot plumbing that #8778 added for Codex and OpenCode applies to Claude as well. The hook reuses the existing filesystem scanner (discoverClaudeSkills) with the thread's working directory and overlays the result on the machine snapshot. Thirteen lines in ClaudeDriver.ts, nothing else.

Why

Claude project skills were scanned from the server's own startup directory (ServerConfig.cwd), so a project's .claude/skills never reached the $ picker or the / menu. #8778 by @UtkarshUsername built the per-cwd snapshot mechanism (registry, reactor trigger, client resolvers) but only wired Codex and OpenCode into it. This is the minimal follow-up for Claude; no subprocess is needed because the scanner already knows Claude Code's discovery rules, so there is no timeout or error mapping either.

Slash commands stay machine-level, matching the Codex and OpenCode implementations. Related but not fixed here: #8757 (scope label collision when the packaged server cwd is $HOME).

Overlaps with #9090 and #9180, which take on more (chip styling, docs, Cursor, Grok, mobile, registry cache changes). This one is offered as the smallest change that closes the Claude gap on its own.

Surfaces

  • Web and desktop: fixed, they already read workspace snapshots.
  • Mobile: not covered. It reads the machine-level skills list directly for every provider, so it needs its own change regardless of this PR.

Verification

  • ClaudeSkills.test.ts and ProviderRegistry.test.ts pass (61 tests).
  • Server typecheck and targeted lint clean.
  • Manual pass on web over the tailnet: a .claude/skills/hello-project skill in a project outside the server cwd appears in the $ picker after the session starts.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots: server-only change, verified manually in the web client

Built with GPT-5.6 Sol in the Codex harness, orchestrated by Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Small driver-only change reusing existing skill discovery and snapshot overlay pattern; no auth or data-handling changes.

Overview
Claude now participates in the per-workspace snapshot path so project-local .claude/skills show up in the client instead of only skills scanned from the server’s startup directory.

The driver exposes snapshotForCwd, matching Codex and OpenCode: when the provider is enabled it runs getSnapshot and discoverClaudeSkills for the thread’s cwd, then merges the discovered skills onto the machine snapshot (with filesystem/path services provided). When disabled it keeps using the plain machine snapshot.

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

Note

Fix ClaudeDriver.create to discover project skills per working directory

The provider factory now returns an instance with a snapshotForCwd function. Enabled instances load the base machine snapshot, run Claude skill discovery scoped to the supplied working directory, and merge discovered skills into the snapshot before returning it. Disabled instances expose the same function but return the existing snapshot without running discovery.

  • Behavioral Change: enabled Claude provider instances now produce cwd-specific snapshots that include newly discovered skills, whereas they previously returned a static snapshot.

Macroscope summarized 8a868fc.

The Claude driver scanned project skills from the server's own startup
directory, so a project's .claude/skills never reached the composer.
Expose snapshotForCwd on the Claude instance, reusing the existing
filesystem scanner with the thread's working directory, so the
workspace snapshot plumbing from pingdotgg#8778 applies to Claude too.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8a868fc

Macroscope's review found this PR approvable — The change is a narrow integration fix that reuses the existing Claude skill scanner to populate workspace-specific snapshots, with no changes to defaults, schemas, deployment, or execution workflows. Its runtime effect is limited to best-effort filesystem discovery for the requested project directory.

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

@maria-rcks
maria-rcks merged commit bc918e7 into pingdotgg:mainSep 2, 2026
22 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Renumbers the v2 migrations 044-052 to 045-053 behind main's
044_ClearAutomaticProjectModelDefaults, and adopts main's sticky
new-thread selection (#9164), local-only worktree bases in the v2 launch
path (#8751), the PR summary read for settlement (#9176), Claude per-cwd
skills (#9210), the provider editor redesign with the branch's dedicated
environment fields re-grafted (#8508), and the client half of
continue-threads-across-restart (#9167). The server-side continuation
markers stay unported: they live in the v1 session directory, and v2
recovery terminalizes running runs on restart, so the capability is
withheld until the v2 runtime carries them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* fix(server): discover project skills for Claude by @anirudhsama in pingdotgg/t3code#9210
* feat(web): redesign provider editor and models list by @StiensWout in pingdotgg/t3code#8508
* fix(web): prevent connection rows from wrapping during removal by @MatthewFeroz in pingdotgg/t3code#8706
* fix(pull-requests): align checkout control with author by @maria-rcks in pingdotgg/t3code#9196
* fix(release): pin patched expo-sharing version by @willsheldon in pingdotgg/t3code#9250
* chore(mobile): update Expo Sharing to 57.0.17 by @StiensWout in pingdotgg/t3code#9248
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1257...v0.0.39-nightly.20260902.1260
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1260
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Sep 2, 2026
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries)
Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue
active threads across server self-updates (pingdotgg#9167), provider editor and models
list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary
RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry
(pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project
skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile
long-press file references (pingdotgg#9258).
Conflict resolutions (14 files), keep-both unless noted:
- RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and
upstream-release RPCs sit beside upstream's new pullRequestsSummary.
- ws.ts route layer: fork's computer task/view brokers plus upstream's
serverSelfUpdate wrapped in withRunningThreadContinuation.
- PullRequestService: fork's upstream-project reads and scoped diff epochs
kept; upstream's summary read, refCacheKey and viewer-flight invalidation
added. invalidate() now scopes diff-only invalidation AND clears viewer
flights on a whole-workspace refresh. Test file keeps both new suites.
- client-runtime pullRequests: fork's PR stack atoms kept, TTL constant
takes upstream's new name.
- ChatMarkdown: upstream's one-character gutter rule replaces the fork's
equivalent digitWidth fix.
- ChatComposer: fork's voice-session button kept; context meter now honours
settings.contextWindowMeterEnabled.
- ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's
min-w-0 truncate.
- mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's
onCancelQueuedMessage.
- ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and
arch both threaded through.
Integration: upstream's restart continuation and the fork's resume-on-restart
both ran at boot on the same orphans. The continuation-marker helpers move to
provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers
any binding carrying the marker to upstream's pass (logged as deferred), so a
thread is never continued twice. Test added.
Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of
@t3tools/mobile-markdown-text was what broke the mobile typecheck.
Typecheck clean: contracts, shared, client-runtime, server, web, mobile
(desktop exits 1 on a pre-existing warning-level diagnostic). Startup and
self-update suites 36 passing; web sidebar/composer/settings suites 419
passing; fork guard script OK.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
donjor added a commit to RSI-Software/t3code-hyprws that referenced this pull request Sep 2, 2026
… commit
## What Changed
Record `fix(provider): resolve repo skills per workspace (#188)` as a partial retirement in `docs/internals/fork-delta.md`. The superseded scope goes in Retired. The remainder stays in Kept.
## Why
The unblock walk onto `v0.0.39-nightly.20260902.1261` reduced that commit from 546 insertions across 17 files to 35 insertions across 2 server files.
```diff
- providers.workspaceSkills RPC, contract schemas, client atom family, chat-view preference, Codex pair
+ cwd-keyed Claude capabilities probe cache at capacity 16
+ slashCommands merged alongside skills in upstream's snapshotForCwd
```
Upstream `bc918e7` (`pingdotgg#9210`) supplies per-workspace provider snapshots: `snapshotForCwd` on every driver, `refreshWorkspaceSnapshot` in the registry, `workspaceSnapshots` on `ServerProvider`, and the client resolvers. That is what supersedes the dropped scope.
Upstream's `snapshotForCwd` merges `skills` alone. Its capabilities probe cache stays capacity 1, keyed on binary plus resolved HOME. The remainder covers exactly that gap.
A subject in both Retired and Kept is how the ledger spells a partial, so the commit stays in the stack.
**Checks**
- `vp run fork:delta --check`: ok, 220 fork commits tagged.
- `vp run fork:upstream-refs docs/internals/fork-delta.md`: unchanged at 8 pre-existing live references. The new Retired row code-spans its subject and adds none. The 8 predate this branch.
`#492` stays open. Its first `Done when` is a user-visible claim, that a project's `.claude/commands` appear in the Claude menu for a worktree thread. No client pass has been run, so this cannot close it.
Refs #492
Refs #481
Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <38745786+donjor@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill picker lists the server's startup-directory skills, not the active project's

2 participants

@anirudhsama@maria-rcks
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(server): discover project skills for Claude - #9210

Merged
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills
Sep 2, 2026
Merged

fix(server): discover project skills for Claude#9210
maria-rcks merged 1 commit into
pingdotgg:mainfrom
anirudhsama:fix/claude-project-skills

Conversation

@anirudhsama

@anirudhsamaanirudhsama commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Closes#6449

What changed

The Claude driver now exposes snapshotForCwd, so the workspace snapshot plumbing that #8778 added for Codex and OpenCode applies to Claude as well. The hook reuses the existing filesystem scanner (discoverClaudeSkills) with the thread's working directory and overlays the result on the machine snapshot. Thirteen lines in ClaudeDriver.ts, nothing else.

Why

Claude project skills were scanned from the server's own startup directory (ServerConfig.cwd), so a project's .claude/skills never reached the $ picker or the / menu. #8778 by @UtkarshUsername built the per-cwd snapshot mechanism (registry, reactor trigger, client resolvers) but only wired Codex and OpenCode into it. This is the minimal follow-up for Claude; no subprocess is needed because the scanner already knows Claude Code's discovery rules, so there is no timeout or error mapping either.

Slash commands stay machine-level, matching the Codex and OpenCode implementations. Related but not fixed here: #8757 (scope label collision when the packaged server cwd is $HOME).

Overlaps with #9090 and #9180, which take on more (chip styling, docs, Cursor, Grok, mobile, registry cache changes). This one is offered as the smallest change that closes the Claude gap on its own.

Surfaces

  • Web and desktop: fixed, they already read workspace snapshots.
  • Mobile: not covered. It reads the machine-level skills list directly for every provider, so it needs its own change regardless of this PR.

Verification

  • ClaudeSkills.test.ts and ProviderRegistry.test.ts pass (61 tests).
  • Server typecheck and targeted lint clean.
  • Manual pass on web over the tailnet: a .claude/skills/hello-project skill in a project outside the server cwd appears in the $ picker after the session starts.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • Screenshots: server-only change, verified manually in the web client

Built with GPT-5.6 Sol in the Codex harness, orchestrated by Claude Fable 5.1 in Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Small driver-only change reusing existing skill discovery and snapshot overlay pattern; no auth or data-handling changes.

Overview
Claude now participates in the per-workspace snapshot path so project-local .claude/skills show up in the client instead of only skills scanned from the server’s startup directory.

The driver exposes snapshotForCwd, matching Codex and OpenCode: when the provider is enabled it runs getSnapshot and discoverClaudeSkills for the thread’s cwd, then merges the discovered skills onto the machine snapshot (with filesystem/path services provided). When disabled it keeps using the plain machine snapshot.

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

Note

Fix ClaudeDriver.create to discover project skills per working directory

The provider factory now returns an instance with a snapshotForCwd function. Enabled instances load the base machine snapshot, run Claude skill discovery scoped to the supplied working directory, and merge discovered skills into the snapshot before returning it. Disabled instances expose the same function but return the existing snapshot without running discovery.

  • Behavioral Change: enabled Claude provider instances now produce cwd-specific snapshots that include newly discovered skills, whereas they previously returned a static snapshot.

Macroscope summarized 8a868fc.

The Claude driver scanned project skills from the server's own startup
directory, so a project's .claude/skills never reached the composer.
Expose snapshotForCwd on the Claude instance, reusing the existing
filesystem scanner with the thread's working directory, so the
workspace snapshot plumbing from pingdotgg#8778 applies to Claude too.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Sep 2, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8a868fc

Macroscope's review found this PR approvable — The change is a narrow integration fix that reuses the existing Claude skill scanner to populate workspace-specific snapshots, with no changes to defaults, schemas, deployment, or execution workflows. Its runtime effect is limited to best-effort filesystem discovery for the requested project directory.

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

@maria-rcks
maria-rcks merged commit bc918e7 into pingdotgg:mainSep 2, 2026
22 checks passed
juliusmarminge added a commit that referenced this pull request Sep 2, 2026
Renumbers the v2 migrations 044-052 to 045-053 behind main's
044_ClearAutomaticProjectModelDefaults, and adopts main's sticky
new-thread selection (#9164), local-only worktree bases in the v2 launch
path (#8751), the PR summary read for settlement (#9176), Claude per-cwd
skills (#9210), the provider editor redesign with the branch's dedicated
environment fields re-grafted (#8508), and the client half of
continue-threads-across-restart (#9167). The server-side continuation
markers stay unported: they live in the v1 session directory, and v2
recovery terminalizes running runs on restart, so the capability is
withheld until the v2 runtime carries them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 2, 2026
## What's Changed
* fix(server): discover project skills for Claude by @anirudhsama in pingdotgg/t3code#9210
* feat(web): redesign provider editor and models list by @StiensWout in pingdotgg/t3code#8508
* fix(web): prevent connection rows from wrapping during removal by @MatthewFeroz in pingdotgg/t3code#8706
* fix(pull-requests): align checkout control with author by @maria-rcks in pingdotgg/t3code#9196
* fix(release): pin patched expo-sharing version by @willsheldon in pingdotgg/t3code#9250
* chore(mobile): update Expo Sharing to 57.0.17 by @StiensWout in pingdotgg/t3code#9248
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260902.1257...v0.0.39-nightly.20260902.1260
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260902.1260
sheehanmunim added a commit to munimtechnologies/mtcode that referenced this pull request Sep 2, 2026
…continuation, provider editor redesign, context meter opt-in, linked-PR summaries)
Brings the fork up to origin/main e0da6c6..b57726c. Highlights: continue
active threads across server self-updates (pingdotgg#9167), provider editor and models
list redesign (pingdotgg#8508), opt-in context window meter (pingdotgg#9190), linked-PR summary
RPC with last-good caching (pingdotgg#9176), relay credential refresh before expiry
(pingdotgg#9178), composer draft preserved through worktree setup (pingdotgg#9197), project
skill discovery for Claude (pingdotgg#9210), copy-path on diff headers (pingdotgg#2403), mobile
long-press file references (pingdotgg#9258).
Conflict resolutions (14 files), keep-both unless noted:
- RpcAuthorization / contracts rpc / ws.ts: fork's PR rank, cherry-pick and
upstream-release RPCs sit beside upstream's new pullRequestsSummary.
- ws.ts route layer: fork's computer task/view brokers plus upstream's
serverSelfUpdate wrapped in withRunningThreadContinuation.
- PullRequestService: fork's upstream-project reads and scoped diff epochs
kept; upstream's summary read, refCacheKey and viewer-flight invalidation
added. invalidate() now scopes diff-only invalidation AND clears viewer
flights on a whole-workspace refresh. Test file keeps both new suites.
- client-runtime pullRequests: fork's PR stack atoms kept, TTL constant
takes upstream's new name.
- ChatMarkdown: upstream's one-character gutter rule replaces the fork's
equivalent digitWidth fix.
- ChatComposer: fork's voice-session button kept; context meter now honours
settings.contextWindowMeterEnabled.
- ConnectionsSettings: fork's EnvironmentLabelControl kept with upstream's
min-w-0 truncate.
- mobile ThreadFeed: upstream's markdownLinkHandlers plus the fork's
onCancelQueuedMessage.
- ClaudeDriver imports: fork's superset. build-desktop-artifact: distro and
arch both threaded through.
Integration: upstream's restart continuation and the fork's resume-on-restart
both ran at boot on the same orphans. The continuation-marker helpers move to
provider/serverUpdateContinuation.ts and SessionStartupReconciler now defers
any binding carrying the marker to upstream's pass (logged as deferred), so a
thread is never continued twice. Test added.
Dependencies reinstalled for the expo-sharing pin; the stale pnpm copy of
@t3tools/mobile-markdown-text was what broke the mobile typecheck.
Typecheck clean: contracts, shared, client-runtime, server, web, mobile
(desktop exits 1 on a pre-existing warning-level diagnostic). Startup and
self-update suites 36 passing; web sidebar/composer/settings suites 419
passing; fork guard script OK.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
donjor added a commit to RSI-Software/t3code-hyprws that referenced this pull request Sep 2, 2026
… commit
## What Changed
Record `fix(provider): resolve repo skills per workspace (#188)` as a partial retirement in `docs/internals/fork-delta.md`. The superseded scope goes in Retired. The remainder stays in Kept.
## Why
The unblock walk onto `v0.0.39-nightly.20260902.1261` reduced that commit from 546 insertions across 17 files to 35 insertions across 2 server files.
```diff
- providers.workspaceSkills RPC, contract schemas, client atom family, chat-view preference, Codex pair
+ cwd-keyed Claude capabilities probe cache at capacity 16
+ slashCommands merged alongside skills in upstream's snapshotForCwd
```
Upstream `bc918e7` (`pingdotgg#9210`) supplies per-workspace provider snapshots: `snapshotForCwd` on every driver, `refreshWorkspaceSnapshot` in the registry, `workspaceSnapshots` on `ServerProvider`, and the client resolvers. That is what supersedes the dropped scope.
Upstream's `snapshotForCwd` merges `skills` alone. Its capabilities probe cache stays capacity 1, keyed on binary plus resolved HOME. The remainder covers exactly that gap.
A subject in both Retired and Kept is how the ledger spells a partial, so the commit stays in the stack.
**Checks**
- `vp run fork:delta --check`: ok, 220 fork commits tagged.
- `vp run fork:upstream-refs docs/internals/fork-delta.md`: unchanged at 8 pre-existing live references. The new Retired row code-spans its subject and adds none. The 8 predate this branch.
`#492` stays open. Its first `Done when` is a user-visible claim, that a project's `.claude/commands` appear in the Claude menu for a worktree thread. No client pass has been run, so this cannot close it.
Refs #492
Refs #481
Fork-Domain: fork-meta
Fork-Tier: qol
Fork-Upstreamable: no
Co-authored-by: donjor <38745786+donjor@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skill picker lists the server's startup-directory skills, not the active project's

2 participants

@anirudhsama@maria-rcks