# Caps Moment

Caps Moment は、Caps Lock をコピー/ペースト用の時間差ジェスチャキーに変える軽量 macOS 常駐アプリ。

目的は、1日に何百回も発生する `Cmd+C / Cmd+V` の身体コストを減らすこと。

このアプリはクリップボード管理アプリではない。
AI連携アプリでもない。
まずは Caps Lock 1キーで Copy / Paste を分岐できる状態を作る。

## Core Gesture

```text
Caps Lock short tap
-> Paste

Caps Lock hold and release
-> Copy
```

初期MVPでは、次の挙動を正とする。

```text
Caps Lock を短く押して離す
-> Cmd+V を送る

Caps Lock を一定時間以上押して離す
-> Cmd+C を送る
```

## Why

通常のコピー/ペーストは以下のように身体負荷が高い。

```text
選択
↓
Cmd+C
↓
移動
↓
Cmd+V
```

Caps Moment では、これを時間差ジェスチャに変える。

```text
Paste:
Caps Lock をポン
-> Cmd+V

Copy:
Caps Lock を押す
↓
テキストを選択
↓
Caps Lock を離す
-> Cmd+C
```

つまり、コピーとペーストを「キーの種類」ではなく「押している時間」で分ける。

## MVP Scope

このMVPで実装するものは以下のみ。

1. メニューバー常駐
2. Dock に表示しない
3. Caps系キーの押下/リリース検知
4. 短押し判定
5. 長押し判定
6. 短押し時に `Cmd+V` を送る
7. 長押しリリース時に `Cmd+C` を送る
8. メニューバーから Quit できる

## Non Goals

MVPでは以下を実装しない。

- クリップボード履歴
- ClipRack 化
- コピー内容の分類
- AI分類
- GPT / Claude / HERMES 連携
- HUD
- 通知
- 音
- アニメーション
- 設定画面
- 複雑なプロファイル切替
- ドラッグ検知
- 選択範囲の直接取得
- Finder連携
- Paste先の自動判定
- ルーティング機能

まずは `Caps short tap = Paste` / `Caps hold = Copy` だけを成立させる。

## Gesture Timing

初期値は以下。

```text
tap threshold: 200ms
hold threshold: 200ms以上
```

判定ルール。

```text
press Caps
release within 200ms
-> Cmd+V

press Caps
hold 200ms or longer
release
-> Cmd+C
```

将来的には設定可能にしてもよいが、MVPでは固定値でよい。

## Key Handling Policy

macOSでは Caps Lock そのものをアプリ側で安定取得しづらい場合がある。

その場合は Karabiner-Elements を使い、Caps Lock を `F18` に変換する。

推奨構成:

```text
Physical Caps Lock
-> Karabiner-Elements
-> F18
-> Caps Moment watches F18
```

つまり、アプリ側では最初から `F18` を監視対象として実装してよい。

この方が実装が安定する。

## Required Permissions

Caps Moment はグローバルキー監視とキー送出を行うため、以下の権限が必要になる可能性が高い。

- Accessibility
- Input Monitoring

初回起動後、macOS の設定から許可する。

```text
System Settings
-> Privacy & Security
-> Accessibility
-> Caps Moment を許可

System Settings
-> Privacy & Security
-> Input Monitoring
-> Caps Moment を許可
```

## Run

```bash
cd "/Users/k/Desktop/GPT/Magic tool/Caps Moment"
swift run
```

## Build

```bash
cd "/Users/k/Desktop/GPT/Magic tool/Caps Moment"
swift build
```
