Skip to content

fix(slash): 同名スキルの Claude/Codex 版が併存できるようマージ層の重複排除キーを揃える (#1380)#1392

Merged
Kewton merged 1 commit into
developfrom
fix/1380-slash-skill-name-collision
Jul 18, 2026
Merged

fix(slash): 同名スキルの Claude/Codex 版が併存できるようマージ層の重複排除キーを揃える (#1380)#1392
Kewton merged 1 commit into
developfrom
fix/1380-slash-skill-name-collision

Conversation

@Kewton

@Kewton Kewton commented Jul 18, 2026

Copy link
Copy Markdown
Owner

概要

.claude/skills/<name>(Claude, cliTools undefined)と .agents/skills/<name>(Codex, cliTools:['codex'])に同名スキルがあると、Claude Code 選択時にスラッシュ候補へ出ない不具合を修正する。Closes #1380

根本原因

2 つの重複排除層でキーの粒度が食い違っていた。

  • deduplicateByName()(slash-commands.ts): キーは name + cliToolsfix(slash-commands): Codex skills masked when name collides with .claude/commands/*.md (per-CLI dedup) #800)→ Claude 版と Codex 版は共存(正しい)
  • mergeCommandGroups()(command-merger.ts): キーは cmd.name のみ → マージ層で共存が巻き戻り、配列後方の Codex 版が Claude 版を同名で上書き。後段 filterCommandsByCliTool(mergedGroups, 'claude') が残った Codex 版(cliTools:['codex'])を除外 → Claude 選択時に空

対策(案A)

  • 重複排除キー生成 keyOf(name + 正規化 cliTools スコープ、undefined/空は claude sentinel)を command-merger.ts に切り出しdeduplicateByName()mergeCommandGroups() の両方で共有(DRY)
  • 循環 import 回避のため keyOf は command-merger.ts 側に置き、slash-commands.ts から import(既存の依存方向を維持)
  • Claude 版と Codex 版が共存し、SF-1(worktree コマンドが同一 CLI tool scopeの同名 standard を override)も従来どおり保持

受け入れ条件

  • .claude/skills/<name>.agents/skills/<name> が同名でも Claude 選択時に .claude 側が /{name} として残る
  • 同シナリオで Codex 選択時に .agents/skills 側が従来どおり残る
  • SF-1(worktree が同名 standard を override)が非退行
  • mergeCommandGroups() の name 衝突(Claude vs Codex)を検証する回帰テストを追加

変更ファイル

  • src/lib/command-merger.tskeyOf を export、mergeCommandGroupskeyOf キーへ)
  • src/lib/slash-commands.ts(ローカル keyOf を削除し import に)
  • tests/unit/lib/command-merger.test.ts(回帰テスト +5)
  • CHANGELOG.md

品質(worktree で exit code 実測・CI=true)

  • lint: EXIT 0
  • tsc --noEmit: EXIT 0
  • test:unit: EXIT 0(594 files / 10118 tests, Errors なし)
  • build: EXIT 0

🤖 Generated with Claude Code

`.claude/skills/<name>`(Claude, cliTools undefined)と `.agents/skills/<name>`
(Codex, cliTools:['codex'])に同名スキルがあると、Claude Code 選択時に候補へ
出ない不具合を修正する。

原因: `deduplicateByName()` は `name + cliTools` をキーに両版を共存させる(#800)
のに対し、`mergeCommandGroups()` は `cmd.name` のみをキーにしていたため、マージ層で
配列後方の Codex 版が Claude 版を同名で上書きし、後段 `filterCommandsByCliTool(...,
'claude')` で Claude 版が除外され候補が空になっていた。

対策(案A): 重複排除キー生成 `keyOf`(name + 正規化 cliTools スコープ、undefined/
空は claude sentinel)を `command-merger.ts` に切り出し、`deduplicateByName()` と
`mergeCommandGroups()` の両方で共有(DRY)。循環 import を避けるため keyOf は
command-merger.ts 側に置き、slash-commands.ts から import する(既存の依存方向を維持)。
これにより Claude 版と Codex 版が共存し、SF-1(worktree コマンドが同一 CLI tool scope
の同名 standard を override)も従来どおり保たれる。

回帰テスト追加: mergeCommandGroups() で name 衝突する Claude 版と Codex 版が両方残る
こと、同一スコープでは worktree が standard を override すること(SF-1 非退行)、および
keyOf の正規化挙動を検証する。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016KUNKsdsvJnP3bf7c89vU7
@Kewton Kewton added the bug Something isn't working label Jul 18, 2026
@Kewton
Kewton merged commit 7911e30 into develop Jul 18, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant