@enterprise-skills/orchestrator 3.2.0 → 3.3.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/compliance/fedramp.yaml +30 -0
- package/compliance/gdpr.yaml +33 -0
- package/compliance/hipaa.yaml +29 -0
- package/compliance/iso27001.yaml +29 -0
- package/compliance/pcidss.yaml +24 -0
- package/compliance/soc2.yaml +33 -0
- package/dist/__tests__/compliance.test.d.ts +2 -0
- package/dist/__tests__/compliance.test.d.ts.map +1 -0
- package/dist/__tests__/compliance.test.js +148 -0
- package/dist/__tests__/compliance.test.js.map +1 -0
- package/dist/__tests__/preflight-resolver.test.d.ts +2 -0
- package/dist/__tests__/preflight-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/preflight-resolver.test.js +182 -0
- package/dist/__tests__/preflight-resolver.test.js.map +1 -0
- package/dist/__tests__/workflow-library.test.d.ts +2 -0
- package/dist/__tests__/workflow-library.test.d.ts.map +1 -0
- package/dist/__tests__/workflow-library.test.js +185 -0
- package/dist/__tests__/workflow-library.test.js.map +1 -0
- package/dist/compliance.d.ts +51 -0
- package/dist/compliance.d.ts.map +1 -0
- package/dist/compliance.js +160 -0
- package/dist/compliance.js.map +1 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +152 -1
- package/dist/index.js.map +1 -1
- package/dist/preflight-resolver.d.ts +58 -0
- package/dist/preflight-resolver.d.ts.map +1 -0
- package/dist/preflight-resolver.js +345 -0
- package/dist/preflight-resolver.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow-library.d.ts +14 -0
- package/dist/workflow-library.d.ts.map +1 -0
- package/dist/workflow-library.js +94 -0
- package/dist/workflow-library.js.map +1 -0
- package/package.json +4 -2
- package/workflows/beginner-launchpad.yaml +33 -0
- package/workflows/enterprise-control-plane.yaml +38 -0
- package/workflows/growth-engine.yaml +33 -0
- package/workflows/health-check.yaml +28 -0
- package/workflows/incident-triage.yaml +34 -0
- package/workflows/post-refactor.yaml +27 -0
- package/workflows/product-launch.yaml +54 -0
- package/workflows/release-readiness.yaml +62 -0
- package/workflows/security-assessment.yaml +60 -0
- package/workflows/sprint-close.yaml +30 -0
- package/workflows/ux-quality-review.yaml +33 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# FedRAMP Moderate (NIST 800-53 families) mapped to platform controls.
|
|
2
|
+
framework: FEDRAMP
|
|
3
|
+
name: FedRAMP Moderate (NIST 800-53 families)
|
|
4
|
+
requirements:
|
|
5
|
+
- id: AC
|
|
6
|
+
title: Access Control
|
|
7
|
+
controls: [CTL-POLICY, CTL-HOOKS]
|
|
8
|
+
- id: AU
|
|
9
|
+
title: Audit and Accountability
|
|
10
|
+
controls: [CTL-AUDIT]
|
|
11
|
+
partial: true
|
|
12
|
+
- id: CA
|
|
13
|
+
title: Assessment and Authorization
|
|
14
|
+
controls: []
|
|
15
|
+
- id: CM
|
|
16
|
+
title: Configuration Management
|
|
17
|
+
controls: [CTL-PACK, CTL-PRECOMMIT]
|
|
18
|
+
- id: IA
|
|
19
|
+
title: Identification and Authentication
|
|
20
|
+
controls: [CTL-POLICY]
|
|
21
|
+
partial: true
|
|
22
|
+
- id: RA
|
|
23
|
+
title: Risk Assessment
|
|
24
|
+
controls: [CTL-SPEC-AGENT, CTL-SPEC-ALIGN]
|
|
25
|
+
- id: SA
|
|
26
|
+
title: System and Services Acquisition
|
|
27
|
+
controls: [CTL-SPEC-ALIGN, CTL-DOCS]
|
|
28
|
+
- id: SI
|
|
29
|
+
title: System and Information Integrity
|
|
30
|
+
controls: [CTL-SPEC-RAG, CTL-LINT]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# GDPR key articles mapped to platform controls.
|
|
2
|
+
# Scope: AI-governance controls; lawful-basis, erasure, and breach
|
|
3
|
+
# notification are organizational processes the report surfaces as gaps.
|
|
4
|
+
framework: GDPR
|
|
5
|
+
name: GDPR (EU 2016/679, key articles)
|
|
6
|
+
requirements:
|
|
7
|
+
- id: Art.5
|
|
8
|
+
title: Data processing principles
|
|
9
|
+
controls: [CTL-SPEC-RAG, CTL-SPEC-ALIGN]
|
|
10
|
+
partial: true
|
|
11
|
+
- id: Art.6
|
|
12
|
+
title: Lawful basis for processing
|
|
13
|
+
controls: []
|
|
14
|
+
- id: Art.13-14
|
|
15
|
+
title: Transparency and information
|
|
16
|
+
controls: [CTL-SPEC-RAG]
|
|
17
|
+
partial: true
|
|
18
|
+
- id: Art.17
|
|
19
|
+
title: Right to erasure
|
|
20
|
+
controls: []
|
|
21
|
+
- id: Art.25
|
|
22
|
+
title: Data protection by design and by default
|
|
23
|
+
controls: [CTL-SPEC-ALIGN, CTL-PACK]
|
|
24
|
+
- id: Art.32
|
|
25
|
+
title: Security of processing
|
|
26
|
+
controls: [CTL-POLICY, CTL-DOCS, CTL-LINT]
|
|
27
|
+
- id: Art.33
|
|
28
|
+
title: Breach notification
|
|
29
|
+
controls: []
|
|
30
|
+
- id: Art.35
|
|
31
|
+
title: Data protection impact assessment
|
|
32
|
+
controls: [CTL-SPEC-ALIGN]
|
|
33
|
+
partial: true
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# HIPAA Security Rule mapped to platform controls.
|
|
2
|
+
# Scope: AI-governance controls only; PHI-specific safeguards (training,
|
|
3
|
+
# transmission security) are organizational gaps the report surfaces.
|
|
4
|
+
framework: HIPAA
|
|
5
|
+
name: HIPAA Security Rule
|
|
6
|
+
requirements:
|
|
7
|
+
- id: 164.308(a)(1)
|
|
8
|
+
title: Security management process
|
|
9
|
+
controls: [CTL-DOCS, CTL-SPEC-ALIGN]
|
|
10
|
+
- id: 164.308(a)(3)
|
|
11
|
+
title: Workforce security
|
|
12
|
+
controls: [CTL-POLICY]
|
|
13
|
+
partial: true
|
|
14
|
+
- id: 164.308(a)(4)
|
|
15
|
+
title: Information access management
|
|
16
|
+
controls: [CTL-POLICY, CTL-HOOKS]
|
|
17
|
+
- id: 164.308(a)(5)
|
|
18
|
+
title: Security awareness and training
|
|
19
|
+
controls: []
|
|
20
|
+
- id: 164.312(a)(1)
|
|
21
|
+
title: Access control
|
|
22
|
+
controls: [CTL-POLICY]
|
|
23
|
+
partial: true
|
|
24
|
+
- id: 164.312(c)(1)
|
|
25
|
+
title: Integrity controls
|
|
26
|
+
controls: [CTL-AUDIT, CTL-SPEC-RAG]
|
|
27
|
+
- id: 164.312(e)(1)
|
|
28
|
+
title: Transmission security
|
|
29
|
+
controls: []
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# ISO 27001:2022 Annex A (selected controls) mapped to platform controls.
|
|
2
|
+
framework: ISO27001
|
|
3
|
+
name: ISO 27001:2022 (Annex A, selected)
|
|
4
|
+
requirements:
|
|
5
|
+
- id: A.5.1
|
|
6
|
+
title: Information security policies
|
|
7
|
+
controls: [CTL-DOCS]
|
|
8
|
+
- id: A.5.2
|
|
9
|
+
title: Information security roles and responsibilities
|
|
10
|
+
controls: [CTL-POLICY]
|
|
11
|
+
partial: true
|
|
12
|
+
- id: A.6.1
|
|
13
|
+
title: Screening
|
|
14
|
+
controls: []
|
|
15
|
+
- id: A.8.1
|
|
16
|
+
title: User endpoint devices
|
|
17
|
+
na: true
|
|
18
|
+
- id: A.8.2
|
|
19
|
+
title: Privileged access rights
|
|
20
|
+
controls: [CTL-POLICY, CTL-HOOKS]
|
|
21
|
+
- id: A.8.9
|
|
22
|
+
title: Configuration management
|
|
23
|
+
controls: [CTL-PACK, CTL-PRECOMMIT]
|
|
24
|
+
- id: A.8.25
|
|
25
|
+
title: Secure development lifecycle
|
|
26
|
+
controls: [CTL-DOCS, CTL-PRECOMMIT, CTL-TESTS]
|
|
27
|
+
- id: A.8.28
|
|
28
|
+
title: Secure coding
|
|
29
|
+
controls: [CTL-LINT, CTL-SPEC-RAG]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# PCI DSS v4.0 (selected requirements) mapped to platform controls.
|
|
2
|
+
framework: PCIDSS
|
|
3
|
+
name: PCI DSS v4.0 (selected)
|
|
4
|
+
requirements:
|
|
5
|
+
- id: "1.1"
|
|
6
|
+
title: Network security controls
|
|
7
|
+
na: true
|
|
8
|
+
- id: "6.2"
|
|
9
|
+
title: Secure software development
|
|
10
|
+
controls: [CTL-DOCS, CTL-LINT]
|
|
11
|
+
- id: "6.3"
|
|
12
|
+
title: Security vulnerabilities identified and addressed
|
|
13
|
+
controls: [CTL-LINT, CTL-TESTS]
|
|
14
|
+
partial: true
|
|
15
|
+
- id: "7.1"
|
|
16
|
+
title: Access to system components restricted
|
|
17
|
+
controls: [CTL-POLICY]
|
|
18
|
+
- id: "10.1"
|
|
19
|
+
title: Logging and monitoring
|
|
20
|
+
controls: [CTL-AUDIT]
|
|
21
|
+
partial: true
|
|
22
|
+
- id: "12.1"
|
|
23
|
+
title: Information security policy
|
|
24
|
+
controls: [CTL-DOCS]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# SOC 2 Type II — Trust Service Criteria mapped to platform controls.
|
|
2
|
+
# Methodology: skills/compliance-mapper.md (Step 3). Scope: AI-governance
|
|
3
|
+
# controls this platform deploys — not a full-organization SOC 2 program.
|
|
4
|
+
framework: SOC2
|
|
5
|
+
name: SOC 2 Type II (Trust Service Criteria)
|
|
6
|
+
requirements:
|
|
7
|
+
- id: CC1.1
|
|
8
|
+
title: COSO principle - integrity and ethical values
|
|
9
|
+
controls: [CTL-SPEC-ALIGN, CTL-PACK]
|
|
10
|
+
partial: true
|
|
11
|
+
- id: CC2.1
|
|
12
|
+
title: Information quality for internal control
|
|
13
|
+
controls: [CTL-SPEC-RAG, CTL-AUDIT]
|
|
14
|
+
- id: CC3.1
|
|
15
|
+
title: Risk assessment process
|
|
16
|
+
controls: [CTL-SPEC-AGENT]
|
|
17
|
+
partial: true
|
|
18
|
+
- id: CC5.1
|
|
19
|
+
title: Control activities to mitigate risk
|
|
20
|
+
controls: [CTL-DOCS, CTL-PRECOMMIT]
|
|
21
|
+
- id: CC6.1
|
|
22
|
+
title: Logical access controls
|
|
23
|
+
controls: [CTL-POLICY, CTL-HOOKS]
|
|
24
|
+
- id: CC7.1
|
|
25
|
+
title: System monitoring
|
|
26
|
+
controls: [CTL-AUDIT, CTL-TESTS]
|
|
27
|
+
partial: true
|
|
28
|
+
- id: CC8.1
|
|
29
|
+
title: Change management
|
|
30
|
+
controls: [CTL-DOCS, CTL-PRECOMMIT]
|
|
31
|
+
- id: CC9.1
|
|
32
|
+
title: Risk mitigation
|
|
33
|
+
controls: [CTL-SPEC-AGENT, CTL-WORKFLOW]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/compliance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,148 @@
|
|
|
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 compliance_1 = require("../compliance");
|
|
41
|
+
const index_1 = require("../index");
|
|
42
|
+
(0, vitest_1.describe)('compliance engine', () => {
|
|
43
|
+
let tmpDir;
|
|
44
|
+
const write = (rel, content) => {
|
|
45
|
+
const full = path.join(tmpDir, rel);
|
|
46
|
+
fs.mkdirSync(path.dirname(full), { recursive: true });
|
|
47
|
+
fs.writeFileSync(full, content, 'utf-8');
|
|
48
|
+
};
|
|
49
|
+
(0, vitest_1.beforeEach)(() => {
|
|
50
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'compliance-'));
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.afterEach)(() => {
|
|
53
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
54
|
+
});
|
|
55
|
+
(0, vitest_1.it)('detects nothing but cites what it looked for in a bare project', () => {
|
|
56
|
+
const controls = (0, compliance_1.detectControls)(tmpDir);
|
|
57
|
+
// CTL-WORKFLOW counts the packaged library, present by construction.
|
|
58
|
+
const missing = controls.filter(c => c.status === 'missing');
|
|
59
|
+
(0, vitest_1.expect)(missing.length).toBeGreaterThanOrEqual(controls.length - 2);
|
|
60
|
+
for (const control of missing) {
|
|
61
|
+
(0, vitest_1.expect)(control.evidence).toMatch(/^not found: /);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.it)('detects controls from real artifacts with evidence, never from claims', () => {
|
|
65
|
+
write('.project-ai/ACTIVE_SKILLS.yaml', 'active: []');
|
|
66
|
+
write('.project-ai/SESSION_POLICY.yaml', 'policy: enterprise');
|
|
67
|
+
write('.project-ai/MODEL_ROUTING.yaml', 'mappings: {}');
|
|
68
|
+
write('.project-ai/AUTHORITATIVE_DOCS.yaml', 'session_start: []');
|
|
69
|
+
write('specs/AGENTIC_GOVERNANCE.md', '# spec');
|
|
70
|
+
write('.husky/pre-commit', 'npx lint-staged');
|
|
71
|
+
write('.eslintrc.json', '{"plugins":["security"]}');
|
|
72
|
+
const byId = new Map((0, compliance_1.detectControls)(tmpDir).map(c => [c.id, c]));
|
|
73
|
+
(0, vitest_1.expect)(byId.get('CTL-PACK')?.status).toBe('implemented');
|
|
74
|
+
(0, vitest_1.expect)(byId.get('CTL-SPEC-AGENT')?.status).toBe('implemented');
|
|
75
|
+
(0, vitest_1.expect)(byId.get('CTL-PRECOMMIT')?.status).toBe('implemented');
|
|
76
|
+
(0, vitest_1.expect)(byId.get('CTL-LINT')?.status).toBe('implemented');
|
|
77
|
+
(0, vitest_1.expect)(byId.get('CTL-SPEC-RAG')?.status).toBe('missing');
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)('flags a partial authority pack as partial', () => {
|
|
80
|
+
write('.project-ai/ACTIVE_SKILLS.yaml', 'active: []');
|
|
81
|
+
const pack = (0, compliance_1.detectControls)(tmpDir).find(c => c.id === 'CTL-PACK');
|
|
82
|
+
(0, vitest_1.expect)(pack?.status).toBe('partial');
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('CTL-AUDIT requires a VALID hash chain, not just a file', () => {
|
|
85
|
+
write('.project-ai/orchestration-audit.jsonl', '{"timestamp":"x","integrity_hash":"forged"}\n');
|
|
86
|
+
const audit = (0, compliance_1.detectControls)(tmpDir).find(c => c.id === 'CTL-AUDIT');
|
|
87
|
+
(0, vitest_1.expect)(audit?.status).toBe('missing');
|
|
88
|
+
// A genuine engine-written chain verifies.
|
|
89
|
+
fs.rmSync(path.join(tmpDir, '.project-ai', 'orchestration-audit.jsonl'));
|
|
90
|
+
const orch = new index_1.Orchestrator({ projectRoot: tmpDir });
|
|
91
|
+
orch.startSession('proj', 'main');
|
|
92
|
+
const auditAfter = (0, compliance_1.detectControls)(tmpDir).find(c => c.id === 'CTL-AUDIT');
|
|
93
|
+
(0, vitest_1.expect)(auditAfter?.status).toBe('implemented');
|
|
94
|
+
(0, vitest_1.expect)(auditAfter?.evidence).toContain('VALID');
|
|
95
|
+
});
|
|
96
|
+
(0, vitest_1.it)('ships all six framework catalogs', () => {
|
|
97
|
+
const frameworks = (0, compliance_1.listFrameworks)().map(f => f.framework);
|
|
98
|
+
(0, vitest_1.expect)(frameworks).toEqual(['FEDRAMP', 'GDPR', 'HIPAA', 'ISO27001', 'PCIDSS', 'SOC2']);
|
|
99
|
+
});
|
|
100
|
+
(0, vitest_1.it)('every catalog control reference resolves to a detectable control id', () => {
|
|
101
|
+
const known = new Set((0, compliance_1.detectControls)(tmpDir).map(c => c.id));
|
|
102
|
+
for (const catalog of (0, compliance_1.listFrameworks)()) {
|
|
103
|
+
for (const req of catalog.requirements) {
|
|
104
|
+
for (const id of req.controls ?? []) {
|
|
105
|
+
(0, vitest_1.expect)(known.has(id), `${catalog.framework} ${req.id} references unknown control ${id}`).toBe(true);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
(0, vitest_1.it)('coverage math: full / partial / gap / n-a per the skill methodology', () => {
|
|
111
|
+
const controls = [
|
|
112
|
+
{ id: 'A', description: '', type: 'preventive', status: 'implemented', evidence: 'a' },
|
|
113
|
+
{ id: 'B', description: '', type: 'detective', status: 'partial', evidence: 'b' },
|
|
114
|
+
{ id: 'C', description: '', type: 'preventive', status: 'missing', evidence: 'c' },
|
|
115
|
+
];
|
|
116
|
+
const result = (0, compliance_1.evaluateFramework)({
|
|
117
|
+
framework: 'T',
|
|
118
|
+
name: 'Test',
|
|
119
|
+
requirements: [
|
|
120
|
+
{ id: 'r-full', title: 'both implemented', controls: ['A'] },
|
|
121
|
+
{ id: 'r-partial-status', title: 'partial control', controls: ['B'] },
|
|
122
|
+
{ id: 'r-partial-flag', title: 'inherently partial', controls: ['A'], partial: true },
|
|
123
|
+
{ id: 'r-gap-missing', title: 'only missing control', controls: ['C'] },
|
|
124
|
+
{ id: 'r-gap-empty', title: 'nothing mapped', controls: [] },
|
|
125
|
+
{ id: 'r-na', title: 'out of scope', na: true },
|
|
126
|
+
],
|
|
127
|
+
}, controls);
|
|
128
|
+
const byId = Object.fromEntries(result.requirements.map(r => [r.id, r.coverage]));
|
|
129
|
+
(0, vitest_1.expect)(byId).toEqual({
|
|
130
|
+
'r-full': 'full',
|
|
131
|
+
'r-partial-status': 'partial',
|
|
132
|
+
'r-partial-flag': 'partial',
|
|
133
|
+
'r-gap-missing': 'gap',
|
|
134
|
+
'r-gap-empty': 'gap',
|
|
135
|
+
'r-na': 'n/a',
|
|
136
|
+
});
|
|
137
|
+
// covered = full+partial (3) of applicable (5)
|
|
138
|
+
(0, vitest_1.expect)(result.coverage_percent).toBe(60);
|
|
139
|
+
(0, vitest_1.expect)(result.gaps.map(g => g.id)).toEqual(['r-gap-missing', 'r-gap-empty']);
|
|
140
|
+
});
|
|
141
|
+
(0, vitest_1.it)('buildComplianceReport filters by framework case-insensitively', () => {
|
|
142
|
+
const report = (0, compliance_1.buildComplianceReport)(tmpDir, 'soc2');
|
|
143
|
+
(0, vitest_1.expect)(report.frameworks).toHaveLength(1);
|
|
144
|
+
(0, vitest_1.expect)(report.frameworks[0].framework).toBe('SOC2');
|
|
145
|
+
(0, vitest_1.expect)(report.controls.length).toBeGreaterThan(5);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=compliance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance.test.js","sourceRoot":"","sources":["../../src/__tests__/compliance.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight-resolver.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/preflight-resolver.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,182 @@
|
|
|
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 preflight_resolver_1 = require("../preflight-resolver");
|
|
41
|
+
const REGISTRY = `
|
|
42
|
+
schema_version: "2.0"
|
|
43
|
+
skills:
|
|
44
|
+
- skill_id: security-audit
|
|
45
|
+
category: audit
|
|
46
|
+
description: Scans for leaked secrets, vulnerabilities, and insecure configuration.
|
|
47
|
+
aliases: [sec-audit]
|
|
48
|
+
trigger_phrases: ["security audit", "scan for secrets"]
|
|
49
|
+
activation_tags: [security]
|
|
50
|
+
- skill_id: bug-hunter
|
|
51
|
+
category: agentic
|
|
52
|
+
description: Finds and fixes bugs from an error description or failing test.
|
|
53
|
+
aliases: [bugfix]
|
|
54
|
+
trigger_phrases: ["hunt bugs", "fix this bug"]
|
|
55
|
+
- skill_id: feature-builder
|
|
56
|
+
category: agentic
|
|
57
|
+
description: Builds features end to end with plan, implementation, tests.
|
|
58
|
+
aliases: []
|
|
59
|
+
trigger_phrases: ["build feature"]
|
|
60
|
+
`;
|
|
61
|
+
const ACTIVE = `
|
|
62
|
+
active:
|
|
63
|
+
- skill_id: security-audit
|
|
64
|
+
reason: required_by_profile
|
|
65
|
+
- skill_id: feature-builder
|
|
66
|
+
reason: required_by_profile
|
|
67
|
+
- skill_id: browser-agent
|
|
68
|
+
reason: not_applicable
|
|
69
|
+
`;
|
|
70
|
+
const ROUTING = `
|
|
71
|
+
mappings:
|
|
72
|
+
strategy: model-strategy
|
|
73
|
+
architecture: model-arch
|
|
74
|
+
implementation: model-impl
|
|
75
|
+
`;
|
|
76
|
+
const DOCS = `
|
|
77
|
+
before_code_changes:
|
|
78
|
+
- path: EXISTS.md
|
|
79
|
+
required: true
|
|
80
|
+
- path: MISSING.md
|
|
81
|
+
required: false
|
|
82
|
+
session_start:
|
|
83
|
+
- path: EXISTS.md
|
|
84
|
+
required: true
|
|
85
|
+
`;
|
|
86
|
+
const POLICY = `
|
|
87
|
+
allow_project_local: false
|
|
88
|
+
allow_canonical_creation: true
|
|
89
|
+
enforcement: "enforced"
|
|
90
|
+
`;
|
|
91
|
+
(0, vitest_1.describe)('PreflightResolver', () => {
|
|
92
|
+
let tmpDir;
|
|
93
|
+
const write = (rel, content) => {
|
|
94
|
+
const full = path.join(tmpDir, rel);
|
|
95
|
+
fs.mkdirSync(path.dirname(full), { recursive: true });
|
|
96
|
+
fs.writeFileSync(full, content, 'utf-8');
|
|
97
|
+
};
|
|
98
|
+
(0, vitest_1.beforeEach)(() => {
|
|
99
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'preflight-'));
|
|
100
|
+
write('registry/canonical-skills.yaml', REGISTRY);
|
|
101
|
+
write('.project-ai/ACTIVE_SKILLS.yaml', ACTIVE);
|
|
102
|
+
write('.project-ai/MODEL_ROUTING.yaml', ROUTING);
|
|
103
|
+
write('.project-ai/AUTHORITATIVE_DOCS.yaml', DOCS);
|
|
104
|
+
write('.project-ai/NEW_SKILL_POLICY.yaml', POLICY);
|
|
105
|
+
write('EXISTS.md', '# here');
|
|
106
|
+
});
|
|
107
|
+
(0, vitest_1.afterEach)(() => {
|
|
108
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
109
|
+
});
|
|
110
|
+
(0, vitest_1.it)('classifies task types per the spec table', () => {
|
|
111
|
+
const r = new preflight_resolver_1.PreflightResolver(tmpDir);
|
|
112
|
+
(0, vitest_1.expect)(r.classify('Should we restructure the pricing tiers?')).toBe('strategy');
|
|
113
|
+
(0, vitest_1.expect)(r.classify('Design the schema for licensing v2')).toBe('architecture');
|
|
114
|
+
(0, vitest_1.expect)(r.classify('Fix the login timeout')).toBe('implementation');
|
|
115
|
+
(0, vitest_1.expect)(r.classify('Create a new skill for GraphQL audits')).toBe('skill_creation');
|
|
116
|
+
});
|
|
117
|
+
(0, vitest_1.it)('Phase 1: exact skill_id and alias-map matches win with active flags', () => {
|
|
118
|
+
write('registry/skill-aliases.yaml', 'aliases:\n sec-audit: security-audit\n');
|
|
119
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('run security-audit on this repo');
|
|
120
|
+
(0, vitest_1.expect)(res.match_phase).toBe('exact');
|
|
121
|
+
(0, vitest_1.expect)(res.matches[0].skill_id).toBe('security-audit');
|
|
122
|
+
(0, vitest_1.expect)(res.matches[0].active).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
(0, vitest_1.it)('Phase 2: weighted keyword scoring crosses the threshold via trigger + description', () => {
|
|
125
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('please scan for secrets and vulnerabilities');
|
|
126
|
+
(0, vitest_1.expect)(res.match_phase).toBe('keyword');
|
|
127
|
+
(0, vitest_1.expect)(res.matches[0].skill_id).toBe('security-audit');
|
|
128
|
+
// trigger (10) + description keywords >= threshold 15
|
|
129
|
+
(0, vitest_1.expect)(res.matches[0].score).toBeGreaterThan(15);
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.it)('Phase 3: falls back to the semantic category table', () => {
|
|
132
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('site went down, total outage right now');
|
|
133
|
+
(0, vitest_1.expect)(res.match_phase).toBe('category');
|
|
134
|
+
(0, vitest_1.expect)(res.category).toBe('incident');
|
|
135
|
+
(0, vitest_1.expect)(res.matches.map(m => m.skill_id)).toContain('incident-response');
|
|
136
|
+
});
|
|
137
|
+
(0, vitest_1.it)('flags matched-but-inactive skills instead of hiding them', () => {
|
|
138
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('fix this bug in the parser');
|
|
139
|
+
const bugHunter = res.matches.find(m => m.skill_id === 'bug-hunter');
|
|
140
|
+
(0, vitest_1.expect)(bugHunter).toBeDefined();
|
|
141
|
+
(0, vitest_1.expect)(bugHunter.active).toBe(false);
|
|
142
|
+
(0, vitest_1.expect)(res.warnings.join(' ')).toContain('bug-hunter');
|
|
143
|
+
});
|
|
144
|
+
(0, vitest_1.it)('new-skill gate blocks creation when an overlapping skill matches', () => {
|
|
145
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('create a new skill for security audit scanning');
|
|
146
|
+
(0, vitest_1.expect)(res.task_type).toBe('skill_creation');
|
|
147
|
+
(0, vitest_1.expect)(res.new_skill?.allowed).toBe(false);
|
|
148
|
+
(0, vitest_1.expect)(res.new_skill?.overlaps).toContain('security-audit');
|
|
149
|
+
});
|
|
150
|
+
(0, vitest_1.it)('new-skill gate allows creation with rationale when no overlap exists', () => {
|
|
151
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('create a new skill for underwater basket telemetry');
|
|
152
|
+
(0, vitest_1.expect)(res.task_type).toBe('skill_creation');
|
|
153
|
+
(0, vitest_1.expect)(res.new_skill?.allowed).toBe(true);
|
|
154
|
+
(0, vitest_1.expect)(res.new_skill?.note).toContain('rationale');
|
|
155
|
+
});
|
|
156
|
+
(0, vitest_1.it)('routes models by task family and lists phase docs with existence', () => {
|
|
157
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('fix the flaky retry logic');
|
|
158
|
+
(0, vitest_1.expect)(res.model_family).toBe('implementation');
|
|
159
|
+
(0, vitest_1.expect)(res.model).toBe('model-impl');
|
|
160
|
+
(0, vitest_1.expect)(res.docs).toEqual([
|
|
161
|
+
{ path: 'EXISTS.md', required: true, exists: true },
|
|
162
|
+
{ path: 'MISSING.md', required: false, exists: false },
|
|
163
|
+
]);
|
|
164
|
+
});
|
|
165
|
+
(0, vitest_1.it)('warns on required-but-missing docs (do-not-proceed failure mode)', () => {
|
|
166
|
+
write('.project-ai/AUTHORITATIVE_DOCS.yaml', 'before_code_changes:\n - path: GONE.md\n required: true\n');
|
|
167
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('fix the parser');
|
|
168
|
+
(0, vitest_1.expect)(res.warnings.join(' ')).toContain('GONE.md');
|
|
169
|
+
});
|
|
170
|
+
(0, vitest_1.it)('falls back to full activation when the authority pack is missing', () => {
|
|
171
|
+
fs.rmSync(path.join(tmpDir, '.project-ai'), { recursive: true, force: true });
|
|
172
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('fix this bug in the parser');
|
|
173
|
+
(0, vitest_1.expect)(res.authority_pack).toBe('missing');
|
|
174
|
+
(0, vitest_1.expect)(res.matches.every(m => m.active)).toBe(true);
|
|
175
|
+
});
|
|
176
|
+
(0, vitest_1.it)('warns when no registry is found anywhere', () => {
|
|
177
|
+
fs.rmSync(path.join(tmpDir, 'registry'), { recursive: true, force: true });
|
|
178
|
+
const res = new preflight_resolver_1.PreflightResolver(tmpDir).resolve('fix this bug');
|
|
179
|
+
(0, vitest_1.expect)(res.warnings.join(' ')).toContain('Registry snapshot missing');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=preflight-resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight-resolver.test.js","sourceRoot":"","sources":["../../src/__tests__/preflight-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-library.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/workflow-library.test.ts"],"names":[],"mappings":""}
|