specweave 3.1.4 → 3.1.6
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 +2 -2
- package/README.md +4 -5
- package/bin/specweave.js +18 -1
- package/dist/dashboard/assets/index-B4Xv671Q.css +1 -0
- package/dist/dashboard/assets/index-VnHjeVmH.js +16 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/src/cli/commands/card.d.ts.map +1 -1
- package/dist/src/cli/commands/card.js +15 -10
- package/dist/src/cli/commands/card.js.map +1 -1
- package/dist/src/cli/commands/complete.d.ts.map +1 -1
- package/dist/src/cli/commands/complete.js +6 -0
- package/dist/src/cli/commands/complete.js.map +1 -1
- package/dist/src/cli/commands/create-increment.d.ts.map +1 -1
- package/dist/src/cli/commands/create-increment.js +4 -0
- package/dist/src/cli/commands/create-increment.js.map +1 -1
- package/dist/src/cli/commands/dashboard.d.ts.map +1 -1
- package/dist/src/cli/commands/dashboard.js +2 -0
- package/dist/src/cli/commands/dashboard.js.map +1 -1
- package/dist/src/cli/commands/gc.d.ts +5 -1
- package/dist/src/cli/commands/gc.d.ts.map +1 -1
- package/dist/src/cli/commands/gc.js +19 -2
- package/dist/src/cli/commands/gc.js.map +1 -1
- package/dist/src/cli/commands/jev-helpers.d.ts +12 -4
- package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -1
- package/dist/src/cli/commands/jev-helpers.js +22 -13
- package/dist/src/cli/commands/jev-helpers.js.map +1 -1
- package/dist/src/cli/commands/pickup.d.ts.map +1 -1
- package/dist/src/cli/commands/pickup.js +8 -4
- package/dist/src/cli/commands/pickup.js.map +1 -1
- package/dist/src/cli/commands/require-increment.d.ts +18 -0
- package/dist/src/cli/commands/require-increment.d.ts.map +1 -0
- package/dist/src/cli/commands/require-increment.js +75 -0
- package/dist/src/cli/commands/require-increment.js.map +1 -0
- package/dist/src/cli/commands/small-fix.d.ts +14 -0
- package/dist/src/cli/commands/small-fix.d.ts.map +1 -0
- package/dist/src/cli/commands/small-fix.js +52 -0
- package/dist/src/cli/commands/small-fix.js.map +1 -0
- package/dist/src/cli/commands/verify.d.ts.map +1 -1
- package/dist/src/cli/commands/verify.js +3 -0
- package/dist/src/cli/commands/verify.js.map +1 -1
- package/dist/src/core/config/types.d.ts +7 -0
- package/dist/src/core/config/types.d.ts.map +1 -1
- package/dist/src/core/config/types.js.map +1 -1
- package/dist/src/core/hooks/handlers/pre-compact.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/pre-compact.js +4 -1
- package/dist/src/core/hooks/handlers/pre-compact.js.map +1 -1
- package/dist/src/core/hooks/handlers/pre-tool-use.d.ts +5 -2
- package/dist/src/core/hooks/handlers/pre-tool-use.d.ts.map +1 -1
- package/dist/src/core/hooks/handlers/pre-tool-use.js +16 -3
- package/dist/src/core/hooks/handlers/pre-tool-use.js.map +1 -1
- package/dist/src/core/hooks/handlers/require-increment.d.ts +40 -0
- package/dist/src/core/hooks/handlers/require-increment.d.ts.map +1 -0
- package/dist/src/core/hooks/handlers/require-increment.js +123 -0
- package/dist/src/core/hooks/handlers/require-increment.js.map +1 -0
- package/dist/src/core/increment/completion-validator.d.ts +6 -2
- package/dist/src/core/increment/completion-validator.d.ts.map +1 -1
- package/dist/src/core/increment/completion-validator.js +16 -9
- package/dist/src/core/increment/completion-validator.js.map +1 -1
- package/dist/src/core/session/checkpoint-retention.d.ts +45 -0
- package/dist/src/core/session/checkpoint-retention.d.ts.map +1 -0
- package/dist/src/core/session/checkpoint-retention.js +187 -0
- package/dist/src/core/session/checkpoint-retention.js.map +1 -0
- package/dist/src/core/session/checkpoint-worker.js +5 -0
- package/dist/src/core/session/checkpoint-worker.js.map +1 -1
- package/dist/src/core/session/pickup.d.ts +2 -0
- package/dist/src/core/session/pickup.d.ts.map +1 -1
- package/dist/src/core/session/pickup.js +4 -3
- package/dist/src/core/session/pickup.js.map +1 -1
- package/dist/src/core/session/work-handoff.d.ts.map +1 -1
- package/dist/src/core/session/work-handoff.js +6 -3
- package/dist/src/core/session/work-handoff.js.map +1 -1
- package/dist/src/core/tasks/ledger.d.ts +7 -0
- package/dist/src/core/tasks/ledger.d.ts.map +1 -1
- package/dist/src/core/tasks/ledger.js +20 -4
- package/dist/src/core/tasks/ledger.js.map +1 -1
- package/dist/src/core/tasks/verify-runner.d.ts +1 -1
- package/dist/src/core/tasks/verify-runner.d.ts.map +1 -1
- package/dist/src/core/tasks/verify-runner.js +5 -13
- package/dist/src/core/tasks/verify-runner.js.map +1 -1
- package/dist/src/core/tasks/work-session.d.ts +58 -0
- package/dist/src/core/tasks/work-session.d.ts.map +1 -0
- package/dist/src/core/tasks/work-session.js +88 -0
- package/dist/src/core/tasks/work-session.js.map +1 -0
- package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
- package/dist/src/dashboard/server/dashboard-server.js +2 -0
- package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
- package/dist/src/dashboard/server/data/plan-timeline.d.ts +40 -0
- package/dist/src/dashboard/server/data/plan-timeline.d.ts.map +1 -0
- package/dist/src/dashboard/server/data/plan-timeline.js +259 -0
- package/dist/src/dashboard/server/data/plan-timeline.js.map +1 -0
- package/dist/src/dashboard/server/data/work-projection.d.ts.map +1 -1
- package/dist/src/dashboard/server/data/work-projection.js +7 -2
- package/dist/src/dashboard/server/data/work-projection.js.map +1 -1
- package/dist/src/dashboard/server/routes/plan-routes.d.ts +4 -0
- package/dist/src/dashboard/server/routes/plan-routes.d.ts.map +1 -0
- package/dist/src/dashboard/server/routes/plan-routes.js +19 -0
- package/dist/src/dashboard/server/routes/plan-routes.js.map +1 -0
- package/dist/src/dashboard/work-types.d.ts +81 -0
- package/dist/src/dashboard/work-types.d.ts.map +1 -1
- package/dist/src/utils/find-project-root.d.ts +2 -0
- package/dist/src/utils/find-project-root.d.ts.map +1 -1
- package/dist/src/utils/find-project-root.js +8 -1
- package/dist/src/utils/find-project-root.js.map +1 -1
- package/dist/src/utils/main-checkout.d.ts +30 -0
- package/dist/src/utils/main-checkout.d.ts.map +1 -0
- package/dist/src/utils/main-checkout.js +74 -0
- package/dist/src/utils/main-checkout.js.map +1 -0
- package/package.json +1 -1
- package/plugins/specweave/.claude-plugin/plugin.json +1 -1
- package/plugins/specweave/hooks/run-worker.mjs +42 -5
- package/plugins/specweave/hooks/run.mjs +101 -6
- package/src/templates/AGENTS.md.template +1 -1
- package/src/templates/environments/minimal/README.md +3 -3
- package/src/templates/environments/progressive/README.md +5 -6
- package/src/templates/environments/standard/README.md +4 -4
- package/dist/dashboard/assets/index-BFPKNEDz.css +0 -1
- package/dist/dashboard/assets/index-DVaY9gOX.js +0 -13
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* PreToolUse hook handler (tools: Write, Edit, Bash) —
|
|
2
|
+
* PreToolUse hook handler (tools: Write, Edit, MultiEdit, NotebookEdit, Bash) — three rules:
|
|
3
3
|
*
|
|
4
4
|
* 1. Status Completion Guard — no manual `status: completed` in an increment's
|
|
5
5
|
* metadata.json; closure goes through `/sw:done` / `specweave complete`.
|
|
6
|
-
* 2.
|
|
6
|
+
* 2. Required increment (opt-in, 0996) — with `planning.requireIncrement` set
|
|
7
|
+
* to `remind` or `enforce`, an edit in a session with no increment and no
|
|
8
|
+
* `specweave small-fix` is warned about or denied (see require-increment.ts).
|
|
9
|
+
* 3. Jev Bash guard (opt-in, 0878) — when `.specweave/state/jev-guard.enabled`
|
|
7
10
|
* exists AND `jev.enabled` AND `jev.guards.bash`, a shell command that
|
|
8
11
|
* survives the regex prefilter is scored by Jev; a `deny` verdict blocks it,
|
|
9
12
|
* a `warn` verdict is surfaced as additionalContext.
|
|
@@ -38,6 +41,7 @@ import * as fs from 'fs';
|
|
|
38
41
|
import * as path from 'path';
|
|
39
42
|
import { redactSecrets } from '../../jev/redact.js';
|
|
40
43
|
import { deny, pass, warn } from './types.js';
|
|
44
|
+
import { checkRequireIncrement, EDIT_TOOLS } from './require-increment.js';
|
|
41
45
|
import { extractIncrementId, getFilePath, getToolInput, getToolName, isIncrementFile, logHook, readJsonSafe, } from './utils.js';
|
|
42
46
|
const METADATA_RE = /\.specweave\/increments\/[^/]+\/metadata\.json$/;
|
|
43
47
|
/** Opt-in marker: `.specweave/state/jev-guard.enabled` (relative to stateDir). */
|
|
@@ -201,8 +205,17 @@ export const handle = async (input, context) => {
|
|
|
201
205
|
return pass();
|
|
202
206
|
}
|
|
203
207
|
}
|
|
204
|
-
if (toolName
|
|
208
|
+
if (!EDIT_TOOLS.has(toolName))
|
|
205
209
|
return pass();
|
|
210
|
+
try {
|
|
211
|
+
const required = checkRequireIncrement(input, context);
|
|
212
|
+
if (required.hookSpecificOutput)
|
|
213
|
+
return required;
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
217
|
+
logHook(context, 'require-increment', `[ERROR] ${msg}`, 'error');
|
|
218
|
+
}
|
|
206
219
|
const filePath = getFilePath(input);
|
|
207
220
|
if (!filePath || !isIncrementFile(filePath))
|
|
208
221
|
return pass();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/pre-tool-use.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/pre-tool-use.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Required-increment guard (opt-in, `planning.requireIncrement`).
|
|
3
|
+
*
|
|
4
|
+
* An Edit or Write inside the project, outside `.specweave/`, is planned work
|
|
5
|
+
* when the agent session has a work marker (`~/.specweave/sessions/<id>.json`,
|
|
6
|
+
* written by any ledger append, `create-increment`, `verify`, `complete` or
|
|
7
|
+
* `small-fix`, keyed `studio-<thread>` for a SpecWithCode thread) for this
|
|
8
|
+
* project, naming an open increment or a small fix, or its SpecWithCode thread
|
|
9
|
+
* is bound to an open increment here.
|
|
10
|
+
* Otherwise:
|
|
11
|
+
*
|
|
12
|
+
* off → nothing (the default)
|
|
13
|
+
* remind → one additionalContext note per session
|
|
14
|
+
* enforce → deny, naming the commands that unblock the edit
|
|
15
|
+
*
|
|
16
|
+
* Offline, a few file reads, fail-open: any error passes.
|
|
17
|
+
*
|
|
18
|
+
* @module core/hooks/handlers/require-increment
|
|
19
|
+
*/
|
|
20
|
+
import type { HookContext, HookInput, HookResult } from './types.js';
|
|
21
|
+
export declare const REQUIRE_INCREMENT_MODES: readonly ["off", "remind", "enforce"];
|
|
22
|
+
export type RequireIncrementMode = (typeof REQUIRE_INCREMENT_MODES)[number];
|
|
23
|
+
export declare const EDIT_TOOLS: ReadonlySet<string>;
|
|
24
|
+
export declare function readRequireIncrementMode(configPath: string): RequireIncrementMode;
|
|
25
|
+
/** Marker `specweave require-increment` leaves so the hook launcher's fast path knows to run the guard. */
|
|
26
|
+
export declare const REQUIRE_INCREMENT_MARKER = "require-increment.enabled";
|
|
27
|
+
/**
|
|
28
|
+
* Is this session already working, in this project, on an open increment or a
|
|
29
|
+
* declared small fix? Markers from another project or a closed increment do not count.
|
|
30
|
+
*/
|
|
31
|
+
export declare function hasPlannedWork(input: HookInput, projectRoot: string, opts?: {
|
|
32
|
+
env?: NodeJS.ProcessEnv;
|
|
33
|
+
home?: string;
|
|
34
|
+
}): boolean;
|
|
35
|
+
export declare function requireIncrementMessage(mode: RequireIncrementMode): string;
|
|
36
|
+
export declare function checkRequireIncrement(input: HookInput, context: HookContext, opts?: {
|
|
37
|
+
env?: NodeJS.ProcessEnv;
|
|
38
|
+
home?: string;
|
|
39
|
+
}): HookResult;
|
|
40
|
+
//# sourceMappingURL=require-increment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-increment.d.ts","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/require-increment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIrE,eAAO,MAAM,uBAAuB,uCAAwC,CAAC;AAC7E,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,MAAM,CAA2D,CAAC;AAEvG,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CAGjF;AAOD,2GAA2G;AAC3G,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AAuBpE;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,OAAO,CAoBT;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAU1E;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,UAAU,CA4BZ"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Required-increment guard (opt-in, `planning.requireIncrement`).
|
|
3
|
+
*
|
|
4
|
+
* An Edit or Write inside the project, outside `.specweave/`, is planned work
|
|
5
|
+
* when the agent session has a work marker (`~/.specweave/sessions/<id>.json`,
|
|
6
|
+
* written by any ledger append, `create-increment`, `verify`, `complete` or
|
|
7
|
+
* `small-fix`, keyed `studio-<thread>` for a SpecWithCode thread) for this
|
|
8
|
+
* project, naming an open increment or a small fix, or its SpecWithCode thread
|
|
9
|
+
* is bound to an open increment here.
|
|
10
|
+
* Otherwise:
|
|
11
|
+
*
|
|
12
|
+
* off → nothing (the default)
|
|
13
|
+
* remind → one additionalContext note per session
|
|
14
|
+
* enforce → deny, naming the commands that unblock the edit
|
|
15
|
+
*
|
|
16
|
+
* Offline, a few file reads, fail-open: any error passes.
|
|
17
|
+
*
|
|
18
|
+
* @module core/hooks/handlers/require-increment
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'fs';
|
|
21
|
+
import * as os from 'os';
|
|
22
|
+
import * as path from 'path';
|
|
23
|
+
import { readWorkSession } from '../../tasks/work-session.js';
|
|
24
|
+
import { studioThreadBindingFile } from '../../tasks/studio-thread-binding.js';
|
|
25
|
+
import { mainCheckoutOf } from '../../../utils/main-checkout.js';
|
|
26
|
+
import { deny, pass, warn } from './types.js';
|
|
27
|
+
import { getFilePath, getToolInput, readJsonSafe } from './utils.js';
|
|
28
|
+
export const REQUIRE_INCREMENT_MODES = ['off', 'remind', 'enforce'];
|
|
29
|
+
export const EDIT_TOOLS = new Set(['Edit', 'Write', 'MultiEdit', 'NotebookEdit']);
|
|
30
|
+
export function readRequireIncrementMode(configPath) {
|
|
31
|
+
const mode = readJsonSafe(configPath)?.planning?.requireIncrement;
|
|
32
|
+
return REQUIRE_INCREMENT_MODES.includes(mode) ? mode : 'off';
|
|
33
|
+
}
|
|
34
|
+
function inside(child, parent) {
|
|
35
|
+
const rel = path.relative(parent, child);
|
|
36
|
+
return rel === '' || (!!rel && !rel.startsWith('..') && !path.isAbsolute(rel));
|
|
37
|
+
}
|
|
38
|
+
/** Marker `specweave require-increment` leaves so the hook launcher's fast path knows to run the guard. */
|
|
39
|
+
export const REQUIRE_INCREMENT_MARKER = 'require-increment.enabled';
|
|
40
|
+
const CLOSED = new Set(['completed', 'abandoned', 'cancelled']);
|
|
41
|
+
function nested(a, b) {
|
|
42
|
+
return inside(path.resolve(a), path.resolve(b)) || inside(path.resolve(b), path.resolve(a));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Same project: one root contains the other (an umbrella and its nested repos
|
|
46
|
+
* count as one). A Git worktree also counts as its main checkout, so a
|
|
47
|
+
* SpecWithCode worktree matches the project it came from.
|
|
48
|
+
*/
|
|
49
|
+
function sameProject(a, b) {
|
|
50
|
+
return nested(a, b) || nested(mainCheckoutOf(a) ?? a, mainCheckoutOf(b) ?? b);
|
|
51
|
+
}
|
|
52
|
+
function openIncrement(root, incrementId) {
|
|
53
|
+
if (!incrementId)
|
|
54
|
+
return false;
|
|
55
|
+
const status = readJsonSafe(path.join(root, '.specweave', 'increments', incrementId, 'metadata.json'))?.status;
|
|
56
|
+
return !CLOSED.has(String(status ?? ''));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Is this session already working, in this project, on an open increment or a
|
|
60
|
+
* declared small fix? Markers from another project or a closed increment do not count.
|
|
61
|
+
*/
|
|
62
|
+
export function hasPlannedWork(input, projectRoot, opts = {}) {
|
|
63
|
+
const env = opts.env ?? process.env;
|
|
64
|
+
const home = opts.home ?? os.homedir();
|
|
65
|
+
const thread = env.SPECWEAVE_STUDIO_THREAD_ID?.trim();
|
|
66
|
+
// `specweave small-fix` in a thread without a session id keys its marker by the thread.
|
|
67
|
+
const ids = [input.session_id, env.SPECWEAVE_SESSION_ID, env.CLAUDE_CODE_SESSION_ID, thread ? `studio-${thread}` : undefined].filter((id) => typeof id === 'string' && !!id.trim());
|
|
68
|
+
for (const id of ids) {
|
|
69
|
+
const marker = readWorkSession(id, home);
|
|
70
|
+
if (!marker || !sameProject(marker.root, projectRoot))
|
|
71
|
+
continue;
|
|
72
|
+
if (marker.kind === 'small-fix' || openIncrement(marker.root, marker.incrementId))
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (!thread)
|
|
76
|
+
return false;
|
|
77
|
+
const binding = readJsonSafe(studioThreadBindingFile(thread, home));
|
|
78
|
+
return (!!binding?.root &&
|
|
79
|
+
sameProject(binding.root, projectRoot) &&
|
|
80
|
+
openIncrement(binding.root, binding.incrementId ?? null));
|
|
81
|
+
}
|
|
82
|
+
export function requireIncrementMessage(mode) {
|
|
83
|
+
const lead = mode === 'enforce'
|
|
84
|
+
? 'This project requires an increment before code changes (planning.requireIncrement = enforce), and this session has none.'
|
|
85
|
+
: 'Reminder: this project plans changes as increments (planning.requireIncrement = remind), and this session has none yet.';
|
|
86
|
+
return (`${lead} Plan it with \`specweave create-increment "<title>"\` and fill spec.md, ` +
|
|
87
|
+
'or continue an open one with `specweave task claim T-NN <increment>`. ' +
|
|
88
|
+
'If the change is too small to plan, run `specweave small-fix "<why>"`. Then retry the edit.');
|
|
89
|
+
}
|
|
90
|
+
export function checkRequireIncrement(input, context, opts = {}) {
|
|
91
|
+
const mode = readRequireIncrementMode(context.configPath);
|
|
92
|
+
if (mode === 'off')
|
|
93
|
+
return pass();
|
|
94
|
+
const notebook = getToolInput(input).notebook_path;
|
|
95
|
+
const raw = getFilePath(input) || (typeof notebook === 'string' ? notebook : '');
|
|
96
|
+
if (!raw)
|
|
97
|
+
return pass();
|
|
98
|
+
const cwd = typeof input.cwd === 'string' && input.cwd ? input.cwd : context.projectRoot;
|
|
99
|
+
const file = path.resolve(cwd, raw);
|
|
100
|
+
// Planning files and anything outside this project are never gated.
|
|
101
|
+
if (/[\\/]\.specweave[\\/]/.test(file))
|
|
102
|
+
return pass();
|
|
103
|
+
if (!inside(file, context.projectRoot) && !inside(file, cwd))
|
|
104
|
+
return pass();
|
|
105
|
+
if (hasPlannedWork(input, context.projectRoot, opts))
|
|
106
|
+
return pass();
|
|
107
|
+
if (mode === 'enforce')
|
|
108
|
+
return deny(requireIncrementMessage(mode));
|
|
109
|
+
// remind: once per session.
|
|
110
|
+
const session = (input.session_id || 'unknown').replace(/[^\w.-]/g, '_');
|
|
111
|
+
const marker = path.join(context.stateDir, 'require-increment', `${session}.reminded`);
|
|
112
|
+
if (fs.existsSync(marker))
|
|
113
|
+
return pass();
|
|
114
|
+
try {
|
|
115
|
+
fs.mkdirSync(path.dirname(marker), { recursive: true });
|
|
116
|
+
fs.writeFileSync(marker, context.timestamp);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Reminding twice is better than never.
|
|
120
|
+
}
|
|
121
|
+
return warn(requireIncrementMessage(mode));
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=require-increment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"require-increment.js","sourceRoot":"","sources":["../../../../../src/core/hooks/handlers/require-increment.ts"],"names":[],"mappings":"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"}
|
|
@@ -93,9 +93,13 @@ export declare class IncrementCompletionValidator {
|
|
|
93
93
|
*/
|
|
94
94
|
private static parseAllACsWithPriority;
|
|
95
95
|
/**
|
|
96
|
-
* Count
|
|
96
|
+
* Count acceptance criteria that are not met.
|
|
97
97
|
*
|
|
98
|
-
*
|
|
98
|
+
* Uses the same ledger-derived AC status as `specweave verify`: an AC is met
|
|
99
|
+
* when ticked in spec.md or when every task covering it is done in the
|
|
100
|
+
* ledger. State lives only in ledger.jsonl, so spec.md boxes are never ticked
|
|
101
|
+
* for ledger-tracked work. When no task references any AC (the ledger can say
|
|
102
|
+
* nothing about ACs), falls back to counting `- [ ] **AC-` lines in spec.md.
|
|
99
103
|
*
|
|
100
104
|
* @param incrementId - The increment ID
|
|
101
105
|
* @returns Number of open ACs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-validator.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/completion-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAMpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA4B;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;WACU,kBAAkB,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7E,OAAO,CAAC,gBAAgB,CAAC;IA+N5B;;;;;;;;;;;;;;;;OAgBG;WACU,+BAA+B,CAC1C,MAAM,EAAE,GAAG,EACX,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IA8DhB;;;;;;;;;;;OAWG;mBACkB,kBAAkB;IAoEvC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAiDtC
|
|
1
|
+
{"version":3,"file":"completion-validator.d.ts","sourceRoot":"","sources":["../../../../src/core/increment/completion-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAMpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;GAMG;AACH,qBAAa,4BAA4B;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;WACU,kBAAkB,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7E,OAAO,CAAC,gBAAgB,CAAC;IA+N5B;;;;;;;;;;;;;;;;OAgBG;WACU,+BAA+B,CAC1C,MAAM,EAAE,GAAG,EACX,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IA8DhB;;;;;;;;;;;OAWG;mBACkB,kBAAkB;IAoEvC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAiDtC;;;;;;;;;;;OAWG;WACU,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc/D;;;;;;;;;OASG;WACU,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAOrE"}
|
|
@@ -423,21 +423,28 @@ export class IncrementCompletionValidator {
|
|
|
423
423
|
return acs;
|
|
424
424
|
}
|
|
425
425
|
/**
|
|
426
|
-
* Count
|
|
426
|
+
* Count acceptance criteria that are not met.
|
|
427
427
|
*
|
|
428
|
-
*
|
|
428
|
+
* Uses the same ledger-derived AC status as `specweave verify`: an AC is met
|
|
429
|
+
* when ticked in spec.md or when every task covering it is done in the
|
|
430
|
+
* ledger. State lives only in ledger.jsonl, so spec.md boxes are never ticked
|
|
431
|
+
* for ledger-tracked work. When no task references any AC (the ledger can say
|
|
432
|
+
* nothing about ACs), falls back to counting `- [ ] **AC-` lines in spec.md.
|
|
429
433
|
*
|
|
430
434
|
* @param incrementId - The increment ID
|
|
431
435
|
* @returns Number of open ACs
|
|
432
436
|
*/
|
|
433
437
|
static async countOpenACs(incrementId) {
|
|
434
|
-
const
|
|
435
|
-
const
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
const
|
|
439
|
-
|
|
440
|
-
|
|
438
|
+
const incrementPath = path.join(resolveEffectiveRoot(), '.specweave', 'increments', incrementId);
|
|
439
|
+
const { loadTaskBoard } = await import('../tasks/task-board.js');
|
|
440
|
+
const { readSpecAcs, deriveAcStatus } = await import('../tasks/verify-runner.js');
|
|
441
|
+
const specAcs = readSpecAcs(incrementPath);
|
|
442
|
+
const board = loadTaskBoard(incrementPath);
|
|
443
|
+
if (specAcs.length > 0 && board.tasks.some((t) => (t.acs ?? []).length > 0)) {
|
|
444
|
+
return deriveAcStatus(specAcs, board).filter((a) => !a.done).length;
|
|
445
|
+
}
|
|
446
|
+
const content = await fs.readFile(path.join(incrementPath, 'spec.md'), 'utf-8');
|
|
447
|
+
return (content.match(/^- \[ \] \*\*AC-/gm) || []).length;
|
|
441
448
|
}
|
|
442
449
|
/**
|
|
443
450
|
* Count tasks that are neither done nor skipped.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-validator.js","sourceRoot":"","sources":["../../../../src/core/increment/completion-validator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"completion-validator.js","sourceRoot":"","sources":["../../../../src/core/increment/completion-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seven days: a checkpoint only matters until the next session picks the work
|
|
3
|
+
* up, and pending handoffs are kept regardless. At October 2026 rates (about
|
|
4
|
+
* 230 sessions and 140 MB a day on one Mac) 14 days would hold about 2 GB.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CHECKPOINT_RETENTION_DAYS = 7;
|
|
7
|
+
export declare const CHECKPOINT_RETENTION_MS: number;
|
|
8
|
+
export declare const CHECKPOINT_PRUNE_INTERVAL_MS: number;
|
|
9
|
+
/** Wall-clock cap for one background run; the rest waits for the next day. */
|
|
10
|
+
export declare const CHECKPOINT_PRUNE_BUDGET_MS = 20000;
|
|
11
|
+
/** Records the last background run. Readers skip dot-names in the root. */
|
|
12
|
+
export declare const CHECKPOINT_PRUNE_MARKER = ".retention";
|
|
13
|
+
export interface CheckpointPruneOptions {
|
|
14
|
+
now?: number;
|
|
15
|
+
maxAgeMs?: number;
|
|
16
|
+
/** Delete; otherwise only report what would go. */
|
|
17
|
+
apply?: boolean;
|
|
18
|
+
/** Stop deleting after this many milliseconds. */
|
|
19
|
+
budgetMs?: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CheckpointPruneResult {
|
|
22
|
+
applied: boolean;
|
|
23
|
+
/** Session folders removed (or that would be). */
|
|
24
|
+
sessions: number;
|
|
25
|
+
/** Their size in bytes. */
|
|
26
|
+
bytes: number;
|
|
27
|
+
/** Studio pointers removed (or that would be). */
|
|
28
|
+
pointers: number;
|
|
29
|
+
/** Session folders kept: recent, or holding a pending handoff. */
|
|
30
|
+
kept: number;
|
|
31
|
+
/** Folders kept only because they hold a pending handoff. */
|
|
32
|
+
pendingHandoffs: number;
|
|
33
|
+
/** The time budget ran out before every candidate was removed. */
|
|
34
|
+
partial: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** Remove (or count) expired session folders and the Studio pointers left without a checkpoint. */
|
|
37
|
+
export declare function pruneCheckpoints(root: string, opts?: CheckpointPruneOptions): CheckpointPruneResult;
|
|
38
|
+
/**
|
|
39
|
+
* At most once a day, prune with a time budget. Called from the detached
|
|
40
|
+
* checkpoint supervisor, never from a hook; every error is swallowed.
|
|
41
|
+
*/
|
|
42
|
+
export declare function maybePruneCheckpoints(root: string, opts?: {
|
|
43
|
+
now?: number;
|
|
44
|
+
}): CheckpointPruneResult | undefined;
|
|
45
|
+
//# sourceMappingURL=checkpoint-retention.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-retention.d.ts","sourceRoot":"","sources":["../../../../src/core/session/checkpoint-retention.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAC3C,eAAO,MAAM,uBAAuB,QAA+C,CAAC;AACpF,eAAO,MAAM,4BAA4B,QAAmB,CAAC;AAC7D,8EAA8E;AAC9E,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,eAAe,CAAC;AAIpD,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;CAClB;AAiCD,mGAAmG;AACnG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,sBAA2B,GAAG,qBAAqB,CA0BvG;AAwBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,qBAAqB,GAAG,SAAS,CAalH"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retention for `~/.specweave/checkpoints`. Every session leaves a folder there
|
|
3
|
+
* and the worker only prunes old generations inside one, so whole folders are
|
|
4
|
+
* removed here once nothing reads them: newest file older than 7 days and no
|
|
5
|
+
* pending handoff (`handoff.json` without a later `picked.json`). Studio
|
|
6
|
+
* pointers (`studio/<thread>.json`) go when the checkpoint they name is gone.
|
|
7
|
+
*
|
|
8
|
+
* The checkpoint supervisor runs it at most once a day, after its capture, in
|
|
9
|
+
* a detached process; `specweave gc` reports it and `gc --yes` applies it.
|
|
10
|
+
*/
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { SESSION_HANDOFF_FILE, SESSION_PICKED_FILE } from './session-checkpoint.js';
|
|
14
|
+
/**
|
|
15
|
+
* Seven days: a checkpoint only matters until the next session picks the work
|
|
16
|
+
* up, and pending handoffs are kept regardless. At October 2026 rates (about
|
|
17
|
+
* 230 sessions and 140 MB a day on one Mac) 14 days would hold about 2 GB.
|
|
18
|
+
*/
|
|
19
|
+
export const CHECKPOINT_RETENTION_DAYS = 7;
|
|
20
|
+
export const CHECKPOINT_RETENTION_MS = CHECKPOINT_RETENTION_DAYS * 24 * 60 * 60000;
|
|
21
|
+
export const CHECKPOINT_PRUNE_INTERVAL_MS = 24 * 60 * 60000;
|
|
22
|
+
/** Wall-clock cap for one background run; the rest waits for the next day. */
|
|
23
|
+
export const CHECKPOINT_PRUNE_BUDGET_MS = 20000;
|
|
24
|
+
/** Records the last background run. Readers skip dot-names in the root. */
|
|
25
|
+
export const CHECKPOINT_PRUNE_MARKER = '.retention';
|
|
26
|
+
/** Session folders are sha256(cwd, session id); nothing else in the root is touched. */
|
|
27
|
+
const SESSION_FOLDER = /^[0-9a-f]{64}$/;
|
|
28
|
+
function readJson(file) {
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Newest mtime and total size under a session folder, without following symlinks. */
|
|
37
|
+
function scan(dir) {
|
|
38
|
+
let newest = 0;
|
|
39
|
+
let bytes = 0;
|
|
40
|
+
const walk = (p) => {
|
|
41
|
+
let st;
|
|
42
|
+
try {
|
|
43
|
+
st = fs.lstatSync(p);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
newest = Math.max(newest, st.mtimeMs);
|
|
49
|
+
if (!st.isDirectory()) {
|
|
50
|
+
bytes += st.size;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
let names;
|
|
54
|
+
try {
|
|
55
|
+
names = fs.readdirSync(p);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const name of names)
|
|
61
|
+
walk(path.join(p, name));
|
|
62
|
+
};
|
|
63
|
+
walk(dir);
|
|
64
|
+
return { newest, bytes };
|
|
65
|
+
}
|
|
66
|
+
/** Same rule as `specweave handoff list`, but an unreadable mark counts as pending. */
|
|
67
|
+
function hasPendingHandoff(dir) {
|
|
68
|
+
if (!fs.existsSync(path.join(dir, SESSION_HANDOFF_FILE)))
|
|
69
|
+
return false;
|
|
70
|
+
const mark = readJson(path.join(dir, SESSION_HANDOFF_FILE));
|
|
71
|
+
const picked = readJson(path.join(dir, SESSION_PICKED_FILE));
|
|
72
|
+
const markAt = mark?.at ? Date.parse(mark.at) : NaN;
|
|
73
|
+
const pickedAt = picked?.at ? Date.parse(picked.at) : NaN;
|
|
74
|
+
return !(Number.isFinite(markAt) && Number.isFinite(pickedAt) && pickedAt >= markAt);
|
|
75
|
+
}
|
|
76
|
+
/** Remove (or count) expired session folders and the Studio pointers left without a checkpoint. */
|
|
77
|
+
export function pruneCheckpoints(root, opts = {}) {
|
|
78
|
+
const now = opts.now ?? Date.now();
|
|
79
|
+
const cutoff = now - (opts.maxAgeMs ?? CHECKPOINT_RETENTION_MS);
|
|
80
|
+
const deadline = opts.budgetMs === undefined ? Infinity : Date.now() + opts.budgetMs;
|
|
81
|
+
const result = { applied: !!opts.apply, sessions: 0, bytes: 0, pointers: 0, kept: 0, pendingHandoffs: 0, partial: false };
|
|
82
|
+
let names;
|
|
83
|
+
try {
|
|
84
|
+
names = fs.readdirSync(root);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
const removed = new Set();
|
|
90
|
+
for (const name of names) {
|
|
91
|
+
if (!SESSION_FOLDER.test(name))
|
|
92
|
+
continue;
|
|
93
|
+
const dir = path.join(root, name);
|
|
94
|
+
if (Date.now() > deadline) {
|
|
95
|
+
result.partial = true;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
if (hasPendingHandoff(dir)) {
|
|
99
|
+
result.kept++;
|
|
100
|
+
result.pendingHandoffs++;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const { newest, bytes } = scan(dir);
|
|
104
|
+
if (!newest || newest >= cutoff) {
|
|
105
|
+
result.kept++;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (opts.apply) {
|
|
109
|
+
// A session that came back since the scan touches the folder first.
|
|
110
|
+
try {
|
|
111
|
+
if (fs.statSync(dir).mtimeMs >= cutoff || hasPendingHandoff(dir)) {
|
|
112
|
+
result.kept++;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
fs.rmSync(dir, { recursive: true, force: true });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
result.kept++;
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
removed.add(dir);
|
|
128
|
+
result.sessions++;
|
|
129
|
+
result.bytes += bytes;
|
|
130
|
+
}
|
|
131
|
+
result.pointers = prunePointers(root, removed, cutoff, !!opts.apply);
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
/** Pointers older than the cutoff whose checkpoint document is gone (or about to be). */
|
|
135
|
+
function prunePointers(root, removed, cutoff, apply) {
|
|
136
|
+
const studio = path.join(root, 'studio');
|
|
137
|
+
let names;
|
|
138
|
+
try {
|
|
139
|
+
names = fs.readdirSync(studio);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
let count = 0;
|
|
145
|
+
for (const name of names) {
|
|
146
|
+
const file = path.join(studio, name);
|
|
147
|
+
try {
|
|
148
|
+
const st = fs.lstatSync(file);
|
|
149
|
+
if (!st.isFile() || st.mtimeMs >= cutoff)
|
|
150
|
+
continue;
|
|
151
|
+
// Leftover `<thread>.json.<token>` temp files carry no receipt and also go.
|
|
152
|
+
const docPath = name.endsWith('.json') ? readJson(file)?.docPath : undefined;
|
|
153
|
+
if (typeof docPath === 'string' && fs.existsSync(docPath)
|
|
154
|
+
&& !removed.has(path.dirname(path.dirname(docPath))))
|
|
155
|
+
continue;
|
|
156
|
+
if (apply)
|
|
157
|
+
fs.unlinkSync(file);
|
|
158
|
+
count++;
|
|
159
|
+
}
|
|
160
|
+
catch { /* raced with a writer or another prune */ }
|
|
161
|
+
}
|
|
162
|
+
return count;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* At most once a day, prune with a time budget. Called from the detached
|
|
166
|
+
* checkpoint supervisor, never from a hook; every error is swallowed.
|
|
167
|
+
*/
|
|
168
|
+
export function maybePruneCheckpoints(root, opts = {}) {
|
|
169
|
+
try {
|
|
170
|
+
const now = opts.now ?? Date.now();
|
|
171
|
+
const marker = path.join(root, CHECKPOINT_PRUNE_MARKER);
|
|
172
|
+
try {
|
|
173
|
+
const last = fs.statSync(marker).mtimeMs;
|
|
174
|
+
if (now >= last && now - last < CHECKPOINT_PRUNE_INTERVAL_MS)
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
catch { /* first run */ }
|
|
178
|
+
// Claim the day before the work, so concurrent supervisors skip it.
|
|
179
|
+
fs.writeFileSync(marker, JSON.stringify({ at: new Date(now).toISOString() }) + '\n', { mode: 0o600 });
|
|
180
|
+
fs.utimesSync(marker, now / 1000, now / 1000);
|
|
181
|
+
return pruneCheckpoints(root, { now, apply: true, budgetMs: CHECKPOINT_PRUNE_BUDGET_MS });
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=checkpoint-retention.js.map
|