TESTER_VERBS gains usage, names, limits, plugins, instances, project.list, thread.list, name.set and project.create. A tester reads limits, plugins and instances and sends plugins.set, instances.set and routes.set, each logged with actor tester. The project file verbs refuse a tester tester-refused. The broker and CLI drop the [mos test] prefix rule (mos-0872 Q1). The CLI takes --tester on the seven reads and the W1-W7 write forms and refuses it (exit 4) elsewhere, bus start and stop included. project init --tester checks the project area, refuses the area root itself, binds the tester with one agents read, then commits the layout as tester (mos-0872 Q2). scripts/mosaic sends plugins, name, names, follow, threads and thread to packages/cli (sage-1081). The row 164 pins are untouched. Built by Dewey on9e74925c2(three commits to989699f7c, manifest 2e30f2a1...29d5f), approved by Filbert in round 3 (#1673 comment 29279), Sage's gate green on716ddcf1eplus the patch.
24 lines
1.3 KiB
JavaScript
24 lines
1.3 KiB
JavaScript
import { CliError } from './errors.mjs';
|
|
export const USAGE_USAGE = 'mosaic usage [--business ID] [--json] [--tester]';
|
|
export async function usageCommand(args, io, callFor) {
|
|
const parsed = { flags: new Set(), values: {} };
|
|
for (let i = 0; i < args.length; i++) {
|
|
const arg = args[i];
|
|
if ((arg === '--json' || arg === '--tester') && !parsed.flags.has(arg)) parsed.flags.add(arg);
|
|
else if (arg === '--business' && args[i + 1] && !args[i + 1].startsWith('--') && !parsed.values[arg]) parsed.values[arg] = args[++i];
|
|
else throw new CliError(USAGE_USAGE, 4);
|
|
}
|
|
const result = await callFor(parsed)('usage', {});
|
|
if (parsed.flags.has('--json')) { io.stdout.write(JSON.stringify(result, null, 2) + '\n'); return; }
|
|
const counts = row => `input=${row.input} output=${row.output} cacheWrite=${row.cacheWrite} cacheRead=${row.cacheRead} unknown=${row.unknownTurns}`;
|
|
const lines = [`Total: ${counts(result.total)}`];
|
|
for (const group of ['byRun', 'byInstance', 'byModel', 'byProvider', 'byAccount']) {
|
|
for (const row of result[group]) {
|
|
const name = ['run', 'instance', 'provider', 'model', 'account'].filter(key => key in row)
|
|
.map(key => row[key] ?? '(unassigned)').join(' / ');
|
|
lines.push(`${group} ${name}: ${counts(row)}`);
|
|
}
|
|
}
|
|
io.stdout.write(lines.join('\n') + '\n');
|
|
}
|