# CuePaste

CuePasteは、ローカルに保存した定型プロンプトをキーワードで呼び出し、現在の入力欄へ貼り付けるためのmacOSメニューバーアプリです。

## 目的

チャットAIなどで長いプロンプトや定型文を何度も入力する手間を減らすため、プロンプト本文をファイルとして管理し、短いキーワードで呼び出せるようにします。

想定する使い方:

1. `~/Documents/prompts/summarize.md` のようにプロンプトファイルを保存する。
2. CuePasteのコマンド入力画面を開く。
3. `summarize` と入力する。
4. ファイル内容がクリップボードへコピーされ、前面アプリへ貼り付けられる。

## 現在の実装状況

実装済み:

- Swift Package構成
- macOSメニューバーアプリの最小骨格
- コマンド入力パネル
- `exit` コマンドによる入力画面の終了
- Tabキーによるキーワード補完
- 設定画面からのプロンプトフォルダ選択
- 設定画面で入力したキーによる起動ショートカット変更
- グローバルショートカットによるコマンド入力画面の表示
- SettingsからのAbout CuePaste表示
- Settingsからのログ有効化、ログ表示、ログクリア
- 入力画面を英数入力で開き、閉じる時に元の入力ソースへ戻す設定
- `.md` / `.txt` のプロンプトファイル解決
- `.md` を `.txt` より優先する検索
- UTF-8テキストの読み込み
- アクセシビリティ権限確認
- クリップボードコピー
- `Command + V` のキーイベント送信
- GitHub ActionsによるIntel / Apple Silicon macOS向け未署名DMG生成workflow

未実装:

- Developer ID署名と公証

## プロンプトファイル

初期フォルダ:

```text
~/Documents/prompts
```

対応拡張子:

- `.md`
- `.txt`

検索優先順位:

1. `{keyword}.md`
2. `{keyword}.txt`

例:

```text
~/Documents/prompts/summarize.md
```

入力キーワード:

```text
summarize
```

コマンド入力画面では、途中まで入力してTabキーを押すと候補を補完します。`exit` と入力してEnterキーを押すと入力画面を閉じます。

検索と補完の対象は、プロンプトフォルダ直下の `.md` / `.txt` だけです。サブフォルダ内のファイルは対象にしません。

エラー時は入力画面を閉じず、入力内容とエラーメッセージを保持します。

ショートカット変更は、Settings の `Record` を押してから登録したいキーを入力します。Escキーで記録をキャンセルできます。

初期ショートカットは `Command + Option + P` です。

ログはSettingsで有効化できます。ログにはプロンプト本文やクリップボード内容は記録せず、実行イベント、補完候補数、失敗種別だけを記録します。

Settings の `Open command panel in Roman input` を有効にすると、コマンド入力画面を開く時に英数入力へ切り替え、閉じる時に元の入力ソースへ戻します。

## 開発環境

推奨:

- macOS 13以降
- Xcode 16.2
- Swift 5.9以降

テスト:

```sh
swift test
```

アプリの起動:

1. XcodeでこのSwift Packageを開く。
2. `CuePaste` executable targetを選択する。
3. `My Mac`で実行する。

## DMG生成

MVPでは、GitHub ActionsでIntel macOS向けとApple Silicon macOS向けの未署名DMGを作成します。

手動実行:

1. GitHubのリポジトリを開く。
2. `Actions` を開く。
3. `Build macOS DMGs` を選択する。
4. `Run workflow` を実行する。
5. workflow完了後、Artifactsから `CuePaste-macOS-Intel-DMG` または `CuePaste-macOS-AppleSilicon-DMG` をダウンロードする。

タグによるRelease作成:

```sh
git tag v0.1.0
git push origin v0.1.0
```

タグをpushすると、Intel / Apple Silicon向けのDMG、SHA-256ファイル、ソースコードのzip/tar.gzをGitHub Releasesへアップロードします。

Releaseには `.dmg` をそのまま添付します。DMGを開くと `CuePaste.app` と `Applications` が表示されるため、`CuePaste.app` を `Applications` へドラッグしてインストールできます。

未署名DMGのため、初回起動時にmacOSのGatekeeper警告が表示される可能性があります。Developer ID署名と公証はMVP後の対応とします。

## アイコン生成

元画像:

```text
images/cuepaste-icon.png
```

macOS用アイコンを生成:

```sh
python3 scripts/make-macos-icon.py
```

生成物:

```text
Resources/AppIcon.icns
Resources/AppIcon.iconset/
```

GitHub ActionsのDMG生成workflowでは、このアイコン生成も自動で実行します。

## リポジトリ構成

```text
Sources/
  CuePaste/
    CuePasteApp.swift
    AccessibilityPermissionService.swift
    ClipboardService.swift
    PasteService.swift
  CuePasteCore/
    PromptReader.swift
    PromptResolver.swift
Tests/
  CuePasteCoreTests/
docs/
  promptpaste_spec.md
  technical-stack-research.md
  dev-log.md
.github/
  workflows/
    dmg.yml
scripts/
  build-dmg.sh
```

## 設計方針

- KISS / YAGNI / DRYを優先する。
- macOS固有処理と、テストしやすいプロンプト解決ロジックを分ける。
- ファイル検索は再帰走査せず、入力キーワードから候補URLを直接組み立てる。
- ファイル未検出や読み込み失敗時は、クリップボードと前面アプリを変更しない。

詳細な仕様は [docs/promptpaste_spec.md](docs/promptpaste_spec.md) を参照してください。
