Claude should work when repo-local .claude settings make it available #1964

Description

@Donkijote

[Feature]: Make Claude availability workspace-aware when .claude settings already work in the repo

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I am describing a concrete problem or use case, not just a vague idea.

Area

apps/server

Problem or use case

I use Claude in repos where the Claude CLI works because the repo has .claude/settings.json or .claude/settings.local.json, instead of relying on the default global claude auth login flow.

In those repos, Claude can work correctly from the CLI because the SDK/CLI resolves user, project, and local settings from the active working directory. But T3 Code still treats Claude as unavailable if the global auth probe reports unauthenticated.

That creates a false negative:

  • Claude works in the current repo
  • T3 says Claude is unavailable

So today T3 cannot be used in some repo-scoped Claude setups even though the underlying Claude runtime is actually usable there.

Screenshots

Add the screenshots manually in the GitHub editor under the matching caption.

Before: Claude is shown as unavailable because the UI only reflects the global auth snapshot.

Image

After: Claude becomes selectable in the same repo when workspace-local .claude settings are detected, and the picker shows the project-config-backed model label.

Image

After: the project-config-backed Claude model can be selected and used successfully in the thread, which demonstrates that the workspace-local Claude configuration is being honored.

Image

Proposed solution

Add project-aware Claude runtime detection based on the active workspace cwd.

If the current workspace contains .claude/settings.json or .claude/settings.local.json, T3 should probe Claude in that workspace context and treat a successful SDK initialization as ready/authenticated for that project, even if global claude auth status is unauthenticated.

In the UI, when Claude is available through workspace-local config, T3 should also offer a project-config-backed model option that lets the Claude SDK resolve the model from .claude settings instead of forcing a concrete model override from T3.

If the configured model can be determined safely, that option should be presented with a readable label instead of a raw slug.

The Settings page should also keep global Claude auth messaging separate from workspace-specific .claude availability, instead of mixing both ideas into one sentence.

Why this matters

This would let T3 work with the same Claude configuration that already works in the CLI, including ad hoc setups, custom backends, and company-managed environments that do not use the default global Claude login flow.

More importantly, it makes provider availability reflect the real runtime behavior of the active workspace instead of only a machine-wide auth status.

That broadens where T3 can be used without requiring users to reshape their Claude setup into one specific global convention. It makes the app more adaptable to real-world repos and should make it usable in a wider variety of projects and teams.

Smallest useful scope

For Claude only:

  • detect workspace-local .claude/settings.json or .claude/settings.local.json for the active workspace
  • add a project-aware runtime status check keyed by cwd
  • allow Claude to be selected when that workspace-scoped runtime check succeeds
  • expose a Project config model option that omits the explicit SDK model override
  • optionally label that option from the configured Claude model when possible
  • keep the Settings page's global auth message separate from any workspace note

Likely implementation areas

I already explored this locally, and the change appears to be reasonably contained.

The main places that would likely need changes are:

  • apps/server/src/provider/Layers/ClaudeProvider.ts
    Add a workspace-aware Claude runtime probe keyed by cwd, detect .claude/settings.json or .claude/settings.local.json, and treat a successful zero-turn Claude SDK initialization as ready for that workspace.
  • apps/server/src/provider/Layers/ProviderRegistry.ts
    Expose a provider runtime status path in addition to the existing global provider snapshot.
  • apps/server/src/ws.ts
    Add a project-aware server RPC such as server.getProviderRuntimeStatus.
  • packages/contracts/src/server.ts
  • packages/contracts/src/rpc.ts
    Add the runtime-status input/output contract, including optional Claude workspace metadata such as whether project settings were detected.
  • apps/server/src/provider/Layers/ClaudeAdapter.ts
    Support a Claude “project config” model sentinel that omits the explicit SDK model override, so .claude settings can decide the model.
  • packages/contracts/src/model.ts
    Add the Claude project-config sentinel model id.
  • apps/web/src/lib/providerReactQuery.ts
  • apps/web/src/rpc/wsRpcClient.ts
    Query the workspace-aware provider runtime status for the active repo.
  • apps/web/src/components/ChatView.tsx
    Use the active workspace cwd to substitute the runtime-aware Claude status for the global snapshot when the user is in a repo that has .claude settings.
  • apps/web/src/composerDraftStore.ts
  • apps/web/src/modelSelection.ts
    Make project config the default Claude model path when workspace Claude settings are active, unless the user explicitly chooses a concrete model.
  • apps/web/src/components/settings/SettingsPanels.tsx
    Keep the normal global auth message, but show any workspace-specific .claude note separately instead of mixing both concepts into one sentence.

Implementation notes

The main behavior change does not require T3 to ingest Claude secrets or fully parse .claude config itself.

The safer approach is:

  • keep the existing global provider snapshot for install/version/global auth reporting
  • add a second Claude runtime check scoped to the active workspace cwd
  • rely on the Claude SDK's existing settingSources behavior instead of copying .claude auth/config values into T3 settings
  • only read minimal non-secret metadata if needed for display, such as the configured model name for a picker label

The core end-to-end path is:

  1. The web client knows the active workspace root for the current thread/project.
  2. The client asks the server for Claude runtime status for that cwd.
  3. The server checks for .claude/settings.json or .claude/settings.local.json.
  4. The server attempts a zero-turn Claude SDK initialization with cwd and settingSources.
  5. If that succeeds, Claude is treated as ready for that workspace even if global claude auth status is unauthenticated.
  6. When the user selects the workspace-backed Claude option, T3 omits the explicit model override and lets Claude resolve it from .claude.

That is the smallest change that seems to solve the mismatch without widening the scope into custom config parsing, secret handling, or Claude history import.

Alternatives considered

Today the main workaround is to use the Claude CLI directly instead of T3 in repos that rely on workspace-local .claude settings.

Another workaround would be to manually duplicate settings into a global Claude login or config path, but that defeats the purpose of repo-scoped configuration and is not viable in some environments.

Risks or tradeoffs

This adds a second level of Claude availability: global provider status and workspace-specific runtime status.

That is worth the complexity because Claude can legitimately be unavailable globally but usable in a specific repo once .claude settings are applied for that cwd.

T3 should still avoid parsing or copying secrets from .claude itself and should rely on the Claude SDK's existing settings resolution.

If T3 reads any .claude metadata for display, it should be limited to non-secret fields needed for UI labeling, such as the configured model name, and should never expose tokens, env values, base URLs, or API endpoints in the UI.

Examples or references

Related but not sufficient:

The key gap is that settingSources support alone does not help if T3 still gates Claude on a global unauthenticated status before attempting a workspace-scoped Claude startup.

Contribution

  • I would be open to helping implement this.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , '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

      Claude should work when repo-local .claude settings make it available #1964

      Description

      @Donkijote

      [Feature]: Make Claude availability workspace-aware when .claude settings already work in the repo

      Before submitting

      • I searched existing issues and did not find a duplicate.
      • I am describing a concrete problem or use case, not just a vague idea.

      Area

      apps/server

      Problem or use case

      I use Claude in repos where the Claude CLI works because the repo has .claude/settings.json or .claude/settings.local.json, instead of relying on the default global claude auth login flow.

      In those repos, Claude can work correctly from the CLI because the SDK/CLI resolves user, project, and local settings from the active working directory. But T3 Code still treats Claude as unavailable if the global auth probe reports unauthenticated.

      That creates a false negative:

      • Claude works in the current repo
      • T3 says Claude is unavailable

      So today T3 cannot be used in some repo-scoped Claude setups even though the underlying Claude runtime is actually usable there.

      Screenshots

      Add the screenshots manually in the GitHub editor under the matching caption.

      Before: Claude is shown as unavailable because the UI only reflects the global auth snapshot.

      Image

      After: Claude becomes selectable in the same repo when workspace-local .claude settings are detected, and the picker shows the project-config-backed model label.

      Image

      After: the project-config-backed Claude model can be selected and used successfully in the thread, which demonstrates that the workspace-local Claude configuration is being honored.

      Image

      Proposed solution

      Add project-aware Claude runtime detection based on the active workspace cwd.

      If the current workspace contains .claude/settings.json or .claude/settings.local.json, T3 should probe Claude in that workspace context and treat a successful SDK initialization as ready/authenticated for that project, even if global claude auth status is unauthenticated.

      In the UI, when Claude is available through workspace-local config, T3 should also offer a project-config-backed model option that lets the Claude SDK resolve the model from .claude settings instead of forcing a concrete model override from T3.

      If the configured model can be determined safely, that option should be presented with a readable label instead of a raw slug.

      The Settings page should also keep global Claude auth messaging separate from workspace-specific .claude availability, instead of mixing both ideas into one sentence.

      Why this matters

      This would let T3 work with the same Claude configuration that already works in the CLI, including ad hoc setups, custom backends, and company-managed environments that do not use the default global Claude login flow.

      More importantly, it makes provider availability reflect the real runtime behavior of the active workspace instead of only a machine-wide auth status.

      That broadens where T3 can be used without requiring users to reshape their Claude setup into one specific global convention. It makes the app more adaptable to real-world repos and should make it usable in a wider variety of projects and teams.

      Smallest useful scope

      For Claude only:

      • detect workspace-local .claude/settings.json or .claude/settings.local.json for the active workspace
      • add a project-aware runtime status check keyed by cwd
      • allow Claude to be selected when that workspace-scoped runtime check succeeds
      • expose a Project config model option that omits the explicit SDK model override
      • optionally label that option from the configured Claude model when possible
      • keep the Settings page's global auth message separate from any workspace note

      Likely implementation areas

      I already explored this locally, and the change appears to be reasonably contained.

      The main places that would likely need changes are:

      • apps/server/src/provider/Layers/ClaudeProvider.ts
        Add a workspace-aware Claude runtime probe keyed by cwd, detect .claude/settings.json or .claude/settings.local.json, and treat a successful zero-turn Claude SDK initialization as ready for that workspace.
      • apps/server/src/provider/Layers/ProviderRegistry.ts
        Expose a provider runtime status path in addition to the existing global provider snapshot.
      • apps/server/src/ws.ts
        Add a project-aware server RPC such as server.getProviderRuntimeStatus.
      • packages/contracts/src/server.ts
      • packages/contracts/src/rpc.ts
        Add the runtime-status input/output contract, including optional Claude workspace metadata such as whether project settings were detected.
      • apps/server/src/provider/Layers/ClaudeAdapter.ts
        Support a Claude “project config” model sentinel that omits the explicit SDK model override, so .claude settings can decide the model.
      • packages/contracts/src/model.ts
        Add the Claude project-config sentinel model id.
      • apps/web/src/lib/providerReactQuery.ts
      • apps/web/src/rpc/wsRpcClient.ts
        Query the workspace-aware provider runtime status for the active repo.
      • apps/web/src/components/ChatView.tsx
        Use the active workspace cwd to substitute the runtime-aware Claude status for the global snapshot when the user is in a repo that has .claude settings.
      • apps/web/src/composerDraftStore.ts
      • apps/web/src/modelSelection.ts
        Make project config the default Claude model path when workspace Claude settings are active, unless the user explicitly chooses a concrete model.
      • apps/web/src/components/settings/SettingsPanels.tsx
        Keep the normal global auth message, but show any workspace-specific .claude note separately instead of mixing both concepts into one sentence.

      Implementation notes

      The main behavior change does not require T3 to ingest Claude secrets or fully parse .claude config itself.

      The safer approach is:

      • keep the existing global provider snapshot for install/version/global auth reporting
      • add a second Claude runtime check scoped to the active workspace cwd
      • rely on the Claude SDK's existing settingSources behavior instead of copying .claude auth/config values into T3 settings
      • only read minimal non-secret metadata if needed for display, such as the configured model name for a picker label

      The core end-to-end path is:

      1. The web client knows the active workspace root for the current thread/project.
      2. The client asks the server for Claude runtime status for that cwd.
      3. The server checks for .claude/settings.json or .claude/settings.local.json.
      4. The server attempts a zero-turn Claude SDK initialization with cwd and settingSources.
      5. If that succeeds, Claude is treated as ready for that workspace even if global claude auth status is unauthenticated.
      6. When the user selects the workspace-backed Claude option, T3 omits the explicit model override and lets Claude resolve it from .claude.

      That is the smallest change that seems to solve the mismatch without widening the scope into custom config parsing, secret handling, or Claude history import.

      Alternatives considered

      Today the main workaround is to use the Claude CLI directly instead of T3 in repos that rely on workspace-local .claude settings.

      Another workaround would be to manually duplicate settings into a global Claude login or config path, but that defeats the purpose of repo-scoped configuration and is not viable in some environments.

      Risks or tradeoffs

      This adds a second level of Claude availability: global provider status and workspace-specific runtime status.

      That is worth the complexity because Claude can legitimately be unavailable globally but usable in a specific repo once .claude settings are applied for that cwd.

      T3 should still avoid parsing or copying secrets from .claude itself and should rely on the Claude SDK's existing settings resolution.

      If T3 reads any .claude metadata for display, it should be limited to non-secret fields needed for UI labeling, such as the configured model name, and should never expose tokens, env values, base URLs, or API endpoints in the UI.

      Examples or references

      Related but not sufficient:

      The key gap is that settingSources support alone does not help if T3 still gates Claude on a global unauthenticated status before attempting a workspace-scoped Claude startup.

      Contribution

      • I would be open to helping implement this.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , '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

          Claude should work when repo-local .claude settings make it available #1964

          Description

          @Donkijote

          [Feature]: Make Claude availability workspace-aware when .claude settings already work in the repo

          Before submitting

          • I searched existing issues and did not find a duplicate.
          • I am describing a concrete problem or use case, not just a vague idea.

          Area

          apps/server

          Problem or use case

          I use Claude in repos where the Claude CLI works because the repo has .claude/settings.json or .claude/settings.local.json, instead of relying on the default global claude auth login flow.

          In those repos, Claude can work correctly from the CLI because the SDK/CLI resolves user, project, and local settings from the active working directory. But T3 Code still treats Claude as unavailable if the global auth probe reports unauthenticated.

          That creates a false negative:

          • Claude works in the current repo
          • T3 says Claude is unavailable

          So today T3 cannot be used in some repo-scoped Claude setups even though the underlying Claude runtime is actually usable there.

          Screenshots

          Add the screenshots manually in the GitHub editor under the matching caption.

          Before: Claude is shown as unavailable because the UI only reflects the global auth snapshot.

          Image

          After: Claude becomes selectable in the same repo when workspace-local .claude settings are detected, and the picker shows the project-config-backed model label.

          Image

          After: the project-config-backed Claude model can be selected and used successfully in the thread, which demonstrates that the workspace-local Claude configuration is being honored.

          Image

          Proposed solution

          Add project-aware Claude runtime detection based on the active workspace cwd.

          If the current workspace contains .claude/settings.json or .claude/settings.local.json, T3 should probe Claude in that workspace context and treat a successful SDK initialization as ready/authenticated for that project, even if global claude auth status is unauthenticated.

          In the UI, when Claude is available through workspace-local config, T3 should also offer a project-config-backed model option that lets the Claude SDK resolve the model from .claude settings instead of forcing a concrete model override from T3.

          If the configured model can be determined safely, that option should be presented with a readable label instead of a raw slug.

          The Settings page should also keep global Claude auth messaging separate from workspace-specific .claude availability, instead of mixing both ideas into one sentence.

          Why this matters

          This would let T3 work with the same Claude configuration that already works in the CLI, including ad hoc setups, custom backends, and company-managed environments that do not use the default global Claude login flow.

          More importantly, it makes provider availability reflect the real runtime behavior of the active workspace instead of only a machine-wide auth status.

          That broadens where T3 can be used without requiring users to reshape their Claude setup into one specific global convention. It makes the app more adaptable to real-world repos and should make it usable in a wider variety of projects and teams.

          Smallest useful scope

          For Claude only:

          • detect workspace-local .claude/settings.json or .claude/settings.local.json for the active workspace
          • add a project-aware runtime status check keyed by cwd
          • allow Claude to be selected when that workspace-scoped runtime check succeeds
          • expose a Project config model option that omits the explicit SDK model override
          • optionally label that option from the configured Claude model when possible
          • keep the Settings page's global auth message separate from any workspace note

          Likely implementation areas

          I already explored this locally, and the change appears to be reasonably contained.

          The main places that would likely need changes are:

          • apps/server/src/provider/Layers/ClaudeProvider.ts
            Add a workspace-aware Claude runtime probe keyed by cwd, detect .claude/settings.json or .claude/settings.local.json, and treat a successful zero-turn Claude SDK initialization as ready for that workspace.
          • apps/server/src/provider/Layers/ProviderRegistry.ts
            Expose a provider runtime status path in addition to the existing global provider snapshot.
          • apps/server/src/ws.ts
            Add a project-aware server RPC such as server.getProviderRuntimeStatus.
          • packages/contracts/src/server.ts
          • packages/contracts/src/rpc.ts
            Add the runtime-status input/output contract, including optional Claude workspace metadata such as whether project settings were detected.
          • apps/server/src/provider/Layers/ClaudeAdapter.ts
            Support a Claude “project config” model sentinel that omits the explicit SDK model override, so .claude settings can decide the model.
          • packages/contracts/src/model.ts
            Add the Claude project-config sentinel model id.
          • apps/web/src/lib/providerReactQuery.ts
          • apps/web/src/rpc/wsRpcClient.ts
            Query the workspace-aware provider runtime status for the active repo.
          • apps/web/src/components/ChatView.tsx
            Use the active workspace cwd to substitute the runtime-aware Claude status for the global snapshot when the user is in a repo that has .claude settings.
          • apps/web/src/composerDraftStore.ts
          • apps/web/src/modelSelection.ts
            Make project config the default Claude model path when workspace Claude settings are active, unless the user explicitly chooses a concrete model.
          • apps/web/src/components/settings/SettingsPanels.tsx
            Keep the normal global auth message, but show any workspace-specific .claude note separately instead of mixing both concepts into one sentence.

          Implementation notes

          The main behavior change does not require T3 to ingest Claude secrets or fully parse .claude config itself.

          The safer approach is:

          • keep the existing global provider snapshot for install/version/global auth reporting
          • add a second Claude runtime check scoped to the active workspace cwd
          • rely on the Claude SDK's existing settingSources behavior instead of copying .claude auth/config values into T3 settings
          • only read minimal non-secret metadata if needed for display, such as the configured model name for a picker label

          The core end-to-end path is:

          1. The web client knows the active workspace root for the current thread/project.
          2. The client asks the server for Claude runtime status for that cwd.
          3. The server checks for .claude/settings.json or .claude/settings.local.json.
          4. The server attempts a zero-turn Claude SDK initialization with cwd and settingSources.
          5. If that succeeds, Claude is treated as ready for that workspace even if global claude auth status is unauthenticated.
          6. When the user selects the workspace-backed Claude option, T3 omits the explicit model override and lets Claude resolve it from .claude.

          That is the smallest change that seems to solve the mismatch without widening the scope into custom config parsing, secret handling, or Claude history import.

          Alternatives considered

          Today the main workaround is to use the Claude CLI directly instead of T3 in repos that rely on workspace-local .claude settings.

          Another workaround would be to manually duplicate settings into a global Claude login or config path, but that defeats the purpose of repo-scoped configuration and is not viable in some environments.

          Risks or tradeoffs

          This adds a second level of Claude availability: global provider status and workspace-specific runtime status.

          That is worth the complexity because Claude can legitimately be unavailable globally but usable in a specific repo once .claude settings are applied for that cwd.

          T3 should still avoid parsing or copying secrets from .claude itself and should rely on the Claude SDK's existing settings resolution.

          If T3 reads any .claude metadata for display, it should be limited to non-secret fields needed for UI labeling, such as the configured model name, and should never expose tokens, env values, base URLs, or API endpoints in the UI.

          Examples or references

          Related but not sufficient:

          The key gap is that settingSources support alone does not help if T3 still gates Claude on a global unauthenticated status before attempting a workspace-scoped Claude startup.

          Contribution

          • I would be open to helping implement this.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , '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

              Claude should work when repo-local .claude settings make it available #1964

              Description

              @Donkijote

              [Feature]: Make Claude availability workspace-aware when .claude settings already work in the repo

              Before submitting

              • I searched existing issues and did not find a duplicate.
              • I am describing a concrete problem or use case, not just a vague idea.

              Area

              apps/server

              Problem or use case

              I use Claude in repos where the Claude CLI works because the repo has .claude/settings.json or .claude/settings.local.json, instead of relying on the default global claude auth login flow.

              In those repos, Claude can work correctly from the CLI because the SDK/CLI resolves user, project, and local settings from the active working directory. But T3 Code still treats Claude as unavailable if the global auth probe reports unauthenticated.

              That creates a false negative:

              • Claude works in the current repo
              • T3 says Claude is unavailable

              So today T3 cannot be used in some repo-scoped Claude setups even though the underlying Claude runtime is actually usable there.

              Screenshots

              Add the screenshots manually in the GitHub editor under the matching caption.

              Before: Claude is shown as unavailable because the UI only reflects the global auth snapshot.

              Image

              After: Claude becomes selectable in the same repo when workspace-local .claude settings are detected, and the picker shows the project-config-backed model label.

              Image

              After: the project-config-backed Claude model can be selected and used successfully in the thread, which demonstrates that the workspace-local Claude configuration is being honored.

              Image

              Proposed solution

              Add project-aware Claude runtime detection based on the active workspace cwd.

              If the current workspace contains .claude/settings.json or .claude/settings.local.json, T3 should probe Claude in that workspace context and treat a successful SDK initialization as ready/authenticated for that project, even if global claude auth status is unauthenticated.

              In the UI, when Claude is available through workspace-local config, T3 should also offer a project-config-backed model option that lets the Claude SDK resolve the model from .claude settings instead of forcing a concrete model override from T3.

              If the configured model can be determined safely, that option should be presented with a readable label instead of a raw slug.

              The Settings page should also keep global Claude auth messaging separate from workspace-specific .claude availability, instead of mixing both ideas into one sentence.

              Why this matters

              This would let T3 work with the same Claude configuration that already works in the CLI, including ad hoc setups, custom backends, and company-managed environments that do not use the default global Claude login flow.

              More importantly, it makes provider availability reflect the real runtime behavior of the active workspace instead of only a machine-wide auth status.

              That broadens where T3 can be used without requiring users to reshape their Claude setup into one specific global convention. It makes the app more adaptable to real-world repos and should make it usable in a wider variety of projects and teams.

              Smallest useful scope

              For Claude only:

              • detect workspace-local .claude/settings.json or .claude/settings.local.json for the active workspace
              • add a project-aware runtime status check keyed by cwd
              • allow Claude to be selected when that workspace-scoped runtime check succeeds
              • expose a Project config model option that omits the explicit SDK model override
              • optionally label that option from the configured Claude model when possible
              • keep the Settings page's global auth message separate from any workspace note

              Likely implementation areas

              I already explored this locally, and the change appears to be reasonably contained.

              The main places that would likely need changes are:

              • apps/server/src/provider/Layers/ClaudeProvider.ts
                Add a workspace-aware Claude runtime probe keyed by cwd, detect .claude/settings.json or .claude/settings.local.json, and treat a successful zero-turn Claude SDK initialization as ready for that workspace.
              • apps/server/src/provider/Layers/ProviderRegistry.ts
                Expose a provider runtime status path in addition to the existing global provider snapshot.
              • apps/server/src/ws.ts
                Add a project-aware server RPC such as server.getProviderRuntimeStatus.
              • packages/contracts/src/server.ts
              • packages/contracts/src/rpc.ts
                Add the runtime-status input/output contract, including optional Claude workspace metadata such as whether project settings were detected.
              • apps/server/src/provider/Layers/ClaudeAdapter.ts
                Support a Claude “project config” model sentinel that omits the explicit SDK model override, so .claude settings can decide the model.
              • packages/contracts/src/model.ts
                Add the Claude project-config sentinel model id.
              • apps/web/src/lib/providerReactQuery.ts
              • apps/web/src/rpc/wsRpcClient.ts
                Query the workspace-aware provider runtime status for the active repo.
              • apps/web/src/components/ChatView.tsx
                Use the active workspace cwd to substitute the runtime-aware Claude status for the global snapshot when the user is in a repo that has .claude settings.
              • apps/web/src/composerDraftStore.ts
              • apps/web/src/modelSelection.ts
                Make project config the default Claude model path when workspace Claude settings are active, unless the user explicitly chooses a concrete model.
              • apps/web/src/components/settings/SettingsPanels.tsx
                Keep the normal global auth message, but show any workspace-specific .claude note separately instead of mixing both concepts into one sentence.

              Implementation notes

              The main behavior change does not require T3 to ingest Claude secrets or fully parse .claude config itself.

              The safer approach is:

              • keep the existing global provider snapshot for install/version/global auth reporting
              • add a second Claude runtime check scoped to the active workspace cwd
              • rely on the Claude SDK's existing settingSources behavior instead of copying .claude auth/config values into T3 settings
              • only read minimal non-secret metadata if needed for display, such as the configured model name for a picker label

              The core end-to-end path is:

              1. The web client knows the active workspace root for the current thread/project.
              2. The client asks the server for Claude runtime status for that cwd.
              3. The server checks for .claude/settings.json or .claude/settings.local.json.
              4. The server attempts a zero-turn Claude SDK initialization with cwd and settingSources.
              5. If that succeeds, Claude is treated as ready for that workspace even if global claude auth status is unauthenticated.
              6. When the user selects the workspace-backed Claude option, T3 omits the explicit model override and lets Claude resolve it from .claude.

              That is the smallest change that seems to solve the mismatch without widening the scope into custom config parsing, secret handling, or Claude history import.

              Alternatives considered

              Today the main workaround is to use the Claude CLI directly instead of T3 in repos that rely on workspace-local .claude settings.

              Another workaround would be to manually duplicate settings into a global Claude login or config path, but that defeats the purpose of repo-scoped configuration and is not viable in some environments.

              Risks or tradeoffs

              This adds a second level of Claude availability: global provider status and workspace-specific runtime status.

              That is worth the complexity because Claude can legitimately be unavailable globally but usable in a specific repo once .claude settings are applied for that cwd.

              T3 should still avoid parsing or copying secrets from .claude itself and should rely on the Claude SDK's existing settings resolution.

              If T3 reads any .claude metadata for display, it should be limited to non-secret fields needed for UI labeling, such as the configured model name, and should never expose tokens, env values, base URLs, or API endpoints in the UI.

              Examples or references

              Related but not sufficient:

              The key gap is that settingSources support alone does not help if T3 still gates Claude on a global unauthenticated status before attempting a workspace-scoped Claude startup.

              Contribution

              • I would be open to helping implement this.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , '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

                  Claude should work when repo-local .claude settings make it available #1964

                  Description

                  @Donkijote

                  [Feature]: Make Claude availability workspace-aware when .claude settings already work in the repo

                  Before submitting

                  • I searched existing issues and did not find a duplicate.
                  • I am describing a concrete problem or use case, not just a vague idea.

                  Area

                  apps/server

                  Problem or use case

                  I use Claude in repos where the Claude CLI works because the repo has .claude/settings.json or .claude/settings.local.json, instead of relying on the default global claude auth login flow.

                  In those repos, Claude can work correctly from the CLI because the SDK/CLI resolves user, project, and local settings from the active working directory. But T3 Code still treats Claude as unavailable if the global auth probe reports unauthenticated.

                  That creates a false negative:

                  • Claude works in the current repo
                  • T3 says Claude is unavailable

                  So today T3 cannot be used in some repo-scoped Claude setups even though the underlying Claude runtime is actually usable there.

                  Screenshots

                  Add the screenshots manually in the GitHub editor under the matching caption.

                  Before: Claude is shown as unavailable because the UI only reflects the global auth snapshot.

                  Image

                  After: Claude becomes selectable in the same repo when workspace-local .claude settings are detected, and the picker shows the project-config-backed model label.

                  Image

                  After: the project-config-backed Claude model can be selected and used successfully in the thread, which demonstrates that the workspace-local Claude configuration is being honored.

                  Image

                  Proposed solution

                  Add project-aware Claude runtime detection based on the active workspace cwd.

                  If the current workspace contains .claude/settings.json or .claude/settings.local.json, T3 should probe Claude in that workspace context and treat a successful SDK initialization as ready/authenticated for that project, even if global claude auth status is unauthenticated.

                  In the UI, when Claude is available through workspace-local config, T3 should also offer a project-config-backed model option that lets the Claude SDK resolve the model from .claude settings instead of forcing a concrete model override from T3.

                  If the configured model can be determined safely, that option should be presented with a readable label instead of a raw slug.

                  The Settings page should also keep global Claude auth messaging separate from workspace-specific .claude availability, instead of mixing both ideas into one sentence.

                  Why this matters

                  This would let T3 work with the same Claude configuration that already works in the CLI, including ad hoc setups, custom backends, and company-managed environments that do not use the default global Claude login flow.

                  More importantly, it makes provider availability reflect the real runtime behavior of the active workspace instead of only a machine-wide auth status.

                  That broadens where T3 can be used without requiring users to reshape their Claude setup into one specific global convention. It makes the app more adaptable to real-world repos and should make it usable in a wider variety of projects and teams.

                  Smallest useful scope

                  For Claude only:

                  • detect workspace-local .claude/settings.json or .claude/settings.local.json for the active workspace
                  • add a project-aware runtime status check keyed by cwd
                  • allow Claude to be selected when that workspace-scoped runtime check succeeds
                  • expose a Project config model option that omits the explicit SDK model override
                  • optionally label that option from the configured Claude model when possible
                  • keep the Settings page's global auth message separate from any workspace note

                  Likely implementation areas

                  I already explored this locally, and the change appears to be reasonably contained.

                  The main places that would likely need changes are:

                  • apps/server/src/provider/Layers/ClaudeProvider.ts
                    Add a workspace-aware Claude runtime probe keyed by cwd, detect .claude/settings.json or .claude/settings.local.json, and treat a successful zero-turn Claude SDK initialization as ready for that workspace.
                  • apps/server/src/provider/Layers/ProviderRegistry.ts
                    Expose a provider runtime status path in addition to the existing global provider snapshot.
                  • apps/server/src/ws.ts
                    Add a project-aware server RPC such as server.getProviderRuntimeStatus.
                  • packages/contracts/src/server.ts
                  • packages/contracts/src/rpc.ts
                    Add the runtime-status input/output contract, including optional Claude workspace metadata such as whether project settings were detected.
                  • apps/server/src/provider/Layers/ClaudeAdapter.ts
                    Support a Claude “project config” model sentinel that omits the explicit SDK model override, so .claude settings can decide the model.
                  • packages/contracts/src/model.ts
                    Add the Claude project-config sentinel model id.
                  • apps/web/src/lib/providerReactQuery.ts
                  • apps/web/src/rpc/wsRpcClient.ts
                    Query the workspace-aware provider runtime status for the active repo.
                  • apps/web/src/components/ChatView.tsx
                    Use the active workspace cwd to substitute the runtime-aware Claude status for the global snapshot when the user is in a repo that has .claude settings.
                  • apps/web/src/composerDraftStore.ts
                  • apps/web/src/modelSelection.ts
                    Make project config the default Claude model path when workspace Claude settings are active, unless the user explicitly chooses a concrete model.
                  • apps/web/src/components/settings/SettingsPanels.tsx
                    Keep the normal global auth message, but show any workspace-specific .claude note separately instead of mixing both concepts into one sentence.

                  Implementation notes

                  The main behavior change does not require T3 to ingest Claude secrets or fully parse .claude config itself.

                  The safer approach is:

                  • keep the existing global provider snapshot for install/version/global auth reporting
                  • add a second Claude runtime check scoped to the active workspace cwd
                  • rely on the Claude SDK's existing settingSources behavior instead of copying .claude auth/config values into T3 settings
                  • only read minimal non-secret metadata if needed for display, such as the configured model name for a picker label

                  The core end-to-end path is:

                  1. The web client knows the active workspace root for the current thread/project.
                  2. The client asks the server for Claude runtime status for that cwd.
                  3. The server checks for .claude/settings.json or .claude/settings.local.json.
                  4. The server attempts a zero-turn Claude SDK initialization with cwd and settingSources.
                  5. If that succeeds, Claude is treated as ready for that workspace even if global claude auth status is unauthenticated.
                  6. When the user selects the workspace-backed Claude option, T3 omits the explicit model override and lets Claude resolve it from .claude.

                  That is the smallest change that seems to solve the mismatch without widening the scope into custom config parsing, secret handling, or Claude history import.

                  Alternatives considered

                  Today the main workaround is to use the Claude CLI directly instead of T3 in repos that rely on workspace-local .claude settings.

                  Another workaround would be to manually duplicate settings into a global Claude login or config path, but that defeats the purpose of repo-scoped configuration and is not viable in some environments.

                  Risks or tradeoffs

                  This adds a second level of Claude availability: global provider status and workspace-specific runtime status.

                  That is worth the complexity because Claude can legitimately be unavailable globally but usable in a specific repo once .claude settings are applied for that cwd.

                  T3 should still avoid parsing or copying secrets from .claude itself and should rely on the Claude SDK's existing settings resolution.

                  If T3 reads any .claude metadata for display, it should be limited to non-secret fields needed for UI labeling, such as the configured model name, and should never expose tokens, env values, base URLs, or API endpoints in the UI.

                  Examples or references

                  Related but not sufficient:

                  The key gap is that settingSources support alone does not help if T3 still gates Claude on a global unauthenticated status before attempting a workspace-scoped Claude startup.

                  Contribution

                  • I would be open to helping implement this.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No labels

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , '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

                      Claude should work when repo-local .claude settings make it available #1964

                      Description

                      @Donkijote

                      [Feature]: Make Claude availability workspace-aware when .claude settings already work in the repo

                      Before submitting

                      • I searched existing issues and did not find a duplicate.
                      • I am describing a concrete problem or use case, not just a vague idea.

                      Area

                      apps/server

                      Problem or use case

                      I use Claude in repos where the Claude CLI works because the repo has .claude/settings.json or .claude/settings.local.json, instead of relying on the default global claude auth login flow.

                      In those repos, Claude can work correctly from the CLI because the SDK/CLI resolves user, project, and local settings from the active working directory. But T3 Code still treats Claude as unavailable if the global auth probe reports unauthenticated.

                      That creates a false negative:

                      • Claude works in the current repo
                      • T3 says Claude is unavailable

                      So today T3 cannot be used in some repo-scoped Claude setups even though the underlying Claude runtime is actually usable there.

                      Screenshots

                      Add the screenshots manually in the GitHub editor under the matching caption.

                      Before: Claude is shown as unavailable because the UI only reflects the global auth snapshot.

                      Image

                      After: Claude becomes selectable in the same repo when workspace-local .claude settings are detected, and the picker shows the project-config-backed model label.

                      Image

                      After: the project-config-backed Claude model can be selected and used successfully in the thread, which demonstrates that the workspace-local Claude configuration is being honored.

                      Image

                      Proposed solution

                      Add project-aware Claude runtime detection based on the active workspace cwd.

                      If the current workspace contains .claude/settings.json or .claude/settings.local.json, T3 should probe Claude in that workspace context and treat a successful SDK initialization as ready/authenticated for that project, even if global claude auth status is unauthenticated.

                      In the UI, when Claude is available through workspace-local config, T3 should also offer a project-config-backed model option that lets the Claude SDK resolve the model from .claude settings instead of forcing a concrete model override from T3.

                      If the configured model can be determined safely, that option should be presented with a readable label instead of a raw slug.

                      The Settings page should also keep global Claude auth messaging separate from workspace-specific .claude availability, instead of mixing both ideas into one sentence.

                      Why this matters

                      This would let T3 work with the same Claude configuration that already works in the CLI, including ad hoc setups, custom backends, and company-managed environments that do not use the default global Claude login flow.

                      More importantly, it makes provider availability reflect the real runtime behavior of the active workspace instead of only a machine-wide auth status.

                      That broadens where T3 can be used without requiring users to reshape their Claude setup into one specific global convention. It makes the app more adaptable to real-world repos and should make it usable in a wider variety of projects and teams.

                      Smallest useful scope

                      For Claude only:

                      • detect workspace-local .claude/settings.json or .claude/settings.local.json for the active workspace
                      • add a project-aware runtime status check keyed by cwd
                      • allow Claude to be selected when that workspace-scoped runtime check succeeds
                      • expose a Project config model option that omits the explicit SDK model override
                      • optionally label that option from the configured Claude model when possible
                      • keep the Settings page's global auth message separate from any workspace note

                      Likely implementation areas

                      I already explored this locally, and the change appears to be reasonably contained.

                      The main places that would likely need changes are:

                      • apps/server/src/provider/Layers/ClaudeProvider.ts
                        Add a workspace-aware Claude runtime probe keyed by cwd, detect .claude/settings.json or .claude/settings.local.json, and treat a successful zero-turn Claude SDK initialization as ready for that workspace.
                      • apps/server/src/provider/Layers/ProviderRegistry.ts
                        Expose a provider runtime status path in addition to the existing global provider snapshot.
                      • apps/server/src/ws.ts
                        Add a project-aware server RPC such as server.getProviderRuntimeStatus.
                      • packages/contracts/src/server.ts
                      • packages/contracts/src/rpc.ts
                        Add the runtime-status input/output contract, including optional Claude workspace metadata such as whether project settings were detected.
                      • apps/server/src/provider/Layers/ClaudeAdapter.ts
                        Support a Claude “project config” model sentinel that omits the explicit SDK model override, so .claude settings can decide the model.
                      • packages/contracts/src/model.ts
                        Add the Claude project-config sentinel model id.
                      • apps/web/src/lib/providerReactQuery.ts
                      • apps/web/src/rpc/wsRpcClient.ts
                        Query the workspace-aware provider runtime status for the active repo.
                      • apps/web/src/components/ChatView.tsx
                        Use the active workspace cwd to substitute the runtime-aware Claude status for the global snapshot when the user is in a repo that has .claude settings.
                      • apps/web/src/composerDraftStore.ts
                      • apps/web/src/modelSelection.ts
                        Make project config the default Claude model path when workspace Claude settings are active, unless the user explicitly chooses a concrete model.
                      • apps/web/src/components/settings/SettingsPanels.tsx
                        Keep the normal global auth message, but show any workspace-specific .claude note separately instead of mixing both concepts into one sentence.

                      Implementation notes

                      The main behavior change does not require T3 to ingest Claude secrets or fully parse .claude config itself.

                      The safer approach is:

                      • keep the existing global provider snapshot for install/version/global auth reporting
                      • add a second Claude runtime check scoped to the active workspace cwd
                      • rely on the Claude SDK's existing settingSources behavior instead of copying .claude auth/config values into T3 settings
                      • only read minimal non-secret metadata if needed for display, such as the configured model name for a picker label

                      The core end-to-end path is:

                      1. The web client knows the active workspace root for the current thread/project.
                      2. The client asks the server for Claude runtime status for that cwd.
                      3. The server checks for .claude/settings.json or .claude/settings.local.json.
                      4. The server attempts a zero-turn Claude SDK initialization with cwd and settingSources.
                      5. If that succeeds, Claude is treated as ready for that workspace even if global claude auth status is unauthenticated.
                      6. When the user selects the workspace-backed Claude option, T3 omits the explicit model override and lets Claude resolve it from .claude.

                      That is the smallest change that seems to solve the mismatch without widening the scope into custom config parsing, secret handling, or Claude history import.

                      Alternatives considered

                      Today the main workaround is to use the Claude CLI directly instead of T3 in repos that rely on workspace-local .claude settings.

                      Another workaround would be to manually duplicate settings into a global Claude login or config path, but that defeats the purpose of repo-scoped configuration and is not viable in some environments.

                      Risks or tradeoffs

                      This adds a second level of Claude availability: global provider status and workspace-specific runtime status.

                      That is worth the complexity because Claude can legitimately be unavailable globally but usable in a specific repo once .claude settings are applied for that cwd.

                      T3 should still avoid parsing or copying secrets from .claude itself and should rely on the Claude SDK's existing settings resolution.

                      If T3 reads any .claude metadata for display, it should be limited to non-secret fields needed for UI labeling, such as the configured model name, and should never expose tokens, env values, base URLs, or API endpoints in the UI.

                      Examples or references

                      Related but not sufficient:

                      The key gap is that settingSources support alone does not help if T3 still gates Claude on a global unauthenticated status before attempting a workspace-scoped Claude startup.

                      Contribution

                      • I would be open to helping implement this.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No labels

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , '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

                          Claude should work when repo-local .claude settings make it available #1964

                          Description

                          @Donkijote

                          [Feature]: Make Claude availability workspace-aware when .claude settings already work in the repo

                          Before submitting

                          • I searched existing issues and did not find a duplicate.
                          • I am describing a concrete problem or use case, not just a vague idea.

                          Area

                          apps/server

                          Problem or use case

                          I use Claude in repos where the Claude CLI works because the repo has .claude/settings.json or .claude/settings.local.json, instead of relying on the default global claude auth login flow.

                          In those repos, Claude can work correctly from the CLI because the SDK/CLI resolves user, project, and local settings from the active working directory. But T3 Code still treats Claude as unavailable if the global auth probe reports unauthenticated.

                          That creates a false negative:

                          • Claude works in the current repo
                          • T3 says Claude is unavailable

                          So today T3 cannot be used in some repo-scoped Claude setups even though the underlying Claude runtime is actually usable there.

                          Screenshots

                          Add the screenshots manually in the GitHub editor under the matching caption.

                          Before: Claude is shown as unavailable because the UI only reflects the global auth snapshot.

                          Image

                          After: Claude becomes selectable in the same repo when workspace-local .claude settings are detected, and the picker shows the project-config-backed model label.

                          Image

                          After: the project-config-backed Claude model can be selected and used successfully in the thread, which demonstrates that the workspace-local Claude configuration is being honored.

                          Image

                          Proposed solution

                          Add project-aware Claude runtime detection based on the active workspace cwd.

                          If the current workspace contains .claude/settings.json or .claude/settings.local.json, T3 should probe Claude in that workspace context and treat a successful SDK initialization as ready/authenticated for that project, even if global claude auth status is unauthenticated.

                          In the UI, when Claude is available through workspace-local config, T3 should also offer a project-config-backed model option that lets the Claude SDK resolve the model from .claude settings instead of forcing a concrete model override from T3.

                          If the configured model can be determined safely, that option should be presented with a readable label instead of a raw slug.

                          The Settings page should also keep global Claude auth messaging separate from workspace-specific .claude availability, instead of mixing both ideas into one sentence.

                          Why this matters

                          This would let T3 work with the same Claude configuration that already works in the CLI, including ad hoc setups, custom backends, and company-managed environments that do not use the default global Claude login flow.

                          More importantly, it makes provider availability reflect the real runtime behavior of the active workspace instead of only a machine-wide auth status.

                          That broadens where T3 can be used without requiring users to reshape their Claude setup into one specific global convention. It makes the app more adaptable to real-world repos and should make it usable in a wider variety of projects and teams.

                          Smallest useful scope

                          For Claude only:

                          • detect workspace-local .claude/settings.json or .claude/settings.local.json for the active workspace
                          • add a project-aware runtime status check keyed by cwd
                          • allow Claude to be selected when that workspace-scoped runtime check succeeds
                          • expose a Project config model option that omits the explicit SDK model override
                          • optionally label that option from the configured Claude model when possible
                          • keep the Settings page's global auth message separate from any workspace note

                          Likely implementation areas

                          I already explored this locally, and the change appears to be reasonably contained.

                          The main places that would likely need changes are:

                          • apps/server/src/provider/Layers/ClaudeProvider.ts
                            Add a workspace-aware Claude runtime probe keyed by cwd, detect .claude/settings.json or .claude/settings.local.json, and treat a successful zero-turn Claude SDK initialization as ready for that workspace.
                          • apps/server/src/provider/Layers/ProviderRegistry.ts
                            Expose a provider runtime status path in addition to the existing global provider snapshot.
                          • apps/server/src/ws.ts
                            Add a project-aware server RPC such as server.getProviderRuntimeStatus.
                          • packages/contracts/src/server.ts
                          • packages/contracts/src/rpc.ts
                            Add the runtime-status input/output contract, including optional Claude workspace metadata such as whether project settings were detected.
                          • apps/server/src/provider/Layers/ClaudeAdapter.ts
                            Support a Claude “project config” model sentinel that omits the explicit SDK model override, so .claude settings can decide the model.
                          • packages/contracts/src/model.ts
                            Add the Claude project-config sentinel model id.
                          • apps/web/src/lib/providerReactQuery.ts
                          • apps/web/src/rpc/wsRpcClient.ts
                            Query the workspace-aware provider runtime status for the active repo.
                          • apps/web/src/components/ChatView.tsx
                            Use the active workspace cwd to substitute the runtime-aware Claude status for the global snapshot when the user is in a repo that has .claude settings.
                          • apps/web/src/composerDraftStore.ts
                          • apps/web/src/modelSelection.ts
                            Make project config the default Claude model path when workspace Claude settings are active, unless the user explicitly chooses a concrete model.
                          • apps/web/src/components/settings/SettingsPanels.tsx
                            Keep the normal global auth message, but show any workspace-specific .claude note separately instead of mixing both concepts into one sentence.

                          Implementation notes

                          The main behavior change does not require T3 to ingest Claude secrets or fully parse .claude config itself.

                          The safer approach is:

                          • keep the existing global provider snapshot for install/version/global auth reporting
                          • add a second Claude runtime check scoped to the active workspace cwd
                          • rely on the Claude SDK's existing settingSources behavior instead of copying .claude auth/config values into T3 settings
                          • only read minimal non-secret metadata if needed for display, such as the configured model name for a picker label

                          The core end-to-end path is:

                          1. The web client knows the active workspace root for the current thread/project.
                          2. The client asks the server for Claude runtime status for that cwd.
                          3. The server checks for .claude/settings.json or .claude/settings.local.json.
                          4. The server attempts a zero-turn Claude SDK initialization with cwd and settingSources.
                          5. If that succeeds, Claude is treated as ready for that workspace even if global claude auth status is unauthenticated.
                          6. When the user selects the workspace-backed Claude option, T3 omits the explicit model override and lets Claude resolve it from .claude.

                          That is the smallest change that seems to solve the mismatch without widening the scope into custom config parsing, secret handling, or Claude history import.

                          Alternatives considered

                          Today the main workaround is to use the Claude CLI directly instead of T3 in repos that rely on workspace-local .claude settings.

                          Another workaround would be to manually duplicate settings into a global Claude login or config path, but that defeats the purpose of repo-scoped configuration and is not viable in some environments.

                          Risks or tradeoffs

                          This adds a second level of Claude availability: global provider status and workspace-specific runtime status.

                          That is worth the complexity because Claude can legitimately be unavailable globally but usable in a specific repo once .claude settings are applied for that cwd.

                          T3 should still avoid parsing or copying secrets from .claude itself and should rely on the Claude SDK's existing settings resolution.

                          If T3 reads any .claude metadata for display, it should be limited to non-secret fields needed for UI labeling, such as the configured model name, and should never expose tokens, env values, base URLs, or API endpoints in the UI.

                          Examples or references

                          Related but not sufficient:

                          The key gap is that settingSources support alone does not help if T3 still gates Claude on a global unauthenticated status before attempting a workspace-scoped Claude startup.

                          Contribution

                          • I would be open to helping implement this.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No labels

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , '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

                              Claude should work when repo-local .claude settings make it available #1964

                              Description

                              @Donkijote

                              [Feature]: Make Claude availability workspace-aware when .claude settings already work in the repo

                              Before submitting

                              • I searched existing issues and did not find a duplicate.
                              • I am describing a concrete problem or use case, not just a vague idea.

                              Area

                              apps/server

                              Problem or use case

                              I use Claude in repos where the Claude CLI works because the repo has .claude/settings.json or .claude/settings.local.json, instead of relying on the default global claude auth login flow.

                              In those repos, Claude can work correctly from the CLI because the SDK/CLI resolves user, project, and local settings from the active working directory. But T3 Code still treats Claude as unavailable if the global auth probe reports unauthenticated.

                              That creates a false negative:

                              • Claude works in the current repo
                              • T3 says Claude is unavailable

                              So today T3 cannot be used in some repo-scoped Claude setups even though the underlying Claude runtime is actually usable there.

                              Screenshots

                              Add the screenshots manually in the GitHub editor under the matching caption.

                              Before: Claude is shown as unavailable because the UI only reflects the global auth snapshot.

                              Image

                              After: Claude becomes selectable in the same repo when workspace-local .claude settings are detected, and the picker shows the project-config-backed model label.

                              Image

                              After: the project-config-backed Claude model can be selected and used successfully in the thread, which demonstrates that the workspace-local Claude configuration is being honored.

                              Image

                              Proposed solution

                              Add project-aware Claude runtime detection based on the active workspace cwd.

                              If the current workspace contains .claude/settings.json or .claude/settings.local.json, T3 should probe Claude in that workspace context and treat a successful SDK initialization as ready/authenticated for that project, even if global claude auth status is unauthenticated.

                              In the UI, when Claude is available through workspace-local config, T3 should also offer a project-config-backed model option that lets the Claude SDK resolve the model from .claude settings instead of forcing a concrete model override from T3.

                              If the configured model can be determined safely, that option should be presented with a readable label instead of a raw slug.

                              The Settings page should also keep global Claude auth messaging separate from workspace-specific .claude availability, instead of mixing both ideas into one sentence.

                              Why this matters

                              This would let T3 work with the same Claude configuration that already works in the CLI, including ad hoc setups, custom backends, and company-managed environments that do not use the default global Claude login flow.

                              More importantly, it makes provider availability reflect the real runtime behavior of the active workspace instead of only a machine-wide auth status.

                              That broadens where T3 can be used without requiring users to reshape their Claude setup into one specific global convention. It makes the app more adaptable to real-world repos and should make it usable in a wider variety of projects and teams.

                              Smallest useful scope

                              For Claude only:

                              • detect workspace-local .claude/settings.json or .claude/settings.local.json for the active workspace
                              • add a project-aware runtime status check keyed by cwd
                              • allow Claude to be selected when that workspace-scoped runtime check succeeds
                              • expose a Project config model option that omits the explicit SDK model override
                              • optionally label that option from the configured Claude model when possible
                              • keep the Settings page's global auth message separate from any workspace note

                              Likely implementation areas

                              I already explored this locally, and the change appears to be reasonably contained.

                              The main places that would likely need changes are:

                              • apps/server/src/provider/Layers/ClaudeProvider.ts
                                Add a workspace-aware Claude runtime probe keyed by cwd, detect .claude/settings.json or .claude/settings.local.json, and treat a successful zero-turn Claude SDK initialization as ready for that workspace.
                              • apps/server/src/provider/Layers/ProviderRegistry.ts
                                Expose a provider runtime status path in addition to the existing global provider snapshot.
                              • apps/server/src/ws.ts
                                Add a project-aware server RPC such as server.getProviderRuntimeStatus.
                              • packages/contracts/src/server.ts
                              • packages/contracts/src/rpc.ts
                                Add the runtime-status input/output contract, including optional Claude workspace metadata such as whether project settings were detected.
                              • apps/server/src/provider/Layers/ClaudeAdapter.ts
                                Support a Claude “project config” model sentinel that omits the explicit SDK model override, so .claude settings can decide the model.
                              • packages/contracts/src/model.ts
                                Add the Claude project-config sentinel model id.
                              • apps/web/src/lib/providerReactQuery.ts
                              • apps/web/src/rpc/wsRpcClient.ts
                                Query the workspace-aware provider runtime status for the active repo.
                              • apps/web/src/components/ChatView.tsx
                                Use the active workspace cwd to substitute the runtime-aware Claude status for the global snapshot when the user is in a repo that has .claude settings.
                              • apps/web/src/composerDraftStore.ts
                              • apps/web/src/modelSelection.ts
                                Make project config the default Claude model path when workspace Claude settings are active, unless the user explicitly chooses a concrete model.
                              • apps/web/src/components/settings/SettingsPanels.tsx
                                Keep the normal global auth message, but show any workspace-specific .claude note separately instead of mixing both concepts into one sentence.

                              Implementation notes

                              The main behavior change does not require T3 to ingest Claude secrets or fully parse .claude config itself.

                              The safer approach is:

                              • keep the existing global provider snapshot for install/version/global auth reporting
                              • add a second Claude runtime check scoped to the active workspace cwd
                              • rely on the Claude SDK's existing settingSources behavior instead of copying .claude auth/config values into T3 settings
                              • only read minimal non-secret metadata if needed for display, such as the configured model name for a picker label

                              The core end-to-end path is:

                              1. The web client knows the active workspace root for the current thread/project.
                              2. The client asks the server for Claude runtime status for that cwd.
                              3. The server checks for .claude/settings.json or .claude/settings.local.json.
                              4. The server attempts a zero-turn Claude SDK initialization with cwd and settingSources.
                              5. If that succeeds, Claude is treated as ready for that workspace even if global claude auth status is unauthenticated.
                              6. When the user selects the workspace-backed Claude option, T3 omits the explicit model override and lets Claude resolve it from .claude.

                              That is the smallest change that seems to solve the mismatch without widening the scope into custom config parsing, secret handling, or Claude history import.

                              Alternatives considered

                              Today the main workaround is to use the Claude CLI directly instead of T3 in repos that rely on workspace-local .claude settings.

                              Another workaround would be to manually duplicate settings into a global Claude login or config path, but that defeats the purpose of repo-scoped configuration and is not viable in some environments.

                              Risks or tradeoffs

                              This adds a second level of Claude availability: global provider status and workspace-specific runtime status.

                              That is worth the complexity because Claude can legitimately be unavailable globally but usable in a specific repo once .claude settings are applied for that cwd.

                              T3 should still avoid parsing or copying secrets from .claude itself and should rely on the Claude SDK's existing settings resolution.

                              If T3 reads any .claude metadata for display, it should be limited to non-secret fields needed for UI labeling, such as the configured model name, and should never expose tokens, env values, base URLs, or API endpoints in the UI.

                              Examples or references

                              Related but not sufficient:

                              The key gap is that settingSources support alone does not help if T3 still gates Claude on a global unauthenticated status before attempting a workspace-scoped Claude startup.

                              Contribution

                              • I would be open to helping implement this.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions