{"id":50989668,"url":"https://github.com/abhi-singhs/copilot-token-meter","last_synced_at":"2026-06-20T00:31:13.374Z","repository":{"id":359576178,"uuid":"1244641720","full_name":"abhi-singhs/copilot-token-meter","owner":"abhi-singhs","description":"Live token \u0026 cost meter for GitHub Copilot CLI — title-bar footer, /tokens slash command, and copilot-tokens companion CLI.","archived":false,"fork":false,"pushed_at":"2026-05-22T13:53:24.000Z","size":126,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-22T18:47:33.723Z","etag":null,"topics":["cli","copilot","copilot-cli","copilot-plugin","nodejs","observability","statusline","tokens"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/abhi-singhs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","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":null,"dco":null,"cla":null}},"created_at":"2026-05-20T13:06:32.000Z","updated_at":"2026-05-22T13:53:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/abhi-singhs/copilot-token-meter","commit_stats":null,"previous_names":["abhi-singhs/copilot-token-meter"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/abhi-singhs/copilot-token-meter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abhi-singhs%2Fcopilot-token-meter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abhi-singhs%2Fcopilot-token-meter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abhi-singhs%2Fcopilot-token-meter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abhi-singhs%2Fcopilot-token-meter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abhi-singhs","download_url":"https://codeload.github.com/abhi-singhs/copilot-token-meter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abhi-singhs%2Fcopilot-token-meter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34553456,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"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":["cli","copilot","copilot-cli","copilot-plugin","nodejs","observability","statusline","tokens"],"created_at":"2026-06-20T00:31:12.814Z","updated_at":"2026-06-20T00:31:13.364Z","avatar_url":"https://github.com/abhi-singhs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# copilot-token-meter\n\n\u003e [!WARNING]\n\u003e **This project is archived.** Live token / cache metering is now natively supported by the GitHub Copilot CLI (built-in footer, `statusLine.command`, and quota display), so this plugin is no longer maintained. The repository remains available for reference.\n\n\u003e Live token meter for **GitHub Copilot CLI**. Shows input / output / cache tokens and agent activity for every prompt — in your terminal title bar, in a live dashboard, and via a `/tokens` slash command.\n\n## What you get\n\n| Surface | How |\n|---|---|\n| **Always-visible \"footer\"** | The plugin hooks `sessionStart`, `userPromptSubmitted`, `postToolUse`, and `agentStop` and writes a one-line summary to your terminal title bar via OSC 2. Works in iTerm2, Kitty, Alacritty, WezTerm, Terminal.app, gnome-terminal, Windows Terminal. |\n| **Copilot CLI custom status line** | A `copilot-tokens statusline` subcommand renders a colourised one-liner that drops straight into Copilot CLI 1.0.52+'s `statusLine.command` slot (the `custom` row in `/footer` → *Configure Status Line*). Reads the Copilot stdin payload + the plugin's cached state, so the row stays in sync with the rest of the footer. |\n| **`/tokens` slash command** | Inside Copilot CLI, type `/tokens` for a multi-line breakdown — per-model, per-turn, with quota. |\n| **`copilot-tokens` CLI** | Companion CLI with `status`, `summary`, `watch`, `top`, `json`, `recompute`, `statusline`, `statusline-command` subcommands for use in a second pane / tmux / CI. |\n| **Status JSON for other tools** | `~/.copilot/state/token-meter/latest.json` is rewritten on every hook tick — point your tmux status bar, polybar, iTerm status, or VS Code status item at it. |\n\n## Why a plugin (and not the built-in footer)?\n\nCopilot CLI's built-in footer (`settings.json` → `footer`) only supports a fixed set of toggles (`showModelEffort`, `showDirectory`, `showBranch`, `showContextWindow`, `showQuota`, …). The newer `custom` row (Copilot CLI 1.0.52+) lets you point at a `statusLine.command`, but stops there: it doesn't aggregate, repair, or attribute tokens for you.\n\nThis plugin layers two surfaces on top of that:\n\n- An OSC 2 terminal-title-bar writer driven by lifecycle hooks (always visible above the prompt, no Copilot CLI version required).\n- A `copilot-tokens statusline` subcommand built to be the `statusLine.command` target — it does the aggregation, the input-tokens-zero repair, and the per-tool attribution itself, and renders a compact, colourised one-liner.\n\nBoth surfaces share the same data pipeline, which piggy-backs on four stable contracts the CLI already exposes:\n\n1. **Plugin lifecycle hooks** (`sessionStart`, `userPromptSubmitted`, `postToolUse`, `agentStop`).\n2. **`events.jsonl`** in `~/.copilot/session-state/\u003csessionId\u003e/` — typed against `schemas/session-events.schema.json` — for turn / tool / message / model activity and the `assistant.message.outputTokens` field.\n3. **Process telemetry log** at `~/.copilot/logs/process-*.log` — the CLI writes one debug log per process containing `[Telemetry] cli.telemetry:` JSON blocks. Each `kind: \"assistant_usage\"` block carries the full token / cache breakdown (`input_tokens`, `output_tokens`, `cache_read_tokens`, `cache_write_tokens`, `reasoning_tokens`, `duration`, `ttft_ms`) and is joined back to the originating turn via `provider_call_id` ↔ `assistant.message.requestId`. Each `kind: \"copilot_user_info\"` block carries a live quota snapshot.\n4. **Raw HTTP response bodies** logged in the same process log under `[DEBUG] data: { ... \"usage\": { \"prompt_tokens\", \"completion_tokens\", \"prompt_tokens_details\": { \"cached_tokens\", \"cache_creation_tokens\" } } }`. These are matched to telemetry records by `id` ↔ `api_call_id` and used to *repair* the `input_tokens: 0` that current Copilot CLI builds always report when prompt caching is in play (the truthful uncached input is `prompt_tokens - cached_tokens - cache_creation_tokens`).\n\nThe hook script merges the two sources, aggregates totals, and writes an OSC 2 title-bar escape to `/dev/tty` so you get a true always-visible footer above your shell prompt.\n\n\u003e Telemetry-log parsing is incremental: per-`(session, log)` byte offsets are cached in `~/.copilot/state/token-meter/telemetry-cache.json`, so only the new tail of each log is read on every hook tick. Event IDs are deduped so the same usage event isn't billed twice when multiple processes touch the same session.\n\n## Install\n\nThe plugin is a self-contained directory you can install into Copilot CLI with `copilot plugin install`.\n\n```bash\n# From the GitHub marketplace (recommended):\ncopilot plugin install abhi-singhs/copilot-token-meter\n\n# Or from a local checkout (handy while developing the plugin itself):\ncopilot plugin install /path/to/copilot-token-meter\n```\n\nThe marketplace install snapshots the plugin into Copilot CLI's plugin cache and\nregisters it in `~/.copilot/config.json`. Local installs additionally record the\nsource path so `copilot plugin update \u003cname\u003e` can re-snapshot after edits.\n\nAfter editing files in a local checkout, refresh the snapshot:\n\n```bash\ncopilot plugin update copilot-token-meter\n```\n\nTo uninstall:\n\n```bash\ncopilot plugin uninstall copilot-token-meter\n```\n\n\u003e **Important:** Plugins are loaded once per `copilot` session. Restart the\n\u003e CLI after install / update for hooks to take effect.\n\nAdd the `bin/` directory to your `$PATH` (optional — only needed to call\n`copilot-tokens` directly from your shell):\n\n```bash\nexport PATH=\"/path/to/copilot-token-meter/bin:$PATH\"\n```\n\nThe plugin uses only Node's built-in modules — no `npm install` needed for runtime use. (`npm test` is supported for the test suite.)\n\n### Recommended companion settings\n\nIn `~/.copilot/settings.json`:\n\n```json\n{\n  \"footer\": {\n    \"showContextWindow\": true,\n    \"showQuota\": true\n  }\n}\n```\n\nThese are built-in items that give you complementary signal (context-window % full and remaining premium-request quota) alongside the token-meter's title-bar.\n\n## Usage\n\n### Inside Copilot CLI\n\n```\n\u003e /tokens\n```\n\nThe skill runs `copilot-tokens summary` and replies with the formatted breakdown.\n\n### From a shell\n\n```bash\ncopilot-tokens                       # one-line summary\ncopilot-tokens summary               # detailed multi-line breakdown\ncopilot-tokens watch                 # live dashboard, refreshes every 1s\ncopilot-tokens top                   # top sessions by total tokens, all time\ncopilot-tokens top --limit 5         # only show the top 5\ncopilot-tokens top --since 7d        # only sessions active in the last 7 days\ncopilot-tokens json                  # raw status JSON (for scripting)\ncopilot-tokens recompute             # force re-scan of the current session\ncopilot-tokens statusline            # render Copilot CLI's custom status line\n                                     # (consumes Copilot payload JSON on stdin)\ncopilot-tokens statusline-command    # print the path string to paste into\n                                     # ~/.copilot/config.json statusLine.command\ncopilot-tokens --plain summary       # no ANSI colour (also honours NO_COLOR=1)\n```\n\nDrop-in status-bar configs for tmux, polybar, iTerm2, and WezTerm live in [`examples/`](./examples/).\n\n### From tmux\n\n```tmux\nset -g status-right '#(cat ~/.copilot/state/token-meter/latest.json 2\u003e/dev/null | jq -r .title) | %H:%M'\n```\n\nSee [`examples/tmux.conf`](./examples/tmux.conf) for a fuller version that also surfaces context-window utilisation.\n\n### As Copilot CLI's custom status line\n\nCopilot CLI 1.0.52+ ships a built-in *Configure Status Line* menu (open it with `/footer`) that includes a `custom` row sourced from a `statusLine.command` you configure. When enabled, Copilot spawns the command on every state change, pipes its session JSON to it on stdin, and renders the command's stdout as a footer row beneath the built-in items.\n\nThe plugin exposes a `copilot-tokens statusline` subcommand purpose-built for this contract. It reads Copilot's stdin payload, joins it with the plugin's cached telemetry, and prints a single ANSI-coloured line like:\n\n```\n↑12.3k ↓45.6k ⟳88.0k ⊕5.1k 🧠1.2k · 📦42% · 7t/23🔧\n```\n\nTo wire it up:\n\n1. Get the absolute command path:\n\n   ```bash\n   copilot-tokens statusline-command\n   # → \"/Users/you/.copilot/installed-plugins/_direct/abhi-singhs--copilot-token-meter/bin/copilot-tokens statusline\"\n   ```\n\n2. Add it to `~/.copilot/config.json`:\n\n   ```json\n   {\n     \"statusLine\": {\n       \"type\": \"command\",\n       \"command\": \"/absolute/path/to/copilot-tokens statusline\",\n       \"padding\": 0\n     }\n   }\n   ```\n\n   (See [`examples/copilot-statusline.md`](./examples/copilot-statusline.md) for a ready-to-merge snippet and full walkthrough.)\n\n3. Open the Copilot CLI configurator with `/footer`, scroll to `custom`, and press `enter` to toggle it on. Save with `esc`.\n\nThe command is fail-safe: any error (missing cache, malformed payload, unreadable state file) is swallowed and the row renders empty rather than breaking Copilot's UI. Honours `NO_COLOR=1` and `--plain` / `--no-color` for terminals that don't render ANSI in the footer.\n\n\u003e **Why both this and the terminal title bar?** The title bar is always visible above your shell prompt and works in any terminal that honours OSC 2; the custom status line lives inside Copilot CLI's footer so it sits next to `directory`, `branch`, `effort`, `context-used`, and `quota`. Pick whichever surface fits your workflow — running both is fine and incurs no extra cost.\n\n### From iTerm2 / WezTerm status bar\n\nRead `~/.copilot/state/token-meter/latest.json` and render the `.title` field. See [`examples/iterm2-wezterm.md`](./examples/iterm2-wezterm.md) for the exact iTerm2 Script status-bar component and a WezTerm `update-right-status` Lua snippet.\n\n### From polybar\n\nSee [`examples/polybar.ini`](./examples/polybar.ini) for a `custom/script` module that mirrors the title bar.\n\n## Title bar format\n\n```\ncopilot[opus-4.7-1m] ↑12.3k ↓4.2k ⟳88.0k ⊕5.1k 🧠1.2k 7t/23🔧\n```\n\n| Symbol | Meaning |\n|---|---|\n| `↑` | input tokens (new prompt tokens sent to the model) |\n| `↓` | output tokens (model's reply tokens) |\n| `⟳` | cache **read** tokens (reused prefix from prompt cache) |\n| `⊕` | cache **write** tokens (new prefix written to prompt cache) |\n| `🧠` | reasoning tokens (shown only when \u003e 0; OpenAI reasoning models, etc.) |\n| `Nt/M🔧` | turns / tool calls |\n\nThe `summary` view additionally shows:\n\n- **Context-window utilization** as a bar + percentage, computed against the most recent API call's prompt size (cache_read + cache_write + input) so it reflects what the model actually saw.\n- **Burn rate** — tokens/min over the last 5 / 30 minutes and an ETA to context-window exhaustion at the current rate (when telemetry is producing fresh data).\n- **Per-tool attribution** — `By tool` section showing which tools (`bash`, `view`, `edit`, …) burned the most input/cache tokens, with proportional `1/N` splitting across batched tool calls.\n- **Sub-agent rollup** — when sub-agents (the `task` tool) make their own API calls, the `Sub-agents` section surfaces their token usage separately, while still folding it into the parent `task` tool entry.\n- Prompt-tokens (= input + cache_read + cache_write — what actually crossed the wire), total billed tokens (Anthropic-style formula), cumulative API duration, and a live `Quota` block sourced from `copilot_user_info` telemetry events.\n\n## State files\n\n| Path | Purpose |\n|---|---|\n| `~/.copilot/state/token-meter/latest.json` | Snapshot of the most recently updated session. |\n| `~/.copilot/state/token-meter/\u003csessionId\u003e.json` | Per-session snapshot. |\n| `~/.copilot/state/token-meter/history-\u003csessionId\u003e.jsonl` | Rolling burn-rate history (capped). |\n| `~/.copilot/state/token-meter/current` | Plain-text file containing the current session ID. |\n| `~/.copilot/state/token-meter/telemetry-cache.json` | Per-`(session, log)` byte offsets + de-duped `event_id` set + apiResponse cache for incremental telemetry parsing. |\n| `~/.copilot/state/token-meter/telemetry-cache.lock` | Transient advisory lockfile (held only briefly during cache writes). |\n| `~/.copilot/state/token-meter/models.json` | **Optional** user override for per-model context-window sizes. |\n| `~/.copilot/state/token-meter/hooks.log` | One-line trace per hook invocation (handy for debugging that hooks fire at all). |\n| `~/.copilot/state/token-meter/errors.log` | Hook error log (rotated by `logrotate` etc.). |\n\n## Configuration\n\n| Env var | Effect |\n|---|---|\n| `COPILOT_HOME` | Override the `~/.copilot` location (used in tests / CI). |\n| `COPILOT_TOKENMETER_RESET_ON_STOP=1` | Clear the terminal title bar when the agent stops, instead of leaving the final stats lingering. |\n| `NO_TITLE=1` / `TERM=dumb` | Suppress the OSC 2 title-bar writes entirely. |\n| `NO_COLOR=1` | Disable ANSI colour in `copilot-tokens` output (per [no-color.org](https://no-color.org)). Equivalent to passing `--plain` / `--no-color`. |\n\n### Custom model metadata\n\nDrop a `models.json` at `~/.copilot/state/token-meter/models.json` to add or override context-window sizes for new or custom models. Entries with `match` prefixes earlier in the list win; longest match wins among matches with the same name.\n\n```json\n{\n  \"models\": [\n    { \"match\": [\"my-byok-model\"], \"contextWindow\": 200000 }\n  ]\n}\n```\n\nAfter editing `models.json`, delete `~/.copilot/state/token-meter/telemetry-cache.json` so the next hook tick re-resolves model metadata.\n\n## Troubleshooting\n\n### The title bar never updates\n\n1. Check `~/.copilot/state/token-meter/hooks.log` — each hook invocation appends a single line. If it's empty, the hooks aren't firing.\n2. **Restart Copilot CLI** after `copilot plugin install` or `copilot plugin update`. Hooks are loaded once per session.\n3. Confirm your terminal honours OSC 2 (`printf '\\e]2;hello\\a'` should set the title). The plugin no-ops on `TERM=dumb` and when `NO_TITLE=1` is set.\n4. On macOS, Terminal.app's \"Tab\" title and \"Window\" title are separate; OSC 2 sets the window title.\n5. If you're running inside `tmux`, tmux owns the outer title — use `set -g set-titles on` and `set -g set-titles-string '#{pane_title}'` to pass the pane title through.\n\n### All numbers show 0\n\n1. Telemetry logs lag the first few prompts. Run a couple of `/help` or a quick prompt, then re-check.\n2. Confirm process logs exist and are recent: `ls -lt ~/.copilot/logs/process-*.log | head`. The plugin only reads logs newer than 14 days.\n3. Force a re-scan: `copilot-tokens recompute`.\n\n### The `input` column reads 0 even though I've sent a long prompt\n\nThis is the known `input_tokens: 0` bug in current Copilot CLI builds when prompt caching is active. The plugin repairs it by joining each telemetry record to the matching raw `[DEBUG] data: { ... usage: { prompt_tokens, prompt_tokens_details } }` block via `api_call_id`. The repair only kicks in **after** the raw response is logged — usually one tick later. If it persists across multiple turns, your CLI build may be omitting the `[DEBUG] data:` blocks; check that `~/.copilot/logs/process-*.log` actually contains them.\n\n### My custom `models.json` isn't picked up\n\nPricing/context-window data is read lazily and cached for the lifetime of each hook process. Edit-then-restart-CLI is enough. If you're running `copilot-tokens` from a long-running watcher, kill and restart it. As a stronger reset, also delete `~/.copilot/state/token-meter/telemetry-cache.json`.\n\n### Hook errors\n\nCheck `~/.copilot/state/token-meter/errors.log`. The hook script is wrapped so any error is logged there and the process exits 0 — a hook failure never blocks Copilot CLI. If you see repeated errors, please file an issue with the relevant log excerpt and your Copilot CLI version.\n\n### Hooks running (or erroring) under VS Code or another non-CLI host\n\nThe hooks are meant for Copilot CLI only. As of 0.2.2, every hook in `hooks.json` gates on `$COPILOT_PLUGIN_ROOT` (set by Copilot CLI 1.0.56+) and immediately exits without doing anything when that variable is unset — so the meter never fires under VS Code's Copilot chat agent or any other host. This also fixes the older `MODULE_NOT_FOUND` crash, where a non-CLI host ran the hook with cwd = workspace folder and Node couldn't resolve `./bin/token-meter.js`. If you're on an older `hooks.json`, run `copilot plugin update copilot-token-meter` (or re-install) to pick up the new gating.\n\n### `copilot-tokens` colours are mangled in tmux / less / scripts\n\nPass `--plain` (or `--no-color`), or set `NO_COLOR=1` in the environment. The context-window bar falls back to a plain-ASCII `[##  ]` indicator.\n\n## How accurate are the numbers?\n\n- **Output tokens \u0026 activity** (turns, tool calls, message counts, model) come from `events.jsonl`, which is the same record the CLI's own UI reads from. These are always present.\n- **Input / cache_read / cache_write / reasoning / duration** come from `[Telemetry] cli.telemetry:` `assistant_usage` blocks in `~/.copilot/logs/process-*.log`. The plugin joins each usage block to the originating turn via `provider_call_id` ↔ `assistant.message.requestId`. These match exactly what the CLI reports to its quota service.\n- **Input-tokens repair**: current Copilot CLI builds always emit `input_tokens: 0` when prompt caching is active. The truthful value is derived from the matching raw HTTP response body (`[DEBUG] data: { id, usage:{ prompt_tokens, prompt_tokens_details:{...} } }`) using `prompt_tokens − cached_tokens − cache_creation_tokens`, joined by `data.id` == telemetry `api_call_id`. Without this repair the `input` column reads 0 even when there's real uncached content.\n- **Per-tool attribution** is approximate: each batched tool call gets a `1/N` share of the *next* API call's prompt-fold tokens (input + cache_read + cache_write). For single-tool turns the attribution is exact; for batches of N tools it splits evenly.\n- **Sub-agent attribution**: sub-agent telemetry records carry `initiator: \"sub-agent\"` and `parent_tool_call_id`. We attribute their tokens to the parent tool (typically `task`) and also surface a separate Sub-agents section.\n- **Reasoning tokens** are surfaced separately when the provider reports them (OpenAI o-series / gpt-5 reasoning models). Anthropic does not split reasoning out from output tokens, so `🧠` typically reads 0 on Claude models — the reasoning is already inside `↓`.\n- **Billed tokens** (in `summary` view) is computed as `input + output + cache_write + cache_read/10`, matching Anthropic's published billing formula. If you're on GitHub-managed routing or a BYOK provider, the actual billing rule may differ — treat this as an upper-bound estimate.\n- **Quota** (premium interactions / chat / completions remaining) is pulled from `copilot_user_info` telemetry blocks emitted by the CLI itself, so it tracks `/usage` directly.\n- If telemetry logs are unavailable (very fresh session, logs rotated away), the meter degrades gracefully to events-only mode — `outputTokens` and activity are still accurate, the rest read 0, and the `summary` banner switches to `Source: events.jsonl only`.\n\n\u003e For authoritative billing and quota use `/usage` inside Copilot CLI — this plugin does not estimate USD cost.\n\n## Development\n\n```bash\n# Run the unit tests\nnpm test                       # → node --test test/\n\n# Sanity-check syntax of every script\nnode --check bin/token-meter.js bin/copilot-tokens lib/*.js\n```\n\nCI runs the same checks across Node 18/20/22 on Ubuntu / macOS / Windows via `.github/workflows/test.yml`.\n\nThe codebase is intentionally dependency-free — only Node built-ins are used at runtime and at test time. Source layout:\n\n```\nlib/\n  format.js      number / duration / title formatting helpers\n  io.js          JSONL reader, atomic file writes, OSC 2 title writer\n  pricing.js     model → context-window lookup (with user override)\n  telemetry.js   process-log parsing (telemetry + raw API responses)\n  aggregate.js   events.jsonl + telemetry → totals / per-model / per-tool\nbin/\n  token-meter.js plugin hook script (writes status JSON + title bar)\n  copilot-tokens companion CLI (status / summary / watch / top / json)\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabhi-singhs%2Fcopilot-token-meter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabhi-singhs%2Fcopilot-token-meter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabhi-singhs%2Fcopilot-token-meter/lists"}