@enterprise-skills/orchestrator 3.4.0 → 3.5.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/__tests__/context-gateway.test.d.ts +2 -0
- package/dist/__tests__/context-gateway.test.d.ts.map +1 -0
- package/dist/__tests__/context-gateway.test.js +184 -0
- package/dist/__tests__/context-gateway.test.js.map +1 -0
- package/dist/__tests__/lessons.test.d.ts +2 -0
- package/dist/__tests__/lessons.test.d.ts.map +1 -0
- package/dist/__tests__/lessons.test.js +117 -0
- package/dist/__tests__/lessons.test.js.map +1 -0
- package/dist/audit-logger.d.ts +1 -1
- package/dist/audit-logger.d.ts.map +1 -1
- package/dist/audit-logger.js +11 -1
- package/dist/audit-logger.js.map +1 -1
- package/dist/context-gateway.d.ts +98 -0
- package/dist/context-gateway.d.ts.map +1 -0
- package/dist/context-gateway.js +282 -0
- package/dist/context-gateway.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -1
- package/dist/index.js.map +1 -1
- package/dist/lessons.d.ts +65 -0
- package/dist/lessons.d.ts.map +1 -0
- package/dist/lessons.js +194 -0
- package/dist/lessons.js.map +1 -0
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-gateway.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/context-gateway.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const vitest_1 = require("vitest");
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const context_gateway_1 = require("../context-gateway");
|
|
41
|
+
let root;
|
|
42
|
+
function write(rel, content) {
|
|
43
|
+
const abs = path.join(root, rel);
|
|
44
|
+
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
45
|
+
fs.writeFileSync(abs, content, 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
/** Scaffold the six required pack files so pack-level gating passes. */
|
|
48
|
+
function writePack() {
|
|
49
|
+
for (const f of [
|
|
50
|
+
'PROJECT_PROFILE.yaml',
|
|
51
|
+
'ACTIVE_SKILLS.yaml',
|
|
52
|
+
'ACTIVE_RULES.yaml',
|
|
53
|
+
'MODEL_ROUTING.yaml',
|
|
54
|
+
'SESSION_POLICY.yaml',
|
|
55
|
+
]) {
|
|
56
|
+
write(`.project-ai/${f}`, 'placeholder: true\n');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
(0, vitest_1.beforeEach)(() => {
|
|
60
|
+
root = fs.mkdtempSync(path.join(os.tmpdir(), 'ctx-gate-'));
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.afterEach)(() => {
|
|
63
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.describe)('ContextGateway.gate', () => {
|
|
66
|
+
(0, vitest_1.it)('PASSes when every required doc is present and readable, and hashes each doc', () => {
|
|
67
|
+
writePack();
|
|
68
|
+
write('.project-ai/AUTHORITATIVE_DOCS.yaml', [
|
|
69
|
+
'session_start:',
|
|
70
|
+
' - path: README.md',
|
|
71
|
+
' required: true',
|
|
72
|
+
' - path: docs/OPTIONAL.md',
|
|
73
|
+
' required: false',
|
|
74
|
+
].join('\n'));
|
|
75
|
+
write('README.md', '# hello\n');
|
|
76
|
+
const receipt = new context_gateway_1.ContextGateway(root).gate({ phase: 'session_start', repoRevision: 'abc123' });
|
|
77
|
+
(0, vitest_1.expect)(receipt.verdict).toBe('PASS');
|
|
78
|
+
(0, vitest_1.expect)(receipt.blocked_reasons).toEqual([]);
|
|
79
|
+
(0, vitest_1.expect)(receipt.repo_revision).toBe('abc123');
|
|
80
|
+
const readme = receipt.docs.find((d) => d.path === 'README.md');
|
|
81
|
+
(0, vitest_1.expect)(readme?.status).toBe('ok');
|
|
82
|
+
(0, vitest_1.expect)(readme?.sha256).toMatch(/^[0-9a-f]{64}$/);
|
|
83
|
+
// optional missing doc is reported but does not block
|
|
84
|
+
const optional = receipt.docs.find((d) => d.path === 'docs/OPTIONAL.md');
|
|
85
|
+
(0, vitest_1.expect)(optional?.status).toBe('missing');
|
|
86
|
+
// receipt is written and self-hashed
|
|
87
|
+
const onDisk = JSON.parse(fs.readFileSync(path.join(root, '.project-ai', 'CONTEXT_RECEIPT.json'), 'utf-8'));
|
|
88
|
+
(0, vitest_1.expect)(onDisk.receipt_sha256).toBe(receipt.receipt_sha256);
|
|
89
|
+
(0, vitest_1.expect)(receipt.execution_id).toMatch(/^ctx-\d+-[0-9a-f]{8}$/);
|
|
90
|
+
});
|
|
91
|
+
(0, vitest_1.it)('BLOCKs when a required doc is missing, empty, or the docs file itself is absent', () => {
|
|
92
|
+
writePack();
|
|
93
|
+
write('.project-ai/AUTHORITATIVE_DOCS.yaml', [
|
|
94
|
+
'session_start:',
|
|
95
|
+
' - path: MISSING.md',
|
|
96
|
+
' required: true',
|
|
97
|
+
' - path: EMPTY.md',
|
|
98
|
+
' required: true',
|
|
99
|
+
].join('\n'));
|
|
100
|
+
write('EMPTY.md', '');
|
|
101
|
+
const receipt = new context_gateway_1.ContextGateway(root).gate({ phase: 'session_start' });
|
|
102
|
+
(0, vitest_1.expect)(receipt.verdict).toBe('BLOCK');
|
|
103
|
+
(0, vitest_1.expect)(receipt.blocked_reasons.join(' ')).toContain('MISSING.md');
|
|
104
|
+
(0, vitest_1.expect)(receipt.blocked_reasons.join(' ')).toContain('EMPTY.md');
|
|
105
|
+
// no AUTHORITATIVE_DOCS.yaml at all → BLOCK (pack file is itself required)
|
|
106
|
+
const bare = fs.mkdtempSync(path.join(os.tmpdir(), 'ctx-bare-'));
|
|
107
|
+
try {
|
|
108
|
+
const r2 = new context_gateway_1.ContextGateway(bare).gate();
|
|
109
|
+
(0, vitest_1.expect)(r2.verdict).toBe('BLOCK');
|
|
110
|
+
(0, vitest_1.expect)(r2.blocked_reasons.join(' ')).toContain('AUTHORITATIVE_DOCS.yaml');
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
fs.rmSync(bare, { recursive: true, force: true });
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
(0, vitest_1.it)('detects stale docs via max_age_days and blocks when they are required', () => {
|
|
117
|
+
writePack();
|
|
118
|
+
write('.project-ai/AUTHORITATIVE_DOCS.yaml', [
|
|
119
|
+
'session_start:',
|
|
120
|
+
' - path: CHARTER.md',
|
|
121
|
+
' required: true',
|
|
122
|
+
' max_age_days: 30',
|
|
123
|
+
].join('\n'));
|
|
124
|
+
write('CHARTER.md', 'binding standards\n');
|
|
125
|
+
const old = new Date(Date.now() - 60 * 24 * 60 * 60 * 1000);
|
|
126
|
+
fs.utimesSync(path.join(root, 'CHARTER.md'), old, old);
|
|
127
|
+
const receipt = new context_gateway_1.ContextGateway(root).gate({ phase: 'session_start' });
|
|
128
|
+
(0, vitest_1.expect)(receipt.docs.find((d) => d.path === 'CHARTER.md')?.status).toBe('stale');
|
|
129
|
+
(0, vitest_1.expect)(receipt.verdict).toBe('BLOCK');
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.it)('resolves duplicate declarations deterministically and records the conflict', () => {
|
|
132
|
+
writePack();
|
|
133
|
+
write('.project-ai/AUTHORITATIVE_DOCS.yaml', [
|
|
134
|
+
'session_start:',
|
|
135
|
+
' - path: specs/ARCH.md',
|
|
136
|
+
' required: false',
|
|
137
|
+
' authority: 4',
|
|
138
|
+
'before_code_changes:',
|
|
139
|
+
' - path: specs/ARCH.md',
|
|
140
|
+
' required: true',
|
|
141
|
+
' authority: 2',
|
|
142
|
+
].join('\n'));
|
|
143
|
+
write('specs/ARCH.md', 'architecture\n');
|
|
144
|
+
const receipt = new context_gateway_1.ContextGateway(root).gate({ phase: 'all' });
|
|
145
|
+
const doc = receipt.docs.find((d) => d.path === 'specs/ARCH.md');
|
|
146
|
+
(0, vitest_1.expect)(doc?.required).toBe(true); // required=true wins
|
|
147
|
+
(0, vitest_1.expect)(doc?.authority_level).toBe(2); // higher authority (lower number) wins
|
|
148
|
+
(0, vitest_1.expect)(receipt.conflicts.length).toBe(2);
|
|
149
|
+
(0, vitest_1.expect)(receipt.verdict).toBe('PASS');
|
|
150
|
+
});
|
|
151
|
+
(0, vitest_1.it)('applies deterministic authority defaults by path', () => {
|
|
152
|
+
(0, vitest_1.expect)((0, context_gateway_1.defaultAuthorityLevel)('specs/ARCHITECTURE.md')).toBe(2);
|
|
153
|
+
(0, vitest_1.expect)((0, context_gateway_1.defaultAuthorityLevel)('.project-ai/PROJECT_PROFILE.yaml')).toBe(3);
|
|
154
|
+
(0, vitest_1.expect)((0, context_gateway_1.defaultAuthorityLevel)('.cursor/rules/model-governance.mdc')).toBe(3);
|
|
155
|
+
(0, vitest_1.expect)((0, context_gateway_1.defaultAuthorityLevel)('docs/ARCHITECTURE_NOTES.md')).toBe(2);
|
|
156
|
+
(0, vitest_1.expect)((0, context_gateway_1.defaultAuthorityLevel)('README.md')).toBe(3);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
(0, vitest_1.describe)('ContextGateway.verify', () => {
|
|
160
|
+
(0, vitest_1.it)('is CLEAN when nothing changed and reports DRIFT when an attested doc changes or vanishes', () => {
|
|
161
|
+
writePack();
|
|
162
|
+
write('.project-ai/AUTHORITATIVE_DOCS.yaml', [
|
|
163
|
+
'session_start:',
|
|
164
|
+
' - path: README.md',
|
|
165
|
+
' required: true',
|
|
166
|
+
' - path: NOTES.md',
|
|
167
|
+
' required: true',
|
|
168
|
+
].join('\n'));
|
|
169
|
+
write('README.md', 'v1\n');
|
|
170
|
+
write('NOTES.md', 'notes\n');
|
|
171
|
+
const gw = new context_gateway_1.ContextGateway(root);
|
|
172
|
+
const receipt = gw.gate({ phase: 'session_start' });
|
|
173
|
+
(0, vitest_1.expect)(receipt.verdict).toBe('PASS');
|
|
174
|
+
(0, vitest_1.expect)(gw.verify().verdict).toBe('CLEAN');
|
|
175
|
+
write('README.md', 'v2 — changed\n');
|
|
176
|
+
fs.rmSync(path.join(root, 'NOTES.md'));
|
|
177
|
+
const result = gw.verify();
|
|
178
|
+
(0, vitest_1.expect)(result.verdict).toBe('DRIFT');
|
|
179
|
+
(0, vitest_1.expect)(result.drift.find((d) => d.path === 'README.md')?.kind).toBe('changed');
|
|
180
|
+
(0, vitest_1.expect)(result.drift.find((d) => d.path === 'NOTES.md')?.kind).toBe('missing');
|
|
181
|
+
(0, vitest_1.expect)(result.receipt_execution_id).toBe(receipt.execution_id);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=context-gateway.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-gateway.test.js","sourceRoot":"","sources":["../../src/__tests__/context-gateway.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lessons.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/lessons.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const vitest_1 = require("vitest");
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const lessons_1 = require("../lessons");
|
|
41
|
+
let root;
|
|
42
|
+
const VALID = {
|
|
43
|
+
title: 'Scrollwidth probe missed clipped cards',
|
|
44
|
+
defect: 'Mobile cards clipped by overflow-hidden were invisible to the scrollWidth check.',
|
|
45
|
+
rootCauses: ['testing-gap', 'unsafe-assumption'],
|
|
46
|
+
correctiveAction: 'Verify layout with a per-element clip-edge probe at both breakpoints.',
|
|
47
|
+
scope: 'pattern',
|
|
48
|
+
};
|
|
49
|
+
(0, vitest_1.beforeEach)(() => {
|
|
50
|
+
root = fs.mkdtempSync(path.join(os.tmpdir(), 'lessons-'));
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.afterEach)(() => {
|
|
53
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.describe)('validateLessonInput', () => {
|
|
56
|
+
(0, vitest_1.it)('accepts a complete lesson and rejects missing fields and unknown causes', () => {
|
|
57
|
+
(0, vitest_1.expect)((0, lessons_1.validateLessonInput)(VALID)).toEqual([]);
|
|
58
|
+
const bad = (0, lessons_1.validateLessonInput)({
|
|
59
|
+
...VALID,
|
|
60
|
+
title: ' ',
|
|
61
|
+
rootCauses: ['made-up-cause'],
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.expect)(bad.map((e) => e.field)).toContain('title');
|
|
64
|
+
(0, vitest_1.expect)(bad.map((e) => e.field)).toContain('root_causes');
|
|
65
|
+
});
|
|
66
|
+
(0, vitest_1.it)('taxonomy matches the nine ESAGS causes', () => {
|
|
67
|
+
(0, vitest_1.expect)(lessons_1.RCA_CAUSES).toHaveLength(9);
|
|
68
|
+
(0, vitest_1.expect)(lessons_1.RCA_CAUSES).toContain('missing-context');
|
|
69
|
+
(0, vitest_1.expect)(lessons_1.RCA_CAUSES).toContain('unsafe-assumption');
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.describe)('LessonStore', () => {
|
|
73
|
+
(0, vitest_1.it)('records a proposed lesson to a yaml file with a dated id', () => {
|
|
74
|
+
const store = new lessons_1.LessonStore(root);
|
|
75
|
+
const rec = store.record({ ...VALID, sourceExecutionId: 'ctx-123-abcd0000' });
|
|
76
|
+
(0, vitest_1.expect)(rec.status).toBe('proposed');
|
|
77
|
+
(0, vitest_1.expect)(rec.id).toMatch(/^lesson-\d{8}-scrollwidth-probe/);
|
|
78
|
+
(0, vitest_1.expect)(rec.source_execution_id).toBe('ctx-123-abcd0000');
|
|
79
|
+
(0, vitest_1.expect)(fs.existsSync(path.join(root, '.project-ai', 'lessons', `${rec.id}.yaml`))).toBe(true);
|
|
80
|
+
// duplicate title on the same day gets a distinct id
|
|
81
|
+
const rec2 = store.record(VALID);
|
|
82
|
+
(0, vitest_1.expect)(rec2.id).not.toBe(rec.id);
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('rejects invalid input at record time', () => {
|
|
85
|
+
const store = new lessons_1.LessonStore(root);
|
|
86
|
+
(0, vitest_1.expect)(() => store.record({ ...VALID, rootCauses: [] })).toThrow(/root cause/i);
|
|
87
|
+
});
|
|
88
|
+
(0, vitest_1.it)('approve promotes only proposed lessons and attributes the approval', () => {
|
|
89
|
+
const store = new lessons_1.LessonStore(root);
|
|
90
|
+
const rec = store.record(VALID);
|
|
91
|
+
const approved = store.approve(rec.id, 'owner');
|
|
92
|
+
(0, vitest_1.expect)(approved.status).toBe('approved');
|
|
93
|
+
(0, vitest_1.expect)(approved.approved_by).toBe('owner');
|
|
94
|
+
(0, vitest_1.expect)(approved.approved_at).toBeTruthy();
|
|
95
|
+
// terminal states cannot transition again
|
|
96
|
+
(0, vitest_1.expect)(() => store.approve(rec.id, 'owner')).toThrow(/only proposed/);
|
|
97
|
+
});
|
|
98
|
+
(0, vitest_1.it)('reject requires an actor and a reason', () => {
|
|
99
|
+
const store = new lessons_1.LessonStore(root);
|
|
100
|
+
const rec = store.record(VALID);
|
|
101
|
+
(0, vitest_1.expect)(() => store.reject(rec.id, 'owner', '')).toThrow(/reason/i);
|
|
102
|
+
const rejected = store.reject(rec.id, 'owner', 'duplicate of an approved lesson');
|
|
103
|
+
(0, vitest_1.expect)(rejected.status).toBe('rejected');
|
|
104
|
+
(0, vitest_1.expect)(rejected.rejection_reason).toContain('duplicate');
|
|
105
|
+
});
|
|
106
|
+
(0, vitest_1.it)('list filters by status and scope', () => {
|
|
107
|
+
const store = new lessons_1.LessonStore(root);
|
|
108
|
+
const a = store.record(VALID);
|
|
109
|
+
store.record({ ...VALID, title: 'Second lesson', scope: 'enterprise' });
|
|
110
|
+
store.approve(a.id, 'owner');
|
|
111
|
+
(0, vitest_1.expect)(store.list()).toHaveLength(2);
|
|
112
|
+
(0, vitest_1.expect)(store.list({ status: 'approved' })).toHaveLength(1);
|
|
113
|
+
(0, vitest_1.expect)(store.list({ scope: 'enterprise' })).toHaveLength(1);
|
|
114
|
+
(0, vitest_1.expect)(store.list({ status: 'rejected' })).toHaveLength(0);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=lessons.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lessons.test.js","sourceRoot":"","sources":["../../src/__tests__/lessons.test.ts"],"names":[],"mappings":"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"}
|
package/dist/audit-logger.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export declare class AuditLogger {
|
|
|
5
5
|
constructor(logPath: string);
|
|
6
6
|
private getLastHash;
|
|
7
7
|
private computeHash;
|
|
8
|
-
log(sessionId: string, eventType: AuditEntry['event_type'], details: Record<string, unknown>, skillId?: string, workflowId?: string): AuditEntry;
|
|
8
|
+
log(sessionId: string, eventType: AuditEntry['event_type'], details: Record<string, unknown>, skillId?: string, workflowId?: string, execution?: Partial<Pick<AuditEntry, 'execution_id' | 'model' | 'model_version' | 'repo_revision' | 'context_receipt_hash'>>): AuditEntry;
|
|
9
9
|
verify(): {
|
|
10
10
|
valid: boolean;
|
|
11
11
|
entries: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../src/audit-logger.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA8E;gBAEtF,OAAO,EAAE,MAAM;IAW3B,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,WAAW;IAKnB,GAAG,CACD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,UAAU,CAAC,YAAY,CAAC,EACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"audit-logger.d.ts","sourceRoot":"","sources":["../src/audit-logger.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA8E;gBAEtF,OAAO,EAAE,MAAM;IAW3B,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,WAAW;IAKnB,GAAG,CACD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,UAAU,CAAC,YAAY,CAAC,EACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,OAAO,CACjB,IAAI,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,GAAG,eAAe,GAAG,eAAe,GAAG,sBAAsB,CAAC,CACxG,GACA,UAAU;IAuBb,MAAM,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IAuBpE,UAAU,CAAC,MAAM,CAAC,EAAE;QAClB,UAAU,CAAC,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;QACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,UAAU,EAAE;CAmBjB"}
|
package/dist/audit-logger.js
CHANGED
|
@@ -68,7 +68,7 @@ class AuditLogger {
|
|
|
68
68
|
const payload = JSON.stringify(entry) + this.previousHash;
|
|
69
69
|
return (0, crypto_1.createHash)('sha256').update(payload).digest('hex');
|
|
70
70
|
}
|
|
71
|
-
log(sessionId, eventType, details, skillId, workflowId) {
|
|
71
|
+
log(sessionId, eventType, details, skillId, workflowId, execution) {
|
|
72
72
|
const partial = {
|
|
73
73
|
timestamp: new Date().toISOString(),
|
|
74
74
|
session_id: sessionId,
|
|
@@ -79,6 +79,16 @@ class AuditLogger {
|
|
|
79
79
|
partial.skill_id = skillId;
|
|
80
80
|
if (workflowId)
|
|
81
81
|
partial.workflow_id = workflowId;
|
|
82
|
+
if (execution?.execution_id)
|
|
83
|
+
partial.execution_id = execution.execution_id;
|
|
84
|
+
if (execution?.model)
|
|
85
|
+
partial.model = execution.model;
|
|
86
|
+
if (execution?.model_version)
|
|
87
|
+
partial.model_version = execution.model_version;
|
|
88
|
+
if (execution?.repo_revision)
|
|
89
|
+
partial.repo_revision = execution.repo_revision;
|
|
90
|
+
if (execution?.context_receipt_hash)
|
|
91
|
+
partial.context_receipt_hash = execution.context_receipt_hash;
|
|
82
92
|
const hash = this.computeHash(partial);
|
|
83
93
|
const entry = { ...partial, integrity_hash: hash };
|
|
84
94
|
fs.appendFileSync(this.logPath, JSON.stringify(entry) + '\n', 'utf-8');
|
package/dist/audit-logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../src/audit-logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAoC;AACpC,uCAAyB;AACzB,2CAA6B;AAG7B,MAAa,WAAW;IACd,OAAO,CAAS;IAChB,YAAY,GAAW,kEAAkE,CAAC;IAElG,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9D,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC,YAAY,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,MAAM,KAAK,GAAe,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC,cAAc,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,KAAyC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;QAC1D,OAAO,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,GAAG,CACD,SAAiB,EACjB,SAAmC,EACnC,OAAgC,EAChC,OAAgB,EAChB,UAAmB;
|
|
1
|
+
{"version":3,"file":"audit-logger.js","sourceRoot":"","sources":["../src/audit-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { DocPhase } from './preflight-resolver';
|
|
2
|
+
/**
|
|
3
|
+
* Mandatory Context Gateway (ESAGS "Mandatory Context Gateway").
|
|
4
|
+
*
|
|
5
|
+
* Platform-code enforcement of authoritative-context loading: discovers the
|
|
6
|
+
* documents a phase requires, verifies each was actually retrievable (not
|
|
7
|
+
* missing, empty, unreadable, or stale), resolves the ESAGS authority
|
|
8
|
+
* hierarchy deterministically, and emits a hashed Context Receipt. A BLOCK
|
|
9
|
+
* verdict means required context is unavailable and execution must not
|
|
10
|
+
* proceed — the CLI surfaces this as a non-zero exit so no prompt compliance
|
|
11
|
+
* is involved.
|
|
12
|
+
*
|
|
13
|
+
* The preflight resolver keeps its advisory role (which docs a task needs);
|
|
14
|
+
* the gateway is the enforcement + evidence layer on top of the same
|
|
15
|
+
* AUTHORITATIVE_DOCS.yaml source. Do not fork the schema between them.
|
|
16
|
+
*/
|
|
17
|
+
/** ESAGS authority hierarchy. Lower number = higher authority. */
|
|
18
|
+
export type AuthorityLevel = 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
19
|
+
export declare const AUTHORITY_LEVEL_NAMES: Record<AuthorityLevel, string>;
|
|
20
|
+
export type ContextDocStatus = 'ok' | 'missing' | 'unreadable' | 'empty' | 'stale';
|
|
21
|
+
export interface ContextDocEntry {
|
|
22
|
+
path: string;
|
|
23
|
+
phase: string;
|
|
24
|
+
required: boolean;
|
|
25
|
+
authority_level: AuthorityLevel;
|
|
26
|
+
/** True when the level came from path defaults rather than an explicit `authority` field. */
|
|
27
|
+
authority_defaulted: boolean;
|
|
28
|
+
status: ContextDocStatus;
|
|
29
|
+
bytes: number | null;
|
|
30
|
+
sha256: string | null;
|
|
31
|
+
modified_at: string | null;
|
|
32
|
+
note?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ContextReceipt {
|
|
35
|
+
schema: 'esags-context-receipt';
|
|
36
|
+
version: 1;
|
|
37
|
+
execution_id: string;
|
|
38
|
+
generated_at: string;
|
|
39
|
+
phase: string;
|
|
40
|
+
repo_revision: string | null;
|
|
41
|
+
model: string | null;
|
|
42
|
+
model_version: string | null;
|
|
43
|
+
docs: ContextDocEntry[];
|
|
44
|
+
/** Deterministically resolved conflicts (same doc, contradictory declarations). */
|
|
45
|
+
conflicts: string[];
|
|
46
|
+
verdict: 'PASS' | 'BLOCK';
|
|
47
|
+
blocked_reasons: string[];
|
|
48
|
+
receipt_sha256: string;
|
|
49
|
+
}
|
|
50
|
+
export interface ContextGateOptions {
|
|
51
|
+
/** Doc phase to gate, or 'all' for the union of every phase in the file. */
|
|
52
|
+
phase?: DocPhase | 'all';
|
|
53
|
+
repoRevision?: string | null;
|
|
54
|
+
model?: string | null;
|
|
55
|
+
modelVersion?: string | null;
|
|
56
|
+
/** Write .project-ai/CONTEXT_RECEIPT.json (default true). */
|
|
57
|
+
writeReceipt?: boolean;
|
|
58
|
+
now?: Date;
|
|
59
|
+
}
|
|
60
|
+
export interface ContextDrift {
|
|
61
|
+
path: string;
|
|
62
|
+
kind: 'changed' | 'missing';
|
|
63
|
+
expected_sha256: string | null;
|
|
64
|
+
actual_sha256: string | null;
|
|
65
|
+
}
|
|
66
|
+
export interface ContextVerifyResult {
|
|
67
|
+
receipt_execution_id: string;
|
|
68
|
+
verdict: 'CLEAN' | 'DRIFT';
|
|
69
|
+
drift: ContextDrift[];
|
|
70
|
+
}
|
|
71
|
+
/** Deterministic path-based default when no explicit `authority` is declared. */
|
|
72
|
+
export declare function defaultAuthorityLevel(docPath: string): AuthorityLevel;
|
|
73
|
+
export declare class ContextGateway {
|
|
74
|
+
private readonly projectRoot;
|
|
75
|
+
constructor(projectRoot: string);
|
|
76
|
+
private stateDir;
|
|
77
|
+
receiptPath(): string;
|
|
78
|
+
/**
|
|
79
|
+
* Discover, read, and verify the authoritative context for a phase and
|
|
80
|
+
* emit the Context Receipt. Never throws for content problems — those
|
|
81
|
+
* become a BLOCK verdict; only truly unexpected IO errors propagate.
|
|
82
|
+
*/
|
|
83
|
+
gate(options?: ContextGateOptions): ContextReceipt;
|
|
84
|
+
/**
|
|
85
|
+
* Recompute the hashes of every doc a receipt attested and report drift.
|
|
86
|
+
* Supports the ESAGS reproducibility requirement: a later execution can
|
|
87
|
+
* prove whether it ran against the same authoritative context.
|
|
88
|
+
*/
|
|
89
|
+
verify(receiptFile?: string): ContextVerifyResult;
|
|
90
|
+
/**
|
|
91
|
+
* Union of the implicit authority-pack files and the declarations for the
|
|
92
|
+
* requested phase(s), deduped with deterministic conflict resolution:
|
|
93
|
+
* required=true wins, and the higher authority (lower number) wins.
|
|
94
|
+
*/
|
|
95
|
+
private collectDeclarations;
|
|
96
|
+
private inspectDoc;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=context-gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-gateway.d.ts","sourceRoot":"","sources":["../src/context-gateway.ts"],"names":[],"mappings":"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"}
|