wildcrane-runner 0.6.5 → 0.6.6

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.
package/README.md CHANGED
@@ -3,11 +3,7 @@
3
3
  WildCrane's Local Runner. It connects this computer to WildCrane and runs the tasks WildCrane
4
4
  sends on your local Claude Code, Codex, OpenCode or Cursor.
5
5
 
6
- - **Mac and Windows**: download WildCrane from the
7
- [releases](https://github.com/ai4kanban/ai4kanban/releases?q=desktop-v&expanded=true). It sits
8
- in the menu bar (tray), signs in once, and notifies you when something needs your review. The
9
- release notes say how to open the unsigned build the first time.
10
- - **Linux, or no desktop**: run it from a terminal; it runs tasks and shows no notifications.
6
+ 支持 macOS、Windows 和 Linux,通过终端运行。桌面端 App 已暂停支持。
11
7
 
12
8
  ```sh
13
9
  npm install -g wildcrane-runner
@@ -21,7 +17,7 @@ names, and falls back to the previous one if the new one does not start.
21
17
  - **One computer per account**: a second computer is refused while the first is connected.
22
18
  - **Folders**: tasks run in `~/.wildcrane/work/`, or in a project folder listed in
23
19
  `~/.wildcrane/projects.json` (`{ "projects": ["/path/to/project"] }`). Any other folder is
24
- refused. The desktop app writes that list when you add a project in its settings.
20
+ refused. 在插件中添加项目文件夹,或手动维护该列表。
25
21
  - **Task folders**: a task's jobs share its board, `<project>/.akb/kanban` (kept out of git),
26
22
  or for a project with no folder here its own one, `~/.wildcrane/cache/<project>/.akb/kanban`
27
23
  (a git repository). They run one at a time and sync the card, memory and assets with
@@ -47,9 +43,3 @@ names, and falls back to the previous one if the new one does not start.
47
43
  harness, session and Realtime code from `../cli/src`, and the CLI itself into `dist/akb/`, so
48
44
  `cli/` needs its own `npm install`.
49
45
  Releasing: [`docs/deploy.md`](../docs/deploy.md).
50
-
51
- The desktop app is `desktop/`: a Tauri 2 shell running the bundled Node on `dist/launcher.mjs`
52
- with `WILDCRANE_DESKTOP=1`; the two speak JSON lines (`src/desktop.ts`). It needs Rust.
53
- `npm install --include=dev` there, then `npm run dev`; `npm run lint` typechecks the windows,
54
- `node scripts/preview.mjs` draws every window state into one page.
55
- Releasing: [`docs/deploy.md`](../docs/deploy.md).
@@ -7,10 +7,7 @@
7
7
  // package's built rules, and hand the whole command line to one of the two trees in there —
8
8
  // `akb raw <move>`, or everything else.
9
9
  //
10
- // Why so little lives here: the desktop app carries `bin/` and `dist/` and no node_modules
11
- // beside them (desktop/scripts/bundle-cli.mjs), so this file must have no dependencies. The
12
- // commands, their options and their help are declared in cli/src/lib/cli/, which the build
13
- // bundles — with everything it needs — into the one file this loads.
10
+ // 入口只使用 Node 内置模块;命令及依赖由 cli/src/ 打包到 dist/。
14
11
  //
15
12
  // Node 18+, same behaviour on macOS, Linux and Windows.
16
13
 
@@ -23,23 +20,7 @@ const PKG = JSON.parse(fs.readFileSync(path.join(PKG_DIR, 'package.json'), 'utf8
23
20
  const NAME = PKG.name
24
21
  const VERSION = PKG.version
25
22
 
26
- // How this command was reached, spelled so what it prints can be pasted straight back.
27
- //
28
- // A global install puts it on the PATH as `akb`, and every example everywhere spells it that
29
- // way. It is also run as a path — `node cli/bin/ai4kanban.mjs` in a source checkout, the copy
30
- // inside the desktop app — and printing `akb` to a reader who has none is printing a line
31
- // that ends in `command not found`. Whoever typed it is right here in argv, so ask that
32
- // rather than guessing: only the PATH spellings are `akb`, `.mjs` never is.
33
- //
34
- // Not what's on the PATH, which is a different question with a different answer: `npx` puts
35
- // an `akb` on the PATH of THIS process and nothing else, so the reader would still be given a
36
- // line their own shell can't run. That one is spotted by the cache it runs out of, and
37
- // answered with the same fetch pinned to this version — never `@latest`, which is how a board
38
- // comes to be driven by two versions of its own rules.
39
- //
40
- // AI4KANBAN_COMMAND is how the desktop app's launcher says what it was typed as. That
41
- // launcher is reached as `akb` on the PATH and then runs this file by its path, so argv alone
42
- // would report the copy inside the app — a line no reader can paste.
23
+ // 保留用户调用时的命令名;npx 调用固定版本,Runner 可通过环境变量指定名称。
43
24
  const PROGRAM = (() => {
44
25
  const named = (process.env.AI4KANBAN_COMMAND || '').trim()
45
26
  if (named) return named
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // ai4kanban 0.11.4 — built by runner/scripts/build.mjs. Do not edit.
2
+ // ai4kanban 0.11.5 — built by runner/scripts/build.mjs. Do not edit.
3
3
  import { createRequire as __ai4kanbanRequire } from 'node:module'
4
4
  const require = __ai4kanbanRequire(import.meta.url)
5
5
  var __create = Object.create;
@@ -50,9 +50,9 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
50
50
  mod
51
51
  ));
52
52
 
53
- // ../cli/node_modules/commander/lib/error.js
53
+ // ../../../../../../git/ai4kanban/cli/node_modules/commander/lib/error.js
54
54
  var require_error = __commonJS({
55
- "../cli/node_modules/commander/lib/error.js"(exports) {
55
+ "../../../../../../git/ai4kanban/cli/node_modules/commander/lib/error.js"(exports) {
56
56
  var CommanderError2 = class extends Error {
57
57
  /**
58
58
  * Constructs the CommanderError class
@@ -85,9 +85,9 @@ var require_error = __commonJS({
85
85
  }
86
86
  });
87
87
 
88
- // ../cli/node_modules/commander/lib/argument.js
88
+ // ../../../../../../git/ai4kanban/cli/node_modules/commander/lib/argument.js
89
89
  var require_argument = __commonJS({
90
- "../cli/node_modules/commander/lib/argument.js"(exports) {
90
+ "../../../../../../git/ai4kanban/cli/node_modules/commander/lib/argument.js"(exports) {
91
91
  var { InvalidArgumentError: InvalidArgumentError2 } = require_error();
92
92
  var Argument2 = class {
93
93
  /**
@@ -212,9 +212,9 @@ var require_argument = __commonJS({
212
212
  }
213
213
  });
214
214
 
215
- // ../cli/node_modules/commander/lib/help.js
215
+ // ../../../../../../git/ai4kanban/cli/node_modules/commander/lib/help.js
216
216
  var require_help = __commonJS({
217
- "../cli/node_modules/commander/lib/help.js"(exports) {
217
+ "../../../../../../git/ai4kanban/cli/node_modules/commander/lib/help.js"(exports) {
218
218
  var { humanReadableArgName } = require_argument();
219
219
  var Help2 = class {
220
220
  constructor() {
@@ -781,9 +781,9 @@ ${itemIndentStr}`);
781
781
  }
782
782
  });
783
783
 
784
- // ../cli/node_modules/commander/lib/option.js
784
+ // ../../../../../../git/ai4kanban/cli/node_modules/commander/lib/option.js
785
785
  var require_option = __commonJS({
786
- "../cli/node_modules/commander/lib/option.js"(exports) {
786
+ "../../../../../../git/ai4kanban/cli/node_modules/commander/lib/option.js"(exports) {
787
787
  var { InvalidArgumentError: InvalidArgumentError2 } = require_error();
788
788
  var Option2 = class {
789
789
  /**
@@ -1082,9 +1082,9 @@ var require_option = __commonJS({
1082
1082
  }
1083
1083
  });
1084
1084
 
1085
- // ../cli/node_modules/commander/lib/suggestSimilar.js
1085
+ // ../../../../../../git/ai4kanban/cli/node_modules/commander/lib/suggestSimilar.js
1086
1086
  var require_suggestSimilar = __commonJS({
1087
- "../cli/node_modules/commander/lib/suggestSimilar.js"(exports) {
1087
+ "../../../../../../git/ai4kanban/cli/node_modules/commander/lib/suggestSimilar.js"(exports) {
1088
1088
  var maxDistance = 3;
1089
1089
  function editDistance2(a, b) {
1090
1090
  if (Math.abs(a.length - b.length) > maxDistance)
@@ -1162,9 +1162,9 @@ var require_suggestSimilar = __commonJS({
1162
1162
  }
1163
1163
  });
1164
1164
 
1165
- // ../cli/node_modules/commander/lib/command.js
1165
+ // ../../../../../../git/ai4kanban/cli/node_modules/commander/lib/command.js
1166
1166
  var require_command = __commonJS({
1167
- "../cli/node_modules/commander/lib/command.js"(exports) {
1167
+ "../../../../../../git/ai4kanban/cli/node_modules/commander/lib/command.js"(exports) {
1168
1168
  var EventEmitter = __require("node:events").EventEmitter;
1169
1169
  var childProcess = __require("node:child_process");
1170
1170
  var path86 = __require("node:path");
@@ -3321,9 +3321,9 @@ Expecting one of '${allowedValues.join("', '")}'`);
3321
3321
  }
3322
3322
  });
3323
3323
 
3324
- // ../cli/node_modules/commander/index.js
3324
+ // ../../../../../../git/ai4kanban/cli/node_modules/commander/index.js
3325
3325
  var require_commander = __commonJS({
3326
- "../cli/node_modules/commander/index.js"(exports) {
3326
+ "../../../../../../git/ai4kanban/cli/node_modules/commander/index.js"(exports) {
3327
3327
  var { Argument: Argument2 } = require_argument();
3328
3328
  var { Command: Command2 } = require_command();
3329
3329
  var { CommanderError: CommanderError2, InvalidArgumentError: InvalidArgumentError2 } = require_error();
@@ -3343,10 +3343,10 @@ var require_commander = __commonJS({
3343
3343
  }
3344
3344
  });
3345
3345
 
3346
- // ../cli/node_modules/commander/esm.mjs
3346
+ // ../../../../../../git/ai4kanban/cli/node_modules/commander/esm.mjs
3347
3347
  var import_index, program, createCommand, createArgument, createOption, CommanderError, InvalidArgumentError, InvalidOptionArgumentError, Command, Argument, Option, Help;
3348
3348
  var init_esm = __esm({
3349
- "../cli/node_modules/commander/esm.mjs"() {
3349
+ "../../../../../../git/ai4kanban/cli/node_modules/commander/esm.mjs"() {
3350
3350
  import_index = __toESM(require_commander(), 1);
3351
3351
  ({
3352
3352
  program,
@@ -4976,7 +4976,7 @@ var init_package = __esm({
4976
4976
  "../cli/package.json"() {
4977
4977
  package_default = {
4978
4978
  name: "wildcrane",
4979
- version: "0.11.4",
4979
+ version: "0.11.5",
4980
4980
  akbContract: 2,
4981
4981
  description: "WildCrane's `akb` command \u2014 scaffold the Markdown board under docs/kanban/, put an agent on a card, and carry the flows the agent works by.",
4982
4982
  keywords: [
@@ -23022,7 +23022,7 @@ var init_archive2 = __esm({
23022
23022
  var board_default;
23023
23023
  var init_board3 = __esm({
23024
23024
  "../cli/src/guide/board.md"() {
23025
- board_default = "# How this board works\n\nThese rules apply to every card workflow. Read them once; each workflow's guide covers\nthe remaining details.\n\n## Layout\n\n```\ndocs/kanban/\n\u251C\u2500\u2500 todo/ open tasks\n\u2502 \u251C\u2500\u2500 README.md the index \u2014 read it first\n\u2502 \u2514\u2500\u2500 <id>-<slug>.md\n\u2502 one card per file; a group keeps its cards in one folder\n\u251C\u2500\u2500 memory/ all memory \u2014 see \"Who owns a memory file\"\n\u2502 \u251C\u2500\u2500 readme.md what shipped \u2014 the board's own record\n\u2502 \u251C\u2500\u2500 project.md what the project is today \u2014 written only by `akb describe-project`\n\u2502 \u251C\u2500\u2500 <name>/ a global memory: `MEMORY.md` (its rules, unless built in), `README.md`\n\u2502 \u2502 (its index) and its entries\n\u2502 \u2514\u2500\u2500 agents/ one folder per agent that keeps memory, named after it \u2014\n\u2502 `planner/` holds `decisions.md`, `rejected.md`, `redesign.md`\n\u251C\u2500\u2500 rules/ `<agent>.md` \u2014 the user's rule for one agent, appended to every run it\n\u2502 does; written from the board UI or `akb raw rule`\n\u251C\u2500\u2500 triage/ items waiting to be sorted, one file each \u2014 not cards. Only\n\u2502 \u2502 Cloud's sort or Refine idea on the web's Triage page turns one\n\u2502 \u2502 into a card; `akb triage check <source-id>` finds an existing one\n\u2502 \u251C\u2500\u2500 archived/ items a card was made of\n\u2502 \u251C\u2500\u2500 dismissed/ items ignored, with the reason \u2014 `akb triage restore` puts one back\n\u2502 \u2514\u2500\u2500 files/ dropped-in files\n\u2514\u2500\u2500 modules.md one line per module \u2014 `akb guide module-map` writes it\n```\n\n## Task ID\n\nEvery task's id is the number at the front of its filename (`04-plan-cap-enforcement.md` \u2192\nid 4): its Cloud task's number (`WC-4`). Only Cloud assigns one; `akb raw create` takes it.\n\n## Never hand-write a card's frontmatter\n\n`akb raw create`, `update`, and `update-questions` manage all of a card's frontmatter,\nincluding its `previews`. Edit only the card's **body** by hand. `akb raw help`\nlists all operations; `akb raw help <move>` explains one operation.\n\n## Inside a board run\n\nA board run carries `KANBAN_RUN` in its environment. Never unset or bypass it (for example\n`env -u KANBAN_RUN`): when a command only prints a flow, follow the printed flow.\n\n## Group task\n\nA group lives in `todo/<id>-<slug>/`: `root.md` tracks the whole job and each subtask is its\nown card beside it; `akb guide add-task` says how to build one. The root's `## Todo` lists the\nsubtasks, one line each ending in `#<subid>`: archiving a subtask ticks its line, rejecting\none strikes it through, and resolving the last line archives the root in the same run, with\nany open question or unticked todo of its own. A board a Runner keeps leaves that close to\nCloud, which waits for the root to be queued with no step on it. A root listing no subtasks is\nonly closed by hand.\n\n## Who owns a memory file\n\n**A memory file belongs to whoever reads and writes it.**\n\n- **`memory/readme.md`**: the board's record of shipped user-facing work.\n- **`memory/project.md`**: what the project is today, from its users' side, and the\n direction every judgement serves. Only `akb describe-project` writes it.\n- **`memory/agents/planner/`**: `decisions.md` holds user-facing answers that guide future\n planning and `redesign.md` design mistakes to avoid, both written by the memory review (`akb\n guide review-memory`); `rejected.md` holds what the user turned down and why, written only\n by the rejection and dismissal review (`akb guide review-rejections`). Other flows only read\n them, `akb prune-memory` aside.\n- **`memory/<name>/`**: a global memory, kept by every agent listing it under `akb.memory`\n by the rules each run is given. Only the user changes its `MEMORY.md`, from the board UI.\n- **`memory/agents/<agent>/`**: an agent keeps only the files and split paths its own AGENT.md\n declares. An agent whose instructions name none keeps none.\n\nFile a planning note about one module in that module's folder,\n`memory/agents/planner/<module>/`, under the same file name, creating it if missing. A note\nspanning modules, or from a card with none, stays in `memory/agents/planner/`.\n\n### What earns a note\n\nOnly what changes a future planning choice. Writing nothing is a complete outcome.\n\n- **Honor an opt-out**: told not to record, write no memory and finish the requested action.\n- **A conversation writes none**: a card chat, a discussion, a feedback conversation, and\n any flow started in it write no memory and say nothing about it.\n- **Require lasting value**: a durable preference, constraint, decision, or lesson.\n- **Skip housekeeping**: duplicates, routine status changes, and facts recorded elsewhere.\n A rejected duplicate is not a rejected feature.\n- **Merge, don't repeat**: rewrite an equivalent entry in place.\n\n`readme.md` is not planning memory.\n";
23025
+ board_default = "# How this board works\n\nThese rules apply to every card workflow. Read them once; each workflow's guide covers\nthe remaining details.\n\n## Layout\n\n```\ndocs/kanban/\n\u251C\u2500\u2500 todo/ open tasks\n\u2502 \u251C\u2500\u2500 README.md the index \u2014 read it first\n\u2502 \u2514\u2500\u2500 <id>-<slug>.md\n\u2502 one card per file; a group keeps its cards in one folder\n\u251C\u2500\u2500 memory/ all memory \u2014 see \"Who owns a memory file\"\n\u2502 \u251C\u2500\u2500 readme.md what shipped \u2014 the board's own record\n\u2502 \u251C\u2500\u2500 project.md what the project is today \u2014 written only by `akb describe-project`\n\u2502 \u251C\u2500\u2500 <name>/ a global memory: `MEMORY.md` (its rules, unless built in), `README.md`\n\u2502 \u2502 (its index) and its entries\n\u2502 \u2514\u2500\u2500 agents/ one folder per agent that keeps memory, named after it \u2014\n\u2502 `planner/` holds `decisions.md`, `rejected.md`, `redesign.md`\n\u251C\u2500\u2500 rules/ `<agent>.md` \u2014 the user's rule for one agent, appended to every run it\n\u2502 does; written from the board UI or `akb raw rule`\n\u251C\u2500\u2500 triage/ items waiting to be sorted, one file each \u2014 not cards. Only\n\u2502 \u2502 Cloud's sort or Refine idea on the web's Triage page turns one\n\u2502 \u2502 into a card; `akb triage check <source-id>` finds an existing one\n\u2502 \u251C\u2500\u2500 archived/ items a card was made of\n\u2502 \u251C\u2500\u2500 dismissed/ items ignored, with the reason \u2014 `akb triage restore` puts one back\n\u2502 \u2514\u2500\u2500 files/ dropped-in files\n\u2514\u2500\u2500 modules.md one line per module \u2014 `akb guide module-map` writes it\n```\n\n## Task ID\n\nEvery task's id is the number at the front of its filename (`04-plan-cap-enforcement.md` \u2192\nid 4): its Cloud task's number (`WC-4`). Only Cloud assigns one; `akb raw create` takes it.\n\n## Never hand-write a card's frontmatter\n\n`akb raw create`, `update`, and `update-questions` manage all of a card's frontmatter,\nincluding its `previews`. Edit only the card's **body** by hand. `akb raw help`\nlists all operations; `akb raw help <move>` explains one operation.\n\n## Inside a board run\n\nA board run carries `KANBAN_RUN` in its environment. Never unset or bypass it (for example\n`env -u KANBAN_RUN`): when a command only prints a flow, follow the printed flow.\n\n## Group task\n\nA group lives in `todo/<id>-<slug>/`: `root.md` tracks the whole job and each subtask is its\nown card beside it; `akb guide add-task` says how to build one. The root's `## Todo` lists the\nsubtasks, one line each ending in `#<subid>`: archiving a subtask ticks its line, rejecting\none strikes it through, and resolving the last line archives the root in the same run, with\nany open question or unticked todo of its own. A board a Runner keeps leaves that close to\nCloud, which waits for the root to be queued with no step on it. A root listing no subtasks is\nonly closed by hand.\n\n## Who owns a memory file\n\n**A memory file belongs to whoever reads and writes it.**\n\n- **`memory/readme.md`**: the board's record of shipped user-facing work.\n- **`memory/project.md`**: what the project is today, from its users' side, and the\n direction every judgement serves. Only `akb describe-project` writes it.\n- **`memory/agents/planner/`**: `decisions.md` holds user-facing answers that guide future\n planning and `redesign.md` design mistakes to avoid, both written by the memory review (`akb\n guide review-memory`); `rejected.md` holds what the user turned down and why, written only\n by the rejection and dismissal review (`akb guide review-rejections`). Other flows only read\n them, `akb prune-memory` aside.\n- **`memory/<name>/`**: a global memory, kept by every agent listing it under `akb.memory`\n by the rules each run is given. Only the user changes its `MEMORY.md`, from the board UI.\n- **`memory/agents/<agent>/`**: an agent keeps only the files and split paths its own AGENT.md\n declares, plus the `redesign.md` the memory review writes there. An agent whose instructions\n name none keeps none.\n\nFile a planning note about one module in that module's folder,\n`memory/agents/planner/<module>/`, under the same file name, creating it if missing. A note\nspanning modules, or from a card with none, stays in `memory/agents/planner/`.\n\n### What earns a note\n\nOnly what changes a future planning choice. Writing nothing is a complete outcome.\n\n- **Honor an opt-out**: told not to record, write no memory and finish the requested action.\n- **A conversation writes none**: a card chat, a discussion, a feedback conversation, and\n any flow started in it write no memory and say nothing about it.\n- **Require lasting value**: a durable preference, constraint, decision, or lesson.\n- **Skip housekeeping**: duplicates, routine status changes, and facts recorded elsewhere.\n A rejected duplicate is not a rejected feature.\n- **Merge, don't repeat**: rewrite an equivalent entry in place.\n\n`readme.md` is not planning memory.\n";
23026
23026
  }
23027
23027
  });
23028
23028
 
@@ -23030,7 +23030,7 @@ var init_board3 = __esm({
23030
23030
  var card_chat_default;
23031
23031
  var init_card_chat = __esm({
23032
23032
  "../cli/src/guide/card-chat.md"() {
23033
- card_chat_default = '# Answer a card\'s conversation\n\nThis is the conversation on one card. Answer what the user asked, and act on what they decided\n\u2014 on the turn they decide it, not when the conversation ends.\n\n- **Answer first**: this is a conversation. Say what you understand and answer them, in their\n own language, before you change anything.\n- **Read every turn for three things**: a question, a change to the card, and an answer to one\n of the card\'s open questions. A turn can carry several, or none. Judge it from what the\n conversation is about, never from whether they used a particular word.\n- **Act on clear intent**: when the user makes a change clear, make it on that turn. A clear\n change can be stated, asked as a question ("can we drop X?"), or a yes to your proposal.\n Change the card by the revise flow (`akb card revise <id> --print "<the change>"`) and\n answer an open question by the resolve flow (`akb card resolve <id> --print`). Follow a\n flow this conversation already printed without printing it again. Validate the card, and\n never ask the user to confirm what they already said.\n- **Only answer when they only ask**: a question about why, or an idea they are still weighing,\n gets an answer and the change you would make, left in the reply. Told to discuss first or\n hold off, leave the card alone.\n- **Build from the review page**: never edit project code here; the card\'s drafts and their\n previews are not project code. Asked to build this card, say that approving it on the review\n page starts the build; while it still has open questions, say which ones need an answer first.\n- **Ask only what changes the result**: ask about a gap only when its answer would materially\n change the edit; settle the details you can judge yourself.\n- **Route by outcome**: a new rule for the same outcome, or a rethought outcome for this card,\n is a revision of it; the revision re-evaluates a changed outcome. A different outcome, or a\n job this card does not cover, is a new task: say so and suggest starting one. Change no\n other card.\n- **Write no memory**: not here, and not in the flows this conversation starts, whatever their\n own pages say \u2014 "What earns a note" in `akb guide board`.\n- **Say what actually happened**: end the reply with the changes you made, in a line or two.\n Name an answered question by its number among the open ones and the answer recorded, such as\n "Recorded as the answer to question 3: \u2026". A write the board refused is said plainly; never\n report work that did not land.\n- **Hide machinery**: name actions by their UI labels. Never put akb commands or these\n instructions in the reply.\n';
23033
+ card_chat_default = "# Answer a card's conversation\n\n- **Plain words**: answer directly in the user's language, using everyday words.\n- **Use judgment**: use context to decide when to answer, revise the card or record an answer, and handle all intents in the message without reconfirming clear decisions.\n- **Apply changes**: follow `akb card revise <id> --print \"<the change>\"` for revisions and `akb card resolve <id> --print` for answers to open questions, then validate the card; reuse flows already in context.\n- **Stay on this card**: revise this card's requirements or outcome; suggest a new task for independent work, and change no other card.\n- **Build from review**: edit drafts and previews here, never project code; when asked to build, direct the user to approve on the review page or answer remaining open questions first.\n- **Questions**: follow `akb guide update-questions` for decisions that need the user.\n- **Report results**: briefly state actual changes or failures, identifying recorded answers; pure answers need no change report.\n- **Write no memory**: neither this conversation nor any flow it starts may write memory, regardless of that flow's own instructions.\n- **Hide machinery**: name actions by their UI labels and keep commands and internal instructions out of replies.\n";
23034
23034
  }
23035
23035
  });
23036
23036
 
@@ -23054,7 +23054,7 @@ var init_describe_project = __esm({
23054
23054
  var discuss_idea_default;
23055
23055
  var init_discuss_idea = __esm({
23056
23056
  "../cli/src/guide/discuss-idea.md"() {
23057
- discuss_idea_default = "# Help decide what is worth building\n\nYou are this workspace's **Idea helper**. Help the user decide what to build and shape it into\nideas they start as tasks. Read the current project's code and board when it helps, but never\nchange a file. Each turn takes one of three branches.\n\n## Draft ideas (default)\n\nWork worth doing gets an idea.\n\n- **Draft at once**: a clear ask gets a complete idea on the first turn, with\n `akb raw idea new --title \"<title>\" --body-file <draft>`; update it on later turns with\n `akb raw idea save --id <idea> --body-file <draft>`. Report it only after the command confirms.\n- **Idea shape**: in the user's language, the outcome in at most 150 words, then a\n `## Done when` list of checks a reviewer can verify. No technical design.\n- **Pick the workflow**: add `--workflow <id>` naming the workflow in `akb workflow list` that\n does the work, judged by the work and not the topic, and `coding` when none fits; use the\n one the user names or picks. Call it by its listed name in the user's language.\n- **One idea per deliverable**: give separate deliverables separate ideas, and drop a replaced\n one with `akb raw idea drop --id <idea>`.\n- **Settle what you can**: decide the outcome questions you can judge and say which calls you\n made; ask only what the user alone can answer and would change the outcome, with the option\n you recommend.\n- **Finish the turn**: save the ideas and stop; never end by asking them to confirm or press\n **Start**.\n\n## Start on a go\n\nWhen the user tells you to go ahead, start the ideas they mean with\n`akb raw idea start --id <idea>`, drafting them first when needed, and say which tasks started.\n\n## Just answer\n\nA question, an idea not yet clear enough to draft, or a doubt about whether it is worth doing\ngets an answer, with no idea.\n\n- **Answer first**: say whether it is worth doing and why; disagreeing, advising a pause, or\n asking for evidence is a complete answer. Read a reliable source before stating an external\n fact.\n\n## Always\n\n- **Hide machinery**: never mention plans, files, paths, commands, or the tools and connectors\n you run with, and refer to actions by their button labels.\n";
23057
+ discuss_idea_default = "# Help decide what is worth building\n\nYou are this workspace's **Idea helper**. Help the user decide what to build and shape it into\nideas they start as tasks. Read the current project's code and board when it helps, but never\nchange a file. Each turn takes one of three branches.\n\n## Draft ideas (default)\n\nWork worth doing gets an idea.\n\n- **Draft at once**: a clear ask gets a complete idea on the first turn, with\n `akb raw idea new --title \"<title>\" --body-file <draft>`; update it on later turns with\n `akb raw idea save --id <idea> --body-file <draft>`. Report it only after the command confirms.\n- **Idea shape**: in the user's language, the outcome in at most 150 words, then a\n `## Done when` list of checks a reviewer can verify. No technical design.\n- **Pick the workflow**: add `--workflow <id>` naming the workflow in `akb workflow list` that\n does the work, judged by the work and not the topic, and `coding` when none fits; use the\n one the user names or picks. Call it by its listed name in the user's language.\n- **One idea per deliverable**: give separate deliverables separate ideas, and drop a replaced\n one with `akb raw idea drop --id <idea>`.\n- **Settle what you can**: decide the outcome questions you can judge and say which calls you\n made; ask only what the user alone can answer and would change the outcome, with the option\n you recommend.\n- **Finish the turn**: save the ideas and stop; never end by asking them to confirm or press\n **Start**.\n\n## Start on a go\n\nWhen the user tells you to go ahead, start the ideas they mean with\n`akb raw idea start --id <idea>`, drafting them first when needed, and say which tasks started.\n\n## Just answer\n\nA question, an idea not yet clear enough to draft, or a doubt about whether it is worth doing\ngets an answer, with no idea.\n\n- **Answer first**: say whether it is worth doing and why; disagreeing, advising a pause, or\n asking for evidence is a complete answer. Read a reliable source before stating an external\n fact.\n\n## Always\n\n- **Plain words**: answer directly in the user's language, using everyday words.\n\n- **Hide machinery**: never mention plans, files, paths, commands, or the tools and connectors\n you run with, and refer to actions by their button labels.\n";
23058
23058
  }
23059
23059
  });
23060
23060
 
@@ -23070,7 +23070,7 @@ var init_evaluate_task = __esm({
23070
23070
  var follow_up_default;
23071
23071
  var init_follow_up = __esm({
23072
23072
  "../cli/src/guide/follow-up.md"() {
23073
- follow_up_default = '# Handle follow-up work\n\nUse when planning or implementation discovers additional work.\n\n- **Current task**: finish required work on this card; queue independent follow-ups in triage, then resume the original task.\n- **Existing card**: when only another open card needs changing, run `akb card revise <id> "<the change and why>"`.\n- **Queue it**: use the command below; skip an item the command reports as already there.\n- **Workflow**: use the source card\'s `workflow:`, or the board default shown by `akb workflow` when it has none.\n\n```text\nakb triage add --title "<one line>" --slug <short-english-slug> --source "#<id>" --workflow <workflow> --text "<body>"\n```\n\n## Write the item\n\n- **Reader**: someone who has read neither the original card nor the code can decide in ten seconds whether the work is worth doing.\n- **Order**: first explain what happened and what the user runs into, then say what the work would do.\n- **Plain words**: keep file, function and field names, card ids, agent names and evidence trails out of the title and body.\n';
23073
+ follow_up_default = '# Handle follow-up work\n\nUse when planning or implementation discovers additional work.\n\n- **Current task**: finish required work on this card; queue independent follow-ups in triage, then resume the original task.\n- **Drop what was turned down**: queue nothing that\n `docs/kanban/memory/agents/planner/rejected.md` or\n `docs/kanban/memory/agents/planner/*/rejected.md` turns down.\n- **Existing card**: when only another open card needs changing, run `akb card revise <id> "<the change and why>"`.\n- **Queue it**: use the command below; skip an item the command reports as already there.\n- **Workflow**: use the source card\'s `workflow:`, or the board default shown by `akb workflow` when it has none.\n\n```text\nakb triage add --title "<one line>" --slug <short-english-slug> --source "#<id>" --workflow <workflow> --text "<body>"\n```\n\n## Write the item\n\n- **Reader**: someone who has read neither the original card nor the code can decide in ten seconds whether the work is worth doing.\n- **Order**: first explain what happened and what the user runs into, then say what the work would do.\n- **Plain words**: keep file, function and field names, card ids, agent names and evidence trails out of the title and body.\n';
23074
23074
  }
23075
23075
  });
23076
23076
 
@@ -23078,7 +23078,7 @@ var init_follow_up = __esm({
23078
23078
  var implement_default;
23079
23079
  var init_implement = __esm({
23080
23080
  "../cli/src/guide/implement.md"() {
23081
- implement_default = "# Implement a settled card\n\nBuild the approved card. Preserve settled decisions and unrelated questions.\n\n- **Unchecked card**: a card with `triage:` set and an empty `## Scope` skipped planning; do\n what \"Unchecked card\" in `akb guide refine` says before building.\n- **User-action blockers**: follow `akb guide update-questions` and append a\n question describing the obstacle and action needed. Stop only dependent work; resume it\n after the user resolves the question. Settle routine technical choices yourself.\n- Do not replace or contradict what the card says.\n- **Approved mockups**: build each screen a card's mockup shows to match it, then compare\n your result with the mockup at desktop and phone widths and fix any difference.\n- **Approved API previews**: build each surface a card's API preview shows to match it,\n and write its documentation from it.\n- **Approved schema preview**: write the migration so the resulting schema matches the\n card's approved schema preview.\n- **Building is not shipping**: unless the card's outcome is itself a deploy, release, or\n publish, finish once the change lands and the checks pass; do not push, deploy, release,\n or publish to complete it.\n- **Defer what can wait**: queue as a follow-up any verification or step that needs the change\n live, and any other work this card does not require; never hold the card with a question\n about it.\n- **Follow-ups**: follow `akb guide follow-up` for additional work.\n- **Decisions made while building**: record an answered material decision the user could\n reasonably reverse under `## Worth noting after implementation`.\n- A printed, interactive implementation may stay uncommitted in the target checkout only\n when the card already supplies a concrete outcome, boundaries, and build steps.\n Otherwise use the tracked implementation path. Background runs always keep their delivery\n path.\n- **Checks**: nothing reviews the build after you; run focused checks for the affected path\n plus every repository-required check.\n\n## A build that writes its own card\n\n**Start now** sends a requirement with no card behind it \u2014 a typed sentence, the plan a\ndiscussion settled, or a triage item. Write the card first, in the same run, then build it. The board points\nthe run and its delivery at the card as the create lands, so from there it is an ordinary\nbuild.\n\n- **Read the plan first**: given a plan's path or a triage item's file, that file is the\n requirement \u2014 read it, and everything below reads \"the plan\" for \"the sentence\".\n- **Create it first**: `akb raw create --title \"..\"`. The title is one short line read off\n the sentence, or the plan's own title, in its own language \u2014 add\n `--slug <short-english-slug>` when that is not English, because filenames are ASCII. No `--modules`, no `--question` \u2014 nothing has evaluated this idea.\n- **The requirement is the summary**: replace the scaffold's opening paragraph with the\n sentence, or the plan's whole text, verbatim, in a fenced code block. Open the fence with\n more backticks than the longest run inside it, or the card fails validation on an unclosed\n fence.\n- **From a plan, name it**: pass `--source <plan path>` to the create.\n- **From a triage item, file it**: pass `--triage <source-id>` to the create, and run\n `akb triage archive <source-id> --card <id>` straight after, before any build work.\n- **Leave the rest of the scaffold**: `## Worth noting`, `## Scope`, `## Todo` and\n `## Decided by the agent` stay exactly as `raw create` wrote them.\n- **Then build that card**: the code block is the whole requirement \u2014 build exactly it and\n widen it no further. `akb card implement <id> --print` is the flow from here.\n";
23081
+ implement_default = "# Implement a settled card\n\nBuild the approved card. Preserve settled decisions and unrelated questions.\n\n- **Unchecked card**: a card with `triage:` set and an empty `## Scope` skipped planning; do\n what \"Unchecked card\" in `akb guide refine` says before building.\n- **User-action blockers**: follow `akb guide update-questions` and append a\n question describing the obstacle and action needed. Stop only dependent work; resume it\n after the user resolves the question. Settle routine technical choices yourself.\n- Do not replace or contradict what the card says.\n- **Approved mockups**: build each screen a card's mockup shows to match it, then compare\n your result with the mockup at desktop and phone widths and fix any difference.\n- **Approved API previews**: build each surface a card's API preview shows to match it,\n and write its documentation from it.\n- **Approved schema preview**: write the migration so the resulting schema matches the\n card's approved schema preview.\n- **Building is not shipping**: unless the card's outcome is itself a deploy, release, or\n publish, finish once the change lands and the checks pass; do not push, deploy, release,\n or publish to complete it.\n- **What needs it live**: leave any verification or step that needs the change live to the\n user. Name it in your final message; queue no follow-up and ask no question about it.\n- **Defer what can wait**: queue as a follow-up any other work this card does not require;\n never hold the card with a question about it.\n- **Follow-ups**: follow `akb guide follow-up` for additional work.\n- **Decisions made while building**: record an answered material decision the user could\n reasonably reverse under `## Worth noting after implementation`.\n- A printed, interactive implementation may stay uncommitted in the target checkout only\n when the card already supplies a concrete outcome, boundaries, and build steps.\n Otherwise use the tracked implementation path. Background runs always keep their delivery\n path.\n- **Checks**: nothing reviews the build after you; run focused checks for the affected path\n plus every repository-required check.\n\n## A build that writes its own card\n\n**Start now** sends a requirement with no card behind it \u2014 a typed sentence, the plan a\ndiscussion settled, or a triage item. Write the card first, in the same run, then build it. The board points\nthe run and its delivery at the card as the create lands, so from there it is an ordinary\nbuild.\n\n- **Read the plan first**: given a plan's path or a triage item's file, that file is the\n requirement \u2014 read it, and everything below reads \"the plan\" for \"the sentence\".\n- **Create it first**: `akb raw create --title \"..\"`. The title is one short line read off\n the sentence, or the plan's own title, in its own language \u2014 add\n `--slug <short-english-slug>` when that is not English, because filenames are ASCII. No `--modules`, no `--question` \u2014 nothing has evaluated this idea.\n- **The requirement is the summary**: replace the scaffold's opening paragraph with the\n sentence, or the plan's whole text, verbatim, in a fenced code block. Open the fence with\n more backticks than the longest run inside it, or the card fails validation on an unclosed\n fence.\n- **From a plan, name it**: pass `--source <plan path>` to the create.\n- **From a triage item, file it**: pass `--triage <source-id>` to the create, and run\n `akb triage archive <source-id> --card <id>` straight after, before any build work.\n- **Leave the rest of the scaffold**: `## Worth noting`, `## Scope`, `## Todo` and\n `## Decided by the agent` stay exactly as `raw create` wrote them.\n- **Then build that card**: the code block is the whole requirement \u2014 build exactly it and\n widen it no further. `akb card implement <id> --print` is the flow from here.\n";
23082
23082
  }
23083
23083
  });
23084
23084
 
@@ -23094,7 +23094,7 @@ var init_module_map = __esm({
23094
23094
  var prune_memory_default;
23095
23095
  var init_prune_memory = __esm({
23096
23096
  "../cli/src/guide/prune-memory.md"() {
23097
- prune_memory_default = "# Prune the memory\n\nPrune the board's own record in `docs/kanban/memory/` and every agent's memory beside it in\n`docs/kanban/memory/agents/<agent>/` \u2014 the planner's files and module folders among them (see\n\"Who owns a memory file\" in `akb guide board`). `project.md` is rewritten on its own schedule:\nleave it alone.\n\nOne principle for all files: they exist to stop us re-proposing work, re-making a\ndesign mistake, or re-asking a settled question. Rewrite each as **topics** (h2 title) with\nplain-language takeaways under each section. Keep only what helps\nfuture planning; drop code detail, dates, task ids, step-by-step stories.\n\nDrop every entry that fails \"What earns a note\" in `akb guide board` \u2014 the bar that governs a\nwrite governs what stays. Merge lines that say the same thing. Rewrite, don't just cut.\n\nOn top of that, per file:\n\n- `agents/planner/rejected.md` \u2014 one line per thing the user does not want, and why. Keep\n every source id in parentheses: they are how a restored item withdraws its line. \"Already\n done\" is a shipped fact, not a rejection \u2014 it belongs in the published doc (with a\n `readme.md` line pointing at it), not here; drop it from `rejected.md`.\n- `agents/planner/redesign.md` \u2014 one line per entry: the mistake, then the design to use.\n Drop an entry once that design is the obvious default.\n- `readme.md` \u2014 the board's own record, one line per shipped user-facing behavior. Where a\n published doc covers it, the line is just a link to that doc's path. **Replace a prose\n entry with a link only after you have confirmed the doc covers that behavior** \u2014 search the\n docs first; no doc yet means the prose line stays: `readme.md` is the only record until we\n document it. Anything else \u2014 watermarks, a last focus, open gaps, internal detail \u2014\n doesn't belong here; drop it.\n- `agents/planner/decisions.md` \u2014 one line per live decision, in plain user-facing words.\n Drop anything that fails its bar in `akb guide board` (\"Who owns a memory file\"): a call\n about code detail, or one the published docs now cover. Drop a decision once the question\n no longer arises or `redesign.md` states it as a rule.\n- `agents/<agent>/` \u2014 the files that agent's own AGENT.md defines, each pruned to what it says\n the file holds. Drop an entry once that agent's instructions or the design docs say it, and\n drop a file its instructions no longer name.\n\nPrune a preview agent's files together, and drop the whole folder when its agent is gone from `akb\nspec`. Drop anything a file says about how the product looks \u2014 colours, dimensions,\ncomponent detail belong in the app's `design.md`, not here \u2014 and fold a product fact worth\nkeeping into the lesson or the decision it supports.\n";
23097
+ prune_memory_default = "# Prune the memory\n\nPrune the board's own record in `docs/kanban/memory/` and every agent's memory beside it in\n`docs/kanban/memory/agents/<agent>/` \u2014 the planner's files and module folders among them (see\n\"Who owns a memory file\" in `akb guide board`). `project.md` is rewritten on its own schedule:\nleave it alone.\n\nOne principle for all files: they exist to stop us re-proposing work, re-making a\ndesign mistake, or re-asking a settled question. Rewrite each as **topics** (h2 title) with\nplain-language takeaways under each section. Keep only what helps\nfuture planning; drop code detail, dates, task ids, step-by-step stories.\n\nDrop every entry that fails \"What earns a note\" in `akb guide board` \u2014 the bar that governs a\nwrite governs what stays. Merge lines that say the same thing. Rewrite, don't just cut.\n\nOn top of that, per file:\n\n- `agents/planner/rejected.md` \u2014 one line per thing the user does not want, and why. Keep\n every source id in parentheses: they are how a restored item withdraws its line. \"Already\n done\" is a shipped fact, not a rejection \u2014 it belongs in the published doc (with a\n `readme.md` line pointing at it), not here; drop it from `rejected.md`.\n- `agents/planner/redesign.md` \u2014 one line per entry: the mistake, then the design to use.\n Drop an entry once that design is the obvious default.\n- `readme.md` \u2014 the board's own record, one line per shipped user-facing behavior. Where a\n published doc covers it, the line is just a link to that doc's path. **Replace a prose\n entry with a link only after you have confirmed the doc covers that behavior** \u2014 search the\n docs first; no doc yet means the prose line stays: `readme.md` is the only record until we\n document it. Anything else \u2014 watermarks, a last focus, open gaps, internal detail \u2014\n doesn't belong here; drop it.\n- `agents/planner/decisions.md` \u2014 one line per live decision, in plain user-facing words.\n Drop anything that fails its bar in `akb guide board` (\"Who owns a memory file\"): a call\n about code detail, or one the published docs now cover. Drop a decision once the question\n no longer arises or `redesign.md` states it as a rule.\n- `agents/<agent>/` \u2014 the files that agent's own AGENT.md defines, each pruned to what it says\n the file holds, and its `redesign.md`, pruned as the planner's is. Drop an entry once that\n agent's instructions or the design docs say it, and drop any other file its instructions no\n longer name.\n\nPrune a preview agent's files together, and drop the whole folder when its agent is gone from `akb\nspec`. Drop anything a file says about how the product looks \u2014 colours, dimensions,\ncomponent detail belong in the app's `design.md`, not here \u2014 and fold a product fact worth\nkeeping into the lesson or the decision it supports.\n";
23098
23098
  }
23099
23099
  });
23100
23100
 
@@ -23102,7 +23102,7 @@ var init_prune_memory = __esm({
23102
23102
  var review_memory_default;
23103
23103
  var init_review_memory = __esm({
23104
23104
  "../cli/src/guide/review-memory.md"() {
23105
- review_memory_default = "# Review what the conversations settled\n\nRead each conversation given to you right through, then write what it settled into memory.\n\nChats and planning flows write no memory themselves. One turn cannot see where an exchange\nis going, so a \"what if\" thrown out and taken back three turns later used to land as a\ndecision. You read the whole exchange, so you can tell a decision from a passing thought \u2014\nand that judgement is the whole job.\n\n- **Read what you are given**: each card comes in its own `<conversation>` block: its summary,\n its `Worth noting` and `Overruled by the user` lines, then its chat and the comments the user\n left reviewing it, when it had any, the user's words as written and the agent's replies,\n oldest first. The card is archived, so it is complete and reviewed this once; open no card or\n transcript file.\n- **Keep them apart**: judge each block by itself; what one conversation settled never\n becomes a note for another's card or agents.\n- **Hold to the same bar**: \"What earns a note\" in `akb guide board` governs what you write,\n exactly as it governs a flow that writes one. A conversation that settled nothing earns no\n note, and most do not \u2014 writing nothing is a complete result.\n- **Only what the user settled**: a durable preference, constraint, decision or correction\n they stated. Your own proposal is not their decision, and neither is a question, a \"what\n if\", or a direction the conversation then moved off.\n- **Take the last word**: where they said one thing and then another, the later one stands.\n Where a note already in the file says what they have since overturned, rewrite that note in\n place \u2014 never leave both and never add a second.\n- **Honour \"don't record this\"**: told in the conversation not to record something, write no\n note for it. If one is already there from an earlier review, delete it now.\n- **Where it goes**: a durable choice goes in the planner's `decisions.md` as one\n `**<key>**: <call>` line under the topic that fits, without its rationale; a design lesson\n goes in its `redesign.md` under the relevant topic as\n `- \u274C **<mistake>** \u2192 \u2705 <what the design should be instead, one line>.`, written as guidance\n for future tasks, not a history of the fix. Both go in the folder of the module each\n conversation is listed with (`akb guide board`). Each conversation also lists the agents\n whose sections its card holds and the memory files each keeps: where what was settled lands\n on one agent's own work, it goes in that agent's memory instead. Read that agent's AGENT.md\n (`akb raw agent-file <agent> AGENT.md`) only then, and keep its memory the way it says.\n Distill settled feedback into reusable preferences (dos) and corrections (don'ts), retaining\n their scope; never copy raw reviews. An agent whose instructions name no memory gets no new file.\n- **What the card settled**: the summary says what the card was about and earns no note. A\n `Worth noting` line is a decision the user approved, by answering it or letting it stand, so\n it can be a choice but never a correction, and it earns a planner note only where the user's\n own words in the conversation back it; a line under\n `Overruled by the user` is a call the user reversed, so it goes in `redesign.md`: that of\n the agent whose section it came from, or the planner's when none did.\n- **Change nothing else**: no card, no open question, no code. The memory\n files are the whole of what this run writes.\n- **Say what you wrote**: finish by reporting each conversation you read, and for each the\n notes you added, rewrote, deleted, or that you wrote none.\n";
23105
+ review_memory_default = "# Review what the conversations settled\n\nRead each conversation given to you right through, then write what it settled into memory.\n\nChats and planning flows write no memory themselves. One turn cannot see where an exchange\nis going, so a \"what if\" thrown out and taken back three turns later used to land as a\ndecision. You read the whole exchange, so you can tell a decision from a passing thought \u2014\nand that judgement is the whole job.\n\n- **Read what you are given**: each card comes in its own `<conversation>` block: its summary,\n its `Worth noting` and `Overruled by the user` lines, then its chat and the comments the user\n left reviewing it, when it had any, the user's words as written and the agent's replies,\n oldest first. The card is archived, so it is complete and reviewed this once; open no card or\n transcript file.\n- **Keep them apart**: judge each block by itself; what one conversation settled never\n becomes a note for another's card or agents.\n- **Hold to the same bar**: \"What earns a note\" in `akb guide board` governs what you write,\n exactly as it governs a flow that writes one. A conversation that settled nothing earns no\n note, and most do not \u2014 writing nothing is a complete result.\n- **Only what the user settled**: a durable preference, constraint, decision or correction\n they stated. Your own proposal is not their decision, and neither is a question, a \"what\n if\", or a direction the conversation then moved off.\n- **Take the last word**: where they said one thing and then another, the later one stands.\n Where a note already in the file says what they have since overturned, rewrite that note in\n place \u2014 never leave both and never add a second.\n- **Honour \"don't record this\"**: told in the conversation not to record something, write no\n note for it. If one is already there from an earlier review, delete it now.\n- **Where it goes**: a durable choice goes in the planner's `decisions.md` as one\n `**<key>**: <call>` line under the topic that fits, without its rationale; a design lesson\n goes in its `redesign.md` under the relevant topic as\n `- \u274C **<mistake>** \u2192 \u2705 <what the design should be instead, one line>.`, written as guidance\n for future tasks, not a history of the fix. Both go in the folder of the module each\n conversation is listed with (`akb guide board`). Each conversation also lists the agents\n whose sections its card holds and the memory files each keeps: where what was settled lands\n on one agent's own work, it goes in that agent's memory instead. Read that agent's AGENT.md\n (`akb raw agent-file <agent> AGENT.md`) only then, and keep its memory the way it says.\n Distill settled feedback into reusable preferences (dos) and corrections (don'ts), retaining\n their scope; never copy raw reviews. An agent whose instructions name no memory gets no new file.\n- **What the card settled**: the summary says what the card was about and earns no note. A\n `Worth noting` line is a decision the user approved, by answering it or letting it stand, so\n it can be a choice but never a correction, and it earns a planner note only where the user's\n own words in the conversation back it; a line under\n `Overruled by the user` is a call the user reversed, so it goes in `redesign.md`: that of\n the agent whose section it came from, created there even if its instructions name other\n files, or the planner's when none did or its instructions name no memory.\n- **Change nothing else**: no card, no open question, no code. The memory\n files are the whole of what this run writes.\n- **Say what you wrote**: finish by reporting each conversation you read, and for each the\n notes you added, rewrote, deleted, or that you wrote none.\n";
23106
23106
  }
23107
23107
  });
23108
23108
 
@@ -23126,7 +23126,7 @@ var init_refine = __esm({
23126
23126
  var reflect_default;
23127
23127
  var init_reflect = __esm({
23128
23128
  "../cli/src/guide/reflect.md"() {
23129
- reflect_default = '# Reflect on completed cards\n\n## Read\n\nRead each given `<card>` in full and check its own `shipped` content; keep cards separate.\nFind needs the work left behind or revealed, and verify them in the project. Proposing nothing is fine.\n\n## Filter\n\n- **Duplicates**: check `akb raw list` and `akb triage check <source-id>`; propose shared work only once.\n- **Exclude**: skip unsupported guesses, work covered by `<scheduled-agents>`, work rejected in `docs/kanban/memory/agents/planner/rejected.md` or its module folders, and calls the user reversed, in the `redesign.md` beside each of those files or under a card\'s `Overruled by the user`.\n- **Existing cards**: when shipped work invalidates an open card\'s plan, run `akb card revise <id> "<the change and why>"` instead of proposing an item.\n\n## Write\n\n- **Reader**: someone who has read neither the original card nor the code can decide in ten seconds whether the work is worth doing.\n- **Order**: first explain what happened and what the user runs into, then say what the work would do.\n- **Plain words**: keep file, function and field names, card ids, agent names and evidence trails out of the title and body.\n\nWrite the body to a temporary Markdown file and end with the source card\'s archive path.\nWrite one triage item per proposal. Exploratory ideas are welcome; identify small chores as such.\nUse the source card\'s `workflow:`, or the board default shown by `akb workflow` when it has none.\n\n```text\nakb triage add --title "<one line>" --slug <short-english-slug> --source "#<id>" --workflow <workflow> --file <body.md>\n```\n\nBriefly report what you proposed and what you skipped, with reasons.\n';
23129
+ reflect_default = '# Reflect on completed cards\n\n## Read\n\nRead each given `<card>` in full and check its own `shipped` content; keep cards separate.\nFind needs the work left behind or revealed, and verify them in the project. Proposing nothing is fine.\n\n## Filter\n\n- **Duplicates**: check `akb raw list` and `akb triage check <source-id>`; propose shared work only once.\n- **Exclude**: skip unsupported guesses, work covered by `<scheduled-agents>`, work rejected in `docs/kanban/memory/agents/planner/rejected.md` or its module folders, and calls the user reversed, in any `redesign.md` under `docs/kanban/memory/agents/` or under a card\'s `Overruled by the user`.\n- **Existing cards**: when shipped work invalidates an open card\'s plan, run `akb card revise <id> "<the change and why>"` instead of proposing an item.\n\n## Write\n\n- **Reader**: someone who has read neither the original card nor the code can decide in ten seconds whether the work is worth doing.\n- **Order**: first explain what happened and what the user runs into, then say what the work would do.\n- **Plain words**: keep file, function and field names, card ids, agent names and evidence trails out of the title and body.\n\nWrite the body to a temporary Markdown file and end with the source card\'s archive path.\nWrite one triage item per proposal. Exploratory ideas are welcome; identify small chores as such.\nUse the source card\'s `workflow:`, or the board default shown by `akb workflow` when it has none.\n\n```text\nakb triage add --title "<one line>" --slug <short-english-slug> --source "#<id>" --workflow <workflow> --file <body.md>\n```\n\nBriefly report what you proposed and what you skipped, with reasons.\n';
23130
23130
  }
23131
23131
  });
23132
23132
 
@@ -23154,14 +23154,6 @@ var init_preview_agent = __esm({
23154
23154
  }
23155
23155
  });
23156
23156
 
23157
- // ../cli/src/guide/update.md
23158
- var update_default;
23159
- var init_update = __esm({
23160
- "../cli/src/guide/update.md"() {
23161
- update_default = "# Updating the board\n\nUpdating is two things, and nothing else: **a newer `akb`, then a repaired board.** There\nis no third step where the skill is re-installed to pick up a fixed flow \u2014 the flows ship\ninside the command, so a newer command is a newer set of flows everywhere at once.\n\n## 1. A newer command\n\n```\nnpm install -g wildcrane@latest\n```\n\n`akb update` can't do this one to itself \u2014 replacing the file that is running is how you\nget half a command \u2014 so it checks npm and names this line when it is behind.\n\nStill on the old `ai4kanban` package? Run `npm uninstall -g ai4kanban` first; both install `akb`.\n\n## 2. A repaired board\n\n```\nakb update\n```\n\nRun it from the project root. It does the whole mechanical part:\n\n- rewrites the installed `SKILL.md` (the note) in whichever of `.claude/skills/kanban/`\n (Claude Code) and `.agents/skills/kanban/` (Codex) is already there, wholesale, which also\n clears out what older versions left beside it: the `references/` folder of copied flows,\n a skill-folder `config.md`, and the command's own `kanban.mjs`. The note is the whole\n skill now \u2014 the command comes from npm, so the update is two deletions to commit. It never\n adds a folder that isn't there: the skill is an extra a project opts into, so a project\n without one is not broken, and `akb skill install` is how it is added,\n- adds what an older version never wrote: `config.md`, `modules.md`, the planner's memory folder,\n an empty `docs/kanban/memory/project.md`,\n- deletes `releases.md` and every card's `release` field, keeping\n `.release-summaries/` as a record,\n- renames `docs/kanban/memory/product.md` to `project.md`,\n- moves a goal the user wrote in `docs/kanban/memory/goal.md` to the top of the planner's\n `decisions.md` and deletes the file,\n- moves a memory set still sitting at the board root into `docs/kanban/memory/`,\n- moves the memory onto whoever writes it: `decisions.md`, `rejected.md` and `redesign.md`\n merge into `docs/kanban/memory/agents/planner/<module>/` (the board's own copy into\n `planner/`), each module's `readme.md` merges into `docs/kanban/memory/readme.md`, and a\n `## <module>` topic in a planner file moves into that module's folder \u2014 merged, never\n overwritten, and only once,\n- rescues a filled-in `config.md` left inside an old skill folder to\n `docs/kanban/config.md`,\n- prints which version you moved from and to, with a link to everything that changed\n between those two releases.\n\n**The one rule: `docs/kanban/` is yours; the two installed files are upstream's and get\noverwritten wholesale. Never merge the two.** It is safe to run twice, and it never edits\nyour cards, your config, or your memory.\n\n## Then read what it printed\n\nAnything the command can't decide comes back under **Needs your attention**. Each line is\nyours to finish:\n\n- **A new config setting.** Add that one line to `docs/kanban/config.md` and ask the user\n only for the new value. Leave the rest of the config alone.\n- **A blank `docs/kanban/modules.md`.** Write it per `akb guide module-map`, then run\n `akb update` again so every module gets a memory path.\n- **A per-module `goal.md`.** Fold what it says into that module's `decisions.md` in\n `docs/kanban/memory/agents/planner/<module>/`, then delete it.\n- **A `docs/kanban/config.from-skill.md`.** An old skill folder held a config that differs\n from the board's. Fold anything worth keeping into `docs/kanban/config.md`, then delete it.\n- **A missing agent folder.** Only one of the two is here, or neither. `akb skill install`\n writes them if you want that agent to see the board too \u2014 it is never added behind the\n user's back.\n\nLeave the project-wide notes and the cards alone \u2014 don't move notes into the module paths,\nand don't hand-add `modules:` lines to cards.\n\n## Plugin install (the note lives in the plugin cache)\n\nThe plugin cache is read-only, so the note comes from the marketplace instead:\n\n```\n/plugin marketplace update kanban\n/plugin install kanban@kanban\n```\n\nThen run `akb update` anyway \u2014 it repairs the board, which the plugin never touches.\n\n## Verify\n\n```\nakb raw version\n```\n\nTell the user to review `git diff` before committing. The board app updates separately \u2014\nit says when a newer one is out and installs it from that notice.\n";
23162
- }
23163
- });
23164
-
23165
23157
  // ../cli/src/guide/update-questions.md
23166
23158
  var update_questions_default;
23167
23159
  var init_update_questions = __esm({
@@ -23231,7 +23223,6 @@ var init_guide = __esm({
23231
23223
  init_resolve2();
23232
23224
  init_revise();
23233
23225
  init_preview_agent();
23234
- init_update();
23235
23226
  init_update_questions();
23236
23227
  init_write_agent();
23237
23228
  init_writing();
@@ -23258,8 +23249,7 @@ var init_guide = __esm({
23258
23249
  { name: "reflect", when: "propose the work just-completed cards leave behind", text: reflect_default },
23259
23250
  { name: "preview-agent", when: "be a preview agent: write your one section of a card", text: preview_agent_default },
23260
23251
  { name: "write-agent", when: "create or change an agent, including one built from a skill \u2014 its AGENT.md, files, memory, and how to check it", text: write_agent_default },
23261
- { name: "module-map", when: "write or rebuild docs/kanban/modules.md", text: module_map_default },
23262
- { name: "update", when: "pull a newer version into a project that already has one", text: update_default }
23252
+ { name: "module-map", when: "write or rebuild docs/kanban/modules.md", text: module_map_default }
23263
23253
  ];
23264
23254
  guideNames = () => GUIDES.map((g) => g.name);
23265
23255
  RENAMED = {
@@ -24007,7 +23997,7 @@ function buildFlow(req, program2) {
24007
23997
  facts.push(
24008
23998
  ...field("memory", [
24009
23999
  `${rel(agentMemoryDir(PLANNER))}/<module>/ \u2014 decisions.md, rejected.md, redesign.md: where a planning note goes, the planner's own files for one spanning modules`,
24010
- `${rel(AGENT_MEMORY)}/<agent>/ \u2014 an agent's own files, which its AGENT.md names`
24000
+ `${rel(AGENT_MEMORY)}/<agent>/ \u2014 an agent's own files, which its AGENT.md names, and its redesign.md`
24011
24001
  ])
24012
24002
  );
24013
24003
  for (const chat of chats) facts.push("", ...conversationBlock(chat));
@@ -25801,12 +25791,12 @@ var SAID = {
25801
25791
  en: "Could not reach WildCrane Cloud. Check your connection and try again."
25802
25792
  },
25803
25793
  credits_used_up: {
25804
- zh: "\u672C\u6708\u79EF\u5206\u5DF2\u7528\u5B8C\uFF0C\u4E0B\u6708 1 \u65E5\uFF08UTC\uFF09\u91CD\u7F6E\uFF1B\u53EF\u5728\u684C\u9762\u5E94\u7528\u7684 Billing \u9875\u67E5\u770B\u4F59\u989D\u3002",
25805
- en: "This month\u2019s AI credits are used up. They reset on the 1st of next month (UTC); check your balance on the Billing page in the desktop app."
25794
+ zh: "\u672C\u6708\u79EF\u5206\u5DF2\u7528\u5B8C\uFF0C\u4E0B\u6708 1 \u65E5\uFF08UTC\uFF09\u91CD\u7F6E\uFF1B\u53EF\u5728 WildCrane \u7F51\u9875\u8BBE\u7F6E\u4E2D\u67E5\u770B\u4F59\u989D\u3002",
25795
+ en: "This month\u2019s AI credits are used up. They reset on the 1st of next month (UTC); check your balance in WildCrane web settings."
25806
25796
  },
25807
25797
  trial_credits_used_up: {
25808
- zh: "\u8BD5\u7528\u671F\u7684 AI \u79EF\u5206\u5DF2\u7528\u5B8C\u3002\u8BD5\u7528\u7ED3\u675F\u540E\u53EF\u5728\u684C\u9762\u5E94\u7528\u7684 Billing \u9875\u8D2D\u4E70 Pro\u3002",
25809
- en: "Your trial\u2019s AI credits are used up. Get Pro from the Billing page in the desktop app once the trial ends."
25798
+ zh: "\u8BD5\u7528\u671F\u7684 AI \u79EF\u5206\u5DF2\u7528\u5B8C\u3002\u8BD5\u7528\u7ED3\u675F\u540E\u53EF\u5728 WildCrane \u7F51\u9875\u8BBE\u7F6E\u4E2D\u8D2D\u4E70 Pro\u3002",
25799
+ en: "Your trial\u2019s AI credits are used up. Get Pro from WildCrane web settings once the trial ends."
25810
25800
  }
25811
25801
  };
25812
25802
  var REF_TYPES = {
@@ -1 +1 @@
1
- {"name":"wildcrane","version":"0.11.4","akbContract":2,"type":"module","private":true}
1
+ {"name":"wildcrane","version":"0.11.5","akbContract":2,"type":"module","private":true}
package/dist/launcher.mjs CHANGED
@@ -1,4 +1,4 @@
1
- // wildcrane-runner 0.6.5 — built by runner/scripts/build.mjs. Do not edit.
1
+ // wildcrane-runner 0.6.6 — built by runner/scripts/build.mjs. Do not edit.
2
2
  import { createRequire as __ai4kanbanRequire } from 'node:module'
3
3
  const require = __ai4kanbanRequire(import.meta.url)
4
4
 
@@ -50,8 +50,8 @@ function cloudEndpoints() {
50
50
  }
51
51
 
52
52
  // src/i18n.ts
53
- var ZH_HOLDER = { "claude-code": "Claude Code", codex: "Codex", terminal: "\u672C\u673A\u7EC8\u7AEF", desktop: "WildCrane \u684C\u9762\u7AEF" };
54
- var EN_HOLDER = { "claude-code": "Claude Code", codex: "Codex", terminal: "the terminal", desktop: "the WildCrane desktop app" };
53
+ var ZH_HOLDER = { "claude-code": "Claude Code", codex: "Codex", terminal: "\u672C\u673A\u7EC8\u7AEF" };
54
+ var EN_HOLDER = { "claude-code": "Claude Code", codex: "Codex", terminal: "the terminal" };
55
55
  var ZH = {
56
56
  signIn: (url) => `\u8BF7\u5728\u6D4F\u89C8\u5668\u4E2D\u767B\u5F55 WildCrane\uFF1A
57
57
  ${url}`,
@@ -70,13 +70,7 @@ ${url}`,
70
70
  const who = holder ? ZH_HOLDER[holder] : "\u672C\u673A\u53E6\u4E00\u4E2A\u7A0B\u5E8F";
71
71
  return `${who}\u5DF2\u5728\u8FD0\u884C\u4E00\u4E2A WildCrane \u5B9E\u4F8B\uFF0C\u8D1F\u8D23\u63A5\u6536\u6240\u6709\u8FD0\u884C\u4EFB\u52A1\u3002\u5F53\u524D\u5B9E\u4F8B\u5DF2\u6682\u505C\uFF0C${who}\u5173\u95ED\u540E\u5C06\u7531\u5F53\u524D\u5B9E\u4F8B\u63A5\u66FF\u3002`;
72
72
  },
73
- stopped: () => "\u5DF2\u505C\u6B62",
74
- reviewTitle: () => "\u5F85\u4F60\u5BA1\u6838",
75
- reviewBody: (task) => `\u300C${task}\u300D\u5F85\u5BA1\u6838`,
76
- doneTitle: () => "\u4EFB\u52A1\u5DF2\u5B8C\u6210",
77
- failedTitle: () => "\u4EFB\u52A1\u5931\u8D25",
78
- commentTitle: (task) => `\u300C${task}\u300D\u6709\u65B0\u8BC4\u8BBA`,
79
- commentBody: (who, text) => `${who}\uFF1A${text}`
73
+ stopped: () => "\u5DF2\u505C\u6B62"
80
74
  };
81
75
  var EN = {
82
76
  signIn: (url) => `Sign in to WildCrane in your browser:
@@ -96,13 +90,7 @@ ${url}`,
96
90
  const who = holder ? EN_HOLDER[holder] : "another app on this computer";
97
91
  return `${who[0].toUpperCase()}${who.slice(1)} is already running a WildCrane instance that takes all run tasks. This instance is paused and takes over when ${who} closes.`;
98
92
  },
99
- stopped: () => "Stopped",
100
- reviewTitle: () => "Needs your review",
101
- reviewBody: (task) => `"${task}" is ready for review`,
102
- doneTitle: () => "Task finished",
103
- failedTitle: () => "Task failed",
104
- commentTitle: (task) => `New comment on ${task}`,
105
- commentBody: (who, text) => `${who}: ${text}`
93
+ stopped: () => "Stopped"
106
94
  };
107
95
  function isChinese(env = process.env) {
108
96
  const lang = env.LC_ALL || env.LC_MESSAGES || env.LANG || Intl.DateTimeFormat().resolvedOptions().locale;
@@ -119,7 +107,7 @@ function status(line) {
119
107
  }
120
108
 
121
109
  // src/protocol.ts
122
- var VERSION = true ? "0.6.5" : "0.0.0";
110
+ var VERSION = true ? "0.6.6" : "0.0.0";
123
111
  var EXIT_REFUSED = 10;
124
112
  var EXIT_OUTDATED = 11;
125
113
 
@@ -297,7 +285,6 @@ async function candidates(own) {
297
285
  const current = proven && compare(proven, own.version) > 0 ? { version: proven, entry: entryOf(versionDir(proven)) } : own;
298
286
  const target = await askTarget(machineId());
299
287
  if (!target || target === current.version || state.bad.includes(target)) return [current];
300
- if (process.env.WILDCRANE_DESKTOP && compare(target, own.version) < 0) return [current];
301
288
  if (target === own.version) return [own, current];
302
289
  const got = await install(target);
303
290
  if (got.ok) {