kaizen-agent 1.5.2 → 1.5.4

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
@@ -240,15 +240,15 @@ itself as your agents write to disk — a run that moves while you are looking a
240
240
  screen.
241
241
 
242
242
  ```
243
- Board ~/code/acme-api
243
+ Board ~/work/acme
244
244
 
245
245
  IDEA PLANNING BUILDING REVIEW DONE
246
246
  ────────────────────── ─────────────────── ──────────────── ───────────── ──────────────
247
- › · rate limit the ◌ nightly digest ● payroll export ● oauth login ○ rename cli
248
- public API flags
249
- ● landing page ○ csv import
250
- · retry failed
251
- webhooks
247
+ › · FAQ page for the ● q3 board memo ◐ billing runbook ● pricing ○ chapter three
248
+ pricing change email
249
+ ● oauth login ○ pricing
250
+ · onboarding video research
251
+ script, two minutes
252
252
 
253
253
  ↑↓←→ move n new e edit x reject d delete r run a all projects q back
254
254
  ● running ◐ stalled ◌ starting ● waiting on you ○ done · idea
@@ -288,14 +288,17 @@ serves the same board on `http://127.0.0.1:7420/` — loopback only, no account
288
288
  opens it in a Chromium-family browser as an app window when one is installed, otherwise
289
289
  in a tab.
290
290
 
291
- <img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/main/assets/web-board.png" alt="kaizen web board" width="760">
291
+ <img src="https://raw.githubusercontent.com/hfadhlullah/kaizen/main/assets/board-web.png" alt="kaizen web board" width="760">
292
292
 
293
293
  Same columns, same files: an idea added here lands in `inbox.md`, a run
294
294
  started here opens your agent in a new terminal exactly as `r` does, and the board
295
295
  redraws as your agents write to disk. Mouse first; the TUI's keys still work. Click a card for its plan, review and
296
- backlog; `⋯` on a card runs, edits, rejects or abandons. Theme lives in its settings;
296
+ backlog; `⋯` on a card runs, edits, rejects, abandons or archives. `Clear` on Done sends
297
+ every finished run to the archive (`.kaizen/archive.md`, a list, nothing moves), and
298
+ `Archive` in the strip shows what is there, with `Restore` on each card. Theme lives in its settings;
297
299
  everything else is still `kaizen settings`. `--port N` picks a port, `--no-open` just
298
- serves, `?all=1` in the URL opens on every project.
300
+ serves, `?all=1` in the URL opens on every project. `--daemon` starts the server
301
+ detached so it outlives the terminal (pid kept in `~/.kaizen/web.pid`); `--stop` ends it.
299
302
 
300
303
  ### Mouse
301
304
 
package/cli/dashboard.ts CHANGED
@@ -502,6 +502,7 @@ export async function dashboard(
502
502
  const now = Date.now();
503
503
  const next: Drawn[] = [];
504
504
  for (const k of boardCards(states(), now)) {
505
+ if (k.archived) continue; // cleared from the board; kaizen web shows the archive
505
506
  if (k.kind === "run") {
506
507
  const key = `${k.state}/${k.id}`;
507
508
  const before = wasAwaiting.get(key);
package/cli/install.ts CHANGED
@@ -210,9 +210,44 @@ if (wantSettings) {
210
210
  }
211
211
 
212
212
  if (wantWeb) {
213
- const { web } = await import("./web.ts");
214
213
  const at = Bun.argv.indexOf("--port");
215
214
  const port = at !== -1 ? Number(Bun.argv[at + 1]) || undefined : undefined;
215
+ const url = `http://127.0.0.1:${port ?? 7420}/`;
216
+ const pidFile = join(home, ".kaizen", "web.pid");
217
+ const alive = async () => { try { await fetch(url); return true; } catch { return false; } };
218
+
219
+ if (args.has("--stop")) {
220
+ const pid = existsSync(pidFile) ? Number(readFileSync(pidFile, "utf8")) : NaN;
221
+ if (!pid) { console.log(" no kaizen web daemon recorded"); process.exit(0); }
222
+ try { process.kill(pid, "SIGTERM"); console.log(` stopped kaizen web (pid ${pid})`); }
223
+ catch { console.log(` pid ${pid} already gone; cleared the stale record`); }
224
+ rmSync(pidFile, { force: true });
225
+ process.exit(0);
226
+ }
227
+
228
+ if (args.has("--daemon")) {
229
+ // The daemon is this same command, detached, with the browser left to us:
230
+ // ignored stdio is what lets it outlive the terminal.
231
+ if (await alive()) {
232
+ console.log(` kaizen web already running at ${url}`);
233
+ } else {
234
+ const argv = Bun.argv.slice(2).filter((a) => a !== "--daemon" && a !== "--no-open");
235
+ const child = Bun.spawn([process.execPath, Bun.main, ...argv, "--no-open"], {
236
+ detached: true, stdio: ["ignore", "ignore", "ignore"],
237
+ });
238
+ child.unref();
239
+ mkdirSync(dirname(pidFile), { recursive: true });
240
+ writeFileSync(pidFile, String(child.pid));
241
+ for (let i = 0; i < 30 && !(await alive()); i++) await Bun.sleep(100);
242
+ if (!(await alive())) { console.log(` kaizen web did not come up on ${url}`); process.exit(1); }
243
+ console.log(`\n kaizen web ${url} (pid ${child.pid}, detached)`);
244
+ console.log(` kaizen web --stop to stop it\n`);
245
+ }
246
+ if (!args.has("--no-open")) await openUrl(url);
247
+ process.exit(0);
248
+ }
249
+
250
+ const { web } = await import("./web.ts");
216
251
  await web(await resolveRepoQuietly(), { port, open: !args.has("--no-open") });
217
252
  process.exit(0);
218
253
  }
package/cli/state.test.ts CHANGED
@@ -6,7 +6,7 @@ import { join } from "node:path";
6
6
  import { tmpdir } from "node:os";
7
7
  import {
8
8
  readRuns, readInbox, writeInbox, replaceIdea, abandonRun, allBacklog, backlog,
9
- statusOf, columnOf, parseItem, startedRuns, boardCards,
9
+ statusOf, columnOf, parseItem, startedRuns, boardCards, readArchive, setArchived,
10
10
  } from "./state.ts";
11
11
 
12
12
  let state: string;
@@ -104,3 +104,19 @@ test("parseItem: finding line splits into where, severity, text", () => {
104
104
  test("startedRuns: normalised request bodies", () => {
105
105
  expect(startedRuns(state).sort()).toEqual(["# request add oauth login", "# request rename cli flags"]);
106
106
  });
107
+
108
+ test("archive: a run is listed, hidden by flag, never moved", () => {
109
+ setArchived(state, "2026-09-02-done", true);
110
+ expect([...readArchive(state)]).toEqual(["2026-09-02-done"]);
111
+ const card = boardCards([state], Date.now()).find((k) => k.id === "2026-09-02-done")!;
112
+ expect([card.archived, card.column]).toEqual([true, 4]);
113
+ setArchived(state, "2026-09-02-done", false);
114
+ expect(readArchive(state).size).toBe(0);
115
+ expect(boardCards([state], Date.now()).find((k) => k.id === "2026-09-02-done")!.archived).toBe(false);
116
+ });
117
+
118
+ test("archive: an idea keeps its line with status archived", () => {
119
+ writeInbox(state, [{ status: "open", text: "park this" }, { status: "archived", text: "parked zq7" }]);
120
+ const ideas = boardCards([state], Date.now()).filter((k) => k.kind === "idea");
121
+ expect(ideas.map((k) => [k.text, k.archived])).toEqual([["park this", false], ["parked zq7", true]]);
122
+ });
package/cli/state.ts CHANGED
@@ -7,7 +7,7 @@ import { homedir } from "node:os";
7
7
 
8
8
  export const home = homedir();
9
9
 
10
- export type Run = { id: string; stage: string; awaiting: string | null; moved: number };
10
+ export type Run = { id: string; stage: string; awaiting: string | null; moved: number; runner?: string; agent?: string };
11
11
 
12
12
  export const KNOWN_AGENTS = [
13
13
  { name: "Claude Code", dir: ".claude", cmd: "claude" },
@@ -202,7 +202,7 @@ export function readRuns(state: string): Run[] {
202
202
  // own mtime is the only evidence that anything is still working on it.
203
203
  let moved = 0;
204
204
  try { moved = statSync(file).mtimeMs; } catch { /* vanished mid-read */ }
205
- return [{ id, stage: s.stage ?? "?", awaiting: s.awaiting ?? null, moved }];
205
+ return [{ id, stage: s.stage ?? "?", awaiting: s.awaiting ?? null, moved, runner: s.runner, agent: s.agent }];
206
206
  } catch { return []; }
207
207
  }).reverse();
208
208
  }
@@ -307,6 +307,8 @@ export type Card = {
307
307
  dim: boolean;
308
308
  moved?: number; // runs only: state.json mtime
309
309
  title?: string; // runs only: first line of the request
310
+ archived: boolean; // hidden from the board unless asked for
311
+ tags?: string[]; // runs only: runner and agent, when recorded
310
312
  };
311
313
 
312
314
  // A run is called running on the evidence that it moved recently; there is no PID
@@ -362,7 +364,7 @@ export function readInbox(state: string): InboxLine[] {
362
364
  const f = join(state, "inbox.md");
363
365
  if (!existsSync(f)) return [];
364
366
  return readFileSync(f, "utf8").split("\n")
365
- .map((l) => /^-\s*(open|started|done|rejected):\s*(.+)$/.exec(l.trim()))
367
+ .map((l) => /^-\s*(open|started|done|rejected|archived):\s*(.+)$/.exec(l.trim()))
366
368
  .filter((m): m is RegExpExecArray => !!m)
367
369
  .map((m) => ({ status: m[1]!, text: m[2]!.trim() }));
368
370
  }
@@ -425,6 +427,30 @@ export function replaceIdea(state: string, text: string, next: InboxLine | null)
425
427
  writeInbox(state, lines);
426
428
  }
427
429
 
430
+ // Archived runs stay exactly where they are on disk -- run directories are never
431
+ // moved or renamed, that is the resume contract -- and are listed here instead.
432
+ // One id per line; the board hides them unless asked for the archive.
433
+ export function readArchive(state: string): Set<string> {
434
+ const f = join(state, "archive.md");
435
+ if (!existsSync(f)) return new Set();
436
+ return new Set(readFileSync(f, "utf8").split("\n")
437
+ .map((l) => /^-\s*(\S+)/.exec(l.trim())?.[1])
438
+ .filter((x): x is string => !!x));
439
+ }
440
+
441
+ export function writeArchive(state: string, ids: Set<string>) {
442
+ mkdirSync(state, { recursive: true });
443
+ const body = ["# Archive", "", "Runs cleared from the board. One id per line; delete a line to bring it back.", "",
444
+ ...[...ids].sort().map((id) => `- ${id}`)];
445
+ writeFileSync(join(state, "archive.md"), body.join("\n") + "\n");
446
+ }
447
+
448
+ export function setArchived(state: string, id: string, archived: boolean) {
449
+ const ids = readArchive(state);
450
+ if (archived) ids.add(id); else ids.delete(id);
451
+ writeArchive(state, ids);
452
+ }
453
+
428
454
  // The request's first real line: not a heading, not a label ending in a colon,
429
455
  // quote marker dropped. Long enough to recognise the run, short enough for a card.
430
456
  export function requestTitle(text: string) {
@@ -458,16 +484,17 @@ export function boardCards(states: string[], now: number): Card[] {
458
484
  }
459
485
  for (const st of states) {
460
486
  const where = label(st);
487
+ const archive = readArchive(st);
461
488
  for (const it of readInbox(st)) {
462
- if (it.status !== "open" && it.status !== "started") continue;
489
+ if (it.status !== "open" && it.status !== "started" && it.status !== "archived") continue;
463
490
  // Retired once any run's request contains this text -- whoever started it.
464
491
  // Checking `started` items only would leave every idea acted on outside the
465
492
  // board sitting in IDEA forever, and typing `/kaizen ...` in a terminal is
466
493
  // the common way a run begins.
467
494
  if (requests.some((r) => r.includes(normalise(it.text)))) continue;
468
495
  next.push(it.status === "started"
469
- ? { kind: "idea", status: "starting", text: it.text, state: st, where, column: 1, awaiting: null, dim: true }
470
- : { kind: "idea", status: "idea", text: it.text, state: st, where, column: 0, awaiting: null, dim: false });
496
+ ? { kind: "idea", status: "starting", text: it.text, state: st, where, column: 1, awaiting: null, dim: true, archived: false }
497
+ : { kind: "idea", status: "idea", text: it.text, state: st, where, column: 0, awaiting: null, dim: false, archived: it.status === "archived" });
471
498
  }
472
499
  for (const r of readRuns(st)) {
473
500
  next.push({
@@ -475,6 +502,8 @@ export function boardCards(states: string[], now: number): Card[] {
475
502
  title: requestTitle(body(st, r.id)),
476
503
  awaiting: r.stage === "abandoned" ? null : r.awaiting,
477
504
  dim: r.stage === "abandoned",
505
+ archived: archive.has(r.id),
506
+ tags: [r.runner, r.agent].filter((t): t is string => !!t),
478
507
  });
479
508
  }
480
509
  }
package/cli/web.ts CHANGED
@@ -4,7 +4,7 @@ import { existsSync, readFileSync, readdirSync, statSync, watch, type FSWatcher
4
4
  import { join, dirname } from "node:path";
5
5
  import {
6
6
  home, type Item, boardCards, knownProjects, remember, locate, label, tilde,
7
- readInbox, writeInbox, replaceIdea, abandonRun, launchRun, parseItem, short,
7
+ readInbox, writeInbox, replaceIdea, abandonRun, launchRun, parseItem, short, setArchived,
8
8
  } from "./state.ts";
9
9
 
10
10
  const PAGE = join(dirname(import.meta.dir), "web", "board.html");
@@ -61,7 +61,7 @@ export async function web(repoDir: string, opts: Opts = {}) {
61
61
  const fingerprint = () => {
62
62
  let sum = 0;
63
63
  for (const dir of states(true)) {
64
- for (const f of ["inbox.md", "backlog.md"]) { try { sum += statSync(join(dir, f)).mtimeMs; } catch { /* absent */ } }
64
+ for (const f of ["inbox.md", "backlog.md", "archive.md"]) { try { sum += statSync(join(dir, f)).mtimeMs; } catch { /* absent */ } }
65
65
  const runs = join(dir, "runs");
66
66
  if (!existsSync(runs)) continue;
67
67
  for (const id of readdirSync(runs)) { try { sum += statSync(join(runs, id, "state.json")).mtimeMs; } catch { /* absent */ } }
@@ -166,6 +166,25 @@ export async function web(repoDir: string, opts: Opts = {}) {
166
166
  : { ok: false, why: r.why, manual: r.manual, agent: r.agent }, r.ok ? 200 : 500);
167
167
  }
168
168
 
169
+ // Archive is a list beside the runs, never a move: a run keeps its directory
170
+ // and its state, and the board simply stops showing it.
171
+ if (path === "/archive") {
172
+ const archived = body.archived !== false;
173
+ if (typeof body.id === "string") {
174
+ if (!/^[\w.-]+$/.test(body.id)) return bad("bad run id");
175
+ setArchived(dir, body.id, archived);
176
+ } else if (typeof body.text === "string") {
177
+ const text = body.text.trim();
178
+ const lines = readInbox(dir);
179
+ const at = lines.findIndex((l) => l.text === text && (archived ? l.status === "open" : l.status === "archived"));
180
+ if (at < 0) return bad("no such idea", 404);
181
+ lines[at] = { status: archived ? "archived" : "open", text };
182
+ writeInbox(dir, lines);
183
+ } else return bad("id or text required");
184
+ changed();
185
+ return json({ ok: true });
186
+ }
187
+
169
188
  if (path === "/abort") {
170
189
  const id = String(body.id ?? "");
171
190
  const why = String(body.why ?? "").trim() || "abandoned from the web board";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kaizen-agent",
3
- "version": "1.5.2",
3
+ "version": "1.5.4",
4
4
  "description": "Staged workflow for AI agents — code, writing, research, operations: plan, human approval, build, independent review, bounded fix loop.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -362,7 +362,7 @@ shown automatically.
362
362
  state.json
363
363
  ```
364
364
 
365
- `state.json` is the resume point, and records the runner the run started with, so a
365
+ `state.json` is the resume point, and records the runner and the agent the run started with, so a
366
366
  run picked up later keeps the shape it was reviewed under rather than silently
367
367
  changing because a setting moved:
368
368
 
@@ -371,6 +371,7 @@ changing because a setting moved:
371
371
  "id": "2026-09-02-add-oauth",
372
372
  "mode": "approve",
373
373
  "runner": "full",
374
+ "agent": "claude",
374
375
  "stage": "review",
375
376
  "awaiting": "approvals.review",
376
377
  "iteration": 1,
@@ -101,9 +101,14 @@ sentence and either nods or says "no, this is a blog post". They are never asked
101
101
  categorize their own request up front.
102
102
 
103
103
  Write into `00-request.md`: the verbatim request, the deliverable, what done means,
104
- and what wrong means. Record in `state.json`: `id`, `mode`, `runner`, `track`,
104
+ and what wrong means. Record in `state.json`: `id`, `mode`, `runner`, `agent`, `track`,
105
105
  `stage: "plan"`, `awaiting: null`.
106
106
 
107
+ `agent` is the tool this run is happening in — `claude`, `codex`, `agy`, `opencode`,
108
+ `gemini`, or `cursor` — written once at intake and never changed, so a board can say
109
+ which agent to look for when a run is waiting. The tool running this stage knows what
110
+ it is; no detection is needed.
111
+
107
112
  `runner` is read from config at intake and written down here, because it decides
108
113
  whether the stages that follow are separate agents or this one. A run resumed later
109
114
  keeps the runner it started with: a review done in the same session as the work is a
package/web/board.html CHANGED
@@ -10,7 +10,7 @@
10
10
  :root[data-theme=dark]{--bg:#0c162f;--bg-2:#121e3c;--line:#22305a;--ink:#eef2fa;--ink-hi:#deeeff;--dim:#96aacd;--accent:#486ed9;--run:#4fd6e6;--ok:#5fd28a;--warn:#e6b450;--danger:#e85050;color-scheme:dark}
11
11
  *{box-sizing:border-box}
12
12
  :root{--r:6px;--r-s:4px}
13
- body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 ui-monospace,"JetBrains Mono","Cascadia Code","SF Mono",Menlo,Consolas,monospace;min-height:100vh;display:flex;flex-direction:column}
13
+ body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 ui-monospace,"JetBrains Mono","Cascadia Code","SF Mono",Menlo,Consolas,monospace;height:100vh;height:100dvh;overflow:hidden;display:flex;flex-direction:column}
14
14
  button,input,select{font:inherit;color:inherit;background:none;border:0;padding:0}
15
15
  button{cursor:pointer}
16
16
  :focus-visible{outline:2px solid var(--accent);outline-offset:2px}
@@ -40,8 +40,10 @@ pre.mark span:nth-child(1){color:var(--ink-hi)}pre.mark span:nth-child(2){color:
40
40
  .strip button.attn{color:var(--warn)}
41
41
 
42
42
  /* board */
43
- main{flex:1;display:grid;grid-template-columns:repeat(5,minmax(200px,1fr));gap:20px;padding:16px 24px;overflow:auto;align-content:start}
44
- section h2{margin:0;font-size:12px;color:var(--ink);font-weight:600;display:flex;align-items:center;gap:8px;height:30px}
43
+ main{flex:1;min-height:0;display:grid;grid-template-columns:repeat(5,minmax(200px,1fr));gap:20px;padding:0 24px 16px;overflow:auto;align-content:start}
44
+ section h2::before{content:"";display:block;height:16px;margin-top:-16px}
45
+ section{padding-top:16px}
46
+ section h2{margin:0;font-size:12px;color:var(--ink);font-weight:600;display:flex;align-items:center;gap:8px;height:30px;position:sticky;top:0;background:var(--bg);z-index:1}
45
47
  section h2 i{font-style:normal;font-weight:400}
46
48
  section h2 .ib{margin-left:auto}
47
49
  ul{list-style:none;margin:0;padding:8px 0 0;display:flex;flex-direction:column;gap:8px}
@@ -54,13 +56,24 @@ ul{list-style:none;margin:0;padding:8px 0 0;display:flex;flex-direction:column;g
54
56
  .card{background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);padding:10px 12px;cursor:pointer;display:flex;flex-direction:column;gap:6px;position:relative}
55
57
  .card:hover{border-color:var(--dim)}
56
58
  .card.open{border-color:var(--accent)}
59
+ .card.archived .c-title,.card.archived .c-id{opacity:.7}
60
+ section h2 .clear{margin-left:auto;min-height:22px;padding:0 8px}
61
+ section h2{position:sticky}
62
+ .clear-pop{top:30px;right:0;min-width:200px}
63
+ .clear-pop button i{font-style:normal;color:var(--dim);margin-left:auto}
64
+ .pickbar{margin-left:auto;display:flex;gap:4px}
65
+ .pickbar .btn.sm{min-height:22px;padding:0 8px}
66
+ .btn[disabled]{opacity:.5;cursor:default}
67
+ .card .pick{position:absolute;right:12px;top:12px;margin:0;accent-color:var(--accent)}
68
+ .card.picked{border-color:var(--accent)}
69
+ .card:has(.pick) .age,.card:has(.pick) .more{display:none}
57
70
  .c-id{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--dim);min-height:20px}
58
71
  .c-id .st{width:14px;height:14px;display:grid;place-items:center;flex-shrink:0}
59
72
  .c-id .st svg{width:14px;height:14px;stroke-width:1.8}
60
73
  .c-id .idt{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-variant-numeric:tabular-nums}
61
74
  .c-id .age{font-variant-numeric:tabular-nums}
62
75
  .c-id .more{display:none;margin:-4px -6px -4px 0}
63
- .card:hover .more,.card:focus-within .more,.card.menu .more{display:flex}
76
+ .card:hover .more,.card:focus-within .more,.card.menu .more{display:grid}
64
77
  .card:hover .age,.card.menu .age{display:none}
65
78
  .c-title{font-size:13px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;color:var(--ink)}
66
79
  .c-chips{display:flex;gap:6px;flex-wrap:wrap}
@@ -77,11 +90,13 @@ ul{list-style:none;margin:0;padding:8px 0 0;display:flex;flex-direction:column;g
77
90
  .d-run .pulse,.st.d-run svg{animation:pl 1.6s infinite}
78
91
  @keyframes pl{50%{opacity:.35}}
79
92
  /* hover menu */
80
- .menu-pop{position:absolute;right:8px;top:30px;background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);padding:4px;z-index:2;min-width:140px;display:flex;flex-direction:column}
93
+ .menu-pop{position:absolute;right:8px;top:30px;background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);padding:4px;z-index:3;min-width:140px;display:flex;flex-direction:column}
81
94
  .menu-pop button{text-align:left;padding:6px 10px;font-size:12px;color:var(--ink);border-radius:var(--r-s);display:flex;gap:8px;align-items:center}
82
95
  .menu-pop button:hover{background:color-mix(in srgb,var(--dim) 12%,transparent)}
83
96
  .menu-pop button.danger{color:var(--danger)}
84
97
  .menu-pop hr{border:0;border-top:1px solid var(--line);margin:4px 0}
98
+ .more-btn{width:100%;padding:8px;color:var(--dim);font-size:12px;border:1px dashed var(--line);border-radius:var(--r)}
99
+ .more-btn:hover{color:var(--ink);border-color:var(--dim)}
85
100
 
86
101
  /* inline forms replace a card while editing */
87
102
  .inl{display:flex;flex-direction:column;gap:8px;padding:10px 12px;background:var(--bg-2);border:1px solid var(--accent);border-radius:var(--r)}
@@ -90,7 +105,7 @@ ul{list-style:none;margin:0;padding:8px 0 0;display:flex;flex-direction:column;g
90
105
  .inl .row{display:flex;gap:6px;justify-content:flex-end}
91
106
  .inl .q{font-size:13px}.inl .q.dim{color:var(--dim)}
92
107
  .empty{grid-column:1/-1;display:flex;flex-direction:column;align-items:center;gap:14px;padding-block:60px;color:var(--dim)}
93
- .mascot{width:120px;height:112px;background:var(--ink);-webkit-mask:url(data:image/png;base64,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) center/contain no-repeat;mask:url(data:image/png;base64,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) center/contain no-repeat;animation:fi .2s}
108
+ .mascot{width:120px;height:112px;background:var(--ink);-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 428 400%22%3E%3Cpath fill=%22currentColor%22 fill-rule=%22evenodd%22 d=%22M130 381L122 362L119 346L119 325L124 305L123 294L119 288L117 288L115 285L109 282L89 264L89 262L82 256L82 254L79 252L79 250L76 248L76 246L73 244L70 237L68 236L58 216L53 201L49 182L48 166L45 166L39 170L19 177L7 178L2 176L0 173L0 163L4 157L4 154L7 150L7 147L10 143L16 126L20 120L26 103L30 97L30 94L34 88L37 78L41 72L44 62L48 56L48 53L52 47L52 44L56 38L59 28L64 20L67 10L70 7L247 0L252 4L253 11L250 18L243 25L243 27L209 60L207 60L203 65L201 65L197 70L195 70L191 75L189 75L186 79L180 82L169 92L164 93L161 90L162 85L169 81L171 78L173 78L176 74L178 74L181 70L183 70L186 66L193 62L197 57L199 57L205 50L207 50L235 23L235 21L242 14L244 9L241 9L226 14L220 18L217 18L199 27L198 29L190 32L189 34L183 36L182 38L178 39L177 41L173 42L167 47L163 48L156 54L152 55L151 57L149 57L148 59L146 59L145 61L143 61L142 63L140 63L139 65L137 65L136 67L134 67L133 69L131 69L130 71L116 79L114 82L106 86L104 89L99 91L93 97L88 99L86 102L84 102L82 105L80 105L78 108L76 108L74 111L72 111L70 114L68 114L66 117L64 117L62 120L56 123L53 127L51 127L48 131L41 135L37 140L35 140L15 159L15 161L11 164L9 169L21 167L30 164L34 161L37 161L45 156L48 156L50 140L57 132L71 131L75 133L79 138L81 138L87 135L88 133L94 131L95 129L104 126L107 129L106 134L82 147L82 156L85 172L92 188L94 189L94 194L92 196L88 196L84 192L79 182L74 164L73 144L69 140L62 140L58 144L58 182L62 200L68 217L76 232L82 239L82 241L92 252L92 254L107 269L109 269L112 273L114 273L128 285L132 292L133 307L128 325L128 345L131 361L140 382L149 390L160 392L191 381L228 377L238 373L251 362L251 360L254 358L255 354L258 351L261 341L261 322L259 315L253 304L243 294L232 288L220 285L203 286L188 292L176 303L176 305L170 313L167 323L168 345L178 363L187 370L187 375L184 377L179 376L169 366L161 352L158 341L158 323L162 309L167 300L170 298L170 296L181 286L194 279L207 276L221 276L234 279L244 284L249 289L251 289L263 303L270 322L270 342L266 355L260 363L260 365L257 367L257 369L247 378L243 379L240 382L253 386L263 391L277 391L281 389L290 379L298 358L300 347L300 323L296 307L297 298L302 292L318 287L333 279L335 276L337 276L339 273L341 273L345 268L349 266L349 264L355 259L351 251L349 242L345 243L341 247L329 253L309 258L290 258L276 255L274 257L262 261L236 266L192 266L154 257L130 245L129 243L121 239L119 236L117 236L101 220L101 218L98 216L96 212L95 207L107 192L113 180L119 159L121 157L121 151L118 146L118 142L115 135L114 112L117 101L124 92L129 90L138 90L146 92L159 99L169 109L184 103L204 99L231 100L244 103L259 109L264 103L266 103L268 100L270 100L271 98L280 93L290 90L302 91L309 97L314 112L314 130L311 143L307 152L307 156L310 161L316 182L325 198L332 205L333 210L328 219L322 224L322 226L317 231L315 231L310 237L308 237L306 240L296 245L292 249L309 249L325 245L341 236L347 230L350 210L360 193L360 187L355 178L355 174L357 172L387 172L389 177L384 187L385 195L387 194L391 182L394 180L401 180L415 187L426 190L428 193L428 202L423 211L423 214L421 216L421 219L419 221L419 224L417 226L417 229L415 231L415 234L413 236L413 239L411 241L405 258L402 260L395 260L390 257L388 259L366 259L361 264L361 266L340 285L318 297L307 300L305 302L305 307L309 325L318 323L325 319L334 310L334 308L337 306L341 298L354 283L356 283L362 277L377 271L394 271L400 273L407 277L415 285L420 294L423 306L421 323L416 335L408 344L408 346L401 353L399 353L397 356L395 356L388 362L369 370L353 373L330 373L304 367L301 377L297 385L294 387L294 389L288 395L279 400L261 400L240 391L216 387L192 390L167 400L150 400L139 394L132 386ZM130 155L119 189L116 192L112 201L106 207L107 210L119 207L126 200L134 185L136 184L137 180L149 166L163 158L171 156L180 156L191 160L198 166L202 173L204 182L203 192L195 205L194 216L196 220L205 227L212 229L221 228L227 225L233 219L234 207L225 191L225 177L233 163L235 163L237 160L241 158L248 156L262 157L278 165L289 177L289 179L295 186L297 192L299 193L300 197L309 207L316 210L323 209L313 196L307 184L304 171L297 154L302 142L305 129L304 107L301 101L298 99L291 99L278 104L261 119L257 119L243 112L224 108L197 109L185 112L171 119L167 119L163 114L161 114L157 109L155 109L150 104L138 99L130 99L126 103L123 113L123 128L125 138L131 152ZM380 280L372 282L361 289L361 306L364 310L375 312L382 317L384 321L384 337L386 339L390 341L400 341L408 331L413 319L413 301L409 292L400 283L393 280ZM144 187L141 193L139 194L138 198L134 202L134 204L131 206L131 208L125 214L123 214L120 217L113 218L113 220L124 230L126 230L128 233L138 238L139 240L156 248L180 255L201 258L226 258L257 253L277 246L291 239L292 237L303 231L315 220L315 218L306 216L298 209L298 207L291 199L290 195L288 194L287 190L285 189L281 181L271 171L257 165L245 166L241 168L235 175L234 190L242 203L243 217L240 224L234 231L221 237L207 237L201 235L194 229L192 229L186 220L185 207L187 201L193 193L195 185L193 175L187 168L179 165L171 165L164 167L158 172L156 172L148 180ZM367 179L364 179L367 185L367 195L362 204L360 205L355 219L355 240L357 247L361 253L383 253L388 245L390 236L389 218L383 203L377 195L377 185L380 179ZM319 362L330 364L360 363L376 358L387 352L389 349L382 347L376 341L375 323L371 320L362 319L359 316L357 316L353 310L351 300L348 306L343 311L343 313L333 324L331 324L329 327L320 332L309 334L309 348L307 358ZM130 59L132 59L133 57L147 49L149 46L76 18L66 105L72 100L74 100L76 97L78 97L80 94L82 94L84 91L89 89L91 86L93 86L95 83L97 83L105 76L113 72L115 69L129 61ZM213 204L218 204L225 208L224 213L217 218L211 218L207 216L203 210L205 206ZM39 96L20 142L26 136L28 136L33 130L35 130L38 126L40 126L43 122L45 122L48 118L50 118L53 114L56 113L64 41L56 57L56 60L52 66L49 76L45 82L42 92ZM194 11L101 14L95 16L98 16L100 18L103 18L105 20L108 20L110 22L113 22L115 24L118 24L120 26L123 26L125 28L128 28L130 30L133 30L135 32L138 32L140 34L143 34L145 36L148 36L159 41L164 37L168 36L169 34L173 33L174 31L178 30L179 28L213 11ZM409 203L413 193L412 191L404 189L400 186L396 186L394 190L390 203L395 213L397 230L401 223L407 205ZM418 210L421 200L423 198L423 196L418 195L412 212L407 221L407 224L405 226L405 229L403 231L403 234L401 236L401 239L399 241L399 244L397 246L397 249L395 251L396 254L400 254ZM182 191L178 195L170 194L167 190L168 182L172 179L180 180L183 183ZM256 194L250 195L245 190L245 184L250 179L256 179L261 184L261 190L258 194Z%22/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 428 400%22%3E%3Cpath fill=%22currentColor%22 fill-rule=%22evenodd%22 d=%22M130 381L122 362L119 346L119 325L124 305L123 294L119 288L117 288L115 285L109 282L89 264L89 262L82 256L82 254L79 252L79 250L76 248L76 246L73 244L70 237L68 236L58 216L53 201L49 182L48 166L45 166L39 170L19 177L7 178L2 176L0 173L0 163L4 157L4 154L7 150L7 147L10 143L16 126L20 120L26 103L30 97L30 94L34 88L37 78L41 72L44 62L48 56L48 53L52 47L52 44L56 38L59 28L64 20L67 10L70 7L247 0L252 4L253 11L250 18L243 25L243 27L209 60L207 60L203 65L201 65L197 70L195 70L191 75L189 75L186 79L180 82L169 92L164 93L161 90L162 85L169 81L171 78L173 78L176 74L178 74L181 70L183 70L186 66L193 62L197 57L199 57L205 50L207 50L235 23L235 21L242 14L244 9L241 9L226 14L220 18L217 18L199 27L198 29L190 32L189 34L183 36L182 38L178 39L177 41L173 42L167 47L163 48L156 54L152 55L151 57L149 57L148 59L146 59L145 61L143 61L142 63L140 63L139 65L137 65L136 67L134 67L133 69L131 69L130 71L116 79L114 82L106 86L104 89L99 91L93 97L88 99L86 102L84 102L82 105L80 105L78 108L76 108L74 111L72 111L70 114L68 114L66 117L64 117L62 120L56 123L53 127L51 127L48 131L41 135L37 140L35 140L15 159L15 161L11 164L9 169L21 167L30 164L34 161L37 161L45 156L48 156L50 140L57 132L71 131L75 133L79 138L81 138L87 135L88 133L94 131L95 129L104 126L107 129L106 134L82 147L82 156L85 172L92 188L94 189L94 194L92 196L88 196L84 192L79 182L74 164L73 144L69 140L62 140L58 144L58 182L62 200L68 217L76 232L82 239L82 241L92 252L92 254L107 269L109 269L112 273L114 273L128 285L132 292L133 307L128 325L128 345L131 361L140 382L149 390L160 392L191 381L228 377L238 373L251 362L251 360L254 358L255 354L258 351L261 341L261 322L259 315L253 304L243 294L232 288L220 285L203 286L188 292L176 303L176 305L170 313L167 323L168 345L178 363L187 370L187 375L184 377L179 376L169 366L161 352L158 341L158 323L162 309L167 300L170 298L170 296L181 286L194 279L207 276L221 276L234 279L244 284L249 289L251 289L263 303L270 322L270 342L266 355L260 363L260 365L257 367L257 369L247 378L243 379L240 382L253 386L263 391L277 391L281 389L290 379L298 358L300 347L300 323L296 307L297 298L302 292L318 287L333 279L335 276L337 276L339 273L341 273L345 268L349 266L349 264L355 259L351 251L349 242L345 243L341 247L329 253L309 258L290 258L276 255L274 257L262 261L236 266L192 266L154 257L130 245L129 243L121 239L119 236L117 236L101 220L101 218L98 216L96 212L95 207L107 192L113 180L119 159L121 157L121 151L118 146L118 142L115 135L114 112L117 101L124 92L129 90L138 90L146 92L159 99L169 109L184 103L204 99L231 100L244 103L259 109L264 103L266 103L268 100L270 100L271 98L280 93L290 90L302 91L309 97L314 112L314 130L311 143L307 152L307 156L310 161L316 182L325 198L332 205L333 210L328 219L322 224L322 226L317 231L315 231L310 237L308 237L306 240L296 245L292 249L309 249L325 245L341 236L347 230L350 210L360 193L360 187L355 178L355 174L357 172L387 172L389 177L384 187L385 195L387 194L391 182L394 180L401 180L415 187L426 190L428 193L428 202L423 211L423 214L421 216L421 219L419 221L419 224L417 226L417 229L415 231L415 234L413 236L413 239L411 241L405 258L402 260L395 260L390 257L388 259L366 259L361 264L361 266L340 285L318 297L307 300L305 302L305 307L309 325L318 323L325 319L334 310L334 308L337 306L341 298L354 283L356 283L362 277L377 271L394 271L400 273L407 277L415 285L420 294L423 306L421 323L416 335L408 344L408 346L401 353L399 353L397 356L395 356L388 362L369 370L353 373L330 373L304 367L301 377L297 385L294 387L294 389L288 395L279 400L261 400L240 391L216 387L192 390L167 400L150 400L139 394L132 386ZM130 155L119 189L116 192L112 201L106 207L107 210L119 207L126 200L134 185L136 184L137 180L149 166L163 158L171 156L180 156L191 160L198 166L202 173L204 182L203 192L195 205L194 216L196 220L205 227L212 229L221 228L227 225L233 219L234 207L225 191L225 177L233 163L235 163L237 160L241 158L248 156L262 157L278 165L289 177L289 179L295 186L297 192L299 193L300 197L309 207L316 210L323 209L313 196L307 184L304 171L297 154L302 142L305 129L304 107L301 101L298 99L291 99L278 104L261 119L257 119L243 112L224 108L197 109L185 112L171 119L167 119L163 114L161 114L157 109L155 109L150 104L138 99L130 99L126 103L123 113L123 128L125 138L131 152ZM380 280L372 282L361 289L361 306L364 310L375 312L382 317L384 321L384 337L386 339L390 341L400 341L408 331L413 319L413 301L409 292L400 283L393 280ZM144 187L141 193L139 194L138 198L134 202L134 204L131 206L131 208L125 214L123 214L120 217L113 218L113 220L124 230L126 230L128 233L138 238L139 240L156 248L180 255L201 258L226 258L257 253L277 246L291 239L292 237L303 231L315 220L315 218L306 216L298 209L298 207L291 199L290 195L288 194L287 190L285 189L281 181L271 171L257 165L245 166L241 168L235 175L234 190L242 203L243 217L240 224L234 231L221 237L207 237L201 235L194 229L192 229L186 220L185 207L187 201L193 193L195 185L193 175L187 168L179 165L171 165L164 167L158 172L156 172L148 180ZM367 179L364 179L367 185L367 195L362 204L360 205L355 219L355 240L357 247L361 253L383 253L388 245L390 236L389 218L383 203L377 195L377 185L380 179ZM319 362L330 364L360 363L376 358L387 352L389 349L382 347L376 341L375 323L371 320L362 319L359 316L357 316L353 310L351 300L348 306L343 311L343 313L333 324L331 324L329 327L320 332L309 334L309 348L307 358ZM130 59L132 59L133 57L147 49L149 46L76 18L66 105L72 100L74 100L76 97L78 97L80 94L82 94L84 91L89 89L91 86L93 86L95 83L97 83L105 76L113 72L115 69L129 61ZM213 204L218 204L225 208L224 213L217 218L211 218L207 216L203 210L205 206ZM39 96L20 142L26 136L28 136L33 130L35 130L38 126L40 126L43 122L45 122L48 118L50 118L53 114L56 113L64 41L56 57L56 60L52 66L49 76L45 82L42 92ZM194 11L101 14L95 16L98 16L100 18L103 18L105 20L108 20L110 22L113 22L115 24L118 24L120 26L123 26L125 28L128 28L130 30L133 30L135 32L138 32L140 34L143 34L145 36L148 36L159 41L164 37L168 36L169 34L173 33L174 31L178 30L179 28L213 11ZM409 203L413 193L412 191L404 189L400 186L396 186L394 190L390 203L395 213L397 230L401 223L407 205ZM418 210L421 200L423 198L423 196L418 195L412 212L407 221L407 224L405 226L405 229L403 231L403 234L401 236L401 239L399 241L399 244L397 246L397 249L395 251L396 254L400 254ZM182 191L178 195L170 194L167 190L168 182L172 179L180 180L183 183ZM256 194L250 195L245 190L245 184L250 179L256 179L261 184L261 190L258 194Z%22/%3E%3C/svg%3E") center/contain no-repeat}
94
109
  @keyframes fi{from{opacity:0}}
95
110
 
96
111
  /* footer */
@@ -99,9 +114,9 @@ ul{list-style:none;margin:0;padding:8px 0 0;display:flex;flex-direction:column;g
99
114
  .ftr a{color:var(--dim);cursor:pointer;text-decoration:underline}
100
115
 
101
116
  /* side panel */
102
- .scrim{position:fixed;inset:0;background:color-mix(in srgb,var(--bg) 55%,transparent);display:none}
117
+ .scrim{position:fixed;inset:0;z-index:10;background:color-mix(in srgb,var(--bg) 55%,transparent);display:none}
103
118
  .scrim.on{display:block}
104
- aside{position:fixed;top:0;right:0;bottom:0;width:480px;max-width:100%;background:var(--bg-2);border-left:1px solid var(--line);display:flex;flex-direction:column;transform:translateX(100%);transition:transform .18s}
119
+ aside{position:fixed;top:0;right:0;bottom:0;z-index:11;width:480px;max-width:100%;background:var(--bg-2);border-left:1px solid var(--line);display:flex;flex-direction:column;transform:translateX(100%);transition:transform .18s}
105
120
  aside.open{transform:none}
106
121
  aside header{display:flex;align-items:flex-start;gap:12px;padding:16px 20px;border-bottom:1px solid var(--line)}
107
122
  aside header .t{flex:1;min-width:0}
@@ -128,12 +143,12 @@ aside .foot:empty{display:none}
128
143
  .set .opts{display:flex;gap:4px}
129
144
  .set .opts button{border:1px solid var(--line);border-radius:var(--r);padding:3px 10px;color:var(--dim)}
130
145
  .set .opts button.on{color:var(--ink);border-color:var(--ink)}
131
- .toast{position:fixed;left:24px;bottom:52px;background:var(--ink);color:var(--bg);border-radius:var(--r);padding:8px 14px;font-size:13px;opacity:0;transition:opacity .2s;pointer-events:none}
146
+ .toast{position:fixed;z-index:12;left:24px;bottom:52px;background:var(--ink);color:var(--bg);border-radius:var(--r);padding:8px 14px;font-size:13px;opacity:0;transition:opacity .2s;pointer-events:none}
132
147
  .toast.on{opacity:1}
133
- .help{position:fixed;inset:0;display:none;align-items:center;justify-content:center;background:color-mix(in srgb,var(--bg) 70%,transparent)}
148
+ .help{position:fixed;inset:0;z-index:12;display:none;align-items:center;justify-content:center;background:color-mix(in srgb,var(--bg) 70%,transparent)}
134
149
  .help.on{display:flex}.help div{background:var(--bg-2);border:1px solid var(--line);border-radius:var(--r);padding:20px 24px;line-height:2}
135
150
  .help kbd{display:inline-block;width:7ch;color:var(--accent)}
136
- @media(max-width:900px){main{grid-template-columns:1fr;padding-inline:16px;gap:8px}.hdr,.strip,.ftr{padding-inline:16px}section h2{position:sticky;top:0;background:var(--bg);z-index:1}.more{display:flex}.card:hover .age{display:inline}}
151
+ @media(max-width:900px){main{grid-template-columns:1fr;padding-inline:16px;gap:8px}.hdr,.strip,.ftr{padding-inline:16px}section h2{position:sticky;top:0;background:var(--bg);z-index:1}.more{display:grid}.card:hover .age{display:inline}}
137
152
  @media(prefers-reduced-motion:reduce){aside,.toast,.mascot,.d-run .pulse{transition:none;animation:none}}
138
153
  </style>
139
154
  </head>
@@ -210,6 +225,10 @@ const WORD={idea:"idea",starting:"starting",running:"running",stalled:"stalled",
210
225
 
211
226
  let S={project:null,projects:[],cards:[],now:Date.now(),all:false};
212
227
  let all=new URLSearchParams(location.search).get("all")==="1",openKey=null,mode=null,modeKey=null,filter=null,menuKey=null,tab=0,runDoc=null;
228
+ // A column shows this many cards, then a "more" line; Done is where it matters.
229
+ const FOLD=6;const unfolded=new Set();
230
+ let archive=false;
231
+ let clearMenu=false,picking=false;const picked=new Set(); // Clear on Done: menu, then cherry-pick mode // showing the archive instead of the board
213
232
  const wasAwaiting=new Map();let first=true;
214
233
 
215
234
  const key=c=>c.kind==="idea"?"idea:"+c.state+":"+c.text:"run:"+c.state+":"+c.id;
@@ -223,23 +242,30 @@ async function load(){
223
242
  async function post(path,body){const r=await fetch(path,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(body)});const j=await r.json().catch(()=>({}));if(!r.ok){toast(j.error||j.why||"failed");if(j.manual)console.log("run manually:",j.manual)}return j}
224
243
 
225
244
  function card(c){
226
- const k=key(c),el=document.createElement("div");el.className="card"+(k===openKey?" open":"")+(k===menuKey?" menu":"");el.tabIndex=0;el.setAttribute("role","button");
245
+ const k=key(c),el=document.createElement("div");el.className="card"+(k===openKey?" open":"")+(k===menuKey?" menu":"")+(c.archived?" archived":"");el.tabIndex=0;el.setAttribute("role","button");
227
246
  const st=ICON[c.status]||"idea",idt=c.kind==="idea"?"idea":c.text;
228
247
  const chips=[];
229
248
  if(c.status==="waiting")chips.push(`<span class="chip warn"><i></i>${esc(c.awaiting||"needs you")}</span>`);
230
249
  else if(c.status==="running")chips.push(`<span class="chip run"><i></i>running</span>`);
231
250
  if(all)chips.push(`<span class="chip">${esc(c.where)}</span>`);
232
- el.innerHTML=`<div class="c-id"><span class="st d-${st}"><svg><use href="#s-${st}"/></svg></span><span class="idt">${esc(idt)}</span><span class="age">${c.kind==="run"?age(c.moved||S.now,S.now):""}</span><button class="ib sm more" data-a="menu" title="Actions" aria-label="Actions">${ico("more")}</button></div>
251
+ chips.push(...(c.tags||[]).map(t=>{const mark=MARKS[t]?`<svg><use href="#c-${t}"/></svg>`:"";return `<span class="chip${t==="full"||t==="lite"?" accent":""}">${mark}${esc(NAMES[t]||t)}</span>`}));
252
+ const pick=picking&&!archive&&c.column===4;
253
+ el.innerHTML=(pick?`<input type="checkbox" class="pick" ${picked.has(k)?"checked":""} aria-label="Select">`:"")+`<div class="c-id"><span class="st d-${st}"><svg><use href="#s-${st}"/></svg></span><span class="idt">${esc(idt)}</span><span class="age">${c.kind==="run"?age(c.moved||S.now,S.now):""}</span><button class="ib sm more" data-a="menu" title="Actions" aria-label="Actions">${ico("more")}</button></div>
233
254
  <div class="c-title">${esc(c.kind==="idea"?c.text:(c.title||c.id))}</div>
234
255
  <div class="c-chips">${chips.join("")}</div>`;
235
256
  if(k===menuKey){
236
257
  const items=[];
237
- if(c.kind==="idea"&&c.status==="idea")items.push(["run","Run",ico("play")],["edit","Edit",ico("pen")],["reject","Reject",ico("x")],null,["delete","Delete",ico("trash"),"danger"]);
258
+ if(archive){items.push(["restore","Restore",ico("play")]);if(c.kind==="run")items.push(["open","Open",ico("play")]);}
259
+ else if(c.kind==="idea"&&c.status==="idea")items.push(["run","Run",ico("play")],["edit","Edit",ico("pen")],["reject","Reject",ico("x")],null,["delete","Delete",ico("trash"),"danger"]);
238
260
  else if(c.kind==="idea")items.push(["delete","Remove",ico("trash"),"danger"]);
239
261
  else if(c.status==="waiting"||c.status==="running"||c.status==="stalled")items.push(["open","Open",ico("play")],null,["reject","Abandon",ico("x"),"danger"]);
240
262
  else items.push(["open","Open",ico("play")]);
263
+ if(!archive&&!(c.kind==="idea"&&c.status!=="idea"))items.push(null,["archive","Archive",ico("x")]);
241
264
  el.innerHTML+=`<div class="menu-pop">${items.map(i=>i?`<button data-a="${i[0]}" class="${i[3]||""}">${i[2]}${i[1]}</button>`:"<hr>").join("")}</div>`}
242
- el.querySelectorAll("[data-a]").forEach(bt=>bt.onclick=e=>{e.stopPropagation();const a=bt.dataset.a;menuKey=null;if(a==="menu"){menuKey=k;render();return}if(a==="open"){open(c);return}mode=a;modeKey=k;render()});
265
+ el.querySelectorAll("[data-a]").forEach(bt=>bt.onclick=async e=>{e.stopPropagation();const a=bt.dataset.a;menuKey=null;if(a==="menu"){menuKey=k;render();return}if(a==="open"){open(c);return}
266
+ if(a==="archive"||a==="restore"){toggleArchive(c,a==="archive");return}
267
+ mode=a;modeKey=k;render()});
268
+ if(pick){el.classList.toggle("picked",picked.has(k));el.onclick=()=>{picked.has(k)?picked.delete(k):picked.add(k);render()};return el}
243
269
  el.onclick=()=>{if(menuKey){menuKey=null;render();return}open(c)};el.onkeydown=e=>{if(e.key==="Enter"||e.key===" "){e.preventDefault();open(c)}};
244
270
  return el;}
245
271
 
@@ -260,26 +286,44 @@ async function startRun(c,kind){
260
286
  load()}
261
287
 
262
288
  function render(){
263
- const cs=S.cards,b=$("board");b.innerHTML="";
289
+ const cs=S.cards.filter(c=>c.archived===archive),b=$("board");b.innerHTML="";
290
+ const nArch=S.cards.filter(c=>c.archived).length;
264
291
  const n=s=>cs.filter(c=>c.status===s).length;
265
292
  const strip=[];
266
293
  if(n("waiting"))strip.push(`<button class="attn ${filter==="waiting"?"on":""}" data-f="waiting">● ${n("waiting")} waiting on you</button>`);
267
294
  strip.push(`<button class="${filter==="running"?"on":""}" data-f="running"><span class="d-run"><span class="pulse"></span></span> ${n("running")} running</button>`);
268
295
  if(n("stalled"))strip.push(`<button class="${filter==="stalled"?"on":""}" data-f="stalled">◐ ${n("stalled")} stalled</button>`);
269
- strip.push(`<span class="sp"></span><span>${cs.filter(c=>c.kind==="idea").length} ideas · ${cs.filter(c=>c.kind==="run").length} runs</span>`);
296
+ strip.push(`<span class="sp"></span><span>${cs.filter(c=>c.kind==="idea").length} ideas · ${cs.filter(c=>c.kind==="run").length} runs</span>`,`<button class="${archive?"on":""}" data-f="__archive">${archive?"Back to board":"Archive "+nArch}</button>`);
270
297
  $("strip").innerHTML=strip.join("");
271
- $("strip").querySelectorAll("button").forEach(c=>c.onclick=()=>{filter=filter===c.dataset.f?null:c.dataset.f;render()});
298
+ $("strip").querySelectorAll("button").forEach(c=>c.onclick=()=>{if(c.dataset.f==="__archive"){archive=!archive;filter=null;render();return}filter=filter===c.dataset.f?null:c.dataset.f;render()});
272
299
  const sel=$("proj");sel.innerHTML=(S.project?`<option value="cur">${esc(S.project)}</option>`:"")+`<option value="all">All projects</option>`;sel.value=all||!S.project?"all":"cur";
273
- if(!cs.length&&mode!=="new"){b.innerHTML='<div class="empty"><div class="mascot"></div><div>Nothing here yet.</div><button class="btn pri" id="newempty">New idea</button></div>';$("newempty").onclick=()=>{mode="new";render()};}
300
+ if(!cs.length&&mode!=="new"){b.innerHTML=archive?'<div class="empty"><div class="mascot"></div><div>Nothing archived.</div></div>':'<div class="empty"><div class="mascot"></div><div>Nothing here yet.</div><button class="btn pri" id="newempty">New idea</button></div>';if(!archive)$("newempty").onclick=()=>{mode="new";render()};}
274
301
  COLS.forEach((name,ci)=>{
275
302
  const s=document.createElement("section");const list=cs.filter(c=>c.column===ci&&(!filter||c.status===filter));
276
- s.innerHTML=`<h2>${name}<i>${list.length||""}</i>${ci===0?`<button class="ib sm" title="New idea" aria-label="New idea">${ico("plus")}</button>`:""}</h2>`;
277
- if(ci===0)s.querySelector(".ib").onclick=()=>{mode="new";render()};
303
+ const clearable=ci===4&&!archive&&list.length;
304
+ const olderThan=days=>list.filter(c=>S.now-(c.moved||S.now)>days*d);
305
+ let head=`<h2>${name}<i>${list.length||""}</i>${ci===0&&!archive?`<button class="ib sm" title="New idea" aria-label="New idea">${ico("plus")}</button>`:""}`;
306
+ if(clearable&&picking)head+=`<span class="pickbar"><button class="btn sm ghost" data-p="cancel">Cancel</button><button class="btn sm pri" data-p="go" ${picked.size?"":"disabled"}>Archive ${picked.size||""}</button></span>`;
307
+ else if(clearable)head+=`<button class="btn sm ghost clear" title="Archive finished runs">Clear ▾</button>`;
308
+ if(clearable&&clearMenu)head+=`<div class="menu-pop clear-pop"><button data-c="7">Older than a week <i>${olderThan(7).length}</i></button><button data-c="3">Older than 3 days <i>${olderThan(3).length}</i></button><button data-c="0">Everything <i>${list.length}</i></button><hr><button data-c="pick">Pick which…</button></div>`;
309
+ s.innerHTML=head+`</h2>`;
310
+ if(ci===0&&!archive)s.querySelector(".ib").onclick=()=>{mode="new";render()};
311
+ if(clearable){
312
+ const cl=s.querySelector(".clear");if(cl)cl.onclick=e=>{e.stopPropagation();clearMenu=!clearMenu;render()};
313
+ s.querySelectorAll("[data-c]").forEach(bt=>bt.onclick=async e=>{e.stopPropagation();clearMenu=false;const v=bt.dataset.c;
314
+ if(v==="pick"){picking=true;picked.clear();render();return}
315
+ const set=olderThan(+v);if(!set.length){toast("Nothing that old");render();return}
316
+ for(const c of set)await post("/archive",{dir:c.state,id:c.id});toast("Archived "+set.length);load()});
317
+ s.querySelectorAll("[data-p]").forEach(bt=>bt.onclick=async e=>{e.stopPropagation();if(bt.dataset.p==="cancel"){picking=false;picked.clear();render();return}
318
+ const set=list.filter(c=>picked.has(key(c)));picking=false;picked.clear();for(const c of set)await post("/archive",{dir:c.state,id:c.id});toast("Archived "+set.length);load()});}
278
319
  const ul=document.createElement("ul");
279
320
  if(ci===0&&mode==="new"){const f=document.createElement("li");f.className="inl";f.innerHTML=`<input id="newidea" placeholder="One line, like a commit subject"><div class="row"><button class="btn ghost" id="nc">Cancel</button><button class="btn pri" id="ns">Add to inbox</button></div>`;ul.appendChild(f);
280
321
  const inp=f.querySelector("input");const save=async()=>{const text=inp.value.trim();if(!text)return;mode=null;const r=await post("/inbox",{op:"add",text});if(r.ok)toast("Added to inbox.md");load()};
281
322
  f.querySelector("#ns").onclick=save;f.querySelector("#nc").onclick=()=>{mode=null;render()};inp.onkeydown=e=>{if(e.key==="Enter")save();if(e.key==="Escape"){mode=null;render()}};setTimeout(()=>inp.focus())}
282
- list.forEach(c=>{if(modeKey===key(c)&&mode){ul.appendChild(inlineForm(c));return}const li=document.createElement("li");li.appendChild(card(c));ul.appendChild(li)});
323
+ const shown=unfolded.has(ci)||list.length<=FOLD+1?list:list.slice(0,FOLD);
324
+ shown.forEach(c=>{if(modeKey===key(c)&&mode){ul.appendChild(inlineForm(c));return}const li=document.createElement("li");li.appendChild(card(c));ul.appendChild(li)});
325
+ if(shown.length<list.length){const li=document.createElement("li");li.innerHTML=`<button class="more-btn">Show ${list.length-shown.length} more</button>`;li.firstChild.onclick=()=>{unfolded.add(ci);render()};ul.appendChild(li)}
326
+ else if(unfolded.has(ci)&&list.length>FOLD+1){const li=document.createElement("li");li.innerHTML=`<button class="more-btn">Show less</button>`;li.firstChild.onclick=()=>{unfolded.delete(ci);render()};ul.appendChild(li)}
283
327
  s.appendChild(ul);b.appendChild(s)});
284
328
  const seen=new Map();cs.forEach(c=>seen.set(c.status,1));
285
329
  $("legend").innerHTML=[...seen.keys()].map(s=>`<span class="st d-${ICON[s]}" style="display:inline-grid;vertical-align:-2px"><svg><use href="#s-${ICON[s]}"/></svg></span> ${WORD[s]||s}`).join(" ");}
@@ -288,8 +332,8 @@ function render(){
288
332
  function open(c){
289
333
  openKey=key(c);$("panel").classList.add("open");$("scrim").classList.add("on");$("ptitle").textContent=c.text;render();
290
334
  if(c.kind==="idea"){runDoc=null;$("psub").textContent="idea · inbox.md · "+c.where;$("ptabs").innerHTML="";$("pbody").innerHTML=`<p>${esc(c.text)}</p><p style="color:var(--dim)">Run turns this into a plan you approve before any work starts.</p>`;
291
- const foot=$("pfoot");foot.innerHTML=c.status==="idea"?`<button class="btn pri" data-a="run">Run</button><button class="btn" data-a="edit">Edit</button><button class="btn" data-a="reject">Reject</button><button class="btn ghost danger" data-a="delete">Delete</button>`:`<span style="color:var(--dim);font-size:12px">Starting: a run was launched for this idea.</span>`;
292
- foot.querySelectorAll("[data-a]").forEach(b=>b.onclick=()=>{close();mode=b.dataset.a;modeKey=openKey;render()});return}
335
+ const foot=$("pfoot");foot.innerHTML=c.archived?`<button class="btn pri" data-a="restore">Restore</button>`:c.status==="idea"?`<button class="btn pri" data-a="run">Run</button><button class="btn" data-a="edit">Edit</button><button class="btn" data-a="reject">Reject</button><button class="btn ghost" data-a="archive">Archive</button><button class="btn ghost danger" data-a="delete">Delete</button>`:`<span style="color:var(--dim);font-size:12px">Starting: a run was launched for this idea.</span>`;
336
+ foot.querySelectorAll("[data-a]").forEach(b=>b.onclick=()=>{const a=b.dataset.a;if(a==="archive"||a==="restore"){toggleArchive(c,a==="archive");return}const k=key(c);close();mode=a;modeKey=k;render()});return}
293
337
  openRun(c,false)}
294
338
  async function openRun(c,refresh){
295
339
  if(!refresh||!runDoc||runDoc.id!==c.id){runDoc=await fetch(`/run/${encodeURIComponent(c.id)}?dir=${encodeURIComponent(c.state)}`).then(r=>r.json())}
@@ -301,10 +345,13 @@ async function openRun(c,refresh){
301
345
  const k=tabs[tab][1],doc=runDoc[k];
302
346
  $("pbody").innerHTML=doc?md(doc):`<p style="color:var(--dim)">No ${({request:"00-request.md",plan:"01-plan.md",impl:"03-impl.md",review:"04-review.md",backlog:"06-backlog.md"})[k]} yet.</p>`;
303
347
  const foot=$("pfoot");
304
- if(c.status==="waiting")foot.innerHTML=`<span style="color:var(--dim);font-size:12px;flex:1">Waiting on <b>${esc(c.awaiting)}</b>. Answer in the terminal running this run.</span><button class="btn ghost" data-a="ab">Abandon</button>`;
305
- else if(c.status==="done"||c.status==="abandoned")foot.innerHTML="";
306
- else foot.innerHTML=`<button class="btn ghost" data-a="ab">Abandon run</button>`;
307
- foot.querySelectorAll("[data-a]").forEach(b=>b.onclick=()=>{close();mode="reject";modeKey=key(c);render()})}
348
+ const arch=c.archived?`<button class="btn pri" data-a="restore">Restore</button>`:`<button class="btn ghost" data-a="archive">Archive</button>`;
349
+ if(c.archived)foot.innerHTML=arch;
350
+ else if(c.status==="waiting")foot.innerHTML=`<span style="color:var(--dim);font-size:12px;flex:1">Waiting on <b>${esc(c.awaiting)}</b>. Answer in the terminal running this run.</span>${arch}<button class="btn ghost" data-a="ab">Abandon</button>`;
351
+ else if(c.status==="done"||c.status==="abandoned")foot.innerHTML=arch;
352
+ else foot.innerHTML=`${arch}<button class="btn ghost" data-a="ab">Abandon run</button>`;
353
+ foot.querySelectorAll("[data-a]").forEach(b=>b.onclick=()=>{const a=b.dataset.a;if(a==="archive"||a==="restore"){toggleArchive(c,a==="archive");return}close();mode="reject";modeKey=key(c);render()})}
354
+ async function toggleArchive(c,archived){const r=await post("/archive",c.kind==="idea"?{dir:c.state,text:c.text,archived}:{dir:c.state,id:c.id,archived});if(r.ok)toast(archived?"Archived":"Restored");close();load()}
308
355
  function close(){openKey=null;runDoc=null;$("panel").classList.remove("open");$("scrim").classList.remove("on");render()}
309
356
  $("pclose").onclick=close;$("scrim").onclick=close;
310
357
 
@@ -341,7 +388,7 @@ $("newtop").onclick=()=>{mode="new";render();$("board").scrollTo(0,0)};
341
388
  $("settings").onclick=openSettings;
342
389
  try{const t=localStorage.getItem("kz-theme");if(t)document.documentElement.dataset.theme=t}catch(e){}
343
390
  $("kbd").onclick=()=>$("help").classList.add("on");$("help").onclick=()=>$("help").classList.remove("on");
344
- document.addEventListener("click",()=>{if(menuKey){menuKey=null;render()}});
391
+ document.addEventListener("click",()=>{if(menuKey||clearMenu){menuKey=null;clearMenu=false;render()}});
345
392
  document.onkeydown=e=>{
346
393
  if(e.target.matches("input,select"))return;
347
394
  if(e.key==="?"){$("help").classList.toggle("on");return}