@gempack/squad-mcp 0.10.1 → 0.11.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-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +2 -2
- package/CHANGELOG.md +60 -0
- package/README.md +34 -8
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/learning/format.js +0 -0
- package/dist/learning/format.js.map +1 -1
- package/dist/learning/normalize.d.ts +28 -0
- package/dist/learning/normalize.js +54 -0
- package/dist/learning/normalize.js.map +1 -0
- package/dist/learning/store.d.ts +33 -3
- package/dist/learning/store.js +39 -3
- package/dist/learning/store.js.map +1 -1
- package/dist/tools/prune-learnings.d.ts +84 -0
- package/dist/tools/prune-learnings.js +256 -0
- package/dist/tools/prune-learnings.js.map +1 -0
- package/dist/tools/read-learnings.d.ts +37 -1
- package/dist/tools/read-learnings.js +102 -10
- package/dist/tools/read-learnings.js.map +1 -1
- package/dist/tools/record-learning.d.ts +0 -0
- package/dist/tools/record-learning.js +0 -0
- package/dist/tools/record-learning.js.map +1 -1
- package/dist/tools/registry.js +2 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/util/atomic-rewrite-jsonl.d.ts +36 -0
- package/dist/util/atomic-rewrite-jsonl.js +95 -0
- package/dist/util/atomic-rewrite-jsonl.js.map +1 -0
- package/package.json +1 -1
- package/skills/squad/SKILL.md +66 -74
- package/skills/stats/SKILL.md +1 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { readLearnings, DEFAULT_LEARNING_PATH } from "../learning/store.js";
|
|
4
|
+
import { normalizeFindingTitle } from "../learning/normalize.js";
|
|
5
|
+
import { atomicRewriteJsonl } from "../util/atomic-rewrite-jsonl.js";
|
|
6
|
+
import { readSquadYaml } from "../config/squad-yaml.js";
|
|
7
|
+
import { resolveSafePath, createSafePathContext } from "../util/path-safety.js";
|
|
8
|
+
import { SquadError } from "../errors.js";
|
|
9
|
+
import { ensureRelativeInsideRoot } from "../util/path-safety.js";
|
|
10
|
+
import { logger } from "../observability/logger.js";
|
|
11
|
+
/**
|
|
12
|
+
* Lifecycle maintenance for `.squad/learnings.jsonl` (v0.11.0+).
|
|
13
|
+
*
|
|
14
|
+
* Two passes, both running inside the same atomic-rewrite (lock + rename-
|
|
15
|
+
* rename) under `withFileLock`:
|
|
16
|
+
*
|
|
17
|
+
* 1. **Age cutoff** — when `max_age_days > 0`, entries whose `ts` is older
|
|
18
|
+
* than `now - max_age_days` are marked `archived: true`. Archived
|
|
19
|
+
* entries stay on disk for forensics; they are suppressed from the
|
|
20
|
+
* default `read_learnings` read path (use `include_archived: true` to
|
|
21
|
+
* surface them).
|
|
22
|
+
*
|
|
23
|
+
* 2. **Promotion** — entries are grouped by `normalizeFindingTitle(finding)`.
|
|
24
|
+
* For each group, the number of `decision: "accept"` entries that are
|
|
25
|
+
* NOT already archived is counted. When the count is ≥ `min_recurrence`,
|
|
26
|
+
* the most-recent accepted entry in the group is marked `promoted: true`
|
|
27
|
+
* (the rest stay un-promoted to avoid noisy duplicates in the rendered
|
|
28
|
+
* block). Promoted entries surface FIRST in `read_learnings` output
|
|
29
|
+
* regardless of scope match — they represent crystallised team policy.
|
|
30
|
+
*
|
|
31
|
+
* **Never auto-runs.** The default `max_age_days` is `0` (= disabled) so
|
|
32
|
+
* invoking the tool with no input is a safe no-op. Users who want regular
|
|
33
|
+
* housekeeping run it themselves (or wire a cron / git pre-commit hook).
|
|
34
|
+
*
|
|
35
|
+
* **Auditability**: pruning produces a diff on the on-disk journal. Repos
|
|
36
|
+
* that commit `.squad/learnings.jsonl` should expect a non-trivial diff
|
|
37
|
+
* after a non-no-op run. The `.prev` snapshot from the atomic rewrite is
|
|
38
|
+
* the rollback point.
|
|
39
|
+
*
|
|
40
|
+
* **Race safety**: the entire read-modify-write happens under the file
|
|
41
|
+
* lock used by `appendLearning`. Concurrent appenders block until the
|
|
42
|
+
* prune finishes; concurrent readers (no lock by design) see either the
|
|
43
|
+
* pre-prune or post-prune file in full because rename-into-place is
|
|
44
|
+
* atomic on POSIX same-filesystem renames.
|
|
45
|
+
*/
|
|
46
|
+
const schema = z.object({
|
|
47
|
+
workspace_root: z.string().min(1).max(4096),
|
|
48
|
+
/**
|
|
49
|
+
* Age cutoff in days. Entries older than `now - max_age_days` are marked
|
|
50
|
+
* archived. Default `0` (= disabled — explicit user opt-in required).
|
|
51
|
+
* The plan v2 default departs from the plan v1 default of 180 to avoid
|
|
52
|
+
* surprising diff churn on repos that commit the journal.
|
|
53
|
+
*/
|
|
54
|
+
max_age_days: z.number().int().nonnegative().max(36500).optional().default(0),
|
|
55
|
+
/**
|
|
56
|
+
* Promotion threshold. A finding-title group with ≥ this many accept
|
|
57
|
+
* decisions (across all agents, after archival) earns a `promoted: true`
|
|
58
|
+
* flag on its most-recent entry. Default 3 (1× = anecdote; 2× = pattern;
|
|
59
|
+
* 3× = team policy). Set 0 to disable promotion entirely. `1` is rejected
|
|
60
|
+
* because it would mark every singleton accept as promoted — defeating the
|
|
61
|
+
* "this is team policy" signal (developer cycle-2 Major M5).
|
|
62
|
+
*/
|
|
63
|
+
min_recurrence: z
|
|
64
|
+
.number()
|
|
65
|
+
.int()
|
|
66
|
+
.nonnegative()
|
|
67
|
+
.max(1000)
|
|
68
|
+
.optional()
|
|
69
|
+
.default(3)
|
|
70
|
+
.refine((n) => n !== 1, "min_recurrence must be 0 (disable promotion) or >= 2 (a singleton accept is not recurrence)"),
|
|
71
|
+
/**
|
|
72
|
+
* When true, compute counts without writing. Useful for "what would this
|
|
73
|
+
* do?" inspection before running the destructive pass.
|
|
74
|
+
*/
|
|
75
|
+
dry_run: z.boolean().optional().default(false),
|
|
76
|
+
});
|
|
77
|
+
function resolveLearningPath(safeRoot, configuredPath) {
|
|
78
|
+
if (configuredPath !== undefined) {
|
|
79
|
+
ensureRelativeInsideRoot(safeRoot, configuredPath, "learnings.path");
|
|
80
|
+
return path.resolve(safeRoot, configuredPath);
|
|
81
|
+
}
|
|
82
|
+
return path.resolve(safeRoot, DEFAULT_LEARNING_PATH);
|
|
83
|
+
}
|
|
84
|
+
export async function pruneLearningsTool(input) {
|
|
85
|
+
// v0.11.0 cycle-2 (developer Major M5): defense-in-depth guard against
|
|
86
|
+
// `min_recurrence: 1`. The schema's `.refine` only fires when the call
|
|
87
|
+
// goes through the dispatch registry; direct programmatic callers (and
|
|
88
|
+
// the test suite) bypass it. A runtime check inside the handler closes
|
|
89
|
+
// that gap so the contract holds regardless of entry point.
|
|
90
|
+
if (input.min_recurrence === 1) {
|
|
91
|
+
throw new SquadError("INVALID_INPUT", "min_recurrence must be 0 (disable promotion) or >= 2 (a singleton accept is not recurrence — `1` would promote every one-off finding)", { received: 1 });
|
|
92
|
+
}
|
|
93
|
+
const ctx = createSafePathContext();
|
|
94
|
+
const safeRoot = await resolveSafePath(input.workspace_root, ".", ctx);
|
|
95
|
+
const config = await readSquadYaml(safeRoot);
|
|
96
|
+
// If learnings is disabled at config level, treat as no-op rather than
|
|
97
|
+
// implicitly enabling it via the prune tool.
|
|
98
|
+
if (!config.learnings.enabled) {
|
|
99
|
+
const filePath = resolveLearningPath(safeRoot, config.learnings.path);
|
|
100
|
+
return {
|
|
101
|
+
ok: true,
|
|
102
|
+
file: filePath,
|
|
103
|
+
total: 0,
|
|
104
|
+
archived_count: 0,
|
|
105
|
+
promoted_count: 0,
|
|
106
|
+
unchanged_count: 0,
|
|
107
|
+
dry_run: input.dry_run,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const configuredPath = config.learnings.path;
|
|
111
|
+
const filePath = resolveLearningPath(safeRoot, configuredPath);
|
|
112
|
+
const entries = await readLearnings(safeRoot, {
|
|
113
|
+
...(configuredPath !== undefined ? { configuredPath } : {}),
|
|
114
|
+
});
|
|
115
|
+
if (entries.length === 0) {
|
|
116
|
+
return {
|
|
117
|
+
ok: true,
|
|
118
|
+
file: filePath,
|
|
119
|
+
total: 0,
|
|
120
|
+
archived_count: 0,
|
|
121
|
+
promoted_count: 0,
|
|
122
|
+
unchanged_count: 0,
|
|
123
|
+
dry_run: input.dry_run,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// Pass 1: age cutoff
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
// v0.11.0 cycle-2 (developer Major M4): track changed indices in a Set
|
|
130
|
+
// instead of computing `unchangedCount = total - (archived + promoted)`
|
|
131
|
+
// arithmetically. The arithmetic was structurally fragile — it relied on
|
|
132
|
+
// three invariants holding simultaneously (Pass 2 skips archived; Pass 2
|
|
133
|
+
// skips already-promoted; Pass 1 doesn't read promoted). A future drift
|
|
134
|
+
// in any of those would silently break the count. The Set approach is
|
|
135
|
+
// robust under refactoring: an index in the Set means "this row mutated
|
|
136
|
+
// this pass", regardless of how many fields changed.
|
|
137
|
+
const changedIndices = new Set();
|
|
138
|
+
const ONE_DAY_MS = 24 * 60 * 60 * 1000;
|
|
139
|
+
const nowMs = Date.now();
|
|
140
|
+
const cutoffMs = input.max_age_days > 0 ? nowMs - input.max_age_days * ONE_DAY_MS : -Infinity;
|
|
141
|
+
let archivedCount = 0;
|
|
142
|
+
const stage1 = entries.map((e, idx) => {
|
|
143
|
+
if (e.archived === true)
|
|
144
|
+
return e;
|
|
145
|
+
const tsMs = Date.parse(e.ts);
|
|
146
|
+
if (!Number.isFinite(tsMs))
|
|
147
|
+
return e;
|
|
148
|
+
if (tsMs < cutoffMs) {
|
|
149
|
+
archivedCount++;
|
|
150
|
+
changedIndices.add(idx);
|
|
151
|
+
return { ...e, archived: true };
|
|
152
|
+
}
|
|
153
|
+
return e;
|
|
154
|
+
});
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
// Pass 2: promotion by normalised-title recurrence
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
let promotedCount = 0;
|
|
159
|
+
let stage2 = stage1;
|
|
160
|
+
if (input.min_recurrence > 0) {
|
|
161
|
+
// Group indices by normalised title. We carry indices (not entries) so
|
|
162
|
+
// we can mutate the most-recent member of each qualifying group.
|
|
163
|
+
const groups = new Map();
|
|
164
|
+
stage1.forEach((e, idx) => {
|
|
165
|
+
if (e.archived === true)
|
|
166
|
+
return;
|
|
167
|
+
if (e.decision !== "accept")
|
|
168
|
+
return;
|
|
169
|
+
const key = normalizeFindingTitle(e.finding);
|
|
170
|
+
if (key.length === 0)
|
|
171
|
+
return;
|
|
172
|
+
const acc = groups.get(key) ?? [];
|
|
173
|
+
acc.push(idx);
|
|
174
|
+
groups.set(key, acc);
|
|
175
|
+
});
|
|
176
|
+
const promotedFlags = new Set();
|
|
177
|
+
for (const [, indices] of groups) {
|
|
178
|
+
if (indices.length < input.min_recurrence)
|
|
179
|
+
continue;
|
|
180
|
+
// Most-recent member by ts (fall back to last in append-order if ts
|
|
181
|
+
// doesn't parse). We compare ms; on equality the later index wins.
|
|
182
|
+
let bestIdx = indices[0];
|
|
183
|
+
let bestMs = Date.parse(stage1[bestIdx].ts);
|
|
184
|
+
for (let i = 1; i < indices.length; i++) {
|
|
185
|
+
const idx = indices[i];
|
|
186
|
+
const ms = Date.parse(stage1[idx].ts);
|
|
187
|
+
if (!Number.isFinite(ms))
|
|
188
|
+
continue;
|
|
189
|
+
if (!Number.isFinite(bestMs) || ms >= bestMs) {
|
|
190
|
+
bestIdx = idx;
|
|
191
|
+
bestMs = ms;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Only count a promotion if the chosen entry wasn't already promoted.
|
|
195
|
+
// Idempotent: re-running prune doesn't keep incrementing promoted_count
|
|
196
|
+
// for the same entries.
|
|
197
|
+
if (stage1[bestIdx].promoted !== true) {
|
|
198
|
+
promotedFlags.add(bestIdx);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (promotedFlags.size > 0) {
|
|
202
|
+
stage2 = stage1.map((e, idx) => (promotedFlags.has(idx) ? { ...e, promoted: true } : e));
|
|
203
|
+
promotedCount = promotedFlags.size;
|
|
204
|
+
// Add promoted indices to the changed-indices Set. An entry both
|
|
205
|
+
// archived (Pass 1) and promoted (Pass 2) would only count ONCE in
|
|
206
|
+
// the Set, which is the correct invariant — it's still one row that
|
|
207
|
+
// changed this pass.
|
|
208
|
+
for (const idx of promotedFlags)
|
|
209
|
+
changedIndices.add(idx);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// Write (or skip in dry-run)
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
// unchangedCount is derived from the Set of touched indices (cycle-2 M4
|
|
216
|
+
// robustness fix). archivedCount and promotedCount are kept as separate
|
|
217
|
+
// observability counters in the return shape; they double-count when an
|
|
218
|
+
// entry is both archived AND promoted in the same run, which can happen
|
|
219
|
+
// across multiple prune cycles (today's Pass 2 skips archived entries
|
|
220
|
+
// from THIS pass, but a previously-promoted entry can age out and get
|
|
221
|
+
// archived later — those rows will appear in BOTH counters historically).
|
|
222
|
+
const changed = changedIndices.size;
|
|
223
|
+
const unchangedCount = entries.length - changed;
|
|
224
|
+
if (!input.dry_run && changed > 0) {
|
|
225
|
+
await atomicRewriteJsonl(filePath, stage2);
|
|
226
|
+
logger.info("prune_learnings: rewritten", {
|
|
227
|
+
details: {
|
|
228
|
+
file: filePath,
|
|
229
|
+
total: entries.length,
|
|
230
|
+
archived_count: archivedCount,
|
|
231
|
+
promoted_count: promotedCount,
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
ok: true,
|
|
237
|
+
file: filePath,
|
|
238
|
+
total: entries.length,
|
|
239
|
+
archived_count: archivedCount,
|
|
240
|
+
promoted_count: promotedCount,
|
|
241
|
+
unchanged_count: unchangedCount,
|
|
242
|
+
dry_run: input.dry_run,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
export const pruneLearningsToolDef = {
|
|
246
|
+
name: "prune_learnings",
|
|
247
|
+
description: "Lifecycle maintenance for `.squad/learnings.jsonl` (v0.11.0+). Two passes: (1) entries older than " +
|
|
248
|
+
"`max_age_days` are marked `archived: true` and hidden from default `read_learnings`; (2) entries " +
|
|
249
|
+
"with ≥ `min_recurrence` accept decisions on the same normalised finding title get `promoted: true` " +
|
|
250
|
+
"on the most-recent matching entry — promoted entries surface first in advisory prompts regardless " +
|
|
251
|
+
"of scope match. Atomic rewrite under file lock. Never auto-runs (`max_age_days` defaults to 0). " +
|
|
252
|
+
"Use `dry_run: true` to inspect counts without mutating.",
|
|
253
|
+
schema,
|
|
254
|
+
handler: pruneLearningsTool,
|
|
255
|
+
};
|
|
256
|
+
//# sourceMappingURL=prune-learnings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune-learnings.js","sourceRoot":"","sources":["../../src/tools/prune-learnings.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,12 @@ import type { ToolDef } from "./registry.js";
|
|
|
3
3
|
import { type LearningEntry } from "../learning/store.js";
|
|
4
4
|
declare const schema: z.ZodObject<{
|
|
5
5
|
workspace_root: z.ZodString;
|
|
6
|
-
/**
|
|
6
|
+
/**
|
|
7
|
+
* Cap rendered/returned entries. Default 50. `0` is a valid sentinel
|
|
8
|
+
* meaning "summary only, no entries" (used by `/squad:stats` to fetch
|
|
9
|
+
* counts without paging the file). Range widened from `positive()` to
|
|
10
|
+
* `nonnegative()` in v0.11.0 to accommodate that.
|
|
11
|
+
*/
|
|
7
12
|
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
8
13
|
/** When set, restrict to learnings for this agent. */
|
|
9
14
|
agent: z.ZodOptional<z.ZodEnum<[import("../config/ownership-matrix.js").AgentName, ...import("../config/ownership-matrix.js").AgentName[]]>>;
|
|
@@ -20,10 +25,27 @@ declare const schema: z.ZodObject<{
|
|
|
20
25
|
* array. Skip the render when the caller will format their own.
|
|
21
26
|
*/
|
|
22
27
|
include_rendered: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
28
|
+
/**
|
|
29
|
+
* v0.11.0+ : when true, include entries with `archived: true` in the
|
|
30
|
+
* result. Default false — archived entries are kept on disk for forensics
|
|
31
|
+
* but suppressed from the active read path. Set true for debug / audit /
|
|
32
|
+
* `/squad:stats` summary panels that need the total count.
|
|
33
|
+
*/
|
|
34
|
+
include_archived: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
35
|
+
/**
|
|
36
|
+
* v0.11.0+ : when true, include a `summary` object on the response with
|
|
37
|
+
* `{total, active, archived, promoted}` counts (computed over the full
|
|
38
|
+
* file, ignoring agent / decision / scope filters but respecting
|
|
39
|
+
* include_archived semantics). Used by `/squad:stats` to surface the
|
|
40
|
+
* journal health line.
|
|
41
|
+
*/
|
|
42
|
+
include_summary: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
23
43
|
}, "strip", z.ZodTypeAny, {
|
|
24
44
|
workspace_root: string;
|
|
25
45
|
limit: number;
|
|
26
46
|
include_rendered: boolean;
|
|
47
|
+
include_archived: boolean;
|
|
48
|
+
include_summary: boolean;
|
|
27
49
|
agent?: import("../config/ownership-matrix.js").AgentName | undefined;
|
|
28
50
|
decision?: "accept" | "reject" | undefined;
|
|
29
51
|
changed_files?: string[] | undefined;
|
|
@@ -34,13 +56,27 @@ declare const schema: z.ZodObject<{
|
|
|
34
56
|
limit?: number | undefined;
|
|
35
57
|
changed_files?: string[] | undefined;
|
|
36
58
|
include_rendered?: boolean | undefined;
|
|
59
|
+
include_archived?: boolean | undefined;
|
|
60
|
+
include_summary?: boolean | undefined;
|
|
37
61
|
}>;
|
|
38
62
|
type Input = z.infer<typeof schema>;
|
|
63
|
+
export interface LearningsSummary {
|
|
64
|
+
/** Total rows in the journal, including archived. */
|
|
65
|
+
total: number;
|
|
66
|
+
/** Rows visible to the default read path (archived=false). */
|
|
67
|
+
active: number;
|
|
68
|
+
/** Rows with `archived: true`. */
|
|
69
|
+
archived: number;
|
|
70
|
+
/** Rows with `promoted: true`. */
|
|
71
|
+
promoted: number;
|
|
72
|
+
}
|
|
39
73
|
export interface ReadLearningsOutput {
|
|
40
74
|
entries: LearningEntry[];
|
|
41
75
|
total_in_store: number;
|
|
42
76
|
rendered: string;
|
|
43
77
|
source: string | null;
|
|
78
|
+
/** Present only when input.include_summary === true. */
|
|
79
|
+
summary?: LearningsSummary;
|
|
44
80
|
}
|
|
45
81
|
/**
|
|
46
82
|
* Read recent learnings from `.squad/learnings.jsonl` (path overridable via
|
|
@@ -6,8 +6,13 @@ import { resolveSafePath, createSafePathContext } from "../util/path-safety.js";
|
|
|
6
6
|
import { AGENT_NAMES_TUPLE } from "../config/ownership-matrix.js";
|
|
7
7
|
const schema = z.object({
|
|
8
8
|
workspace_root: z.string().min(1).max(4096),
|
|
9
|
-
/**
|
|
10
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Cap rendered/returned entries. Default 50. `0` is a valid sentinel
|
|
11
|
+
* meaning "summary only, no entries" (used by `/squad:stats` to fetch
|
|
12
|
+
* counts without paging the file). Range widened from `positive()` to
|
|
13
|
+
* `nonnegative()` in v0.11.0 to accommodate that.
|
|
14
|
+
*/
|
|
15
|
+
limit: z.number().int().nonnegative().max(200).optional().default(50),
|
|
11
16
|
/** When set, restrict to learnings for this agent. */
|
|
12
17
|
agent: z.enum(AGENT_NAMES_TUPLE).optional(),
|
|
13
18
|
/** When set, restrict to accepts or rejects. Default both. */
|
|
@@ -23,6 +28,21 @@ const schema = z.object({
|
|
|
23
28
|
* array. Skip the render when the caller will format their own.
|
|
24
29
|
*/
|
|
25
30
|
include_rendered: z.boolean().optional().default(true),
|
|
31
|
+
/**
|
|
32
|
+
* v0.11.0+ : when true, include entries with `archived: true` in the
|
|
33
|
+
* result. Default false — archived entries are kept on disk for forensics
|
|
34
|
+
* but suppressed from the active read path. Set true for debug / audit /
|
|
35
|
+
* `/squad:stats` summary panels that need the total count.
|
|
36
|
+
*/
|
|
37
|
+
include_archived: z.boolean().optional().default(false),
|
|
38
|
+
/**
|
|
39
|
+
* v0.11.0+ : when true, include a `summary` object on the response with
|
|
40
|
+
* `{total, active, archived, promoted}` counts (computed over the full
|
|
41
|
+
* file, ignoring agent / decision / scope filters but respecting
|
|
42
|
+
* include_archived semantics). Used by `/squad:stats` to surface the
|
|
43
|
+
* journal health line.
|
|
44
|
+
*/
|
|
45
|
+
include_summary: z.boolean().optional().default(false),
|
|
26
46
|
});
|
|
27
47
|
/**
|
|
28
48
|
* Read recent learnings from `.squad/learnings.jsonl` (path overridable via
|
|
@@ -37,26 +57,98 @@ export async function readLearningsTool(input) {
|
|
|
37
57
|
// Honor the master switch — if learnings disabled, return empty without
|
|
38
58
|
// touching the filesystem (the user explicitly turned it off).
|
|
39
59
|
if (!config.learnings.enabled) {
|
|
40
|
-
|
|
60
|
+
const baseOut = {
|
|
61
|
+
entries: [],
|
|
62
|
+
total_in_store: 0,
|
|
63
|
+
rendered: "",
|
|
64
|
+
source: null,
|
|
65
|
+
};
|
|
66
|
+
return input.include_summary
|
|
67
|
+
? { ...baseOut, summary: { total: 0, active: 0, archived: 0, promoted: 0 } }
|
|
68
|
+
: baseOut;
|
|
41
69
|
}
|
|
42
70
|
const configuredPath = config.learnings.path;
|
|
43
71
|
const allEntries = await readLearnings(safeRoot, { configuredPath });
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
72
|
+
// v0.11.0: compute summary over the FULL file before any filter is applied.
|
|
73
|
+
// Counts respect file-level state, not query-level filters.
|
|
74
|
+
const summary = input.include_summary
|
|
75
|
+
? {
|
|
76
|
+
total: allEntries.length,
|
|
77
|
+
active: allEntries.filter((e) => !e.archived).length,
|
|
78
|
+
archived: allEntries.filter((e) => e.archived === true).length,
|
|
79
|
+
promoted: allEntries.filter((e) => e.promoted === true).length,
|
|
80
|
+
}
|
|
81
|
+
: undefined;
|
|
82
|
+
// v0.11.0: default read suppresses archived entries. include_archived: true
|
|
83
|
+
// opts back in (debug / audit / stats panel surfacing).
|
|
84
|
+
const visible = input.include_archived
|
|
85
|
+
? allEntries
|
|
86
|
+
: allEntries.filter((e) => e.archived !== true);
|
|
87
|
+
// v0.11.0 (cycle-2 Blocker B1 fix): promoted entries surface FIRST in
|
|
88
|
+
// BOTH the entries[] array (API view for direct callers) AND in the
|
|
89
|
+
// rendered markdown block (LLM prompt view).
|
|
90
|
+
//
|
|
91
|
+
// The previous implementation built `[...promoted, ...rest]` and passed
|
|
92
|
+
// it through `tailRecent.slice(-limit)`, which is a TAIL slice — so
|
|
93
|
+
// promoted entries (sitting at the HEAD) were silently dropped the
|
|
94
|
+
// moment `entries.length > limit`. Worse, `formatLearningsForPrompt`
|
|
95
|
+
// reverses the array before rendering, so even in small fixtures the
|
|
96
|
+
// promoted entries landed at the BOTTOM of the rendered output.
|
|
97
|
+
//
|
|
98
|
+
// New flow:
|
|
99
|
+
// 1. Partition visible entries into promoted vs. rest.
|
|
100
|
+
// 2. Cap promoted at MAX_PROMOTED_IN_PROMPT to bound prompt size as
|
|
101
|
+
// the journal accumulates promoted entries over a project lifetime
|
|
102
|
+
// (architect cycle-2 Major M2). Pick the most-recent N by ts.
|
|
103
|
+
// 3. Apply the user's agent / decision filter ONLY to `rest` — promoted
|
|
104
|
+
// entries are team policy and bypass per-agent narrowing by design.
|
|
105
|
+
// 4. Order BOTH lists newest-first.
|
|
106
|
+
// 5. Build the API-visible `entries` array as
|
|
107
|
+
// `[...promotedNewestFirst, ...restNewestFirst]` so direct API
|
|
108
|
+
// consumers see promoted at the top.
|
|
109
|
+
// 6. For the render input, REVERSE `entries` once so the formatter's
|
|
110
|
+
// internal `.reverse()` flips it back to the same shape — promoted
|
|
111
|
+
// stays at the top of the rendered output. This keeps the formatter
|
|
112
|
+
// contract (input is chronological-oldest-first) intact for the
|
|
113
|
+
// existing test suite.
|
|
114
|
+
const MAX_PROMOTED_IN_PROMPT = 10;
|
|
115
|
+
const promoted = visible.filter((e) => e.promoted === true);
|
|
116
|
+
const rest = visible.filter((e) => e.promoted !== true);
|
|
117
|
+
// promoted: sort ascending by ts so slice(-N) returns newest N (in oldest-
|
|
118
|
+
// first order), then reverse to get newest-first.
|
|
119
|
+
const promotedSorted = [...promoted].sort((a, b) => a.ts.localeCompare(b.ts));
|
|
120
|
+
const promotedCappedNewestFirst = [...promotedSorted.slice(-MAX_PROMOTED_IN_PROMPT)].reverse();
|
|
121
|
+
// rest: tailRecent returns tail-N in storage order (oldest-first within
|
|
122
|
+
// the tail). Reverse for newest-first display.
|
|
123
|
+
const restBudget = Math.max(0, input.limit - promotedCappedNewestFirst.length);
|
|
124
|
+
const restTail = restBudget > 0
|
|
125
|
+
? tailRecent(rest, restBudget, {
|
|
126
|
+
...(input.agent !== undefined ? { agent: input.agent } : {}),
|
|
127
|
+
...(input.decision !== undefined ? { decision: input.decision } : {}),
|
|
128
|
+
})
|
|
129
|
+
: [];
|
|
130
|
+
const restTailNewestFirst = [...restTail].reverse();
|
|
131
|
+
// API-visible entries: promoted first, newest-within-each-group first.
|
|
132
|
+
const filtered = input.limit === 0 ? [] : [...promotedCappedNewestFirst, ...restTailNewestFirst];
|
|
133
|
+
// Format-input shape: chronological oldest-first. Since `filtered` is
|
|
134
|
+
// already in newest-first display order, reverse it before handing to
|
|
135
|
+
// the formatter (the formatter's internal `.reverse()` flips it back).
|
|
136
|
+
// This is the load-bearing detail that keeps the existing
|
|
137
|
+
// `learning-format.test.ts` contract intact while also putting promoted
|
|
138
|
+
// entries at the top of the rendered output (cycle-2 Blocker B1 fix).
|
|
139
|
+
const rendered = input.include_rendered && input.limit > 0
|
|
140
|
+
? formatLearningsForPrompt([...filtered].reverse(), {
|
|
50
141
|
...(input.changed_files ? { changedFiles: input.changed_files } : {}),
|
|
51
142
|
limit: input.limit,
|
|
52
143
|
})
|
|
53
144
|
: "";
|
|
54
|
-
|
|
145
|
+
const baseOut = {
|
|
55
146
|
entries: filtered,
|
|
56
147
|
total_in_store: allEntries.length,
|
|
57
148
|
rendered,
|
|
58
149
|
source: allEntries.length > 0 ? `${safeRoot}/${configuredPath ?? ".squad/learnings.jsonl"}` : null,
|
|
59
150
|
};
|
|
151
|
+
return summary ? { ...baseOut, summary } : baseOut;
|
|
60
152
|
}
|
|
61
153
|
export const readLearningsToolDef = {
|
|
62
154
|
name: "read_learnings",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-learnings.js","sourceRoot":"","sources":["../../src/tools/read-learnings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsB,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3C
|
|
1
|
+
{"version":3,"file":"read-learnings.js","sourceRoot":"","sources":["../../src/tools/read-learnings.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-learning.js","sourceRoot":"","sources":["../../src/tools/record-learning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"record-learning.js","sourceRoot":"","sources":["../../src/tools/record-learning.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/registry.js
CHANGED
|
@@ -8,6 +8,7 @@ import { scoreRubricTool } from "./score-rubric.js";
|
|
|
8
8
|
import { readSquadConfigTool } from "./read-squad-config.js";
|
|
9
9
|
import { readLearningsToolDef } from "./read-learnings.js";
|
|
10
10
|
import { recordLearningToolDef } from "./record-learning.js";
|
|
11
|
+
import { pruneLearningsToolDef } from "./prune-learnings.js";
|
|
11
12
|
import { listTasksToolDef } from "./list-tasks.js";
|
|
12
13
|
import { nextTaskToolDef } from "./next-task.js";
|
|
13
14
|
import { recordTasksToolDef } from "./record-tasks.js";
|
|
@@ -41,6 +42,7 @@ export function registerTools() {
|
|
|
41
42
|
register(readSquadConfigTool);
|
|
42
43
|
register(readLearningsToolDef);
|
|
43
44
|
register(recordLearningToolDef);
|
|
45
|
+
register(pruneLearningsToolDef);
|
|
44
46
|
register(listTasksToolDef);
|
|
45
47
|
register(nextTaskToolDef);
|
|
46
48
|
register(recordTasksToolDef);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAc,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AASlE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;AAEzC,MAAM,UAAU,QAAQ,CAAuB,GAAe;IAC5D,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAyB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,aAAa,CAAC,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC1B,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,CAAC;IACzB,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACjC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC9B,QAAQ,CAAC,2BAA2B,CAAC,CAAC;IACtC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC/B,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAChC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAC7B,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAC5B,QAAQ,CAAC,wBAAwB,CAAC,CAAC;IACnC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACjC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC/B,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACjC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IAC/B,QAAQ,CAAC,wBAAwB,CAAC,CAAC;IACnC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IACpC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC;KACvC,CAAC,CAAC,CAAC;AACN,CAAC;AAMD,SAAS,mBAAmB,CAAC,IAAmB;IAC9C,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACzE,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAa;IAC5B,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAClC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,IAAI,CAAC;QAClC,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACtB,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,IAAa;IAC5D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAE7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;YAC1B,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SAClC,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC;YACzB,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,IAAI,EAAE,EAAE;SAClE,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE;QACxB,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,SAAS;QACrB,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YAC3B,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,eAAe;YACxB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SAClC,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC;YACzB,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;gBAC7B,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;aAChD;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;YACrB,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SAClC,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;QACzC,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE;gBACxB,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,YAAY;gBACrB,WAAW;gBACX,UAAU,EAAE,GAAG,CAAC,IAAI;aACrB,CAAC,CAAC;YACH,wEAAwE;YACxE,mEAAmE;YACnE,oEAAoE;YACpE,qEAAqE;YACrE,2DAA2D;YAC3D,OAAO,mBAAmB,CAAC;gBACzB,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;oBAC9B,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;iBACtC;aACF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE;YAC7B,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,gBAAgB;YACzB,WAAW;YACX,OAAO,EAAE,EAAE,OAAO,EAAE;SACrB,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC;YACzB,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,qBAAqB,EAAE;SAClE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB;IACzC,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAmC,CAAC;QACzD,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,UAAU,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC7D,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC7D,IAAI,MAAM,YAAY,CAAC,CAAC,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/D,IAAI,MAAM,YAAY,CAAC,CAAC,QAAQ;QAC9B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACnE,IAAI,MAAM,YAAY,CAAC,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACjF,IAAI,MAAM,YAAY,CAAC,CAAC,WAAW;QAAE,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,YAAY,CAAC,CAAC,UAAU;QAAE,OAAO,eAAe,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACnF,IAAI,MAAM,YAAY,CAAC,CAAC,UAAU;QAAE,OAAO,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/E,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomically rewrite a JSONL file with a new set of rows. Survives crashes
|
|
3
|
+
* mid-write and races with concurrent appenders that hold the same file
|
|
4
|
+
* lock. Concurrent READERS (which do not take the lock today by design)
|
|
5
|
+
* also survive — they either see the pre-rewrite file in full or the
|
|
6
|
+
* post-rewrite file in full, never a half-written state. The protocol
|
|
7
|
+
* uses POSIX rename semantics (atomic-within-filesystem).
|
|
8
|
+
*
|
|
9
|
+
* Used by:
|
|
10
|
+
* - `prune_learnings` (v0.11.0+) to mark entries archived/promoted in a
|
|
11
|
+
* full rewrite of `.squad/learnings.jsonl`.
|
|
12
|
+
*
|
|
13
|
+
* Protocol (executes inside the lock):
|
|
14
|
+
* 1. Read current file contents into memory (caller does this BEFORE
|
|
15
|
+
* calling; we receive the new rows to write).
|
|
16
|
+
* 2. Write new content to `<file>.tmp` with mode 0o600 (private).
|
|
17
|
+
* 3. Rename current `<file>` → `<file>.prev` (atomic). This is the
|
|
18
|
+
* rollback point — if the next step fails, the user can manually
|
|
19
|
+
* `mv <file>.prev <file>` to recover.
|
|
20
|
+
* 4. Rename `<file>.tmp` → `<file>` (atomic).
|
|
21
|
+
* 5. Lock released by the caller's withFileLock wrapper.
|
|
22
|
+
*
|
|
23
|
+
* On failure between steps 3 and 4 (rare — both renames are usually a
|
|
24
|
+
* single syscall on the same FS), the file goes missing for a moment but
|
|
25
|
+
* `.prev` is intact. Step 4 retries inside the lock could be added; for
|
|
26
|
+
* now, surface the error and let the caller decide.
|
|
27
|
+
*
|
|
28
|
+
* The function takes a `lock: false` escape hatch for tests that want to
|
|
29
|
+
* exercise the rename sequence without taking the cross-process lock (we
|
|
30
|
+
* never use it in production).
|
|
31
|
+
*/
|
|
32
|
+
export interface AtomicRewriteOptions {
|
|
33
|
+
/** When false, skip the file-lock acquisition. Test-only. Default true. */
|
|
34
|
+
lock?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export declare function atomicRewriteJsonl(filePath: string, rows: ReadonlyArray<object>, options?: AtomicRewriteOptions): Promise<void>;
|