fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能 - #36

Merged
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir
Feb 9, 2026
Merged

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能#36
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir

Conversation

@gy212

@gy212gy212 commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

关联 Issue: #35

问题

CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。

此外,当两个目录存在同名技能时,之前没有冲突处理机制,可能导致误操作。

修改内容

后端

列表接口 GET /api/skills

  • 同时扫描 ~/.agents/skills/~/.claude/skills/
  • 通过 SHA1 内容哈希去重:同名 + 同内容只保留一条(优先选技能数量多的目录),同名 + 不同内容保留两条
  • 返回对象新增 installedSource?: "agents" | "claude" 字段

详情接口 GET/PUT/DELETE /api/skills/:name

  • 新增 ?source=agents|claude 参数,精确定位到哪个路径的技能
  • 使用 YAML front matter 的 name 字段匹配技能,修复"列表能看到但点开 404"的问题
  • 同名不同内容且未指定 source 时返回 409,附带可选 sources 列表
  • PUT / DELETE 同样支持 ?source= 消歧

前端

Skills 列表页

  • SkillItem 类型新增 installedSource 字段
  • Badge 显示 installed:claudeinstalled:agents,明确来源
  • 保存/删除时携带 ?source=,防止误操作同名技能

聊天补全与技能展开

  • 补全项描述追加来源提示(如 (claude)
  • 技能展开时请求 GET /api/skills/:name?source=...,精准读取

冲突处理策略

场景行为
同名 + 同内容去重,保留技能数量多的路径(相等时默认 claude
同名 + 不同内容保留两条,前端通过 installedSource 区分
详情请求同名不同内容且无 source返回 409,要求指定 source

涉及文件

  • src/app/api/skills/route.ts
  • src/app/api/skills/[name]/route.ts
  • src/components/skills/SkillListItem.tsx
  • src/components/skills/SkillsManager.tsx
  • src/components/skills/SkillEditor.tsx
  • src/components/chat/MessageInput.tsx

问题:CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,
导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。
修改内容:
后端:
- 列表接口 (GET /api/skills) 同时扫描 ~/.agents/skills/ 和 ~/.claude/skills/
- 通过 SHA1 内容哈希去重:同名同内容只保留一条,同名不同内容保留两条
- 详情接口 (GET/PUT/DELETE /api/skills/:name) 新增 ?source= 参数精确定位来源
- 详情接口使用 YAML front matter 的 name 字段匹配,修复列表能看到但点开 404 的问题
- 同名不同内容时返回 409,要求前端传 source 消歧
前端:
- SkillItem 类型新增 installedSource 字段
- Badge 显示 installed:claude 或 installed:agents 明确来源
- 保存/删除时携带 ?source= 防止误操作同名技能
- 聊天补全项描述追加来源提示
- 技能展开时精准请求对应来源
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@op7418
op7418 merged commit 336897c into op7418:mainFeb 9, 2026
@gy212
gy212 deleted the fix/read-claude-skills-dir branch March 5, 2026 01:29
op7418 added a commit that referenced this pull request Jun 1, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 #36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
op7418 added a commit that referenced this pull request Jun 1, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 #36(非阻断、defer)。这轮 P0.1
(commit 0106b07)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 #36 已解决,避免留个其实已修的开放债。
op7418 added a commit that referenced this pull request Jun 28, 2026
…pactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,1e143d7)
+ item 1(存量第三方会话渲染 gate,f5d4f15)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 #36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
op7418 added a commit that referenced this pull request Jun 28, 2026
…ed (#632)
Signal — Codex 复审 #632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 #36,与既有 #36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt #36#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 op7418#36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 op7418#36(非阻断、defer)。这轮 P0.1
(commit b748d10)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 op7418#36 已解决,避免留个其实已修的开放债。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…3 定位 autoCompactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,de7b5d4)
+ item 1(存量第三方会话渲染 gate,386b780)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 op7418#36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…ed (op7418#632)
Signal — Codex 复审 op7418#632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 op7418#36,与既有 op7418#36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt op7418#36op7418#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能 - #36

Merged
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir
Feb 9, 2026
Merged

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能#36
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir

Conversation

@gy212

@gy212gy212 commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

关联 Issue: #35

问题

CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。

此外,当两个目录存在同名技能时,之前没有冲突处理机制,可能导致误操作。

修改内容

后端

列表接口 GET /api/skills

  • 同时扫描 ~/.agents/skills/~/.claude/skills/
  • 通过 SHA1 内容哈希去重:同名 + 同内容只保留一条(优先选技能数量多的目录),同名 + 不同内容保留两条
  • 返回对象新增 installedSource?: "agents" | "claude" 字段

详情接口 GET/PUT/DELETE /api/skills/:name

  • 新增 ?source=agents|claude 参数,精确定位到哪个路径的技能
  • 使用 YAML front matter 的 name 字段匹配技能,修复"列表能看到但点开 404"的问题
  • 同名不同内容且未指定 source 时返回 409,附带可选 sources 列表
  • PUT / DELETE 同样支持 ?source= 消歧

前端

Skills 列表页

  • SkillItem 类型新增 installedSource 字段
  • Badge 显示 installed:claudeinstalled:agents,明确来源
  • 保存/删除时携带 ?source=,防止误操作同名技能

聊天补全与技能展开

  • 补全项描述追加来源提示(如 (claude)
  • 技能展开时请求 GET /api/skills/:name?source=...,精准读取

冲突处理策略

场景行为
同名 + 同内容去重,保留技能数量多的路径(相等时默认 claude
同名 + 不同内容保留两条,前端通过 installedSource 区分
详情请求同名不同内容且无 source返回 409,要求指定 source

涉及文件

  • src/app/api/skills/route.ts
  • src/app/api/skills/[name]/route.ts
  • src/components/skills/SkillListItem.tsx
  • src/components/skills/SkillsManager.tsx
  • src/components/skills/SkillEditor.tsx
  • src/components/chat/MessageInput.tsx

问题:CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,
导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。
修改内容:
后端:
- 列表接口 (GET /api/skills) 同时扫描 ~/.agents/skills/ 和 ~/.claude/skills/
- 通过 SHA1 内容哈希去重:同名同内容只保留一条,同名不同内容保留两条
- 详情接口 (GET/PUT/DELETE /api/skills/:name) 新增 ?source= 参数精确定位来源
- 详情接口使用 YAML front matter 的 name 字段匹配,修复列表能看到但点开 404 的问题
- 同名不同内容时返回 409,要求前端传 source 消歧
前端:
- SkillItem 类型新增 installedSource 字段
- Badge 显示 installed:claude 或 installed:agents 明确来源
- 保存/删除时携带 ?source= 防止误操作同名技能
- 聊天补全项描述追加来源提示
- 技能展开时精准请求对应来源
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@op7418
op7418 merged commit 336897c into op7418:mainFeb 9, 2026
@gy212
gy212 deleted the fix/read-claude-skills-dir branch March 5, 2026 01:29
op7418 added a commit that referenced this pull request Jun 1, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 #36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
op7418 added a commit that referenced this pull request Jun 1, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 #36(非阻断、defer)。这轮 P0.1
(commit 0106b07)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 #36 已解决,避免留个其实已修的开放债。
op7418 added a commit that referenced this pull request Jun 28, 2026
…pactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,1e143d7)
+ item 1(存量第三方会话渲染 gate,f5d4f15)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 #36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
op7418 added a commit that referenced this pull request Jun 28, 2026
…ed (#632)
Signal — Codex 复审 #632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 #36,与既有 #36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt #36#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 op7418#36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 op7418#36(非阻断、defer)。这轮 P0.1
(commit b748d10)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 op7418#36 已解决,避免留个其实已修的开放债。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…3 定位 autoCompactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,de7b5d4)
+ item 1(存量第三方会话渲染 gate,386b780)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 op7418#36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…ed (op7418#632)
Signal — Codex 复审 op7418#632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 op7418#36,与既有 op7418#36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt op7418#36op7418#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能 - #36

Merged
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir
Feb 9, 2026
Merged

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能#36
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir

Conversation

@gy212

@gy212gy212 commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

关联 Issue: #35

问题

CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。

此外,当两个目录存在同名技能时,之前没有冲突处理机制,可能导致误操作。

修改内容

后端

列表接口 GET /api/skills

  • 同时扫描 ~/.agents/skills/~/.claude/skills/
  • 通过 SHA1 内容哈希去重:同名 + 同内容只保留一条(优先选技能数量多的目录),同名 + 不同内容保留两条
  • 返回对象新增 installedSource?: "agents" | "claude" 字段

详情接口 GET/PUT/DELETE /api/skills/:name

  • 新增 ?source=agents|claude 参数,精确定位到哪个路径的技能
  • 使用 YAML front matter 的 name 字段匹配技能,修复"列表能看到但点开 404"的问题
  • 同名不同内容且未指定 source 时返回 409,附带可选 sources 列表
  • PUT / DELETE 同样支持 ?source= 消歧

前端

Skills 列表页

  • SkillItem 类型新增 installedSource 字段
  • Badge 显示 installed:claudeinstalled:agents,明确来源
  • 保存/删除时携带 ?source=,防止误操作同名技能

聊天补全与技能展开

  • 补全项描述追加来源提示(如 (claude)
  • 技能展开时请求 GET /api/skills/:name?source=...,精准读取

冲突处理策略

场景行为
同名 + 同内容去重,保留技能数量多的路径(相等时默认 claude
同名 + 不同内容保留两条,前端通过 installedSource 区分
详情请求同名不同内容且无 source返回 409,要求指定 source

涉及文件

  • src/app/api/skills/route.ts
  • src/app/api/skills/[name]/route.ts
  • src/components/skills/SkillListItem.tsx
  • src/components/skills/SkillsManager.tsx
  • src/components/skills/SkillEditor.tsx
  • src/components/chat/MessageInput.tsx

问题:CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,
导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。
修改内容:
后端:
- 列表接口 (GET /api/skills) 同时扫描 ~/.agents/skills/ 和 ~/.claude/skills/
- 通过 SHA1 内容哈希去重:同名同内容只保留一条,同名不同内容保留两条
- 详情接口 (GET/PUT/DELETE /api/skills/:name) 新增 ?source= 参数精确定位来源
- 详情接口使用 YAML front matter 的 name 字段匹配,修复列表能看到但点开 404 的问题
- 同名不同内容时返回 409,要求前端传 source 消歧
前端:
- SkillItem 类型新增 installedSource 字段
- Badge 显示 installed:claude 或 installed:agents 明确来源
- 保存/删除时携带 ?source= 防止误操作同名技能
- 聊天补全项描述追加来源提示
- 技能展开时精准请求对应来源
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@op7418
op7418 merged commit 336897c into op7418:mainFeb 9, 2026
@gy212
gy212 deleted the fix/read-claude-skills-dir branch March 5, 2026 01:29
op7418 added a commit that referenced this pull request Jun 1, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 #36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
op7418 added a commit that referenced this pull request Jun 1, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 #36(非阻断、defer)。这轮 P0.1
(commit 0106b07)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 #36 已解决,避免留个其实已修的开放债。
op7418 added a commit that referenced this pull request Jun 28, 2026
…pactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,1e143d7)
+ item 1(存量第三方会话渲染 gate,f5d4f15)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 #36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
op7418 added a commit that referenced this pull request Jun 28, 2026
…ed (#632)
Signal — Codex 复审 #632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 #36,与既有 #36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt #36#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 op7418#36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 op7418#36(非阻断、defer)。这轮 P0.1
(commit b748d10)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 op7418#36 已解决,避免留个其实已修的开放债。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…3 定位 autoCompactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,de7b5d4)
+ item 1(存量第三方会话渲染 gate,386b780)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 op7418#36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…ed (op7418#632)
Signal — Codex 复审 op7418#632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 op7418#36,与既有 op7418#36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt op7418#36op7418#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能 - #36

Merged
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir
Feb 9, 2026
Merged

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能#36
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir

Conversation

@gy212

@gy212gy212 commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

关联 Issue: #35

问题

CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。

此外,当两个目录存在同名技能时,之前没有冲突处理机制,可能导致误操作。

修改内容

后端

列表接口 GET /api/skills

  • 同时扫描 ~/.agents/skills/~/.claude/skills/
  • 通过 SHA1 内容哈希去重:同名 + 同内容只保留一条(优先选技能数量多的目录),同名 + 不同内容保留两条
  • 返回对象新增 installedSource?: "agents" | "claude" 字段

详情接口 GET/PUT/DELETE /api/skills/:name

  • 新增 ?source=agents|claude 参数,精确定位到哪个路径的技能
  • 使用 YAML front matter 的 name 字段匹配技能,修复"列表能看到但点开 404"的问题
  • 同名不同内容且未指定 source 时返回 409,附带可选 sources 列表
  • PUT / DELETE 同样支持 ?source= 消歧

前端

Skills 列表页

  • SkillItem 类型新增 installedSource 字段
  • Badge 显示 installed:claudeinstalled:agents,明确来源
  • 保存/删除时携带 ?source=,防止误操作同名技能

聊天补全与技能展开

  • 补全项描述追加来源提示(如 (claude)
  • 技能展开时请求 GET /api/skills/:name?source=...,精准读取

冲突处理策略

场景行为
同名 + 同内容去重,保留技能数量多的路径(相等时默认 claude
同名 + 不同内容保留两条,前端通过 installedSource 区分
详情请求同名不同内容且无 source返回 409,要求指定 source

涉及文件

  • src/app/api/skills/route.ts
  • src/app/api/skills/[name]/route.ts
  • src/components/skills/SkillListItem.tsx
  • src/components/skills/SkillsManager.tsx
  • src/components/skills/SkillEditor.tsx
  • src/components/chat/MessageInput.tsx

问题:CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,
导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。
修改内容:
后端:
- 列表接口 (GET /api/skills) 同时扫描 ~/.agents/skills/ 和 ~/.claude/skills/
- 通过 SHA1 内容哈希去重:同名同内容只保留一条,同名不同内容保留两条
- 详情接口 (GET/PUT/DELETE /api/skills/:name) 新增 ?source= 参数精确定位来源
- 详情接口使用 YAML front matter 的 name 字段匹配,修复列表能看到但点开 404 的问题
- 同名不同内容时返回 409,要求前端传 source 消歧
前端:
- SkillItem 类型新增 installedSource 字段
- Badge 显示 installed:claude 或 installed:agents 明确来源
- 保存/删除时携带 ?source= 防止误操作同名技能
- 聊天补全项描述追加来源提示
- 技能展开时精准请求对应来源
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@op7418
op7418 merged commit 336897c into op7418:mainFeb 9, 2026
@gy212
gy212 deleted the fix/read-claude-skills-dir branch March 5, 2026 01:29
op7418 added a commit that referenced this pull request Jun 1, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 #36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
op7418 added a commit that referenced this pull request Jun 1, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 #36(非阻断、defer)。这轮 P0.1
(commit 0106b07)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 #36 已解决,避免留个其实已修的开放债。
op7418 added a commit that referenced this pull request Jun 28, 2026
…pactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,1e143d7)
+ item 1(存量第三方会话渲染 gate,f5d4f15)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 #36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
op7418 added a commit that referenced this pull request Jun 28, 2026
…ed (#632)
Signal — Codex 复审 #632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 #36,与既有 #36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt #36#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 op7418#36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 op7418#36(非阻断、defer)。这轮 P0.1
(commit b748d10)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 op7418#36 已解决,避免留个其实已修的开放债。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…3 定位 autoCompactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,de7b5d4)
+ item 1(存量第三方会话渲染 gate,386b780)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 op7418#36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…ed (op7418#632)
Signal — Codex 复审 op7418#632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 op7418#36,与既有 op7418#36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt op7418#36op7418#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能 - #36

Merged
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir
Feb 9, 2026
Merged

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能#36
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir

Conversation

@gy212

@gy212gy212 commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

关联 Issue: #35

问题

CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。

此外,当两个目录存在同名技能时,之前没有冲突处理机制,可能导致误操作。

修改内容

后端

列表接口 GET /api/skills

  • 同时扫描 ~/.agents/skills/~/.claude/skills/
  • 通过 SHA1 内容哈希去重:同名 + 同内容只保留一条(优先选技能数量多的目录),同名 + 不同内容保留两条
  • 返回对象新增 installedSource?: "agents" | "claude" 字段

详情接口 GET/PUT/DELETE /api/skills/:name

  • 新增 ?source=agents|claude 参数,精确定位到哪个路径的技能
  • 使用 YAML front matter 的 name 字段匹配技能,修复"列表能看到但点开 404"的问题
  • 同名不同内容且未指定 source 时返回 409,附带可选 sources 列表
  • PUT / DELETE 同样支持 ?source= 消歧

前端

Skills 列表页

  • SkillItem 类型新增 installedSource 字段
  • Badge 显示 installed:claudeinstalled:agents,明确来源
  • 保存/删除时携带 ?source=,防止误操作同名技能

聊天补全与技能展开

  • 补全项描述追加来源提示(如 (claude)
  • 技能展开时请求 GET /api/skills/:name?source=...,精准读取

冲突处理策略

场景行为
同名 + 同内容去重,保留技能数量多的路径(相等时默认 claude
同名 + 不同内容保留两条,前端通过 installedSource 区分
详情请求同名不同内容且无 source返回 409,要求指定 source

涉及文件

  • src/app/api/skills/route.ts
  • src/app/api/skills/[name]/route.ts
  • src/components/skills/SkillListItem.tsx
  • src/components/skills/SkillsManager.tsx
  • src/components/skills/SkillEditor.tsx
  • src/components/chat/MessageInput.tsx

问题:CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,
导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。
修改内容:
后端:
- 列表接口 (GET /api/skills) 同时扫描 ~/.agents/skills/ 和 ~/.claude/skills/
- 通过 SHA1 内容哈希去重:同名同内容只保留一条,同名不同内容保留两条
- 详情接口 (GET/PUT/DELETE /api/skills/:name) 新增 ?source= 参数精确定位来源
- 详情接口使用 YAML front matter 的 name 字段匹配,修复列表能看到但点开 404 的问题
- 同名不同内容时返回 409,要求前端传 source 消歧
前端:
- SkillItem 类型新增 installedSource 字段
- Badge 显示 installed:claude 或 installed:agents 明确来源
- 保存/删除时携带 ?source= 防止误操作同名技能
- 聊天补全项描述追加来源提示
- 技能展开时精准请求对应来源
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@op7418
op7418 merged commit 336897c into op7418:mainFeb 9, 2026
@gy212
gy212 deleted the fix/read-claude-skills-dir branch March 5, 2026 01:29
op7418 added a commit that referenced this pull request Jun 1, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 #36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
op7418 added a commit that referenced this pull request Jun 1, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 #36(非阻断、defer)。这轮 P0.1
(commit 0106b07)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 #36 已解决,避免留个其实已修的开放债。
op7418 added a commit that referenced this pull request Jun 28, 2026
…pactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,1e143d7)
+ item 1(存量第三方会话渲染 gate,f5d4f15)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 #36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
op7418 added a commit that referenced this pull request Jun 28, 2026
…ed (#632)
Signal — Codex 复审 #632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 #36,与既有 #36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt #36#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 op7418#36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 op7418#36(非阻断、defer)。这轮 P0.1
(commit b748d10)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 op7418#36 已解决,避免留个其实已修的开放债。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…3 定位 autoCompactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,de7b5d4)
+ item 1(存量第三方会话渲染 gate,386b780)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 op7418#36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…ed (op7418#632)
Signal — Codex 复审 op7418#632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 op7418#36,与既有 op7418#36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt op7418#36op7418#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能 - #36

Merged
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir
Feb 9, 2026
Merged

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能#36
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir

Conversation

@gy212

@gy212gy212 commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

关联 Issue: #35

问题

CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。

此外,当两个目录存在同名技能时,之前没有冲突处理机制,可能导致误操作。

修改内容

后端

列表接口 GET /api/skills

  • 同时扫描 ~/.agents/skills/~/.claude/skills/
  • 通过 SHA1 内容哈希去重:同名 + 同内容只保留一条(优先选技能数量多的目录),同名 + 不同内容保留两条
  • 返回对象新增 installedSource?: "agents" | "claude" 字段

详情接口 GET/PUT/DELETE /api/skills/:name

  • 新增 ?source=agents|claude 参数,精确定位到哪个路径的技能
  • 使用 YAML front matter 的 name 字段匹配技能,修复"列表能看到但点开 404"的问题
  • 同名不同内容且未指定 source 时返回 409,附带可选 sources 列表
  • PUT / DELETE 同样支持 ?source= 消歧

前端

Skills 列表页

  • SkillItem 类型新增 installedSource 字段
  • Badge 显示 installed:claudeinstalled:agents,明确来源
  • 保存/删除时携带 ?source=,防止误操作同名技能

聊天补全与技能展开

  • 补全项描述追加来源提示(如 (claude)
  • 技能展开时请求 GET /api/skills/:name?source=...,精准读取

冲突处理策略

场景行为
同名 + 同内容去重,保留技能数量多的路径(相等时默认 claude
同名 + 不同内容保留两条,前端通过 installedSource 区分
详情请求同名不同内容且无 source返回 409,要求指定 source

涉及文件

  • src/app/api/skills/route.ts
  • src/app/api/skills/[name]/route.ts
  • src/components/skills/SkillListItem.tsx
  • src/components/skills/SkillsManager.tsx
  • src/components/skills/SkillEditor.tsx
  • src/components/chat/MessageInput.tsx

问题:CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,
导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。
修改内容:
后端:
- 列表接口 (GET /api/skills) 同时扫描 ~/.agents/skills/ 和 ~/.claude/skills/
- 通过 SHA1 内容哈希去重:同名同内容只保留一条,同名不同内容保留两条
- 详情接口 (GET/PUT/DELETE /api/skills/:name) 新增 ?source= 参数精确定位来源
- 详情接口使用 YAML front matter 的 name 字段匹配,修复列表能看到但点开 404 的问题
- 同名不同内容时返回 409,要求前端传 source 消歧
前端:
- SkillItem 类型新增 installedSource 字段
- Badge 显示 installed:claude 或 installed:agents 明确来源
- 保存/删除时携带 ?source= 防止误操作同名技能
- 聊天补全项描述追加来源提示
- 技能展开时精准请求对应来源
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@op7418
op7418 merged commit 336897c into op7418:mainFeb 9, 2026
@gy212
gy212 deleted the fix/read-claude-skills-dir branch March 5, 2026 01:29
op7418 added a commit that referenced this pull request Jun 1, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 #36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
op7418 added a commit that referenced this pull request Jun 1, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 #36(非阻断、defer)。这轮 P0.1
(commit 0106b07)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 #36 已解决,避免留个其实已修的开放债。
op7418 added a commit that referenced this pull request Jun 28, 2026
…pactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,1e143d7)
+ item 1(存量第三方会话渲染 gate,f5d4f15)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 #36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
op7418 added a commit that referenced this pull request Jun 28, 2026
…ed (#632)
Signal — Codex 复审 #632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 #36,与既有 #36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt #36#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 op7418#36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 op7418#36(非阻断、defer)。这轮 P0.1
(commit b748d10)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 op7418#36 已解决,避免留个其实已修的开放债。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…3 定位 autoCompactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,de7b5d4)
+ item 1(存量第三方会话渲染 gate,386b780)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 op7418#36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…ed (op7418#632)
Signal — Codex 复审 op7418#632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 op7418#36,与既有 op7418#36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt op7418#36op7418#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能 - #36

Merged
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir
Feb 9, 2026
Merged

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能#36
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir

Conversation

@gy212

@gy212gy212 commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

关联 Issue: #35

问题

CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。

此外,当两个目录存在同名技能时,之前没有冲突处理机制,可能导致误操作。

修改内容

后端

列表接口 GET /api/skills

  • 同时扫描 ~/.agents/skills/~/.claude/skills/
  • 通过 SHA1 内容哈希去重:同名 + 同内容只保留一条(优先选技能数量多的目录),同名 + 不同内容保留两条
  • 返回对象新增 installedSource?: "agents" | "claude" 字段

详情接口 GET/PUT/DELETE /api/skills/:name

  • 新增 ?source=agents|claude 参数,精确定位到哪个路径的技能
  • 使用 YAML front matter 的 name 字段匹配技能,修复"列表能看到但点开 404"的问题
  • 同名不同内容且未指定 source 时返回 409,附带可选 sources 列表
  • PUT / DELETE 同样支持 ?source= 消歧

前端

Skills 列表页

  • SkillItem 类型新增 installedSource 字段
  • Badge 显示 installed:claudeinstalled:agents,明确来源
  • 保存/删除时携带 ?source=,防止误操作同名技能

聊天补全与技能展开

  • 补全项描述追加来源提示(如 (claude)
  • 技能展开时请求 GET /api/skills/:name?source=...,精准读取

冲突处理策略

场景行为
同名 + 同内容去重,保留技能数量多的路径(相等时默认 claude
同名 + 不同内容保留两条,前端通过 installedSource 区分
详情请求同名不同内容且无 source返回 409,要求指定 source

涉及文件

  • src/app/api/skills/route.ts
  • src/app/api/skills/[name]/route.ts
  • src/components/skills/SkillListItem.tsx
  • src/components/skills/SkillsManager.tsx
  • src/components/skills/SkillEditor.tsx
  • src/components/chat/MessageInput.tsx

问题:CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,
导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。
修改内容:
后端:
- 列表接口 (GET /api/skills) 同时扫描 ~/.agents/skills/ 和 ~/.claude/skills/
- 通过 SHA1 内容哈希去重:同名同内容只保留一条,同名不同内容保留两条
- 详情接口 (GET/PUT/DELETE /api/skills/:name) 新增 ?source= 参数精确定位来源
- 详情接口使用 YAML front matter 的 name 字段匹配,修复列表能看到但点开 404 的问题
- 同名不同内容时返回 409,要求前端传 source 消歧
前端:
- SkillItem 类型新增 installedSource 字段
- Badge 显示 installed:claude 或 installed:agents 明确来源
- 保存/删除时携带 ?source= 防止误操作同名技能
- 聊天补全项描述追加来源提示
- 技能展开时精准请求对应来源
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@op7418
op7418 merged commit 336897c into op7418:mainFeb 9, 2026
@gy212
gy212 deleted the fix/read-claude-skills-dir branch March 5, 2026 01:29
op7418 added a commit that referenced this pull request Jun 1, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 #36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
op7418 added a commit that referenced this pull request Jun 1, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 #36(非阻断、defer)。这轮 P0.1
(commit 0106b07)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 #36 已解决,避免留个其实已修的开放债。
op7418 added a commit that referenced this pull request Jun 28, 2026
…pactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,1e143d7)
+ item 1(存量第三方会话渲染 gate,f5d4f15)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 #36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
op7418 added a commit that referenced this pull request Jun 28, 2026
…ed (#632)
Signal — Codex 复审 #632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 #36,与既有 #36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt #36#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 op7418#36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 op7418#36(非阻断、defer)。这轮 P0.1
(commit b748d10)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 op7418#36 已解决,避免留个其实已修的开放债。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…3 定位 autoCompactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,de7b5d4)
+ item 1(存量第三方会话渲染 gate,386b780)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 op7418#36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…ed (op7418#632)
Signal — Codex 复审 op7418#632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 op7418#36,与既有 op7418#36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt op7418#36op7418#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能 - #36

Merged
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir
Feb 9, 2026
Merged

fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能#36
op7418 merged 1 commit into
op7418:mainfrom
gy212:fix/read-claude-skills-dir

Conversation

@gy212

@gy212gy212 commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

关联 Issue: #35

问题

CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。

此外,当两个目录存在同名技能时,之前没有冲突处理机制,可能导致误操作。

修改内容

后端

列表接口 GET /api/skills

  • 同时扫描 ~/.agents/skills/~/.claude/skills/
  • 通过 SHA1 内容哈希去重:同名 + 同内容只保留一条(优先选技能数量多的目录),同名 + 不同内容保留两条
  • 返回对象新增 installedSource?: "agents" | "claude" 字段

详情接口 GET/PUT/DELETE /api/skills/:name

  • 新增 ?source=agents|claude 参数,精确定位到哪个路径的技能
  • 使用 YAML front matter 的 name 字段匹配技能,修复"列表能看到但点开 404"的问题
  • 同名不同内容且未指定 source 时返回 409,附带可选 sources 列表
  • PUT / DELETE 同样支持 ?source= 消歧

前端

Skills 列表页

  • SkillItem 类型新增 installedSource 字段
  • Badge 显示 installed:claudeinstalled:agents,明确来源
  • 保存/删除时携带 ?source=,防止误操作同名技能

聊天补全与技能展开

  • 补全项描述追加来源提示(如 (claude)
  • 技能展开时请求 GET /api/skills/:name?source=...,精准读取

冲突处理策略

场景行为
同名 + 同内容去重,保留技能数量多的路径(相等时默认 claude
同名 + 不同内容保留两条,前端通过 installedSource 区分
详情请求同名不同内容且无 source返回 409,要求指定 source

涉及文件

  • src/app/api/skills/route.ts
  • src/app/api/skills/[name]/route.ts
  • src/components/skills/SkillListItem.tsx
  • src/components/skills/SkillsManager.tsx
  • src/components/skills/SkillEditor.tsx
  • src/components/chat/MessageInput.tsx

问题:CodePilot 只扫描 ~/.agents/skills/,缺失了 ~/.claude/skills/ 路径,
导致用户通过 CLI 安装到该目录的技能无法在 CodePilot 中显示和使用。
修改内容:
后端:
- 列表接口 (GET /api/skills) 同时扫描 ~/.agents/skills/ 和 ~/.claude/skills/
- 通过 SHA1 内容哈希去重:同名同内容只保留一条,同名不同内容保留两条
- 详情接口 (GET/PUT/DELETE /api/skills/:name) 新增 ?source= 参数精确定位来源
- 详情接口使用 YAML front matter 的 name 字段匹配,修复列表能看到但点开 404 的问题
- 同名不同内容时返回 409,要求前端传 source 消歧
前端:
- SkillItem 类型新增 installedSource 字段
- Badge 显示 installed:claude 或 installed:agents 明确来源
- 保存/删除时携带 ?source= 防止误操作同名技能
- 聊天补全项描述追加来源提示
- 技能展开时精准请求对应来源
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@op7418
op7418 merged commit 336897c into op7418:mainFeb 9, 2026
@gy212
gy212 deleted the fix/read-claude-skills-dir branch March 5, 2026 01:29
op7418 added a commit that referenced this pull request Jun 1, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 #36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
op7418 added a commit that referenced this pull request Jun 1, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 #36(非阻断、defer)。这轮 P0.1
(commit 0106b07)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 #36 已解决,避免留个其实已修的开放债。
op7418 added a commit that referenced this pull request Jun 28, 2026
…pactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,1e143d7)
+ item 1(存量第三方会话渲染 gate,f5d4f15)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 #36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
op7418 added a commit that referenced this pull request Jun 28, 2026
…ed (#632)
Signal — Codex 复审 #632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 #36,与既有 #36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt #36#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
fix: 支持读取 ~/.claude/skills/ 目录下的已安装技能
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
Codex review (2026-06-01) 指出本轮代码外的环境层残留:findCodexBinary() PATH
优先、.app fallback 兜底;用户若装回旧 /opt/homebrew/bin/codex(只认四档 effort、
未知配置致命),CodePilot 仍会优先用它。本轮 P0 已让它不再卡 30s,但会快速显示
"应用服务启动失败"且 reason 不够明确。
记为低优先级技术债 op7418#36,附三个修法候选(版本探测明确提示 / PATH 失败回退 .app /
reason 带 binary 路径+版本)。当前用户 homebrew codex 已卸载、.app 0.133 正常,
不破坏主路径,故 defer。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
上一轮把"旧 PATH codex 抢过新 Codex.app"登记为 op7418#36(非阻断、defer)。这轮 P0.1
(commit b748d10)正是修这个:多候选 probe --version 选最高版本,旧 0.45 不再压过
.app 0.135,并打印 selected binary + reason。配合 P0.2/P0.3,装回旧 codex 既不卡 30s
也会被避开。标记 op7418#36 已解决,避免留个其实已修的开放债。
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…3 定位 autoCompactThreshold
- v0.56.x 决策日志加 2026-06-20 条目:P1(env/legacy effective base URL gate,de7b5d4)
+ item 1(存量第三方会话渲染 gate,386b780)落地经过、根因、反例 smoke 与测试;
item 2 前提(provider-catalog.ts:62 配置窗口可信)被源码核实推翻;item 3 已定位
SDK autoCompactThreshold 真实源但需独立接线。
- tech-debt-tracker 新增 op7418#36:item 2 配置窗口最高优先源不成立 —— ProviderModelGroup
的 contextWindow 唯一来源是静态 catalog(route.ts:117/294/306 由 getContextWindow 填),
provider_models 无 context_window 列、presets 未填值;升级为 trusted 会重引假数据。
记录三条待真实源修法,明确禁止把静态 catalog 当配置源。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
youcho2 pushed a commit to youcho2/CodePilot that referenced this pull request Aug 11, 2026
…ed (op7418#632)
Signal — Codex 复审 op7418#632 P1+item1 后给三点:
- [P2] resolveEffectiveAnthropicBaseUrl 在 provider 存在但 hasCredentials=false 时仍优先返回
provider.base_url,与 toClaudeCodeEnv 不一致(该状态两分支都不跑、SDK 只继承 ambient
ANTHROPIC_BASE_URL)。若用户选了无 key 的 DB provider + 环境有第三方 ANTHROPIC_BASE_URL,
gate 可能按错地址误信窗口(同 GLM 同类漏口)。
- [P3] 存量第三方会话首屏可能在 provider models 加载前(undefined→trusted)短暂闪历史 200K。
- [P3] tech-debt 新条目用了 op7418#36,与既有 op7418#36 撞车。
Triage —
- P2:helper 只镜像了 toClaudeCodeEnv 两态(有凭据 provider / 无 provider),漏第三态(有
provider 无凭据):该态 provider 分支 gated on hasCredentials、env 分支 gated on !provider,
两者都不跑 → env 保持 ambient process.env.ANTHROPIC_BASE_URL,provider.base_url 不注入、
settings 不读。
- P3 闪回:undefined 同时表示"加载中"与"非 anthropic 组未标注",前者应 fail-closed。
- P3 编号:tracker 非严格连续,实际最大 42 → 下一个可用 43。
Fix —
- provider-resolver:helper 改三态镜像。`provider && !hasCredentials` → 返回
process.env.ANTHROPIC_BASE_URL(忠实镜像 SDK 继承的 ambient env,不读 provider.base_url /
settings)。doc 写明三态对应关系。
- ChatView:fail-closed —— providerFetchState !== 'loaded' 传 false;loaded 时用 group flag
(found 必有标注;not-found stale provider → ?? true 向后兼容)。第一方代价 = 首屏短暂只显
已用、百分比后补的渐进式诚实显示,绝不闪错数。
- tech-debt op7418#36op7418#43(plan doc / memory 引用同步)。
Verify — npm run test 3387/3387(typecheck clean)。新增 P2 回归 2 例:无凭据 provider 背后
第三方 env → untrust;无凭据 provider + clean env → 不误 untrust。
Guardrail — provider-resolver.test.ts 加 P2 三态行为测试;context-window-trusted.test.ts 的
ChatView pin 更新为锁定 fail-closed 语义(providerFetchState === 'loaded' ? (… ?? true) : false)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@gy212@op7418