No.005 / Apps / —
CodeClipper|コードファイルをまとめて分割コピーするiOS・macOSアプリ
ローカルやGitHubからコードを選び、拡張子で絞り込み、まとめて分割し、クリップボードへ順番にコピーする開発者向けアプリ。

Project facts
- Role
- App Development
- Deliverable
- デスクトップアプリ / iOSアプリ / UI/UXデザイン
- Industry
- ソフトウェア開発支援 / 開発者生産性
- Capability
- macOSアプリ開発 / iOSアプリ開発 / Appleプラットフォーム連携 / 外部API連携 / ファイル処理設計 / UI設計 / UX設計
- Technology
- Swift / SwiftUI / iOS / macOS / GitHub REST API / AppKit / UIKit / App Sandbox / NSPasteboard / Keychain Services / Foundation / Uniform Type Identifiers
- Audience
- 複数のコードファイルを一つのテキストとして扱いたい開発者 / 長いコードを入力先の文字数制限に合わせて分割したい利用者 / ローカルとGitHubの双方から対象コードを選びたい開発者
課題
複数のコードファイルを外部ツールへ渡す際は、対象の選別、内容の統合、入力上限に合わせた分割、コピー順の管理が必要になり、対象形式が変わるたびに同じ準備が発生する。
解決策
ローカルまたはGitHubからコードを選び、拡張子プリセットで対象を絞り込み、ファイル名付きのテキストへ統合。ファイル境界を意識した自動パックまたは固定文字数で分割し、iOS・iPadOS・macOSから順番にコピーできる流れへまとめた。
主要機能・工夫
- ローカルファイル・フォルダ取込
ファイル選択やドラッグ&ドロップから対象コードを再帰的に収集する。
- GitHubリポジトリ取込
認証後にリポジトリ、ブランチ、フォルダ、ファイルを選択して内容を取得する。
- 拡張子カテゴリとカスタムプリセット
用途別の拡張子セットと利用者が作成したプリセットを端末内へ保存する。
- ファイル境界付きの自動パック
ファイル名を示す区切りを付け、可能な範囲でファイル単位を保ってまとめる。
- 固定文字数による分割
統合した文字列を利用者が指定した長さごとに分割する。
- 手動・順次自動コピー
分割結果を個別に、または指定間隔でクリップボードへ順番にコピーする。
- コピー進捗とキャンセル
現在位置、コピー済み状態、残り時間、処理中止を画面へ反映する。
- ローカルGit履歴表示
macOSで選択したファイルやフォルダに関係するコミット履歴を確認する。
- 認証情報のKeychain保存
GitHub連携に用いる認証情報の保存、取得、削除を専用サービスへ分離する。
- 日本語・英語表示
文字列カタログとアプリ内設定からシステム、日本語、英語を選択できる構成にする。
成果・変化
- iOS・iPadOS・macOSで共通目的のアプリを構成
プラットフォーム別の操作画面と共通サービスを持つ一つのアプリ構成として実装した。
- ローカルとGitHubの入力経路を統合
ローカル選択とGitHub取込を同じ統合・分割・コピー処理へ接続した。
- 統合から順次コピーまでを一つの操作フローへ集約
入力元、対象形式、分割方法、コピー済み状態を同じアプリ内で扱えるようにした。
- 日本語・英語の表示資産を整備
日本語をソース言語とし、英語の文字列カタログと手動切替を備えた。
複数のコードをまとめ、入力先に合わせて順番にコピー
- プロダクト
- CodeClipper
- カテゴリ
- Developer Utility
- 対応
- iPhone / iPad / Mac
- 入力元
- Local Files / GitHub
- 言語
- 日本語 / English
- 配布
- App Store
ファイル選択から分割コピーまでを一つの作業に
ローカルのファイル・フォルダまたはGitHub上のリポジトリから対象を選び、拡張子で絞り込んだコードをファイル名付きのテキストへまとめます。
まとめた内容は、ファイル境界を可能な範囲で保つ自動パック、または指定文字数ごとの固定分割へ変換し、クリップボードへ順番にコピーできます。
入力上限の前に繰り返される準備作業
複数ファイルの内容を一度に扱いたいときは、必要なファイルだけを選び、どのファイルの内容か分かる形へ結合し、入力先の上限へ収まるように分割する必要があります。
対象言語や入力元が変わるたびに同じ選別を行い、分割したテキストのコピー済み位置も手作業で管理することが、準備時間と操作ミスにつながります。
選ぶ、絞る、まとめる、分ける、コピーする
- ローカルまたはGitHubから入力元を選択
- 拡張子カテゴリまたはカスタムプリセットで対象を絞り込み
- ファイル名を示す区切りとともに内容を統合
- 自動パックまたは固定文字数で分割
- 分割結果を確認し、手動または指定間隔で順番にコピー
- 進捗、コピー済み状態、残り時間を確認し、必要に応じて中止
ローカルとGitHubを同じ処理へ接続
端末上のファイル・フォルダはシステムのファイル選択を入口にし、macOSではドラッグ&ドロップにも対応します。フォルダ内は再帰的に列挙し、選択条件へ合うファイルを収集します。
GitHub連携では、認証後にリポジトリ、ブランチ、ツリー、フォルダ、ファイルを選択し、取得した内容をローカル入力と同じ統合・分割処理へ渡します。
拡張子カテゴリとカスタムプリセット
主要な開発用途ごとに拡張子をまとめたカテゴリを用意し、利用者は必要な形式だけを選択できます。
繰り返し使う拡張子の組み合わせはカスタムプリセットとして端末内に保存し、案件や入力先に合わせた選別条件を再利用できます。プラットフォームごとのファイル選択仕様には差があるため、同一形式の完全な選択保証とは表現していません。
ファイル境界を意識する自動パックと固定文字数分割
自動パックは、可能な範囲で一つのファイルを同じまとまりに保ちながら上限へ収めます。どの内容がどのファイルに由来するか追えるよう、ファイル名を示す区切りも加えます。
固定文字数モードは、ファイル内容を一つの文字列へまとめてから指定長で分割します。iOSの自動パックでは単一ファイル自体が設定上限を超える場合に上限内を保証しない実装経路があるため、厳密なサイズ保証とは表現していません。
手動コピーと指定間隔の順次コピー
分割結果は一件ずつ確認してコピーでき、指定した間隔で次のまとまりをクリップボードへ送る操作も用意しています。
現在位置、コピー済み状態、進捗、残り時間を画面へ反映し、進行中の操作はキャンセルできます。入力先への貼り付け自体は利用者が管理する設計です。
共通目的をiPhone、iPad、Macの操作へ調整
一つのXcodeプロジェクトでiOS・iPadOS・macOS向けアプリを構成し、共通サービスとプラットフォーム別の画面・システム連携を組み合わせています。
iOS・iPadOSではシステムのファイルピッカーとクリップボードを、macOSではファイル選択、ドラッグ&ドロップ、クリップボード、ローカルGit履歴を各フレームワークへ接続しています。
GitHub認証と取得処理を分離
GitHub連携に用いるPersonal Access Tokenは専用の認証サービスを通じてKeychainへ保存、取得、削除します。認証情報、リポジトリ名、ローカルパスは公開コンテンツに含めません。
GitHub APIとの通信はリポジトリ一覧、ブランチ、ツリー、ファイル内容、コミット情報の取得責務へ分けています。非公開リポジトリを含む全条件での動作や権限範囲は今回の調査で実行確認していません。
長い処理の状態、キャンセル、失敗理由を画面へ
ファイル探索、GitHub取得、統合、分割、順次コピーでは、処理中か完了済みかを状態として管理し、進捗表示とキャンセル操作へ接続します。
選択取消、読み込み失敗、認証失敗、通信失敗、対象ファイルなしなどの条件をエラーとして扱います。大規模入力時の処理時間やメモリ使用量は計測していないため、性能値や安定動作は成果として登録していません。
外部サービスと端末内データの境界
外部通信を伴う主な機能はGitHub API連携です。アプリには広告配信SDKの構成も確認できますが、広告ユニット識別子などの設定値はSanityへ登録しません。
拡張子プリセット、言語設定、コピー条件などは端末側の設定として扱います。取得途中の一時データが全経路で確実に削除されるかは未検証のため、保存期間に関する保証は記載していません。
日本語と英語の表示資産
日本語と英語の文字列資産を備え、アプリ内設定からシステム設定、日本語、英語を選択できる構成です。
ファイル選択、分割、コピー、GitHub認証、進捗、エラーなど、主要な操作に関係する表示文言を両言語で管理しています。
画面、ファイル処理、外部通信、認証を分ける
SwiftUIの画面と状態管理に加え、ファイル探索・読み込み、文字列の統合・分割、クリップボード、GitHub通信、Keychain、ローカルGit履歴をそれぞれの責務へ分離しています。
アプリ、ユニットテスト、UIテストのターゲットは存在しますが、テスト内容にはテンプレートに近い箇所が残り、今回の調査では現行環境でのビルド・テスト成功を確認していません。Live Activity関連のソースもありますが、Widget Extensionへの接続が確認できないため公開機能として扱いません。
確認できた実装と、今後検証すべき条件を分離
各ファイルはUTF-8のSwift Stringとして全内容を読み込み、固定文字数モードでは統合後の文字列も保持します。そのため、ストリーミング処理やメモリ使用量の最適化を実装成果としては記載していません。
大規模入力時の性能、単一巨大ファイルの上限処理、プラットフォーム間の選択対象差、非公開GitHubリポジトリ、テスト実行、一時データの後処理は、公開上の保証ではなく今後の検証・改善対象として整理しています。利用者数、処理件数、時間短縮率などの定量実績も確認できていないため登録していません。
