{"id":47603574,"url":"https://github.com/nlink-jp/stail","last_synced_at":"2026-04-01T19:00:02.130Z","repository":{"id":345427267,"uuid":"1185842426","full_name":"nlink-jp/stail","owner":"nlink-jp","description":"Read-only Slack CLI — stream and export channel messages like tail -f","archived":false,"fork":false,"pushed_at":"2026-03-27T22:59:35.000Z","size":106,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T00:40:16.876Z","etag":null,"topics":["cli","golang","slack","slack-api","socket-mode","tail"],"latest_commit_sha":null,"homepage":"","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/nlink-jp.png","metadata":{"files":{"readme":"README.ja.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-03-19T01:58:42.000Z","updated_at":"2026-03-27T22:59:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nlink-jp/stail","commit_stats":null,"previous_names":["magifd2/stail","nlink-jp/stail"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/nlink-jp/stail","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nlink-jp%2Fstail","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nlink-jp%2Fstail/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nlink-jp%2Fstail/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nlink-jp%2Fstail/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nlink-jp","download_url":"https://codeload.github.com/nlink-jp/stail/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nlink-jp%2Fstail/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31290999,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["cli","golang","slack","slack-api","socket-mode","tail"],"created_at":"2026-04-01T19:00:00.122Z","updated_at":"2026-04-01T19:00:02.117Z","avatar_url":"https://github.com/nlink-jp.png","language":"Go","readme":"# stail — Slack Tail\n\n`stail` は Slack の読み取り専用コマンドラインツールです。チャンネルのメッセージを\n`tail -f` の感覚でリアルタイムにストリームしたり、チャンネルの全履歴を JSON に\nエクスポートしたりすることができます。\n\n[scat](https://github.com/nlink-jp/scat) の姉妹ツールとして設計されています。\nscat が Slack に**投稿する**ツールであるのに対し、stail は Slack を**読む**ツールです。\n\n---\n\n## 機能\n\n- **リアルタイムストリーミング** — `stail tail -f` で Slack Socket Mode (WebSocket)\n  に接続し、新着メッセージを随時表示します。\n- **過去ログの表示** — `stail tail -n 50` で最新 N 件を表示して終了します。\n- **絶対時刻指定の表示** — `stail tail --since 2024-01-15T10:00:00Z` で指定した時刻以降のメッセージを全件表示します（Slack ts 形式または RFC3339 形式に対応）。\n- **チャンネルエクスポート** — `stail export` でチャンネルの全履歴を scat の\n  export log 形式と互換性のある JSON ファイルとして保存します。\n- **チャンネル一覧** — `stail channel list` でアクセス可能な全チャンネルと\n  その ID を一覧表示します。\n- **プロファイル管理** — トークンやデフォルトチャンネルごとに複数の名前付き\n  プロファイルを管理できます。\n- **サーバモード** — コンテナや CI 環境向けに、環境変数だけで設定を完結させる\n  サーバモードをサポートします。\n- **クロスプラットフォーム** — macOS・Linux・Windows 向けのシングルバイナリを\n  提供します。\n\n---\n\n## インストール\n\n[Releases](https://github.com/nlink-jp/stail/releases) ページから各プラットフォーム\n向けのバイナリをダウンロードしてください。\n\nソースからビルドする場合:\n\n```bash\nmake build\n# バイナリ: ./dist/stail\n```\n\n---\n\n## 初期設定\n\n詳細な手順については **[Slack セットアップガイド](./docs/SLACK_SETUP.ja.md)** を参照してください。\n\n### 1. Slack App の作成\n\nstail には Slack App の 2 種類のトークンが必要です。\n\n| トークン | 必要なコマンド | 形式 |\n|---|---|---|\n| **Bot Token** | 全コマンド | `xoxb-...` |\n| **App-Level Token** | `tail -f`（Socket Mode）| `xapp-...` |\n\n**Bot Token のスコープ**（OAuth \u0026 Permissions）:\n- `channels:history` — パブリックチャンネルのメッセージ読み取り\n- `channels:read` — パブリックチャンネルの一覧取得\n- `groups:history` — プライベートチャンネルのメッセージ読み取り（必要な場合）\n- `groups:read` — プライベートチャンネルの一覧取得（必要な場合）\n- `users:read` — ユーザ表示名の解決\n\n**App-Level Token**（`tail -f` 使用時のみ必要）:\n1. アプリの **Basic Information** ページを開きます。\n2. **App-Level Tokens** セクションで **Generate Token and Scopes** をクリックします。\n3. `connections:write` スコープを追加します。\n4. 生成された `xapp-...` トークンをコピーします。\n\nアプリ設定で **Socket Mode** を有効にしてください。\n\n### 2. 設定ファイルの初期化\n\n```bash\nstail config init\n```\n\n`~/.config/stail/config.json` をパーミッション `0600`（所有者のみ読み書き可）で\n作成します。\n\n### 3. プロファイルの追加\n\n```bash\nstail profile add my-workspace --provider slack --channel \"#general\"\n# Bot Token と App Token の入力を求められます（入力は画面に表示されません）\n```\n\n### 4. アクティブプロファイルの設定\n\n```bash\nstail profile use my-workspace\n```\n\n---\n\n## 使い方\n\n### メッセージの表示 (`tail`)\n\n```bash\n# デフォルトチャンネルの最新 10 件を表示\nstail tail\n\n# 指定チャンネルの最新 50 件を表示\nstail tail -c \"#general\" -n 50\n\n# 絶対時刻以降のメッセージを全件表示（RFC3339 または Slack ts 形式）\nstail tail -c \"#general\" --since 2024-01-15T10:00:00Z\nstail tail -c \"#general\" --since 1742378100.123456\n\n# 指定時刻以降の最新 5 件を表示\nstail tail -c \"#general\" --since 2024-01-15T10:00:00Z -n 5\n\n# フォローモード: リアルタイムで新着メッセージを表示（app_token が必要）\nstail tail -c \"#general\" -f\n\n# フォローモード + JSON 出力（JSONL: 1行1メッセージ）\nstail tail -c \"#general\" -f --format json\n\n# 添付ファイルをディレクトリに保存しながら表示\nstail tail -c \"#general\" -f --save-dir ./downloads\n```\n\nテキストモードでは添付ファイルがあるメッセージにファイル名が表示されます:\n\n```\n2026-03-19 10:44:11  #general  @alice  確認してください [添付: report.pdf]\n2026-03-19 10:44:12  #general  @bob    [添付: photo.png]\n```\n\n### チャンネル履歴のエクスポート (`export`)\n\nチャンネルの全履歴を scat の export log 形式と互換性のある JSON として出力します。\n\n```bash\n# 標準出力へ出力\nstail export -c \"#general\"\n\n# ファイルへ出力\nstail export -c \"#general\" --output archive.json\n\n# 期間を指定してエクスポート（RFC3339 または Slack ts 形式）\nstail export -c \"#general\" \\\n  --start 2025-01-01T00:00:00Z \\\n  --end   2025-02-01T00:00:00Z\n\n# 全添付ファイルも保存\nstail export -c \"#general\" --output archive.json --save-dir ./attachments\n```\n\n\u003e **注意:** `export` はチャンネルの全履歴をメモリに保持してから出力します。\n\u003e 非常に大きなチャンネルをエクスポートする場合は `--start` / `--end` で期間を絞ることを推奨します。\n\u003e どちらのフラグも RFC3339 形式（例: `2025-01-01T00:00:00Z`）と Slack ts 形式（例: `1742378100.000000`）の両方に対応しています。\n\n**エクスポート JSON スキーマ**（scat と互換）:\n\n```json\n{\n  \"export_timestamp\": \"2026-03-19T10:00:00Z\",\n  \"channel_name\": \"#general\",\n  \"messages\": [\n    {\n      \"user_id\": \"U12345ABC\",\n      \"user_name\": \"alice\",\n      \"post_type\": \"user\",\n      \"timestamp\": \"2026-03-19T09:55:00Z\",\n      \"timestamp_unix\": \"1742378100.000000\",\n      \"text\": \"こんにちは！\",\n      \"files\": [],\n      \"thread_timestamp_unix\": \"\",\n      \"is_reply\": false\n    }\n  ]\n}\n```\n\n`post_type` は `\"user\"`（ユーザ投稿）または `\"bot\"`（Bot 投稿）のいずれかです。\n\n### チャンネル一覧 (`channel list`)\n\n```bash\nstail channel list\nstail channel list --json\n```\n\n### プロファイル管理 (`profile`)\n\n```bash\nstail profile list                   # プロファイル一覧\nstail profile use my-workspace       # アクティブプロファイルを変更\nstail profile add staging            # 新規追加（トークンをプロンプトで入力）\nstail profile set channel \"#ops\"     # デフォルトチャンネルを変更\nstail profile set token              # Bot Token を更新（セキュアなプロンプト）\nstail profile set app_token          # App Token を更新（セキュアなプロンプト）\nstail profile remove staging         # プロファイルを削除\n```\n\n### 設定管理 (`config`)\n\n```bash\nstail config init   # デフォルト設定ファイルを作成\n```\n\n### キャッシュ管理 (`cache`)\n\nstail はチャンネル一覧を `~/.config/stail/cache/\u003cprofile\u003e/` に 1 時間キャッシュし、\n毎回の API 呼び出しを省略します。\n\n```bash\nstail cache clear   # アクティブプロファイルのキャッシュを削除\n```\n\n---\n\n## グローバルフラグ\n\n| フラグ | 説明 |\n|---|---|\n| `--config \u003cpath\u003e` | 設定ファイルのパスを指定 |\n| `--profile \u003cname\u003e` / `-p` | このコマンド実行時のみ使用するプロファイルを指定 |\n| `--debug` | デバッグログを有効化 |\n| `--quiet` / `-q` | stderr への案内メッセージを抑制（警告・エラーは引き続き出力） |\n\n---\n\n## サーバモード\n\nコンテナや CI/CD 環境では `STAIL_MODE=server` を設定することで、設定ファイルを\n使わずに環境変数のみで動作させることができます。\n\n| 変数 | 必須 | 説明 |\n|---|---|---|\n| `STAIL_MODE` | yes | `server` に設定 |\n| `STAIL_PROVIDER` | yes | プロバイダ: `slack` |\n| `STAIL_TOKEN` | yes | Bot Token (`xoxb-...`) |\n| `STAIL_APP_TOKEN` | no | App-Level Token（`tail -f` 使用時に必要） |\n| `STAIL_CHANNEL` | no | デフォルトチャンネル |\n| `STAIL_CACHE_DIR` | no | チャンネル一覧のキャッシュディレクトリ（繰り返し実行する場合に推奨） |\n\n```bash\nexport STAIL_MODE=server\nexport STAIL_PROVIDER=slack\nexport STAIL_TOKEN=xoxb-xxxxxxxxxxxx\nexport STAIL_CHANNEL=\"#alerts\"\n\nstail tail -n 20\n```\n\n### Kubernetes の例\n\n```yaml\nenv:\n  - name: STAIL_MODE\n    value: \"server\"\n  - name: STAIL_PROVIDER\n    value: \"slack\"\n  - name: STAIL_CHANNEL\n    value: \"#alerts\"\n  - name: STAIL_TOKEN\n    valueFrom:\n      secretKeyRef:\n        name: slack-credentials\n        key: bot-token\n```\n\n### サーバモードの制限\n\nサーバモードでは以下のコマンドは使用できません:\n\n- `--config` フラグ\n- `--profile` フラグ\n- `profile` サブコマンド群\n- `config init`\n\n---\n\n## ビルド\n\n```bash\n# 現在の OS/Arch 向けにビルド\nmake build\n\n# 全プラットフォーム向けにクロスコンパイル\n# (macOS amd64/arm64, Linux amd64/arm64, Windows amd64)\nmake build-all\n\n# テスト実行\nmake test\n\n# 依存関係の整理\nmake tidy\n```\n\n\u003e **注意（サンドボックスや制限環境）:** デフォルトの Go キャッシュパスに書き込み\n\u003e 権限がない場合は、`GOCACHE` と `GOMODCACHE` を明示的に指定してください:\n\u003e\n\u003e ```bash\n\u003e GOCACHE=/tmp/go-cache GOMODCACHE=/path/to/gopath/pkg/mod make build\n\u003e ```\n\n---\n\n## ライセンス\n\nMIT License — [LICENSE](LICENSE) を参照してください。\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnlink-jp%2Fstail","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnlink-jp%2Fstail","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnlink-jp%2Fstail/lists"}