zelari-code 2.1.0 → 2.1.2
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 +4 -4
- package/package.json +8 -5
- package/dist/cli/ast/engine.test.js +0 -101
- package/dist/cli/ast/engine.test.js.map +0 -1
- package/dist/cli/ast/tools.test.js +0 -124
- package/dist/cli/ast/tools.test.js.map +0 -1
- package/dist/cli/headless.test.js +0 -107
- package/dist/cli/headless.test.js.map +0 -1
- package/dist/cli/headlessE2eSession.test.js +0 -189
- package/dist/cli/headlessE2eSession.test.js.map +0 -1
- package/dist/cli/headlessHistorySeed.test.js +0 -158
- package/dist/cli/headlessHistorySeed.test.js.map +0 -1
- package/dist/cli/headlessSessionEvent.test.js +0 -83
- package/dist/cli/headlessSessionEvent.test.js.map +0 -1
- package/dist/cli/headlessSpine.test.js +0 -153
- package/dist/cli/headlessSpine.test.js.map +0 -1
- package/dist/cli/hooks/observationStore.test.js +0 -135
- package/dist/cli/hooks/observationStore.test.js.map +0 -1
- package/dist/cli/hooks/sessionSurface.test.js +0 -112
- package/dist/cli/hooks/sessionSurface.test.js.map +0 -1
- package/dist/cli/kraken/candidateRegistry.test.js +0 -211
- package/dist/cli/kraken/candidateRegistry.test.js.map +0 -1
- package/dist/cli/kraken/completionGate.test.js +0 -172
- package/dist/cli/kraken/completionGate.test.js.map +0 -1
- package/dist/cli/kraken/evidenceAnchoring.test.js +0 -92
- package/dist/cli/kraken/evidenceAnchoring.test.js.map +0 -1
- package/dist/cli/kraken/evidenceProvenance.test.js +0 -113
- package/dist/cli/kraken/evidenceProvenance.test.js.map +0 -1
- package/dist/cli/kraken/executor.workbench.test.js +0 -134
- package/dist/cli/kraken/executor.workbench.test.js.map +0 -1
- package/dist/cli/kraken/metrics.test.js +0 -145
- package/dist/cli/kraken/metrics.test.js.map +0 -1
- package/dist/cli/kraken/nativeVerification.test.js +0 -207
- package/dist/cli/kraken/nativeVerification.test.js.map +0 -1
- package/dist/cli/kraken/planner.test.js +0 -43
- package/dist/cli/kraken/planner.test.js.map +0 -1
- package/dist/cli/kraken/scriptPlanner.test.js +0 -152
- package/dist/cli/kraken/scriptPlanner.test.js.map +0 -1
- package/dist/cli/kraken/selectionPlaybook.test.js +0 -55
- package/dist/cli/kraken/selectionPlaybook.test.js.map +0 -1
- package/dist/cli/kraken/skillSuggest.test.js +0 -157
- package/dist/cli/kraken/skillSuggest.test.js.map +0 -1
- package/dist/cli/kraken/strictDefaults.test.js +0 -149
- package/dist/cli/kraken/strictDefaults.test.js.map +0 -1
- package/dist/cli/kraken/strictGatePackIndependence.test.js +0 -112
- package/dist/cli/kraken/strictGatePackIndependence.test.js.map +0 -1
- package/dist/cli/kraken/turnRuntime.test.js +0 -377
- package/dist/cli/kraken/turnRuntime.test.js.map +0 -1
- package/dist/cli/kraken/verificationBridge.session.test.js +0 -104
- package/dist/cli/kraken/verificationBridge.session.test.js.map +0 -1
- package/dist/cli/kraken/verificationBridge.test.js +0 -177
- package/dist/cli/kraken/verificationBridge.test.js.map +0 -1
- package/dist/cli/kraken/verifier.test.js +0 -232
- package/dist/cli/kraken/verifier.test.js.map +0 -1
- package/dist/cli/kraken/verifierAdvisoryLock.test.js +0 -154
- package/dist/cli/kraken/verifierAdvisoryLock.test.js.map +0 -1
- package/dist/cli/kraken/verifierLifecycle.test.js +0 -181
- package/dist/cli/kraken/verifierLifecycle.test.js.map +0 -1
- package/dist/cli/kraken/verifierRoundTrip.test.js +0 -166
- package/dist/cli/kraken/verifierRoundTrip.test.js.map +0 -1
- package/dist/cli/kraken/verifierSettings.test.js +0 -237
- package/dist/cli/kraken/verifierSettings.test.js.map +0 -1
- package/dist/cli/kraken/verifyReport.test.js +0 -111
- package/dist/cli/kraken/verifyReport.test.js.map +0 -1
- package/dist/cli/kraken/weaknessMeter.test.js +0 -212
- package/dist/cli/kraken/weaknessMeter.test.js.map +0 -1
- package/dist/cli/kraken/workbench.test.js +0 -253
- package/dist/cli/kraken/workbench.test.js.map +0 -1
- package/dist/cli/kraken/workbenchView.test.js +0 -130
- package/dist/cli/kraken/workbenchView.test.js.map +0 -1
- package/dist/cli/legacyContextIsolation.test.js +0 -65
- package/dist/cli/legacyContextIsolation.test.js.map +0 -1
- package/dist/cli/lsp/tools.test.js +0 -90
- package/dist/cli/lsp/tools.test.js.map +0 -1
- package/dist/cli/missionContinuation.test.js +0 -117
- package/dist/cli/missionContinuation.test.js.map +0 -1
- package/dist/cli/profileMatrix.test.js +0 -130
- package/dist/cli/profileMatrix.test.js.map +0 -1
- package/dist/cli/provider/capabilities.test.js +0 -46
- package/dist/cli/provider/capabilities.test.js.map +0 -1
- package/dist/cli/provider/openai-compatible.timeout.test.js +0 -72
- package/dist/cli/provider/openai-compatible.timeout.test.js.map +0 -1
- package/dist/cli/providerConfig.test.js +0 -85
- package/dist/cli/providerConfig.test.js.map +0 -1
- package/dist/cli/sessionReplayInvariant.test.js +0 -187
- package/dist/cli/sessionReplayInvariant.test.js.map +0 -1
- package/dist/cli/sessionSpine.test.js +0 -171
- package/dist/cli/sessionSpine.test.js.map +0 -1
- package/dist/cli/thinking.test.js +0 -214
- package/dist/cli/thinking.test.js.map +0 -1
- package/dist/cli/tools/inspectCommand.schema.test.js +0 -82
- package/dist/cli/tools/inspectCommand.schema.test.js.map +0 -1
- package/dist/cli/tools/inspectCommand.test.js +0 -311
- package/dist/cli/tools/inspectCommand.test.js.map +0 -1
- package/dist/cli/tools/krakenCsvFanout.test.js +0 -200
- package/dist/cli/tools/krakenCsvFanout.test.js.map +0 -1
- package/dist/cli/tools/krakenSelectTool.test.js +0 -246
- package/dist/cli/tools/krakenSelectTool.test.js.map +0 -1
- package/dist/cli/tools/observeBatch.test.js +0 -329
- package/dist/cli/tools/observeBatch.test.js.map +0 -1
- package/dist/cli/tools/taskTool.dynamicChecks.test.js +0 -156
- package/dist/cli/tools/taskTool.dynamicChecks.test.js.map +0 -1
- package/dist/cli/tools/taskTool.planSafety.test.js +0 -280
- package/dist/cli/tools/taskTool.planSafety.test.js.map +0 -1
- package/dist/cli/tools/taskTool.verifyReport.test.js +0 -140
- package/dist/cli/tools/taskTool.verifyReport.test.js.map +0 -1
- package/dist/cli/utils/contextGrowthSummary.test.js +0 -74
- package/dist/cli/utils/contextGrowthSummary.test.js.map +0 -1
- package/dist/cli/workspace/planDriftCheck.test.js +0 -146
- package/dist/cli/workspace/planDriftCheck.test.js.map +0 -1
- package/dist/cli/workspace/planStore.test.js +0 -295
- package/dist/cli/workspace/planStore.test.js.map +0 -1
- package/dist/cli/zelariMission.test.js +0 -44
- package/dist/cli/zelariMission.test.js.map +0 -1
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* planDriftCheck tests — P1.5 governance acceptance (v0.10 post-mortem).
|
|
3
|
-
*
|
|
4
|
-
* Covers: aligned plan (green), duplicate milestone, canonical blocklist
|
|
5
|
-
* hits (phase + task), canonical phase missing from plan.json, duplicate
|
|
6
|
-
* task titles, unknown phaseId, fail-open skips (missing plan.json,
|
|
7
|
-
* ZELARI_DRIFT_CHECK=0, no canonical doc), and the drift-report.json
|
|
8
|
-
* artifact.
|
|
9
|
-
*
|
|
10
|
-
* @since v1.15.0
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
13
|
-
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
14
|
-
import { tmpdir } from 'node:os';
|
|
15
|
-
import { join } from 'node:path';
|
|
16
|
-
import { runPlanDriftCheck } from './planDriftCheck.js';
|
|
17
|
-
let dir;
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
dir = mkdtempSync(join(tmpdir(), 'zelari-drift-'));
|
|
20
|
-
});
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
rmSync(dir, { recursive: true, force: true });
|
|
23
|
-
delete process.env['ZELARI_DRIFT_CHECK'];
|
|
24
|
-
});
|
|
25
|
-
function zelari() {
|
|
26
|
-
const z = join(dir, '.zelari');
|
|
27
|
-
mkdirSync(z, { recursive: true });
|
|
28
|
-
return z;
|
|
29
|
-
}
|
|
30
|
-
function seedPlan(phases, tasks, milestones) {
|
|
31
|
-
const z = zelari();
|
|
32
|
-
writeFileSync(join(z, 'plan.json'), JSON.stringify({ phases, tasks, milestones }), 'utf8');
|
|
33
|
-
return z;
|
|
34
|
-
}
|
|
35
|
-
function seedCanonical(text) {
|
|
36
|
-
mkdirSync(join(dir, '.zelari', 'docs'), { recursive: true });
|
|
37
|
-
writeFileSync(join(dir, '.zelari', 'docs', 'plan-canonical-v9-9-9.md'), text, 'utf8');
|
|
38
|
-
}
|
|
39
|
-
const CANONICAL = [
|
|
40
|
-
'# Piano canonico',
|
|
41
|
-
'## Regola',
|
|
42
|
-
'Duplicati: `p0-parit-*`, `p0-safety-gate-observability-*`.',
|
|
43
|
-
'### P0 — `p0-safety-observability`',
|
|
44
|
-
'### P1 — `p1-session-ux-extensibility`',
|
|
45
|
-
].join('\n');
|
|
46
|
-
function phase(id) {
|
|
47
|
-
return { kind: 'phase', id, name: id };
|
|
48
|
-
}
|
|
49
|
-
function task(id, name, phaseId) {
|
|
50
|
-
return { kind: 'task', id, name, phaseId, status: 'pending', priority: 'high' };
|
|
51
|
-
}
|
|
52
|
-
describe('runPlanDriftCheck', () => {
|
|
53
|
-
it('is green when plan.json matches the canonical doc', async () => {
|
|
54
|
-
const z = seedPlan([phase('p0-safety-observability'), phase('p1-session-ux-extensibility')], [
|
|
55
|
-
task('p0-safety-observability-lifecyclehookrunner-1', 'LifecycleHookRunner', 'p0-safety-observability'),
|
|
56
|
-
task('p1-session-ux-extensibility-fork-rewind-2', 'Fork e rewind', 'p1-session-ux-extensibility'),
|
|
57
|
-
], [{ kind: 'milestone', id: 'm-1', name: 'v0.10.0', targetVersion: 'v0.10.0' }]);
|
|
58
|
-
seedCanonical(CANONICAL);
|
|
59
|
-
const result = await runPlanDriftCheck(z);
|
|
60
|
-
expect(result.ran).toBe(true);
|
|
61
|
-
expect(result.ok).toBe(true);
|
|
62
|
-
expect(result.findings).toEqual([]);
|
|
63
|
-
expect(result.canonicalDoc).toBe('plan-canonical-v9-9-9.md');
|
|
64
|
-
expect(result.reportPath).toBe(join(z, 'drift-report.json'));
|
|
65
|
-
const report = JSON.parse(readFileSync(result.reportPath, 'utf8'));
|
|
66
|
-
expect(report.ok).toBe(true);
|
|
67
|
-
expect(report.counts).toEqual({ phases: 2, tasks: 2, milestones: 1 });
|
|
68
|
-
});
|
|
69
|
-
it('flags duplicate milestones targeting the same version', async () => {
|
|
70
|
-
const z = seedPlan([phase('p0-safety-observability')], [task('t-1', 'Solo task', 'p0-safety-observability')], [
|
|
71
|
-
{ kind: 'milestone', id: 'm-1', name: 'v0.10.0 A', targetVersion: 'v0.10.0' },
|
|
72
|
-
{ kind: 'milestone', id: 'm-2', name: 'v0.10.0 B', targetVersion: '0.10.0' },
|
|
73
|
-
]);
|
|
74
|
-
seedCanonical(CANONICAL);
|
|
75
|
-
const result = await runPlanDriftCheck(z);
|
|
76
|
-
expect(result.ok).toBe(false);
|
|
77
|
-
const dup = result.findings.filter((f) => f.code === 'DUPLICATE_MILESTONE');
|
|
78
|
-
expect(dup).toHaveLength(1);
|
|
79
|
-
expect(dup[0].severity).toBe('error');
|
|
80
|
-
expect(dup[0].message).toContain('m-1');
|
|
81
|
-
expect(dup[0].message).toContain('m-2');
|
|
82
|
-
});
|
|
83
|
-
it('flags phases and tasks matching a canonical duplicate/descope prefix', async () => {
|
|
84
|
-
const z = seedPlan([phase('p0-safety-observability'), phase('p0-parit-sicurezza')], [
|
|
85
|
-
task('p0-parit-sicurezza-hook-1', 'Hook runner', 'p0-parit-sicurezza'),
|
|
86
|
-
task('p0-safety-gate-observability-hook-2', 'Altro hook', 'p0-safety-observability'),
|
|
87
|
-
], []);
|
|
88
|
-
seedCanonical(CANONICAL);
|
|
89
|
-
const result = await runPlanDriftCheck(z);
|
|
90
|
-
expect(result.ok).toBe(false);
|
|
91
|
-
const codes = result.findings.map((f) => f.code);
|
|
92
|
-
expect(codes).toContain('PHASE_IN_CANONICAL_BLOCKLIST');
|
|
93
|
-
expect(codes).toContain('TASK_IN_CANONICAL_BLOCKLIST');
|
|
94
|
-
});
|
|
95
|
-
it('flags canonical phases missing from plan.json', async () => {
|
|
96
|
-
const z = seedPlan([phase('p0-safety-observability')], [task('t-1', 'Task', 'p0-safety-observability')], []);
|
|
97
|
-
seedCanonical(CANONICAL);
|
|
98
|
-
const result = await runPlanDriftCheck(z);
|
|
99
|
-
expect(result.ok).toBe(false);
|
|
100
|
-
const missing = result.findings.filter((f) => f.code === 'CANONICAL_PHASE_MISSING');
|
|
101
|
-
expect(missing).toHaveLength(1);
|
|
102
|
-
expect(missing[0].message).toContain('p1-session-ux-extensibility');
|
|
103
|
-
});
|
|
104
|
-
it('warns (non-blocking) on duplicate titles and unknown phaseId', async () => {
|
|
105
|
-
const z = seedPlan([phase('p0-safety-observability'), phase('p1-session-ux-extensibility')], [
|
|
106
|
-
task('a-1', 'Lifecycle hook runner', 'p0-safety-observability'),
|
|
107
|
-
task('b-2', 'Lifecycle Hook Runner!', 'p1-session-ux-extensibility'),
|
|
108
|
-
task('c-3', 'Task orfano', 'fase-inesistente'),
|
|
109
|
-
], []);
|
|
110
|
-
seedCanonical(CANONICAL);
|
|
111
|
-
const result = await runPlanDriftCheck(z);
|
|
112
|
-
expect(result.ok).toBe(true); // warnings only
|
|
113
|
-
const codes = result.findings.map((f) => f.code).sort();
|
|
114
|
-
expect(codes).toEqual(['DUPLICATE_TASK_TITLE', 'TASK_IN_UNKNOWN_PHASE']);
|
|
115
|
-
});
|
|
116
|
-
it('runs structural checks only when no canonical doc exists', async () => {
|
|
117
|
-
const z = seedPlan([phase('p0-safety-observability')], [task('t-1', 'Task', 'p0-safety-observability')], [{ kind: 'milestone', id: 'm-1', name: 'v1', targetVersion: 'v1.0.0' }]);
|
|
118
|
-
const result = await runPlanDriftCheck(z);
|
|
119
|
-
expect(result.ran).toBe(true);
|
|
120
|
-
expect(result.ok).toBe(true);
|
|
121
|
-
expect(result.canonicalDoc).toBeUndefined();
|
|
122
|
-
expect(result.reason).toContain('no canonical doc');
|
|
123
|
-
});
|
|
124
|
-
it('is skipped when plan.json is missing', async () => {
|
|
125
|
-
const z = zelari();
|
|
126
|
-
const result = await runPlanDriftCheck(z);
|
|
127
|
-
expect(result.ran).toBe(false);
|
|
128
|
-
expect(result.reason).toContain('missing');
|
|
129
|
-
});
|
|
130
|
-
it('is skipped when plan.json is corrupt', async () => {
|
|
131
|
-
const z = zelari();
|
|
132
|
-
writeFileSync(join(z, 'plan.json'), '{not json', 'utf8');
|
|
133
|
-
const result = await runPlanDriftCheck(z);
|
|
134
|
-
expect(result.ran).toBe(false);
|
|
135
|
-
expect(result.reason).toContain('corrupt');
|
|
136
|
-
});
|
|
137
|
-
it('is disabled via ZELARI_DRIFT_CHECK=0', async () => {
|
|
138
|
-
seedPlan([phase('p0')], [], []);
|
|
139
|
-
process.env['ZELARI_DRIFT_CHECK'] = '0';
|
|
140
|
-
const result = await runPlanDriftCheck(join(dir, '.zelari'));
|
|
141
|
-
expect(result.ran).toBe(false);
|
|
142
|
-
expect(result.reason).toContain('disabled');
|
|
143
|
-
expect(existsSync(join(dir, '.zelari', 'drift-report.json'))).toBe(false);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
//# sourceMappingURL=planDriftCheck.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planDriftCheck.test.js","sourceRoot":"","sources":["../../../src/cli/workspace/planDriftCheck.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* planStore + planTaskTools tests — ADR-0018 slice 3a acceptance.
|
|
3
|
-
*
|
|
4
|
-
* Covers: v1 envelope persistence, coexistence with council plan tasks
|
|
5
|
-
* (normalization done→completed, name→title alias, no id collisions, root
|
|
6
|
-
* pass-through), caps, corrupt-file safety, .bak backup, and the council
|
|
7
|
-
* writePlan round-trip preserving the v1 root fields.
|
|
8
|
-
*
|
|
9
|
-
* @since v1.43.0
|
|
10
|
-
*/
|
|
11
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
12
|
-
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync, } from 'node:fs';
|
|
13
|
-
import { tmpdir } from 'node:os';
|
|
14
|
-
import { join } from 'node:path';
|
|
15
|
-
import { createPlanTaskTools } from '../tools/planTaskTools.js';
|
|
16
|
-
import { createWorkspaceContext, createWorkspaceStubs } from './stubs.js';
|
|
17
|
-
let dir;
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
dir = mkdtempSync(join(tmpdir(), 'zelari-plan-'));
|
|
20
|
-
});
|
|
21
|
-
afterEach(() => {
|
|
22
|
-
rmSync(dir, { recursive: true, force: true });
|
|
23
|
-
});
|
|
24
|
-
function planPath() {
|
|
25
|
-
return join(dir, '.zelari', 'plan.json');
|
|
26
|
-
}
|
|
27
|
-
function readPlanJson() {
|
|
28
|
-
return JSON.parse(readFileSync(planPath(), 'utf8'));
|
|
29
|
-
}
|
|
30
|
-
function seedPlanJson(content) {
|
|
31
|
-
mkdirSync(join(dir, '.zelari'), { recursive: true });
|
|
32
|
-
writeFileSync(planPath(), JSON.stringify(content), 'utf8');
|
|
33
|
-
}
|
|
34
|
-
function toolCtx() {
|
|
35
|
-
return {
|
|
36
|
-
signal: new AbortController().signal,
|
|
37
|
-
cwd: dir,
|
|
38
|
-
audit: () => { },
|
|
39
|
-
sessionId: 'plan-store-test',
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
function makeTools(onTaskEvent) {
|
|
43
|
-
const tools = createPlanTaskTools({ projectRoot: dir, onTaskEvent });
|
|
44
|
-
return {
|
|
45
|
-
create: tools[0],
|
|
46
|
-
update: tools[1],
|
|
47
|
-
list: tools[2],
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
describe('planStore / task_* tools (ADR-0018 3a)', () => {
|
|
51
|
-
it('task_create persists the v1 envelope and the per-task artifact', async () => {
|
|
52
|
-
const { create } = makeTools();
|
|
53
|
-
const res = await create.execute({ title: 'Extract RunCoordinator' }, toolCtx());
|
|
54
|
-
expect(res.ok).toBe(true);
|
|
55
|
-
if (!res.ok)
|
|
56
|
-
return;
|
|
57
|
-
expect(res.value.id).toBe('t1');
|
|
58
|
-
expect(res.value.task.status).toBe('pending');
|
|
59
|
-
const file = readPlanJson();
|
|
60
|
-
expect(file.schemaVersion).toBe(1);
|
|
61
|
-
expect(file.counter).toBe(1);
|
|
62
|
-
expect(file.tasks[0].id).toBe('t1');
|
|
63
|
-
expect(file.tasks[0].title).toBe('Extract RunCoordinator');
|
|
64
|
-
expect(file.tasks[0].name).toBe('Extract RunCoordinator'); // council alias
|
|
65
|
-
expect(existsSync(join(dir, '.zelari', 'plan-tasks', 't1.md'))).toBe(true);
|
|
66
|
-
});
|
|
67
|
-
it('coexists with council tasks: normalization, no id collision, root pass-through', async () => {
|
|
68
|
-
seedPlanJson({
|
|
69
|
-
phases: [{ kind: 'phase', id: 'p1', name: 'P1', order: 1 }],
|
|
70
|
-
tasks: [
|
|
71
|
-
{
|
|
72
|
-
kind: 'task',
|
|
73
|
-
id: 'p1-foo-1',
|
|
74
|
-
name: 'Council task',
|
|
75
|
-
phaseId: 'p1',
|
|
76
|
-
status: 'done',
|
|
77
|
-
priority: 'high',
|
|
78
|
-
description: 'council extra field',
|
|
79
|
-
},
|
|
80
|
-
],
|
|
81
|
-
milestones: [],
|
|
82
|
-
xCouncilMeta: 'keep-me',
|
|
83
|
-
});
|
|
84
|
-
const { create, list } = makeTools();
|
|
85
|
-
const l1 = await list.execute({}, toolCtx());
|
|
86
|
-
expect(l1.ok).toBe(true);
|
|
87
|
-
if (!l1.ok)
|
|
88
|
-
return;
|
|
89
|
-
expect(l1.value.tasks).toHaveLength(1);
|
|
90
|
-
expect(l1.value.tasks[0].title).toBe('Council task'); // name → title
|
|
91
|
-
expect(l1.value.tasks[0].status).toBe('completed'); // done → completed
|
|
92
|
-
expect(l1.value.done).toBe(1);
|
|
93
|
-
expect(l1.value.total).toBe(1);
|
|
94
|
-
const res = await create.execute({ title: 'Agent task', phaseId: 'p1' }, toolCtx());
|
|
95
|
-
expect(res.ok).toBe(true);
|
|
96
|
-
if (!res.ok)
|
|
97
|
-
return;
|
|
98
|
-
expect(res.value.id).toBe('t1'); // counter starts fresh, no collision with p1-foo-1
|
|
99
|
-
const file = readPlanJson();
|
|
100
|
-
expect(file.xCouncilMeta).toBe('keep-me'); // unknown root field preserved
|
|
101
|
-
expect(file.phases).toHaveLength(1);
|
|
102
|
-
const council = file.tasks.find((t) => t.id === 'p1-foo-1');
|
|
103
|
-
expect(council.name).toBe('Council task');
|
|
104
|
-
expect(council.description).toBe('council extra field'); // task pass-through
|
|
105
|
-
expect(council.status).toBe('completed'); // normalized on rewrite
|
|
106
|
-
});
|
|
107
|
-
it('task_update applies fields, appendNote, and errors PLAN_TASK_NOT_FOUND', async () => {
|
|
108
|
-
const { create, update } = makeTools();
|
|
109
|
-
const created = await create.execute({ title: 'Fix auth refresh' }, toolCtx());
|
|
110
|
-
expect(created.ok).toBe(true);
|
|
111
|
-
const up = await update.execute({ id: 't1', status: 'in_progress', priority: 'high' }, toolCtx());
|
|
112
|
-
expect(up.ok).toBe(true);
|
|
113
|
-
if (!up.ok)
|
|
114
|
-
return;
|
|
115
|
-
expect(up.value.task.status).toBe('in_progress');
|
|
116
|
-
expect(up.value.task.priority).toBe('high');
|
|
117
|
-
const up2 = await update.execute({ id: 't1', appendNote: 'wip on refresh token' }, toolCtx());
|
|
118
|
-
expect(up2.ok).toBe(true);
|
|
119
|
-
const up3 = await update.execute({ id: 't1', appendNote: 'second note' }, toolCtx());
|
|
120
|
-
expect(up3.ok).toBe(true);
|
|
121
|
-
if (!up3.ok)
|
|
122
|
-
return;
|
|
123
|
-
expect(String(up3.value.task.notes)).toContain('wip on refresh token');
|
|
124
|
-
expect(String(up3.value.task.notes)).toContain('second note');
|
|
125
|
-
const nf = await update.execute({ id: 't9', status: 'pending' }, toolCtx());
|
|
126
|
-
expect(nf.ok).toBe(false);
|
|
127
|
-
if (nf.ok)
|
|
128
|
-
return;
|
|
129
|
-
expect(nf.error).toContain('PLAN_TASK_NOT_FOUND');
|
|
130
|
-
});
|
|
131
|
-
it('task_list filters by status and phaseId', async () => {
|
|
132
|
-
const { create, update, list } = makeTools();
|
|
133
|
-
await create.execute({ title: 'A', phaseId: 'p1' }, toolCtx());
|
|
134
|
-
await create.execute({ title: 'B', phaseId: 'p2' }, toolCtx());
|
|
135
|
-
await update.execute({ id: 't1', status: 'completed' }, toolCtx());
|
|
136
|
-
const byStatus = await list.execute({ status: 'completed' }, toolCtx());
|
|
137
|
-
expect(byStatus.ok && byStatus.value.tasks.map((t) => t.id)).toEqual(['t1']);
|
|
138
|
-
const byPhase = await list.execute({ phaseId: 'p2' }, toolCtx());
|
|
139
|
-
expect(byPhase.ok && byPhase.value.tasks.map((t) => t.id)).toEqual(['t2']);
|
|
140
|
-
const all = await list.execute({}, toolCtx());
|
|
141
|
-
expect(all.ok && all.value.total).toBe(2);
|
|
142
|
-
expect(all.ok && all.value.done).toBe(1);
|
|
143
|
-
});
|
|
144
|
-
it('defensive caps: oversized title is truncated, 101st task rejected', async () => {
|
|
145
|
-
const { create } = makeTools();
|
|
146
|
-
// Bypassing zod (registry validates; execute is called directly here) —
|
|
147
|
-
// the store must still enforce the cap defensively.
|
|
148
|
-
const res = await create.execute({ title: 'x'.repeat(250) }, toolCtx());
|
|
149
|
-
expect(res.ok).toBe(true);
|
|
150
|
-
if (!res.ok)
|
|
151
|
-
return;
|
|
152
|
-
expect(res.value.task.title.length).toBe(200);
|
|
153
|
-
const tasks = Array.from({ length: 100 }, (_, i) => ({
|
|
154
|
-
kind: 'task',
|
|
155
|
-
id: `t${i + 1}`,
|
|
156
|
-
name: `bulk ${i + 1}`,
|
|
157
|
-
phaseId: 'p0',
|
|
158
|
-
status: 'pending',
|
|
159
|
-
}));
|
|
160
|
-
seedPlanJson({
|
|
161
|
-
schemaVersion: 1,
|
|
162
|
-
counter: 100,
|
|
163
|
-
tasks,
|
|
164
|
-
phases: [],
|
|
165
|
-
milestones: [],
|
|
166
|
-
});
|
|
167
|
-
const over = await create.execute({ title: 'one too many' }, toolCtx());
|
|
168
|
-
expect(over.ok).toBe(false);
|
|
169
|
-
if (over.ok)
|
|
170
|
-
return;
|
|
171
|
-
expect(over.error).toContain('PLAN_TOO_MANY_TASKS');
|
|
172
|
-
});
|
|
173
|
-
it('corrupt plan.json → PLAN_CORRUPT error and the file is left untouched', async () => {
|
|
174
|
-
mkdirSync(join(dir, '.zelari'), { recursive: true });
|
|
175
|
-
writeFileSync(planPath(), '{ broken json', 'utf8');
|
|
176
|
-
const { create, list } = makeTools();
|
|
177
|
-
const res = await create.execute({ title: 'X' }, toolCtx());
|
|
178
|
-
expect(res.ok).toBe(false);
|
|
179
|
-
if (res.ok)
|
|
180
|
-
return;
|
|
181
|
-
expect(res.error).toContain('PLAN_CORRUPT');
|
|
182
|
-
const ls = await list.execute({}, toolCtx());
|
|
183
|
-
expect(ls.ok).toBe(false);
|
|
184
|
-
expect(readFileSync(planPath(), 'utf8')).toBe('{ broken json'); // not overwritten
|
|
185
|
-
});
|
|
186
|
-
it('a second write keeps a .bak of the previous state', async () => {
|
|
187
|
-
const { create } = makeTools();
|
|
188
|
-
await create.execute({ title: 'first' }, toolCtx());
|
|
189
|
-
await create.execute({ title: 'second' }, toolCtx());
|
|
190
|
-
const bak = JSON.parse(readFileSync(`${planPath()}.bak`, 'utf8'));
|
|
191
|
-
expect(bak.tasks[0].title).toBe('first');
|
|
192
|
-
const cur = readPlanJson();
|
|
193
|
-
expect(cur.tasks).toHaveLength(2);
|
|
194
|
-
expect(cur.counter).toBe(2);
|
|
195
|
-
});
|
|
196
|
-
it('council writePlan round-trip preserves schemaVersion/counter (stub interop)', async () => {
|
|
197
|
-
seedPlanJson({
|
|
198
|
-
schemaVersion: 1,
|
|
199
|
-
counter: 3,
|
|
200
|
-
phases: [{ kind: 'phase', id: 'p1', name: 'P1', order: 1 }],
|
|
201
|
-
tasks: [
|
|
202
|
-
{
|
|
203
|
-
kind: 'task',
|
|
204
|
-
id: 't1',
|
|
205
|
-
name: 'Agent task',
|
|
206
|
-
title: 'Agent task',
|
|
207
|
-
phaseId: 'p1',
|
|
208
|
-
status: 'pending',
|
|
209
|
-
},
|
|
210
|
-
],
|
|
211
|
-
milestones: [],
|
|
212
|
-
});
|
|
213
|
-
const wsCtx = createWorkspaceContext(dir);
|
|
214
|
-
const updateTask = createWorkspaceStubs(wsCtx).find((s) => s.name === 'updateTask');
|
|
215
|
-
expect(updateTask).toBeTruthy();
|
|
216
|
-
const out = await updateTask.execute({ taskId: 't1', status: 'done' }, wsCtx);
|
|
217
|
-
expect(String(out)).toContain('t1');
|
|
218
|
-
const file = readPlanJson();
|
|
219
|
-
expect(file.schemaVersion).toBe(1); // ADR-0018 pass-through root fields
|
|
220
|
-
expect(file.counter).toBe(3);
|
|
221
|
-
expect(file.tasks[0].status).toBe('done'); // council writer vocabulary
|
|
222
|
-
expect(file.phases).toHaveLength(1);
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
describe('task_* first-class events (ADR-0018 3b)', () => {
|
|
226
|
-
it('task_create emits task_update with the created payload', async () => {
|
|
227
|
-
const events = [];
|
|
228
|
-
const { create } = makeTools((e) => events.push(e));
|
|
229
|
-
const res = await create.execute({ title: 'Event slice', priority: 'high', phaseId: 'p9' }, toolCtx());
|
|
230
|
-
expect(res.ok).toBe(true);
|
|
231
|
-
expect(events).toEqual([
|
|
232
|
-
{
|
|
233
|
-
type: 'task_update',
|
|
234
|
-
source: 'workspace_plan',
|
|
235
|
-
task: {
|
|
236
|
-
id: 't1',
|
|
237
|
-
title: 'Event slice',
|
|
238
|
-
status: 'pending',
|
|
239
|
-
phaseId: 'p9',
|
|
240
|
-
priority: 'high',
|
|
241
|
-
},
|
|
242
|
-
},
|
|
243
|
-
]);
|
|
244
|
-
});
|
|
245
|
-
it('task_update emits task_update with the mutated status', async () => {
|
|
246
|
-
const events = [];
|
|
247
|
-
const { create, update } = makeTools((e) => events.push(e));
|
|
248
|
-
await create.execute({ title: 'A' }, toolCtx());
|
|
249
|
-
const res = await update.execute({ id: 't1', status: 'in_progress' }, toolCtx());
|
|
250
|
-
expect(res.ok).toBe(true);
|
|
251
|
-
const last = events[events.length - 1];
|
|
252
|
-
expect(last.type).toBe('task_update');
|
|
253
|
-
if (last.type !== 'task_update')
|
|
254
|
-
return;
|
|
255
|
-
expect(last.task.id).toBe('t1');
|
|
256
|
-
expect(last.task.status).toBe('in_progress');
|
|
257
|
-
});
|
|
258
|
-
it('task_list emits a FULL snapshot regardless of filters', async () => {
|
|
259
|
-
const events = [];
|
|
260
|
-
const { create, update, list } = makeTools((e) => events.push(e));
|
|
261
|
-
await create.execute({ title: 'One' }, toolCtx());
|
|
262
|
-
await create.execute({ title: 'Two' }, toolCtx());
|
|
263
|
-
await update.execute({ id: 't1', status: 'completed' }, toolCtx());
|
|
264
|
-
const res = await list.execute({ status: 'pending' }, toolCtx());
|
|
265
|
-
expect(res.ok).toBe(true);
|
|
266
|
-
if (!res.ok)
|
|
267
|
-
return;
|
|
268
|
-
expect(res.value.tasks).toHaveLength(1); // filtered view for the agent
|
|
269
|
-
const snap = events.find((e) => e.type === 'task_snapshot');
|
|
270
|
-
expect(snap).toBeDefined();
|
|
271
|
-
if (!snap || snap.type !== 'task_snapshot')
|
|
272
|
-
return;
|
|
273
|
-
expect(snap.tasks).toHaveLength(2); // full view for frontends
|
|
274
|
-
expect(snap.tasks.map((t) => `${t.id}:${t.status}`).sort()).toEqual([
|
|
275
|
-
't1:completed',
|
|
276
|
-
't2:pending',
|
|
277
|
-
]);
|
|
278
|
-
});
|
|
279
|
-
it('no events on tool errors; a throwing sink never breaks the tool', async () => {
|
|
280
|
-
const events = [];
|
|
281
|
-
const ok = makeTools((e) => events.push(e));
|
|
282
|
-
const bad = makeTools(() => {
|
|
283
|
-
throw new Error('sink exploded');
|
|
284
|
-
});
|
|
285
|
-
const missing = await ok.update.execute({ id: 'nope', status: 'pending' }, toolCtx());
|
|
286
|
-
expect(missing.ok).toBe(false);
|
|
287
|
-
expect(events).toHaveLength(0);
|
|
288
|
-
const res = await bad.create.execute({ title: 'Still works' }, toolCtx());
|
|
289
|
-
expect(res.ok).toBe(true);
|
|
290
|
-
if (!res.ok)
|
|
291
|
-
return;
|
|
292
|
-
expect(res.value.id).toBe('t1');
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
//# sourceMappingURL=planStore.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planStore.test.js","sourceRoot":"","sources":["../../../src/cli/workspace/planStore.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { resolveMaxCost, resolveMaxTokens, resolveMaxIterations, resolveMaxStall, } from './zelariMission.js';
|
|
3
|
-
describe('resolveMaxCost (ADR-0013)', () => {
|
|
4
|
-
it('returns undefined when env var is not set', () => {
|
|
5
|
-
expect(resolveMaxCost({})).toBeUndefined();
|
|
6
|
-
});
|
|
7
|
-
it('parses a valid USD value', () => {
|
|
8
|
-
expect(resolveMaxCost({ ZELARI_MISSION_MAX_COST: '5.00' })).toBe(5.0);
|
|
9
|
-
expect(resolveMaxCost({ ZELARI_MISSION_MAX_COST: '0.50' })).toBe(0.5);
|
|
10
|
-
});
|
|
11
|
-
it('returns undefined for zero or negative', () => {
|
|
12
|
-
expect(resolveMaxCost({ ZELARI_MISSION_MAX_COST: '0' })).toBeUndefined();
|
|
13
|
-
expect(resolveMaxCost({ ZELARI_MISSION_MAX_COST: '-1' })).toBeUndefined();
|
|
14
|
-
});
|
|
15
|
-
it('returns undefined for non-numeric', () => {
|
|
16
|
-
expect(resolveMaxCost({ ZELARI_MISSION_MAX_COST: 'abc' })).toBeUndefined();
|
|
17
|
-
expect(resolveMaxCost({ ZELARI_MISSION_MAX_COST: '' })).toBeUndefined();
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
describe('resolveMaxTokens (ADR-0013)', () => {
|
|
21
|
-
it('returns undefined when env var is not set', () => {
|
|
22
|
-
expect(resolveMaxTokens({})).toBeUndefined();
|
|
23
|
-
});
|
|
24
|
-
it('parses a valid token count', () => {
|
|
25
|
-
expect(resolveMaxTokens({ ZELARI_MISSION_MAX_TOKENS: '2000000' })).toBe(2_000_000);
|
|
26
|
-
expect(resolveMaxTokens({ ZELARI_MISSION_MAX_TOKENS: '100000' })).toBe(100_000);
|
|
27
|
-
});
|
|
28
|
-
it('returns undefined for zero or negative', () => {
|
|
29
|
-
expect(resolveMaxTokens({ ZELARI_MISSION_MAX_TOKENS: '0' })).toBeUndefined();
|
|
30
|
-
expect(resolveMaxTokens({ ZELARI_MISSION_MAX_TOKENS: '-5' })).toBeUndefined();
|
|
31
|
-
});
|
|
32
|
-
it('returns undefined for non-integer', () => {
|
|
33
|
-
expect(resolveMaxTokens({ ZELARI_MISSION_MAX_TOKENS: 'abc' })).toBeUndefined();
|
|
34
|
-
expect(resolveMaxTokens({ ZELARI_MISSION_MAX_TOKENS: '' })).toBeUndefined();
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
// Sanity: existing resolve functions still work alongside the new ones.
|
|
38
|
-
describe('resolveMaxIterations / resolveMaxStall (regression)', () => {
|
|
39
|
-
it('returns defaults when env is empty', () => {
|
|
40
|
-
expect(resolveMaxIterations({})).toBeGreaterThan(0);
|
|
41
|
-
expect(resolveMaxStall({})).toBeGreaterThanOrEqual(0);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=zelariMission.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"zelariMission.test.js","sourceRoot":"","sources":["../../src/cli/zelariMission.test.ts"],"names":[],"mappings":"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"}
|