@pedrocivita/tocket 2.5.0 → 2.6.3
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 +229 -18
- package/dist/commands/agents-md.cmd.d.ts +2 -0
- package/dist/commands/agents-md.cmd.js +166 -0
- package/dist/commands/agents-md.cmd.js.map +1 -0
- package/dist/commands/decide.cmd.d.ts +2 -0
- package/dist/commands/decide.cmd.js +70 -0
- package/dist/commands/decide.cmd.js.map +1 -0
- package/dist/commands/doctor.cmd.d.ts +13 -0
- package/dist/commands/doctor.cmd.js +135 -11
- package/dist/commands/doctor.cmd.js.map +1 -1
- package/dist/commands/eject.cmd.d.ts +1 -1
- package/dist/commands/eject.cmd.js +3 -1
- package/dist/commands/eject.cmd.js.map +1 -1
- package/dist/commands/init.cmd.js +64 -11
- package/dist/commands/init.cmd.js.map +1 -1
- package/dist/commands/scaffold.cmd.d.ts +2 -0
- package/dist/commands/scaffold.cmd.js +118 -0
- package/dist/commands/scaffold.cmd.js.map +1 -0
- package/dist/commands/suite.cmd.d.ts +2 -0
- package/dist/commands/suite.cmd.js +386 -0
- package/dist/commands/suite.cmd.js.map +1 -0
- package/dist/commands/validate.cmd.js +1 -0
- package/dist/commands/validate.cmd.js.map +1 -1
- package/dist/commands/work.cmd.d.ts +2 -0
- package/dist/commands/work.cmd.js +48 -0
- package/dist/commands/work.cmd.js.map +1 -0
- package/dist/eval/decide-eval.d.ts +28 -0
- package/dist/eval/decide-eval.js +34 -0
- package/dist/eval/decide-eval.js.map +1 -0
- package/dist/eval/triage-eval.d.ts +46 -0
- package/dist/eval/triage-eval.js +174 -0
- package/dist/eval/triage-eval.js.map +1 -0
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +7 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +360 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/templates/memory-bank.d.ts +11 -0
- package/dist/templates/memory-bank.js +456 -329
- package/dist/templates/memory-bank.js.map +1 -1
- package/dist/tests/agents.test.js +59 -1
- package/dist/tests/agents.test.js.map +1 -1
- package/dist/tests/decide.test.d.ts +1 -0
- package/dist/tests/decide.test.js +483 -0
- package/dist/tests/decide.test.js.map +1 -0
- package/dist/tests/doctor.test.js +73 -1
- package/dist/tests/doctor.test.js.map +1 -1
- package/dist/tests/eject.test.js +3 -0
- package/dist/tests/eject.test.js.map +1 -1
- package/dist/tests/git.test.js +17 -0
- package/dist/tests/git.test.js.map +1 -1
- package/dist/tests/helpers.d.ts +4 -0
- package/dist/tests/helpers.js +9 -0
- package/dist/tests/helpers.js.map +1 -0
- package/dist/tests/helpers.test.d.ts +1 -0
- package/dist/tests/helpers.test.js +16 -0
- package/dist/tests/helpers.test.js.map +1 -0
- package/dist/tests/init.test.js +53 -2
- package/dist/tests/init.test.js.map +1 -1
- package/dist/tests/loop.test.d.ts +1 -0
- package/dist/tests/loop.test.js +153 -0
- package/dist/tests/loop.test.js.map +1 -0
- package/dist/tests/memory-bank.test.js +53 -1
- package/dist/tests/memory-bank.test.js.map +1 -1
- package/dist/tests/suite.test.d.ts +1 -0
- package/dist/tests/suite.test.js +199 -0
- package/dist/tests/suite.test.js.map +1 -0
- package/dist/tests/triage.test.d.ts +1 -0
- package/dist/tests/triage.test.js +152 -0
- package/dist/tests/triage.test.js.map +1 -0
- package/dist/tests/work.test.d.ts +1 -0
- package/dist/tests/work.test.js +276 -0
- package/dist/tests/work.test.js.map +1 -0
- package/dist/utils/agents.d.ts +23 -0
- package/dist/utils/agents.js +82 -0
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/appmaps.d.ts +65 -0
- package/dist/utils/appmaps.js +280 -0
- package/dist/utils/appmaps.js.map +1 -0
- package/dist/utils/decide.d.ts +178 -0
- package/dist/utils/decide.js +623 -0
- package/dist/utils/decide.js.map +1 -0
- package/dist/utils/git.js +8 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/jev.d.ts +83 -0
- package/dist/utils/jev.js +190 -0
- package/dist/utils/jev.js.map +1 -0
- package/dist/utils/triage.d.ts +87 -0
- package/dist/utils/triage.js +241 -0
- package/dist/utils/triage.js.map +1 -0
- package/dist/utils/work.d.ts +72 -0
- package/dist/utils/work.js +225 -0
- package/dist/utils/work.js.map +1 -0
- package/package.json +53 -50
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { describe, it, after } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mkdtempSync, rmSync, mkdirSync, writeFileSync, readFileSync, existsSync, copyFileSync, utimesSync, } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { execFileSync } from "node:child_process";
|
|
7
|
+
import { DECIDE_SCHEMA } from "../utils/decide.js";
|
|
8
|
+
import { WORK_APPLIED_SCHEMA, WorkError, appliedReceiptPath, findLatestQueueDecision, formatWorkProgressLine, isShadowDecision, loadDecision, runWork, } from "../utils/work.js";
|
|
9
|
+
import { parseDecideRecord } from "../utils/decide.js";
|
|
10
|
+
const cliPath = join(import.meta.dirname, "..", "index.js");
|
|
11
|
+
const fixturesDir = join(import.meta.dirname, "..", "..", "fixtures", "work");
|
|
12
|
+
const handoffFixture = join(fixturesDir, "handoff.json");
|
|
13
|
+
const shadowFixture = join(fixturesDir, "shadow.json");
|
|
14
|
+
const gateAllowFixture = join(fixturesDir, "gate-allow.json");
|
|
15
|
+
const gateBlockFixture = join(fixturesDir, "gate-block.json");
|
|
16
|
+
const gateAskFixture = join(fixturesDir, "gate-ask.json");
|
|
17
|
+
function runCli(args, cwd, env) {
|
|
18
|
+
try {
|
|
19
|
+
const stdout = execFileSync(process.execPath, [cliPath, ...args], {
|
|
20
|
+
cwd,
|
|
21
|
+
encoding: "utf-8",
|
|
22
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
23
|
+
env: { ...process.env, TYPESAFE_API_KEY: "", ...env },
|
|
24
|
+
});
|
|
25
|
+
return { stdout, stderr: "", status: 0 };
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
const failed = err;
|
|
29
|
+
return {
|
|
30
|
+
stdout: failed.stdout ?? "",
|
|
31
|
+
stderr: failed.stderr ?? "",
|
|
32
|
+
status: failed.status ?? 1,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
describe("work helpers", () => {
|
|
37
|
+
it("treats log-only / shadow / dry-run as shadow, not executes=false alone", () => {
|
|
38
|
+
const handoff = parseDecideRecord(readFileSync(handoffFixture, "utf-8"));
|
|
39
|
+
const shadow = parseDecideRecord(readFileSync(shadowFixture, "utf-8"));
|
|
40
|
+
assert.equal(handoff.executes, false);
|
|
41
|
+
assert.equal(isShadowDecision(handoff), false);
|
|
42
|
+
assert.equal(isShadowDecision(shadow), true);
|
|
43
|
+
assert.equal(isShadowDecision({ ...handoff, mode: "dry-run", semantics: "log-only" }), true);
|
|
44
|
+
assert.equal(appliedReceiptPath("/tmp/20260920T150130Z-next.json"), "/tmp/20260920T150130Z-next.applied.json");
|
|
45
|
+
assert.throws(() => appliedReceiptPath("/tmp/x.applied.json"), /receipt file/);
|
|
46
|
+
});
|
|
47
|
+
it("formats the progress line from the choice", () => {
|
|
48
|
+
const record = parseDecideRecord(readFileSync(handoffFixture, "utf-8"));
|
|
49
|
+
assert.equal(formatWorkProgressLine(record), "- worker applied: next=write dest=write confidence=0.91");
|
|
50
|
+
const shadow = parseDecideRecord(readFileSync(shadowFixture, "utf-8"));
|
|
51
|
+
assert.match(formatWorkProgressLine(shadow), /next=write dest=review confidence=0.78 gated/);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe("tocket work help", () => {
|
|
55
|
+
it("frames the reference worker and never-Jev rule", () => {
|
|
56
|
+
const result = runCli(["work", "--help"], process.cwd());
|
|
57
|
+
assert.equal(result.status, 0, result.stderr);
|
|
58
|
+
assert.match(result.stdout, /Never calls Jev/i);
|
|
59
|
+
assert.match(result.stdout, /TypeSafe/);
|
|
60
|
+
assert.match(result.stdout, /--apply/);
|
|
61
|
+
assert.match(result.stdout, /--force/);
|
|
62
|
+
assert.match(result.stdout, /2 refuse/);
|
|
63
|
+
assert.match(result.stdout, /does not re-decide/i);
|
|
64
|
+
assert.match(result.stdout, /tool_gate/);
|
|
65
|
+
assert.match(result.stdout, /escalate\/human/);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe("tocket work", () => {
|
|
69
|
+
const tempDir = mkdtempSync(join(tmpdir(), "tocket-work-"));
|
|
70
|
+
after(() => {
|
|
71
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
72
|
+
});
|
|
73
|
+
it("dry-runs a fixture without writing or calling Jev", () => {
|
|
74
|
+
const cwd = join(tempDir, "dry");
|
|
75
|
+
mkdirSync(cwd, { recursive: true });
|
|
76
|
+
const result = runWork({
|
|
77
|
+
cwd,
|
|
78
|
+
fromPath: handoffFixture,
|
|
79
|
+
apply: false,
|
|
80
|
+
});
|
|
81
|
+
assert.equal(result.applied, false);
|
|
82
|
+
assert.equal(result.plan.record.schema, DECIDE_SCHEMA);
|
|
83
|
+
assert.equal(result.plan.record.choice, "write");
|
|
84
|
+
assert.equal(result.plan.record.destination, "write");
|
|
85
|
+
assert.equal(result.plan.shadow, false);
|
|
86
|
+
assert.match(result.summary, /work plan/);
|
|
87
|
+
assert.match(result.summary, /choice=write/);
|
|
88
|
+
assert.match(result.summary, /dest=write/);
|
|
89
|
+
assert.match(result.summary, /confidence=0.91/);
|
|
90
|
+
assert.match(result.summary, /semantics=handoff/);
|
|
91
|
+
assert.equal(existsSync(appliedReceiptPath(handoffFixture)), false);
|
|
92
|
+
assert.equal(existsSync(join(cwd, ".context", "progress.md")), false);
|
|
93
|
+
const cli = runCli(["work", "--from", handoffFixture], cwd, {
|
|
94
|
+
TYPESAFE_API_KEY: "must-not-be-used",
|
|
95
|
+
});
|
|
96
|
+
assert.equal(cli.status, 0, cli.stderr);
|
|
97
|
+
assert.match(cli.stdout, /work plan/);
|
|
98
|
+
assert.match(cli.stdout, /choice=write/);
|
|
99
|
+
assert.match(cli.stdout, /dest=write/);
|
|
100
|
+
assert.equal(existsSync(appliedReceiptPath(handoffFixture)), false);
|
|
101
|
+
});
|
|
102
|
+
it("applies a non-shadow fixture into a notebook receipt and progress line", () => {
|
|
103
|
+
const cwd = join(tempDir, "apply");
|
|
104
|
+
const destDir = join(cwd, ".context", "decisions", "write");
|
|
105
|
+
mkdirSync(destDir, { recursive: true });
|
|
106
|
+
const decision = join(destDir, "20260920T150130Z-next.json");
|
|
107
|
+
copyFileSync(handoffFixture, decision);
|
|
108
|
+
const result = runWork({
|
|
109
|
+
cwd,
|
|
110
|
+
fromPath: decision,
|
|
111
|
+
apply: true,
|
|
112
|
+
now: () => "2026-09-20T16:00:00.000Z",
|
|
113
|
+
});
|
|
114
|
+
assert.equal(result.applied, true);
|
|
115
|
+
assert.ok(result.receipt);
|
|
116
|
+
assert.equal(result.receipt.schema, WORK_APPLIED_SCHEMA);
|
|
117
|
+
assert.equal(result.receipt.choice, "write");
|
|
118
|
+
assert.equal(result.receipt.destination, "write");
|
|
119
|
+
assert.equal(result.receipt.applied_from_shadow, false);
|
|
120
|
+
assert.equal(result.receipt.applied_at, "2026-09-20T16:00:00.000Z");
|
|
121
|
+
assert.ok(result.receiptPath?.endsWith("20260920T150130Z-next.applied.json"));
|
|
122
|
+
assert.ok(existsSync(result.receiptPath));
|
|
123
|
+
const progress = readFileSync(join(cwd, ".context", "progress.md"), "utf-8");
|
|
124
|
+
assert.match(progress, /worker applied: next=write dest=write confidence=0.91/);
|
|
125
|
+
const cliCwd = join(tempDir, "apply-cli");
|
|
126
|
+
mkdirSync(join(cliCwd, ".context", "decisions", "write"), { recursive: true });
|
|
127
|
+
const cliDecision = join(cliCwd, ".context", "decisions", "write", "20260920T150130Z-next.json");
|
|
128
|
+
copyFileSync(handoffFixture, cliDecision);
|
|
129
|
+
const cliResult = runCli(["work", "--from", cliDecision, "--apply"], cliCwd);
|
|
130
|
+
assert.equal(cliResult.status, 0, cliResult.stderr);
|
|
131
|
+
assert.match(cliResult.stdout, /work applied/);
|
|
132
|
+
assert.ok(existsSync(appliedReceiptPath(cliDecision)));
|
|
133
|
+
assert.match(readFileSync(join(cliCwd, ".context", "progress.md"), "utf-8"), /worker applied: next=write/);
|
|
134
|
+
});
|
|
135
|
+
it("dry-runs shadow and refuses apply without --force (exit 2)", () => {
|
|
136
|
+
const cwd = join(tempDir, "shadow");
|
|
137
|
+
mkdirSync(cwd, { recursive: true });
|
|
138
|
+
const plan = runWork({ cwd, fromPath: shadowFixture });
|
|
139
|
+
assert.equal(plan.applied, false);
|
|
140
|
+
assert.equal(plan.plan.shadow, true);
|
|
141
|
+
assert.equal(plan.plan.wouldRefuse, true);
|
|
142
|
+
assert.match(plan.summary, /apply=refuse/);
|
|
143
|
+
const refused = runCli(["work", "--from", shadowFixture, "--apply"], cwd);
|
|
144
|
+
assert.equal(refused.status, 2);
|
|
145
|
+
assert.match(refused.stderr, /shadow\/log-only/);
|
|
146
|
+
assert.equal(existsSync(appliedReceiptPath(shadowFixture)), false);
|
|
147
|
+
assert.equal(existsSync(join(cwd, ".context", "progress.md")), false);
|
|
148
|
+
assert.throws(() => runWork({ cwd, fromPath: shadowFixture, apply: true }), (err) => err instanceof WorkError && err.exitCode === 2);
|
|
149
|
+
});
|
|
150
|
+
it("applies shadow only with --force and stamps applied_from_shadow", () => {
|
|
151
|
+
const cwd = join(tempDir, "shadow-force");
|
|
152
|
+
const destDir = join(cwd, ".context", "decisions", "review");
|
|
153
|
+
mkdirSync(destDir, { recursive: true });
|
|
154
|
+
const decision = join(destDir, "20260920T150000Z-next.json");
|
|
155
|
+
copyFileSync(shadowFixture, decision);
|
|
156
|
+
const result = runWork({
|
|
157
|
+
cwd,
|
|
158
|
+
fromPath: decision,
|
|
159
|
+
apply: true,
|
|
160
|
+
force: true,
|
|
161
|
+
now: () => "2026-09-20T16:05:00.000Z",
|
|
162
|
+
});
|
|
163
|
+
assert.equal(result.applied, true);
|
|
164
|
+
assert.equal(result.receipt.applied_from_shadow, true);
|
|
165
|
+
assert.equal(result.receipt.forced, true);
|
|
166
|
+
assert.match(result.summary, /applied_from_shadow/);
|
|
167
|
+
const receipt = JSON.parse(readFileSync(result.receiptPath, "utf-8"));
|
|
168
|
+
assert.equal(receipt.applied_from_shadow, true);
|
|
169
|
+
});
|
|
170
|
+
it("defaults to the newest queue decision and skips receipts", () => {
|
|
171
|
+
const cwd = join(tempDir, "latest");
|
|
172
|
+
const writeDir = join(cwd, ".context", "decisions", "write");
|
|
173
|
+
const reviewDir = join(cwd, ".context", "decisions", "review");
|
|
174
|
+
mkdirSync(writeDir, { recursive: true });
|
|
175
|
+
mkdirSync(reviewDir, { recursive: true });
|
|
176
|
+
const older = join(reviewDir, "20260920T140000Z-next.json");
|
|
177
|
+
const newer = join(writeDir, "20260920T150130Z-next.json");
|
|
178
|
+
const receipt = join(writeDir, "20260920T160000Z-next.applied.json");
|
|
179
|
+
copyFileSync(shadowFixture, older);
|
|
180
|
+
copyFileSync(handoffFixture, newer);
|
|
181
|
+
writeFileSync(receipt, "{\"schema\":\"tocket.work.applied/v0\"}\n", "utf-8");
|
|
182
|
+
const past = new Date("2026-09-20T14:00:00Z");
|
|
183
|
+
const later = new Date("2026-09-20T15:01:30Z");
|
|
184
|
+
const newestReceipt = new Date("2026-09-20T16:00:00Z");
|
|
185
|
+
utimesSync(older, past, past);
|
|
186
|
+
utimesSync(newer, later, later);
|
|
187
|
+
utimesSync(receipt, newestReceipt, newestReceipt);
|
|
188
|
+
assert.equal(findLatestQueueDecision(cwd), newer);
|
|
189
|
+
const loaded = loadDecision(cwd);
|
|
190
|
+
assert.equal(loaded.path, newer);
|
|
191
|
+
assert.equal(loaded.record.choice, "write");
|
|
192
|
+
assert.equal(loaded.record.semantics, "handoff");
|
|
193
|
+
const cli = runCli(["work"], cwd);
|
|
194
|
+
assert.equal(cli.status, 0, cli.stderr);
|
|
195
|
+
assert.match(cli.stdout, /from=.*write\/20260920T150130Z-next\.json/);
|
|
196
|
+
});
|
|
197
|
+
it("applies allow and no-gate; refuses block/ask unless --force", () => {
|
|
198
|
+
const cwd = join(tempDir, "gate");
|
|
199
|
+
mkdirSync(cwd, { recursive: true });
|
|
200
|
+
const allowPlan = runWork({ cwd, fromPath: gateAllowFixture });
|
|
201
|
+
assert.equal(allowPlan.applied, false);
|
|
202
|
+
assert.equal(allowPlan.plan.toolGate, "allow");
|
|
203
|
+
assert.equal(allowPlan.plan.wouldRefuse, false);
|
|
204
|
+
assert.match(allowPlan.summary, /tool_gate=allow/);
|
|
205
|
+
assert.match(allowPlan.summary, /apply=ok/);
|
|
206
|
+
const allowDir = join(cwd, "allow", ".context", "decisions", "review");
|
|
207
|
+
mkdirSync(allowDir, { recursive: true });
|
|
208
|
+
const allowDecision = join(allowDir, "20260921T001000Z-tool_gate.json");
|
|
209
|
+
copyFileSync(gateAllowFixture, allowDecision);
|
|
210
|
+
const allowed = runWork({
|
|
211
|
+
cwd: join(cwd, "allow"),
|
|
212
|
+
fromPath: allowDecision,
|
|
213
|
+
apply: true,
|
|
214
|
+
now: () => "2026-09-21T00:30:00.000Z",
|
|
215
|
+
});
|
|
216
|
+
assert.equal(allowed.applied, true);
|
|
217
|
+
assert.equal(allowed.receipt.tool_gate, "allow");
|
|
218
|
+
assert.equal(existsSync(appliedReceiptPath(allowDecision)), true);
|
|
219
|
+
const blocked = runCli(["work", "--from", gateBlockFixture, "--apply"], cwd);
|
|
220
|
+
assert.equal(blocked.status, 2);
|
|
221
|
+
assert.match(blocked.stderr, /tool_gate=block/);
|
|
222
|
+
assert.equal(existsSync(appliedReceiptPath(gateBlockFixture)), false);
|
|
223
|
+
const asked = runCli(["work", "--from", gateAskFixture, "--apply"], cwd);
|
|
224
|
+
assert.equal(asked.status, 2);
|
|
225
|
+
assert.match(asked.stderr, /tool_gate=ask/);
|
|
226
|
+
assert.match(asked.stderr, /Escalate to a human/);
|
|
227
|
+
assert.equal(existsSync(appliedReceiptPath(gateAskFixture)), false);
|
|
228
|
+
const askDir = join(cwd, "ask-force", ".context", "decisions", "review");
|
|
229
|
+
mkdirSync(askDir, { recursive: true });
|
|
230
|
+
const askDecision = join(askDir, "20260921T001200Z-tool_gate.json");
|
|
231
|
+
copyFileSync(gateAskFixture, askDecision);
|
|
232
|
+
const forced = runWork({
|
|
233
|
+
cwd: join(cwd, "ask-force"),
|
|
234
|
+
fromPath: askDecision,
|
|
235
|
+
apply: true,
|
|
236
|
+
force: true,
|
|
237
|
+
now: () => "2026-09-21T00:31:00.000Z",
|
|
238
|
+
});
|
|
239
|
+
assert.equal(forced.applied, true);
|
|
240
|
+
assert.equal(forced.receipt.tool_gate, "ask");
|
|
241
|
+
assert.equal(forced.receipt.forced, true);
|
|
242
|
+
assert.throws(() => runWork({ cwd, fromPath: gateBlockFixture, apply: true }), (err) => err instanceof WorkError && err.exitCode === 2);
|
|
243
|
+
});
|
|
244
|
+
it("still requires --force to apply a shadow allow", () => {
|
|
245
|
+
const cwd = join(tempDir, "shadow-allow");
|
|
246
|
+
mkdirSync(cwd, { recursive: true });
|
|
247
|
+
const destDir = join(cwd, ".context", "decisions", "review");
|
|
248
|
+
mkdirSync(destDir, { recursive: true });
|
|
249
|
+
const decision = join(destDir, "20260921T001000Z-tool_gate.json");
|
|
250
|
+
const shadowAllow = JSON.parse(readFileSync(gateAllowFixture, "utf-8"));
|
|
251
|
+
shadowAllow.mode = "shadow";
|
|
252
|
+
shadowAllow.semantics = "log-only";
|
|
253
|
+
shadowAllow.status = "logged";
|
|
254
|
+
writeFileSync(decision, `${JSON.stringify(shadowAllow, null, 2)}\n`, "utf-8");
|
|
255
|
+
const refused = runCli(["work", "--from", decision, "--apply"], cwd);
|
|
256
|
+
assert.equal(refused.status, 2);
|
|
257
|
+
assert.match(refused.stderr, /shadow\/log-only/);
|
|
258
|
+
assert.equal(existsSync(appliedReceiptPath(decision)), false);
|
|
259
|
+
});
|
|
260
|
+
it("exits 1 for a missing or invalid decision", () => {
|
|
261
|
+
const cwd = join(tempDir, "errors");
|
|
262
|
+
mkdirSync(cwd, { recursive: true });
|
|
263
|
+
const missing = runCli(["work"], cwd);
|
|
264
|
+
assert.equal(missing.status, 1);
|
|
265
|
+
assert.match(missing.stderr, /No decision found|--from/);
|
|
266
|
+
const gone = runCli(["work", "--from", join(cwd, "missing.json")], cwd);
|
|
267
|
+
assert.equal(gone.status, 1);
|
|
268
|
+
assert.match(gone.stderr, /not found/);
|
|
269
|
+
const bad = join(cwd, "bad.json");
|
|
270
|
+
writeFileSync(bad, "{\"no\":\"schema\"}\n", "utf-8");
|
|
271
|
+
const invalid = runCli(["work", "--from", bad], cwd);
|
|
272
|
+
assert.equal(invalid.status, 1);
|
|
273
|
+
assert.match(invalid.stderr, /Invalid decision record/);
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
//# sourceMappingURL=work.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work.test.js","sourceRoot":"","sources":["../../src/tests/work.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/agents.d.ts
CHANGED
|
@@ -1,8 +1,31 @@
|
|
|
1
1
|
export declare const DEFAULT_EXECUTOR = "Claude Code";
|
|
2
2
|
export declare const DEFAULT_ARCHITECT = "Gemini";
|
|
3
|
+
export declare const EXECUTOR_CHOICES: readonly ["Claude Code", "Cursor", "Windsurf", "Copilot"];
|
|
4
|
+
export declare const ARCHITECT_CHOICES: readonly ["Gemini"];
|
|
3
5
|
export declare const EXECUTOR_FILE_MAP: Record<string, string>;
|
|
4
6
|
export declare const ARCHITECT_FILE_MAP: Record<string, string>;
|
|
5
7
|
export declare function getExecutorFileName(agentName?: string): string;
|
|
6
8
|
export declare function getArchitectFileName(agentName?: string): string;
|
|
7
9
|
export declare function getExecutorDisplayName(agentName?: string): string;
|
|
8
10
|
export declare function getArchitectDisplayName(agentName?: string): string;
|
|
11
|
+
export type AgentDetectSource = "flag" | "config" | "file" | "env" | "default";
|
|
12
|
+
export interface DetectedAgents {
|
|
13
|
+
executor?: string;
|
|
14
|
+
architect?: string;
|
|
15
|
+
executorSource: "file" | "env" | "none";
|
|
16
|
+
architectSource: "file" | "env" | "none";
|
|
17
|
+
}
|
|
18
|
+
/** Detect preferred agents from existing instruction files or env (Cursor / Claude). */
|
|
19
|
+
export declare function detectPreferredAgents(cwd: string, env?: NodeJS.ProcessEnv): DetectedAgents;
|
|
20
|
+
export declare function resolveInitAgents(input: {
|
|
21
|
+
executorFlag?: string;
|
|
22
|
+
architectFlag?: string;
|
|
23
|
+
configExecutor?: string;
|
|
24
|
+
configArchitect?: string;
|
|
25
|
+
detected: DetectedAgents;
|
|
26
|
+
}): {
|
|
27
|
+
executor: string;
|
|
28
|
+
architect: string;
|
|
29
|
+
executorSource: AgentDetectSource;
|
|
30
|
+
architectSource: AgentDetectSource;
|
|
31
|
+
};
|
package/dist/utils/agents.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
1
3
|
export const DEFAULT_EXECUTOR = "Claude Code";
|
|
2
4
|
export const DEFAULT_ARCHITECT = "Gemini";
|
|
5
|
+
export const EXECUTOR_CHOICES = ["Claude Code", "Cursor", "Windsurf", "Copilot"];
|
|
6
|
+
export const ARCHITECT_CHOICES = ["Gemini"];
|
|
3
7
|
export const EXECUTOR_FILE_MAP = {
|
|
4
8
|
"claude code": "CLAUDE.md",
|
|
5
9
|
"claude": "CLAUDE.md",
|
|
@@ -26,4 +30,82 @@ export function getExecutorDisplayName(agentName) {
|
|
|
26
30
|
export function getArchitectDisplayName(agentName) {
|
|
27
31
|
return agentName || DEFAULT_ARCHITECT;
|
|
28
32
|
}
|
|
33
|
+
const EXECUTOR_FILE_HINTS = [
|
|
34
|
+
{ file: ".cursorrules", agent: "Cursor" },
|
|
35
|
+
{ file: ".github/copilot-instructions.md", agent: "Copilot" },
|
|
36
|
+
{ file: ".windsurfrules", agent: "Windsurf" },
|
|
37
|
+
{ file: "CLAUDE.md", agent: "Claude Code" },
|
|
38
|
+
];
|
|
39
|
+
/** Detect preferred agents from existing instruction files or env (Cursor / Claude). */
|
|
40
|
+
export function detectPreferredAgents(cwd, env = process.env) {
|
|
41
|
+
let executor;
|
|
42
|
+
let architect;
|
|
43
|
+
let executorSource = "none";
|
|
44
|
+
let architectSource = "none";
|
|
45
|
+
for (const hint of EXECUTOR_FILE_HINTS) {
|
|
46
|
+
if (existsSync(join(cwd, hint.file))) {
|
|
47
|
+
executor = hint.agent;
|
|
48
|
+
executorSource = "file";
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (existsSync(join(cwd, "GEMINI.md"))) {
|
|
53
|
+
architect = "Gemini";
|
|
54
|
+
architectSource = "file";
|
|
55
|
+
}
|
|
56
|
+
if (!executor) {
|
|
57
|
+
if (env.CURSOR_TRACE_ID || env.CURSOR_AGENT || env.CURSOR) {
|
|
58
|
+
executor = "Cursor";
|
|
59
|
+
executorSource = "env";
|
|
60
|
+
}
|
|
61
|
+
else if (env.CLAUDECODE || env.CLAUDE_CODE) {
|
|
62
|
+
executor = "Claude Code";
|
|
63
|
+
executorSource = "env";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { executor, architect, executorSource, architectSource };
|
|
67
|
+
}
|
|
68
|
+
export function resolveInitAgents(input) {
|
|
69
|
+
const executorFlag = input.executorFlag?.trim();
|
|
70
|
+
const architectFlag = input.architectFlag?.trim();
|
|
71
|
+
const configExecutor = input.configExecutor?.trim();
|
|
72
|
+
const configArchitect = input.configArchitect?.trim();
|
|
73
|
+
let executor;
|
|
74
|
+
let executorSource;
|
|
75
|
+
if (executorFlag) {
|
|
76
|
+
executor = executorFlag;
|
|
77
|
+
executorSource = "flag";
|
|
78
|
+
}
|
|
79
|
+
else if (configExecutor) {
|
|
80
|
+
executor = configExecutor;
|
|
81
|
+
executorSource = "config";
|
|
82
|
+
}
|
|
83
|
+
else if (input.detected.executor) {
|
|
84
|
+
executor = input.detected.executor;
|
|
85
|
+
executorSource = input.detected.executorSource === "env" ? "env" : "file";
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
executor = DEFAULT_EXECUTOR;
|
|
89
|
+
executorSource = "default";
|
|
90
|
+
}
|
|
91
|
+
let architect;
|
|
92
|
+
let architectSource;
|
|
93
|
+
if (architectFlag) {
|
|
94
|
+
architect = architectFlag;
|
|
95
|
+
architectSource = "flag";
|
|
96
|
+
}
|
|
97
|
+
else if (configArchitect) {
|
|
98
|
+
architect = configArchitect;
|
|
99
|
+
architectSource = "config";
|
|
100
|
+
}
|
|
101
|
+
else if (input.detected.architect) {
|
|
102
|
+
architect = input.detected.architect;
|
|
103
|
+
architectSource = input.detected.architectSource === "env" ? "env" : "file";
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
architect = DEFAULT_ARCHITECT;
|
|
107
|
+
architectSource = "default";
|
|
108
|
+
}
|
|
109
|
+
return { executor, architect, executorSource, architectSource };
|
|
110
|
+
}
|
|
29
111
|
//# sourceMappingURL=agents.js.map
|
package/dist/utils/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/utils/agents.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/utils/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** AppMap Memory Bank convention — file-first index and last-run history. */
|
|
2
|
+
export declare const LAST_RUN_SCHEMA = "tocket.appmaps.last-run/v0";
|
|
3
|
+
export declare const APPMAPS_DIR = ".context/appmaps";
|
|
4
|
+
export declare const LAST_RUN_JSON = "last-run.json";
|
|
5
|
+
export declare const LAST_RUN_MD = "last-run.md";
|
|
6
|
+
export declare const APPMAPS_README = "README.md";
|
|
7
|
+
export declare const APPMAPS_GOALS = "goals.md";
|
|
8
|
+
export declare const APPMAP_SUFFIX = ".appmap.json";
|
|
9
|
+
export interface LastRunResult {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
ok: boolean;
|
|
13
|
+
ms: number;
|
|
14
|
+
jev_choice?: string | null;
|
|
15
|
+
jev_confidence?: number | null;
|
|
16
|
+
/** Real last-run snapshots use objects; older fixtures may use a string. */
|
|
17
|
+
evidence?: unknown;
|
|
18
|
+
error?: string | null;
|
|
19
|
+
}
|
|
20
|
+
export interface LastRun {
|
|
21
|
+
schema: typeof LAST_RUN_SCHEMA;
|
|
22
|
+
app: string;
|
|
23
|
+
map: string;
|
|
24
|
+
runner: string;
|
|
25
|
+
model: string;
|
|
26
|
+
mode: string;
|
|
27
|
+
finished_at: string;
|
|
28
|
+
all_ok: boolean;
|
|
29
|
+
passed: number;
|
|
30
|
+
total: number;
|
|
31
|
+
results: LastRunResult[];
|
|
32
|
+
}
|
|
33
|
+
export declare class LastRunValidationError extends Error {
|
|
34
|
+
constructor(message: string);
|
|
35
|
+
}
|
|
36
|
+
/** Validate and normalize a parsed last-run document. */
|
|
37
|
+
export declare function validateLastRun(value: unknown): LastRun;
|
|
38
|
+
/** Parse a last-run.json string and validate it against v0. */
|
|
39
|
+
export declare function parseLastRun(raw: string): LastRun;
|
|
40
|
+
/** Empty but schema-valid last-run document used by `tocket suite init`. */
|
|
41
|
+
export declare function emptyLastRun(): LastRun;
|
|
42
|
+
/** Human table for `.context/appmaps/last-run.md`. */
|
|
43
|
+
export declare function writeLastRunMd(run: LastRun): string;
|
|
44
|
+
/** Slug used for bank filenames (\`<app>.appmap.json\`, triage). */
|
|
45
|
+
export declare function appSlug(app: string): string;
|
|
46
|
+
/** Bank filename for a copied mapper AppMap. */
|
|
47
|
+
export declare function appmapBankFile(app: string): string;
|
|
48
|
+
/** Repo-relative path for the bank map copy. */
|
|
49
|
+
export declare function appmapBankRel(app: string): string;
|
|
50
|
+
export declare class AppmapDiscoveryError extends Error {
|
|
51
|
+
constructor(message: string);
|
|
52
|
+
}
|
|
53
|
+
/** Parse mapper (or hand) AppMap JSON. Object only; no full schema vendoring. */
|
|
54
|
+
export declare function parseAppmapJson(raw: string): unknown;
|
|
55
|
+
/**
|
|
56
|
+
* Find `*.appmap.json` in a mapper `--out` directory.
|
|
57
|
+
* Prefers `<app>.appmap.json` when several files exist.
|
|
58
|
+
*/
|
|
59
|
+
export declare function discoverAppmapJson(dir: string, app?: string): string;
|
|
60
|
+
/** Point last-run.map at the bank copy; fill empty app from --app. */
|
|
61
|
+
export declare function normalizeLastRunRaw(raw: unknown, mapRel: string, app?: string): unknown;
|
|
62
|
+
/** Minimal README stub written when `.context/appmaps/` is created. */
|
|
63
|
+
export declare function appmapsReadmeStub(): string;
|
|
64
|
+
export declare function appmapsGoalsStub(): string;
|
|
65
|
+
export declare function prettyLastRunJson(value: unknown): string;
|