Skip to main content

kild-cli

Drive the kild CLI: one-shot pi coding agents (`kild run`), multi-agent kilds (`kild new/send/log/stop`, `kild ls`), attached harnesses, and project/persona/worktree management. USE THIS SKILL to: delegate a task to a sub-agent ("use kild to…", "spawn an agent to…"), run/steer/observe multi-agent kilds, or manage kild projects, personas, and worktrees. Scriptable: results on stdout (`--json` for machine-readable), progress/errors on stderr, non-zero exit = failure. Installed globally as `kild` (bun link in engine/); run from any directory. Needs `pi` on PATH and authenticated.

ソース情報

リポジトリ
Wirasm/kild
ソースの最終更新活動
2026年7月28日 08:21
検出された SKILL.md の言語
英語
スター
66
フォーク
20

インストール方法

デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。

ソースファイルを確認

インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。

SKILL.md を表示中

SKILL.md
ソースの指示 · 読み取り専用プレビュー
name
kild-cli
description
Drive the kild CLI: one-shot pi coding agents (`kild run`), multi-agent kilds (`kild new/send/log/stop`, `kild ls`), attached harnesses, and project/persona/worktree management. USE THIS SKILL to: delegate a task to a sub-agent ("use kild to…", "spawn an agent to…"), run/steer/observe multi-agent kilds, or manage kild projects, personas, and worktrees. Scriptable: results on stdout (`--json` for machine-readable), progress/errors on stderr, non-zero exit = failure. Installed globally as `kild` (bun link in engine/); run from any directory. Needs `pi` on PATH and authenticated.
# kild CLI `kild` runs **pi** coding agents in your projects. It is the scriptable interface an agent can drive over the Bash tool. Installed globally: run `kild <args>` from anywhere (`bun link` from `engine/`; source `engine/src/cli.ts`). `kild run` is **one-shot**: it starts an agent, lets it work to completion, and prints the result. For **live, multi-agent, steerable** work, drive a **kild** (`kild new --detach` / `ls` / `log` / `send` / `stop`) — see "Driving kilds" below. ## Vocabulary One word per concept. See `docs/VOCABULARY.md`. - **kild** — a git worktree and the agents working in it. The unit of isolated, parallel work. Also the name of the tool; "a kild" is the unit. - **agent** — one running agent process. The only inhabitant type. - **persona** — a markdown file that shapes what an agent is. `.pi/agents/*.md`, `.claude/agents/*.md`. The dir is called `agents/` by upstream convention; the *contents* are personas. - **handle** — an agent's `@name`, addressable inside its kild. ## Command reference | Command | What it does | |---|---| | `kild run [opts] <prompt…>` | Run one agent on a prompt to completion, print the result | | `kild ls [--state s] [--git] [--project p]` | List kilds. **Fast by default**: identity + roster only, no git at any worktree count. `--git` adds code-state observability (branch, ahead/behind, dirty, conflicts, changed-file count, cross-kild collisions) and costs a git batch per kild. **Includes `kild/*` worktrees with no live kild** — abandoned trees show as `(orphan tree, no kild record)`, addressed by worktree name. `--state live\|orphan\|reclaimable` (`reclaimable` reads ahead/behind, so it implies `--git`) | | `kild new <goal> --detach [opts]` | Create a kild, print its id, return. Omit `--detach` for an interactive session | | `kild log <id> [--since <seq>]` | Read a kild's message thread. Each message carries a monotonic `seq`; `--since` is an **exclusive cursor** — pass the last seq you saw to get only what arrived after it. Works on a **stopped/archived** kild too (its log is the read-only record). Listings never carry messages | | `kild show <id>` | One live-or-orphan kild in detail: agents, git state, full log | | `kild send <id> <text…> --to a,b` | Send a message to named recipients in a live kild. **There is no lead and no default** — the engine never infers a recipient. `--to` is only omittable when the kild has exactly one agent, and the CLI then resolves that handle and sends it explicitly | | `kild spawn <id> --as <handle>` | Add an agent to a live kild (`--persona`, `--model`). `--task <text>` gives it its first message so it starts working; without one it sits idle until something sends to it. Errors are reported — an unknown persona or duplicate handle fails loudly | | `kild stop <id>` | Stop a live kild by id. With `--as <handle>` stops **that one agent** and leaves the kild running | | `kild land <id> [--execute]` | Without `--execute`: a **dry run** that touches nothing and reports what would merge and what collides. With it: merges the kild's branch into its base in the project's main checkout and prints the merge sha | | `kild rm <id> [--force]` | Dispose of a kild's worktree. Refused when the branch carries commits its base does not have (unlanded work); uncommitted files are discarded and listed, not a refusal. **The `kild/<name>` branch always survives**, so `--force` loses no commits | | `kild attach <id> --as <handle>` | Register an **attached** agent — a harness kild does not spawn (e.g. the Claude Code session you are in) claiming a `@handle`. Idempotent | | `kild inbox <id> --as <handle>` | Destructively read that agent's inbox. Empty = idle. `--format claude-stop` shapes it as a Claude Code `Stop` hook | | `kild agents` | List live agents | | `kild project ls` | List registered projects | | `kild project add <name> <path>` | Register a project directory (`~` is expanded) | | `kild project rm <name>` | Remove a project | | `kild persona ls [--project <dir>]` | List available personas (built-in `general` + convention dirs + config plugins) | | `kild persona show <name> [--project <dir>]` | Print a persona's resolved system prompt | There is **no `kild worktree` group**: a kild *is* a worktree, so it has one set of verbs. `kild worktree ls` → `kild ls`, `kild worktree rm` → `kild rm`, and `kild worktree prune` → `kild ls --state reclaimable` (then `kild rm` what you mean to reclaim — nothing is removed behind your back). All of these take a live kild's **id** or an orphan tree's **worktree name**; `kild ls` prints whichever applies. Add `--json` to any command for machine-readable output on stdout. ### Flags `--project <name|path>` · `--persona <name>` · `--model <ref>` · `--worktree <name>` · `--base <branch>` · `--agents a,b,c` (for `kild new`) · `--to a,b` (for `kild send`) · `--as <handle>` (for `attach`/`inbox`/`spawn`, and `stop` to stop one agent) · `--task <text>` (for `kild spawn`) · `--state live|orphan|reclaimable` · `--git` (both for `kild ls`) · `--since <seq>` (for `kild log`) · `--execute` (for `kild land`) · `--detach` · `--force` · `--json` ## Driving kilds (multi-agent units of parallel work) A **kild** is an isolated workspace where one or more agents collaborate. Unlike `run` (one-shot, single agent), a kild is steerable and multi-agent: ```bash ID=$(kild new "Build feature X" --detach --project myproj --worktree feat-x) kild ls # the glance: kilds + rosters (fast — no git) kild ls --git # + branch, ahead/behind, dirty, conflicts, collisions kild log "$ID" # the full conversation (each line prefixed by its seq) kild log "$ID" --since 12 # only what arrived after seq 12 kild send "$ID" "use the prp-implement skill to implement plan Y" kild send "$ID" --to reviewer "check the auth path" # address one agent kild stop "$ID" # end it ``` Agents come from the project's own personas (`--agents a,b,c`; with none, one `general` agent). Each gets kild's default prompt plus any skills the project's config plugs in — so you can send `use the prp-X skill to …` and the agent loads it. A harness kild does **not** spawn — the Claude Code session you are in — can also hold a handle: `kild attach "$ID" --as claude` registers it, and it collects mail by draining at its own turn boundary rather than being pushed to. ## Config — plug in skills/personas, base branch, and a model catalog `.kild/config.json` (project) and `$KILD_HOME/config.json` (global, merged; project wins): ```json { "plugins": ["./prp-core"], "baseBranch": "dev", "models": { "openai-codex/gpt-5.6-sol": "Strongest model. Hard reasoning, orchestration, synthesis. ($$$)", "openai-codex/gpt-5.6-terra": "Workhorse. Research, exploration, implementation. ($$)", "minimax/MiniMax-M3": "Cheap/fast. Mechanical/bulk work. ($)" } } ``` - `plugins` — dirs laid out like a Claude Code plugin (`agents/` + `skills/`); absolute or `~/…` paths load from anywhere. Also `agentPaths` / `skillPaths` for explicit dirs. - `baseBranch` — default base for worktrees + git status. - `models` — a `provider/model` → description catalog, appended to a **delegating** session's system prompt so it knows which model to pass to `spawn` per fan-out agent. ## Delegation is asynchronous Inside a kild, delegating is fire-and-forget: you keep going, and a delegate's message wakes you automatically. Don't busy-wait re-asking an agent that already replied. **An agent in a kild has one verb for both: `send`.** Addressing a handle nobody holds creates that agent and delivers your message to it, so delegation is "pick a handle, say who it should be with `persona`, write the assignment". Naming several new handles in one `to` gives them all the same brief — that is a fan-out. There is no spawn step and no idle just-created agent to remember to brief. From outside (this CLI, the REST API, the pi extension) the two stay separate on purpose: a typo'd handle must not quietly cost a process, so `kild send` refuses an unknown recipient and `kild spawn <id> --as <handle> [--task <text>]` is the explicit way to add one. **Seeing who is in a kild:** `kild show <id>` prints the roster (with each agent's persona, model, and `invitedBy`), `kild ls` prints it per kild in one line. An agent inside a kild does not need a roster tool — its `send` result names anyone it just created, and a `to` that cannot be resolved comes back listing both the current roster and the available personas. **Reaching another agent requires an explicit `send`.** Your normal output is private — narration is not delivered to anyone. If you finish delegated work without sending your result, whoever delegated is left waiting. The engine does not chase you: reporting is your responsibility (and your persona's), not a mechanism that nudges. ## Worktrees — every kild is one (you name them) `--worktree <name>` runs the kild (or `kild run`) in an isolated git worktree on branch `kild/<name>`; kild adds the `kild/` prefix, **you choose the suffix**. There is no auto-naming — omit `--worktree` and the work happens in the project's **main checkout** with no isolation. Conventions when you drive kild: - **One kild = one worktree.** Name it for the task: `--worktree fix-2247`, `--worktree feat-dark-mode`. Never run two independent kilds in the same tree. - **Reuse the name to share a tree.** Two sessions naming the SAME `--worktree` attach to one tree (e.g. a reviewer joining a coder's kild). Different names split. - **Base branch.** New worktrees fork from — and git status/collisions are measured against — the base: `--base <branch>` wins, else `.kild/config.json` `baseBranch`, else the checkout's current branch. On a repo whose trunk is `dev`, set `{"baseBranch":"dev"}` so ahead/behind and collisions reflect only this kild's work. - **Observe & land.** `kild ls --git` shows each kild's branch, ahead/behind, dirty, conflicts, and cross-kild file collisions (plain `kild ls` skips git and stays fast). `kild land <id>` previews the merge without touching anything; `kild land <id> --execute` performs it and prints the sha (recorded on the kild, so the ledger names the commit). - **Clean up.** `kild rm <id>` frees a tree. It refuses while the branch carries commits the base does not have — that is unlanded work, and you are told so rather than the tree quietly surviving. Uncommitted files are **not** a refusal (provisioning litter is not work): they are discarded and listed. The `kild/<name>` branch always survives, which is why `--force` costs no commits. `kild ls --state reclaimable` is the list `kild rm` would accept. - **Stranded trees are addressable.** `kild ls` enumerates worktrees from git, so a tree from an earlier engine run appears as an orphan (no agents, no log) under its worktree name and can be landed or removed like any other kild. ## The output contract - **stdout** — the result. Plain text by default; with `--json`, a JSON value. - **stderr** — progress (tool activity), the model line, and stats. Ignore for parsing (`2>/dev/null`). - **exit code** — `0` on success, non-zero on failure. Always check it. ## `kild run` ``` kild run [--project <name>] [--persona <name>] [--model <ref>] [--worktree <name>] <prompt…> ``` - **cwd** — defaults to the **current directory**. `--project <name>` instead runs in a registered project's path. Common pattern: `cd <some-dir> && kild run …`. - **`--persona <name>`** — layer a named system prompt. Omit for the built-in `general` persona: no specialisation, for when no other persona fits. List options with `kild persona ls`. - **`--model <ref>`** — e.g. `claude-opus-4-8`, `claude-haiku-4-5`. Omit for pi's default. - **`--worktree <name>`** — run in an isolated `kild/<name>` worktree. Created if missing, **attached** if it exists. The worktree **persists** after the run. ### `--json` result shape ```json { "model": "anthropic/claude-haiku-4-5", "text": "the agent's full reply", "tokens": 8092, "cost": 0.00176 } ``` ## Examples Run a one-shot task and capture just the answer: ```bash kild run --json "Summarize what this repo does in two sentences." 2>/dev/null | jq -r .text ``` Delegate to a specialized persona in a registered project: ```bash kild run --project myapp --persona planner --json \ "Draft an implementation plan for adding OAuth login." 2>/dev/null | jq -r .text ``` Two agents on one repo in isolation, then review + clean up: ```bash kild run --project myapp --worktree fix-auth --json "Fix the auth bug." 2>/dev/null & kild run --project myapp --worktree add-logs --json "Add request logging." 2>/dev/null & wait kild ls --project myapp --git --json # both trees, with their git state kild land fix-auth # dry run: what would merge, what collides kild land fix-auth --execute # merge it, print the sha kild rm fix-auth # free the tree (the branch stays) ``` Register a project, then list its personas: ```bash kild project add myapp ~/projects/myapp kild persona ls --project ~/projects/myapp --json | jq -r '.[].name' ``` ## Notes - **Personas are files.** A persona named `<name>` is a `<name>.md` file (its body is the system prompt) in a project's `.kild/agents/`, `.claude/agents/`, or `.pi/agents/`, or globally in `~/.config/kild/agents/` or `~/.claude/agents/`. The built-in `general` uses pi's own prompt. To add one, drop a file — kild only reads them. - **`kild run` is one-shot.** It blocks until the agent finishes; tool progress streams to stderr. To steer an agent mid-flight, use a kild and `kild send`. - **Errors are explicit.** An unknown project/persona, an unreadable persona file, or a pi spawn failure prints to stderr and exits non-zero — never silently degrades.
GitHubで見る