ccqa 1.26.1 → 1.26.3
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/dist/bin/ccqa.mjs +55 -52
- package/dist/hub-client/index.d.mts +2 -2
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/dist/bin/ccqa.mjs
CHANGED
|
@@ -19256,7 +19256,7 @@ const HTML_BODY = `
|
|
|
19256
19256
|
<div class="card" id="runs-card">
|
|
19257
19257
|
<div class="table-wrap">
|
|
19258
19258
|
<table>
|
|
19259
|
-
<thead><tr><th data-i18n="runs.col.run">Run</th><th data-i18n="runs.col.
|
|
19259
|
+
<thead><tr><th data-i18n="runs.col.run">Run</th><th data-i18n="runs.col.status">Status</th><th data-i18n="runs.col.cost">Cost</th><th data-i18n="runs.col.created">Created</th></tr></thead>
|
|
19260
19260
|
<tbody id="runs-tbody"></tbody>
|
|
19261
19261
|
</table>
|
|
19262
19262
|
</div>
|
|
@@ -19699,6 +19699,8 @@ const CSS = `
|
|
|
19699
19699
|
/* which generation target ran the spec (agent-browser / playwright / runn) */
|
|
19700
19700
|
.badge-target { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--radius-sm); font-size: 11px; font-family: var(--mono); background: var(--surface-3); color: var(--muted); border: 1px solid var(--border); }
|
|
19701
19701
|
.chip { display: inline-flex; align-items: center; padding: 1px 8px; border-radius: 6px; background: var(--surface-3); border: 1px solid var(--border); color: var(--fg-dim); font-size: 12px; font-family: var(--mono); white-space: nowrap; }
|
|
19702
|
+
.chip.icon-chip { gap: 5px; padding-left: 6px; }
|
|
19703
|
+
.chip.icon-chip svg { width: 12px; height: 12px; flex: none; opacity: .7; }
|
|
19702
19704
|
/* Below .chip in source order so these override its background/border/color
|
|
19703
19705
|
when combined as class="chip drift-count-chip" (same specificity — source
|
|
19704
19706
|
order decides). One amber look for every drift label chip — a label chip
|
|
@@ -19715,13 +19717,6 @@ const CSS = `
|
|
|
19715
19717
|
indents the first one away from the label and the ratio line below it. */
|
|
19716
19718
|
.drift-meta-chips { display: flex; gap: 6px; }
|
|
19717
19719
|
.drift-meta-chips .chip { margin-left: 0; }
|
|
19718
|
-
.specs { display: inline-flex; align-items: center; gap: 9px; }
|
|
19719
|
-
.meter { width: 54px; height: 6px; border-radius: 3px; background: var(--fail-bg); overflow: hidden; }
|
|
19720
|
-
.meter i { display: block; height: 100%; background: var(--pass); }
|
|
19721
|
-
/* A drift row's bar fills with what the audit FOUND, so a full bar is the bad
|
|
19722
|
-
end — the opposite of a test run's. It must not be painted pass-green. */
|
|
19723
|
-
.meter.drift { background: var(--surface-3); }
|
|
19724
|
-
.meter.drift i { background: var(--amber-fill); }
|
|
19725
19720
|
|
|
19726
19721
|
/* run detail */
|
|
19727
19722
|
.rd-head { display: flex; align-items: flex-start; gap: 16px; flex-wrap: wrap; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 18px 20px; margin-bottom: 16px; }
|
|
@@ -20182,8 +20177,8 @@ const CLIENT_JS = `
|
|
|
20182
20177
|
"runs.title": "Runs", "runs.empty": "Select a project to see its runs.",
|
|
20183
20178
|
"runs.none": "No runs yet for this project.", "projects.none": "No projects yet. Create one to get started.", "projects.noneShort": "No projects yet",
|
|
20184
20179
|
"runs.noMatch": "No runs match this filter.",
|
|
20185
|
-
"runs.col.run": "Run", "runs.col.
|
|
20186
|
-
"runs.col.
|
|
20180
|
+
"runs.col.run": "Run", "runs.col.status": "Status",
|
|
20181
|
+
"runs.col.cost": "Cost", "runs.col.created": "Created",
|
|
20187
20182
|
"runs.totalCost": "Cost of these {n}:", "runs.capped": "showing the first {n}",
|
|
20188
20183
|
"runs.spend24h": "All spend, last 24h:",
|
|
20189
20184
|
"runs.filter.date": "Date", "runs.filter.kind": "Kind", "runs.filter.status": "Status",
|
|
@@ -20345,8 +20340,8 @@ const CLIENT_JS = `
|
|
|
20345
20340
|
"runs.title": "実行", "runs.empty": "プロジェクトを選択すると実行一覧が表示されます。",
|
|
20346
20341
|
"runs.none": "このプロジェクトにはまだ実行がありません。", "projects.none": "まだプロジェクトがありません。作成して始めましょう。", "projects.noneShort": "プロジェクトなし",
|
|
20347
20342
|
"runs.noMatch": "条件に一致する実行はありません。",
|
|
20348
|
-
"runs.col.run": "実行", "runs.col.
|
|
20349
|
-
"runs.col.
|
|
20343
|
+
"runs.col.run": "実行", "runs.col.status": "ステータス",
|
|
20344
|
+
"runs.col.cost": "コスト", "runs.col.created": "作成",
|
|
20350
20345
|
"runs.totalCost": "この {n} 件のコスト:", "runs.capped": "先頭 {n} 件のみ表示",
|
|
20351
20346
|
"runs.spend24h": "直近 24 時間の全支出:",
|
|
20352
20347
|
"runs.filter.date": "日付", "runs.filter.kind": "種類", "runs.filter.status": "結果",
|
|
@@ -20752,9 +20747,9 @@ const CLIENT_JS = `
|
|
|
20752
20747
|
|
|
20753
20748
|
// Which command left the run, and whether its spec counts are a tally of
|
|
20754
20749
|
// what was verified. A recording's rows are the specs it wrote, not specs it
|
|
20755
|
-
// checked, so "1 / 1 passed"
|
|
20756
|
-
//
|
|
20757
|
-
//
|
|
20750
|
+
// checked, so "1 / 1 passed" would claim a test result. A kind from a newer
|
|
20751
|
+
// hub keeps the generic label but is read the same cautious way, since
|
|
20752
|
+
// nothing here knows what its counts mean.
|
|
20758
20753
|
var KINDS = {
|
|
20759
20754
|
run: { label: "kind.run", verifies: true },
|
|
20760
20755
|
drift: { label: "kind.drift", verifies: true },
|
|
@@ -20864,6 +20859,45 @@ const CLIENT_JS = `
|
|
|
20864
20859
|
return svg;
|
|
20865
20860
|
}
|
|
20866
20861
|
|
|
20862
|
+
function svgCircle(cx, cy, r) {
|
|
20863
|
+
var c = document.createElementNS(SVG_NS, "circle");
|
|
20864
|
+
c.setAttribute("cx", cx);
|
|
20865
|
+
c.setAttribute("cy", cy);
|
|
20866
|
+
c.setAttribute("r", r);
|
|
20867
|
+
return c;
|
|
20868
|
+
}
|
|
20869
|
+
|
|
20870
|
+
/** A fork in a line — the conventional git-branch glyph. */
|
|
20871
|
+
function svgBranch() {
|
|
20872
|
+
var svg = svgIcon();
|
|
20873
|
+
svg.appendChild(svgPath("M6 3v12"));
|
|
20874
|
+
svg.appendChild(svgCircle("18", "6", "3"));
|
|
20875
|
+
svg.appendChild(svgCircle("6", "18", "3"));
|
|
20876
|
+
svg.appendChild(svgPath("M18 9a9 9 0 0 1-9 9"));
|
|
20877
|
+
return svg;
|
|
20878
|
+
}
|
|
20879
|
+
|
|
20880
|
+
/** Stacked racks — a profile names a deployed environment, not a code path. */
|
|
20881
|
+
function svgProfile() {
|
|
20882
|
+
var svg = svgIcon();
|
|
20883
|
+
svg.appendChild(svgPath("M4 4h16v6H4zM4 14h16v6H4z"));
|
|
20884
|
+
svg.appendChild(svgPath("M8 7h.01M8 17h.01"));
|
|
20885
|
+
return svg;
|
|
20886
|
+
}
|
|
20887
|
+
|
|
20888
|
+
/**
|
|
20889
|
+
* A chip whose glyph says which field it is. Two of these sit side by side on
|
|
20890
|
+
* every run, so without one they read as two unlabelled words. The title is
|
|
20891
|
+
* the fallback for anyone the glyph does not reach.
|
|
20892
|
+
*/
|
|
20893
|
+
function iconChip(icon, text, label) {
|
|
20894
|
+
var chip = el("span", "chip icon-chip");
|
|
20895
|
+
chip.title = label;
|
|
20896
|
+
chip.appendChild(icon);
|
|
20897
|
+
chip.appendChild(document.createTextNode(text));
|
|
20898
|
+
return chip;
|
|
20899
|
+
}
|
|
20900
|
+
|
|
20867
20901
|
// Round caps so the "i"/"!" dot (a zero-length segment) actually paints as a
|
|
20868
20902
|
// filled dot instead of vanishing under a butt cap at small sizes.
|
|
20869
20903
|
function svgRounded() {
|
|
@@ -21110,11 +21144,17 @@ const CLIENT_JS = `
|
|
|
21110
21144
|
var tr = el("tr", "row");
|
|
21111
21145
|
tr.addEventListener("click", function () { location.hash = "#/runs/" + encodeURIComponent(r.id); });
|
|
21112
21146
|
|
|
21147
|
+
// Four columns: which run, how it went, what it cost, when. Everything
|
|
21148
|
+
// else is one click away, and a column that has to mean something
|
|
21149
|
+
// different per kind (a spec tally that counts passes for a run and
|
|
21150
|
+
// findings for an audit) reads wrong before it reads useful.
|
|
21113
21151
|
var runCell = document.createElement("td");
|
|
21114
21152
|
runCell.appendChild(el("div", "runid", r.id.slice(0, 8)));
|
|
21115
21153
|
var sub = el("div", "subline");
|
|
21116
21154
|
sub.appendChild(ciBadge(r));
|
|
21117
21155
|
sub.appendChild(kindChip(r.kind));
|
|
21156
|
+
sub.appendChild(iconChip(svgBranch(), r.branch || "—", t("meta.branch")));
|
|
21157
|
+
if (r.profile) sub.appendChild(iconChip(svgProfile(), r.profile, t("meta.profile")));
|
|
21118
21158
|
if (r.kind === "drift") {
|
|
21119
21159
|
var rowDrift = driftSummary(r);
|
|
21120
21160
|
if (rowDrift) driftChips(rowDrift).forEach(function (chip) { sub.appendChild(chip); });
|
|
@@ -21122,47 +21162,10 @@ const CLIENT_JS = `
|
|
|
21122
21162
|
runCell.appendChild(sub);
|
|
21123
21163
|
tr.appendChild(runCell);
|
|
21124
21164
|
|
|
21125
|
-
var branchCell = document.createElement("td");
|
|
21126
|
-
branchCell.appendChild(el("span", "chip", r.branch || "—"));
|
|
21127
|
-
tr.appendChild(branchCell);
|
|
21128
|
-
|
|
21129
|
-
var profileCell = document.createElement("td");
|
|
21130
|
-
profileCell.appendChild(r.profile ? el("span", "chip", r.profile) : el("span", "muted", "—"));
|
|
21131
|
-
tr.appendChild(profileCell);
|
|
21132
|
-
|
|
21133
21165
|
var statusCell = document.createElement("td");
|
|
21134
21166
|
statusCell.appendChild(runStatusBadge(r));
|
|
21135
21167
|
tr.appendChild(statusCell);
|
|
21136
21168
|
|
|
21137
|
-
var specsCell = document.createElement("td");
|
|
21138
|
-
if (!kindOf(r.kind).verifies) {
|
|
21139
|
-
specsCell.appendChild(el("span", "muted", "—"));
|
|
21140
|
-
} else {
|
|
21141
|
-
// A drift row counts what the audit found, not what "passed" — the same
|
|
21142
|
-
// ratio its detail page shows. Reading passed/total here printed a
|
|
21143
|
-
// different number for the same run in the two places you would compare.
|
|
21144
|
-
var rowDriftSummary = r.kind === "drift" ? driftSummary(r) : null;
|
|
21145
|
-
var found = rowDriftSummary
|
|
21146
|
-
? rowDriftSummary.testDrift + rowDriftSummary.specChange + rowDriftSummary.unknown
|
|
21147
|
-
: null;
|
|
21148
|
-
var num = rowDriftSummary
|
|
21149
|
-
? found + " / " + rowDriftSummary.specs
|
|
21150
|
-
: r.specs.passed + " / " + r.specs.total;
|
|
21151
|
-
var fillTotal = rowDriftSummary ? rowDriftSummary.specs : r.specs.total;
|
|
21152
|
-
var fillPart = rowDriftSummary ? found : r.specs.passed;
|
|
21153
|
-
|
|
21154
|
-
var specsWrap = el("div", "specs");
|
|
21155
|
-
var meter = el("span", "meter" + (rowDriftSummary ? " drift" : ""));
|
|
21156
|
-
var pct = fillTotal > 0 ? Math.round((fillPart / fillTotal) * 100) : 0;
|
|
21157
|
-
var bar = el("i");
|
|
21158
|
-
bar.style.width = pct + "%";
|
|
21159
|
-
meter.appendChild(bar);
|
|
21160
|
-
specsWrap.appendChild(meter);
|
|
21161
|
-
specsWrap.appendChild(el("span", "num muted", num));
|
|
21162
|
-
specsCell.appendChild(specsWrap);
|
|
21163
|
-
}
|
|
21164
|
-
tr.appendChild(specsCell);
|
|
21165
|
-
|
|
21166
21169
|
tr.appendChild(el("td", "muted num", costText(r.costUsd)));
|
|
21167
21170
|
tr.appendChild(el("td", "muted num", relTime(r.createdAt)));
|
|
21168
21171
|
tbody.appendChild(tr);
|
|
@@ -35,9 +35,9 @@ declare const RunSchema: z.ZodObject<{
|
|
|
35
35
|
running: "running";
|
|
36
36
|
}>;
|
|
37
37
|
kind: z.ZodDefault<z.ZodEnum<{
|
|
38
|
-
record: "record";
|
|
39
38
|
run: "run";
|
|
40
39
|
drift: "drift";
|
|
40
|
+
record: "record";
|
|
41
41
|
}>>;
|
|
42
42
|
drift: z.ZodDefault<z.ZodNullable<z.ZodObject<{
|
|
43
43
|
specs: z.ZodNumber;
|
|
@@ -615,9 +615,9 @@ type ReportSpecResult = z.infer<typeof ReportSpecResultSchema>;
|
|
|
615
615
|
declare const RunReportDataSchema: z.ZodObject<{
|
|
616
616
|
schemaVersion: z.ZodLiteral<1>;
|
|
617
617
|
kind: z.ZodDefault<z.ZodEnum<{
|
|
618
|
-
record: "record";
|
|
619
618
|
run: "run";
|
|
620
619
|
drift: "drift";
|
|
620
|
+
record: "record";
|
|
621
621
|
}>>;
|
|
622
622
|
createdAt: z.ZodString;
|
|
623
623
|
runId: z.ZodNullable<z.ZodString>;
|
package/dist/package.json
CHANGED