@enterprise-skills/orchestrator 3.2.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__/advisor.test.d.ts +2 -0
- package/dist/__tests__/advisor.test.d.ts.map +1 -0
- package/dist/__tests__/advisor.test.js +92 -0
- package/dist/__tests__/advisor.test.js.map +1 -0
- package/dist/__tests__/audit-logger.test.d.ts +2 -0
- package/dist/__tests__/audit-logger.test.d.ts.map +1 -0
- package/dist/__tests__/audit-logger.test.js +115 -0
- package/dist/__tests__/audit-logger.test.js.map +1 -0
- package/dist/__tests__/dag-resolver.test.d.ts +2 -0
- package/dist/__tests__/dag-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/dag-resolver.test.js +297 -0
- package/dist/__tests__/dag-resolver.test.js.map +1 -0
- package/dist/__tests__/orchestrator.test.d.ts +2 -0
- package/dist/__tests__/orchestrator.test.d.ts.map +1 -0
- package/dist/__tests__/orchestrator.test.js +152 -0
- package/dist/__tests__/orchestrator.test.js.map +1 -0
- package/dist/__tests__/policy-enforcer.test.d.ts +2 -0
- package/dist/__tests__/policy-enforcer.test.d.ts.map +1 -0
- package/dist/__tests__/policy-enforcer.test.js +113 -0
- package/dist/__tests__/policy-enforcer.test.js.map +1 -0
- package/dist/__tests__/signal-router.test.d.ts +2 -0
- package/dist/__tests__/signal-router.test.d.ts.map +1 -0
- package/dist/__tests__/signal-router.test.js +96 -0
- package/dist/__tests__/signal-router.test.js.map +1 -0
- package/dist/__tests__/state-machine.test.d.ts +2 -0
- package/dist/__tests__/state-machine.test.d.ts.map +1 -0
- package/dist/__tests__/state-machine.test.js +278 -0
- package/dist/__tests__/state-machine.test.js.map +1 -0
- package/dist/advisor.d.ts +41 -0
- package/dist/advisor.d.ts.map +1 -0
- package/dist/advisor.js +268 -0
- package/dist/advisor.js.map +1 -0
- package/dist/api/handlers.d.ts +28 -0
- package/dist/api/handlers.d.ts.map +1 -0
- package/dist/api/handlers.js +305 -0
- package/dist/api/handlers.js.map +1 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +20 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/routes/complete.d.ts +9 -0
- package/dist/api/routes/complete.d.ts.map +1 -0
- package/dist/api/routes/complete.js +34 -0
- package/dist/api/routes/complete.js.map +1 -0
- package/dist/api/routes/dashboard.d.ts +9 -0
- package/dist/api/routes/dashboard.d.ts.map +1 -0
- package/dist/api/routes/dashboard.js +29 -0
- package/dist/api/routes/dashboard.js.map +1 -0
- package/dist/api/routes/execute.d.ts +10 -0
- package/dist/api/routes/execute.d.ts.map +1 -0
- package/dist/api/routes/execute.js +35 -0
- package/dist/api/routes/execute.js.map +1 -0
- package/dist/api/routes/gate.d.ts +9 -0
- package/dist/api/routes/gate.d.ts.map +1 -0
- package/dist/api/routes/gate.js +34 -0
- package/dist/api/routes/gate.js.map +1 -0
- package/dist/api/routes/index.d.ts +7 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/index.js +19 -0
- package/dist/api/routes/index.js.map +1 -0
- package/dist/api/routes/middleware.d.ts +13 -0
- package/dist/api/routes/middleware.d.ts.map +1 -0
- package/dist/api/routes/middleware.js +55 -0
- package/dist/api/routes/middleware.js.map +1 -0
- package/dist/api/routes/signal.d.ts +9 -0
- package/dist/api/routes/signal.d.ts.map +1 -0
- package/dist/api/routes/signal.js +34 -0
- package/dist/api/routes/signal.js.map +1 -0
- package/dist/api/types.d.ts +87 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +3 -0
- package/dist/api/types.js.map +1 -0
- package/dist/audit-logger.d.ts +20 -0
- package/dist/audit-logger.d.ts.map +1 -0
- package/dist/audit-logger.js +125 -0
- package/dist/audit-logger.js.map +1 -0
- package/dist/builtin-triggers.d.ts +3 -0
- package/dist/builtin-triggers.d.ts.map +1 -0
- package/dist/builtin-triggers.js +235 -0
- package/dist/builtin-triggers.js.map +1 -0
- package/dist/dag-resolver.d.ts +22 -0
- package/dist/dag-resolver.d.ts.map +1 -0
- package/dist/dag-resolver.js +250 -0
- package/dist/dag-resolver.js.map +1 -0
- package/dist/hardening-sensors.d.ts +22 -0
- package/dist/hardening-sensors.d.ts.map +1 -0
- package/dist/hardening-sensors.js +135 -0
- package/dist/hardening-sensors.js.map +1 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +269 -0
- package/dist/index.js.map +1 -0
- package/dist/policy-enforcer.d.ts +27 -0
- package/dist/policy-enforcer.d.ts.map +1 -0
- package/dist/policy-enforcer.js +185 -0
- package/dist/policy-enforcer.js.map +1 -0
- package/dist/signal-router.d.ts +19 -0
- package/dist/signal-router.d.ts.map +1 -0
- package/dist/signal-router.js +206 -0
- package/dist/signal-router.js.map +1 -0
- package/dist/state-machine.d.ts +45 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +300 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/task-contract.d.ts +46 -0
- package/dist/task-contract.d.ts.map +1 -0
- package/dist/task-contract.js +71 -0
- package/dist/task-contract.js.map +1 -0
- package/dist/types.d.ts +167 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1,152 @@
|
|
|
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 path = __importStar(require("path"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const index_1 = require("../index");
|
|
41
|
+
(0, vitest_1.describe)('Orchestrator (integration)', () => {
|
|
42
|
+
let tmpDir;
|
|
43
|
+
let orch;
|
|
44
|
+
(0, vitest_1.beforeEach)(() => {
|
|
45
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'orch-integ-'));
|
|
46
|
+
orch = new index_1.Orchestrator({ projectRoot: tmpDir, sessionId: 'test-sess-001' });
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.afterEach)(() => {
|
|
49
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)('initializes a session and returns context', () => {
|
|
52
|
+
const ctx = orch.startSession('test-project', 'main');
|
|
53
|
+
(0, vitest_1.expect)(ctx.session_id).toBe('test-sess-001');
|
|
54
|
+
(0, vitest_1.expect)(ctx.project).toBe('test-project');
|
|
55
|
+
});
|
|
56
|
+
(0, vitest_1.it)('performs gate check on empty session', () => {
|
|
57
|
+
orch.startSession('p', 'main');
|
|
58
|
+
const check = orch.gateCheck('code-review');
|
|
59
|
+
(0, vitest_1.expect)(check.allowed).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.it)('registers skill start and completion', () => {
|
|
62
|
+
orch.startSession('p', 'main');
|
|
63
|
+
const start = orch.registerSkillStart('security-audit');
|
|
64
|
+
(0, vitest_1.expect)(start.allowed).toBe(true);
|
|
65
|
+
(0, vitest_1.expect)(orch.getActiveSkillId()).toBe('security-audit');
|
|
66
|
+
const output = {
|
|
67
|
+
skill_id: 'security-audit',
|
|
68
|
+
executed_at: new Date().toISOString(),
|
|
69
|
+
status: 'completed',
|
|
70
|
+
duration_seconds: 15,
|
|
71
|
+
summary: '2 findings',
|
|
72
|
+
grade: 'B',
|
|
73
|
+
findings: [
|
|
74
|
+
{ id: 'SEC-001', severity: 'critical', type: 'auth_gap', description: 'missing auth', resolved: false },
|
|
75
|
+
],
|
|
76
|
+
metrics: { files_scanned: 30 },
|
|
77
|
+
downstream_signals: [],
|
|
78
|
+
};
|
|
79
|
+
const { context, signals } = orch.registerSkillComplete(output);
|
|
80
|
+
(0, vitest_1.expect)(context.skills_executed).toHaveLength(1);
|
|
81
|
+
(0, vitest_1.expect)(signals.some(s => s.to === 'incident-response')).toBe(true);
|
|
82
|
+
(0, vitest_1.expect)(orch.getActiveSkillId()).toBeNull();
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('runs a full workflow lifecycle', () => {
|
|
85
|
+
orch.startSession('p', 'main');
|
|
86
|
+
const workflow = {
|
|
87
|
+
name: 'test-wf',
|
|
88
|
+
description: 'A -> B',
|
|
89
|
+
version: '1.0',
|
|
90
|
+
steps: [
|
|
91
|
+
{ id: 'step-a', type: 'sequential', skill: 'session-start' },
|
|
92
|
+
{ id: 'step-b', type: 'sequential', skill: 'code-review', depends_on: ['step-a'] },
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
const wfState = orch.startWorkflow(workflow);
|
|
96
|
+
(0, vitest_1.expect)(wfState.status).toBe('running');
|
|
97
|
+
(0, vitest_1.expect)(wfState.steps_remaining).toEqual(['step-a', 'step-b']);
|
|
98
|
+
const next1 = orch.getNextWorkflowSteps(workflow);
|
|
99
|
+
(0, vitest_1.expect)(next1.ready.map(s => s.id)).toEqual(['step-a']);
|
|
100
|
+
const updated1 = orch.completeWorkflowStep('step-a', 'completed', 2, ['session-start']);
|
|
101
|
+
(0, vitest_1.expect)(updated1.steps_remaining).toEqual(['step-b']);
|
|
102
|
+
const next2 = orch.getNextWorkflowSteps(workflow);
|
|
103
|
+
(0, vitest_1.expect)(next2.ready.map(s => s.id)).toEqual(['step-b']);
|
|
104
|
+
const updated2 = orch.completeWorkflowStep('step-b', 'completed', 5, ['code-review']);
|
|
105
|
+
(0, vitest_1.expect)(updated2.status).toBe('completed');
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.it)('enforces gate checks with blocking signals', () => {
|
|
108
|
+
orch.startSession('p', 'main');
|
|
109
|
+
const output = {
|
|
110
|
+
skill_id: 'a',
|
|
111
|
+
executed_at: new Date().toISOString(),
|
|
112
|
+
status: 'completed',
|
|
113
|
+
duration_seconds: 1,
|
|
114
|
+
summary: '',
|
|
115
|
+
findings: [],
|
|
116
|
+
metrics: {},
|
|
117
|
+
downstream_signals: [
|
|
118
|
+
{ target_skill: 'b', signal: 'block', condition: 'conflict detected' },
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
orch.registerSkillComplete(output);
|
|
122
|
+
const check = orch.gateCheck('b');
|
|
123
|
+
(0, vitest_1.expect)(check.allowed).toBe(false);
|
|
124
|
+
(0, vitest_1.expect)(check.blockers[0]).toContain('Blocked by signal');
|
|
125
|
+
});
|
|
126
|
+
(0, vitest_1.it)('returns comprehensive status', () => {
|
|
127
|
+
orch.startSession('p', 'main');
|
|
128
|
+
const status = orch.getStatus();
|
|
129
|
+
(0, vitest_1.expect)(status.session).not.toBeNull();
|
|
130
|
+
(0, vitest_1.expect)(status.auditIntegrity.valid).toBe(true);
|
|
131
|
+
(0, vitest_1.expect)(status.pendingSignals).toHaveLength(0);
|
|
132
|
+
});
|
|
133
|
+
(0, vitest_1.it)('maintains audit log integrity across operations', () => {
|
|
134
|
+
orch.startSession('p', 'main');
|
|
135
|
+
orch.registerSkillStart('s1');
|
|
136
|
+
orch.registerSkillComplete({
|
|
137
|
+
skill_id: 's1',
|
|
138
|
+
executed_at: new Date().toISOString(),
|
|
139
|
+
status: 'completed',
|
|
140
|
+
duration_seconds: 1,
|
|
141
|
+
summary: '',
|
|
142
|
+
findings: [],
|
|
143
|
+
metrics: {},
|
|
144
|
+
downstream_signals: [],
|
|
145
|
+
});
|
|
146
|
+
orch.policyGateCheck('production_deploy');
|
|
147
|
+
const integrity = orch.audit.verify();
|
|
148
|
+
(0, vitest_1.expect)(integrity.valid).toBe(true);
|
|
149
|
+
(0, vitest_1.expect)(integrity.entries).toBeGreaterThanOrEqual(3);
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
//# sourceMappingURL=orchestrator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.test.js","sourceRoot":"","sources":["../../src/__tests__/orchestrator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-enforcer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/policy-enforcer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const policy_enforcer_1 = require("../policy-enforcer");
|
|
5
|
+
(0, vitest_1.describe)('PolicyEnforcer', () => {
|
|
6
|
+
(0, vitest_1.it)('allows actions with no matching gate', () => {
|
|
7
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
8
|
+
const result = enforcer.checkGate('some_random_action');
|
|
9
|
+
(0, vitest_1.expect)(result.allowed).toBe(true);
|
|
10
|
+
(0, vitest_1.expect)(result.gate_id).toBeNull();
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)('blocks production_deploy with require enforcement', () => {
|
|
13
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
14
|
+
const result = enforcer.checkGate('production_deploy');
|
|
15
|
+
(0, vitest_1.expect)(result.allowed).toBe(false);
|
|
16
|
+
(0, vitest_1.expect)(result.action).toBe('require');
|
|
17
|
+
(0, vitest_1.expect)(result.gate_id).toBe('gate-prod-deploy');
|
|
18
|
+
});
|
|
19
|
+
(0, vitest_1.it)('marks rls_policy_change as block enforcement', () => {
|
|
20
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
21
|
+
const result = enforcer.checkGate('rls_policy_change');
|
|
22
|
+
(0, vitest_1.expect)(result.allowed).toBe(false);
|
|
23
|
+
(0, vitest_1.expect)(result.action).toBe('block');
|
|
24
|
+
(0, vitest_1.expect)(result.bypass_available).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.it)('allows suggest-level actions', () => {
|
|
27
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
28
|
+
const result = enforcer.checkGate('workflow_auto_execute');
|
|
29
|
+
(0, vitest_1.expect)(result.allowed).toBe(true);
|
|
30
|
+
(0, vitest_1.expect)(result.action).toBe('suggest');
|
|
31
|
+
});
|
|
32
|
+
(0, vitest_1.describe)('bypass', () => {
|
|
33
|
+
(0, vitest_1.it)('accepts bypass with justification', () => {
|
|
34
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
35
|
+
const result = enforcer.bypass('gate-prod-deploy', 'Emergency hotfix');
|
|
36
|
+
(0, vitest_1.expect)(result.accepted).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.it)('rejects bypass without justification', () => {
|
|
39
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
40
|
+
const result = enforcer.bypass('gate-prod-deploy', '');
|
|
41
|
+
(0, vitest_1.expect)(result.accepted).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)('rejects bypass on block enforcement', () => {
|
|
44
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
45
|
+
const result = enforcer.bypass('gate-rls-change', 'I need to');
|
|
46
|
+
(0, vitest_1.expect)(result.accepted).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.it)('enforces max bypasses per session', () => {
|
|
49
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
50
|
+
enforcer.bypass('gate-prod-deploy', 'reason 1');
|
|
51
|
+
enforcer.bypass('gate-prod-deploy', 'reason 2');
|
|
52
|
+
enforcer.bypass('gate-prod-deploy', 'reason 3');
|
|
53
|
+
const result = enforcer.bypass('gate-prod-deploy', 'reason 4');
|
|
54
|
+
(0, vitest_1.expect)(result.accepted).toBe(false);
|
|
55
|
+
(0, vitest_1.expect)(result.reason).toContain('Maximum bypasses');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.describe)('checkPreExecution', () => {
|
|
59
|
+
(0, vitest_1.it)('allows skill with no blockers', () => {
|
|
60
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
61
|
+
const ctx = {
|
|
62
|
+
session_id: 's',
|
|
63
|
+
started_at: '',
|
|
64
|
+
project: 'p',
|
|
65
|
+
branch: 'main',
|
|
66
|
+
skills_executed: [],
|
|
67
|
+
workflow_active: null,
|
|
68
|
+
pending_signals: [],
|
|
69
|
+
last_updated: '',
|
|
70
|
+
};
|
|
71
|
+
const result = enforcer.checkPreExecution('any-skill', ctx);
|
|
72
|
+
(0, vitest_1.expect)(result.allowed).toBe(true);
|
|
73
|
+
(0, vitest_1.expect)(result.blockers).toHaveLength(0);
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.it)('blocks skill targeted by block signal', () => {
|
|
76
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
77
|
+
const ctx = {
|
|
78
|
+
session_id: 's',
|
|
79
|
+
started_at: '',
|
|
80
|
+
project: 'p',
|
|
81
|
+
branch: 'main',
|
|
82
|
+
skills_executed: [],
|
|
83
|
+
workflow_active: null,
|
|
84
|
+
pending_signals: [
|
|
85
|
+
{ from: 'a', to: 'target-skill', signal: 'block', condition: 'conflict' },
|
|
86
|
+
],
|
|
87
|
+
last_updated: '',
|
|
88
|
+
};
|
|
89
|
+
const result = enforcer.checkPreExecution('target-skill', ctx);
|
|
90
|
+
(0, vitest_1.expect)(result.allowed).toBe(false);
|
|
91
|
+
(0, vitest_1.expect)(result.blockers[0]).toContain('Blocked by signal');
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.it)('blocks when required skill has not run', () => {
|
|
94
|
+
const enforcer = new policy_enforcer_1.PolicyEnforcer();
|
|
95
|
+
const ctx = {
|
|
96
|
+
session_id: 's',
|
|
97
|
+
started_at: '',
|
|
98
|
+
project: 'p',
|
|
99
|
+
branch: 'main',
|
|
100
|
+
skills_executed: [],
|
|
101
|
+
workflow_active: null,
|
|
102
|
+
pending_signals: [
|
|
103
|
+
{ from: 'a', to: 'required-skill', signal: 'require', condition: 'must run' },
|
|
104
|
+
],
|
|
105
|
+
last_updated: '',
|
|
106
|
+
};
|
|
107
|
+
const result = enforcer.checkPreExecution('some-other-skill', ctx);
|
|
108
|
+
(0, vitest_1.expect)(result.allowed).toBe(false);
|
|
109
|
+
(0, vitest_1.expect)(result.blockers[0]).toContain('Required skill');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=policy-enforcer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-enforcer.test.js","sourceRoot":"","sources":["../../src/__tests__/policy-enforcer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-router.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/signal-router.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const signal_router_1 = require("../signal-router");
|
|
5
|
+
(0, vitest_1.describe)('SignalRouter', () => {
|
|
6
|
+
const router = new signal_router_1.SignalRouter();
|
|
7
|
+
function makeOutput(overrides = {}) {
|
|
8
|
+
return {
|
|
9
|
+
skill_id: 'test-skill',
|
|
10
|
+
executed_at: new Date().toISOString(),
|
|
11
|
+
status: 'completed',
|
|
12
|
+
duration_seconds: 5,
|
|
13
|
+
summary: 'test',
|
|
14
|
+
findings: [],
|
|
15
|
+
metrics: {},
|
|
16
|
+
downstream_signals: [],
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
(0, vitest_1.it)('loads built-in triggers', () => {
|
|
21
|
+
(0, vitest_1.expect)(router.getTriggerCount()).toBeGreaterThan(20);
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.it)('routes direct downstream signals from skill output', () => {
|
|
24
|
+
const output = makeOutput({
|
|
25
|
+
skill_id: 'my-skill',
|
|
26
|
+
downstream_signals: [
|
|
27
|
+
{ target_skill: 'next-skill', signal: 'suggest', condition: 'ready to go' },
|
|
28
|
+
],
|
|
29
|
+
});
|
|
30
|
+
const matched = router.processOutput(output);
|
|
31
|
+
(0, vitest_1.expect)(matched.length).toBeGreaterThanOrEqual(1);
|
|
32
|
+
(0, vitest_1.expect)(matched.some(m => m.to === 'next-skill' && m.signal === 'suggest')).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
(0, vitest_1.it)('matches critical vulnerability trigger', () => {
|
|
35
|
+
const output = makeOutput({
|
|
36
|
+
skill_id: 'security-audit',
|
|
37
|
+
findings: [
|
|
38
|
+
{ id: 'SEC-001', severity: 'critical', type: 'auth_gap', description: 'missing auth', resolved: false },
|
|
39
|
+
],
|
|
40
|
+
});
|
|
41
|
+
const matched = router.processOutput(output);
|
|
42
|
+
(0, vitest_1.expect)(matched.some(m => m.to === 'incident-response' && m.trigger_id === 'critical-vuln-to-incident')).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)('matches post-feature-review trigger', () => {
|
|
45
|
+
const output = makeOutput({ skill_id: 'feature-builder', status: 'completed' });
|
|
46
|
+
const matched = router.processOutput(output);
|
|
47
|
+
(0, vitest_1.expect)(matched.some(m => m.to === 'code-review')).toBe(true);
|
|
48
|
+
(0, vitest_1.expect)(matched.some(m => m.to === 'test-gap-analyzer')).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)('matches pre-deploy failure trigger', () => {
|
|
51
|
+
const output = makeOutput({ skill_id: 'pre-deploy-check', status: 'failed' });
|
|
52
|
+
const matched = router.processOutput(output);
|
|
53
|
+
(0, vitest_1.expect)(matched.some(m => m.to === 'bug-hunter' && m.urgency === 'high')).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('prioritizes by urgency then action', () => {
|
|
56
|
+
const output = makeOutput({
|
|
57
|
+
skill_id: 'test',
|
|
58
|
+
downstream_signals: [
|
|
59
|
+
{ target_skill: 'a', signal: 'suggest', condition: 'low' },
|
|
60
|
+
{ target_skill: 'b', signal: 'require', condition: 'urgent' },
|
|
61
|
+
{ target_skill: 'c', signal: 'block', condition: 'blocked' },
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
const matched = router.processOutput(output);
|
|
65
|
+
const blockIdx = matched.findIndex(m => m.signal === 'block');
|
|
66
|
+
const suggestIdx = matched.findIndex(m => m.signal === 'suggest');
|
|
67
|
+
if (blockIdx >= 0 && suggestIdx >= 0) {
|
|
68
|
+
(0, vitest_1.expect)(blockIdx).toBeLessThan(suggestIdx);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.it)('does not match trigger for wrong skill', () => {
|
|
72
|
+
const output = makeOutput({ skill_id: 'random-skill', status: 'completed' });
|
|
73
|
+
const matched = router.processOutput(output);
|
|
74
|
+
const featureReviewMatch = matched.find(m => m.trigger_id === 'post-feature-review');
|
|
75
|
+
(0, vitest_1.expect)(featureReviewMatch).toBeUndefined();
|
|
76
|
+
});
|
|
77
|
+
(0, vitest_1.it)('matches metrics-based trigger condition', () => {
|
|
78
|
+
const output = makeOutput({
|
|
79
|
+
skill_id: 'test-gap-analyzer',
|
|
80
|
+
metrics: { meaningful_coverage: 0.3 },
|
|
81
|
+
});
|
|
82
|
+
const matched = router.processOutput(output);
|
|
83
|
+
(0, vitest_1.expect)(matched.some(m => m.to === 'bootstrap-testing')).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.it)('matches exposed_secret trigger', () => {
|
|
86
|
+
const output = makeOutput({
|
|
87
|
+
skill_id: 'security-audit',
|
|
88
|
+
findings: [
|
|
89
|
+
{ id: 'S1', severity: 'critical', type: 'exposed_secret', description: 'API key in code', resolved: false },
|
|
90
|
+
],
|
|
91
|
+
});
|
|
92
|
+
const matched = router.processOutput(output);
|
|
93
|
+
(0, vitest_1.expect)(matched.some(m => m.to === 'rollback-manager' && m.trigger_id === 'secret-exposure-to-rollback')).toBe(true);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=signal-router.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-router.test.js","sourceRoot":"","sources":["../../src/__tests__/signal-router.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/state-machine.test.ts"],"names":[],"mappings":""}
|