playmaker-cli 0.10.0__tar.gz → 0.12.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/CHANGELOG.md +20 -0
  2. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/PKG-INFO +19 -8
  3. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/README.md +16 -5
  4. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/pyproject.toml +4 -2
  5. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/skills/playmaker-coach/references/agent-gotchas.md +16 -0
  6. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/skills/playmaker-coach/references/lanes.md +5 -2
  7. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/skills/playmaker-coach/references/quotas.md +3 -0
  8. playmaker_cli-0.12.0/src/playmaker/agents/kimi.py +459 -0
  9. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/cli.py +3 -1
  10. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/quotas.py +302 -0
  11. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/registry.py +2 -0
  12. playmaker_cli-0.12.0/tests/fixtures/kimi_wire.jsonl +5 -0
  13. playmaker_cli-0.12.0/tests/test_kimi.py +333 -0
  14. playmaker_cli-0.12.0/tests/test_quotas_kimi.py +220 -0
  15. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/.gitignore +0 -0
  16. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/LICENSE +0 -0
  17. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/skills/playmaker-coach/SKILL.md +0 -0
  18. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/skills/playmaker-coach/references/commands.md +0 -0
  19. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/skills/playmaker-coach/references/prompt-templates.md +0 -0
  20. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/skills/playmaker-coach/references/review-board.md +0 -0
  21. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/skills/playmaker-coach/scripts/review-board.sh +0 -0
  22. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/__init__.py +0 -0
  23. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/__main__.py +0 -0
  24. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/agents/__init__.py +0 -0
  25. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/agents/agy.py +0 -0
  26. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/agents/base.py +0 -0
  27. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/agents/claude.py +0 -0
  28. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/agents/codex.py +0 -0
  29. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/agents/gemini.py +0 -0
  30. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/agents/opencode.py +0 -0
  31. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/config.py +0 -0
  32. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/notify.py +0 -0
  33. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/state.py +0 -0
  34. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/src/playmaker/watcher.py +0 -0
  35. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/__init__.py +0 -0
  36. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_agy.py +0 -0
  37. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_batch.py +0 -0
  38. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_binary.py +0 -0
  39. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_claude.py +0 -0
  40. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_codex.py +0 -0
  41. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_no_changes.py +0 -0
  42. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_opencode.py +0 -0
  43. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_permissions.py +0 -0
  44. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_quotas_antigravity.py +0 -0
  45. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_quotas_claude.py +0 -0
  46. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_quotas_codex.py +0 -0
  47. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_quotas_freshness.py +0 -0
  48. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_quotas_zai.py +0 -0
  49. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_registry.py +0 -0
  50. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_skill.py +0 -0
  51. {playmaker_cli-0.10.0 → playmaker_cli-0.12.0}/tests/test_state.py +0 -0
@@ -5,6 +5,26 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.12.0] - 2026-09-04
9
+
10
+ ### Added
11
+
12
+ - **Kimi Code usage in `playmaker quotas`.** The table reads Kimi Code's
13
+ managed OAuth usage endpoint and shows its rolling 5-hour Session and weekly
14
+ buckets beside the other provider pools.
15
+
16
+ ## [0.11.0] - 2026-09-04
17
+
18
+ ### Added
19
+
20
+ - **`kimi` lane — the Kimi Code CLI as a first-class agent.**
21
+ `playmaker dispatch kimi -m kimi-code/k3-256k` runs `kimi -p …
22
+ --output-format stream-json`, tracks the session, resumes with `-S`, and
23
+ reads the per-cwd `wire.jsonl` for `summary`. K3 is a senior-tier model on a
24
+ subscription nobody else on the machine draws from, and routing it through
25
+ opencode would have needed a second credential; the native CLI reuses its
26
+ own OAuth login.
27
+
8
28
  ## [0.10.0] - 2026-09-04
9
29
 
10
30
  ### Added
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: playmaker-cli
3
- Version: 0.10.0
4
- Summary: Playing-coach CLI for orchestrating Claude Code, Codex, Antigravity and opencode sub-agents in parallel.
3
+ Version: 0.12.0
4
+ Summary: Playing-coach CLI for orchestrating Claude Code, Codex, Antigravity, Kimi Code and opencode sub-agents in parallel.
5
5
  Project-URL: Homepage, https://github.com/vladsafedev/playmaker
6
6
  Project-URL: Repository, https://github.com/vladsafedev/playmaker
7
7
  Project-URL: Issues, https://github.com/vladsafedev/playmaker/issues
8
8
  Author-email: Vladislav Shulyugin <vladislav.shulyugin@gmail.com>
9
9
  License-Expression: MIT
10
10
  License-File: LICENSE
11
- Keywords: agents,ai,antigravity,claude,claude-code,cli,codex,gemini,glm,opencode,orchestration,subagents
11
+ Keywords: agents,ai,antigravity,claude,claude-code,cli,codex,gemini,glm,kimi,kimi-code,opencode,orchestration,subagents
12
12
  Classifier: Development Status :: 3 - Alpha
13
13
  Classifier: Environment :: Console
14
14
  Classifier: Intended Audience :: Developers
@@ -32,7 +32,7 @@ Description-Content-Type: text/markdown
32
32
  [![Python](https://img.shields.io/pypi/pyversions/playmaker-cli.svg?cacheSeconds=3600)](https://pypi.org/project/playmaker-cli/)
33
33
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
34
34
 
35
- **Run Claude Code, Codex, Antigravity and opencode as parallel sub-agents from one terminal — and spend separate quotas instead of one.**
35
+ **Run Claude Code, Codex, Antigravity, Kimi Code and opencode as parallel sub-agents from one terminal — and spend separate quotas instead of one.**
36
36
 
37
37
  You stay in your Claude Code session doing the part only you can do. `playmaker`
38
38
  fans the rest out to other agent CLIs as detached processes, tracks them,
@@ -74,10 +74,11 @@ in one serial session:
74
74
  1. **Wall-clock speed.** A task that decomposes into 3–5 independent
75
75
  work-streams (schema, backend, frontend, tests, docs) finishes 2–4× faster
76
76
  when each stream runs as its own parallel agent.
77
- 2. **Provider arbitrage.** Codex, Antigravity and opencode quotas are entirely
78
- separate pools from your Anthropic plan. Every slice you hand them is
79
- capacity your main session never spends — and Antigravity's roster includes
80
- Claude Sonnet/Opus, so even Claude-quality work can run on Google's pool.
77
+ 2. **Provider arbitrage.** Codex, Antigravity, Kimi Code and opencode quotas
78
+ are entirely separate pools from your Anthropic plan. Every slice you hand
79
+ them is capacity your main session never spends — and Antigravity's roster
80
+ includes Claude Sonnet/Opus, so even Claude-quality work can run on Google's
81
+ pool. Kimi Code brings its own subscription with the senior-tier K3.
81
82
  `opencode` widens this the most: one CLI fronting ~75 providers, from a z.ai
82
83
  GLM coding plan to models running locally on your own machine.
83
84
  3. **Bucket arbitrage inside one plan.** Headless `claude -p` draws on the same
@@ -146,6 +147,10 @@ The other agents differ, because their CLIs do:
146
147
  { "permission": { "edit": "allow", "bash": "allow", "webfetch": "deny" } }
147
148
  ```
148
149
 
150
+ - **kimi** has no permission flags at all in headless mode — `kimi -p` refuses
151
+ `--auto`, `--yolo` and `--plan`, and already runs with auto-approval, so
152
+ there is no read-only mode below the prompt.
153
+
149
154
  - **gemini** (legacy) runs with `--yolo`.
150
155
 
151
156
  ## Install
@@ -183,6 +188,7 @@ playmaker agents # which agent CLIs are reachable
183
188
  | **Codex CLI** | `npm i -g @openai/codex` | the model roster depends on your plan; omit `--model` to use the account default |
184
189
  | **Antigravity (`agy`)** | bundled with [Antigravity](https://antigravity.google) | `--model claude-opus-4-6-thinking` — the roster moves, so read it from `agy models` |
185
190
  | **opencode** | `brew install sst/tap/opencode` (or see [opencode.ai](https://opencode.ai)) | `--model provider/model`, e.g. `zai-coding-plan/glm-5.2`; roster from `opencode models`, providers from `opencode auth login` |
191
+ | **Kimi Code CLI** | `npm i -g @moonshot-ai/kimi-code` | needs Node ≥ 22.19 (a wrapper that pins a newer Node is fine — point `[agents.kimi] binary` at it); `--model kimi-code/k3-256k` — 256k window at half the quota cost of `k3`; log in once with `kimi login --region global`; model ids from `~/.kimi-code/config.toml` |
186
192
  | **Gemini CLI** (legacy) | `npm i -g @google/gemini-cli` | still supported, superseded by `agy` |
187
193
 
188
194
  At least one is required; `playmaker agents` tells you which it can see.
@@ -317,6 +323,7 @@ and locates the session file the tool writes locally. Empirically:
317
323
  | Codex | `~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-<ts>-<thread_id>.jsonl` |
318
324
  | Antigravity | `~/.gemini/antigravity-cli/brain/<conversation-id>/.system_generated/logs/transcript_full.jsonl` |
319
325
  | opencode | SQLite — `~/.local/share/opencode/opencode.db` (`session` / `message` / `part`); playmaker keeps a pointer at `~/.playmaker/opencode/<id>.session` |
326
+ | kimi | `~/.kimi-code/sessions/wd_<cwd-basename>_<hash>/session_<id>/agents/main/wire.jsonl` (per-cwd; `KIMI_CODE_HOME` overrides the root) |
320
327
  | Gemini | `~/.gemini/tmp/<cwd-basename>/chats/session-<ts>-<short_id>.{json,jsonl}` |
321
328
 
322
329
  `thread` and `summary` normalize all of them into the same turn list, so every
@@ -439,6 +446,10 @@ whole Z.ai block. Routing a subtask is choosing which of them to spend.
439
446
  lane pointed at a local model spends nothing here. Shows *unsupported* rather
440
447
  than an error when no Z.ai credential exists. `MCP tools` is the monthly
441
448
  web-search/reader pool, not inference.
449
+ - **Kimi Code** — managed usage API; OAuth token from
450
+ `~/.kimi-code/credentials/kimi-code-env-*.json` (`$KIMI_CODE_HOME` overrides
451
+ the root). Its 5-hour `Session` and weekly rows are separate percentage
452
+ buckets; no credential reads as *unsupported* rather than a failed probe.
442
453
 
443
454
  Reading these at *model* granularity is the point: they are the load-balancing
444
455
  input the coach skill uses to route each subtask.
@@ -5,7 +5,7 @@
5
5
  [![Python](https://img.shields.io/pypi/pyversions/playmaker-cli.svg?cacheSeconds=3600)](https://pypi.org/project/playmaker-cli/)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
7
 
8
- **Run Claude Code, Codex, Antigravity and opencode as parallel sub-agents from one terminal — and spend separate quotas instead of one.**
8
+ **Run Claude Code, Codex, Antigravity, Kimi Code and opencode as parallel sub-agents from one terminal — and spend separate quotas instead of one.**
9
9
 
10
10
  You stay in your Claude Code session doing the part only you can do. `playmaker`
11
11
  fans the rest out to other agent CLIs as detached processes, tracks them,
@@ -47,10 +47,11 @@ in one serial session:
47
47
  1. **Wall-clock speed.** A task that decomposes into 3–5 independent
48
48
  work-streams (schema, backend, frontend, tests, docs) finishes 2–4× faster
49
49
  when each stream runs as its own parallel agent.
50
- 2. **Provider arbitrage.** Codex, Antigravity and opencode quotas are entirely
51
- separate pools from your Anthropic plan. Every slice you hand them is
52
- capacity your main session never spends — and Antigravity's roster includes
53
- Claude Sonnet/Opus, so even Claude-quality work can run on Google's pool.
50
+ 2. **Provider arbitrage.** Codex, Antigravity, Kimi Code and opencode quotas
51
+ are entirely separate pools from your Anthropic plan. Every slice you hand
52
+ them is capacity your main session never spends — and Antigravity's roster
53
+ includes Claude Sonnet/Opus, so even Claude-quality work can run on Google's
54
+ pool. Kimi Code brings its own subscription with the senior-tier K3.
54
55
  `opencode` widens this the most: one CLI fronting ~75 providers, from a z.ai
55
56
  GLM coding plan to models running locally on your own machine.
56
57
  3. **Bucket arbitrage inside one plan.** Headless `claude -p` draws on the same
@@ -119,6 +120,10 @@ The other agents differ, because their CLIs do:
119
120
  { "permission": { "edit": "allow", "bash": "allow", "webfetch": "deny" } }
120
121
  ```
121
122
 
123
+ - **kimi** has no permission flags at all in headless mode — `kimi -p` refuses
124
+ `--auto`, `--yolo` and `--plan`, and already runs with auto-approval, so
125
+ there is no read-only mode below the prompt.
126
+
122
127
  - **gemini** (legacy) runs with `--yolo`.
123
128
 
124
129
  ## Install
@@ -156,6 +161,7 @@ playmaker agents # which agent CLIs are reachable
156
161
  | **Codex CLI** | `npm i -g @openai/codex` | the model roster depends on your plan; omit `--model` to use the account default |
157
162
  | **Antigravity (`agy`)** | bundled with [Antigravity](https://antigravity.google) | `--model claude-opus-4-6-thinking` — the roster moves, so read it from `agy models` |
158
163
  | **opencode** | `brew install sst/tap/opencode` (or see [opencode.ai](https://opencode.ai)) | `--model provider/model`, e.g. `zai-coding-plan/glm-5.2`; roster from `opencode models`, providers from `opencode auth login` |
164
+ | **Kimi Code CLI** | `npm i -g @moonshot-ai/kimi-code` | needs Node ≥ 22.19 (a wrapper that pins a newer Node is fine — point `[agents.kimi] binary` at it); `--model kimi-code/k3-256k` — 256k window at half the quota cost of `k3`; log in once with `kimi login --region global`; model ids from `~/.kimi-code/config.toml` |
159
165
  | **Gemini CLI** (legacy) | `npm i -g @google/gemini-cli` | still supported, superseded by `agy` |
160
166
 
161
167
  At least one is required; `playmaker agents` tells you which it can see.
@@ -290,6 +296,7 @@ and locates the session file the tool writes locally. Empirically:
290
296
  | Codex | `~/.codex/sessions/<YYYY>/<MM>/<DD>/rollout-<ts>-<thread_id>.jsonl` |
291
297
  | Antigravity | `~/.gemini/antigravity-cli/brain/<conversation-id>/.system_generated/logs/transcript_full.jsonl` |
292
298
  | opencode | SQLite — `~/.local/share/opencode/opencode.db` (`session` / `message` / `part`); playmaker keeps a pointer at `~/.playmaker/opencode/<id>.session` |
299
+ | kimi | `~/.kimi-code/sessions/wd_<cwd-basename>_<hash>/session_<id>/agents/main/wire.jsonl` (per-cwd; `KIMI_CODE_HOME` overrides the root) |
293
300
  | Gemini | `~/.gemini/tmp/<cwd-basename>/chats/session-<ts>-<short_id>.{json,jsonl}` |
294
301
 
295
302
  `thread` and `summary` normalize all of them into the same turn list, so every
@@ -412,6 +419,10 @@ whole Z.ai block. Routing a subtask is choosing which of them to spend.
412
419
  lane pointed at a local model spends nothing here. Shows *unsupported* rather
413
420
  than an error when no Z.ai credential exists. `MCP tools` is the monthly
414
421
  web-search/reader pool, not inference.
422
+ - **Kimi Code** — managed usage API; OAuth token from
423
+ `~/.kimi-code/credentials/kimi-code-env-*.json` (`$KIMI_CODE_HOME` overrides
424
+ the root). Its 5-hour `Session` and weekly rows are separate percentage
425
+ buckets; no credential reads as *unsupported* rather than a failed probe.
415
426
 
416
427
  Reading these at *model* granularity is the point: they are the load-balancing
417
428
  input the coach skill uses to route each subtask.
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "playmaker-cli"
3
- version = "0.10.0"
4
- description = "Playing-coach CLI for orchestrating Claude Code, Codex, Antigravity and opencode sub-agents in parallel."
3
+ version = "0.12.0"
4
+ description = "Playing-coach CLI for orchestrating Claude Code, Codex, Antigravity, Kimi Code and opencode sub-agents in parallel."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  license = "MIT"
@@ -19,6 +19,8 @@ keywords = [
19
19
  "codex",
20
20
  "antigravity",
21
21
  "gemini",
22
+ "kimi",
23
+ "kimi-code",
22
24
  "opencode",
23
25
  "glm",
24
26
  "subagents",
@@ -65,6 +65,22 @@ line from `agy models` / `opencode models` rather than typing it.
65
65
  - Neither trap applies to **review** dispatches, which write nothing — which makes opencode a
66
66
  perfectly good reviewer even where it is a shaky implementer.
67
67
 
68
+ ## kimi (Kimi Code CLI)
69
+
70
+ - There is **no read-only mode below the prompt**: `-p` refuses `--auto`, `--yolo` and `--plan`
71
+ (exit 1) and already runs with auto-approval. Only dispatch work you would run unattended anyway.
72
+ - The session id arrives **only in the trailing `session.resume_hint` line**, so `playmaker list`
73
+ shows the agent session late — do not conclude a dispatch failed just because the id has not
74
+ appeared yet.
75
+ - Sessions are **per-cwd**: `kimi session list` from another directory shows nothing. Track the
76
+ session through playmaker, not through the CLI.
77
+ - The stream carries **no token/cost fields** — there is nothing to budget against mid-run.
78
+ - Exit codes: **exit 1 is non-retryable** (auth, quota, unknown model — "is not configured in
79
+ config.toml"); **exit 75 is retryable**. Fix the cause on 1, re-dispatch on 75.
80
+ - K3 is **slow on real tickets** — never `--sync` a big WP; dispatch detached and poll.
81
+ - Needs **Node ≥ 22.19** — hence the wrapper binary; point `[agents.kimi] binary` at it.
82
+ - **Always pass `-m kimi-code/k3-256k`** — the CLI default is the weaker K2.7 `kimi-for-coding`.
83
+
68
84
  ## Worktrees
69
85
 
70
86
  Parallel WPs that touch the same files collide. Give each its own git worktree and dispatch with
@@ -18,8 +18,9 @@ pays. Four lanes:
18
18
  (`haiku` for trivial mechanical work). playmaker runs it in `acceptEdits`: it writes freely
19
19
  inside `--cwd` and is refused outside it, so keep every path in the prompt inside `--cwd`.
20
20
 
21
- 4. **External dispatch — `codex` / `agy` / `opencode`.** Each on its own subscription or plan — the
22
- home for write-heavy parallel implementation that can leave the Anthropic subscription.
21
+ 4. **External dispatch — `codex` / `agy` / `opencode` / `kimi`.** Each on its own subscription or
22
+ plan — the home for write-heavy parallel implementation that can leave the Anthropic
23
+ subscription.
23
24
  - **`agy` (Antigravity)** carries more than Google models: alongside Gemini Flash and Pro tiers it
24
25
  serves **Claude Sonnet/Opus (Thinking)** and a GPT-OSS tier. Its Claude runs on *Google's*
25
26
  pool and spends none of the Anthropic bucket — but that roster has trailed Anthropic's own
@@ -29,6 +30,8 @@ pays. Four lanes:
29
30
  - **`opencode`** is the widest lane: one CLI over ~75 providers addressed as `provider/model` — a
30
31
  GLM coding plan, or a model running locally on this machine, which spends no subscription quota
31
32
  at all.
33
+ - **`kimi`** runs the Kimi Code CLI on its own subscription: senior tier (K3), native login, no
34
+ opencode.
32
35
 
33
36
  **Never write an agy or opencode model name from memory** — run `agy models` / `opencode models` and
34
37
  copy a line. Both rosters and their spelling move with releases, and playmaker validates `--model`
@@ -24,6 +24,9 @@ several tiers with independent buckets, and the whole point of pulling quotas is
24
24
  - **Codex:** the main block is the primary Codex window; `Codex — Spark` is a separate block with
25
25
  its own `Session` / `Weekly` rows for the Spark model, the junior Codex lane — route Spark work
26
26
  off that block, not off the main one.
27
+ - **Kimi Code:** `Session` is its rolling 5-hour bucket and `Weekly` is the subscription's weekly
28
+ percentage bucket. They are independent of Claude, Codex and the opencode-backed plans, so Kimi
29
+ is a useful alternate lane when either of those two rows still has headroom.
27
30
  - **opencode:** the quota belongs to the *plan behind the provider*, not to the CLI — it appears
28
31
  under that provider (e.g. a GLM coding plan's session and weekly credit windows) and reads
29
32
  unsupported without a credential. A dispatch pointed at a **local** model spends nothing and never