{"id":45857960,"url":"https://github.com/kubot64/gog-lite","last_synced_at":"2026-02-27T05:00:56.945Z","repository":{"id":340514257,"uuid":"1166383941","full_name":"kubot64/gog-lite","owner":"kubot64","description":"AI-agent-friendly CLI for Gmail, Calendar, and Docs","archived":false,"fork":false,"pushed_at":"2026-02-25T09:14:17.000Z","size":11566,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-25T12:37:19.231Z","etag":null,"topics":["ai-agent","cli","gmail","golang","google-calendar","google-docs"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kubot64.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-25T06:56:58.000Z","updated_at":"2026-02-25T09:14:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kubot64/gog-lite","commit_stats":null,"previous_names":["kubot64/gog-lite"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/kubot64/gog-lite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubot64%2Fgog-lite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubot64%2Fgog-lite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubot64%2Fgog-lite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubot64%2Fgog-lite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kubot64","download_url":"https://codeload.github.com/kubot64/gog-lite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubot64%2Fgog-lite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29885799,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T23:51:21.483Z","status":"online","status_checked_at":"2026-02-27T02:00:06.759Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","cli","gmail","golang","google-calendar","google-docs"],"created_at":"2026-02-27T05:00:53.655Z","updated_at":"2026-02-27T05:00:56.939Z","avatar_url":"https://github.com/kubot64.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gog-lite\n\nAIエージェントが Gmail / Google Calendar / Google Docs を操作するためのシンプルな CLI。\n\n[gogcli](https://github.com/steipete/gogcli) の多機能さをAIエージェント向けに絞り込んだ派生版。\n\n## 特徴\n\n- **JSON専用出力** — stdout は常にJSON。色・表・TSVなし\n- **ヘッドレス認証** — ブラウザ自動起動なし。URLを出力して2ステップで認証完了\n- **予測可能な終了コード** — `0`=成功 / `1`=エラー / `2`=認証エラー / `3`=未発見 / `4`=権限なし\n- **エラーはstderrにJSON** — `{\"error\": \"...\", \"code\": \"...\"}` 形式。stdoutと混在しない\n- **stdin対応** — `--body-stdin` / `--content-stdin` でパイプ渡し可能\n- **dry-run** — 書き込み系コマンドを `--dry-run`（`-n`）で確認できる\n- **監査ログ** — `--audit-log` で書き込み操作をJSONL記録\n- **出力先制限** — `--allowed-output-dir` でファイル出力先を制限\n\n## インストール\n\n### Homebrew（macOS / Linux）\n\n```bash\nbrew tap kubot64/gog-lite https://github.com/kubot64/gog-lite\nbrew install gog-lite\n```\n\nアップグレード:\n\n```bash\nbrew update\nbrew upgrade gog-lite\n```\n\n### ソースからビルド\n\n```bash\ngit clone https://github.com/kubot64/gog-lite\ncd gog-lite\ngo build -ldflags \"-X main.version=$(git describe --tags --always --dirty)\" -o ~/bin/gog-lite ./cmd/gog-lite/\n```\n\nタグがない開発ブランチでは `--version` は `dev`（または `git describe` の値）になります。\n\n## バージョン運用\n\n- CalVer `vYYYY.MMDD.HHmm`（例: `v2026.0226.1430`）を採用。\n- タグ生成とリリースを分離（Tag Release → Release）。\n- まずタグ生成ワークフローを実行:\n\n```bash\ngh workflow run tag.yml --ref main\n```\n\n- タグ push をトリガーに Release ワークフローが自動実行される。\n- `--version` の値はビルド時の `-ldflags \"-X main.version=...\"` で注入する。\n- ローカルビルドでは `dev` がデフォルト:\n\n```bash\ngo build -ldflags \"-X main.version=$(git describe --tags --always --dirty)\" -o ~/bin/gog-lite ./cmd/gog-lite/\ngog-lite --version\n```\n\n## 開発時のワークフロー検証\n\nGitHub Actions の YAML 構文と workflow 設定を事前に確認できます。\n\n```bash\n./scripts/check-workflows.sh\n./scripts/check-action-refs.sh\n```\n\n`actionlint` をインストール済みの場合は、構文チェックに加えて workflow lint も実行します。\n\n```bash\nbrew install actionlint\n```\n\n## セットアップ\n\n### 1. OAuth クライアント認証情報\n\n[Google Cloud Console](https://console.cloud.google.com/) で以下を行う：\n\n1. プロジェクトを作成（または既存を使用）\n2. 必要なAPIを有効化：Gmail API / Google Calendar API / Google Docs API / Google Drive API\n3. 「Google Auth Platform」→「OAuth 同意画面（Audience）」でアプリ情報を入力\n4. 外部ユーザー（External）でテスト中の場合は「Test users」に利用アカウントを追加\n5. 「認証情報」→「OAuthクライアントID」を作成（種類：**デスクトップアプリ**）\n6. JSONをダウンロードして一時配置（`os.UserConfigDir()` 配下）：\n\n```bash\n# macOS\nmkdir -p \"$HOME/Library/Application Support/gog-lite\"\ncp ~/Downloads/client_secret_*.json \"$HOME/Library/Application Support/gog-lite/credentials.json\"\n\n# Linux\nmkdir -p ~/.config/gog-lite\ncp ~/Downloads/client_secret_*.json ~/.config/gog-lite/credentials.json\n```\n\n7. （macOS推奨）`client_id` / `client_secret` を Keychain へ移す：\n\n```bash\nsecurity add-generic-password -a \"$USER\" -s GOG_LITE_CLIENT_ID -w '\u003cYOUR_CLIENT_ID\u003e' -U\nsecurity add-generic-password -a \"$USER\" -s GOG_LITE_CLIENT_SECRET -w '\u003cYOUR_CLIENT_SECRET\u003e' -U\n```\n\n8. Keychain 登録後は `credentials.json` を削除してよい（環境変数と Keychain を優先参照）：\n\n```bash\n# macOS\nrm \"$HOME/Library/Application Support/gog-lite/credentials.json\"\n\n# Linux\nrm ~/.config/gog-lite/credentials.json\n```\n\n### 2. アカウント認証（2ステップ）\n\n```bash\n# ステップ1: 認証URLを取得\ngog-lite auth login --account you@gmail.com --services gmail,calendar,docs\n# → {\"auth_url\": \"https://accounts.google.com/...\", \"next_step\": \"...\"}\n```\n\nブラウザで `auth_url` を開いて認証する。リダイレクト先のURL（読み込めなくてOK）をコピーして：\n\n\u003e `エラー 403: access_denied` が出る場合は、OAuth 同意画面の Test users に該当 Gmail を追加してください。\n\n```bash\n# ステップ2: リダイレクトURLを渡してトークンを保存\ngog-lite auth login --account you@gmail.com --services gmail,calendar,docs \\\n  --auth-url \"http://127.0.0.1:PORT/oauth2/callback?code=...\"\n# → {\"stored\": true, \"email\": \"you@gmail.com\", \"services\": [...]}\n```\n\n## 使い方\n\n### 認証管理\n\n```bash\ngog-lite auth list                        # 認証済みアカウント一覧\ngog-lite auth remove --account EMAIL      # アカウントのトークンを削除\ngog-lite auth preflight --account EMAIL --require-actions gmail.draft,calendar.create\ngog-lite auth approval-token --account EMAIL --action calendar.delete --ttl 10m\ngog-lite auth emergency-revoke --account EMAIL\n```\n\n### Gmail\n\n```bash\n# 未読メールを検索\ngog-lite gmail search --account you@gmail.com --query \"is:unread\" --max 10\n\n# メール本文を取得\ngog-lite gmail get --account you@gmail.com --message-id MESSAGE_ID\n\n# メールを下書きとして保存（送信はしない）\ngog-lite gmail send --account you@gmail.com \\\n  --to boss@example.com --subject \"週次レポート\" --body \"本文です\"\n\n# パイプで本文を渡す\ncat report.txt | gog-lite gmail send --account you@gmail.com \\\n  --to boss@example.com --subject \"レポート\" --body-stdin\n\n# スレッド取得・ラベル一覧\ngog-lite gmail thread --account you@gmail.com --thread-id THREAD_ID\ngog-lite gmail labels --account you@gmail.com\n```\n\n### Google Calendar\n\n```bash\n# カレンダー一覧\ngog-lite calendar calendars --account you@gmail.com\n\n# 今週のイベントを取得\ngog-lite calendar list --account you@gmail.com \\\n  --from 2026-02-24T00:00:00Z --to 2026-03-02T23:59:59Z\n\n# イベントを作成（--dry-run で確認してから）\ngog-lite --dry-run calendar create --account you@gmail.com \\\n  --title \"チームMTG\" --start 2026-03-01T10:00:00+09:00 --end 2026-03-01T11:00:00+09:00\n\ngog-lite calendar create --account you@gmail.com \\\n  --title \"チームMTG\" --start 2026-03-01T10:00:00+09:00 --end 2026-03-01T11:00:00+09:00\n\n# イベントの更新・削除\ngog-lite calendar update --account you@gmail.com --event-id EVENT_ID --title \"新しいタイトル\"\ngog-lite calendar delete --account you@gmail.com --event-id EVENT_ID --confirm-delete --approval-token TOKEN\n```\n\n\u003e 時刻は RFC3339 形式でタイムゾーン必須：`2026-03-01T10:00:00Z` または `2026-03-01T10:00:00+09:00`\n\n### Google Docs\n\n```bash\n# ドキュメント情報・本文取得\ngog-lite docs info --account you@gmail.com --doc-id DOC_ID\ngog-lite docs cat  --account you@gmail.com --doc-id DOC_ID\n\n# 新規作成\ngog-lite docs create --account you@gmail.com --title \"新しいドキュメント\"\n\n# 内容の書き込み（--replace で全置換）\ngog-lite docs write --account you@gmail.com --doc-id DOC_ID --content \"新しい内容\" --replace --confirm-replace --approval-token TOKEN\n\n# エクスポート\ngog-lite docs export --account you@gmail.com --doc-id DOC_ID --format pdf --output ~/Downloads/doc.pdf --overwrite\n\n# テキスト置換\ngog-lite docs find-replace --account you@gmail.com --doc-id DOC_ID --find \"旧文言\" --replace \"新文言\" --confirm-find-replace --approval-token TOKEN\n```\n\n### Google Sheets\n\n```bash\n# スプレッドシート情報を取得\ngog-lite sheets info --account you@gmail.com --spreadsheet-id SPREADSHEET_ID\n\n# セル範囲の値を取得\ngog-lite sheets get --account you@gmail.com --spreadsheet-id SPREADSHEET_ID \\\n  --range \"Sheet1!A1:C5\"\n\n# セル値を更新（--dry-run で確認してから）\ngog-lite --dry-run sheets update --account you@gmail.com --spreadsheet-id SPREADSHEET_ID \\\n  --range \"Sheet1!A1:B1\" --values '[[\"Alice\",30]]'\n\ngog-lite sheets update --account you@gmail.com --spreadsheet-id SPREADSHEET_ID \\\n  --range \"Sheet1!A1:B1\" --values '[[\"Alice\",30]]'\n\n# 行を末尾に追加（stdin から）\necho '[[\"Bob\",25]]' | gog-lite sheets append --account you@gmail.com \\\n  --spreadsheet-id SPREADSHEET_ID --range Sheet1 --values-stdin\n```\n\n### Google Slides\n\n```bash\n# プレゼンテーション情報を取得\ngog-lite slides info --account you@gmail.com --presentation-id PRESENTATION_ID\n\n# 全スライドのテキストを取得\ngog-lite slides get --account you@gmail.com --presentation-id PRESENTATION_ID\n\n# 特定スライドのテキストを取得\ngog-lite slides get --account you@gmail.com --presentation-id PRESENTATION_ID \\\n  --page-id SLIDE_OBJECT_ID\n\n# テキスト置換（--dry-run で確認してから）\ngog-lite --dry-run slides write --account you@gmail.com --presentation-id PRESENTATION_ID \\\n  --find \"{{NAME}}\" --replace \"Alice\"\n\ngog-lite slides write --account you@gmail.com --presentation-id PRESENTATION_ID \\\n  --find \"{{NAME}}\" --replace \"Alice\" --confirm-write\n```\n\n## 出力例\n\n```bash\n$ gog-lite gmail search --account you@gmail.com --query \"is:unread\" --max 3\n{\n  \"messages\": [\n    {\"id\": \"18c3a1b2c3d4e5f6\", \"thread_id\": \"18c3a1b2c3d4e5f6\"},\n    {\"id\": \"18c3a1b2c3d4e5f5\", \"thread_id\": \"18c3a1b2c3d4e5f5\"}\n  ],\n  \"nextPageToken\": \"\"\n}\n\n$ gog-lite gmail labels --account unknown@gmail.com\n# → stderr:\n{\n  \"error\": \"gmail options: read credentials: credentials.json not found at ...\",\n  \"code\": \"gmail_error\"\n}\n# exit code: 1\n```\n\n## jq との組み合わせ\n\n```bash\n# 未読メールのIDだけ抽出\ngog-lite gmail search --account you@gmail.com --query \"is:unread\" | jq -r '.messages[].id'\n\n# 今日以降のイベントのタイトルと開始時刻\ngog-lite calendar list --account you@gmail.com --from $(date -u +%Y-%m-%dT00:00:00Z) \\\n  | jq '.events[] | {summary, start}'\n\n# ドキュメントのテキストだけ取り出す\ngog-lite docs cat --account you@gmail.com --doc-id DOC_ID | jq -r .content\n```\n\n## ヘッドレス環境（Docker/CI）\n\ncredentials.json のマウントなしで環境変数だけで動かせる：\n\n```bash\nexport GOG_LITE_CLIENT_ID=xxxx.apps.googleusercontent.com\nexport GOG_LITE_CLIENT_SECRET=GOCSPX-xxxx\nexport GOG_LITE_KEYRING_BACKEND=file\nexport GOG_LITE_KEYRING_PASSWORD=your-secure-password\n```\n\n| 変数 | 説明 |\n|---|---|\n| `GOG_LITE_CLIENT_ID` | OAuth クライアント ID |\n| `GOG_LITE_CLIENT_SECRET` | OAuth クライアントシークレット |\n| `GOG_LITE_KEYRING_BACKEND` | `file` でファイルバックエンドを強制 |\n| `GOG_LITE_KEYRING_PASSWORD` | ファイルバックエンドの暗号化パスワード |\n\n`GOG_LITE_CLIENT_ID` と `GOG_LITE_CLIENT_SECRET` の両方が設定されている場合、credentials.json は不要。\nmacOS では上記2値を Keychain に保存しておけば、環境変数未設定でもフォールバックで参照できる。\n`GOG_LITE_KEYRING_BACKEND=file` の場合、`GOG_LITE_KEYRING_PASSWORD` は必須。\n\n## 対応サービスと必要スコープ\n\n| サービス | 有効化が必要なAPI | スコープ |\n|---------|-----------------|---------|\n| `gmail` | Gmail API | `gmail.readonly`, `gmail.compose`（操作に応じて最小権限） |\n| `calendar` | Google Calendar API | `calendar.readonly` / `calendar`（操作に応じて最小権限） |\n| `docs` | Docs API + Drive API | `documents.readonly` / `documents` / `drive.readonly`（操作に応じて最小権限） |\n| `drive` | Google Drive API | `drive.readonly` |\n| `sheets` | Google Sheets API | `spreadsheets.readonly` / `spreadsheets`（操作に応じて最小権限） |\n| `slides` | Google Slides API | `presentations.readonly` / `presentations`（操作に応じて最小権限） |\n\n## Breaking Changes\n\n### gmail send — 送信から下書き保存へ（次期リリース）\n\n`gmail send` コマンドの動作が変わります。\n\n| 項目 | 変更前 | 変更後 |\n|---|---|---|\n| 動作 | メールを即時送信 | Gmail 下書きとして保存 |\n| OAuth スコープ | `gmail.send` | `gmail.compose` |\n| ポリシーアクション | `gmail.send` | `gmail.draft` |\n| 成功時 JSON | `{\"id\":\"...\",\"thread_id\":\"...\",\"sent\":true}` | `{\"draft_id\":\"...\",\"message_id\":\"...\",\"thread_id\":\"...\",\"saved\":true}` |\n| エラーコード | `send_error` | `draft_error` |\n\n**移行手順:**\n\n1. `--require-actions gmail.send` を使用している箇所を `gmail.draft` に変更する\n2. 認証を再実行して `gmail.compose` スコープを付与する（`gog-lite auth login --account EMAIL --force-consent`）\n3. 成功レスポンスの `sent` / `id` フィールド参照を `saved` / `draft_id` / `message_id` に更新する\n4. エラーハンドリングの `send_error` を `draft_error` に更新する\n\n## ドキュメント\n\n| ドキュメント | 対象 | 内容 |\n|---|---|---|\n| [docs/getting-started.md](docs/getting-started.md) | 初めて使う方 | インストール・Google Cloud 設定・初回認証・動作確認 |\n| [AGENTS.md](AGENTS.md) | AI エージェント開発者 | Codex向け最小運用ルール（優先順位・禁止事項・テスト方針） |\n| [docs/agents.md](docs/agents.md) | AI エージェント開発者 | コマンド仕様・エラーコード・ページネーション・stdin 活用（詳細版） |\n| [docs/coding-rules.md](docs/coding-rules.md) | コントリビューター | 実装時の規約・出力契約・テストルール |\n| [docs/review-checklist.md](docs/review-checklist.md) | レビュアー | バグ・回帰・セキュリティ観点のレビュー項目 |\n| [docs/ci-playbook.md](docs/ci-playbook.md) | 開発者 | CI失敗時の切り分けとフレーク対処手順 |\n| [docs/architecture.md](docs/architecture.md) | コントリビューター | パッケージ構成・セキュリティレイヤー・データフロー |\n\n## CI セキュリティテスト方針\n\n| ジョブ | トリガー | 内容 |\n|---|---|---|\n| `unit-fast` | PR / push | `go test ./...` + vet でユニットテストを高速実行 |\n| `integration-cli` | PR / push | 実バイナリを temp HOME で実行し、policy_denied・approval_required・preflight スキーマなどの結合挙動を検証 |\n| `security-nightly` | 毎日 02:00 UTC | 監査ログ改ざん検知・承認トークン再利用・stdin 上限・キーリング設定ミスの回帰テスト |\n\n失敗時は JSON エラー本文を GitHub Actions Artifacts に保存します。\n\n## ライセンス\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkubot64%2Fgog-lite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkubot64%2Fgog-lite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkubot64%2Fgog-lite/lists"}