본문으로 건너뛰기
cccskills
무료GitHub에 공개

dupscan

Swift か Go の repo で、新しいメソッド (ヘルパー・初期化・値を組み立てる関数) を書く前に同じものが既にないかを dupscan index で引き、実装が終わったセルフレビューで dupscan gate を回して増えた写しを寄せる。

関連の実装 (定義・参照・ファイルの中身・呼び出し元) を grep より先に探すときにも使う (def / refs は Swift だけ。callers と index -file は Go も)。

「dupscan」「重複したメソッド」「類似メソッドの統合」「既にあるヘルパーを探して」「セルフレビュー」「定義元」「参照」「呼び出し元」「似た関数」で発火。寄せるときはドメインの境界を確かめる (4 節)。Swift と Go 以外の repo では使わない (対応する言語は Swift と Go)。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

jiikko/dotfiles스타 2(GitHub 2 + cccskills 0)

실행 점수 미검증

설치 방법 보기

포함된 파일(1)

  • SKILL.md7.9 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

dupscan (書く前に引く・セルフレビューで写しを寄せる)

dupscan (実体は dotfiles の bin/dupscan。PATH 上にあるので、どの repo でもそのまま呼べる) は Swift と Go のメソッド (関数・メソッド・クロージャ) を構文木で読む。調べる repo には何も書かない。 詳しい使い方と限界は ~/dotfiles/src/dupscan/README.md、検出の方法は ~/dotfiles/docs/dupscan-detection.md。

1. 書く前に引く (気軽に)

写しが生まれやすいもの (ヘルパー・初期化・値を組み立てる関数・テストの fixture) を書く前に、同じものが既にないかを 1 回引く。 全部の定義の前に引く必要はない。上位 20 件を 1 行ずつ返す (DualNoteApp の 1130 単位で 0.5 秒。初回だけ build に時間がかかる)。

dupscan index -returns StorageLocation        # 作ろうとしている値の型 (戻り値の型の一部)
dupscan index -name location                  # 名前の候補の一部
dupscan index -param-type ConnectionID        # 受け取る型
dupscan index -doc bucket                     # doc comment の語 (最初の行だけ)
dupscan evidence bucket                       # 上で見つからないとき: doc の全文・テスト・ソースの行にある語から、doc の付いた宣言と、その語の行で呼ばれている名前を出す

使えるものがあれば使う (repo が .dupscan.json の shared に書いた共通の置き場所の定義は [shared] と出て先に並ぶ。 他のファイルから使えないものは [private] か [fileprivate]、Go の別の package から使えない小文字の関数は [unexported] と出る。使うなら共通の置き場所へ寄せる)。無ければ書く。

2. 調べもの (grep の前に)

Swift の定義・参照を探すときは grep より先にこちらを使う。構文木から引くので、コメント・文字列・呼び出し側の行が混ざらず、返る量が少ない (LSP の「定義へ移動」「参照を検索」の代わり。Swift の 4 repo の 7 日で grep 2,882 回に対し dupscan 13 回だった。issue 921)。 文字列・コメント・設定ファイルを探すなら grep のほうが向く。Swift の repo でシンボルを grep すると、hook がこの節のコマンドを 1 行案内する。

dupscan def StorageClient                     # 定義を本体つきで (型は宣言とメンバーの一覧: protocol の要件・格納 property・enum の case を含む)
dupscan def StorageClient.upload              # 型を絞る (generic の引数と where 句は外して照合する)。make(x:_:) で引数ラベルも絞れる
dupscan refs StorageClient                    # 参照の一覧 ([型の位置] / [式の位置] と、それを囲む関数)。宣言名・引数名・局所の束縛・ラベルは数えない
dupscan callers 'make(x:_:)'                  # 呼び出しの箇所と、それを囲む関数 (名前だけでも引ける)
dupscan context StorageClient.upload          # 変更の前に: 上の def・refs・callers を 1 回の走査でまとめて (text だけ。参照・呼び出しは名前だけで当てる)
dupscan index -file Sources/Foo.swift         # このファイルに何があるか (outline)

型を解決しないので、同名の別の定義・参照も当たる (近似)。flag は名前・パスの前に書く。 def / refs / context は Swift だけを読む (Go のファイルを読まなかったことは stderr に出る)。Go の定義・参照は LSP (gopls) で引く。 callers と index -file は Go のファイルにも使える (Go に引数ラベルは無いので、callers は名前と引数の数で当てる)。 Claudeの既存grep案内hookは、Goを明示した検索には index -name / callers を案内する。hook自身は解析/buildを起こさず、GoとSwiftの通知間隔を分ける。Codexで同hookが自動発火することは未検証。

3. セルフレビューで gate を回す

実装が終わったら、commit の前に回す。repo が make test や CI に gate を組み込んでいれば同じ判定がそこでも走るので、先に回せば手戻りが減る (組み込んでいない repo では、ここで回すのが唯一の確かめ)。

dupscan gate                    # upstream との merge-base から作業ツリーまでに増えた写し。無ければ 1 行で rc=0
  • rc=1 (違反): 「新しい」に出た単位を、「同じ形」に出た既存の単位へ寄せる (呼び出しに置き換える・共通の置き場所へ移す)。寄せる前に 4 節で境界を確かめる。寄せてからもう一度回す
  • 誤検知・意図して分けている写し: 寄せずに除外を書く。単位の直前に // dupscan:allow <false-positive|intentional> <理由>、 組なら違反の -v に出る「除外の 1 行」に kind と reason を埋めて repo の root の .dupscan.json に貼る。 除外を書いたら、ユーザーへの報告に書く (除外は gate を緩めるので、人の目に届けるのが唯一の歯止め。gate の 1 行目にも「新しく足された除外」と出る)
  • rc=2 (判定不能): base が決まらない (upstream が無い) なら -base origin/master のように渡す
  • 1 つの関数について「同じ形のものがあるか・なぜ同じと判定したか」は dupscan near <file>:<関数名> / dupscan explain <file>:<関数名>

4. 寄せる前に境界を確かめる (ドメインを混ぜない)

dupscan が見るのは本体の形だけで、ドメインの境界は見ない。同じ形でも同じ規則とは限らない。gate の違反を寄せるときも、 report の既存の組をまとめて統合するときも、1 組ずつ次を確かめてから寄せる (ユーザー指示 2026-10-25)。

  • 同じ規則か、偶然同じ形か: 「片方の仕様が変わったら、もう片方も同じく変わるべきか」を問う。yes なら寄せる。 no (provider ごとの規約・層ごとの責務がたまたま同じ書き方になっている) なら寄せず、intentional と理由を書いて除外する
  • 寄せ先はその概念の持ち主に置く: 使う側のどれもが既に依存してよい層・モジュールのうち、その規則を持つ所に置く。 寄せるために、別のドメインの知識 (特定の provider の規約・上の層の型) を共通の層へ持ち込まない。依存の向きを逆にしない
  • 何でも入る置き場所を作らない: Util / Helper / Common のような、ドメインの語で名前の付かない置き場所に寄せない。 寄せた先の型・関数の名前をドメインの語で付けられないなら、境界をまたいでいる兆候として寄せ方を考え直す
  • 寄せない判断も成果。除外の理由には「どのドメインのどの規則が、なぜ別に変わりうるか」を書く (形が違うから、では書かない)

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

audit

무료

プロジェクト監査。「監査して」「audit」「/audit」で発火。設計/UX/品質/テストなどの観点でコードベース全体を監査し、課題をissuesディレクトリに書き出す。実行ログで重複実行を防止。特定の差分・コミットのレビューには使わない(codex-review / cross-review を使う)。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

jiikko/dotfiles22026년 10월 27일 업데이트

AVFoundation (AVPlayer / AVPlayerLayer / AVPlayerItemVideoOutput / AVAsset) の落とし穴・文書化されていない実装挙動・debugging チェックリストを集約した reference skill。Swift / Objective-C で AVPlayer を使った動画再生 / seek / scrub / frame stepping を実装・debug するときに発火。VLCKit ではなく **AVFoundation 系** の問題に特化。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

jiikko/dotfiles22026년 10월 27일 업데이트

c

무료

このセッションで行った変更をコミットする。「コミットして」「commit」「/c」で発火。push はしない/クレデンシャルは混入させない。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

jiikko/dotfiles22026년 10월 27일 업데이트

ディレクトリ・レイヤーごとに置いた CLAUDE.md と README.md が実体 (コード・コマンド・構成) とずれていないかを点検し、裏の取れた乖離だけを直す。引数で対象のディレクトリを任意に指定できる (省略時は repo 全体)。「CLAUDE.md を refresh して」「README が古くないか見て」「claude-md-refresh」「/claude-md-refresh」で発火。issues/ の更新漏れは issue-writeback / issue-sync の担当で、この skill は扱わない。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

jiikko/dotfiles22026년 10월 27일 업데이트

一時領域 (/private/tmp の Claude Code の作業場所・$TMPDIR・dotfiles の tmp/) に溜まったものを bin/tmpclean で数え、消す候補を種類ごとに見せて、ユーザーが承認した plan の古くて使用中でないものだけをゴミ箱へ移す (dotfiles の tmp/ は別の承認を取って make clean-tmp で消す)。「/tmp を掃除して」「一時ファイルを片付けて」「TMPDIR が溜まっていないか見て」「cleanup-tmp-dir」で発火。消す前に必ず承認を取る。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

jiikko/dotfiles22026년 10월 27일 업데이트

Codex が設計・実装を担い、Claude が要件確定・成果物の検証・反復・commit/push を管理する。「codex に書かせて」「codex メインで実装」「codex-drive」で発火。大きめの機能・移植・プロトコル実装向け。余剰トークンを厚く使う運用も選べる。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

jiikko/dotfiles22026년 10월 27일 업데이트

jiikko의 스킬 모두 보기

이 스킬의 문제 신고