Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,44 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [0.6.0] — 2026-06-14

The vertical-orchestration step: clikae grows the muscle for directing a fleet of
AI CLIs that each burn their own subscription — and a sibling Claude Code skill
(`conductor`) stands on it. All additive; the existing command surface is unchanged.

### Added

- **`clikae conduct` (BETA)** — fan ONE prompt across N accounts **in parallel**,
each running headless **read-only** on its own tank (its own quota), then collect
every leg's full output and print a captured/dry table. clikae does **not** judge —
it hands you N result files and an honest table; you (or a session model acting as
conductor) pick the winner. Read-only by design so legs can't clobber a shared
tree. New optional adapter hook `adapter_audit_flags` (claude, codex).
- **`clikae git-id <engine> <tank> --name … --email …`** (issue #22) — give a tank
an optional git commit identity. When set, `clikae env` also exports
`GIT_AUTHOR_*` / `GIT_COMMITTER_*`, so commits made in that shell are stamped with
the identity you intended — not the engine's account email (the HANDOFF §13
mis-attribution incident). git env vars beat `git config`; honest limits (loses to
an explicit `git -c user.email=…`, per-shell only, future commits only) are
documented in the command's help and `docs/grammar.md`.
- **`clikae burn --prompt-file <f>` / `--prompt <str>` / `--add-dir <dir>`** (issue
#24) — the easy way to burn a write-task: clikae fills each engine's headless-write
flags from a new optional adapter hook `adapter_burn_flags` (claude, codex), so you
no longer hand-assemble `-p … --dangerously-skip-permissions` / `exec -s
workspace-write …`. A cross-engine `--to` reroute now regenerates the flags for the
new engine (previously it shipped the wrong engine's flags). The explicit `-- <cmd…>`
form keeps working unchanged.

### Fixed

- The new `adapter_burn_flags` / `adapter_audit_flags` recipes are **NUL-separated**,
not newline-separated, so a multi-line prompt survives as a single argv item (a
newline framing shattered a prompt that itself contained newlines).
- `clikae conduct` classifies a leg by its captured output, not the result file's
size, so an empty (failed) leg is reported as a real failure rather than a false
"captured" (an empty `printf` still writes a trailing newline).

## [0.5.14] — 2026-06-07

### Changed
Expand Down
38 changes: 36 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# clikae

> **Your starting point for working with AI coding CLIs.** Type `clikae` and land on everything you were just doing — your recent sessions across every account and every engine (Claude Code, Codex, Antigravity), each with a one-line recap of where you left off. Pick one and pick up where you were.
> **Your starting point for working with AI coding CLIs — and the cost-aware control plane for a fleet of them.** Type `clikae` and land on everything you were just doing — your recent sessions across every account and every engine (Claude Code, Codex, Antigravity), each with a one-line recap of where you left off. Pick one and pick up where you were. When a tank runs dry mid-task, carry the same session onward — or fan a headless job out across accounts and engines, each burning its own subscription, none eating your main budget.
>
> *"Kirikae" (切り替え, ki-ri-ka-e) is Japanese for "switching".*

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Status](https://img.shields.io/badge/status-v0.5.14-blue.svg)](CHANGELOG.md)
[![Status](https://img.shields.io/badge/status-v0.6.0-blue.svg)](CHANGELOG.md)

🌐 [日本語](https://cver.net/ja-jp/oss/clikae) · [한국어](https://cver.net/ko-kr/oss/clikae) · [繁體中文](https://cver.net/zh-tw/oss/clikae)

Expand Down Expand Up @@ -35,6 +35,40 @@ It:

It works for any CLI that selects its config via an environment variable (or a flag), ships with built-in adapters for **Claude Code, OpenAI Codex, GitHub CLI, gcloud, Docker, Helm, kubectl, AWS, Azure CLI, npm, Terraform, Pulumi, and Vercel** (plus real **per-account multi-tank for Antigravity / agy** — each tank carries its own Google login via the macOS Keychain), and adding a new one is ~10 lines of bash. No daemons, no global state, and exactly one opt-out network call (a throttled update check — `CLIKAE_NO_UPDATE_CHECK=1` silences it) — every line is auditable.

## Command your fleet — cost-aware, across vendors

Once you have more than one account on more than one engine, the home board
stops being a switcher and starts being a **control plane**: one person directing
a fleet of AI coding CLIs, each burning its **own** subscription quota, none of
them quietly eating the budget you're using for your main session. clikae knows
where each engine keeps its config and transcripts, how each one signals a usage
limit, and which tank still has fuel — so the arbitrage is two commands, not a
bag of `--resume` flags and environment-variable juggling:

- **Hit a wall, keep going — `clikae to`.** When the tank you're on runs dry,
carry the *same live conversation* onto another tank's quota (a real
`--resume`), or hand it across vendors as a written brief — Claude → Codex →
Antigravity. The cross-vendor brief is summarized **on-device** by a local
model when you have one (`apfel`, `ollama`, or `llm`), so the session never
leaves your machine, costs nothing, and works offline.

- **Fan the grunt work out — `clikae burn`.** Run a long, headless task on a
tank and verify it by the **artifact it produces** — never the exit code
(`codex exec` exits `0` even when it hit its limit). When that tank runs dry,
clikae **re-fires the same task on your next reserve tank automatically**,
skipping any account that shares a dried login and never reaching for the tank
your interactive session is live on. The expensive supervisor stays asleep;
the cheap workers burn whichever account still has gas.

- **Spot a wall before it's a wall — `clikae watch`.** Tail a running engine,
notice when it's about to go dry, and offer (or auto-carry) the session onward
to the next tank in your burn order.

Both `to` and `burn` follow one rule — *aggregate, never mutate the source.* A
session or a memory slice is carried as a **copy**; the tank you came from is
left exactly as it was. No proxy, no daemon, no traffic interception — clikae
reshapes *where your state lives*, it never sits in the middle of your requests.

## Install

**Homebrew** (macOS / Linux):
Expand Down
5 changes: 3 additions & 2 deletions bin/clikae
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

set -eo pipefail

CLIKAE_VERSION="0.5.14"
CLIKAE_VERSION="0.6.0"

# Resolve install root (handles symlink chains, e.g., via Homebrew)
__resolve_self() {
Expand Down Expand Up @@ -75,7 +75,7 @@ raw="${1:-home}"

__clikae_is_reserved() {
case "$1" in
home|dashboard|doctor|demo|init|app|tanks|list|ls|status|remove|rm|run|burn|to|continue|relay|handoff|watch|auto|antigravity|agy|rename|alias|migrate|env|info|adapters|lang|help|--help|-h|version|--version|-v) return 0 ;;
home|dashboard|doctor|demo|init|app|tanks|list|ls|status|remove|rm|run|burn|conduct|to|continue|relay|handoff|watch|auto|antigravity|agy|rename|alias|migrate|env|git-id|info|adapters|lang|help|--help|-h|version|--version|-v) return 0 ;;
*) return 1 ;;
esac
}
Expand All @@ -88,6 +88,7 @@ if __clikae_is_reserved "$raw"; then
rm) cmd="remove" ;;
dashboard) cmd="home" ;;
agy) cmd="antigravity" ;;
git-id) cmd="git_id" ;; # hyphen → underscore (file git_id.sh, fn cmd_git_id)
--help|-h) cmd="help" ;;
--version|-v) cmd="version" ;;
esac
Expand Down
Loading
Loading