@azure-id/orc 2.0.2 → 2.1.1
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/CHANGELOG.md +455 -0
- package/README-id.md +52 -23
- package/README.md +36 -20
- package/bin/build-agents.js +205 -206
- package/bin/clear-logs.js +620 -0
- package/bin/cli.js +47417 -46420
- package/bin/fix.js +459 -0
- package/bin/gotcha.js +288 -8
- package/bin/habit.js +1538 -1453
- package/bin/mockrun-catalog.js +3 -0
- package/bin/onboarding-content.js +2 -1
- package/bin/pricing.json +28 -21
- package/bin/trace-write.js +869 -657
- package/bin/verify-contracts.js +5552 -5471
- package/bin/verify-package.js +716 -705
- package/bin/webui/api.js +125 -6
- package/bin/webui/css/panels/hookui.css +79 -0
- package/bin/webui/fixtures/behaviour.js +30 -0
- package/bin/webui/fixtures/extra.js +2036 -2036
- package/bin/webui/fixtures/flow.js +81 -81
- package/bin/webui/fixtures/hookui.js +506 -431
- package/bin/webui/fixtures/index.js +32 -3
- package/bin/webui/fixtures/knowledge.js +2 -2
- package/bin/webui/fixtures/maintenance.js +123 -42
- package/bin/webui/fixtures/rules.js +1007 -1002
- package/bin/webui/fixtures/settings.js +6 -7
- package/bin/webui/fixtures/stats.js +9 -6
- package/bin/webui/fixtures/wait.js +98 -97
- package/bin/webui/i18n/en/behaviour.json +13 -0
- package/bin/webui/i18n/en/hookui.json +290 -194
- package/bin/webui/i18n/en/maintenance.json +71 -52
- package/bin/webui/i18n/en/settings.json +60 -60
- package/bin/webui/i18n/id/behaviour.json +13 -0
- package/bin/webui/i18n/id/hookui.json +290 -194
- package/bin/webui/i18n/id/maintenance.json +71 -52
- package/bin/webui/i18n/id/settings.json +60 -60
- package/bin/webui/js/05-banners.js +181 -172
- package/bin/webui/js/06-edit.js +193 -183
- package/bin/webui/js/panels/behaviour.js +77 -12
- package/bin/webui/js/panels/hookui.js +2196 -1691
- package/bin/webui/js/panels/maintenance.js +336 -235
- package/bin/webui/js/panels/settings.js +726 -719
- package/mock-run/INDEX.md +1 -0
- package/mock-run/a-normal-day.md +2 -2
- package/mock-run/extra-slots.md +177 -177
- package/mock-run/habits.md +1 -1
- package/mock-run/orc-aftermath.md +392 -392
- package/mock-run/orc-budget.md +29 -33
- package/mock-run/orc-cli.md +200 -200
- package/mock-run/orc-explain.md +86 -86
- package/mock-run/orc-extra.md +389 -392
- package/mock-run/orc-fast.md +2 -2
- package/mock-run/orc-fix.md +87 -0
- package/mock-run/orc-pattern.md +112 -112
- package/mock-run/orc-quick.md +146 -146
- package/mock-run/orc.md +4 -4
- package/package.json +1 -1
- package/templates/agents/MODEL-MAPPING.md +176 -173
- package/templates/agents/orc-analyze-mini-sonnet-5-high.md +2 -2
- package/templates/agents/{orc-claude-writer-opus-5-med.md → orc-claude-writer-opus-5-low.md} +4 -4
- package/templates/agents/orc-executor-haiku-4-5.md +1 -1
- package/templates/agents/orc-executor-opus-5-low.md +1 -1
- package/templates/agents/orc-executor-sonnet-4-6-high.md +1 -1
- package/templates/agents/orc-executor-sonnet-4-6-med.md +1 -1
- package/templates/agents/orc-executor-sonnet-5-high.md +2 -2
- package/templates/agents/orc-executor-sonnet-5-low.md +155 -0
- package/templates/agents/orc-executor-sonnet-5-med.md +155 -0
- package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +2 -2
- package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -2
- package/templates/agents/{orc-recon-sonnet-4-6-med.md → orc-recon-sonnet-5-med.md} +4 -4
- package/templates/agents/orc-retro-sonnet-5-high.md +2 -2
- package/templates/agents/{orc-reviewer-opus-5-med.md → orc-reviewer-opus-5-low.md} +4 -4
- package/templates/agents/{orc-wiki-scanner-opus-5-med.md → orc-wiki-scanner-opus-5-low.md} +3 -3
- package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +2 -2
- package/templates/commands/orc-fast.md +10 -10
- package/templates/commands/orc-fix.md +18 -0
- package/templates/commands/orc-wiki.md +64 -64
- package/templates/hooks/README.md +75 -7
- package/templates/hooks/orc-session-hook.js +78 -3
- package/templates/hooks/orc-statusline-render.js +317 -23
- package/templates/hooks/orc-statusline.js +162 -49
- package/templates/hooks/orc-subagent-line.js +23 -5
- package/templates/hooks/orc-weather-fetch.js +123 -0
- package/templates/skills/_shared/extra-dispatch.md +1331 -1331
- package/templates/skills/_shared/gotchas.md +27 -7
- package/templates/skills/_shared/habits.md +2 -2
- package/templates/skills/_shared/opus5-only.md +137 -137
- package/templates/skills/_shared/phases/review.md +2 -2
- package/templates/skills/_shared/phases/trace-verbs.md +17 -3
- package/templates/skills/_shared/phases/trace.md +136 -136
- package/templates/skills/_shared/review-slice.md +28 -1
- package/templates/skills/_shared/wait.md +1 -0
- package/templates/skills/orc/README.md +2 -2
- package/templates/skills/orc/SKILL.md +227 -227
- package/templates/skills/orc/config.md +25 -27
- package/templates/skills/orc/examples/full-run-mock.md +74 -73
- package/templates/skills/orc/references/effort-and-mode.md +222 -222
- package/templates/skills/orc/references/preflight-report.md +3 -3
- package/templates/skills/orc/references/ultra-mode.md +1 -1
- package/templates/skills/orc/schemas/checkpoint.md +122 -122
- package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +3 -3
- package/templates/skills/orc/subskills/orc-review-verify/core.md +1 -1
- package/templates/skills/orc-analyze/SKILL.md +4 -2
- package/templates/skills/orc-claude/SKILL.md +14 -14
- package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -65
- package/templates/skills/orc-diy/SKILL.md +5 -5
- package/templates/skills/orc-fast/SKILL.md +210 -208
- package/templates/skills/orc-fix/SKILL.md +110 -0
- package/templates/skills/orc-grill/SKILL.md +232 -232
- package/templates/skills/orc-grill/references/grill-doc.md +1 -1
- package/templates/skills/orc-mini/SKILL.md +4 -4
- package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -2
- package/templates/skills/orc-quick/README.md +536 -536
- package/templates/skills/orc-quick/SKILL.md +2 -2
- package/templates/skills/orc-quick/references/context-doc.md +145 -145
- package/templates/skills/orc-quick/references/dispatch-gate.md +220 -219
- package/templates/skills/orc-quick/references/gh-mode.md +4 -2
- package/templates/skills/orc-retro/SKILL.md +1 -1
- package/templates/skills/orc-retro/examples/retro-mock.md +16 -16
- package/templates/skills/orc-wiki/README.md +325 -325
- package/templates/skills/orc-wiki/SKILL.md +195 -195
- package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -37
- package/templates/skills/orc-wiki/references/extra.md +2 -2
- package/templates/skills/orc-wiki/references/partial-refresh.md +276 -271
- package/templates/skills/orc-wiki/references/phases/phase-0.md +1 -1
- package/templates/skills/orc-wiki/references/phases/phase-2.md +3 -3
- package/templates/skills/orc-wiki/references/phases/phase-3c.md +3 -2
- package/templates/agents/orc-claude-writer-opus-4-8-high.md +0 -48
- package/templates/agents/orc-wiki-scanner-opus-4-8-high.md +0 -74
package/bin/webui/api.js
CHANGED
|
@@ -284,6 +284,9 @@ const READS = {
|
|
|
284
284
|
// applies these to a copy of the saved layout before it compiles.
|
|
285
285
|
if (q.theme) argv.push("--theme", String(q.theme));
|
|
286
286
|
if (q.glyphs) argv.push("--glyphs", String(q.glyphs));
|
|
287
|
+
// v2.0.4 — an animated preview: N frames, M ms apart. Render-only.
|
|
288
|
+
if (q.frames) argv.push("--frames", String(q.frames));
|
|
289
|
+
if (q.frame_ms) argv.push("--frame-ms", String(q.frame_ms));
|
|
287
290
|
return argv;
|
|
288
291
|
},
|
|
289
292
|
"/api/statusline/explain": (q) => ["statusline", "explain", String(q.at || "1:1"), ...slBoard(q)],
|
|
@@ -527,17 +530,41 @@ const WRITES = {
|
|
|
527
530
|
["width", "--width"], ["precision", "--precision"],
|
|
528
531
|
["min_width", "--min-width"], ["min_cols", "--min-cols"],
|
|
529
532
|
["max_cols", "--max-cols"], ["priority", "--priority"],
|
|
533
|
+
// v2.0.4 — the design fields. Same rule: absent sends nothing, "" clears.
|
|
534
|
+
["label_pos", "--label-pos"], ["value_pos", "--value-pos"],
|
|
535
|
+
["caption", "--caption"], ["caption_pos", "--caption-pos"],
|
|
536
|
+
["caption_align", "--caption-align"], ["caption_color", "--caption-color"],
|
|
537
|
+
["caption_case", "--caption-case"], ["fill_color", "--fill-color"],
|
|
538
|
+
["empty_color", "--empty-color"], ["ramp_colors", "--ramp-colors"],
|
|
539
|
+
["ramp_stops", "--ramp-stops"], ["fill_char", "--fill-char"],
|
|
540
|
+
["empty_char", "--empty-char"], ["brackets", "--brackets"],
|
|
541
|
+
["threshold", "--threshold"], ["pad_left", "--pad-left"],
|
|
542
|
+
["pad_right", "--pad-right"], ["align", "--align"], ["sign", "--sign"],
|
|
543
|
+
["max_len", "--max-len"], ["unknown", "--unknown"],
|
|
544
|
+
["color_by_state", "--state-color"], ["glyph_by_state", "--state-glyph"],
|
|
530
545
|
]) {
|
|
531
|
-
|
|
546
|
+
// An absent key sends nothing; a PRESENT "" or null sends `<flag> ""`,
|
|
547
|
+
// which the CLI reads as "delete the key" (inherit). Dropping it made a
|
|
548
|
+
// clear "succeed" while it changed nothing.
|
|
549
|
+
if (b[k] === undefined) continue;
|
|
550
|
+
argv.push(f, b[k] === null ? "" : String(b[k]));
|
|
532
551
|
}
|
|
533
552
|
if (b.draw_empty) argv.push("--draw-empty");
|
|
553
|
+
// `params` is an OBJECT, one `--param k=v` per key. The CLI scans every
|
|
554
|
+
// `--param`, and `k=` (a null or "" value) deletes that key.
|
|
555
|
+
if (b.params && typeof b.params === "object")
|
|
556
|
+
for (const [k, v] of Object.entries(b.params)) argv.push("--param", String(k) + "=" + (v === null || v === undefined ? "" : String(v)));
|
|
534
557
|
return argv.concat(slBoard(b));
|
|
535
558
|
},
|
|
536
559
|
"/api/statusline/move": (b) => ["statusline", "move", String(b.from), String(b.to), ...slBoard(b)],
|
|
537
560
|
"/api/statusline/remove": (b) => ["statusline", "remove", String(b.at), ...slBoard(b)],
|
|
538
561
|
"/api/statusline/line": (b) => {
|
|
539
562
|
const argv = ["statusline", "line", String(b.line)];
|
|
540
|
-
|
|
563
|
+
// A PRESENT key is forwarded even when it is "" — that is the clear.
|
|
564
|
+
for (const [k, f] of [["separator", "--separator"], ["prefix", "--prefix"], ["align", "--align"], ["sep_color", "--sep-color"]]) {
|
|
565
|
+
if (b[k] === undefined) continue;
|
|
566
|
+
argv.push(f, b[k] === null ? "" : String(b[k]));
|
|
567
|
+
}
|
|
541
568
|
if (b.theme) argv.push("--theme", String(b.theme));
|
|
542
569
|
if (b.max_width !== undefined) argv.push("--max-width", String(b.max_width));
|
|
543
570
|
return argv.concat(slBoard(b));
|
|
@@ -564,6 +591,8 @@ const WRITES = {
|
|
|
564
591
|
"/api/statusline/clone": (b) => ["statusline", "clone", String(b.at), ...slBoard(b)],
|
|
565
592
|
"/api/statusline/reset": (b) => ["statusline", "reset", ...slBoard(b)],
|
|
566
593
|
"/api/statusline/compile": (b) => ["statusline", "compile", ...slBoard(b)],
|
|
594
|
+
// v2.0.4 — the redraw timer: a settings write, not a layout op.
|
|
595
|
+
"/api/statusline/refresh": (b) => ["statusline", "refresh", String(b.seconds), ...slBoard(b)],
|
|
567
596
|
"/api/wait/unblock": (b) => (b.slug ? ["wait", "unblock", String(b.slug)] : ["wait", "unblock"]),
|
|
568
597
|
"/api/wait/cancel": (b) => (b.slug ? ["wait", "cancel", String(b.slug)] : ["wait", "cancel"]),
|
|
569
598
|
"/api/wiki/sync": () => ["wiki", "sync"],
|
|
@@ -836,6 +865,20 @@ const MAINTENANCE = {
|
|
|
836
865
|
label: "Recompile AGENTS.md from the wiki, patterns, PACT.md and boundary cards",
|
|
837
866
|
preview: ["export", "--check"],
|
|
838
867
|
},
|
|
868
|
+
// v2.1.0 W7 — clear old logs. The preview is the CLI's own print mode, which
|
|
869
|
+
// names EVERY file it would delete and every file it keeps, with the reason
|
|
870
|
+
// (a count is not consent). The day value comes from config
|
|
871
|
+
// (`log_retention_days`): the panel sends only this id. `status` is the
|
|
872
|
+
// no-scan summary the row shows before any preview (days, last sweep).
|
|
873
|
+
"clear-logs": {
|
|
874
|
+
apply: ["clear", "logs", "--apply"],
|
|
875
|
+
restarts_ui: false,
|
|
876
|
+
label: "Delete finished traces and run folders older than log_retention_days (never user data, never a waiting run)",
|
|
877
|
+
preview: ["clear", "logs"],
|
|
878
|
+
status: ["clear", "logs", "--summary"],
|
|
879
|
+
names_files: true,
|
|
880
|
+
danger: true,
|
|
881
|
+
},
|
|
839
882
|
// ADVANCED (v0.44.0) — the one action on this panel that does not target the
|
|
840
883
|
// project. Every other route pins `--dir <projectRoot>`; `--global` outranks
|
|
841
884
|
// `--dir` in `resolveClaudeDir`, so this pair reaches ~/.claude and its
|
|
@@ -1146,7 +1189,11 @@ async function handleApi(req, res, url, ctx) {
|
|
|
1146
1189
|
try {
|
|
1147
1190
|
body = await readBody(req);
|
|
1148
1191
|
} catch (_) {}
|
|
1149
|
-
|
|
1192
|
+
// The staged preview has nothing to replay here, so it answers with the
|
|
1193
|
+
// canned picture — the shape the panel reads, not "nothing ran".
|
|
1194
|
+
if (route === "/api/statusline/stage-preview")
|
|
1195
|
+
return json(res, 200, { ok: true, preview: fixtures.get("/api/statusline/preview", body), show: fixtures.get("/api/statusline/show", body) });
|
|
1196
|
+
const canned = fixtures.post(route, body);
|
|
1150
1197
|
if (canned)
|
|
1151
1198
|
return json(res, 200, {
|
|
1152
1199
|
ok: true,
|
|
@@ -1209,6 +1256,9 @@ async function handleApi(req, res, url, ctx) {
|
|
|
1209
1256
|
names_files: !!m.names_files,
|
|
1210
1257
|
advanced: !!m.advanced,
|
|
1211
1258
|
restarts_ui: !!m.restarts_ui,
|
|
1259
|
+
danger: !!m.danger,
|
|
1260
|
+
// The CLI's own no-scan summary (v2.1.0 W7) — never a number the panel computes.
|
|
1261
|
+
status: m.status ? readCli(m.status, ctx).data || null : null,
|
|
1212
1262
|
}));
|
|
1213
1263
|
return json(res, 200, { ok: true, exit_code: 0, data: { actions } });
|
|
1214
1264
|
}
|
|
@@ -1226,6 +1276,7 @@ async function handleApi(req, res, url, ctx) {
|
|
|
1226
1276
|
network: !!m.network,
|
|
1227
1277
|
names_files: !!m.names_files,
|
|
1228
1278
|
advanced: !!m.advanced,
|
|
1279
|
+
danger: !!m.danger,
|
|
1229
1280
|
// Said in the confirmation, not discovered afterwards. A panel that
|
|
1230
1281
|
// reloads itself without warning reads as a crash.
|
|
1231
1282
|
restarts_ui: !!m.restarts_ui,
|
|
@@ -1408,6 +1459,10 @@ async function handleApi(req, res, url, ctx) {
|
|
|
1408
1459
|
return json(res, 200, { ok: true, ...started });
|
|
1409
1460
|
}
|
|
1410
1461
|
|
|
1462
|
+
// v2.0.4 — the staged preview. NOT a mutation of this project: it runs in a
|
|
1463
|
+
// throwaway copy, so it neither waits on nor blocks a running job.
|
|
1464
|
+
if (route === "/api/statusline/stage-preview") return json(res, 200, stagePreview(body, ctx));
|
|
1465
|
+
|
|
1411
1466
|
const build = WRITES[route];
|
|
1412
1467
|
if (!build) return json(res, 404, { error: "unknown endpoint " + route });
|
|
1413
1468
|
if (job && job.running) return json(res, 409, { error: "busy", job: jobView() });
|
|
@@ -1417,8 +1472,7 @@ async function handleApi(req, res, url, ctx) {
|
|
|
1417
1472
|
} catch (_) {
|
|
1418
1473
|
return json(res, 400, { error: "bad request body" });
|
|
1419
1474
|
}
|
|
1420
|
-
if (argv
|
|
1421
|
-
return json(res, 400, { error: "missing argument" });
|
|
1475
|
+
if (!argvComplete(argv)) return json(res, 400, { error: "missing argument" });
|
|
1422
1476
|
const out = runCli(argv, ctx);
|
|
1423
1477
|
clearCache();
|
|
1424
1478
|
// A write's exit code is a REAL failure signal (validators exit 1), unlike a
|
|
@@ -1432,6 +1486,71 @@ async function handleApi(req, res, url, ctx) {
|
|
|
1432
1486
|
});
|
|
1433
1487
|
}
|
|
1434
1488
|
|
|
1489
|
+
// A write's argv is complete when no element is a lost value. `""` is a real
|
|
1490
|
+
// value right after a `--flag` — it is how a v2.0.3 clear is spelled — and is
|
|
1491
|
+
// refused only as a positional, together with "undefined" and "null".
|
|
1492
|
+
function argvComplete(argv) {
|
|
1493
|
+
return !argv.some((a, i) => {
|
|
1494
|
+
if (a === "undefined" || a === "null") return true;
|
|
1495
|
+
if (a !== "") return false;
|
|
1496
|
+
const prev = argv[i - 1];
|
|
1497
|
+
return !(typeof prev === "string" && prev.startsWith("--"));
|
|
1498
|
+
});
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
// The files a board's layout lives in, under `.claude/orc/`. The CLI's own
|
|
1502
|
+
// names; only the AUTHORED file is copied — the rest is compiled from it.
|
|
1503
|
+
const SL_LAYOUT_FILE = { status: "statusline-layout.json", subagent: "subagent-layout.json" };
|
|
1504
|
+
|
|
1505
|
+
// v2.0.4 — THE STAGED PREVIEW. The staged writes are replayed through the SAME
|
|
1506
|
+
// `WRITES` builders against a throwaway copy of this project's layout, then
|
|
1507
|
+
// the copy is previewed by the hook's own engine. Nothing touches the real
|
|
1508
|
+
// project, and the copy is always deleted.
|
|
1509
|
+
function stagePreview(body, ctx) {
|
|
1510
|
+
const b = body || {};
|
|
1511
|
+
const board = b.board === "subagent" ? "subagent" : "status";
|
|
1512
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "orc-stage-"));
|
|
1513
|
+
const sub = { ...ctx, projectRoot: tmp };
|
|
1514
|
+
try {
|
|
1515
|
+
const orcDir = path.join(tmp, ".claude", "orc");
|
|
1516
|
+
fs.mkdirSync(orcDir, { recursive: true });
|
|
1517
|
+
const src = path.join(ctx.projectRoot || "", ".claude", "orc", SL_LAYOUT_FILE[board]);
|
|
1518
|
+
if (ctx.projectRoot && fs.existsSync(src)) fs.copyFileSync(src, path.join(orcDir, SL_LAYOUT_FILE[board]));
|
|
1519
|
+
const actions = Array.isArray(b.actions) ? b.actions : [];
|
|
1520
|
+
for (let i = 0; i < actions.length; i++) {
|
|
1521
|
+
const a = actions[i] || {};
|
|
1522
|
+
const route = String(a.route || "");
|
|
1523
|
+
const build = route.startsWith("/api/statusline/") ? WRITES[route] : null;
|
|
1524
|
+
let argv = null;
|
|
1525
|
+
try {
|
|
1526
|
+
argv = build ? build(Object.assign({}, a.body || {}, { board: board })) : null;
|
|
1527
|
+
} catch (_) {
|
|
1528
|
+
argv = null;
|
|
1529
|
+
}
|
|
1530
|
+
if (!argv || !argvComplete(argv)) return { ok: false, failed: { index: i, output: "refused: " + route } };
|
|
1531
|
+
const out = runCli(argv, sub);
|
|
1532
|
+
if (out.exit_code !== 0)
|
|
1533
|
+
return { ok: false, failed: { index: i, output: (out.stdout + (out.stderr ? chr10 + out.stderr : "")).trim() } };
|
|
1534
|
+
}
|
|
1535
|
+
const q = { board };
|
|
1536
|
+
if (b.width) q.width = b.width;
|
|
1537
|
+
if (b.state) q.state = b.state;
|
|
1538
|
+
if (b.frames) q.frames = b.frames;
|
|
1539
|
+
if (b.frame_ms) q.frame_ms = b.frame_ms;
|
|
1540
|
+
const preview = runCli(READS["/api/statusline/preview"](q), sub, { json: true });
|
|
1541
|
+
const show = runCli(READS["/api/statusline/show"](q), sub, { json: true });
|
|
1542
|
+
return { ok: true, preview: preview.data, show: show.data };
|
|
1543
|
+
} finally {
|
|
1544
|
+
rmTree(tmp);
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
|
|
1548
|
+
function rmTree(dir) {
|
|
1549
|
+
try {
|
|
1550
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
1551
|
+
} catch (_) {}
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1435
1554
|
// `orc upgrade` replaces the package while your working tree may hold changes.
|
|
1436
1555
|
// Worth a warning before, not a surprise after.
|
|
1437
1556
|
function isDirtyTree(ctx) {
|
|
@@ -1448,4 +1567,4 @@ function isDirtyTree(ctx) {
|
|
|
1448
1567
|
}
|
|
1449
1568
|
}
|
|
1450
1569
|
|
|
1451
|
-
module.exports = { handleApi, clearCache, encodeBody, READS, WRITES, MAINTENANCE };
|
|
1570
|
+
module.exports = { handleApi, clearCache, encodeBody, READS, WRITES, MAINTENANCE, argvComplete, stagePreview };
|
|
@@ -772,3 +772,82 @@ button.hk-pick-row:hover {
|
|
|
772
772
|
.hk-boards {
|
|
773
773
|
margin-bottom: 4px;
|
|
774
774
|
}
|
|
775
|
+
|
|
776
|
+
/* v2.0.4 — the line head's options and the editor's new controls. All flex,
|
|
777
|
+
so each one wraps on a narrow screen by itself. */
|
|
778
|
+
.hk-line-opts-wrap {
|
|
779
|
+
display: flex;
|
|
780
|
+
align-items: center;
|
|
781
|
+
flex-wrap: wrap;
|
|
782
|
+
gap: 8px 14px;
|
|
783
|
+
}
|
|
784
|
+
.hk-input.hk-short {
|
|
785
|
+
width: 7em;
|
|
786
|
+
}
|
|
787
|
+
.hk-input.hk-char {
|
|
788
|
+
width: 3.5em;
|
|
789
|
+
text-align: center;
|
|
790
|
+
}
|
|
791
|
+
.hk-colour,
|
|
792
|
+
.hk-hex,
|
|
793
|
+
.hk-pair,
|
|
794
|
+
.hk-state-row {
|
|
795
|
+
display: flex;
|
|
796
|
+
align-items: center;
|
|
797
|
+
flex-wrap: wrap;
|
|
798
|
+
gap: 6px;
|
|
799
|
+
}
|
|
800
|
+
.hk-colour {
|
|
801
|
+
flex-direction: column;
|
|
802
|
+
align-items: flex-start;
|
|
803
|
+
}
|
|
804
|
+
.hk-hex-pick {
|
|
805
|
+
width: 32px;
|
|
806
|
+
height: 26px;
|
|
807
|
+
padding: 0;
|
|
808
|
+
border: 1px solid var(--line);
|
|
809
|
+
border-radius: 6px;
|
|
810
|
+
background: none;
|
|
811
|
+
cursor: pointer;
|
|
812
|
+
}
|
|
813
|
+
.hk-state-row {
|
|
814
|
+
margin: 4px 0;
|
|
815
|
+
}
|
|
816
|
+
.hk-state-name {
|
|
817
|
+
min-width: 8em;
|
|
818
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
819
|
+
font-size: 12px;
|
|
820
|
+
}
|
|
821
|
+
/* A case button's sample, under its name. */
|
|
822
|
+
.hk-pick-tip {
|
|
823
|
+
display: block;
|
|
824
|
+
font-size: 11px;
|
|
825
|
+
color: var(--text-dim);
|
|
826
|
+
}
|
|
827
|
+
/* The CLI's own refusal text for a staged change. */
|
|
828
|
+
.hk-stage-out {
|
|
829
|
+
margin: 0;
|
|
830
|
+
padding: 8px 10px;
|
|
831
|
+
white-space: pre-wrap;
|
|
832
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
833
|
+
font-size: 12px;
|
|
834
|
+
border: 1px solid var(--line);
|
|
835
|
+
border-radius: 6px;
|
|
836
|
+
background: var(--surface-2);
|
|
837
|
+
}
|
|
838
|
+
.hk-staged-tag {
|
|
839
|
+
color: var(--ok);
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
/* v2.0.4 — the redraw timer, under the advanced card. */
|
|
843
|
+
.hk-anim {
|
|
844
|
+
display: flex;
|
|
845
|
+
flex-direction: column;
|
|
846
|
+
gap: 6px;
|
|
847
|
+
margin-top: 10px;
|
|
848
|
+
padding-top: 10px;
|
|
849
|
+
border-top: 1px solid var(--line);
|
|
850
|
+
}
|
|
851
|
+
.hk-anim-head {
|
|
852
|
+
font-weight: 600;
|
|
853
|
+
}
|
|
@@ -451,6 +451,29 @@ const gotchaQuality = {
|
|
|
451
451
|
ok: true,
|
|
452
452
|
window_days: 90,
|
|
453
453
|
reviews: 12,
|
|
454
|
+
reviews_traced: 12,
|
|
455
|
+
reviews_observed: 9,
|
|
456
|
+
by_reviewer: { orc: 12, "/code-review": 2 },
|
|
457
|
+
project_reviews: 2,
|
|
458
|
+
// v2.1.0 W6 — `orc fix record`: the fixes made after a review, and the misses.
|
|
459
|
+
fixes: {
|
|
460
|
+
total: 5,
|
|
461
|
+
by_introduced_by: { orc: 2, ai: 1, human: 1, unknown: 1 },
|
|
462
|
+
by_source: { sonar: 2, defect: 2, ci: 1 },
|
|
463
|
+
causes: [
|
|
464
|
+
{ id: "sonar", n: 2, share: 0.4 },
|
|
465
|
+
{ id: "orc", n: 1, share: 0.2 },
|
|
466
|
+
{ id: "ai", n: 1, share: 0.2 },
|
|
467
|
+
{ id: "other", n: 1, share: 0.2 },
|
|
468
|
+
],
|
|
469
|
+
},
|
|
470
|
+
misses: {
|
|
471
|
+
total: 1,
|
|
472
|
+
by_category: [{ category: "functional.logic", n: 1 }],
|
|
473
|
+
list: [
|
|
474
|
+
{ obs: "9f2c41ab", at: new Date(NOW - 3 * DAY).toISOString().slice(0, 10), path: "src/orders/total.ts", lines: [40, 58], source: "sonar", rule: "sonar:typescript:S3776", category: "functional.logic", introduced_by: "orc", missed_by: "run-mini-total-290926-101500", fix_run: "run-quick-total-fix-021026-091200" },
|
|
475
|
+
],
|
|
476
|
+
},
|
|
454
477
|
floor: 5,
|
|
455
478
|
below_floor: false,
|
|
456
479
|
findings: 118,
|
|
@@ -473,6 +496,13 @@ const gotchaQualityLow = {
|
|
|
473
496
|
ok: true,
|
|
474
497
|
window_days: 30,
|
|
475
498
|
reviews: 3,
|
|
499
|
+
// v2.1.0 — one review counted from its trace only (a clean review).
|
|
500
|
+
reviews_traced: 3,
|
|
501
|
+
reviews_observed: 2,
|
|
502
|
+
by_reviewer: { orc: 3 },
|
|
503
|
+
project_reviews: 0,
|
|
504
|
+
fixes: { total: 0, by_introduced_by: { orc: 0, ai: 0, human: 0, unknown: 0 }, by_source: {}, causes: [{ id: "sonar", n: 0, share: 0 }, { id: "orc", n: 0, share: 0 }, { id: "ai", n: 0, share: 0 }, { id: "other", n: 0, share: 0 }] },
|
|
505
|
+
misses: { total: 0, by_category: [], list: [] },
|
|
476
506
|
floor: 5,
|
|
477
507
|
below_floor: true,
|
|
478
508
|
findings: 19,
|