@cef-ai/cli 4.1.0 → 4.2.0
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/cli-program.d.ts +7 -0
- package/dist/cli-program.d.ts.map +1 -1
- package/dist/cli-program.js +61 -8
- package/dist/cli-program.js.map +1 -1
- package/dist/commands/eval.d.ts +18 -1
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +32 -4
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/eval.test.js +1 -1
- package/dist/commands/eval.test.js.map +1 -1
- package/dist/commands/push.d.ts +55 -0
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +80 -5
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/release-cli.d.ts +77 -0
- package/dist/commands/release-cli.d.ts.map +1 -0
- package/dist/commands/release-cli.js +543 -0
- package/dist/commands/release-cli.js.map +1 -0
- package/dist/commands/release-view.d.ts +118 -0
- package/dist/commands/release-view.d.ts.map +1 -0
- package/dist/commands/release-view.js +321 -0
- package/dist/commands/release-view.js.map +1 -0
- package/dist/commands/release.d.ts +132 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.js +198 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/lib/ddc.d.ts +29 -0
- package/dist/lib/ddc.d.ts.map +1 -1
- package/dist/lib/ddc.js +37 -1
- package/dist/lib/ddc.js.map +1 -1
- package/dist/lib/env.d.ts +6 -0
- package/dist/lib/env.d.ts.map +1 -1
- package/dist/lib/env.js +12 -0
- package/dist/lib/env.js.map +1 -1
- package/dist/lib/eval-target.d.ts +37 -3
- package/dist/lib/eval-target.d.ts.map +1 -1
- package/dist/lib/eval-target.js +66 -7
- package/dist/lib/eval-target.js.map +1 -1
- package/dist/lib/eval-target.test.js +36 -3
- package/dist/lib/eval-target.test.js.map +1 -1
- package/dist/lib/registry-read.d.ts +27 -0
- package/dist/lib/registry-read.d.ts.map +1 -0
- package/dist/lib/registry-read.js +93 -0
- package/dist/lib/registry-read.js.map +1 -0
- package/dist/lib/release-review.d.ts +30 -0
- package/dist/lib/release-review.d.ts.map +1 -0
- package/dist/lib/release-review.js +72 -0
- package/dist/lib/release-review.js.map +1 -0
- package/dist/lib/vault-publish.d.ts +3 -1
- package/dist/lib/vault-publish.d.ts.map +1 -1
- package/dist/lib/vault-publish.js +5 -3
- package/dist/lib/vault-publish.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How `cef release`, `cef release list|show|diff`, `cef check` and
|
|
3
|
+
* `cef deploy <version>` print — the board's terminal format — and the
|
|
4
|
+
* release-aware deploy itself.
|
|
5
|
+
*
|
|
6
|
+
* Colour only on a terminal (and never with $NO_COLOR): green ✓, yellow ⚠,
|
|
7
|
+
* red ✗, dim for the meta lines, bold for the verdict. `--json` prints the
|
|
8
|
+
* data instead, for agents.
|
|
9
|
+
*/
|
|
10
|
+
import { type ReleaseBlock, type ReleaseMark, type ReleaseReview, type WorkflowDiff } from "@cef-ai/eval";
|
|
11
|
+
import type { RegistryReader } from "../lib/registry-read.js";
|
|
12
|
+
import type { DatasetResult, LiveRow, ReleaseHead, ReleaseOutcome } from "./release.js";
|
|
13
|
+
export interface Paint {
|
|
14
|
+
ok(s: string): string;
|
|
15
|
+
warn(s: string): string;
|
|
16
|
+
err(s: string): string;
|
|
17
|
+
dim(s: string): string;
|
|
18
|
+
bold(s: string): string;
|
|
19
|
+
}
|
|
20
|
+
export declare function paint(on: boolean): Paint;
|
|
21
|
+
/** Colour when `stream` is a terminal and $NO_COLOR is unset. */
|
|
22
|
+
export declare const paintFor: (stream: {
|
|
23
|
+
isTTY?: boolean;
|
|
24
|
+
}) => Paint;
|
|
25
|
+
/** `hiring-screener · content a91c3e0 · from 0.4.2` and the notes line. */
|
|
26
|
+
export declare function formatReleaseHead(h: ReleaseHead, p: Paint): string[];
|
|
27
|
+
/** Step labels by node id, for review findings. */
|
|
28
|
+
export declare function stepLabels(graph: unknown): Record<string, string>;
|
|
29
|
+
/** The Review row and its findings. */
|
|
30
|
+
export declare function formatReviewRows(review: ReleaseReview | undefined, labels: Record<string, string>, p: Paint): string[];
|
|
31
|
+
/** One row per required dataset: `golden ✓ 0.93 live 0.91 required`. */
|
|
32
|
+
export declare function formatExperimentRows(experiments: DatasetResult[], p: Paint): string[];
|
|
33
|
+
/** Where a release is shown in ROC. */
|
|
34
|
+
export declare function releaseLink(roc: string, asPubkey: string | undefined, workflowId: string, version: string): string | null;
|
|
35
|
+
/** Everything after the head: the checks, then the verdict. */
|
|
36
|
+
export declare function formatReleaseBody(o: ReleaseOutcome, graph: unknown, p: Paint, link: string | null): string[];
|
|
37
|
+
export interface ReleaseRow {
|
|
38
|
+
version: string;
|
|
39
|
+
title: string;
|
|
40
|
+
mark: ReleaseMark;
|
|
41
|
+
/** Share of the default traffic it serves, 0–100; absent when not live. */
|
|
42
|
+
live?: number;
|
|
43
|
+
author?: string;
|
|
44
|
+
createdAt?: string;
|
|
45
|
+
release?: ReleaseBlock;
|
|
46
|
+
}
|
|
47
|
+
/** Every numbered release, newest first, read from the registry. */
|
|
48
|
+
export declare function listReleases(registry: RegistryReader, rows: LiveRow[] | null): Promise<ReleaseRow[]>;
|
|
49
|
+
/** `today`, else `27 Oct`. */
|
|
50
|
+
export declare function shortDate(iso: string | undefined, now: Date): string;
|
|
51
|
+
export declare function markText(m: ReleaseMark, short?: boolean): string;
|
|
52
|
+
export declare function formatReleaseList(rows: ReleaseRow[], p: Paint, now: Date): string;
|
|
53
|
+
export declare function formatReleaseShow(row: ReleaseRow, p: Paint, graph: unknown): string;
|
|
54
|
+
export declare function formatDiff(d: WorkflowDiff, p: Paint): string;
|
|
55
|
+
/** The graph a version's manifest carries. */
|
|
56
|
+
export declare function graphOf(registry: RegistryReader, version: string): Promise<unknown>;
|
|
57
|
+
export declare function diffReleases(registry: RegistryReader, a: string, b: string): Promise<WorkflowDiff>;
|
|
58
|
+
export interface DeployReleasePorts {
|
|
59
|
+
registry: RegistryReader;
|
|
60
|
+
deployments(): Promise<Array<LiveRow & Record<string, unknown>> | null>;
|
|
61
|
+
/** Upsert one row (`PUT …/deployments/<name>`); resolves to the new revision. */
|
|
62
|
+
upsert(row: Record<string, unknown>, note: string): Promise<number | undefined>;
|
|
63
|
+
/**
|
|
64
|
+
* Point the registry's `latest` at the version. vault-api delivers a
|
|
65
|
+
* workflow's events, schedules and webhooks from the manifest `latest`
|
|
66
|
+
* names, so it follows what is deployed.
|
|
67
|
+
*/
|
|
68
|
+
moveLatest(version: string): Promise<void>;
|
|
69
|
+
/** Interactive yes/no; undefined when there is no terminal to ask on. */
|
|
70
|
+
confirm?: (question: string) => Promise<boolean>;
|
|
71
|
+
}
|
|
72
|
+
export interface DeployReleasePlan {
|
|
73
|
+
workflowId: string;
|
|
74
|
+
version: string;
|
|
75
|
+
title: string;
|
|
76
|
+
mark: ReleaseMark;
|
|
77
|
+
/** What it replaces: `0.4.2 (live, 100%)`, or several rows of a split. */
|
|
78
|
+
replaces: Array<{
|
|
79
|
+
version: string;
|
|
80
|
+
share: number;
|
|
81
|
+
}>;
|
|
82
|
+
/** The version the registry's `latest` names now; null when none. */
|
|
83
|
+
latest: string | null;
|
|
84
|
+
}
|
|
85
|
+
/** The DEFAULT deployment row ROC deploys and rolls back through. */
|
|
86
|
+
export declare const DEFAULT_DEPLOYMENT = "default";
|
|
87
|
+
export declare function planReleaseDeploy(workflowId: string, version: string, ports: DeployReleasePorts): Promise<DeployReleasePlan>;
|
|
88
|
+
/** The release already serves all of the default traffic. */
|
|
89
|
+
export declare function isAlreadyLive(plan: DeployReleasePlan): boolean;
|
|
90
|
+
export declare function formatDeployPlan(plan: DeployReleasePlan, p: Paint): string[];
|
|
91
|
+
/**
|
|
92
|
+
* The "default" row a release deploy repoints — refused unless repointing it
|
|
93
|
+
* makes the release serve ALL of the default traffic. Live is the lowest-
|
|
94
|
+
* priority tier of enabled, untargeted rows, so another row there (a split, a
|
|
95
|
+
* canary, a disabled "default") would keep serving and "Deployed" would be a
|
|
96
|
+
* lie. Splits are out of scope for `cef deploy <version>`.
|
|
97
|
+
*/
|
|
98
|
+
export declare function rowToRepoint(plan: Pick<DeployReleasePlan, "workflowId" | "version">, rows: Array<LiveRow & Record<string, unknown>> | null): LiveRow & Record<string, unknown>;
|
|
99
|
+
/**
|
|
100
|
+
* Make a release live at 100%: repoint the default deployment row at it, the
|
|
101
|
+
* way ROC's Deploy and Roll back do, then point `latest` at it. A release with
|
|
102
|
+
* review warnings needs a yes on a terminal, or `--accept-warnings` without
|
|
103
|
+
* one.
|
|
104
|
+
*
|
|
105
|
+
* The row moves first: it is what serves runs, and `latest` only decides which
|
|
106
|
+
* version's triggers vault-api delivers. When the row moved and `latest` did
|
|
107
|
+
* not, the error says so and a re-run finishes it (an already-live release
|
|
108
|
+
* only moves `latest`).
|
|
109
|
+
*/
|
|
110
|
+
export declare function deployRelease(plan: DeployReleasePlan, ports: DeployReleasePorts, opts: {
|
|
111
|
+
acceptWarnings?: boolean;
|
|
112
|
+
author?: string;
|
|
113
|
+
}): Promise<{
|
|
114
|
+
revision?: number;
|
|
115
|
+
deployed: boolean;
|
|
116
|
+
movedLatest: boolean;
|
|
117
|
+
}>;
|
|
118
|
+
//# sourceMappingURL=release-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-view.d.ts","sourceRoot":"","sources":["../../src/commands/release-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How `cef release`, `cef release list|show|diff`, `cef check` and
|
|
3
|
+
* `cef deploy <version>` print — the board's terminal format — and the
|
|
4
|
+
* release-aware deploy itself.
|
|
5
|
+
*
|
|
6
|
+
* Colour only on a terminal (and never with $NO_COLOR): green ✓, yellow ⚠,
|
|
7
|
+
* red ✗, dim for the meta lines, bold for the verdict. `--json` prints the
|
|
8
|
+
* data instead, for agents.
|
|
9
|
+
*/
|
|
10
|
+
import { diffWorkflows, isCandidateVersion, isReleaseVersion, releaseMark, releaseOf, releasesNewestFirst, reviewRuleName, shortHash, workflowContentOf, } from "@cef-ai/eval";
|
|
11
|
+
import { liveShares, servingTier } from "../lib/eval-target.js";
|
|
12
|
+
import { ReleaseError, SKIP_REVIEW_REASON } from "./release.js";
|
|
13
|
+
const wrap = (on, open) => (s) => (on ? `\x1b[${open}m${s}\x1b[0m` : s);
|
|
14
|
+
export function paint(on) {
|
|
15
|
+
return { ok: wrap(on, "32"), warn: wrap(on, "33"), err: wrap(on, "31"), dim: wrap(on, "2"), bold: wrap(on, "1") };
|
|
16
|
+
}
|
|
17
|
+
/** Colour when `stream` is a terminal and $NO_COLOR is unset. */
|
|
18
|
+
export const paintFor = (stream) => paint(!!stream.isTTY && !process.env.NO_COLOR);
|
|
19
|
+
const pad = (s, n) => (s.length >= n ? `${s} ` : s.padEnd(n));
|
|
20
|
+
const rate = (r) => (r == null ? "n/a" : r.toFixed(2));
|
|
21
|
+
/* ------------------------------------------------------------------------ */
|
|
22
|
+
/* cef release */
|
|
23
|
+
/* ------------------------------------------------------------------------ */
|
|
24
|
+
/** `hiring-screener · content a91c3e0 · from 0.4.2` and the notes line. */
|
|
25
|
+
export function formatReleaseHead(h, p) {
|
|
26
|
+
const lines = [p.dim(`${h.workflowId} · content ${shortHash(h.contentHash)}${h.from ? ` · from ${h.from}` : ""}`)];
|
|
27
|
+
if (h.notesFrom) {
|
|
28
|
+
const n = h.notesFrom.commits;
|
|
29
|
+
lines.push(p.dim(`notes: ${n} commit${n === 1 ? "" : "s"} since ${h.notesFrom.since} (edit with --notes or --notes-file)`));
|
|
30
|
+
}
|
|
31
|
+
else if (!h.notesGiven) {
|
|
32
|
+
lines.push(p.dim("notes: none (add with --notes or --notes-file)"));
|
|
33
|
+
}
|
|
34
|
+
return lines;
|
|
35
|
+
}
|
|
36
|
+
/** Step labels by node id, for review findings. */
|
|
37
|
+
export function stepLabels(graph) {
|
|
38
|
+
const out = {};
|
|
39
|
+
const nodes = graph?.nodes ?? [];
|
|
40
|
+
for (const n of nodes) {
|
|
41
|
+
if (typeof n?.id !== "string")
|
|
42
|
+
continue;
|
|
43
|
+
const params = (n.params ?? {});
|
|
44
|
+
const label = [n.label, params.label, params.name].find((v) => typeof v === "string" && v.trim() !== "");
|
|
45
|
+
out[n.id] = label ?? n.id;
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
/** The Review row and its findings. */
|
|
50
|
+
export function formatReviewRows(review, labels, p) {
|
|
51
|
+
if (!review)
|
|
52
|
+
return [` ${pad("Review", 13)}${p.dim("not run")}`];
|
|
53
|
+
if (review.status === "skipped") {
|
|
54
|
+
// Asked to skip, or it failed to run: either way, not a review.
|
|
55
|
+
const label = review.reason === SKIP_REVIEW_REASON ? "skipped" : "not run";
|
|
56
|
+
return [` ${pad("Review", 13)}${pad(label, 22)}${p.dim(review.reason ?? "")}`];
|
|
57
|
+
}
|
|
58
|
+
if (review.status === "clean")
|
|
59
|
+
return [` ${pad("Review", 13)}${p.ok("✓ clean")}`];
|
|
60
|
+
const n = review.findings.length;
|
|
61
|
+
const lines = [` ${pad("Review", 13)}${p.warn(pad(`⚠ ${n} warning${n === 1 ? "" : "s"}`, 22))}${p.dim("does not block")}`];
|
|
62
|
+
const names = review.findings.map((f) => (f.step ? labels[f.step] ?? f.step : reviewRuleName(f.rule)));
|
|
63
|
+
const w = Math.max(...names.map((s) => s.length)) + 2;
|
|
64
|
+
review.findings.forEach((f, i) => lines.push(` ${pad(names[i], w)}${f.text}`));
|
|
65
|
+
return lines;
|
|
66
|
+
}
|
|
67
|
+
/** One row per required dataset: `golden ✓ 0.93 live 0.91 required`. */
|
|
68
|
+
export function formatExperimentRows(experiments, p) {
|
|
69
|
+
if (experiments.length === 0)
|
|
70
|
+
return [` ${pad("Experiments", 13)}${p.dim("No required experiments. Set them in Evaluations.")}`];
|
|
71
|
+
const lines = [];
|
|
72
|
+
for (const e of experiments) {
|
|
73
|
+
const mark = e.passed ? p.ok(pad(`✓ ${rate(e.accuracy)}`, 8)) : p.err(pad(`✗ ${rate(e.accuracy)}`, 8));
|
|
74
|
+
const against = e.rule.kind === "atLeast"
|
|
75
|
+
? `needs ${e.rule.value.toFixed(2)}`
|
|
76
|
+
: e.baseline ? (e.baseline.accuracy === null ? "no live run" : `live ${rate(e.baseline.accuracy)}`) : "nothing live";
|
|
77
|
+
lines.push(` ${pad(e.dataset, 13)}${mark}${pad(against, 14)}${p.dim(e.reused ? "required · reused" : "required")}`);
|
|
78
|
+
if (!e.passed) {
|
|
79
|
+
const n = e.failedCases ?? 0;
|
|
80
|
+
lines.push(` ${" ".repeat(13)}${n} failed: cef eval cases ${e.experimentId} --failed`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return lines;
|
|
84
|
+
}
|
|
85
|
+
/** Where a release is shown in ROC. */
|
|
86
|
+
export function releaseLink(roc, asPubkey, workflowId, version) {
|
|
87
|
+
if (!asPubkey)
|
|
88
|
+
return null;
|
|
89
|
+
return `${roc.replace(/\/+$/, "")}/#/agent-services/${asPubkey}/workflows/${encodeURIComponent(workflowId)}?tab=releases&release=${encodeURIComponent(version)}`;
|
|
90
|
+
}
|
|
91
|
+
/** Everything after the head: the checks, then the verdict. */
|
|
92
|
+
export function formatReleaseBody(o, graph, p, link) {
|
|
93
|
+
const lines = ["", ...formatReviewRows(o.review, stepLabels(graph), p), ...formatExperimentRows(o.experiments, p), ""];
|
|
94
|
+
if (o.status === "blocked") {
|
|
95
|
+
const n = o.experiments.filter((e) => !e.passed).length;
|
|
96
|
+
lines.push(`${p.err("Not released.")} ${n} required dataset${n === 1 ? "" : "s"} failed.`);
|
|
97
|
+
return lines;
|
|
98
|
+
}
|
|
99
|
+
lines.push(`${p.bold(`Released ${o.head.version}`)} ${p.dim(`not deployed · ${o.live ? `live is ${o.live}` : "nothing is live"}`)}`);
|
|
100
|
+
if (link)
|
|
101
|
+
lines.push(p.dim(link));
|
|
102
|
+
return lines;
|
|
103
|
+
}
|
|
104
|
+
/** Every numbered release, newest first, read from the registry. */
|
|
105
|
+
export async function listReleases(registry, rows) {
|
|
106
|
+
const { versions } = await registry.record();
|
|
107
|
+
const shares = liveShares(rows);
|
|
108
|
+
return Promise.all(releasesNewestFirst(versions).map(async (version) => {
|
|
109
|
+
const manifest = await registry.manifest(version);
|
|
110
|
+
const release = releaseOf(manifest);
|
|
111
|
+
const card = (manifest?.card ?? {});
|
|
112
|
+
const title = release?.title ?? (typeof manifest?.goal === "string" ? manifest.goal : typeof card.description === "string" ? card.description : "");
|
|
113
|
+
const share = shares.get(version);
|
|
114
|
+
return {
|
|
115
|
+
version,
|
|
116
|
+
title,
|
|
117
|
+
mark: releaseMark(release),
|
|
118
|
+
...(share !== undefined ? { live: share } : {}),
|
|
119
|
+
...(release ? { author: authorName(release), createdAt: release.createdAt, release } : {}),
|
|
120
|
+
};
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
function authorName(r) {
|
|
124
|
+
const a = r.author;
|
|
125
|
+
if (a.name?.trim())
|
|
126
|
+
return a.name.trim().split(/\s+/)[0];
|
|
127
|
+
if (a.email)
|
|
128
|
+
return a.email.split("@")[0];
|
|
129
|
+
return a.pubKey ? `${a.pubKey.slice(0, 8)}…` : "";
|
|
130
|
+
}
|
|
131
|
+
const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
132
|
+
/** `today`, else `27 Oct`. */
|
|
133
|
+
export function shortDate(iso, now) {
|
|
134
|
+
if (!iso)
|
|
135
|
+
return "";
|
|
136
|
+
const d = new Date(iso);
|
|
137
|
+
if (Number.isNaN(d.getTime()))
|
|
138
|
+
return "";
|
|
139
|
+
if (d.toDateString() === now.toDateString())
|
|
140
|
+
return "today";
|
|
141
|
+
return `${d.getDate()} ${MONTHS[d.getMonth()]}`;
|
|
142
|
+
}
|
|
143
|
+
export function markText(m, short = true) {
|
|
144
|
+
if (m.kind === "clean" && m.reviewNotRun)
|
|
145
|
+
return short ? "✓ no review" : "✓ experiments · AI review not run";
|
|
146
|
+
if (m.kind === "clean")
|
|
147
|
+
return "✓";
|
|
148
|
+
if (m.kind === "warnings")
|
|
149
|
+
return short ? `⚠ ${m.warnings}` : `⚠ ${m.warnings} review warning${m.warnings === 1 ? "" : "s"}`;
|
|
150
|
+
return "Not checked";
|
|
151
|
+
}
|
|
152
|
+
const paintMark = (m, s, p) => (m.kind === "clean" ? p.ok(s) : m.kind === "warnings" ? p.warn(s) : p.dim(s));
|
|
153
|
+
export function formatReleaseList(rows, p, now) {
|
|
154
|
+
if (rows.length === 0)
|
|
155
|
+
return "No releases yet. Make one with cef release.";
|
|
156
|
+
const tw = Math.min(24, Math.max(...rows.map((r) => r.title.length))) + 2;
|
|
157
|
+
return rows.map((r) => {
|
|
158
|
+
const title = r.title.length > 24 ? `${r.title.slice(0, 23)}…` : r.title;
|
|
159
|
+
const live = r.live !== undefined ? p.ok(pad(`live ${r.live}%`, 11)) : " ".repeat(11);
|
|
160
|
+
return ` ${pad(r.version, 7)}${pad(title, tw)}${paintMark(r.mark, pad(markText(r.mark), 12), p)}${live}${pad(r.author ?? "", 6)}${shortDate(r.createdAt, now)}`.trimEnd();
|
|
161
|
+
}).join("\n");
|
|
162
|
+
}
|
|
163
|
+
export function formatReleaseShow(row, p, graph) {
|
|
164
|
+
const r = row.release;
|
|
165
|
+
const lines = [p.bold(`${row.version} ${row.title}`.trimEnd())];
|
|
166
|
+
if (!r) {
|
|
167
|
+
lines.push(p.dim(`released before checks existed · ${row.live !== undefined ? `live ${row.live}%` : "not deployed"}`));
|
|
168
|
+
lines.push("", "AI review and experiments: not run. cef check " + row.version + " runs them.");
|
|
169
|
+
return lines.join("\n");
|
|
170
|
+
}
|
|
171
|
+
const who = r.author.name ?? r.author.email ?? (r.author.pubKey ? `${r.author.pubKey.slice(0, 10)}…` : "unknown");
|
|
172
|
+
lines.push(p.dim([
|
|
173
|
+
`released by ${who}, ${r.createdAt.replace("T", " ").slice(0, 16)}`,
|
|
174
|
+
r.source === "cli" ? "from the CLI" : "from the editor",
|
|
175
|
+
`content ${shortHash(r.contentHash)}`,
|
|
176
|
+
row.live !== undefined ? `live ${row.live}%` : "not deployed",
|
|
177
|
+
].join(" · ")));
|
|
178
|
+
if (r.commit)
|
|
179
|
+
lines.push(p.dim(`commit ${r.commit.slice(0, 12)}${r.repo ? ` · ${r.repo}` : ""}`));
|
|
180
|
+
if (r.notes.trim())
|
|
181
|
+
lines.push("", "Notes", ...r.notes.split("\n").map((l) => ` ${l}`));
|
|
182
|
+
lines.push("", ...formatReviewRows(r.checks.review, stepLabels(graph), p));
|
|
183
|
+
const review = r.checks.review;
|
|
184
|
+
if (review && review.status !== "skipped") {
|
|
185
|
+
for (const f of review.findings)
|
|
186
|
+
if (f.fix)
|
|
187
|
+
lines.push(p.dim(` fix: ${f.fix}`));
|
|
188
|
+
if (review.passed.length)
|
|
189
|
+
lines.push(p.dim(` ${review.passed.length} passed: ${review.passed.map(reviewRuleName).join(", ")}`));
|
|
190
|
+
}
|
|
191
|
+
lines.push(...formatExperimentRows(r.checks.experiments, p));
|
|
192
|
+
return lines.join("\n");
|
|
193
|
+
}
|
|
194
|
+
export function formatDiff(d, p) {
|
|
195
|
+
if (d.changes.length === 0)
|
|
196
|
+
return " No changes to the graph.";
|
|
197
|
+
const w = Math.max(...d.changes.map((c) => c.label.length)) + 2;
|
|
198
|
+
return d.changes.map((c) => {
|
|
199
|
+
const sym = c.kind === "added" ? p.ok("+") : c.kind === "removed" ? p.err("−") : p.warn("~");
|
|
200
|
+
return ` ${sym} ${pad(c.label, w)}${c.detail}`;
|
|
201
|
+
}).join("\n");
|
|
202
|
+
}
|
|
203
|
+
/** The graph a version's manifest carries. */
|
|
204
|
+
export async function graphOf(registry, version) {
|
|
205
|
+
const m = await registry.manifest(version);
|
|
206
|
+
if (!m)
|
|
207
|
+
throw new ReleaseError(`[cef release] ${version} does not exist`);
|
|
208
|
+
return workflowContentOf(m).graph;
|
|
209
|
+
}
|
|
210
|
+
export async function diffReleases(registry, a, b) {
|
|
211
|
+
return diffWorkflows(await graphOf(registry, a), await graphOf(registry, b));
|
|
212
|
+
}
|
|
213
|
+
/** The DEFAULT deployment row ROC deploys and rolls back through. */
|
|
214
|
+
export const DEFAULT_DEPLOYMENT = "default";
|
|
215
|
+
export async function planReleaseDeploy(workflowId, version, ports) {
|
|
216
|
+
if (isCandidateVersion(version))
|
|
217
|
+
throw new ReleaseError(`[cef deploy] ${version} is a check candidate, not a release`);
|
|
218
|
+
if (!isReleaseVersion(version))
|
|
219
|
+
throw new ReleaseError(`[cef deploy] deploy takes a release number X.Y.Z (got "${version}")`);
|
|
220
|
+
const { versions, latest } = await ports.registry.record();
|
|
221
|
+
if (!versions.includes(version))
|
|
222
|
+
throw new ReleaseError(`[cef deploy] ${workflowId} has no release ${version}`);
|
|
223
|
+
const manifest = await ports.registry.manifest(version);
|
|
224
|
+
const release = releaseOf(manifest);
|
|
225
|
+
const shares = liveShares(await ports.deployments());
|
|
226
|
+
return {
|
|
227
|
+
workflowId,
|
|
228
|
+
version,
|
|
229
|
+
title: release?.title ?? "",
|
|
230
|
+
mark: releaseMark(release),
|
|
231
|
+
replaces: [...shares].map(([v, share]) => ({ version: v, share })),
|
|
232
|
+
latest,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/** The release already serves all of the default traffic. */
|
|
236
|
+
export function isAlreadyLive(plan) {
|
|
237
|
+
return plan.replaces.length === 1 && plan.replaces[0].version === plan.version && plan.replaces[0].share === 100;
|
|
238
|
+
}
|
|
239
|
+
export function formatDeployPlan(plan, p) {
|
|
240
|
+
const replaces = plan.replaces.length === 0
|
|
241
|
+
? "nothing is live"
|
|
242
|
+
: plan.replaces.length === 1
|
|
243
|
+
? `replaces ${plan.replaces[0].version} (live, ${plan.replaces[0].share}%)`
|
|
244
|
+
: `replaces ${plan.replaces.map((r) => `${r.version} at ${r.share}%`).join(", ")}`;
|
|
245
|
+
return [
|
|
246
|
+
p.dim(plan.workflowId),
|
|
247
|
+
` ${pad(plan.version, 7)}${pad(plan.title, 25)}${paintMark(plan.mark, markText(plan.mark, false), p)}`.trimEnd(),
|
|
248
|
+
` ${replaces}`,
|
|
249
|
+
// Allowed — it is how a version from before checks is rolled back to —
|
|
250
|
+
// but said, since nothing vouches for it.
|
|
251
|
+
...(plan.mark.kind === "unchecked" ? [` ${p.warn(`⚠ ${plan.version} was not released with checks`)}`] : []),
|
|
252
|
+
];
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* The "default" row a release deploy repoints — refused unless repointing it
|
|
256
|
+
* makes the release serve ALL of the default traffic. Live is the lowest-
|
|
257
|
+
* priority tier of enabled, untargeted rows, so another row there (a split, a
|
|
258
|
+
* canary, a disabled "default") would keep serving and "Deployed" would be a
|
|
259
|
+
* lie. Splits are out of scope for `cef deploy <version>`.
|
|
260
|
+
*/
|
|
261
|
+
export function rowToRepoint(plan, rows) {
|
|
262
|
+
const all = rows ?? [];
|
|
263
|
+
const row = all.find((r) => r.name === DEFAULT_DEPLOYMENT);
|
|
264
|
+
if (!row) {
|
|
265
|
+
throw new ReleaseError(`[cef deploy] ${plan.workflowId} has no "${DEFAULT_DEPLOYMENT}" deployment to repoint — deploy it once from ROC, `
|
|
266
|
+
+ "or apply a deployments/ folder with cef deploy (no version)");
|
|
267
|
+
}
|
|
268
|
+
const after = all.map((r) => (r === row ? { ...r, version: plan.version, enabled: true } : r));
|
|
269
|
+
const shares = liveShares(after);
|
|
270
|
+
if (shares.size === 1 && shares.get(plan.version) === 100)
|
|
271
|
+
return row;
|
|
272
|
+
const others = servingTier(after).filter((r) => r.name !== DEFAULT_DEPLOYMENT && r.version !== plan.version);
|
|
273
|
+
const who = others.length
|
|
274
|
+
? `${others.map((r) => `"${r.name}" (${r.version})`).join(", ")} ${others.length === 1 ? "serves" : "serve"} the default traffic beside or instead of it`
|
|
275
|
+
: `"${DEFAULT_DEPLOYMENT}" does not serve the default traffic (it is targeted, or outranked)`;
|
|
276
|
+
throw new ReleaseError(`[cef deploy] repointing "${DEFAULT_DEPLOYMENT}" would not make ${plan.version} live: ${who}. `
|
|
277
|
+
+ "cef deploy <version> moves only that one row; change a split or another serving row in ROC, "
|
|
278
|
+
+ "or apply a deployments/ folder with cef deploy (no version)");
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Make a release live at 100%: repoint the default deployment row at it, the
|
|
282
|
+
* way ROC's Deploy and Roll back do, then point `latest` at it. A release with
|
|
283
|
+
* review warnings needs a yes on a terminal, or `--accept-warnings` without
|
|
284
|
+
* one.
|
|
285
|
+
*
|
|
286
|
+
* The row moves first: it is what serves runs, and `latest` only decides which
|
|
287
|
+
* version's triggers vault-api delivers. When the row moved and `latest` did
|
|
288
|
+
* not, the error says so and a re-run finishes it (an already-live release
|
|
289
|
+
* only moves `latest`).
|
|
290
|
+
*/
|
|
291
|
+
export async function deployRelease(plan, ports, opts) {
|
|
292
|
+
let revision;
|
|
293
|
+
if (!isAlreadyLive(plan)) {
|
|
294
|
+
const row = rowToRepoint(plan, await ports.deployments());
|
|
295
|
+
if (plan.mark.kind === "warnings" && !opts.acceptWarnings) {
|
|
296
|
+
const n = plan.mark.warnings;
|
|
297
|
+
if (!ports.confirm) {
|
|
298
|
+
throw new ReleaseError(`${plan.version} has ${n} review warning${n === 1 ? "" : "s"}. Re-run with --accept-warnings.`);
|
|
299
|
+
}
|
|
300
|
+
if (!(await ports.confirm("Deploy anyway? [y/N] ")))
|
|
301
|
+
return { deployed: false, movedLatest: false };
|
|
302
|
+
}
|
|
303
|
+
const live = plan.replaces.map((r) => r.version);
|
|
304
|
+
const note = live.length && !live.includes(plan.version) ? `deploy ${plan.version}, replacing ${live.join(", ")}` : `deploy ${plan.version}`;
|
|
305
|
+
revision = await ports.upsert({ ...row, version: plan.version, enabled: true }, note);
|
|
306
|
+
}
|
|
307
|
+
let movedLatest = false;
|
|
308
|
+
if (plan.latest !== plan.version) {
|
|
309
|
+
try {
|
|
310
|
+
await ports.moveLatest(plan.version);
|
|
311
|
+
movedLatest = true;
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
throw new ReleaseError(`[cef deploy] ${plan.version} is deployed${revision !== undefined ? ` (revision ${revision})` : ""}, but \`latest\` still names `
|
|
315
|
+
+ `${plan.latest ?? "nothing"}, so its events, schedules and webhooks are still ${plan.latest ? `${plan.latest}'s` : "not delivered"}. `
|
|
316
|
+
+ `Re-run cef deploy ${plan.version} to finish. (${e instanceof Error ? e.message : String(e)})`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return { ...(revision !== undefined ? { revision } : {}), deployed: true, movedLatest };
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=release-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-view.js","sourceRoot":"","sources":["../../src/commands/release-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cef release [version]` — make a numbered, checked version of a workflow.
|
|
3
|
+
*
|
|
4
|
+
* The same flow as ROC's Release dialog:
|
|
5
|
+
*
|
|
6
|
+
* 1. hash the graph (`contentHash`) of the workflow built in `dist/`;
|
|
7
|
+
* 2. reuse what `checks/<hash>.json` already holds for it;
|
|
8
|
+
* 3. otherwise publish a CANDIDATE `0.0.0-c.<hash7>` (never `latest`) and,
|
|
9
|
+
* side by side, ask the AI review (never blocks; `--skip-review`) and run
|
|
10
|
+
* every dataset marked "Required for release" against the candidate;
|
|
11
|
+
* 4. store the results under the hash;
|
|
12
|
+
* 5. a required dataset that failed → no version is created (exit 1).
|
|
13
|
+
* Otherwise publish the numbered version with its `release` block. It is
|
|
14
|
+
* not deployed, and `latest` does not move: vault-api delivers a
|
|
15
|
+
* workflow's events, schedules and webhooks from the manifest `latest`
|
|
16
|
+
* names, so `latest` follows what is deployed. `cef deploy <version>`
|
|
17
|
+
* repoints the deployment and then `latest`.
|
|
18
|
+
*
|
|
19
|
+
* The work is done against injected ports so the flow and its exit codes are
|
|
20
|
+
* testable without DDC, a vault or an orchestrator; `cli-program.ts` wires the
|
|
21
|
+
* real ones.
|
|
22
|
+
*/
|
|
23
|
+
import { type EvalStore, type Experiment, type ReleaseAuthor, type ReleaseBlock, type ReleaseExperiment, type ReleaseReview } from "@cef-ai/eval";
|
|
24
|
+
import type { RegistryReader } from "../lib/registry-read.js";
|
|
25
|
+
/** One deployment row as the release flow reads it. */
|
|
26
|
+
export interface LiveRow {
|
|
27
|
+
name: string;
|
|
28
|
+
version: string;
|
|
29
|
+
targeting: string;
|
|
30
|
+
/** Absent reads as 1 (see `liveOf`). */
|
|
31
|
+
weight?: number;
|
|
32
|
+
/** Absent reads as 0. */
|
|
33
|
+
priority?: number;
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface ReleasePorts {
|
|
37
|
+
registry: RegistryReader;
|
|
38
|
+
/** The workflow's deployment rows; null when it has never been deployed. */
|
|
39
|
+
deployments(): Promise<LiveRow[] | null>;
|
|
40
|
+
/** The vault store its evaluations live in, or why it cannot be reached. */
|
|
41
|
+
evals(): Promise<EvalStore>;
|
|
42
|
+
/** Publish the built workflow under `version`. */
|
|
43
|
+
publish(input: {
|
|
44
|
+
version: string;
|
|
45
|
+
release?: ReleaseBlock;
|
|
46
|
+
moveLatest: boolean;
|
|
47
|
+
}): Promise<void>;
|
|
48
|
+
/** Run `dataset` (its latest version, cut when the cases changed) against `version`. */
|
|
49
|
+
runExperiment(dataset: string, version: string): Promise<Experiment>;
|
|
50
|
+
review(input: {
|
|
51
|
+
graph: unknown;
|
|
52
|
+
}): Promise<ReleaseReview>;
|
|
53
|
+
author(): Promise<ReleaseAuthor>;
|
|
54
|
+
git: {
|
|
55
|
+
/** The repo's remote URL and HEAD commit; null outside a git checkout. */
|
|
56
|
+
head(): Promise<{
|
|
57
|
+
repo?: string;
|
|
58
|
+
commit: string;
|
|
59
|
+
} | null>;
|
|
60
|
+
/** Commit subjects in `since..HEAD`, newest first; null when `since` is unknown here. */
|
|
61
|
+
subjectsSince(since: string): Promise<string[] | null>;
|
|
62
|
+
/** HEAD's subject. */
|
|
63
|
+
headSubject(): Promise<string | null>;
|
|
64
|
+
};
|
|
65
|
+
now(): Date;
|
|
66
|
+
}
|
|
67
|
+
export interface ReleaseInput {
|
|
68
|
+
workflowId: string;
|
|
69
|
+
/** The built manifest (`dist/<id>/manifest.json`). */
|
|
70
|
+
manifest: Record<string, unknown>;
|
|
71
|
+
version?: string;
|
|
72
|
+
title?: string;
|
|
73
|
+
notes?: string;
|
|
74
|
+
skipReview?: boolean;
|
|
75
|
+
ports: ReleasePorts;
|
|
76
|
+
/** Called once the version, hash and notes are known, before any check runs. */
|
|
77
|
+
onStart?: (head: ReleaseHead) => void;
|
|
78
|
+
}
|
|
79
|
+
export interface ReleaseHead {
|
|
80
|
+
workflowId: string;
|
|
81
|
+
version: string;
|
|
82
|
+
contentHash: string;
|
|
83
|
+
from: string | null;
|
|
84
|
+
/** Where the notes came from when they were not given. */
|
|
85
|
+
notesFrom: {
|
|
86
|
+
commits: number;
|
|
87
|
+
since: string;
|
|
88
|
+
} | null;
|
|
89
|
+
notesGiven: boolean;
|
|
90
|
+
}
|
|
91
|
+
export interface DatasetResult extends ReleaseExperiment {
|
|
92
|
+
/** Taken from `checks/<hash>.json`, not run now. */
|
|
93
|
+
reused?: boolean;
|
|
94
|
+
/** Why the rule failed: `needs 80% and got 71%`. */
|
|
95
|
+
reason?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface ReleaseOutcome {
|
|
98
|
+
head: ReleaseHead;
|
|
99
|
+
status: "released" | "blocked";
|
|
100
|
+
review: ReleaseReview;
|
|
101
|
+
experiments: DatasetResult[];
|
|
102
|
+
/** What is live now: the version serving the most default traffic (`liveOf`). */
|
|
103
|
+
live: string | null;
|
|
104
|
+
release?: ReleaseBlock;
|
|
105
|
+
}
|
|
106
|
+
/** A failure the person can act on; the CLI prints it and exits 1. */
|
|
107
|
+
export declare class ReleaseError extends Error {
|
|
108
|
+
}
|
|
109
|
+
export declare function cefRelease(input: ReleaseInput): Promise<ReleaseOutcome>;
|
|
110
|
+
export interface CheckOutcome {
|
|
111
|
+
workflowId: string;
|
|
112
|
+
version: string;
|
|
113
|
+
contentHash: string;
|
|
114
|
+
review: ReleaseReview;
|
|
115
|
+
experiments: DatasetResult[];
|
|
116
|
+
passed: boolean;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* `cef check <version>` — run the checks on a release that exists, e.g. one
|
|
120
|
+
* made before checks existed. The manifest is immutable, so nothing on the
|
|
121
|
+
* release changes: the results go to `checks/<hash>.json`, where the next
|
|
122
|
+
* release of the same graph reuses them.
|
|
123
|
+
*/
|
|
124
|
+
export declare function cefCheck(input: {
|
|
125
|
+
workflowId: string;
|
|
126
|
+
version: string;
|
|
127
|
+
skipReview?: boolean;
|
|
128
|
+
ports: ReleasePorts;
|
|
129
|
+
}): Promise<CheckOutcome>;
|
|
130
|
+
/** The reason a review skipped on request carries; any other skip failed to run. */
|
|
131
|
+
export declare const SKIP_REVIEW_REASON = "--skip-review";
|
|
132
|
+
//# sourceMappingURL=release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"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"}
|