tickmarkr 1.90.7 → 1.90.8

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.
@@ -8,6 +8,9 @@ export type DoctorOpts = {
8
8
  resolveClaudeAliasIdentity?: (cwd: string, alias: ClaudeAlias) => string | undefined;
9
9
  catalog?: CatalogReadResult;
10
10
  catalogNow?: () => Date;
11
+ /** init's between-acts surface: status rows only — the model matrix and inline drift stay
12
+ * behind `tickmarkr doctor` (files are still written; only the RETURNED string shrinks). */
13
+ compact?: boolean;
11
14
  };
12
15
  export declare function runnerIgnoreFinding(cwd: string): {
13
16
  verdict: "pass" | "warn";
@@ -471,5 +471,10 @@ export async function doctor(_argv, cwd = process.cwd(), adapters = allAdapters(
471
471
  const header = visual()
472
472
  ? `${statusRow("pass", `${title("tickmarkr doctor")} ${legend("· capability matrix")}`)}\n${rule()}`
473
473
  : "tickmarkr doctor — capability matrix:";
474
+ if (opts.compact) {
475
+ // Operator field report 2026-08-13: the full matrix mid-init-journey is clutter between two
476
+ // TUIs. Every file side effect above already happened; the pointer line is the contract.
477
+ return `${header}\n${rows.join("\n")}\n ${dim(`model matrix elided — \`tickmarkr doctor\` prints it in full${drift ? "; drift overlay written" : ""}`)}\nwrote ${stateDirName(cwd)}/doctor.json`;
478
+ }
474
479
  return `${header}\n${rows.join("\n")}${modelSummary}${drift}\nwrote ${stateDirName(cwd)}/doctor.json`;
475
480
  }
@@ -362,21 +362,20 @@ export async function init(argv, cwd = process.cwd(), io = {}) {
362
362
  const interactive = input.isTTY === true && output.isTTY === true && !(values.yes ?? false);
363
363
  // Act 1 — preferences. Only when the repo config does not exist yet: init never rewrites an
364
364
  // operator's config; re-tuning is `tickmarkr fleet` (act 3 below still runs and writes overlays).
365
- let wizardQuit = false;
366
365
  if (!repoConfigExists) {
367
366
  if (interactive) {
368
367
  emitBanner();
369
368
  const wizard = await runInitWizard(cwd, input, output);
370
369
  if (wizard === null) {
371
- wizardQuit = true;
372
- notes.push("wizard quit — no repo config written; re-run tickmarkr init (or tickmarkr fleet after a manual config)");
370
+ // Operator field report 2026-08-13: quit means QUIT — no probe, no report wall, no fleet
371
+ // act, one line out. Scaffolding above already happened (spec/global config), and saying
372
+ // so costs one clause; everything else stops here. Esc and ctrl+c both land here.
373
+ return `init: wizard quit — nothing further run (scaffolding kept: ${notes.filter((n) => n.startsWith("wrote")).length} file(s) written above). Re-run tickmarkr init to continue.`;
373
374
  }
374
- else {
375
- writeFileSync(repoConfigPath, configTemplate(wizard.overlay));
376
- notes.push(`wrote ${repoConfigPath}`);
377
- if (wizard.installSkills) {
378
- await installAgentFiles(cwd, values.force ?? false, wizard.installDocs || (values.docs ?? false), notes);
379
- }
375
+ writeFileSync(repoConfigPath, configTemplate(wizard.overlay));
376
+ notes.push(`wrote ${repoConfigPath}`);
377
+ if (wizard.installSkills) {
378
+ await installAgentFiles(cwd, values.force ?? false, wizard.installDocs || (values.docs ?? false), notes);
380
379
  }
381
380
  }
382
381
  else {
@@ -386,17 +385,20 @@ export async function init(argv, cwd = process.cwd(), io = {}) {
386
385
  }
387
386
  // Act 2 — discovery. Doctor is the sensor (fleet never re-probes); runs after preferences so the
388
387
  // probe reads the config the operator just chose. Reuse keeps init fast; --fresh forces the probe.
388
+ // Interactive journeys get the COMPACT surface (status rows + pointer) — the full matrix between
389
+ // two TUIs was the operator's clutter report; non-TTY keeps the complete machine surface.
389
390
  const fresh = values.fresh ?? false;
390
391
  const { reuse, ageMs, health } = initDoctorReuse(cwd, fresh);
391
392
  let doc = reuse && health && ageMs !== null
392
- ? `using probe results from ${formatDoctorAgeForInit(ageMs)} ago — run tickmarkr doctor to refresh (or init --fresh)\n${formatDoctorReport(cwd, loadConfig(cwd), health, allAdapters(), { wrote: false })}`
393
- : await doctor([], cwd, undefined, { banner: false });
394
- // Act 3 — fleet. Interactive only, and never after a wizard quit ("stop" means stop). The
395
- // discovery report prints BETWEEN the acts so the operator reads what the presets screen
396
- // ranks with; the final summary then carries a pointer instead of the same bytes twice.
397
- if (interactive && !wizardQuit) {
393
+ ? interactive
394
+ ? `using probe results from ${formatDoctorAgeForInit(ageMs)} ago — full matrix: tickmarkr doctor · refresh: init --fresh`
395
+ : `using probe results from ${formatDoctorAgeForInit(ageMs)} ago — run tickmarkr doctor to refresh (or init --fresh)\n${formatDoctorReport(cwd, loadConfig(cwd), health, allAdapters(), { wrote: false })}`
396
+ : await doctor([], cwd, undefined, { banner: false, compact: interactive });
397
+ // Act 3 — fleet. The compact discovery surface prints BETWEEN the acts so the operator reads
398
+ // what the presets screen ranks with; the final summary then carries a pointer, not a repeat.
399
+ if (interactive) {
398
400
  output.write(`${doc}\n`);
399
- doc = "discovery report shown above — re-print any time with `tickmarkr doctor`";
401
+ doc = "discovery shown above — full matrix any time with `tickmarkr doctor`";
400
402
  // Same lazy-Ink seam as fleet.ts: load the editor runtime up front so the assembler's
401
403
  // returned props need no startup-input capture window on this path.
402
404
  const { runFleetInkEditor } = await import("../../tui/ink/fleet-app.js");
@@ -314,6 +314,15 @@ export function FleetApp({ ageMs, agents, initialDenyAdapters, initialDenyModels
314
314
  showScreen("models");
315
315
  return;
316
316
  }
317
+ // v1.90.8 (operator field report): inside the init journey, one Esc must never discard the
318
+ // whole walk — from any walk screen it returns HOME to the presets screen; Esc there (or
319
+ // `q`/ctrl+c anywhere) remains the real quit. Sub-screen Escs above keep their tighter backs.
320
+ if (key.escape && entry === "presets" && screenRef.current !== "modes") {
321
+ setReview(null);
322
+ presetPickRef.current = true;
323
+ showScreen("modes");
324
+ return;
325
+ }
317
326
  const typing = screenRef.current === "provenance" || screenRef.current === "add-model";
318
327
  if (key.escape || (!typing && input === "q") || (key.ctrl && input === "c")) {
319
328
  finish({ kind: "quit" });
@@ -838,7 +847,7 @@ export function FleetApp({ ageMs, agents, initialDenyAdapters, initialDenyModels
838
847
  content: (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { children: ` ${"custom".padEnd(11)} walk the full editor (agents → models → shapes → seats)` })] })),
839
848
  });
840
849
  }
841
- return (_jsx(FleetListScreen, { title: presetPick ? "fleet · routing presets" : "step 4/6 · routing mode", legend: presetPick ? "↑↓ to move · Enter to apply preset · Esc to close" : "↑↓/jk move · enter select · esc/q quit", rows: rows, cursor: modeCursor, details: modeOptions[modeCursor] ? modePreview(modeOptions[modeCursor].id, map) : [] }));
850
+ return (_jsx(FleetListScreen, { title: presetPick ? "tickmarkr init · act 3 of 3 — fleet · routing presets" : "step 4/6 · routing mode", legend: presetPick ? "↑↓ to move · Enter to apply preset · Enter on custom to walk the editor · Esc inside the walk returns here · Esc here closes" : "↑↓/jk move · enter select · esc/q quit", rows: rows, cursor: modeCursor, details: modeOptions[modeCursor] ? modePreview(modeOptions[modeCursor].id, map) : [] }));
842
851
  }
843
852
  const renderedShapes = shapeRows(selectedModeRef.current, map);
844
853
  if (screen === "shapes") {
@@ -101,8 +101,8 @@ function inkInput(input, initialInput) {
101
101
  // Three fields, one toggle, one action — a descriptor array, deliberately not a forms framework.
102
102
  function buildRows(offerSkills) {
103
103
  const rows = [
104
- { id: "driver", section: "Run", label: "Driver", desc: "auto: pick herdr when HERDR_ENV=1, else subprocess" },
105
- { id: "concurrency", section: "Run", label: "Concurrency", desc: "parallel task batteries per run" },
104
+ { id: "driver", section: "Run", label: "Driver", desc: "auto: herdr when HERDR_ENV=1, else subprocess · herdr: visible panes · subprocess: headless child processes" },
105
+ { id: "concurrency", section: "Run", label: "Concurrency", desc: "parallel task batteries per run — min 1; an empty or zero entry reverts on leave" },
106
106
  {
107
107
  id: "visibility",
108
108
  section: "Run",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tickmarkr",
3
- "version": "1.90.7",
3
+ "version": "1.90.8",
4
4
  "description": "Spec in, verified work out.",
5
5
  "type": "module",
6
6
  "license": "MIT",