micro-contracts 0.9.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/LICENSE +22 -0
- package/README.md +351 -0
- package/dist/cli/templates.d.ts +16 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +377 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +978 -0
- package/dist/cli.js.map +1 -0
- package/dist/generator/dependencyGenerator.d.ts +43 -0
- package/dist/generator/dependencyGenerator.d.ts.map +1 -0
- package/dist/generator/dependencyGenerator.js +159 -0
- package/dist/generator/dependencyGenerator.js.map +1 -0
- package/dist/generator/domainGenerator.d.ts +16 -0
- package/dist/generator/domainGenerator.d.ts.map +1 -0
- package/dist/generator/domainGenerator.js +212 -0
- package/dist/generator/domainGenerator.js.map +1 -0
- package/dist/generator/index.d.ts +37 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +747 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/linter.d.ts +24 -0
- package/dist/generator/linter.d.ts.map +1 -0
- package/dist/generator/linter.js +202 -0
- package/dist/generator/linter.js.map +1 -0
- package/dist/generator/overlayProcessor.d.ts +90 -0
- package/dist/generator/overlayProcessor.d.ts.map +1 -0
- package/dist/generator/overlayProcessor.js +532 -0
- package/dist/generator/overlayProcessor.js.map +1 -0
- package/dist/generator/schemaGenerator.d.ts +10 -0
- package/dist/generator/schemaGenerator.d.ts.map +1 -0
- package/dist/generator/schemaGenerator.js +299 -0
- package/dist/generator/schemaGenerator.js.map +1 -0
- package/dist/generator/templateProcessor.d.ts +178 -0
- package/dist/generator/templateProcessor.d.ts.map +1 -0
- package/dist/generator/templateProcessor.js +607 -0
- package/dist/generator/templateProcessor.js.map +1 -0
- package/dist/generator/typeGenerator.d.ts +9 -0
- package/dist/generator/typeGenerator.d.ts.map +1 -0
- package/dist/generator/typeGenerator.js +395 -0
- package/dist/generator/typeGenerator.js.map +1 -0
- package/dist/guardrails/allowlist.d.ts +45 -0
- package/dist/guardrails/allowlist.d.ts.map +1 -0
- package/dist/guardrails/allowlist.js +261 -0
- package/dist/guardrails/allowlist.js.map +1 -0
- package/dist/guardrails/config.d.ts +40 -0
- package/dist/guardrails/config.d.ts.map +1 -0
- package/dist/guardrails/config.js +174 -0
- package/dist/guardrails/config.js.map +1 -0
- package/dist/guardrails/docs.d.ts +24 -0
- package/dist/guardrails/docs.d.ts.map +1 -0
- package/dist/guardrails/docs.js +138 -0
- package/dist/guardrails/docs.js.map +1 -0
- package/dist/guardrails/drift.d.ts +23 -0
- package/dist/guardrails/drift.d.ts.map +1 -0
- package/dist/guardrails/drift.js +127 -0
- package/dist/guardrails/drift.js.map +1 -0
- package/dist/guardrails/index.d.ts +19 -0
- package/dist/guardrails/index.d.ts.map +1 -0
- package/dist/guardrails/index.js +25 -0
- package/dist/guardrails/index.js.map +1 -0
- package/dist/guardrails/lint.d.ts +20 -0
- package/dist/guardrails/lint.d.ts.map +1 -0
- package/dist/guardrails/lint.js +274 -0
- package/dist/guardrails/lint.js.map +1 -0
- package/dist/guardrails/manifest.d.ts +43 -0
- package/dist/guardrails/manifest.d.ts.map +1 -0
- package/dist/guardrails/manifest.js +231 -0
- package/dist/guardrails/manifest.js.map +1 -0
- package/dist/guardrails/runner.d.ts +31 -0
- package/dist/guardrails/runner.d.ts.map +1 -0
- package/dist/guardrails/runner.js +268 -0
- package/dist/guardrails/runner.js.map +1 -0
- package/dist/guardrails/security.d.ts +31 -0
- package/dist/guardrails/security.d.ts.map +1 -0
- package/dist/guardrails/security.js +181 -0
- package/dist/guardrails/security.js.map +1 -0
- package/dist/guardrails/typecheck.d.ts +15 -0
- package/dist/guardrails/typecheck.d.ts.map +1 -0
- package/dist/guardrails/typecheck.js +104 -0
- package/dist/guardrails/typecheck.js.map +1 -0
- package/dist/guardrails/types.d.ts +196 -0
- package/dist/guardrails/types.d.ts.map +1 -0
- package/dist/guardrails/types.js +8 -0
- package/dist/guardrails/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +489 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +297 -0
- package/dist/types.js.map +1 -0
- package/docs/architecture.svg +226 -0
- package/docs/development-guardrails.md +541 -0
- package/docs/guardrails-concept.svg +252 -0
- package/docs/overlays-deep-dive.md +298 -0
- package/package.json +66 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security consistency check for guardrails
|
|
3
|
+
*
|
|
4
|
+
* Verifies that security declarations in OpenAPI specs (x-auth, x-authz, x-middleware)
|
|
5
|
+
* have corresponding implementations.
|
|
6
|
+
*/
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import yaml from 'js-yaml';
|
|
10
|
+
import { glob } from 'glob';
|
|
11
|
+
/**
|
|
12
|
+
* Extract exported function names from TypeScript files
|
|
13
|
+
*/
|
|
14
|
+
export async function getImplementedOverlays(overlayDir) {
|
|
15
|
+
const implemented = new Set();
|
|
16
|
+
if (!fs.existsSync(overlayDir)) {
|
|
17
|
+
return implemented;
|
|
18
|
+
}
|
|
19
|
+
const files = await glob('**/*.ts', { cwd: overlayDir });
|
|
20
|
+
for (const file of files) {
|
|
21
|
+
const fullPath = path.join(overlayDir, file);
|
|
22
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
23
|
+
// Extract exported function names
|
|
24
|
+
const exportMatches = content.matchAll(/export\s+(?:async\s+)?function\s+(\w+)/g);
|
|
25
|
+
for (const match of exportMatches) {
|
|
26
|
+
implemented.add(match[1]);
|
|
27
|
+
}
|
|
28
|
+
// Also check for exported const functions
|
|
29
|
+
const constMatches = content.matchAll(/export\s+const\s+(\w+)\s*=/g);
|
|
30
|
+
for (const match of constMatches) {
|
|
31
|
+
implemented.add(match[1]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return implemented;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check a single OpenAPI spec for security consistency
|
|
38
|
+
*/
|
|
39
|
+
export function checkSecurityConsistency(specPath, spec, implementedOverlays) {
|
|
40
|
+
const issues = [];
|
|
41
|
+
for (const [pathKey, pathItem] of Object.entries(spec.paths)) {
|
|
42
|
+
for (const method of ['get', 'post', 'put', 'patch', 'delete']) {
|
|
43
|
+
const operation = pathItem[method];
|
|
44
|
+
if (!operation)
|
|
45
|
+
continue;
|
|
46
|
+
// Check x-auth requirement
|
|
47
|
+
const xAuth = operation['x-auth'];
|
|
48
|
+
if (xAuth === 'required') {
|
|
49
|
+
// Should have requireAuth in middleware
|
|
50
|
+
const middlewares = operation['x-middleware'] || [];
|
|
51
|
+
if (!middlewares.includes('requireAuth') && !implementedOverlays.has('requireAuth')) {
|
|
52
|
+
// Only warn if requireAuth is not implemented at all
|
|
53
|
+
// The check is more lenient - just verify the middleware exists
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Check all declared middlewares are implemented
|
|
57
|
+
const middlewares = operation['x-middleware'] || [];
|
|
58
|
+
for (const mw of middlewares) {
|
|
59
|
+
if (!implementedOverlays.has(mw)) {
|
|
60
|
+
issues.push({
|
|
61
|
+
spec: specPath,
|
|
62
|
+
path: pathKey,
|
|
63
|
+
method: method.toUpperCase(),
|
|
64
|
+
issue: `Middleware "${mw}" declared but not implemented`,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Check x-authz scopes (if requireAuth is used, should have x-auth: required)
|
|
69
|
+
const xAuthz = operation['x-authz'];
|
|
70
|
+
if (xAuthz && xAuthz.length > 0) {
|
|
71
|
+
if (!xAuth || xAuth === 'none') {
|
|
72
|
+
issues.push({
|
|
73
|
+
spec: specPath,
|
|
74
|
+
path: pathKey,
|
|
75
|
+
method: method.toUpperCase(),
|
|
76
|
+
issue: `Has x-authz scopes but x-auth is not "required"`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return issues;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Find overlay implementation directories
|
|
86
|
+
*/
|
|
87
|
+
export async function findOverlayDirs() {
|
|
88
|
+
const dirs = [];
|
|
89
|
+
// Check common locations
|
|
90
|
+
const candidates = [
|
|
91
|
+
'server/src/_shared/overlays',
|
|
92
|
+
'server/src/core/overlays',
|
|
93
|
+
'src/_shared/overlays',
|
|
94
|
+
'src/overlays',
|
|
95
|
+
];
|
|
96
|
+
for (const candidate of candidates) {
|
|
97
|
+
if (fs.existsSync(candidate)) {
|
|
98
|
+
dirs.push(candidate);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Also find module-specific overlays
|
|
102
|
+
const moduleOverlays = await glob('server/src/*/overlays', { nodir: false });
|
|
103
|
+
dirs.push(...moduleOverlays.filter(d => fs.existsSync(d)));
|
|
104
|
+
return [...new Set(dirs)];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Run security consistency check
|
|
108
|
+
*/
|
|
109
|
+
export async function runSecurityCheck(options) {
|
|
110
|
+
const start = Date.now();
|
|
111
|
+
try {
|
|
112
|
+
// Find overlay implementations
|
|
113
|
+
const overlayDirs = await findOverlayDirs();
|
|
114
|
+
const implementedOverlays = new Set();
|
|
115
|
+
for (const dir of overlayDirs) {
|
|
116
|
+
const overlays = await getImplementedOverlays(dir);
|
|
117
|
+
for (const overlay of overlays) {
|
|
118
|
+
implementedOverlays.add(overlay);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (implementedOverlays.size === 0) {
|
|
122
|
+
return {
|
|
123
|
+
name: 'security',
|
|
124
|
+
status: 'skip',
|
|
125
|
+
duration: Date.now() - start,
|
|
126
|
+
message: 'No overlay implementations found',
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// Find OpenAPI specs
|
|
130
|
+
const specFiles = await glob('spec/**/openapi/*.yaml', {
|
|
131
|
+
ignore: ['**/*.overlay.yaml'],
|
|
132
|
+
});
|
|
133
|
+
if (specFiles.length === 0) {
|
|
134
|
+
return {
|
|
135
|
+
name: 'security',
|
|
136
|
+
status: 'skip',
|
|
137
|
+
duration: Date.now() - start,
|
|
138
|
+
message: 'No OpenAPI specs found',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const allIssues = [];
|
|
142
|
+
for (const specFile of specFiles) {
|
|
143
|
+
try {
|
|
144
|
+
const content = fs.readFileSync(specFile, 'utf-8');
|
|
145
|
+
const spec = yaml.load(content);
|
|
146
|
+
if (!spec || !spec.paths)
|
|
147
|
+
continue;
|
|
148
|
+
const issues = checkSecurityConsistency(specFile, spec, implementedOverlays);
|
|
149
|
+
allIssues.push(...issues);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Skip files that can't be parsed
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (allIssues.length > 0) {
|
|
156
|
+
const details = allIssues.map(i => ` ${i.spec} - ${i.method} ${i.path}: ${i.issue}`);
|
|
157
|
+
return {
|
|
158
|
+
name: 'security',
|
|
159
|
+
status: 'fail',
|
|
160
|
+
duration: Date.now() - start,
|
|
161
|
+
message: `${allIssues.length} security consistency issue(s)`,
|
|
162
|
+
details,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
name: 'security',
|
|
167
|
+
status: 'pass',
|
|
168
|
+
duration: Date.now() - start,
|
|
169
|
+
message: `Security declarations verified (${implementedOverlays.size} overlays, ${specFiles.length} specs)`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return {
|
|
174
|
+
name: 'security',
|
|
175
|
+
status: 'fail',
|
|
176
|
+
duration: Date.now() - start,
|
|
177
|
+
message: error instanceof Error ? error.message : String(error),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/guardrails/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript type check for guardrails
|
|
3
|
+
*
|
|
4
|
+
* Runs tsc --noEmit to verify TypeScript compilation.
|
|
5
|
+
*/
|
|
6
|
+
import type { CheckResult, CheckOptions } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Find tsconfig.json files
|
|
9
|
+
*/
|
|
10
|
+
export declare function findTsConfigs(baseDir?: string): string[];
|
|
11
|
+
/**
|
|
12
|
+
* Run TypeScript type check
|
|
13
|
+
*/
|
|
14
|
+
export declare function runTypecheckCheck(options: CheckOptions): Promise<CheckResult>;
|
|
15
|
+
//# sourceMappingURL=typecheck.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck.d.ts","sourceRoot":"","sources":["../../src/guardrails/typecheck.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAAY,GAAG,MAAM,EAAE,CAmB7D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2EnF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript type check for guardrails
|
|
3
|
+
*
|
|
4
|
+
* Runs tsc --noEmit to verify TypeScript compilation.
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
/**
|
|
10
|
+
* Find tsconfig.json files
|
|
11
|
+
*/
|
|
12
|
+
export function findTsConfigs(baseDir = '.') {
|
|
13
|
+
const configs = [];
|
|
14
|
+
// Check common locations
|
|
15
|
+
const candidates = [
|
|
16
|
+
'tsconfig.json',
|
|
17
|
+
'packages/contract/tsconfig.json',
|
|
18
|
+
'server/tsconfig.json',
|
|
19
|
+
'frontend/tsconfig.json',
|
|
20
|
+
];
|
|
21
|
+
for (const candidate of candidates) {
|
|
22
|
+
const fullPath = path.join(baseDir, candidate);
|
|
23
|
+
if (fs.existsSync(fullPath)) {
|
|
24
|
+
configs.push(fullPath);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return configs;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Run TypeScript type check
|
|
31
|
+
*/
|
|
32
|
+
export async function runTypecheckCheck(options) {
|
|
33
|
+
const start = Date.now();
|
|
34
|
+
try {
|
|
35
|
+
// Find tsconfig files
|
|
36
|
+
const tsconfigs = findTsConfigs();
|
|
37
|
+
if (tsconfigs.length === 0) {
|
|
38
|
+
return {
|
|
39
|
+
name: 'typecheck',
|
|
40
|
+
status: 'skip',
|
|
41
|
+
duration: Date.now() - start,
|
|
42
|
+
message: 'No tsconfig.json found',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const errors = [];
|
|
46
|
+
let hasErrors = false;
|
|
47
|
+
for (const tsconfig of tsconfigs) {
|
|
48
|
+
try {
|
|
49
|
+
// Run tsc --noEmit
|
|
50
|
+
execSync(`npx tsc --noEmit -p "${tsconfig}"`, {
|
|
51
|
+
encoding: 'utf8',
|
|
52
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
hasErrors = true;
|
|
57
|
+
if (error && typeof error === 'object' && 'stdout' in error) {
|
|
58
|
+
const output = error.stdout;
|
|
59
|
+
if (output) {
|
|
60
|
+
errors.push(`${tsconfig}:`);
|
|
61
|
+
// Parse tsc output for specific errors
|
|
62
|
+
const lines = output.split('\n').filter(line => line.includes('error TS'));
|
|
63
|
+
for (const line of lines.slice(0, 10)) { // Limit to first 10 errors
|
|
64
|
+
errors.push(` ${line.trim()}`);
|
|
65
|
+
}
|
|
66
|
+
if (lines.length > 10) {
|
|
67
|
+
errors.push(` ... and ${lines.length - 10} more errors`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (error && typeof error === 'object' && 'stderr' in error) {
|
|
72
|
+
const stderr = error.stderr;
|
|
73
|
+
if (stderr) {
|
|
74
|
+
errors.push(`${tsconfig}: ${stderr.trim()}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (hasErrors) {
|
|
80
|
+
return {
|
|
81
|
+
name: 'typecheck',
|
|
82
|
+
status: 'fail',
|
|
83
|
+
duration: Date.now() - start,
|
|
84
|
+
message: `Type errors in ${errors.length > 0 ? 'config(s)' : 'project'}`,
|
|
85
|
+
details: errors,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
name: 'typecheck',
|
|
90
|
+
status: 'pass',
|
|
91
|
+
duration: Date.now() - start,
|
|
92
|
+
message: `${tsconfigs.length} project(s) passed type check`,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
return {
|
|
97
|
+
name: 'typecheck',
|
|
98
|
+
status: 'fail',
|
|
99
|
+
duration: Date.now() - start,
|
|
100
|
+
message: error instanceof Error ? error.message : String(error),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=typecheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typecheck.js","sourceRoot":"","sources":["../../src/guardrails/typecheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrails type definitions
|
|
3
|
+
*
|
|
4
|
+
* These types define the structure for AI-driven development guardrails
|
|
5
|
+
* that protect generated artifacts and enforce change policies.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Guardrails configuration file structure (guardrails.yaml)
|
|
9
|
+
*/
|
|
10
|
+
export interface GuardrailsConfig {
|
|
11
|
+
/**
|
|
12
|
+
* Paths that can be edited in normal development PRs
|
|
13
|
+
* Supports glob patterns and negation (prefix with !)
|
|
14
|
+
*/
|
|
15
|
+
allowed?: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Paths that require special approval (e.g., security config, CI)
|
|
18
|
+
* Supports glob patterns and negation (prefix with !)
|
|
19
|
+
*/
|
|
20
|
+
protected?: string[];
|
|
21
|
+
/**
|
|
22
|
+
* Paths for generated artifacts (committed but only modified via generate)
|
|
23
|
+
* Supports glob patterns and negation (prefix with !)
|
|
24
|
+
*/
|
|
25
|
+
generated?: string[];
|
|
26
|
+
/**
|
|
27
|
+
* Check command configurations
|
|
28
|
+
* Define custom commands for each guardrail check
|
|
29
|
+
*/
|
|
30
|
+
checks?: ChecksConfig;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Configuration for guardrail check commands
|
|
34
|
+
*/
|
|
35
|
+
export interface ChecksConfig {
|
|
36
|
+
/** Lint check configuration */
|
|
37
|
+
lint?: CheckCommandConfig;
|
|
38
|
+
/** TypeScript type check configuration */
|
|
39
|
+
typecheck?: CheckCommandConfig;
|
|
40
|
+
/** Documentation check configuration */
|
|
41
|
+
docs?: CheckCommandConfig;
|
|
42
|
+
/** Additional custom checks */
|
|
43
|
+
[key: string]: CheckCommandConfig | undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Gate numbers for guardrail checks
|
|
47
|
+
*
|
|
48
|
+
* Gate 1: Change Allowlist (allowlist)
|
|
49
|
+
* Gate 2: OpenAPI Contract Validation (spec-lint, spec-breaking)
|
|
50
|
+
* Gate 3: Generated Artifact Integrity (drift, manifest)
|
|
51
|
+
* Gate 4: Code Quality (code-lint, code-typecheck, code-test)
|
|
52
|
+
* Gate 5: Doc Consistency & Static Analysis (docs-sync, docs-links, security)
|
|
53
|
+
*/
|
|
54
|
+
export type GateNumber = 1 | 2 | 3 | 4 | 5;
|
|
55
|
+
/**
|
|
56
|
+
* Configuration for a single check command
|
|
57
|
+
*/
|
|
58
|
+
export interface CheckCommandConfig {
|
|
59
|
+
/**
|
|
60
|
+
* Command template to run.
|
|
61
|
+
* Supports placeholders:
|
|
62
|
+
* - {files} - space-separated list of target files (auto-detected)
|
|
63
|
+
* - {cwd} - current working directory
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* command: "npx @stoplight/spectral-cli lint {files} --ruleset spec/spectral.yaml"
|
|
67
|
+
*/
|
|
68
|
+
command: string;
|
|
69
|
+
/**
|
|
70
|
+
* Whether this check is enabled (default: true)
|
|
71
|
+
*/
|
|
72
|
+
enabled?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Gate number this check belongs to (1-5)
|
|
75
|
+
* Used with --gate option to run checks by gate
|
|
76
|
+
*
|
|
77
|
+
* Gate 1: Change Allowlist
|
|
78
|
+
* Gate 2: OpenAPI Contract Validation
|
|
79
|
+
* Gate 3: Generated Artifact Integrity
|
|
80
|
+
* Gate 4: Code Quality
|
|
81
|
+
* Gate 5: Doc Consistency & Static Analysis
|
|
82
|
+
*/
|
|
83
|
+
gate?: GateNumber;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Result of allowlist verification
|
|
87
|
+
*/
|
|
88
|
+
export interface AllowlistResult {
|
|
89
|
+
valid: boolean;
|
|
90
|
+
violations: AllowlistViolation[];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* A single allowlist violation
|
|
94
|
+
*/
|
|
95
|
+
export interface AllowlistViolation {
|
|
96
|
+
file: string;
|
|
97
|
+
reason: 'protected' | 'not-in-allowlist';
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Result of drift check
|
|
101
|
+
*/
|
|
102
|
+
export interface DriftResult {
|
|
103
|
+
valid: boolean;
|
|
104
|
+
changedFiles: string[];
|
|
105
|
+
error?: string;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generated artifact manifest structure
|
|
109
|
+
*/
|
|
110
|
+
export interface GeneratedManifest {
|
|
111
|
+
/** Manifest format version */
|
|
112
|
+
version: string;
|
|
113
|
+
/** Timestamp when manifest was generated */
|
|
114
|
+
generatedAt: string;
|
|
115
|
+
/** Version of micro-contracts that generated this */
|
|
116
|
+
generatorVersion: string;
|
|
117
|
+
/** Map of relative file paths to their metadata */
|
|
118
|
+
files: Record<string, GeneratedFileInfo>;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Metadata for a single generated file
|
|
122
|
+
*/
|
|
123
|
+
export interface GeneratedFileInfo {
|
|
124
|
+
/** SHA-256 hash of file content */
|
|
125
|
+
sha256: string;
|
|
126
|
+
/** Source file that generated this (e.g., OpenAPI spec path) */
|
|
127
|
+
source?: string;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Result of manifest verification
|
|
131
|
+
*/
|
|
132
|
+
export interface ManifestResult {
|
|
133
|
+
valid: boolean;
|
|
134
|
+
mismatches: ManifestMismatch[];
|
|
135
|
+
manifestPath?: string;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* A single manifest mismatch
|
|
139
|
+
*/
|
|
140
|
+
export interface ManifestMismatch {
|
|
141
|
+
file: string;
|
|
142
|
+
reason: 'missing' | 'hash-mismatch' | 'extra';
|
|
143
|
+
expected?: string;
|
|
144
|
+
actual?: string;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Options for check command
|
|
148
|
+
*/
|
|
149
|
+
export interface CheckOptions {
|
|
150
|
+
/** Run specific checks only */
|
|
151
|
+
only?: string[];
|
|
152
|
+
/** Skip specific checks */
|
|
153
|
+
skip?: string[];
|
|
154
|
+
/** Run checks for specific gates only (1-5) */
|
|
155
|
+
gates?: GateNumber[];
|
|
156
|
+
/** Enable verbose output */
|
|
157
|
+
verbose?: boolean;
|
|
158
|
+
/** Enable auto-fix where possible */
|
|
159
|
+
fix?: boolean;
|
|
160
|
+
/** Path to guardrails.yaml */
|
|
161
|
+
guardrailsPath?: string;
|
|
162
|
+
/** Path to generated files directory */
|
|
163
|
+
generatedDir?: string;
|
|
164
|
+
/** File containing list of changed files (for CI) */
|
|
165
|
+
changedFilesPath?: string;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Result of a single check
|
|
169
|
+
*/
|
|
170
|
+
export interface CheckResult {
|
|
171
|
+
name: string;
|
|
172
|
+
status: 'pass' | 'fail' | 'skip';
|
|
173
|
+
duration: number;
|
|
174
|
+
message?: string;
|
|
175
|
+
details?: string[];
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Overall check summary
|
|
179
|
+
*/
|
|
180
|
+
export interface CheckSummary {
|
|
181
|
+
passed: number;
|
|
182
|
+
failed: number;
|
|
183
|
+
skipped: number;
|
|
184
|
+
results: CheckResult[];
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check definition
|
|
188
|
+
*/
|
|
189
|
+
export interface CheckDefinition {
|
|
190
|
+
name: string;
|
|
191
|
+
description: string;
|
|
192
|
+
/** Gate number this check belongs to (1-5) */
|
|
193
|
+
gate?: GateNumber;
|
|
194
|
+
run: (options: CheckOptions) => Promise<CheckResult>;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guardrails/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/guardrails/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC"}
|