@alevental/cccp 0.1.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/.claude/skills/cccp-pipeline/SKILL.md +562 -0
- package/.claude/skills/cccp-run/SKILL.md +111 -0
- package/README.md +280 -0
- package/dist/activity-bus.d.ts +9 -0
- package/dist/activity-bus.js +10 -0
- package/dist/activity-bus.js.map +1 -0
- package/dist/agent-resolver.d.ts +29 -0
- package/dist/agent-resolver.js +122 -0
- package/dist/agent-resolver.js.map +1 -0
- package/dist/agent.d.ts +39 -0
- package/dist/agent.js +117 -0
- package/dist/agent.js.map +1 -0
- package/dist/autoresearch.d.ts +11 -0
- package/dist/autoresearch.js +295 -0
- package/dist/autoresearch.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +157 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +126 -0
- package/dist/config.js +76 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +24 -0
- package/dist/context.js +82 -0
- package/dist/context.js.map +1 -0
- package/dist/contract.d.ts +26 -0
- package/dist/contract.js +65 -0
- package/dist/contract.js.map +1 -0
- package/dist/db.d.ts +70 -0
- package/dist/db.js +358 -0
- package/dist/db.js.map +1 -0
- package/dist/dispatcher.d.ts +9 -0
- package/dist/dispatcher.js +7 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/evaluator.d.ts +23 -0
- package/dist/evaluator.js +49 -0
- package/dist/evaluator.js.map +1 -0
- package/dist/gate/auto-approve.d.ts +9 -0
- package/dist/gate/auto-approve.js +11 -0
- package/dist/gate/auto-approve.js.map +1 -0
- package/dist/gate/gate-strategy.d.ts +22 -0
- package/dist/gate/gate-strategy.js +2 -0
- package/dist/gate/gate-strategy.js.map +1 -0
- package/dist/gate/gate-watcher.d.ts +15 -0
- package/dist/gate/gate-watcher.js +64 -0
- package/dist/gate/gate-watcher.js.map +1 -0
- package/dist/logger.d.ts +24 -0
- package/dist/logger.js +22 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/gate-notifier.d.ts +26 -0
- package/dist/mcp/gate-notifier.js +161 -0
- package/dist/mcp/gate-notifier.js.map +1 -0
- package/dist/mcp/mcp-config.d.ts +25 -0
- package/dist/mcp/mcp-config.js +80 -0
- package/dist/mcp/mcp-config.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +1 -0
- package/dist/mcp/mcp-server.js +262 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/pge.d.ts +12 -0
- package/dist/pge.js +361 -0
- package/dist/pge.js.map +1 -0
- package/dist/pipeline.d.ts +6 -0
- package/dist/pipeline.js +120 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/prompt.d.ts +67 -0
- package/dist/prompt.js +121 -0
- package/dist/prompt.js.map +1 -0
- package/dist/runner.d.ts +11 -0
- package/dist/runner.js +494 -0
- package/dist/runner.js.map +1 -0
- package/dist/scaffold/index.d.ts +14 -0
- package/dist/scaffold/index.js +260 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/templates.d.ts +47 -0
- package/dist/scaffold/templates.js +2177 -0
- package/dist/scaffold/templates.js.map +1 -0
- package/dist/stage-helpers.d.ts +7 -0
- package/dist/stage-helpers.js +27 -0
- package/dist/stage-helpers.js.map +1 -0
- package/dist/state.d.ts +43 -0
- package/dist/state.js +177 -0
- package/dist/state.js.map +1 -0
- package/dist/stream/stream-tail.d.ts +17 -0
- package/dist/stream/stream-tail.js +95 -0
- package/dist/stream/stream-tail.js.map +1 -0
- package/dist/stream/stream.d.ts +142 -0
- package/dist/stream/stream.js +251 -0
- package/dist/stream/stream.js.map +1 -0
- package/dist/temp-tracker.d.ts +6 -0
- package/dist/temp-tracker.js +24 -0
- package/dist/temp-tracker.js.map +1 -0
- package/dist/tui/cmux.d.ts +22 -0
- package/dist/tui/cmux.js +82 -0
- package/dist/tui/cmux.js.map +1 -0
- package/dist/tui/components.d.ts +21 -0
- package/dist/tui/components.js +108 -0
- package/dist/tui/components.js.map +1 -0
- package/dist/tui/dashboard.d.ts +6 -0
- package/dist/tui/dashboard.js +125 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/detail-log.d.ts +10 -0
- package/dist/tui/detail-log.js +171 -0
- package/dist/tui/detail-log.js.map +1 -0
- package/dist/types.d.ts +273 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/examples/agents/diff-evaluator.md +57 -0
- package/examples/agents/prompt-tuner.md +30 -0
- package/examples/agents/summarizer.md +14 -0
- package/examples/autoresearch-artifacts/expected-output.md +17 -0
- package/examples/autoresearch-artifacts/prompt.md +35 -0
- package/examples/autoresearch-artifacts/source-material.md +28 -0
- package/examples/business-case.yaml +41 -0
- package/examples/cccp.yaml +48 -0
- package/examples/content-calendar.yaml +59 -0
- package/examples/customer-feedback-loop.yaml +44 -0
- package/examples/design-sprint.yaml +54 -0
- package/examples/feature-development.yaml +96 -0
- package/examples/growth-experiment.yaml +49 -0
- package/examples/incident-runbook.yaml +43 -0
- package/examples/product-launch.yaml +85 -0
- package/examples/prompt-tuning.yaml +25 -0
- package/examples/quarterly-planning.yaml +51 -0
- package/examples/sprint-cycle.yaml +67 -0
- package/package.json +47 -0
package/dist/db.js
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import initSqlJs from "sql.js";
|
|
2
|
+
import { readFileSync, writeFileSync, renameSync, existsSync, mkdirSync, } from "node:fs";
|
|
3
|
+
import { resolve, join, dirname } from "node:path";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// sql.js initialization (async, once)
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
let SQL = null;
|
|
9
|
+
async function getSql() {
|
|
10
|
+
if (!SQL) {
|
|
11
|
+
SQL = await initSqlJs();
|
|
12
|
+
}
|
|
13
|
+
return SQL;
|
|
14
|
+
}
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Database path
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export function dbPath(projectDir) {
|
|
19
|
+
return resolve(projectDir, ".cccp", "cccp.db");
|
|
20
|
+
}
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// CccpDatabase
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
export class CccpDatabase {
|
|
25
|
+
db;
|
|
26
|
+
filePath;
|
|
27
|
+
constructor(db, filePath) {
|
|
28
|
+
this.db = db;
|
|
29
|
+
this.filePath = filePath;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Open or create a database. If the file exists, load it. Otherwise create
|
|
33
|
+
* a new empty DB with the schema.
|
|
34
|
+
*/
|
|
35
|
+
static async open(projectDir) {
|
|
36
|
+
const sql = await getSql();
|
|
37
|
+
const fp = dbPath(projectDir);
|
|
38
|
+
const dir = dirname(fp);
|
|
39
|
+
mkdirSync(dir, { recursive: true });
|
|
40
|
+
let db;
|
|
41
|
+
if (existsSync(fp)) {
|
|
42
|
+
const buffer = readFileSync(fp);
|
|
43
|
+
db = new sql.Database(buffer);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
db = new sql.Database();
|
|
47
|
+
}
|
|
48
|
+
const instance = new CccpDatabase(db, fp);
|
|
49
|
+
instance.migrate();
|
|
50
|
+
return instance;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Open a read-only copy of the database (for standalone dashboard / MCP server).
|
|
54
|
+
* Re-reads the file from disk each time — safe for cross-process access.
|
|
55
|
+
*/
|
|
56
|
+
static async openReadOnly(projectDir) {
|
|
57
|
+
const sql = await getSql();
|
|
58
|
+
const fp = dbPath(projectDir);
|
|
59
|
+
if (!existsSync(fp)) {
|
|
60
|
+
// No DB yet — return an empty one (no writes will be flushed)
|
|
61
|
+
const db = new sql.Database();
|
|
62
|
+
const instance = new CccpDatabase(db, fp);
|
|
63
|
+
instance.migrate();
|
|
64
|
+
return instance;
|
|
65
|
+
}
|
|
66
|
+
const buffer = readFileSync(fp);
|
|
67
|
+
const db = new sql.Database(buffer);
|
|
68
|
+
return new CccpDatabase(db, fp);
|
|
69
|
+
}
|
|
70
|
+
// -------------------------------------------------------------------------
|
|
71
|
+
// Schema migration
|
|
72
|
+
// -------------------------------------------------------------------------
|
|
73
|
+
migrate() {
|
|
74
|
+
const version = this.pragma("user_version");
|
|
75
|
+
if (version < 1) {
|
|
76
|
+
this.db.run(`
|
|
77
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
78
|
+
run_id TEXT PRIMARY KEY,
|
|
79
|
+
pipeline TEXT NOT NULL,
|
|
80
|
+
project TEXT NOT NULL,
|
|
81
|
+
pipeline_file TEXT NOT NULL,
|
|
82
|
+
artifact_dir TEXT NOT NULL,
|
|
83
|
+
project_dir TEXT,
|
|
84
|
+
started_at TEXT NOT NULL,
|
|
85
|
+
completed_at TEXT,
|
|
86
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
87
|
+
stages_json TEXT NOT NULL,
|
|
88
|
+
stage_order_json TEXT NOT NULL,
|
|
89
|
+
gate_json TEXT,
|
|
90
|
+
updated_at TEXT NOT NULL
|
|
91
|
+
)
|
|
92
|
+
`);
|
|
93
|
+
this.db.run(`CREATE INDEX IF NOT EXISTS idx_runs_status ON runs(status)`);
|
|
94
|
+
this.db.run(`CREATE INDEX IF NOT EXISTS idx_runs_artifact_dir ON runs(artifact_dir)`);
|
|
95
|
+
this.db.run(`
|
|
96
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
97
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
98
|
+
run_id TEXT NOT NULL,
|
|
99
|
+
timestamp TEXT NOT NULL,
|
|
100
|
+
event_type TEXT NOT NULL,
|
|
101
|
+
stage_name TEXT,
|
|
102
|
+
data_json TEXT,
|
|
103
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
104
|
+
)
|
|
105
|
+
`);
|
|
106
|
+
this.db.run(`CREATE INDEX IF NOT EXISTS idx_events_run ON events(run_id, id)`);
|
|
107
|
+
this.db.run(`
|
|
108
|
+
CREATE TABLE IF NOT EXISTS checkpoints (
|
|
109
|
+
run_id TEXT NOT NULL,
|
|
110
|
+
stage_name TEXT NOT NULL,
|
|
111
|
+
key TEXT NOT NULL,
|
|
112
|
+
value TEXT NOT NULL,
|
|
113
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
114
|
+
PRIMARY KEY (run_id, stage_name, key)
|
|
115
|
+
)
|
|
116
|
+
`);
|
|
117
|
+
this.db.run(`PRAGMA user_version = 1`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
pragma(name) {
|
|
121
|
+
const result = this.db.exec(`PRAGMA ${name}`);
|
|
122
|
+
if (result.length > 0 && result[0].values.length > 0) {
|
|
123
|
+
return result[0].values[0][0];
|
|
124
|
+
}
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
// -------------------------------------------------------------------------
|
|
128
|
+
// Runs — CRUD
|
|
129
|
+
// -------------------------------------------------------------------------
|
|
130
|
+
insertRun(state, artifactDir) {
|
|
131
|
+
this.db.run(`INSERT INTO runs (run_id, pipeline, project, pipeline_file, artifact_dir, project_dir, started_at, completed_at, status, stages_json, stage_order_json, gate_json, updated_at)
|
|
132
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
133
|
+
state.runId,
|
|
134
|
+
state.pipeline,
|
|
135
|
+
state.project,
|
|
136
|
+
state.pipelineFile,
|
|
137
|
+
artifactDir,
|
|
138
|
+
state.projectDir ?? null,
|
|
139
|
+
state.startedAt,
|
|
140
|
+
state.completedAt ?? null,
|
|
141
|
+
state.status,
|
|
142
|
+
JSON.stringify(state.stages),
|
|
143
|
+
JSON.stringify(state.stageOrder),
|
|
144
|
+
state.gate ? JSON.stringify(state.gate) : null,
|
|
145
|
+
new Date().toISOString(),
|
|
146
|
+
]);
|
|
147
|
+
}
|
|
148
|
+
updateRun(state, artifactDir) {
|
|
149
|
+
this.db.run(`UPDATE runs SET
|
|
150
|
+
status = ?, completed_at = ?, stages_json = ?, stage_order_json = ?,
|
|
151
|
+
gate_json = ?, updated_at = ?
|
|
152
|
+
WHERE run_id = ?`, [
|
|
153
|
+
state.status,
|
|
154
|
+
state.completedAt ?? null,
|
|
155
|
+
JSON.stringify(state.stages),
|
|
156
|
+
JSON.stringify(state.stageOrder),
|
|
157
|
+
state.gate ? JSON.stringify(state.gate) : null,
|
|
158
|
+
new Date().toISOString(),
|
|
159
|
+
state.runId,
|
|
160
|
+
]);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Insert or update — tries update first, inserts if no row exists.
|
|
164
|
+
*/
|
|
165
|
+
upsertRun(state, artifactDir) {
|
|
166
|
+
const existing = this.getRun(state.runId);
|
|
167
|
+
if (existing) {
|
|
168
|
+
this.updateRun(state, artifactDir);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
this.insertRun(state, artifactDir);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
getRun(runId) {
|
|
175
|
+
const results = this.db.exec(`SELECT * FROM runs WHERE run_id = ?`, [runId]);
|
|
176
|
+
if (results.length === 0 || results[0].values.length === 0)
|
|
177
|
+
return null;
|
|
178
|
+
return this.rowToState(results[0].columns, results[0].values[0]);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* @deprecated Use getRun(runId) instead.
|
|
182
|
+
*/
|
|
183
|
+
getRunByArtifactDir(artifactDir) {
|
|
184
|
+
const results = this.db.exec(`SELECT * FROM runs WHERE artifact_dir = ? ORDER BY started_at DESC LIMIT 1`, [artifactDir]);
|
|
185
|
+
if (results.length === 0 || results[0].values.length === 0)
|
|
186
|
+
return null;
|
|
187
|
+
return this.rowToState(results[0].columns, results[0].values[0]);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Find a run by ID prefix. Returns null if zero or multiple matches.
|
|
191
|
+
*/
|
|
192
|
+
getRunByIdPrefix(prefix) {
|
|
193
|
+
const results = this.db.exec(`SELECT * FROM runs WHERE run_id LIKE ? || '%'`, [prefix]);
|
|
194
|
+
if (results.length === 0 || results[0].values.length !== 1)
|
|
195
|
+
return null;
|
|
196
|
+
return this.rowToState(results[0].columns, results[0].values[0]);
|
|
197
|
+
}
|
|
198
|
+
listRuns() {
|
|
199
|
+
return this.findRuns();
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Find runs matching optional filters. All filters are AND-combined.
|
|
203
|
+
* Results sorted running-first, then by start time descending.
|
|
204
|
+
*/
|
|
205
|
+
findRuns(filter) {
|
|
206
|
+
const conditions = [];
|
|
207
|
+
const params = [];
|
|
208
|
+
if (filter?.project) {
|
|
209
|
+
conditions.push("project = ?");
|
|
210
|
+
params.push(filter.project);
|
|
211
|
+
}
|
|
212
|
+
if (filter?.pipeline) {
|
|
213
|
+
conditions.push("pipeline = ?");
|
|
214
|
+
params.push(filter.pipeline);
|
|
215
|
+
}
|
|
216
|
+
if (filter?.status) {
|
|
217
|
+
conditions.push("status = ?");
|
|
218
|
+
params.push(filter.status);
|
|
219
|
+
}
|
|
220
|
+
if (filter?.artifactDir) {
|
|
221
|
+
conditions.push("artifact_dir = ?");
|
|
222
|
+
params.push(filter.artifactDir);
|
|
223
|
+
}
|
|
224
|
+
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
225
|
+
const results = this.db.exec(`SELECT * FROM runs ${where} ORDER BY
|
|
226
|
+
CASE WHEN status = 'running' THEN 0 ELSE 1 END,
|
|
227
|
+
started_at DESC`, params);
|
|
228
|
+
if (results.length === 0)
|
|
229
|
+
return [];
|
|
230
|
+
return results[0].values.map((row) => {
|
|
231
|
+
const state = this.rowToState(results[0].columns, row);
|
|
232
|
+
return { artifactDir: state.artifactDir, state };
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
rowToState(columns, row) {
|
|
236
|
+
const col = (name) => row[columns.indexOf(name)];
|
|
237
|
+
return {
|
|
238
|
+
runId: col("run_id"),
|
|
239
|
+
pipeline: col("pipeline"),
|
|
240
|
+
project: col("project"),
|
|
241
|
+
pipelineFile: col("pipeline_file"),
|
|
242
|
+
startedAt: col("started_at"),
|
|
243
|
+
completedAt: col("completed_at") || undefined,
|
|
244
|
+
status: col("status"),
|
|
245
|
+
stages: JSON.parse(col("stages_json")),
|
|
246
|
+
stageOrder: JSON.parse(col("stage_order_json")),
|
|
247
|
+
gate: col("gate_json")
|
|
248
|
+
? JSON.parse(col("gate_json"))
|
|
249
|
+
: undefined,
|
|
250
|
+
artifactDir: col("artifact_dir"),
|
|
251
|
+
projectDir: col("project_dir") || undefined,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// -------------------------------------------------------------------------
|
|
255
|
+
// Events — append-only audit log
|
|
256
|
+
// -------------------------------------------------------------------------
|
|
257
|
+
appendEvent(runId, eventType, stageName, data) {
|
|
258
|
+
this.db.run(`INSERT INTO events (run_id, timestamp, event_type, stage_name, data_json)
|
|
259
|
+
VALUES (?, ?, ?, ?, ?)`, [
|
|
260
|
+
runId,
|
|
261
|
+
new Date().toISOString(),
|
|
262
|
+
eventType,
|
|
263
|
+
stageName ?? null,
|
|
264
|
+
data ? JSON.stringify(data) : null,
|
|
265
|
+
]);
|
|
266
|
+
}
|
|
267
|
+
getEvents(runId, sinceId) {
|
|
268
|
+
const sql = sinceId != null
|
|
269
|
+
? `SELECT * FROM events WHERE run_id = ? AND id > ? ORDER BY id`
|
|
270
|
+
: `SELECT * FROM events WHERE run_id = ? ORDER BY id`;
|
|
271
|
+
const params = sinceId != null ? [runId, sinceId] : [runId];
|
|
272
|
+
const results = this.db.exec(sql, params);
|
|
273
|
+
if (results.length === 0)
|
|
274
|
+
return [];
|
|
275
|
+
const cols = results[0].columns;
|
|
276
|
+
return results[0].values.map((row) => ({
|
|
277
|
+
id: row[cols.indexOf("id")],
|
|
278
|
+
runId: row[cols.indexOf("run_id")],
|
|
279
|
+
timestamp: row[cols.indexOf("timestamp")],
|
|
280
|
+
eventType: row[cols.indexOf("event_type")],
|
|
281
|
+
stageName: row[cols.indexOf("stage_name")] || undefined,
|
|
282
|
+
data: row[cols.indexOf("data_json")]
|
|
283
|
+
? JSON.parse(row[cols.indexOf("data_json")])
|
|
284
|
+
: undefined,
|
|
285
|
+
}));
|
|
286
|
+
}
|
|
287
|
+
// -------------------------------------------------------------------------
|
|
288
|
+
// Checkpoints — cached stage outputs
|
|
289
|
+
// -------------------------------------------------------------------------
|
|
290
|
+
setCheckpoint(runId, stageName, key, value) {
|
|
291
|
+
this.db.run(`INSERT OR REPLACE INTO checkpoints (run_id, stage_name, key, value, created_at)
|
|
292
|
+
VALUES (?, ?, ?, ?, datetime('now'))`, [runId, stageName, key, value]);
|
|
293
|
+
}
|
|
294
|
+
getCheckpoint(runId, stageName, key) {
|
|
295
|
+
const results = this.db.exec(`SELECT value FROM checkpoints WHERE run_id = ? AND stage_name = ? AND key = ?`, [runId, stageName, key]);
|
|
296
|
+
if (results.length === 0 || results[0].values.length === 0)
|
|
297
|
+
return null;
|
|
298
|
+
return results[0].values[0][0];
|
|
299
|
+
}
|
|
300
|
+
// -------------------------------------------------------------------------
|
|
301
|
+
// Persistence — flush to disk
|
|
302
|
+
// -------------------------------------------------------------------------
|
|
303
|
+
/**
|
|
304
|
+
* Atomically write the database to disk (write to .tmp then rename).
|
|
305
|
+
*/
|
|
306
|
+
flush() {
|
|
307
|
+
const data = this.db.export();
|
|
308
|
+
const buffer = Buffer.from(data);
|
|
309
|
+
const dir = dirname(this.filePath);
|
|
310
|
+
mkdirSync(dir, { recursive: true });
|
|
311
|
+
const tmp = join(dir, `.cccp-db-${randomUUID()}.tmp`);
|
|
312
|
+
writeFileSync(tmp, buffer);
|
|
313
|
+
renameSync(tmp, this.filePath);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Reload the database from disk (for read-only consumers in separate processes).
|
|
317
|
+
*/
|
|
318
|
+
reload() {
|
|
319
|
+
if (!existsSync(this.filePath))
|
|
320
|
+
return;
|
|
321
|
+
const buffer = readFileSync(this.filePath);
|
|
322
|
+
const sql = SQL;
|
|
323
|
+
this.db.close();
|
|
324
|
+
this.db = new sql.Database(buffer);
|
|
325
|
+
}
|
|
326
|
+
close() {
|
|
327
|
+
this.db.close();
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// ---------------------------------------------------------------------------
|
|
331
|
+
// Singleton cache
|
|
332
|
+
// ---------------------------------------------------------------------------
|
|
333
|
+
const instances = new Map();
|
|
334
|
+
/**
|
|
335
|
+
* Get or create a CccpDatabase for the given project directory.
|
|
336
|
+
* Caches the instance for reuse within the same process.
|
|
337
|
+
*/
|
|
338
|
+
export async function openDatabase(projectDir) {
|
|
339
|
+
const key = resolve(projectDir);
|
|
340
|
+
let db = instances.get(key);
|
|
341
|
+
if (!db) {
|
|
342
|
+
db = await CccpDatabase.open(projectDir);
|
|
343
|
+
instances.set(key, db);
|
|
344
|
+
}
|
|
345
|
+
return db;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Close and remove a cached database instance.
|
|
349
|
+
*/
|
|
350
|
+
export function closeDatabase(projectDir) {
|
|
351
|
+
const key = resolve(projectDir);
|
|
352
|
+
const db = instances.get(key);
|
|
353
|
+
if (db) {
|
|
354
|
+
db.close();
|
|
355
|
+
instances.delete(key);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type DispatchOptions } from "./agent.js";
|
|
2
|
+
import type { AgentResult } from "./types.js";
|
|
3
|
+
export type { DispatchOptions } from "./agent.js";
|
|
4
|
+
export interface AgentDispatcher {
|
|
5
|
+
dispatch(opts: DispatchOptions): Promise<AgentResult>;
|
|
6
|
+
}
|
|
7
|
+
export declare class DefaultAgentDispatcher implements AgentDispatcher {
|
|
8
|
+
dispatch(opts: DispatchOptions): Promise<AgentResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAwB,MAAM,YAAY,CAAC;AASjE,MAAM,OAAO,sBAAsB;IACjC,KAAK,CAAC,QAAQ,CAAC,IAAqB;QAClC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Agent process crashed (non-zero exit code, distinct from evaluation FAIL). */
|
|
2
|
+
export declare class AgentCrashError extends Error {
|
|
3
|
+
readonly agent: string;
|
|
4
|
+
readonly exitCode: number;
|
|
5
|
+
constructor(agent: string, exitCode: number);
|
|
6
|
+
}
|
|
7
|
+
/** Agent was expected to produce an output file but didn't. */
|
|
8
|
+
export declare class MissingOutputError extends Error {
|
|
9
|
+
readonly agent: string;
|
|
10
|
+
readonly expectedPath: string;
|
|
11
|
+
constructor(agent: string, expectedPath: string);
|
|
12
|
+
}
|
|
13
|
+
/** Pipeline YAML or config validation error. */
|
|
14
|
+
export declare class ValidationError extends Error {
|
|
15
|
+
constructor(message: string);
|
|
16
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Agent process crashed (non-zero exit code, distinct from evaluation FAIL). */
|
|
2
|
+
export class AgentCrashError extends Error {
|
|
3
|
+
agent;
|
|
4
|
+
exitCode;
|
|
5
|
+
constructor(agent, exitCode) {
|
|
6
|
+
super(`Agent "${agent}" crashed with exit code ${exitCode}`);
|
|
7
|
+
this.agent = agent;
|
|
8
|
+
this.exitCode = exitCode;
|
|
9
|
+
this.name = "AgentCrashError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Agent was expected to produce an output file but didn't. */
|
|
13
|
+
export class MissingOutputError extends Error {
|
|
14
|
+
agent;
|
|
15
|
+
expectedPath;
|
|
16
|
+
constructor(agent, expectedPath) {
|
|
17
|
+
super(`Agent "${agent}" did not produce expected output: ${expectedPath}`);
|
|
18
|
+
this.agent = agent;
|
|
19
|
+
this.expectedPath = expectedPath;
|
|
20
|
+
this.name = "MissingOutputError";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Pipeline YAML or config validation error. */
|
|
24
|
+
export class ValidationError extends Error {
|
|
25
|
+
constructor(message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = "ValidationError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IACA;IAFlB,YACkB,KAAa,EACb,QAAgB;QAEhC,KAAK,CAAC,UAAU,KAAK,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QAH7C,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAQ;QAGhC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,+DAA+D;AAC/D,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEzB;IACA;IAFlB,YACkB,KAAa,EACb,YAAoB;QAEpC,KAAK,CACH,UAAU,KAAK,sCAAsC,YAAY,EAAE,CACpE,CAAC;QALc,UAAK,GAAL,KAAK,CAAQ;QACb,iBAAY,GAAZ,YAAY,CAAQ;QAKpC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,gDAAgD;AAChD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type EvaluationOutcome = "pass" | "fail" | "parse_error";
|
|
2
|
+
export interface EvaluationResult {
|
|
3
|
+
outcome: EvaluationOutcome;
|
|
4
|
+
/** Raw text of the Overall line, if found. */
|
|
5
|
+
rawLine?: string;
|
|
6
|
+
/** Full evaluation file content (for logging/debugging). */
|
|
7
|
+
content?: string;
|
|
8
|
+
/** Error message when outcome is parse_error. */
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse an evaluation file and extract the Overall PASS/FAIL verdict.
|
|
13
|
+
*
|
|
14
|
+
* Returns:
|
|
15
|
+
* - `pass` if `### Overall: PASS` is found
|
|
16
|
+
* - `fail` if `### Overall: FAIL` is found
|
|
17
|
+
* - `parse_error` if the file can't be read or the Overall line is missing/malformed
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseEvaluation(evaluationPath: string): Promise<EvaluationResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Parse evaluation content directly (useful for testing without filesystem).
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseEvaluationContent(content: string): EvaluationResult;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Regex — matches the exact format from the evaluation template
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const OVERALL_RE = /^###\s+Overall:\s*(PASS|FAIL)\s*$/m;
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Public API
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
/**
|
|
10
|
+
* Parse an evaluation file and extract the Overall PASS/FAIL verdict.
|
|
11
|
+
*
|
|
12
|
+
* Returns:
|
|
13
|
+
* - `pass` if `### Overall: PASS` is found
|
|
14
|
+
* - `fail` if `### Overall: FAIL` is found
|
|
15
|
+
* - `parse_error` if the file can't be read or the Overall line is missing/malformed
|
|
16
|
+
*/
|
|
17
|
+
export async function parseEvaluation(evaluationPath) {
|
|
18
|
+
let content;
|
|
19
|
+
try {
|
|
20
|
+
content = await readFile(evaluationPath, "utf-8");
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
return {
|
|
24
|
+
outcome: "parse_error",
|
|
25
|
+
error: `Cannot read evaluation file: ${evaluationPath}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return parseEvaluationContent(content);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse evaluation content directly (useful for testing without filesystem).
|
|
32
|
+
*/
|
|
33
|
+
export function parseEvaluationContent(content) {
|
|
34
|
+
const match = OVERALL_RE.exec(content);
|
|
35
|
+
if (!match) {
|
|
36
|
+
return {
|
|
37
|
+
outcome: "parse_error",
|
|
38
|
+
content,
|
|
39
|
+
error: 'Evaluation file does not contain a valid "### Overall: PASS" or "### Overall: FAIL" line',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const verdict = match[1].toLowerCase();
|
|
43
|
+
return {
|
|
44
|
+
outcome: verdict,
|
|
45
|
+
rawLine: match[0].trimEnd(),
|
|
46
|
+
content,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../src/evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAkB5C,8EAA8E;AAC9E,gEAAgE;AAChE,8EAA8E;AAE9E,MAAM,UAAU,GAAG,oCAAoC,CAAC;AAExD,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,cAAsB;IAEtB,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,aAAa;YACtB,KAAK,EAAE,gCAAgC,cAAc,EAAE;SACxD,CAAC;IACJ,CAAC;IAED,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,aAAa;YACtB,OAAO;YACP,KAAK,EACH,0FAA0F;SAC7F,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAqB,CAAC;IAE1D,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;QAC3B,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GateInfo } from "../types.js";
|
|
2
|
+
import type { GateResponse, GateStrategy } from "./gate-strategy.js";
|
|
3
|
+
/**
|
|
4
|
+
* Gate strategy that automatically approves all gates.
|
|
5
|
+
* Used in headless/CI mode where no human is available.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AutoApproveStrategy implements GateStrategy {
|
|
8
|
+
waitForGate(gate: GateInfo): Promise<GateResponse>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gate strategy that automatically approves all gates.
|
|
3
|
+
* Used in headless/CI mode where no human is available.
|
|
4
|
+
*/
|
|
5
|
+
export class AutoApproveStrategy {
|
|
6
|
+
async waitForGate(gate) {
|
|
7
|
+
console.log(` ⏭ Auto-approving gate: ${gate.stageName}`);
|
|
8
|
+
return { approved: true };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=auto-approve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-approve.js","sourceRoot":"","sources":["../../src/gate/auto-approve.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IAC9B,KAAK,CAAC,WAAW,CAAC,IAAc;QAC9B,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { GateInfo } from "../types.js";
|
|
2
|
+
export interface GateResponse {
|
|
3
|
+
approved: boolean;
|
|
4
|
+
feedback?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A gate strategy determines how human gates are presented and how responses
|
|
8
|
+
* are collected. Implementations:
|
|
9
|
+
* - `McpGateStrategy`: Writes gate_pending to state.json, waits for external
|
|
10
|
+
* response (via MCP server or direct state file edit).
|
|
11
|
+
* - `AutoApproveStrategy`: Immediately approves all gates (headless mode).
|
|
12
|
+
*/
|
|
13
|
+
export interface GateStrategy {
|
|
14
|
+
/**
|
|
15
|
+
* Wait for a human gate response.
|
|
16
|
+
* The strategy is responsible for:
|
|
17
|
+
* 1. Signaling that a gate is pending (e.g., writing to state.json)
|
|
18
|
+
* 2. Waiting for a response
|
|
19
|
+
* 3. Returning the response
|
|
20
|
+
*/
|
|
21
|
+
waitForGate(gate: GateInfo): Promise<GateResponse>;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-strategy.js","sourceRoot":"","sources":["../../src/gate/gate-strategy.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GateInfo } from "../types.js";
|
|
2
|
+
import type { GateResponse, GateStrategy } from "./gate-strategy.js";
|
|
3
|
+
/**
|
|
4
|
+
* Gate strategy that writes `gate_pending` to state.json and polls for
|
|
5
|
+
* a response. The response comes from either:
|
|
6
|
+
* - The MCP server (pipeline_gate_respond tool)
|
|
7
|
+
* - Direct edit of state.json
|
|
8
|
+
*/
|
|
9
|
+
export declare class FilesystemGateStrategy implements GateStrategy {
|
|
10
|
+
private runId;
|
|
11
|
+
private projectDir?;
|
|
12
|
+
private quiet?;
|
|
13
|
+
constructor(runId: string, projectDir?: string | undefined, quiet?: boolean | undefined);
|
|
14
|
+
waitForGate(gate: GateInfo): Promise<GateResponse>;
|
|
15
|
+
}
|