@jamesaphoenix/tx-core 0.6.1 → 0.8.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/README.md +11 -1
- package/dist/errors.d.ts +30 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +17 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +9 -4
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +27 -5
- package/dist/layer.js.map +1 -1
- package/dist/migrations-embedded.d.ts.map +1 -1
- package/dist/migrations-embedded.js +10 -0
- package/dist/migrations-embedded.js.map +1 -1
- package/dist/repo/attempt-repo.js +1 -1
- package/dist/repo/attempt-repo.js.map +1 -1
- package/dist/repo/guard-repo.d.ts +40 -0
- package/dist/repo/guard-repo.d.ts.map +1 -0
- package/dist/repo/guard-repo.js +98 -0
- package/dist/repo/guard-repo.js.map +1 -0
- package/dist/repo/index.d.ts +2 -0
- package/dist/repo/index.d.ts.map +1 -1
- package/dist/repo/index.js +2 -0
- package/dist/repo/index.js.map +1 -1
- package/dist/repo/label-repo.d.ts +31 -0
- package/dist/repo/label-repo.d.ts.map +1 -0
- package/dist/repo/label-repo.js +91 -0
- package/dist/repo/label-repo.js.map +1 -0
- package/dist/repo/task-repo.d.ts +5 -0
- package/dist/repo/task-repo.d.ts.map +1 -1
- package/dist/repo/task-repo.js +51 -1
- package/dist/repo/task-repo.js.map +1 -1
- package/dist/services/guard-service.d.ts +24 -0
- package/dist/services/guard-service.d.ts.map +1 -0
- package/dist/services/guard-service.js +132 -0
- package/dist/services/guard-service.js.map +1 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/ready-service.d.ts +4 -1
- package/dist/services/ready-service.d.ts.map +1 -1
- package/dist/services/ready-service.js +4 -2
- package/dist/services/ready-service.js.map +1 -1
- package/dist/services/reflect-service.d.ts +54 -0
- package/dist/services/reflect-service.d.ts.map +1 -0
- package/dist/services/reflect-service.js +293 -0
- package/dist/services/reflect-service.js.map +1 -0
- package/dist/services/task-service.d.ts +4 -3
- package/dist/services/task-service.d.ts.map +1 -1
- package/dist/services/task-service.js +94 -2
- package/dist/services/task-service.js.map +1 -1
- package/dist/services/verify-service.d.ts +30 -0
- package/dist/services/verify-service.d.ts.map +1 -0
- package/dist/services/verify-service.js +262 -0
- package/dist/services/verify-service.js.map +1 -0
- package/dist/utils/toml-config.d.ts +17 -0
- package/dist/utils/toml-config.d.ts.map +1 -1
- package/dist/utils/toml-config.js +87 -0
- package/dist/utils/toml-config.js.map +1 -1
- package/migrations/031_task_guards.sql +15 -0
- package/migrations/032_verify_cmd.sql +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { resolve as resolvePath, relative, isAbsolute } from "node:path";
|
|
5
|
+
import { TaskRepository } from "../repo/task-repo.js";
|
|
6
|
+
import { TaskNotFoundError, VerifyError } from "../errors.js";
|
|
7
|
+
import { readTxConfig } from "../utils/toml-config.js";
|
|
8
|
+
export class VerifyService extends Context.Tag("VerifyService")() {
|
|
9
|
+
}
|
|
10
|
+
export const VerifyServiceLive = Layer.effect(VerifyService, Effect.gen(function* () {
|
|
11
|
+
const taskRepo = yield* TaskRepository;
|
|
12
|
+
const config = readTxConfig();
|
|
13
|
+
// Capture project root at layer construction time, not at command execution time.
|
|
14
|
+
// This prevents cwd drift if process.chdir() is called later (e.g. in tests or MCP server).
|
|
15
|
+
const projectRoot = process.cwd();
|
|
16
|
+
return {
|
|
17
|
+
set: (id, cmd, schema) => Effect.gen(function* () {
|
|
18
|
+
const task = yield* taskRepo.findById(id);
|
|
19
|
+
if (!task) {
|
|
20
|
+
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
21
|
+
}
|
|
22
|
+
yield* taskRepo.updateVerifyCmd(id, cmd, schema ?? null);
|
|
23
|
+
}),
|
|
24
|
+
show: (id) => Effect.gen(function* () {
|
|
25
|
+
const task = yield* taskRepo.findById(id);
|
|
26
|
+
if (!task) {
|
|
27
|
+
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
28
|
+
}
|
|
29
|
+
const result = yield* taskRepo.getVerifyCmd(id);
|
|
30
|
+
return result;
|
|
31
|
+
}),
|
|
32
|
+
run: (id, options) => Effect.gen(function* () {
|
|
33
|
+
const task = yield* taskRepo.findById(id);
|
|
34
|
+
if (!task) {
|
|
35
|
+
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
36
|
+
}
|
|
37
|
+
const verify = yield* taskRepo.getVerifyCmd(id);
|
|
38
|
+
if (!verify.cmd) {
|
|
39
|
+
return yield* Effect.fail(new VerifyError({
|
|
40
|
+
taskId: id,
|
|
41
|
+
reason: "No verify command set. Use `tx verify set <id> <cmd>` first.",
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
const timeout = (options?.timeout ?? config.verify.timeout) * 1000;
|
|
45
|
+
// Execute the command
|
|
46
|
+
const result = yield* Effect.tryPromise({
|
|
47
|
+
try: () => executeCommand(verify.cmd, timeout, projectRoot),
|
|
48
|
+
catch: (cause) => new VerifyError({
|
|
49
|
+
taskId: id,
|
|
50
|
+
reason: `Command execution failed: ${String(cause)}`,
|
|
51
|
+
cause,
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
// If a schema is set, validate the output
|
|
55
|
+
const schemaPath = verify.schema ?? config.verify.defaultSchema;
|
|
56
|
+
let output;
|
|
57
|
+
let schemaValid;
|
|
58
|
+
if (schemaPath) {
|
|
59
|
+
// Guard against path traversal: schema must resolve within project root
|
|
60
|
+
// Uses projectRoot captured at layer construction time to prevent cwd drift
|
|
61
|
+
const resolvedSchema = resolvePath(projectRoot, schemaPath);
|
|
62
|
+
const rel = relative(projectRoot, resolvedSchema);
|
|
63
|
+
if (rel.startsWith("..") || isAbsolute(rel)) {
|
|
64
|
+
return yield* Effect.fail(new VerifyError({
|
|
65
|
+
taskId: id,
|
|
66
|
+
reason: `Schema path "${schemaPath}" escapes project root`,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
let schemaContent;
|
|
70
|
+
try {
|
|
71
|
+
schemaContent = readFileSync(resolvedSchema, "utf8");
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
return yield* Effect.fail(new VerifyError({
|
|
75
|
+
taskId: id,
|
|
76
|
+
reason: `Schema file not found or unreadable: ${schemaPath}`,
|
|
77
|
+
cause: err,
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
let schema;
|
|
81
|
+
try {
|
|
82
|
+
schema = JSON.parse(schemaContent);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return yield* Effect.fail(new VerifyError({
|
|
86
|
+
taskId: id,
|
|
87
|
+
reason: `Schema file is not valid JSON: ${schemaPath}`,
|
|
88
|
+
cause: err,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
output = JSON.parse(result.stdout);
|
|
93
|
+
schemaValid = validateJsonSchema(output, schema);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
schemaValid = false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Try to parse stdout as JSON for structured output
|
|
101
|
+
try {
|
|
102
|
+
output = JSON.parse(result.stdout);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Not JSON, that's fine
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const passed = result.exitCode === 0 && (schemaValid === undefined || schemaValid);
|
|
109
|
+
return {
|
|
110
|
+
taskId: id,
|
|
111
|
+
exitCode: result.exitCode,
|
|
112
|
+
passed,
|
|
113
|
+
stdout: result.stdout,
|
|
114
|
+
stderr: result.stderr,
|
|
115
|
+
durationMs: result.durationMs,
|
|
116
|
+
output,
|
|
117
|
+
schemaValid,
|
|
118
|
+
};
|
|
119
|
+
}),
|
|
120
|
+
clear: (id) => Effect.gen(function* () {
|
|
121
|
+
const task = yield* taskRepo.findById(id);
|
|
122
|
+
if (!task) {
|
|
123
|
+
return yield* Effect.fail(new TaskNotFoundError({ id }));
|
|
124
|
+
}
|
|
125
|
+
yield* taskRepo.updateVerifyCmd(id, null, null);
|
|
126
|
+
}),
|
|
127
|
+
};
|
|
128
|
+
}));
|
|
129
|
+
const MAX_OUTPUT_BYTES = 10 * 1024 * 1024; // 10 MB cap per stream
|
|
130
|
+
function executeCommand(cmd, timeoutMs, cwd) {
|
|
131
|
+
return new Promise((resolvePromise, reject) => {
|
|
132
|
+
const start = Date.now();
|
|
133
|
+
let settled = false;
|
|
134
|
+
const settle = (fn) => {
|
|
135
|
+
if (settled)
|
|
136
|
+
return;
|
|
137
|
+
settled = true;
|
|
138
|
+
fn();
|
|
139
|
+
};
|
|
140
|
+
const child = spawn("sh", ["-c", cmd], {
|
|
141
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
142
|
+
detached: true,
|
|
143
|
+
cwd,
|
|
144
|
+
env: { ...process.env },
|
|
145
|
+
});
|
|
146
|
+
let stdout = "";
|
|
147
|
+
let stderr = "";
|
|
148
|
+
let killed = false;
|
|
149
|
+
let killTimer = null;
|
|
150
|
+
child.stdout.on("data", (data) => {
|
|
151
|
+
if (stdout.length < MAX_OUTPUT_BYTES) {
|
|
152
|
+
const remaining = MAX_OUTPUT_BYTES - stdout.length;
|
|
153
|
+
stdout += data.toString().slice(0, remaining);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
child.stderr.on("data", (data) => {
|
|
157
|
+
if (stderr.length < MAX_OUTPUT_BYTES) {
|
|
158
|
+
const remaining = MAX_OUTPUT_BYTES - stderr.length;
|
|
159
|
+
stderr += data.toString().slice(0, remaining);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
const killProcessGroup = () => {
|
|
163
|
+
if (child.pid) {
|
|
164
|
+
try {
|
|
165
|
+
process.kill(-child.pid, "SIGKILL");
|
|
166
|
+
}
|
|
167
|
+
catch { /* already dead */ }
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
const timer = setTimeout(() => {
|
|
171
|
+
killed = true;
|
|
172
|
+
if (child.pid) {
|
|
173
|
+
try {
|
|
174
|
+
process.kill(-child.pid, "SIGTERM");
|
|
175
|
+
}
|
|
176
|
+
catch { /* already dead */ }
|
|
177
|
+
}
|
|
178
|
+
killTimer = setTimeout(() => {
|
|
179
|
+
killProcessGroup();
|
|
180
|
+
// Hard deadline: if close never fires, settle the Promise anyway
|
|
181
|
+
settle(() => reject(new Error(`Command timed out after ${timeoutMs}ms`)));
|
|
182
|
+
}, 5000);
|
|
183
|
+
// Do NOT call killTimer.unref() — this timer must fire unconditionally
|
|
184
|
+
// to guarantee SIGKILL delivery even when the event loop is otherwise idle
|
|
185
|
+
}, timeoutMs);
|
|
186
|
+
timer.unref();
|
|
187
|
+
const cleanup = () => {
|
|
188
|
+
clearTimeout(timer);
|
|
189
|
+
if (killTimer)
|
|
190
|
+
clearTimeout(killTimer);
|
|
191
|
+
};
|
|
192
|
+
const SIGNAL_NUMBERS = {
|
|
193
|
+
SIGHUP: 1, SIGINT: 2, SIGQUIT: 3, SIGILL: 4, SIGTRAP: 5,
|
|
194
|
+
SIGABRT: 6, SIGFPE: 8, SIGKILL: 9, SIGSEGV: 11, SIGPIPE: 13,
|
|
195
|
+
SIGALRM: 14, SIGTERM: 15,
|
|
196
|
+
};
|
|
197
|
+
child.on("close", (code, signal) => {
|
|
198
|
+
cleanup();
|
|
199
|
+
const durationMs = Date.now() - start;
|
|
200
|
+
if (killed) {
|
|
201
|
+
settle(() => reject(new Error(`Command timed out after ${timeoutMs}ms`)));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Derive exit code: numeric code if set, else 128 + signal number, else 1
|
|
205
|
+
const exitCode = code ?? (signal ? 128 + (SIGNAL_NUMBERS[signal] ?? 15) : 1);
|
|
206
|
+
settle(() => resolvePromise({ exitCode, stdout, stderr, durationMs }));
|
|
207
|
+
});
|
|
208
|
+
child.on("error", (err) => {
|
|
209
|
+
cleanup();
|
|
210
|
+
settle(() => reject(err));
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Minimal JSON Schema validation for required fields and types.
|
|
216
|
+
* Only validates top-level required + type checks — not a full JSON Schema validator.
|
|
217
|
+
* Validates: top-level type (object vs array), required fields, property type checks.
|
|
218
|
+
*/
|
|
219
|
+
function validateJsonSchema(data, schema) {
|
|
220
|
+
if (typeof data !== "object" || data === null)
|
|
221
|
+
return false;
|
|
222
|
+
// Validate top-level type if specified
|
|
223
|
+
if (typeof schema.type === "string") {
|
|
224
|
+
if (schema.type === "object" && Array.isArray(data))
|
|
225
|
+
return false;
|
|
226
|
+
if (schema.type === "array" && !Array.isArray(data))
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
const obj = data;
|
|
230
|
+
// Check required fields
|
|
231
|
+
const required = schema.required;
|
|
232
|
+
if (Array.isArray(required)) {
|
|
233
|
+
for (const field of required) {
|
|
234
|
+
if (typeof field === "string" && !(field in obj)) {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Check property types
|
|
240
|
+
const properties = schema.properties;
|
|
241
|
+
if (properties && typeof properties === "object") {
|
|
242
|
+
const props = properties;
|
|
243
|
+
for (const [key, propSchema] of Object.entries(props)) {
|
|
244
|
+
if (key in obj && propSchema.type) {
|
|
245
|
+
const value = obj[key];
|
|
246
|
+
const expectedType = propSchema.type;
|
|
247
|
+
if (expectedType === "number" && typeof value !== "number")
|
|
248
|
+
return false;
|
|
249
|
+
if (expectedType === "string" && typeof value !== "string")
|
|
250
|
+
return false;
|
|
251
|
+
if (expectedType === "boolean" && typeof value !== "boolean")
|
|
252
|
+
return false;
|
|
253
|
+
if (expectedType === "object" && (typeof value !== "object" || value === null || Array.isArray(value)))
|
|
254
|
+
return false;
|
|
255
|
+
if (expectedType === "array" && !Array.isArray(value))
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=verify-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify-service.js","sourceRoot":"","sources":["../../src/services/verify-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type DashboardDefaultTaskAssigmentType = "human" | "agent";
|
|
2
|
+
export type GuardMode = "advisory" | "enforce";
|
|
2
3
|
export interface TxConfig {
|
|
3
4
|
docs: {
|
|
4
5
|
path: string;
|
|
@@ -17,6 +18,22 @@ export interface TxConfig {
|
|
|
17
18
|
pins: {
|
|
18
19
|
targetFiles: string[];
|
|
19
20
|
};
|
|
21
|
+
guard: {
|
|
22
|
+
mode: GuardMode;
|
|
23
|
+
maxPending: number | null;
|
|
24
|
+
maxChildren: number | null;
|
|
25
|
+
maxDepth: number | null;
|
|
26
|
+
};
|
|
27
|
+
verify: {
|
|
28
|
+
timeout: number;
|
|
29
|
+
defaultSchema: string | null;
|
|
30
|
+
};
|
|
31
|
+
reflect: {
|
|
32
|
+
provider: string;
|
|
33
|
+
model: string | null;
|
|
34
|
+
defaultSessions: number;
|
|
35
|
+
includeTranscripts: boolean;
|
|
36
|
+
};
|
|
20
37
|
}
|
|
21
38
|
export declare const DASHBOARD_DEFAULT_TASK_ASSIGMENT_KEY = "default_task_assigment_type";
|
|
22
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toml-config.d.ts","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iCAAiC,GAAG,OAAO,GAAG,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"toml-config.d.ts","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,iCAAiC,GAAG,OAAO,GAAG,OAAO,CAAA;AACjE,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;AAE9C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACtB,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9B,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IACpE,SAAS,EAAE;QAAE,wBAAwB,EAAE,iCAAiC,CAAA;KAAE,CAAA;IAC1E,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAC/B,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IAC1G,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IACzD,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,OAAO,CAAA;KAAE,CAAA;CAC1G;AAED,eAAO,MAAM,oCAAoC,gCAAgC,CAAA;AAkCjF;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,MAAK,MAAsB,KAAG,QA8E1D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,sCAAsC,GACjD,OAAO,iCAAiC,EACxC,MAAK,MAAsB,KAC1B,QAiBF,CAAA;AAqOD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAK,MAAsB,KAAG,OAShE,CAAA"}
|
|
@@ -10,12 +10,19 @@ const DOCS_SECTION = "docs";
|
|
|
10
10
|
const CYCLES_SECTION = "cycles";
|
|
11
11
|
const PINS_SECTION = "pins";
|
|
12
12
|
const MEMORY_SECTION = "memory";
|
|
13
|
+
const GUARD_SECTION = "guard";
|
|
14
|
+
const VERIFY_SECTION = "verify";
|
|
15
|
+
const REFLECT_SECTION = "reflect";
|
|
16
|
+
const isGuardMode = (v) => v === "advisory" || v === "enforce";
|
|
13
17
|
const DEFAULT_CONFIG = {
|
|
14
18
|
docs: { path: ".tx/docs" },
|
|
15
19
|
memory: { defaultDir: "docs" },
|
|
16
20
|
cycles: { scanPrompt: null, agents: 3, model: "claude-opus-4-6" },
|
|
17
21
|
dashboard: { defaultTaskAssigmentType: "human" },
|
|
18
22
|
pins: { targetFiles: ["CLAUDE.md", "AGENTS.md"] },
|
|
23
|
+
guard: { mode: "advisory", maxPending: null, maxChildren: null, maxDepth: null },
|
|
24
|
+
verify: { timeout: 300, defaultSchema: null },
|
|
25
|
+
reflect: { provider: "auto", model: null, defaultSessions: 10, includeTranscripts: false },
|
|
19
26
|
};
|
|
20
27
|
const isDashboardDefaultTaskAssigmentType = (value) => value === "human" || value === "agent";
|
|
21
28
|
const parseTaskAssigmentTypeOrDefault = (value) => isDashboardDefaultTaskAssigmentType(value)
|
|
@@ -40,6 +47,19 @@ export const readTxConfig = (cwd = process.cwd()) => {
|
|
|
40
47
|
const defaultTaskAssigmentType = extractTomlValue(raw, DASHBOARD_SECTION, DASHBOARD_DEFAULT_TASK_ASSIGMENT_KEY);
|
|
41
48
|
const memoryDefaultDir = extractTomlValue(raw, MEMORY_SECTION, "default_dir");
|
|
42
49
|
const pinsTargetFiles = extractTomlValue(raw, PINS_SECTION, "target_files");
|
|
50
|
+
// Guard section
|
|
51
|
+
const guardMode = extractTomlValue(raw, GUARD_SECTION, "mode");
|
|
52
|
+
const guardMaxPending = extractTomlValue(raw, GUARD_SECTION, "max_pending");
|
|
53
|
+
const guardMaxChildren = extractTomlValue(raw, GUARD_SECTION, "max_children");
|
|
54
|
+
const guardMaxDepth = extractTomlValue(raw, GUARD_SECTION, "max_depth");
|
|
55
|
+
// Verify section
|
|
56
|
+
const verifyTimeout = extractTomlValue(raw, VERIFY_SECTION, "timeout");
|
|
57
|
+
const verifyDefaultSchema = extractTomlValue(raw, VERIFY_SECTION, "default_schema");
|
|
58
|
+
// Reflect section
|
|
59
|
+
const reflectProvider = extractTomlValue(raw, REFLECT_SECTION, "provider");
|
|
60
|
+
const reflectModel = extractTomlValue(raw, REFLECT_SECTION, "model");
|
|
61
|
+
const reflectDefaultSessions = extractTomlValue(raw, REFLECT_SECTION, "default_sessions");
|
|
62
|
+
const reflectIncludeTranscripts = extractTomlValue(raw, REFLECT_SECTION, "include_transcripts");
|
|
43
63
|
return {
|
|
44
64
|
docs: {
|
|
45
65
|
path: docsPath ?? DEFAULT_CONFIG.docs.path,
|
|
@@ -62,6 +82,22 @@ export const readTxConfig = (cwd = process.cwd()) => {
|
|
|
62
82
|
? pinsTargetFiles.split(",").map(f => f.trim()).filter(Boolean)
|
|
63
83
|
: DEFAULT_CONFIG.pins.targetFiles,
|
|
64
84
|
},
|
|
85
|
+
guard: {
|
|
86
|
+
mode: isGuardMode(guardMode) ? guardMode : DEFAULT_CONFIG.guard.mode,
|
|
87
|
+
maxPending: guardMaxPending ? parseInt(guardMaxPending, 10) : DEFAULT_CONFIG.guard.maxPending,
|
|
88
|
+
maxChildren: guardMaxChildren ? parseInt(guardMaxChildren, 10) : DEFAULT_CONFIG.guard.maxChildren,
|
|
89
|
+
maxDepth: guardMaxDepth ? parseInt(guardMaxDepth, 10) : DEFAULT_CONFIG.guard.maxDepth,
|
|
90
|
+
},
|
|
91
|
+
verify: {
|
|
92
|
+
timeout: verifyTimeout ? parseInt(verifyTimeout, 10) : DEFAULT_CONFIG.verify.timeout,
|
|
93
|
+
defaultSchema: verifyDefaultSchema ?? DEFAULT_CONFIG.verify.defaultSchema,
|
|
94
|
+
},
|
|
95
|
+
reflect: {
|
|
96
|
+
provider: reflectProvider ?? DEFAULT_CONFIG.reflect.provider,
|
|
97
|
+
model: reflectModel ?? DEFAULT_CONFIG.reflect.model,
|
|
98
|
+
defaultSessions: reflectDefaultSessions ? parseInt(reflectDefaultSessions, 10) : DEFAULT_CONFIG.reflect.defaultSessions,
|
|
99
|
+
includeTranscripts: reflectIncludeTranscripts === "true" ? true : DEFAULT_CONFIG.reflect.includeTranscripts,
|
|
100
|
+
},
|
|
65
101
|
};
|
|
66
102
|
}
|
|
67
103
|
catch {
|
|
@@ -239,6 +275,57 @@ default_task_assigment_type = "human"
|
|
|
239
275
|
# Both Claude Code (CLAUDE.md) and Codex (AGENTS.md) are synced by default
|
|
240
276
|
# so all agents share the same persistent context.
|
|
241
277
|
target_files = "CLAUDE.md, AGENTS.md"
|
|
278
|
+
|
|
279
|
+
# ─── Guard ─────────────────────────────────────────────────────────
|
|
280
|
+
# Task creation guards — lightweight limits checked at \`tx add\` time.
|
|
281
|
+
# Prevents unbounded task proliferation in agent loops.
|
|
282
|
+
# Commands: tx guard set, tx guard show, tx guard clear
|
|
283
|
+
[guard]
|
|
284
|
+
|
|
285
|
+
# Guard mode: "advisory" (default) or "enforce"
|
|
286
|
+
# Advisory: tasks are created with warning metadata, stderr warning printed
|
|
287
|
+
# Enforce: tx add fails with GuardExceededError when limits are hit
|
|
288
|
+
mode = "advisory"
|
|
289
|
+
|
|
290
|
+
# Default limits (can be overridden per-scope via tx guard set)
|
|
291
|
+
# max_pending = 50
|
|
292
|
+
# max_children = 10
|
|
293
|
+
# max_depth = 4
|
|
294
|
+
|
|
295
|
+
# ─── Verify ────────────────────────────────────────────────────────
|
|
296
|
+
# Machine-checkable done criteria attached to tasks.
|
|
297
|
+
# Attach a shell command to a task; \`tx verify run <id>\` executes it.
|
|
298
|
+
# Exit 0 = pass, non-zero = fail.
|
|
299
|
+
# Commands: tx verify set, tx verify show, tx verify run, tx verify clear
|
|
300
|
+
[verify]
|
|
301
|
+
|
|
302
|
+
# Default timeout in seconds for verification commands.
|
|
303
|
+
timeout = 300
|
|
304
|
+
|
|
305
|
+
# Default JSON schema for structured verification output.
|
|
306
|
+
# Leave commented for exit-code-only mode (default).
|
|
307
|
+
# default_schema = "verify-schema.json"
|
|
308
|
+
|
|
309
|
+
# ─── Reflect ───────────────────────────────────────────────────────
|
|
310
|
+
# Macro-level session retrospective — look at recent sessions,
|
|
311
|
+
# assess what is working, and surface machine-readable signals.
|
|
312
|
+
# Commands: tx reflect
|
|
313
|
+
[reflect]
|
|
314
|
+
|
|
315
|
+
# LLM provider for \`tx reflect --analyze\`
|
|
316
|
+
# "auto" = auto-detect from available env vars (default)
|
|
317
|
+
# "claude" = uses ANTHROPIC_API_KEY
|
|
318
|
+
# "codex" = uses OPENAI_API_KEY
|
|
319
|
+
provider = "auto"
|
|
320
|
+
|
|
321
|
+
# Model for analysis tier
|
|
322
|
+
# model = "claude-opus-4-6"
|
|
323
|
+
|
|
324
|
+
# Default number of sessions to analyze
|
|
325
|
+
default_sessions = 10
|
|
326
|
+
|
|
327
|
+
# Whether to include transcript parsing by default
|
|
328
|
+
include_transcripts = false
|
|
242
329
|
`;
|
|
243
330
|
/**
|
|
244
331
|
* Scaffold .tx/config.toml with annotated defaults.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toml-config.js","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"toml-config.js","sourceRoot":"","sources":["../../src/utils/toml-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
-- Version: 031
|
|
2
|
+
-- Migration: Task creation guards — lightweight limits enforced at create time
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS task_guards (
|
|
5
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
6
|
+
scope TEXT NOT NULL UNIQUE, -- 'global', 'parent:<task_id>'
|
|
7
|
+
max_pending INTEGER, -- max non-done tasks at any time
|
|
8
|
+
max_children INTEGER, -- max direct children per parent
|
|
9
|
+
max_depth INTEGER, -- max hierarchy nesting depth
|
|
10
|
+
enforce INTEGER NOT NULL DEFAULT 0, -- 0=advisory, 1=hard block
|
|
11
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
-- Record this migration
|
|
15
|
+
INSERT OR IGNORE INTO schema_version (version, applied_at) VALUES (31, datetime('now'));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
-- Version: 032
|
|
2
|
+
-- Migration: Verification commands — attach machine-checkable done criteria to tasks
|
|
3
|
+
|
|
4
|
+
ALTER TABLE tasks ADD COLUMN verify_cmd TEXT;
|
|
5
|
+
ALTER TABLE tasks ADD COLUMN verify_schema TEXT;
|
|
6
|
+
|
|
7
|
+
-- Record this migration
|
|
8
|
+
INSERT OR IGNORE INTO schema_version (version, applied_at) VALUES (32, datetime('now'));
|