@dzhechkov/harness-core 0.8.24 → 0.8.26

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.
Files changed (64) hide show
  1. package/.dz-manifest.json +153 -33
  2. package/README.md +150 -4
  3. package/dist/confirmation-file-gate.d.ts +20 -0
  4. package/dist/confirmation-file-gate.d.ts.map +1 -0
  5. package/dist/confirmation-file-gate.js +76 -0
  6. package/dist/confirmation-file-gate.js.map +1 -0
  7. package/dist/contract-checklist.d.ts +1 -0
  8. package/dist/contract-checklist.d.ts.map +1 -1
  9. package/dist/contract-checklist.js +7 -4
  10. package/dist/contract-checklist.js.map +1 -1
  11. package/dist/core-boundary.d.ts +11 -0
  12. package/dist/core-boundary.d.ts.map +1 -0
  13. package/dist/core-boundary.js +41 -0
  14. package/dist/core-boundary.js.map +1 -0
  15. package/dist/feature-adr-landing.d.ts +4 -2
  16. package/dist/feature-adr-landing.d.ts.map +1 -1
  17. package/dist/feature-adr-landing.js +5 -3
  18. package/dist/feature-adr-landing.js.map +1 -1
  19. package/dist/feature-tier.d.ts +4 -0
  20. package/dist/feature-tier.d.ts.map +1 -0
  21. package/dist/feature-tier.js +55 -0
  22. package/dist/feature-tier.js.map +1 -0
  23. package/dist/index.d.ts +7 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +6 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/journal.d.ts +27 -0
  28. package/dist/journal.d.ts.map +1 -0
  29. package/dist/journal.js +56 -0
  30. package/dist/journal.js.map +1 -0
  31. package/dist/loop-blobs.generated.d.ts +1 -1
  32. package/dist/loop-blobs.generated.d.ts.map +1 -1
  33. package/dist/loop-blobs.generated.js +10 -1
  34. package/dist/loop-blobs.generated.js.map +1 -1
  35. package/dist/patterns.d.ts +5 -0
  36. package/dist/patterns.d.ts.map +1 -1
  37. package/dist/patterns.js +16 -0
  38. package/dist/patterns.js.map +1 -1
  39. package/dist/publish.d.ts +19 -0
  40. package/dist/publish.d.ts.map +1 -1
  41. package/dist/publish.js +38 -16
  42. package/dist/publish.js.map +1 -1
  43. package/dist/run-cleanup.d.ts +26 -0
  44. package/dist/run-cleanup.d.ts.map +1 -0
  45. package/dist/run-cleanup.js +33 -0
  46. package/dist/run-cleanup.js.map +1 -0
  47. package/dist/run-registry.d.ts +61 -0
  48. package/dist/run-registry.d.ts.map +1 -0
  49. package/dist/run-registry.js +163 -0
  50. package/dist/run-registry.js.map +1 -0
  51. package/package.json +7 -7
  52. package/sbom.json +332 -32
  53. package/src/confirmation-file-gate.ts +85 -0
  54. package/src/contract-checklist.ts +11 -5
  55. package/src/core-boundary.ts +43 -0
  56. package/src/feature-adr-landing.ts +8 -4
  57. package/src/feature-tier.ts +56 -0
  58. package/src/index.ts +9 -1
  59. package/src/journal.ts +54 -0
  60. package/src/loop-blobs.generated.ts +10 -1
  61. package/src/patterns.ts +18 -0
  62. package/src/publish.ts +49 -13
  63. package/src/run-cleanup.ts +38 -0
  64. package/src/run-registry.ts +153 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cleanup.js","sourceRoot":"","sources":["../src/run-cleanup.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,mBAAmB,CAAC,KAAqB,EAAE,IAA0C;IACnG,MAAM,IAAI,GAAwB,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC1E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAiE,CAAC;QACtE,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,MAAM,CAAC;aAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,GAAG,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;aAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,MAAM,GAAG,gBAAgB,CAAC;aACpD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,GAAG,UAAU,CAAC;aACtC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;YAAE,MAAM,GAAG,wBAAwB,CAAC;QAC7H,IAAI,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;;YACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,uBAAuB,CAAC,IAAyB,EAAE,KAAc;IAC/E,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAyB;IACzD,OAAO;QACL,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAa,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC5I,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,MAAM,MAAM,EAAE;YACpE,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KAClI,CAAC;AACJ,CAAC"}
@@ -0,0 +1,61 @@
1
+ export declare const RUN_REGISTRY_BLOB_VERSION = "1.0.0";
2
+ export type RunEvent = {
3
+ event: 'started' | 'heartbeat' | 'finished';
4
+ runId: string;
5
+ ts: string;
6
+ kind?: string;
7
+ slug?: string;
8
+ pid?: number;
9
+ parentRunId?: string;
10
+ outcome?: string;
11
+ reason?: string;
12
+ truncated?: boolean;
13
+ };
14
+ export type RegisteredRun = RunEvent & {
15
+ heartbeat?: string;
16
+ finished?: string;
17
+ };
18
+ export type RunLiveness = {
19
+ state: 'live' | 'orphaned' | 'inconclusive' | 'stalled';
20
+ reason: string;
21
+ };
22
+ export type RunRegistry = {
23
+ status: 'readable' | 'missing' | 'inconclusive';
24
+ reason?: string;
25
+ runs: RegisteredRun[];
26
+ events?: RunEvent[];
27
+ };
28
+ export type RunRegistryIO = {
29
+ append(path: string, line: string): void;
30
+ read(path: string): string;
31
+ mkdir(dir: string): void;
32
+ };
33
+ export type PidProbe = (pid: number) => boolean | null;
34
+ export declare function probePid(pid: number, kill?: (pid: number, signal: 0) => unknown): boolean | null;
35
+ export declare function validateRunEvent(raw: unknown): asserts raw is RunEvent;
36
+ export declare function appendRunEvent(root: string, ev: RunEvent, io: RunRegistryIO): void;
37
+ export declare function readRunRegistry(root: string, io: RunRegistryIO): RunRegistry;
38
+ export declare function liveness(run: RegisteredRun | undefined, now: number, probe?: PidProbe, opts?: {
39
+ stallMs?: number;
40
+ }): RunLiveness;
41
+ export declare function liveParents(registry: RunRegistry, now: number, probe?: PidProbe, opts?: {
42
+ stallMs?: number;
43
+ }): Array<{
44
+ runId: string;
45
+ parentRunId?: string;
46
+ liveness: RunLiveness;
47
+ }>;
48
+ /** Pure shell command assembly; projected into the Workflow sandbox by the blob generator. */
49
+ export declare function runRecordCommand(dz: string, root: string, event: string, runId: string, slug: string, pid: number | null, parentRunId: string | null, outcome: string): string;
50
+ /** Confirmed absence alone permits a terminal event; callers append the returned events. */
51
+ export declare function settleDeadRuns(registry: RunRegistry, now: number, probe?: PidProbe): RunEvent[];
52
+ /** Keep whole histories, using the newest event's timestamp rather than the start time. */
53
+ export declare function planRegistryArchive(registry: RunRegistry, opts: {
54
+ now: number;
55
+ retentionMs: number;
56
+ probe: PidProbe;
57
+ }): {
58
+ archive: RunEvent[];
59
+ keep: RunEvent[];
60
+ };
61
+ //# sourceMappingURL=run-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-registry.d.ts","sourceRoot":"","sources":["../src/run-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ import { join } from 'node:path';
2
+ export const RUN_REGISTRY_BLOB_VERSION = '1.0.0';
3
+ export function probePid(pid, kill = process.kill) {
4
+ if (!Number.isSafeInteger(pid) || pid <= 0)
5
+ return null;
6
+ try {
7
+ kill(pid, 0);
8
+ return true;
9
+ }
10
+ catch (error) {
11
+ return error.code === 'ESRCH' ? false : null;
12
+ }
13
+ }
14
+ export function validateRunEvent(raw) {
15
+ if (!raw || typeof raw !== 'object')
16
+ throw new Error('invalid run event');
17
+ const e = raw;
18
+ const text = (s) => typeof s === 'string' && s.trim().length > 0;
19
+ if (!['started', 'heartbeat', 'finished'].includes(e.event) || !text(e.runId) ||
20
+ !text(e.ts) || !Number.isFinite(Date.parse(e.ts)))
21
+ throw new Error('invalid run event identity/time');
22
+ if (e.event === 'started' && (!text(e.kind) || !text(e.slug) || !Number.isSafeInteger(e.pid) || e.pid <= 0))
23
+ throw new Error('started requires kind, slug and positive PID');
24
+ if (e.event === 'finished' && !text(e.outcome))
25
+ throw new Error('finished requires outcome');
26
+ if (e.parentRunId !== undefined && (!text(e.parentRunId) || e.parentRunId === e.runId))
27
+ throw new Error('invalid parentRunId');
28
+ if (e.reason !== undefined && typeof e.reason !== 'string')
29
+ throw new Error('invalid reason');
30
+ }
31
+ export function appendRunEvent(root, ev, io) {
32
+ validateRunEvent(ev);
33
+ const bounded = { ...ev };
34
+ let line = JSON.stringify(bounded) + '\n';
35
+ if (Buffer.byteLength(line) >= 4096) {
36
+ bounded.truncated = true;
37
+ // Preserve identity and lifecycle fields. Only diagnostic text may be shortened.
38
+ const chars = Array.from(bounded.reason ?? '');
39
+ let lo = 0, hi = chars.length;
40
+ bounded.reason = '';
41
+ if (Buffer.byteLength(JSON.stringify(bounded) + '\n') >= 4096)
42
+ throw new Error('run event identity exceeds PIPE_BUF');
43
+ while (lo < hi) {
44
+ const mid = Math.ceil((lo + hi) / 2);
45
+ bounded.reason = chars.slice(0, mid).join('');
46
+ if (Buffer.byteLength(JSON.stringify(bounded) + '\n') < 4096)
47
+ lo = mid;
48
+ else
49
+ hi = mid - 1;
50
+ }
51
+ bounded.reason = chars.slice(0, lo).join('');
52
+ line = JSON.stringify(bounded) + '\n';
53
+ }
54
+ io.mkdir(join(root, '.dz', 'runs'));
55
+ io.append(join(root, '.dz', 'runs', 'registry.jsonl'), line);
56
+ }
57
+ export function readRunRegistry(root, io) {
58
+ const runs = new Map();
59
+ const events = [];
60
+ try {
61
+ const text = io.read(join(root, '.dz', 'runs', 'registry.jsonl'));
62
+ for (const line of text.split('\n')) {
63
+ if (!line.trim())
64
+ continue;
65
+ const ev = JSON.parse(line);
66
+ validateRunEvent(ev);
67
+ events.push(ev);
68
+ const run = runs.get(ev.runId);
69
+ if (ev.event === 'started') {
70
+ if (run)
71
+ throw new Error('duplicate started: ' + ev.runId);
72
+ runs.set(ev.runId, { ...ev });
73
+ }
74
+ else {
75
+ if (!run)
76
+ throw new Error('event without started: ' + ev.runId);
77
+ if (ev.event === 'heartbeat')
78
+ run.heartbeat = ev.ts;
79
+ else
80
+ Object.assign(run, { finished: ev.ts, ...(ev.outcome === undefined ? {} : { outcome: ev.outcome }) });
81
+ }
82
+ }
83
+ return { status: 'readable', runs: [...runs.values()], events };
84
+ }
85
+ catch (error) {
86
+ if (error.code === 'ENOENT')
87
+ return { status: 'missing', runs: [] };
88
+ return { status: 'inconclusive', reason: 'registry-unreadable: ' + String(error), runs: [...runs.values()] };
89
+ }
90
+ }
91
+ export function liveness(run, now, probe = probePid, opts = {}) {
92
+ if (!run || run.event !== 'started')
93
+ return { state: 'inconclusive', reason: 'missing-started' };
94
+ if (run.finished)
95
+ return { state: 'orphaned', reason: 'recorded-finished' };
96
+ let alive = null;
97
+ try {
98
+ alive = run.pid === undefined ? null : probe(run.pid);
99
+ }
100
+ catch { /* inaccessible */ }
101
+ if (alive === null)
102
+ return { state: 'inconclusive', reason: 'pid-unavailable' };
103
+ const stallMs = opts.stallMs ?? 120 * 60_000;
104
+ if (alive && run.heartbeat && now - Date.parse(run.heartbeat) > stallMs) {
105
+ return { state: 'stalled', reason: `heartbeat ${(now - Date.parse(run.heartbeat)) / 60_000}m > ${stallMs / 60_000}m, pid alive` };
106
+ }
107
+ return alive ? { state: 'live', reason: 'pid-alive' } : { state: 'orphaned', reason: 'pid-absent' };
108
+ }
109
+ export function liveParents(registry, now, probe = probePid, opts = {}) {
110
+ const byId = new Map(registry.runs.map(run => [run.runId, run]));
111
+ return registry.runs.map(run => {
112
+ let decision;
113
+ if (registry.status !== 'readable')
114
+ decision = { state: 'inconclusive', reason: registry.reason ?? 'registry-unreadable' };
115
+ else if (run.parentRunId) {
116
+ const parent = byId.get(run.parentRunId);
117
+ decision = parent?.finished ? { state: 'orphaned', reason: 'parent-finished' } : liveness(parent, now, probe, opts);
118
+ }
119
+ else
120
+ decision = liveness(run, now, probe, opts);
121
+ return { runId: run.runId, ...(run.parentRunId === undefined ? {} : { parentRunId: run.parentRunId }), liveness: decision };
122
+ });
123
+ }
124
+ /** Pure shell command assembly; projected into the Workflow sandbox by the blob generator. */
125
+ export function runRecordCommand(dz, root, event, runId, slug, pid, parentRunId, outcome) {
126
+ const quote = (s) => "'" + s.replace(/'/g, "'\\''") + "'";
127
+ let cmd = dz + ' runs-record --project ' + quote(root) + ' --event ' + quote(event) + (runId ? ' --run-id ' + quote(runId) : '');
128
+ if (event === 'started') {
129
+ cmd += ' --kind feature-adr --slug ' + quote(slug);
130
+ // Only an explicitly supplied host PID is authoritative. Never record the short-lived shell PID.
131
+ cmd += ' --pid ' + quote(pid === null ? 'host' : String(pid));
132
+ if (parentRunId)
133
+ cmd += ' --parent-run-id ' + quote(parentRunId);
134
+ }
135
+ if (event === 'finished')
136
+ cmd += ' --outcome ' + quote(outcome);
137
+ return cmd + ' --json';
138
+ }
139
+ /** Confirmed absence alone permits a terminal event; callers append the returned events. */
140
+ export function settleDeadRuns(registry, now, probe = probePid) {
141
+ if (registry.status !== 'readable')
142
+ return [];
143
+ const ts = new Date(now).toISOString();
144
+ return registry.runs.filter(run => !run.finished && liveness(run, now, probe).state === 'orphaned')
145
+ .map(run => ({ event: 'finished', runId: run.runId, ts, outcome: 'died',
146
+ reason: `pid ${run.pid} absent, confirmed ${ts}` }));
147
+ }
148
+ /** Keep whole histories, using the newest event's timestamp rather than the start time. */
149
+ export function planRegistryArchive(registry, opts) {
150
+ const events = registry.events ?? [];
151
+ if (registry.status !== 'readable')
152
+ return { archive: [], keep: [...events] };
153
+ const last = new Map();
154
+ for (const ev of events)
155
+ last.set(ev.runId, Math.max(last.get(ev.runId) ?? -Infinity, Date.parse(ev.ts)));
156
+ const eligible = new Set(registry.runs.filter(run => {
157
+ const ts = last.get(run.runId);
158
+ return ts !== undefined && opts.now - ts > opts.retentionMs &&
159
+ (run.finished || liveness(run, opts.now, opts.probe).state === 'orphaned');
160
+ }).map(run => run.runId));
161
+ return { archive: events.filter(ev => eligible.has(ev.runId)), keep: events.filter(ev => !eligible.has(ev.runId)) };
162
+ }
163
+ //# sourceMappingURL=run-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-registry.js","sourceRoot":"","sources":["../src/run-registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/harness-core",
3
- "version": "0.8.24",
3
+ "version": "0.8.26",
4
4
  "description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -32,18 +32,18 @@
32
32
  "dependencies": {
33
33
  "proper-lockfile": "^4.1.2",
34
34
  "yaml": "^2.0.0",
35
- "@dzhechkov/adapter-agents-md": "0.1.7",
36
35
  "@dzhechkov/adapter-claude": "^0.2.7",
37
- "@dzhechkov/adapter-cursor": "0.1.7",
36
+ "@dzhechkov/adapter-agents-md": "0.1.7",
38
37
  "@dzhechkov/adapter-codex": "^0.2.6",
39
38
  "@dzhechkov/adapter-copilot": "0.1.7",
39
+ "@dzhechkov/adapter-cursor": "0.1.7",
40
40
  "@dzhechkov/adapter-hermes": "^0.2.6",
41
- "@dzhechkov/adapter-gemini": "0.1.7",
41
+ "@dzhechkov/adapter-openclaude": "^0.1.6",
42
42
  "@dzhechkov/adapter-opencode": "^0.2.6",
43
+ "@dzhechkov/adapter-gemini": "0.1.7",
44
+ "@dzhechkov/adapter-windsurf": "0.1.7",
43
45
  "@dzhechkov/core": "0.2.22",
44
- "@dzhechkov/adapter-openclaude": "^0.1.6",
45
- "@dzhechkov/memory": "0.2.19",
46
- "@dzhechkov/adapter-windsurf": "0.1.7"
46
+ "@dzhechkov/memory": "0.2.19"
47
47
  },
48
48
  "peerDependenciesMeta": {
49
49
  "@ruvector/rvf": {