@zenera/cli 1.1.24 → 1.1.26
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/README.md +65 -0
- package/dist/ask.js +28 -5
- package/dist/banner.js +2 -2
- package/dist/batch.d.ts +6 -0
- package/dist/batch.js +76 -1
- package/dist/catalog.d.ts +31 -1
- package/dist/catalog.js +140 -7
- package/dist/commands/index.js +2 -0
- package/dist/commands/inspect.d.ts +52 -2
- package/dist/commands/inspect.js +220 -31
- package/dist/commands/memory.js +156 -32
- package/dist/commands/meta.js +333 -24
- package/dist/commands/models.js +97 -12
- package/dist/commands/open.js +4 -4
- package/dist/commands/run.js +38 -4
- package/dist/commands/sandbox.js +148 -16
- package/dist/commands/view.d.ts +8 -0
- package/dist/commands/view.js +114 -0
- package/dist/engine.d.ts +8 -1
- package/dist/engine.js +7 -0
- package/dist/eventlog.d.ts +64 -0
- package/dist/eventlog.js +170 -0
- package/dist/liveness.d.ts +7 -0
- package/dist/liveness.js +35 -3
- package/dist/main.js +0 -0
- package/dist/meta/editor.d.ts +9 -0
- package/dist/meta/editor.js +43 -0
- package/dist/meta/finetune/analyze-brief.d.ts +26 -0
- package/dist/meta/finetune/analyze-brief.js +131 -0
- package/dist/meta/finetune/apply-brief.d.ts +23 -0
- package/dist/meta/finetune/apply-brief.js +247 -0
- package/dist/meta/finetune/brief.d.ts +45 -0
- package/dist/meta/finetune/brief.js +158 -0
- package/dist/meta/finetune/children.d.ts +8 -0
- package/dist/meta/finetune/children.js +76 -0
- package/dist/meta/finetune/command.d.ts +30 -0
- package/dist/meta/finetune/command.js +516 -0
- package/dist/meta/finetune/cost.d.ts +46 -0
- package/dist/meta/finetune/cost.js +105 -0
- package/dist/meta/finetune/dataset/anchors.d.ts +41 -0
- package/dist/meta/finetune/dataset/anchors.js +239 -0
- package/dist/meta/finetune/dataset/changes.d.ts +36 -0
- package/dist/meta/finetune/dataset/changes.js +319 -0
- package/dist/meta/finetune/dataset/command.d.ts +17 -0
- package/dist/meta/finetune/dataset/command.js +1011 -0
- package/dist/meta/finetune/dataset/drift.d.ts +33 -0
- package/dist/meta/finetune/dataset/drift.js +71 -0
- package/dist/meta/finetune/dataset/export.d.ts +26 -0
- package/dist/meta/finetune/dataset/export.js +51 -0
- package/dist/meta/finetune/dataset/index.d.ts +2 -0
- package/dist/meta/finetune/dataset/index.js +2 -0
- package/dist/meta/finetune/dataset/sample.d.ts +50 -0
- package/dist/meta/finetune/dataset/sample.js +197 -0
- package/dist/meta/finetune/dataset/schema.d.ts +33 -0
- package/dist/meta/finetune/dataset/schema.js +216 -0
- package/dist/meta/finetune/dataset/store.d.ts +35 -0
- package/dist/meta/finetune/dataset/store.js +177 -0
- package/dist/meta/finetune/dataset/types.d.ts +127 -0
- package/dist/meta/finetune/dataset/types.js +39 -0
- package/dist/meta/finetune/failure.d.ts +15 -0
- package/dist/meta/finetune/failure.js +26 -0
- package/dist/meta/finetune/feedback.d.ts +57 -0
- package/dist/meta/finetune/feedback.js +104 -0
- package/dist/meta/finetune/guard.d.ts +29 -0
- package/dist/meta/finetune/guard.js +104 -0
- package/dist/meta/finetune/improvements.d.ts +98 -0
- package/dist/meta/finetune/improvements.js +501 -0
- package/dist/meta/finetune/index.d.ts +2 -0
- package/dist/meta/finetune/index.js +2 -0
- package/dist/meta/finetune/journal.d.ts +35 -0
- package/dist/meta/finetune/journal.js +135 -0
- package/dist/meta/finetune/live.d.ts +84 -0
- package/dist/meta/finetune/live.js +272 -0
- package/dist/meta/finetune/loop.d.ts +3 -0
- package/dist/meta/finetune/loop.js +163 -0
- package/dist/meta/finetune/memories.d.ts +47 -0
- package/dist/meta/finetune/memories.js +154 -0
- package/dist/meta/finetune/recheck.d.ts +58 -0
- package/dist/meta/finetune/recheck.js +311 -0
- package/dist/meta/finetune/report.d.ts +40 -0
- package/dist/meta/finetune/report.js +1397 -0
- package/dist/meta/finetune/retry.d.ts +24 -0
- package/dist/meta/finetune/retry.js +96 -0
- package/dist/meta/finetune/sampler.d.ts +18 -0
- package/dist/meta/finetune/sampler.js +47 -0
- package/dist/meta/finetune/system.d.ts +27 -0
- package/dist/meta/finetune/system.js +132 -0
- package/dist/meta/finetune/train.d.ts +43 -0
- package/dist/meta/finetune/train.js +425 -0
- package/dist/meta/finetune/tui.d.ts +16 -0
- package/dist/meta/finetune/tui.js +316 -0
- package/dist/meta/finetune/tuning.d.ts +193 -0
- package/dist/meta/finetune/tuning.js +308 -0
- package/dist/meta/finetune/usage.d.ts +66 -0
- package/dist/meta/finetune/usage.js +260 -0
- package/dist/meta/finetune/view.d.ts +9 -0
- package/dist/meta/finetune/view.js +27 -0
- package/dist/meta/host.d.ts +15 -0
- package/dist/meta/host.js +21 -0
- package/dist/meta/index.d.ts +11 -0
- package/dist/meta/index.js +11 -0
- package/dist/meta/launch.d.ts +81 -0
- package/dist/meta/launch.js +286 -0
- package/dist/meta/model.d.ts +44 -0
- package/dist/meta/model.js +119 -0
- package/dist/meta/prompts.d.ts +18 -0
- package/dist/meta/prompts.js +61 -0
- package/dist/meta/relay.d.ts +20 -0
- package/dist/meta/relay.js +123 -0
- package/dist/meta/tokens.d.ts +52 -0
- package/dist/meta/tokens.js +226 -0
- package/dist/meta/window.d.ts +61 -0
- package/dist/meta/window.js +198 -0
- package/dist/meta/wire.d.ts +42 -0
- package/dist/meta/wire.js +129 -0
- package/dist/meta.d.ts +71 -1
- package/dist/meta.js +303 -6
- package/dist/modelref.d.ts +16 -0
- package/dist/modelref.js +41 -0
- package/dist/narrate.js +5 -2
- package/dist/podman.d.ts +26 -0
- package/dist/podman.js +83 -3
- package/dist/projects.d.ts +0 -5
- package/dist/projects.js +2 -15
- package/dist/resources.d.ts +215 -0
- package/dist/resources.js +856 -0
- package/dist/sandbox.d.ts +2 -0
- package/dist/sandbox.js +10 -3
- package/dist/scaffold.d.ts +15 -7
- package/dist/scaffold.js +24 -67
- package/dist/session.js +4 -29
- package/dist/term.d.ts +2 -0
- package/dist/term.js +11 -2
- package/dist/trace.d.ts +5 -0
- package/dist/trace.js +107 -7
- package/dist/tui/app.js +19 -5
- package/dist/tui/links.d.ts +27 -0
- package/dist/tui/links.js +142 -0
- package/dist/tui/models.d.ts +35 -0
- package/dist/tui/models.js +447 -0
- package/dist/tui/sandbox.d.ts +10 -0
- package/dist/tui/sandbox.js +131 -0
- package/dist/tui/wrap.d.ts +5 -0
- package/dist/tui/wrap.js +12 -0
- package/dist/usage.d.ts +78 -0
- package/dist/usage.js +51 -0
- package/package.json +4 -2
- package/templates/editor/.github/copilot-instructions.md +60 -145
- package/templates/editor/.github/prompts/analyze.prompt.md +33 -0
- package/templates/editor/.github/prompts/dataset.prompt.md +108 -0
- package/templates/editor/.github/prompts/finetune-apply.prompt.md +270 -0
- package/templates/editor/.github/prompts/finetune.prompt.md +691 -198
- package/templates/editor/.github/prompts/new-agent.prompt.md +3 -1
- package/templates/editor/.github/prompts/new-skill.prompt.md +2 -0
- package/templates/editor/.github/prompts/project-review.prompt.md +5 -4
- package/templates/editor/.github/skills/zen-analyze-run/SKILL.md +588 -0
- package/templates/editor/.github/skills/zen-cli/SKILL.md +9 -1
- package/templates/editor/.github/skills/zen-cli/references/dataset.md +34 -0
- package/templates/editor/.github/skills/zen-cli/references/finetune.md +137 -0
- package/templates/editor/.github/skills/zen-cli/references/inspect.md +63 -11
- package/templates/editor/.github/skills/zen-cli/references/memory.md +33 -10
- package/templates/editor/.github/skills/zen-cli/references/meta.md +61 -0
- package/templates/editor/.github/skills/zen-cli/references/models.md +5 -1
- package/templates/editor/.github/skills/zen-cli/references/projects.md +4 -6
- package/templates/editor/.github/skills/zen-cli/references/rag.md +24 -6
- package/templates/editor/.github/skills/zen-cli/references/sandbox.md +35 -14
- package/templates/editor/.github/skills/zen-code-python/SKILL.md +123 -0
- package/templates/editor/.github/skills/zen-code-python/references/code_python.md +48 -0
- package/templates/editor/.github/skills/zen-dataset/SKILL.md +253 -0
- package/templates/editor/.github/skills/zen-finetune/SKILL.md +1492 -660
- package/templates/editor/.github/skills/zen-finetune/references/readme-template.md +268 -0
- package/templates/editor/.github/skills/zen-finetune/scripts/batch.mjs +390 -0
- package/templates/editor/.github/skills/zen-finetune/scripts/difficult.mjs +243 -0
- package/templates/editor/.github/skills/zen-finetune/scripts/memory.mjs +280 -0
- package/templates/editor/.github/skills/zen-finetune/scripts/next.mjs +398 -0
- package/templates/editor/.github/skills/zen-finetune/scripts/report.mjs +797 -0
- package/templates/editor/.github/skills/zen-finetune/scripts/select.mjs +354 -0
- package/templates/editor/.github/skills/zen-finetune/scripts/usage.mjs +722 -0
- package/templates/editor/.github/skills/zen-inspect/SKILL.md +74 -26
- package/templates/editor/.github/skills/zen-inspect-ask/SKILL.md +271 -0
- package/templates/editor/.github/skills/zen-instructions/SKILL.md +4 -12
- package/templates/editor/.github/skills/zen-memory/SKILL.md +82 -53
- package/templates/editor/.github/skills/zen-rag-docs/SKILL.md +20 -8
- package/templates/editor/.github/skills/zen-review/SKILL.md +8 -31
- package/templates/editor/.github/skills/zen-review/scripts/check-paths.sh +5 -5
- package/templates/editor/.github/skills/zen-review/scripts/review.sh +3 -12
- package/templates/editor/.github/skills/zen-sandbox/SKILL.md +9 -4
- package/templates/editor/.github/skills/zen-sandbox-capacity/SKILL.md +2 -2
- package/templates/editor/.github/skills/zen-spec-sync/SKILL.md +2 -4
- package/templates/editor/.github/skills/zen-topology/SKILL.md +283 -0
- package/templates/editor/.vscode/settings.json +1 -0
- package/templates/project/agents/files-instructions.md +29 -20
- package/templates/project/agents/fork-instructions.md +78 -28
- package/templates/project/agents/memory-instructions.md +222 -494
- package/templates/project/agents/tools-instructions.md +14 -4
- package/templates/project/gitignore +2 -0
- package/templates/editor/.github/skills/zen-finetune/scripts/collect.sh +0 -432
- package/templates/editor/.github/skills/zen-finetune/scripts/sample.sh +0 -199
- package/templates/editor/.github/skills/zen-memory/scripts/check-instructions.sh +0 -116
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { basename, join } from 'node:path';
|
|
4
|
+
import { readFeedback } from "./feedback.js";
|
|
5
|
+
import { resultOf, selection } from "./sampler.js";
|
|
6
|
+
import { keepAnalysis, runOnce } from "./train.js";
|
|
7
|
+
import { readJson } from "./tuning.js";
|
|
8
|
+
/** A case is broken only after failing this many tries in a row. */
|
|
9
|
+
export const GUARD_TRIES = 2;
|
|
10
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
11
|
+
/** Completed cases outside `exclude`, in an order fixed by the seed and the apply. */
|
|
12
|
+
export function guardCases(t, apply, exclude) {
|
|
13
|
+
const key = (id) => createHash('sha256').update(`${t.config.seed}:${apply}:${id}`).digest('hex');
|
|
14
|
+
return selection(t)
|
|
15
|
+
.filter((c) => !exclude.has(c.id) && resultOf(t, c)?.state === 'completed')
|
|
16
|
+
.sort((a, b) => key(a.id).localeCompare(key(b.id)))
|
|
17
|
+
.slice(0, t.config.guard);
|
|
18
|
+
}
|
|
19
|
+
/** Runs the guard for one attempt of an apply; `patch` is that attempt's diff. */
|
|
20
|
+
export async function guard(t, dir, attempt, exclude, patch) {
|
|
21
|
+
const cases = guardCases(t, basename(dir), exclude);
|
|
22
|
+
if (cases.length === 0) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
const seats = cases.map((c) => ({
|
|
26
|
+
case: c.id,
|
|
27
|
+
try: 1,
|
|
28
|
+
step: 'run',
|
|
29
|
+
dir: join(dir, 'guard', `a${attempt}`, c.id),
|
|
30
|
+
since: Date.now(),
|
|
31
|
+
}));
|
|
32
|
+
if (t.improvements.current) {
|
|
33
|
+
t.improvements.current.guard = seats;
|
|
34
|
+
}
|
|
35
|
+
t.event({
|
|
36
|
+
what: 'guard',
|
|
37
|
+
detail: `${basename(dir)}: ${cases.map((c) => c.id).join(', ')} run again on the edit`,
|
|
38
|
+
});
|
|
39
|
+
const results = await Promise.all(cases.map((c, i) => guardOne(t, join(dir, 'guard', `a${attempt}`, c.id), c, patch, seats[i])));
|
|
40
|
+
writeFileSync(join(dir, 'guard.json'), `${JSON.stringify(results, null, 2)}\n`);
|
|
41
|
+
return results;
|
|
42
|
+
}
|
|
43
|
+
async function guardOne(t, dir, c, patch, seat) {
|
|
44
|
+
const tries = [];
|
|
45
|
+
for (let n = 1; n <= GUARD_TRIES; n++) {
|
|
46
|
+
const at = join(dir, `${pad(n)}-nomem`);
|
|
47
|
+
const one = await tryOne(t, c, at, n, patch, seat);
|
|
48
|
+
tries.push(one);
|
|
49
|
+
if (one.passed) {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const broken = tries.length === GUARD_TRIES && tries.every((x) => !x.passed);
|
|
54
|
+
Object.assign(seat, { step: broken ? 'broken' : 'passed', since: Date.now() });
|
|
55
|
+
t.event({
|
|
56
|
+
what: broken ? 'guard broken' : 'guard passed',
|
|
57
|
+
case: c.id,
|
|
58
|
+
rev: c.rev,
|
|
59
|
+
detail: tries.map((x) => x.verdict).join(', '),
|
|
60
|
+
});
|
|
61
|
+
return { case: c.id, tries, broken };
|
|
62
|
+
}
|
|
63
|
+
/** A run or an analysis that says nothing about the prose counts as a pass: only a graded failure undoes an apply. */
|
|
64
|
+
async function tryOne(t, c, dir, n, patch, seat) {
|
|
65
|
+
mkdirSync(dir, { recursive: true });
|
|
66
|
+
Object.assign(seat, { try: n, step: 'run', dir, since: Date.now() });
|
|
67
|
+
const why = await runOnce(t, c, dir);
|
|
68
|
+
if (why) {
|
|
69
|
+
return { dir, verdict: 'void', passed: true, summary: why };
|
|
70
|
+
}
|
|
71
|
+
const run = readJson(join(dir, 'run.json'));
|
|
72
|
+
const file = join(dir, 'feedback.json');
|
|
73
|
+
Object.assign(seat, { step: 'analyze', since: Date.now() });
|
|
74
|
+
const res = await t.zen([
|
|
75
|
+
'meta',
|
|
76
|
+
'run',
|
|
77
|
+
'--no-refresh',
|
|
78
|
+
'--json',
|
|
79
|
+
'--events',
|
|
80
|
+
join(dir, 'analyze.events.jsonl'),
|
|
81
|
+
'--session-id',
|
|
82
|
+
randomUUID(),
|
|
83
|
+
'/analyze',
|
|
84
|
+
run.dir,
|
|
85
|
+
`case=${c.id}`,
|
|
86
|
+
`rev=${c.rev}`,
|
|
87
|
+
'phase=nomem',
|
|
88
|
+
`attempt=${n}`,
|
|
89
|
+
`feedback=${file}`,
|
|
90
|
+
`guard=${patch}`,
|
|
91
|
+
], join(dir, 'analyze.log'));
|
|
92
|
+
keepAnalysis(dir, res.stdout);
|
|
93
|
+
const read = readFeedback(file, { case: c.id, caseRev: c.rev, phase: 'nomem', attempt: n }, c.rubric.map((r) => r.id));
|
|
94
|
+
if (!('feedback' in read)) {
|
|
95
|
+
return { dir, verdict: 'unread', passed: true, summary: read.problem };
|
|
96
|
+
}
|
|
97
|
+
const f = read.feedback;
|
|
98
|
+
if (f.verdict === 'void') {
|
|
99
|
+
return { dir, verdict: 'void', passed: true, summary: f.infra };
|
|
100
|
+
}
|
|
101
|
+
const passed = f.verdict === 'right' && !Object.values(f.rubric).includes('fail');
|
|
102
|
+
return { dir, verdict: f.verdict, passed, summary: f.summary };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=guard.js.map
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { type Cost } from './cost.ts';
|
|
2
|
+
import { type Feedback, type Improvement } from './feedback.ts';
|
|
3
|
+
import { type Seat, type Tuning } from './tuning.ts';
|
|
4
|
+
export interface AppliedFile {
|
|
5
|
+
ids: string[];
|
|
6
|
+
from: number;
|
|
7
|
+
to: number;
|
|
8
|
+
at: string;
|
|
9
|
+
startedAt?: string;
|
|
10
|
+
skipped?: boolean;
|
|
11
|
+
/** why the edit was undone: it failed `zen check`, or went over a limit */
|
|
12
|
+
discarded?: string;
|
|
13
|
+
/** a consolidation, from before an apply tidied up after itself */
|
|
14
|
+
kind?: 'consolidate';
|
|
15
|
+
/** what the agents always read, before and after */
|
|
16
|
+
bytes?: {
|
|
17
|
+
before: number;
|
|
18
|
+
after: number;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface Decision {
|
|
22
|
+
decision?: string;
|
|
23
|
+
note?: string;
|
|
24
|
+
disposition?: string;
|
|
25
|
+
/** the skill the improvement created or changed */
|
|
26
|
+
skill?: string;
|
|
27
|
+
}
|
|
28
|
+
export type Decisions = Record<string, Record<string, Decision>>;
|
|
29
|
+
export interface Deferred {
|
|
30
|
+
request: string;
|
|
31
|
+
case: string;
|
|
32
|
+
apply: string;
|
|
33
|
+
improvement: Improvement;
|
|
34
|
+
note?: string;
|
|
35
|
+
}
|
|
36
|
+
/** `<request> <improvement>` for each improvement of inputs.json that decisions.json gives no valid decision. */
|
|
37
|
+
export declare function undecided(dir: string): string[];
|
|
38
|
+
export declare class Improvements {
|
|
39
|
+
#private;
|
|
40
|
+
readonly pending: Feedback[];
|
|
41
|
+
/** the batch an apply is working on */
|
|
42
|
+
inApply: Feedback[];
|
|
43
|
+
/** cases parked right now */
|
|
44
|
+
parked: number;
|
|
45
|
+
/** `zen run`s in flight */
|
|
46
|
+
runs: number;
|
|
47
|
+
applying: boolean;
|
|
48
|
+
/** the apply under way; `name` once it has a folder, before that it waits for runs */
|
|
49
|
+
current: {
|
|
50
|
+
since: number;
|
|
51
|
+
name?: string;
|
|
52
|
+
dir?: string;
|
|
53
|
+
requests?: number;
|
|
54
|
+
/** which gate the edit is at; absent while it waits for runs */
|
|
55
|
+
step?: 'edit' | 'check';
|
|
56
|
+
} | undefined;
|
|
57
|
+
/** applies started in this process */
|
|
58
|
+
started: number;
|
|
59
|
+
/** applies finished in this process - an analysis spanning one may see edits */
|
|
60
|
+
count: number;
|
|
61
|
+
constructor(t: Tuning);
|
|
62
|
+
/** Re-reads which requests the applies took - a recovery may have removed one. */
|
|
63
|
+
reload(): void;
|
|
64
|
+
get dir(): string;
|
|
65
|
+
isApplied(id: string): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Every apply's decisions, later ones over earlier, per improvement. An edit
|
|
68
|
+
* that was undone kept nothing, so what it applied or merged reads `discarded`.
|
|
69
|
+
*/
|
|
70
|
+
decisions(): Decisions;
|
|
71
|
+
/** Improvements held back for want of a second case, and not taken up since. */
|
|
72
|
+
deferred(): Deferred[];
|
|
73
|
+
/** The skills an apply made or changed for this request: the case's next run should load them. */
|
|
74
|
+
skillsFor(id: string): string[];
|
|
75
|
+
/**
|
|
76
|
+
* Parks until an apply has taken this feedback, the worker free meanwhile. Taken already - after a restart - returns at once.
|
|
77
|
+
* `structural` when the apply found nothing prose can fix.
|
|
78
|
+
*/
|
|
79
|
+
apply(feedback: Feedback, s: Seat): Promise<{
|
|
80
|
+
structural?: string;
|
|
81
|
+
}>;
|
|
82
|
+
/** A recheck's request: queued like a parked case's, with no case waiting on it. */
|
|
83
|
+
regressed(feedback: Feedback): void;
|
|
84
|
+
/** Before a run starts: wait out an apply, or stop. */
|
|
85
|
+
notApplying(): Promise<void>;
|
|
86
|
+
/** The applier: runs until the tuning is finished. */
|
|
87
|
+
loop(): Promise<void>;
|
|
88
|
+
/** What the agents read when the tuning began - its first version, even for a tuning begun before this was kept. */
|
|
89
|
+
baseline(): Promise<Cost>;
|
|
90
|
+
/** Requests every apply so far took, for the report. */
|
|
91
|
+
applies(): {
|
|
92
|
+
name: string;
|
|
93
|
+
dir: string;
|
|
94
|
+
applied?: AppliedFile;
|
|
95
|
+
inputs?: Feedback[];
|
|
96
|
+
}[];
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=improvements.d.ts.map
|