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
|
-
|
|
372
|
-
|
|
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
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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
|
-
?
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
//
|
|
397
|
-
|
|
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
|
|
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 ·
|
|
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") {
|
package/dist/tui/ink/init-app.js
CHANGED
|
@@ -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:
|
|
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",
|