@nirnex/cli 2.0.3 → 4.0.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/dist/commands/index.js +2 -2
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/query.js +2 -2
- package/dist/commands/query.js.map +1 -1
- package/dist/commands/runtime.d.ts +2 -0
- package/dist/commands/runtime.d.ts.map +1 -0
- package/dist/commands/runtime.js +60 -0
- package/dist/commands/runtime.js.map +1 -0
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +395 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +151 -20
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/trace.d.ts.map +1 -1
- package/dist/commands/trace.js +74 -1
- package/dist/commands/trace.js.map +1 -1
- package/dist/index.js +21 -10
- package/dist/index.js.map +1 -1
- package/dist/runtime/bootstrap.d.ts +2 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -0
- package/dist/runtime/bootstrap.js +90 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/entry.d.ts +2 -0
- package/dist/runtime/entry.d.ts.map +1 -0
- package/dist/runtime/entry.js +86 -0
- package/dist/runtime/entry.js.map +1 -0
- package/dist/runtime/envelope.d.ts +4 -0
- package/dist/runtime/envelope.d.ts.map +1 -0
- package/dist/runtime/envelope.js +113 -0
- package/dist/runtime/envelope.js.map +1 -0
- package/dist/runtime/guard.d.ts +2 -0
- package/dist/runtime/guard.d.ts.map +1 -0
- package/dist/runtime/guard.js +114 -0
- package/dist/runtime/guard.js.map +1 -0
- package/dist/runtime/session.d.ts +13 -0
- package/dist/runtime/session.d.ts.map +1 -0
- package/dist/runtime/session.js +111 -0
- package/dist/runtime/session.js.map +1 -0
- package/dist/runtime/trace-hook.d.ts +2 -0
- package/dist/runtime/trace-hook.d.ts.map +1 -0
- package/dist/runtime/trace-hook.js +102 -0
- package/dist/runtime/trace-hook.js.map +1 -0
- package/dist/runtime/types.d.ts +108 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/validate.d.ts +2 -0
- package/dist/runtime/validate.d.ts.map +1 -0
- package/dist/runtime/validate.js +91 -0
- package/dist/runtime/validate.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// Stop hook handler.
|
|
2
|
+
// Called when Claude thinks it is done with a task.
|
|
3
|
+
// Validates the active task envelope against the trace, and blocks completion
|
|
4
|
+
// if required conditions are not met.
|
|
5
|
+
import fs from 'node:fs';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { loadActiveEnvelope, loadTraceEvents } from './session.js';
|
|
8
|
+
function readStdin() {
|
|
9
|
+
return new Promise(resolve => {
|
|
10
|
+
let buf = '';
|
|
11
|
+
process.stdin.setEncoding('utf8');
|
|
12
|
+
process.stdin.on('data', chunk => { buf += chunk; });
|
|
13
|
+
process.stdin.on('end', () => resolve(buf));
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export async function runValidate() {
|
|
17
|
+
const raw = await readStdin();
|
|
18
|
+
let hookData = { session_id: 'unknown' };
|
|
19
|
+
try {
|
|
20
|
+
hookData = JSON.parse(raw || '{}');
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// Non-fatal
|
|
24
|
+
}
|
|
25
|
+
const repoRoot = process.env.NIRNEX_REPO_ROOT ?? process.cwd();
|
|
26
|
+
const sessionId = hookData.session_id ?? process.env.NIRNEX_SESSION_ID ?? '';
|
|
27
|
+
if (!fs.existsSync(path.join(repoRoot, 'nirnex.config.json'))) {
|
|
28
|
+
const out = { decision: 'allow' };
|
|
29
|
+
process.stdout.write(JSON.stringify(out));
|
|
30
|
+
process.exit(0);
|
|
31
|
+
}
|
|
32
|
+
const envelope = loadActiveEnvelope(repoRoot, sessionId);
|
|
33
|
+
// No active envelope → nothing to validate
|
|
34
|
+
if (!envelope) {
|
|
35
|
+
process.stdout.write(JSON.stringify({ decision: 'allow' }));
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
const events = loadTraceEvents(repoRoot, sessionId);
|
|
39
|
+
const reasons = [];
|
|
40
|
+
// If ECO was blocked, Claude should not have proceeded at all
|
|
41
|
+
if (envelope.eco_summary.blocked) {
|
|
42
|
+
reasons.push('Task was marked blocked by ECO — no changes should have been made');
|
|
43
|
+
}
|
|
44
|
+
// If ECO was forced unknown for a non-trivial task, require human verification
|
|
45
|
+
if (envelope.eco_summary.forced_unknown && envelope.lane !== 'A') {
|
|
46
|
+
reasons.push('Task confidence is insufficient (forced_unknown=true) — human verification required before accepting changes');
|
|
47
|
+
}
|
|
48
|
+
// Lane C: require at least one trace event (cannot stop without having done something traceable)
|
|
49
|
+
if (envelope.lane === 'C' && events.length === 0) {
|
|
50
|
+
reasons.push('Lane C task completed with no recorded tool events — trace is empty');
|
|
51
|
+
}
|
|
52
|
+
// Check for unresolved deviations in trace
|
|
53
|
+
const unresolvedDeviations = events
|
|
54
|
+
.flatMap(e => e.deviation_flags)
|
|
55
|
+
.filter(f => f.startsWith('file_in_blocked_path:'));
|
|
56
|
+
if (unresolvedDeviations.length > 0) {
|
|
57
|
+
reasons.push(`Unresolved blocked-path deviations: ${unresolvedDeviations.join(', ')}`);
|
|
58
|
+
}
|
|
59
|
+
// Check deadlock: Lane C with denied patterns triggered but required files unchanged
|
|
60
|
+
if (envelope.lane === 'C') {
|
|
61
|
+
const touchedFiles = new Set(events.flatMap(e => e.affected_files));
|
|
62
|
+
const expectedTouched = envelope.scope.modules_expected;
|
|
63
|
+
if (expectedTouched.length > 0) {
|
|
64
|
+
const anyExpectedTouched = expectedTouched.some(m => [...touchedFiles].some(f => f.includes(m)));
|
|
65
|
+
if (!anyExpectedTouched) {
|
|
66
|
+
reasons.push(`Lane C task expected changes in [${expectedTouched.join(', ')}] but no matching files were modified — possible deadlock or guard block`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (reasons.length > 0) {
|
|
71
|
+
const out = {
|
|
72
|
+
decision: 'block',
|
|
73
|
+
reason: `[Nirnex Validate] ${reasons.join(' | ')}`,
|
|
74
|
+
};
|
|
75
|
+
process.stdout.write(JSON.stringify(out));
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Mark envelope as completed
|
|
79
|
+
try {
|
|
80
|
+
envelope.status = 'completed';
|
|
81
|
+
const { saveEnvelope } = await import('./session.js');
|
|
82
|
+
saveEnvelope(repoRoot, envelope);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Non-fatal
|
|
86
|
+
}
|
|
87
|
+
process.stdout.write(JSON.stringify({ decision: 'allow' }));
|
|
88
|
+
}
|
|
89
|
+
process.exit(0);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/runtime/validate.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,oDAAoD;AACpD,8EAA8E;AAC9E,sCAAsC;AAEtC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGnE,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;IAE9B,IAAI,QAAQ,GAAa,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAa,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;IAE7E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAqB,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEzD,2CAA2C;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAsB,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,8DAA8D;IAC9D,IAAI,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IACpF,CAAC;IAED,+EAA+E;IAC/E,IAAI,QAAQ,CAAC,WAAW,CAAC,cAAc,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,8GAA8G,CAAC,CAAC;IAC/H,CAAC;IAED,iGAAiG;IACjG,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;IACtF,CAAC;IAED,2CAA2C;IAC3C,MAAM,oBAAoB,GAAG,MAAM;SAChC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEtD,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,uCAAuC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,qFAAqF;IACrF,IAAI,QAAQ,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QACpE,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC;QACxD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjG,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CACV,oCAAoC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,0EAA0E,CACzI,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,GAAG,GAAqB;YAC5B,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,qBAAqB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;SACnD,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,6BAA6B;QAC7B,IAAI,CAAC;YACH,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;YAC9B,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YACtD,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAsB,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|