zelari-code 0.7.5 → 0.7.8
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/bin/zelari-code.js +1 -1
- package/dist/agents/councilApi.js +7 -7
- package/dist/agents/councilApi.js.map +1 -1
- package/dist/agents/councilDirectives.js +3 -3
- package/dist/agents/promoteMember.js +2 -2
- package/dist/agents/roles.js +32 -50
- package/dist/agents/roles.js.map +1 -1
- package/dist/agents/skills/builtin/debugging.js +4 -4
- package/dist/agents/skills/builtin/debugging.js.map +1 -1
- package/dist/agents/skills/builtin/docs.js +13 -23
- package/dist/agents/skills/builtin/docs.js.map +1 -1
- package/dist/agents/skills/builtin/git-ops.js +3 -3
- package/dist/agents/skills/builtin/git-ops.js.map +1 -1
- package/dist/agents/skills/builtin/planning.js +4 -4
- package/dist/agents/skills/builtin/planning.js.map +1 -1
- package/dist/agents/skills/builtin/refactoring.js +3 -3
- package/dist/agents/skills/builtin/refactoring.js.map +1 -1
- package/dist/agents/skills/builtin/review.js +9 -9
- package/dist/agents/skills/builtin/review.js.map +1 -1
- package/dist/agents/skills/builtin/testing.js +3 -3
- package/dist/agents/skills/builtin/testing.js.map +1 -1
- package/dist/agents/tools.js +9 -2
- package/dist/agents/tools.js.map +1 -1
- package/dist/cli/app.js +2 -1
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/components/CollapsibleToolOutput.js +26 -8
- package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
- package/dist/cli/components/Header.js +18 -6
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/Sidebar.js +31 -33
- package/dist/cli/components/Sidebar.js.map +1 -1
- package/dist/cli/components/SplashScreen.js +158 -0
- package/dist/cli/components/SplashScreen.js.map +1 -0
- package/dist/cli/councilDispatcher.js +20 -0
- package/dist/cli/councilDispatcher.js.map +1 -1
- package/dist/cli/main.bundled.js +983 -171
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +9 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/mcp/mcpClient.js +1 -1
- package/dist/cli/oauthCallbackServer.js +207 -0
- package/dist/cli/oauthCallbackServer.js.map +1 -0
- package/dist/cli/wizard/index.js +1 -1
- package/dist/cli/wizard/index.js.map +1 -1
- package/dist/cli/workspace/completeDesign.js +128 -0
- package/dist/cli/workspace/completeDesign.js.map +1 -0
- package/dist/cli/workspace/postCouncilHook.js +146 -20
- package/dist/cli/workspace/postCouncilHook.js.map +1 -1
- package/dist/cli/workspace/stubs.js +231 -95
- package/dist/cli/workspace/stubs.js.map +1 -1
- package/dist/main/core/AgentHarness.js +7 -36
- package/dist/main/core/AgentHarness.js.map +1 -1
- package/dist/main/core/tools/builtin/_walk.js +129 -0
- package/dist/main/core/tools/builtin/_walk.js.map +1 -0
- package/dist/main/core/tools/builtin/diff.js +477 -0
- package/dist/main/core/tools/builtin/diff.js.map +1 -0
- package/dist/main/core/tools/builtin/listFiles.js +5 -43
- package/dist/main/core/tools/builtin/listFiles.js.map +1 -1
- package/dist/main/core/tools/builtin/search.js +120 -28
- package/dist/main/core/tools/builtin/search.js.map +1 -1
- package/package.json +2 -2
package/dist/cli/main.js
CHANGED
|
@@ -7,6 +7,7 @@ import React from 'react';
|
|
|
7
7
|
import { render } from 'ink';
|
|
8
8
|
// @ts-ignore
|
|
9
9
|
import { App } from './app.js';
|
|
10
|
+
import { SplashGate } from './components/SplashScreen.js';
|
|
10
11
|
import { getMetricsLogger } from './metrics.js';
|
|
11
12
|
import { getProviderConfigPath } from './providerConfig.js';
|
|
12
13
|
import { parseWizardFlags, shouldRunWizard, } from './wizard/firstRun.js';
|
|
@@ -15,7 +16,7 @@ import { parseHeadlessFlags } from './headless.js';
|
|
|
15
16
|
import { runHeadless } from './runHeadless.js';
|
|
16
17
|
import { loadSkillMdSkills } from './skillsMd.js';
|
|
17
18
|
import { listCodingSkills } from '@zelari/core/skills';
|
|
18
|
-
export const VERSION = '0.7.
|
|
19
|
+
export const VERSION = '0.7.8';
|
|
19
20
|
/**
|
|
20
21
|
* Silent background update check (Task N.6, v3-N).
|
|
21
22
|
*
|
|
@@ -134,7 +135,13 @@ function pickRootComponent() {
|
|
|
134
135
|
console.error(`[zelari-code] starting wizard: ${decision.reason}`);
|
|
135
136
|
return { kind: 'wizard', element: React.createElement(RunWizard) };
|
|
136
137
|
}
|
|
137
|
-
|
|
138
|
+
// v0.7.8: one-shot startup splash (ASCII emblem, ~2s or any-key skip),
|
|
139
|
+
// then the App mounts. Skipped automatically for non-TTY stdout, small
|
|
140
|
+
// terminals, or ZELARI_NO_SPLASH=1 — see components/SplashScreen.tsx.
|
|
141
|
+
return {
|
|
142
|
+
kind: 'app',
|
|
143
|
+
element: React.createElement(SplashGate, { version: VERSION }, React.createElement(App)),
|
|
144
|
+
};
|
|
138
145
|
}
|
|
139
146
|
/**
|
|
140
147
|
* v0.7.5: load user SKILL.md skills (opencode/Hermes/Claude-compatible
|
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,7 +51,7 @@ export class McpClient {
|
|
|
51
51
|
await this.request('initialize', {
|
|
52
52
|
protocolVersion: MCP_PROTOCOL_VERSION,
|
|
53
53
|
capabilities: {},
|
|
54
|
-
clientInfo: { name: 'zelari-code', version: '0.7.
|
|
54
|
+
clientInfo: { name: 'zelari-code', version: '0.7.8' },
|
|
55
55
|
}, INIT_TIMEOUT_MS);
|
|
56
56
|
this.notify('notifications/initialized', {});
|
|
57
57
|
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* oauthCallbackServer — minimal HTTP server for OAuth browser-flow callbacks.
|
|
3
|
+
*
|
|
4
|
+
* The CLI uses this to receive the redirect from the OAuth provider after
|
|
5
|
+
* the user authenticates in their browser. The server:
|
|
6
|
+
* - listens on a local port (default 14523) on 127.0.0.1
|
|
7
|
+
* - captures `?code=XXX` from the first request to `expectedPath`
|
|
8
|
+
* - returns a friendly 200 HTML response so the user can close the tab
|
|
9
|
+
* - resolves a single `waitForCode()` Promise with the code, or rejects on timeout
|
|
10
|
+
* - shuts itself down after capture (or via explicit close())
|
|
11
|
+
*
|
|
12
|
+
* No deps — pure node:http. Browser-importable for jsdom tests.
|
|
13
|
+
*
|
|
14
|
+
* @see docs/plans/2026-06-29-anathema-coder-v2.md (Task 16.1)
|
|
15
|
+
*/
|
|
16
|
+
import { createServer } from 'node:http';
|
|
17
|
+
const DEFAULT_SUCCESS_HTML = `
|
|
18
|
+
<!DOCTYPE html>
|
|
19
|
+
<html lang="en">
|
|
20
|
+
<head>
|
|
21
|
+
<meta charset="UTF-8">
|
|
22
|
+
<title>zelari-code OAuth</title>
|
|
23
|
+
</head>
|
|
24
|
+
<body style="font-family: -apple-system, BlinkMacSystemFont, sans-serif; padding: 40px; text-align: center; color: #1a1a1a;">
|
|
25
|
+
<h1 style="color: #00aa33;">✓ Authentication complete</h1>
|
|
26
|
+
<p>You can close this tab and return to zelari-code.</p>
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
|
29
|
+
`.trim();
|
|
30
|
+
export class OAuthCallbackTimeoutError extends Error {
|
|
31
|
+
constructor(timeoutMs) {
|
|
32
|
+
super(`OAuth callback not received within ${timeoutMs}ms`);
|
|
33
|
+
this.name = 'OAuthCallbackTimeoutError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export class OAuthCallbackClosedError extends Error {
|
|
37
|
+
constructor() {
|
|
38
|
+
super('OAuth callback server closed before receiving a callback');
|
|
39
|
+
this.name = 'OAuthCallbackClosedError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class OAuthCallbackError extends Error {
|
|
43
|
+
constructor(message) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.name = 'OAuthCallbackError';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Start the OAuth callback server. Returns a handle with port + waitForCode + close.
|
|
50
|
+
*
|
|
51
|
+
* The first request to `expectedPath` resolves waitForCode with the `code`
|
|
52
|
+
* query parameter. Any other path returns a 404.
|
|
53
|
+
*/
|
|
54
|
+
export function startOAuthCallbackServer(options = {}) {
|
|
55
|
+
const host = options.host ?? '127.0.0.1';
|
|
56
|
+
const preferredPort = options.port ?? 14523;
|
|
57
|
+
const timeoutMs = options.timeoutMs ?? 60_000;
|
|
58
|
+
const expectedPath = options.expectedPath ?? '/oauth/callback';
|
|
59
|
+
const successHtml = options.successHtml ?? DEFAULT_SUCCESS_HTML;
|
|
60
|
+
return new Promise((resolveStart, rejectStart) => {
|
|
61
|
+
let resolved = false;
|
|
62
|
+
let resolveCode = null;
|
|
63
|
+
let rejectCode = null;
|
|
64
|
+
let timeoutHandle = null;
|
|
65
|
+
const server = createServer((req, res) => {
|
|
66
|
+
try {
|
|
67
|
+
if (!req.url) {
|
|
68
|
+
res.writeHead(400, { 'Content-Type': 'text/plain' });
|
|
69
|
+
res.end('Bad request');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Parse path + query.
|
|
73
|
+
const url = new URL(req.url, `http://${host}:${preferredPort}`);
|
|
74
|
+
if (url.pathname !== expectedPath) {
|
|
75
|
+
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
76
|
+
res.end('Not found');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const code = url.searchParams.get('code');
|
|
80
|
+
const state = url.searchParams.get('state');
|
|
81
|
+
const errorParam = url.searchParams.get('error');
|
|
82
|
+
const errorDescription = url.searchParams.get('error_description');
|
|
83
|
+
// Capture any extra params for diagnostics / future use.
|
|
84
|
+
const extras = {};
|
|
85
|
+
for (const [key, value] of url.searchParams.entries()) {
|
|
86
|
+
if (key !== 'code' && key !== 'state' && key !== 'error' && key !== 'error_description') {
|
|
87
|
+
extras[key] = value;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const params = {
|
|
91
|
+
...(code ? { code } : {}),
|
|
92
|
+
...(state ? { state } : {}),
|
|
93
|
+
...(errorParam ? { error: errorParam } : {}),
|
|
94
|
+
...(errorDescription ? { errorDescription } : {}),
|
|
95
|
+
extras,
|
|
96
|
+
};
|
|
97
|
+
if (errorParam) {
|
|
98
|
+
// OAuth provider returned an error (e.g. user denied).
|
|
99
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
100
|
+
res.end(`<h1>OAuth error: ${errorParam}</h1>`);
|
|
101
|
+
if (rejectCode && !resolved) {
|
|
102
|
+
resolved = true;
|
|
103
|
+
if (timeoutHandle)
|
|
104
|
+
clearTimeout(timeoutHandle);
|
|
105
|
+
rejectCode(new OAuthCallbackError(`OAuth provider returned error: ${errorParam}`));
|
|
106
|
+
}
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (!code) {
|
|
110
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
111
|
+
res.end('<h1>Missing <code>code</code> query parameter</h1>');
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
// Success.
|
|
115
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
116
|
+
res.end(successHtml);
|
|
117
|
+
if (resolveCode && !resolved) {
|
|
118
|
+
resolved = true;
|
|
119
|
+
if (timeoutHandle)
|
|
120
|
+
clearTimeout(timeoutHandle);
|
|
121
|
+
resolveCode(params);
|
|
122
|
+
}
|
|
123
|
+
// Give the response a moment to flush before closing.
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
try {
|
|
126
|
+
server.close();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// already closed
|
|
130
|
+
}
|
|
131
|
+
}, 100);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
// Defensive: never crash the server on a single bad request.
|
|
135
|
+
try {
|
|
136
|
+
res.writeHead(500, { 'Content-Type': 'text/plain' });
|
|
137
|
+
res.end('Internal error');
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// ignore
|
|
141
|
+
}
|
|
142
|
+
if (!resolved && rejectCode) {
|
|
143
|
+
resolved = true;
|
|
144
|
+
if (timeoutHandle)
|
|
145
|
+
clearTimeout(timeoutHandle);
|
|
146
|
+
rejectCode(err instanceof Error ? err : new Error(String(err)));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
const onError = (err) => {
|
|
151
|
+
if (!resolved) {
|
|
152
|
+
resolved = true;
|
|
153
|
+
if (timeoutHandle)
|
|
154
|
+
clearTimeout(timeoutHandle);
|
|
155
|
+
rejectStart(err);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
server.once('error', onError);
|
|
159
|
+
server.listen(preferredPort, host, () => {
|
|
160
|
+
// Resolve with the actual bound port (important when port=0).
|
|
161
|
+
const addr = server.address();
|
|
162
|
+
const actualPort = addr ? addr.port : preferredPort;
|
|
163
|
+
const waitForCode = () => {
|
|
164
|
+
return new Promise((res, rej) => {
|
|
165
|
+
if (resolved) {
|
|
166
|
+
// Server already resolved (timeout fired, etc.) — reject.
|
|
167
|
+
rej(new OAuthCallbackClosedError());
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
resolveCode = res;
|
|
171
|
+
rejectCode = rej;
|
|
172
|
+
timeoutHandle = setTimeout(() => {
|
|
173
|
+
if (!resolved) {
|
|
174
|
+
resolved = true;
|
|
175
|
+
try {
|
|
176
|
+
server.close();
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// ignore
|
|
180
|
+
}
|
|
181
|
+
rej(new OAuthCallbackTimeoutError(timeoutMs));
|
|
182
|
+
}
|
|
183
|
+
}, timeoutMs);
|
|
184
|
+
// Don't keep the process alive just for this timer.
|
|
185
|
+
if (typeof timeoutHandle?.unref === 'function')
|
|
186
|
+
timeoutHandle.unref();
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
const close = () => {
|
|
190
|
+
if (timeoutHandle)
|
|
191
|
+
clearTimeout(timeoutHandle);
|
|
192
|
+
try {
|
|
193
|
+
server.close();
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// ignore
|
|
197
|
+
}
|
|
198
|
+
if (!resolved && rejectCode) {
|
|
199
|
+
resolved = true;
|
|
200
|
+
rejectCode(new OAuthCallbackClosedError());
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
resolveStart({ port: actualPort, waitForCode, close });
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=oauthCallbackServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthCallbackServer.js","sourceRoot":"","sources":["../../src/cli/oauthCallbackServer.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/wizard/index.js
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
import React from 'react';
|
|
21
21
|
import { Box, Text } from 'ink';
|
|
22
22
|
import { API_KEY_OPTIONS, } from './useWizardState.js';
|
|
23
|
-
|
|
23
|
+
import { VERSION } from '../main.js';
|
|
24
24
|
function Frame({ children }) {
|
|
25
25
|
return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 2, paddingY: 1 }, children));
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/wizard/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EACL,eAAe,GAGhB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/wizard/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workspace/completeDesign.ts — Built-in deterministic complete-design
|
|
3
|
+
* fallback (v0.7.8).
|
|
4
|
+
*
|
|
5
|
+
* Guarantees that a design-phase plan is executable even when the council
|
|
6
|
+
* model under-delivered on task emission: every phase in `.zelari/plan.json`
|
|
7
|
+
* ends up with at least {@link MIN_TASKS_PER_PHASE} tasks, and the plan has
|
|
8
|
+
* at least one milestone.
|
|
9
|
+
*
|
|
10
|
+
* This replaces the unversioned per-workspace `complete-design.mjs` script
|
|
11
|
+
* (HANDOFF 2026-07-03 §5.3) for the common case. Unlike that script's
|
|
12
|
+
* hard-coded `TASKS_PER_PHASE` template — whose phase-ID keys drifted from
|
|
13
|
+
* the ids the council actually generated (§4.1: 4 generic tasks instead of
|
|
14
|
+
* 12) — this fallback derives its tasks from the REAL phases in plan.json,
|
|
15
|
+
* so a phase-ID mismatch is impossible by construction.
|
|
16
|
+
*
|
|
17
|
+
* A workspace can still ship its own `complete-design.mjs` with curated
|
|
18
|
+
* domain tasks; when present, `runCompleteDesignPostProcessor` prefers it
|
|
19
|
+
* and this fallback never runs (see postCouncilHook.ts).
|
|
20
|
+
*/
|
|
21
|
+
import { createWorkspaceStubs, readPlanSummary } from './stubs.js';
|
|
22
|
+
/** Every phase must end up with at least this many tasks. */
|
|
23
|
+
export const MIN_TASKS_PER_PHASE = 3;
|
|
24
|
+
/**
|
|
25
|
+
* Derive the 3-task backbone for a phase from its own name/description:
|
|
26
|
+
* specify → implement → verify. Grounded in the council artifacts the
|
|
27
|
+
* phase already references (ADRs, design docs, synthesis) so the tasks
|
|
28
|
+
* are actionable without any domain-specific template.
|
|
29
|
+
*/
|
|
30
|
+
export function curatedTasksForPhase(phase) {
|
|
31
|
+
const label = (phase.name ?? phase.id).trim();
|
|
32
|
+
const scope = phase.description?.trim()
|
|
33
|
+
? ` Scope: ${phase.description.trim()}`
|
|
34
|
+
: '';
|
|
35
|
+
return [
|
|
36
|
+
{
|
|
37
|
+
title: `Specify ${label} deliverables`,
|
|
38
|
+
description: `Turn the council documents for "${label}" into a concrete specification: enumerate deliverables, ` +
|
|
39
|
+
`interfaces, constraints, and open decisions, grounding each item in the ADRs and design docs ` +
|
|
40
|
+
`already present in .zelari/.${scope}`,
|
|
41
|
+
fileRefs: ['.zelari/docs/', '.zelari/decisions/'],
|
|
42
|
+
acceptance: [
|
|
43
|
+
`A written spec for "${label}" exists and references at least one ADR or design doc`,
|
|
44
|
+
'Every deliverable in the spec has an owner artifact (file, doc, or component) named',
|
|
45
|
+
],
|
|
46
|
+
qaScenario: `Open the spec for "${label}" and confirm each deliverable maps to a concrete artifact and no open decision is left unresolved.`,
|
|
47
|
+
priority: 'high',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
title: `Implement ${label} deliverables`,
|
|
51
|
+
description: `Produce the artifacts the "${label}" phase promises, following the spec task of this phase and ` +
|
|
52
|
+
`the decisions recorded in .zelari/decisions/.${scope}`,
|
|
53
|
+
fileRefs: ['src/'],
|
|
54
|
+
acceptance: [
|
|
55
|
+
`Every deliverable listed in the "${label}" spec exists and builds/renders without errors`,
|
|
56
|
+
'No implementation contradicts an accepted ADR',
|
|
57
|
+
],
|
|
58
|
+
qaScenario: `Walk the "${label}" spec top to bottom and check each deliverable off against the produced artifact.`,
|
|
59
|
+
priority: 'high',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
title: `Verify ${label} exit criteria`,
|
|
63
|
+
description: `Run the QA pass for "${label}": execute the QA scenarios of the phase tasks, check the phase row ` +
|
|
64
|
+
`in the synthesis green-light checklist, and record any gaps as follow-up tasks.${scope}`,
|
|
65
|
+
fileRefs: ['.zelari/docs/synthesis.md'],
|
|
66
|
+
acceptance: [
|
|
67
|
+
`The "${label}" row of the synthesis green-light checklist passes`,
|
|
68
|
+
'All QA scenarios of this phase have been executed with recorded outcomes',
|
|
69
|
+
],
|
|
70
|
+
qaScenario: `Open .zelari/docs/synthesis.md, locate the "${label}" checklist row, and confirm every criterion is checked with evidence.`,
|
|
71
|
+
priority: 'medium',
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Ensure every phase has ≥ MIN_TASKS_PER_PHASE tasks and the plan has ≥1
|
|
77
|
+
* milestone. Additive and idempotent: existing tasks/milestones are never
|
|
78
|
+
* modified, and re-running adds nothing once the minimums are met (the
|
|
79
|
+
* generated titles are deterministic and the createTask ids they produce
|
|
80
|
+
* are stable per phase).
|
|
81
|
+
*
|
|
82
|
+
* Creation goes through the same workspace stubs the council uses
|
|
83
|
+
* (createTask / createMilestone), so plan.json, plan.md, and the per-task
|
|
84
|
+
* files stay consistent with model-emitted artifacts.
|
|
85
|
+
*/
|
|
86
|
+
export async function runBuiltinCompleteDesign(ctx) {
|
|
87
|
+
const summary = readPlanSummary(ctx);
|
|
88
|
+
if (summary.phases.length === 0) {
|
|
89
|
+
return { ran: false, tasksAdded: 0, milestonesAdded: 0, reason: 'plan has no phases' };
|
|
90
|
+
}
|
|
91
|
+
const stubs = createWorkspaceStubs(ctx);
|
|
92
|
+
const createTask = stubs.find((s) => s.name === 'createTask');
|
|
93
|
+
const createMilestone = stubs.find((s) => s.name === 'createMilestone');
|
|
94
|
+
const stubCtx = ctx;
|
|
95
|
+
let tasksAdded = 0;
|
|
96
|
+
for (const phase of summary.phases) {
|
|
97
|
+
const existingTasks = summary.tasks.filter((t) => t.phaseId === phase.id);
|
|
98
|
+
if (existingTasks.length >= MIN_TASKS_PER_PHASE)
|
|
99
|
+
continue;
|
|
100
|
+
const existingTitles = new Set(existingTasks.map((t) => t.name ?? ''));
|
|
101
|
+
const templates = curatedTasksForPhase(phase)
|
|
102
|
+
.filter((t) => !existingTitles.has(t.title))
|
|
103
|
+
.slice(0, MIN_TASKS_PER_PHASE - existingTasks.length);
|
|
104
|
+
for (const t of templates) {
|
|
105
|
+
await createTask.execute({
|
|
106
|
+
phaseId: phase.id,
|
|
107
|
+
title: t.title,
|
|
108
|
+
description: t.description,
|
|
109
|
+
fileRefs: t.fileRefs,
|
|
110
|
+
acceptance: t.acceptance,
|
|
111
|
+
qaScenario: t.qaScenario,
|
|
112
|
+
priority: t.priority,
|
|
113
|
+
}, stubCtx);
|
|
114
|
+
tasksAdded += 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
let milestonesAdded = 0;
|
|
118
|
+
if (summary.milestones.length === 0) {
|
|
119
|
+
await createMilestone.execute({
|
|
120
|
+
title: 'v0.1.0 design-complete',
|
|
121
|
+
description: 'All design-phase artifacts (phases, tasks, ADRs, design docs, risks, synthesis) exist and the green-light checklist passes.',
|
|
122
|
+
targetVersion: 'v0.1.0',
|
|
123
|
+
}, stubCtx);
|
|
124
|
+
milestonesAdded = 1;
|
|
125
|
+
}
|
|
126
|
+
return { ran: true, tasksAdded, milestonesAdded };
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=completeDesign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completeDesign.js","sourceRoot":"","sources":["../../../src/cli/workspace/completeDesign.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,164 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* workspace/postCouncilHook.ts — Run the AGENTS.MD auto-maintenance
|
|
3
|
-
* after every council run completes
|
|
3
|
+
* after every council run completes, then run the deterministic
|
|
4
|
+
* complete-design post-processor for design-phase workspaces.
|
|
4
5
|
*
|
|
5
|
-
* Used by `councilDispatcher` (Phase 4 wiring) to keep AGENTS.MD in
|
|
6
|
-
* with the latest `.zelari/` artifacts
|
|
6
|
+
* Used by `councilDispatcher` (Phase 4 wiring) to keep AGENTS.MD in
|
|
7
|
+
* sync with the latest `.zelari/` artifacts and to guarantee that
|
|
8
|
+
* tasks/milestones are present even when the council model (e.g.
|
|
9
|
+
* composer-2.5) refuses to emit createTask/createMilestone as real
|
|
10
|
+
* tool calls.
|
|
7
11
|
*/
|
|
12
|
+
import { spawn } from 'node:child_process';
|
|
13
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
14
|
+
import { join } from 'node:path';
|
|
8
15
|
import { updateAgentsMd } from './agentsMd.js';
|
|
16
|
+
import { runBuiltinCompleteDesign } from './completeDesign.js';
|
|
9
17
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
18
|
+
* v0.7.7 Opzione B / v0.7.8 — Run the deterministic complete-design
|
|
19
|
+
* post-processor if the workspace is in design-phase (`.zelari/plan.json`
|
|
20
|
+
* exists with at least one phase).
|
|
13
21
|
*
|
|
14
|
-
*
|
|
22
|
+
* Resolution order:
|
|
23
|
+
* 1. A workspace-local `complete-design.mjs` at the project root wins
|
|
24
|
+
* (curated, domain-specific task templates) and is spawned as a
|
|
25
|
+
* child process.
|
|
26
|
+
* 2. Otherwise (v0.7.8) the built-in TypeScript fallback runs: it
|
|
27
|
+
* derives 3 tasks per phase from the REAL phases in plan.json and
|
|
28
|
+
* guarantees a milestone — versioned with the codebase, no per-
|
|
29
|
+
* workspace setup, immune to phase-ID drift.
|
|
30
|
+
*
|
|
31
|
+
* Errors are captured, never thrown — the post-processor is a
|
|
32
|
+
* best-effort safety net.
|
|
33
|
+
*
|
|
34
|
+
* Disabled by setting `ZELARI_COMPLETE_DESIGN=0` in the environment.
|
|
15
35
|
*/
|
|
16
|
-
export async function
|
|
17
|
-
if (process.env['
|
|
18
|
-
return { ran: false,
|
|
36
|
+
export async function runCompleteDesignPostProcessor(ctx) {
|
|
37
|
+
if (process.env['ZELARI_COMPLETE_DESIGN'] === '0') {
|
|
38
|
+
return { ran: false, reason: 'ZELARI_COMPLETE_DESIGN=0 (disabled)' };
|
|
39
|
+
}
|
|
40
|
+
const planJsonPath = join(ctx.rootDir, 'plan.json');
|
|
41
|
+
const scriptPath = join(ctx.projectRoot, 'complete-design.mjs');
|
|
42
|
+
if (!existsSync(planJsonPath)) {
|
|
43
|
+
return { ran: false, reason: '.zelari/plan.json missing (not design-phase)' };
|
|
19
44
|
}
|
|
45
|
+
let phaseCount = 0;
|
|
20
46
|
try {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
47
|
+
const parsed = JSON.parse(readFileSync(planJsonPath, 'utf8'));
|
|
48
|
+
phaseCount = Array.isArray(parsed.phases) ? parsed.phases.length : 0;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return { ran: false, reason: '.zelari/plan.json corrupt' };
|
|
52
|
+
}
|
|
53
|
+
if (phaseCount === 0) {
|
|
54
|
+
return { ran: false, reason: '.zelari/plan.json has no phases' };
|
|
55
|
+
}
|
|
56
|
+
if (!existsSync(scriptPath)) {
|
|
57
|
+
// v0.7.8: no workspace script → run the built-in deterministic
|
|
58
|
+
// fallback instead of skipping. Same guarantees (≥3 tasks per phase,
|
|
59
|
+
// ≥1 milestone), zero per-workspace setup.
|
|
60
|
+
try {
|
|
61
|
+
const builtin = await runBuiltinCompleteDesign(ctx);
|
|
62
|
+
return {
|
|
63
|
+
ran: builtin.ran,
|
|
64
|
+
...(builtin.ran ? { exitCode: 0 } : {}),
|
|
65
|
+
output: `builtin complete-design: +${builtin.tasksAdded} tasks, +${builtin.milestonesAdded} milestones`,
|
|
66
|
+
...(builtin.reason ? { reason: builtin.reason } : {}),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
return {
|
|
71
|
+
ran: true,
|
|
72
|
+
exitCode: -1,
|
|
73
|
+
reason: `builtin complete-design error: ${err instanceof Error ? err.message : String(err)}`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
28
76
|
}
|
|
29
|
-
|
|
30
|
-
|
|
77
|
+
return await new Promise((resolveRun) => {
|
|
78
|
+
const child = spawn(process.execPath, [scriptPath], {
|
|
79
|
+
cwd: ctx.projectRoot,
|
|
80
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
81
|
+
env: process.env,
|
|
82
|
+
});
|
|
83
|
+
let stdout = '';
|
|
84
|
+
let stderr = '';
|
|
85
|
+
child.stdout?.on('data', (chunk) => {
|
|
86
|
+
stdout += chunk.toString('utf8');
|
|
87
|
+
});
|
|
88
|
+
child.stderr?.on('data', (chunk) => {
|
|
89
|
+
stderr += chunk.toString('utf8');
|
|
90
|
+
});
|
|
91
|
+
child.on('error', (err) => {
|
|
92
|
+
resolveRun({
|
|
93
|
+
ran: true,
|
|
94
|
+
exitCode: -1,
|
|
95
|
+
output: stderr,
|
|
96
|
+
reason: `spawn error: ${err.message}`,
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
child.on('close', (code) => {
|
|
100
|
+
const exitCode = code ?? -1;
|
|
101
|
+
const ok = exitCode === 0;
|
|
102
|
+
resolveRun({
|
|
103
|
+
ran: true,
|
|
104
|
+
exitCode,
|
|
105
|
+
output: stdout + stderr,
|
|
106
|
+
...(ok ? {} : { reason: `complete-design exited with code ${exitCode}` }),
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Run the post-council hook pipeline:
|
|
113
|
+
* 1. AGENTS.MD auto-maintenance (can be skipped via ZELARI_AGENTS_MD=0).
|
|
114
|
+
* 2. complete-design post-processor (design-phase only, can be skipped
|
|
115
|
+
* via ZELARI_COMPLETE_DESIGN=0).
|
|
116
|
+
*
|
|
117
|
+
* The `completeDesign` field carries the secondary result so the CLI can
|
|
118
|
+
* surface it ("complete-design: 12 tasks + 1 milestone added"). The
|
|
119
|
+
* primary `changed`/`sections` reflect the AGENTS.MD step only.
|
|
120
|
+
*
|
|
121
|
+
* Errors from either step are caught and reported in the result — the
|
|
122
|
+
* hook never throws.
|
|
123
|
+
*/
|
|
124
|
+
export async function runPostCouncilHook(ctx) {
|
|
125
|
+
// ── Step 1: AGENTS.MD maintenance ─────────────────────────────────────
|
|
126
|
+
let agentsMdResult;
|
|
127
|
+
if (process.env['ZELARI_AGENTS_MD'] === '0') {
|
|
128
|
+
agentsMdResult = {
|
|
31
129
|
ran: false,
|
|
32
130
|
changed: false,
|
|
33
131
|
sections: [],
|
|
34
|
-
reason:
|
|
132
|
+
reason: 'ZELARI_AGENTS_MD=0 (disabled)',
|
|
35
133
|
};
|
|
36
134
|
}
|
|
135
|
+
else {
|
|
136
|
+
try {
|
|
137
|
+
const result = await updateAgentsMd(ctx, ctx.projectRoot);
|
|
138
|
+
agentsMdResult = {
|
|
139
|
+
ran: true,
|
|
140
|
+
changed: result.changed,
|
|
141
|
+
sections: result.sections,
|
|
142
|
+
...(result.reason ? { reason: result.reason } : {}),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
agentsMdResult = {
|
|
147
|
+
ran: false,
|
|
148
|
+
changed: false,
|
|
149
|
+
sections: [],
|
|
150
|
+
reason: `error: ${err instanceof Error ? err.message : String(err)}`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ── Step 2: complete-design post-processor ───────────────────────────
|
|
155
|
+
const completeDesign = await runCompleteDesignPostProcessor(ctx);
|
|
156
|
+
return {
|
|
157
|
+
ran: agentsMdResult.ran || completeDesign.ran,
|
|
158
|
+
changed: agentsMdResult.changed,
|
|
159
|
+
sections: agentsMdResult.sections,
|
|
160
|
+
...(agentsMdResult.reason ? { reason: agentsMdResult.reason } : {}),
|
|
161
|
+
completeDesign,
|
|
162
|
+
};
|
|
37
163
|
}
|
|
38
164
|
//# sourceMappingURL=postCouncilHook.js.map
|