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,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift detection for generated artifacts
|
|
3
|
+
*
|
|
4
|
+
* Verifies that generated files match the committed state after running generate.
|
|
5
|
+
*/
|
|
6
|
+
import type { DriftResult, CheckResult, CheckOptions } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Check for drift in generated files
|
|
9
|
+
*/
|
|
10
|
+
export declare function checkDrift(generatedDir?: string): DriftResult;
|
|
11
|
+
/**
|
|
12
|
+
* Check for uncommitted changes (including untracked files)
|
|
13
|
+
*/
|
|
14
|
+
export declare function checkUncommittedChanges(generatedDir?: string): DriftResult;
|
|
15
|
+
/**
|
|
16
|
+
* Run drift check
|
|
17
|
+
*/
|
|
18
|
+
export declare function runDriftCheck(options: CheckOptions): Promise<CheckResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Format drift result for CLI output
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatDriftResult(result: DriftResult): string;
|
|
23
|
+
//# sourceMappingURL=drift.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/guardrails/drift.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE;;GAEG;AACH,wBAAgB,UAAU,CAAC,YAAY,GAAE,MAAoB,GAAG,WAAW,CAsB1E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,GAAE,MAAoB,GAAG,WAAW,CA6BvF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2C/E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAsB7D"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drift detection for generated artifacts
|
|
3
|
+
*
|
|
4
|
+
* Verifies that generated files match the committed state after running generate.
|
|
5
|
+
*/
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
/**
|
|
8
|
+
* Check for drift in generated files
|
|
9
|
+
*/
|
|
10
|
+
export function checkDrift(generatedDir = 'packages/') {
|
|
11
|
+
try {
|
|
12
|
+
// Run git diff on the generated directory
|
|
13
|
+
const output = execSync(`git diff --name-only "${generatedDir}"`, {
|
|
14
|
+
encoding: 'utf8',
|
|
15
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
16
|
+
});
|
|
17
|
+
const changedFiles = output.trim().split('\n').filter(Boolean);
|
|
18
|
+
return {
|
|
19
|
+
valid: changedFiles.length === 0,
|
|
20
|
+
changedFiles,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
// Git command failed
|
|
25
|
+
return {
|
|
26
|
+
valid: false,
|
|
27
|
+
changedFiles: [],
|
|
28
|
+
error: error instanceof Error ? error.message : String(error),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check for uncommitted changes (including untracked files)
|
|
34
|
+
*/
|
|
35
|
+
export function checkUncommittedChanges(generatedDir = 'packages/') {
|
|
36
|
+
try {
|
|
37
|
+
// Check for modified files
|
|
38
|
+
const modifiedOutput = execSync(`git diff --name-only "${generatedDir}"`, {
|
|
39
|
+
encoding: 'utf8',
|
|
40
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
41
|
+
});
|
|
42
|
+
// Check for untracked files
|
|
43
|
+
const untrackedOutput = execSync(`git ls-files --others --exclude-standard "${generatedDir}"`, {
|
|
44
|
+
encoding: 'utf8',
|
|
45
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
46
|
+
});
|
|
47
|
+
const modifiedFiles = modifiedOutput.trim().split('\n').filter(Boolean);
|
|
48
|
+
const untrackedFiles = untrackedOutput.trim().split('\n').filter(Boolean);
|
|
49
|
+
const allChangedFiles = [...modifiedFiles, ...untrackedFiles];
|
|
50
|
+
return {
|
|
51
|
+
valid: allChangedFiles.length === 0,
|
|
52
|
+
changedFiles: allChangedFiles,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
valid: false,
|
|
58
|
+
changedFiles: [],
|
|
59
|
+
error: error instanceof Error ? error.message : String(error),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Run drift check
|
|
65
|
+
*/
|
|
66
|
+
export async function runDriftCheck(options) {
|
|
67
|
+
const start = Date.now();
|
|
68
|
+
const generatedDir = options.generatedDir || 'packages/';
|
|
69
|
+
try {
|
|
70
|
+
const result = checkUncommittedChanges(generatedDir);
|
|
71
|
+
if (result.error) {
|
|
72
|
+
return {
|
|
73
|
+
name: 'drift',
|
|
74
|
+
status: 'fail',
|
|
75
|
+
duration: Date.now() - start,
|
|
76
|
+
message: `Git error: ${result.error}`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (result.valid) {
|
|
80
|
+
return {
|
|
81
|
+
name: 'drift',
|
|
82
|
+
status: 'pass',
|
|
83
|
+
duration: Date.now() - start,
|
|
84
|
+
message: `No uncommitted changes in ${generatedDir}`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
const details = result.changedFiles.map(f => ` - ${f}`);
|
|
88
|
+
return {
|
|
89
|
+
name: 'drift',
|
|
90
|
+
status: 'fail',
|
|
91
|
+
duration: Date.now() - start,
|
|
92
|
+
message: `${result.changedFiles.length} file(s) have uncommitted changes`,
|
|
93
|
+
details,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
return {
|
|
98
|
+
name: 'drift',
|
|
99
|
+
status: 'fail',
|
|
100
|
+
duration: Date.now() - start,
|
|
101
|
+
message: error instanceof Error ? error.message : String(error),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Format drift result for CLI output
|
|
107
|
+
*/
|
|
108
|
+
export function formatDriftResult(result) {
|
|
109
|
+
const lines = [];
|
|
110
|
+
if (result.error) {
|
|
111
|
+
lines.push(`❌ Drift check failed: ${result.error}`);
|
|
112
|
+
return lines.join('\n');
|
|
113
|
+
}
|
|
114
|
+
if (result.valid) {
|
|
115
|
+
lines.push('✅ No drift detected - generated files match committed state');
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
lines.push('❌ Generated code differs from committed code:\n');
|
|
119
|
+
for (const file of result.changedFiles) {
|
|
120
|
+
lines.push(` - ${file}`);
|
|
121
|
+
}
|
|
122
|
+
lines.push('\n💡 Run `micro-contracts generate` to regenerate artifacts.');
|
|
123
|
+
lines.push('💡 Then commit the changes or verify they are expected.');
|
|
124
|
+
}
|
|
125
|
+
return lines.join('\n');
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/guardrails/drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrails module
|
|
3
|
+
*
|
|
4
|
+
* Provides AI-driven development guardrails for protecting generated artifacts
|
|
5
|
+
* and enforcing change policies.
|
|
6
|
+
*/
|
|
7
|
+
export type { GuardrailsConfig, ChecksConfig, CheckCommandConfig, AllowlistResult, AllowlistViolation, DriftResult, GeneratedManifest, GeneratedFileInfo, ManifestResult, ManifestMismatch, CheckOptions, CheckResult, CheckSummary, CheckDefinition, GateNumber, } from './types.js';
|
|
8
|
+
export { DEFAULT_GUARDRAILS, findGuardrailsConfig, loadGuardrailsConfig, loadGuardrailsConfigWithPath, generateGuardrailsTemplate, createGuardrailsConfig, } from './config.js';
|
|
9
|
+
export type { LoadedGuardrailsConfig } from './config.js';
|
|
10
|
+
export { matchWithNegation, matchGlob, getChangedFiles, verifyAllowlist, runAllowlistCheck, formatAllowlistResult, } from './allowlist.js';
|
|
11
|
+
export { checkDrift, checkUncommittedChanges, runDriftCheck, formatDriftResult, } from './drift.js';
|
|
12
|
+
export { hashFile, getGeneratedFiles, generateManifest, writeManifest, loadManifest, verifyManifest, runManifestCheck, formatManifestResult, } from './manifest.js';
|
|
13
|
+
export { findOpenAPISpecs, runLintCheck, } from './lint.js';
|
|
14
|
+
export { findTsConfigs, runTypecheckCheck, } from './typecheck.js';
|
|
15
|
+
export { checkMarkdownFile, findMarkdownFiles, runDocsCheck, } from './docs.js';
|
|
16
|
+
export { getImplementedOverlays, checkSecurityConsistency, findOverlayDirs, runSecurityCheck, } from './security.js';
|
|
17
|
+
export { runAllChecks, formatCheckResults, getAvailableChecks, GATE_DESCRIPTIONS, } from './runner.js';
|
|
18
|
+
export type { CheckSummaryWithGates } from './runner.js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,eAAe,EACf,UAAU,GACX,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,gBAAgB,EAChB,YAAY,GACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrails module
|
|
3
|
+
*
|
|
4
|
+
* Provides AI-driven development guardrails for protecting generated artifacts
|
|
5
|
+
* and enforcing change policies.
|
|
6
|
+
*/
|
|
7
|
+
// Config
|
|
8
|
+
export { DEFAULT_GUARDRAILS, findGuardrailsConfig, loadGuardrailsConfig, loadGuardrailsConfigWithPath, generateGuardrailsTemplate, createGuardrailsConfig, } from './config.js';
|
|
9
|
+
// Allowlist
|
|
10
|
+
export { matchWithNegation, matchGlob, getChangedFiles, verifyAllowlist, runAllowlistCheck, formatAllowlistResult, } from './allowlist.js';
|
|
11
|
+
// Drift
|
|
12
|
+
export { checkDrift, checkUncommittedChanges, runDriftCheck, formatDriftResult, } from './drift.js';
|
|
13
|
+
// Manifest
|
|
14
|
+
export { hashFile, getGeneratedFiles, generateManifest, writeManifest, loadManifest, verifyManifest, runManifestCheck, formatManifestResult, } from './manifest.js';
|
|
15
|
+
// Lint
|
|
16
|
+
export { findOpenAPISpecs, runLintCheck, } from './lint.js';
|
|
17
|
+
// Typecheck
|
|
18
|
+
export { findTsConfigs, runTypecheckCheck, } from './typecheck.js';
|
|
19
|
+
// Docs
|
|
20
|
+
export { checkMarkdownFile, findMarkdownFiles, runDocsCheck, } from './docs.js';
|
|
21
|
+
// Security
|
|
22
|
+
export { getImplementedOverlays, checkSecurityConsistency, findOverlayDirs, runSecurityCheck, } from './security.js';
|
|
23
|
+
// Check runner
|
|
24
|
+
export { runAllChecks, formatCheckResults, getAvailableChecks, GATE_DESCRIPTIONS, } from './runner.js';
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,SAAS;AACT,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,4BAA4B,EAC5B,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAIrB,YAAY;AACZ,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,QAAQ;AACR,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,WAAW;AACX,OAAO,EACL,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,OAAO;AACP,OAAO,EACL,gBAAgB,EAChB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,YAAY;AACZ,OAAO,EACL,aAAa,EACb,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO;AACP,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,WAAW;AACX,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,eAAe;AACf,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI lint check for guardrails
|
|
3
|
+
*
|
|
4
|
+
* Supports both built-in linter and external command execution.
|
|
5
|
+
*/
|
|
6
|
+
import type { CheckResult, CheckOptions } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Find OpenAPI spec files based on guardrails config or defaults
|
|
9
|
+
*/
|
|
10
|
+
export declare function findOpenAPISpecs(options: CheckOptions): Promise<string[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Run lint check on all OpenAPI specs
|
|
13
|
+
*/
|
|
14
|
+
export declare function runLintCheck(options: CheckOptions): Promise<CheckResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Run a custom command check (generic check execution)
|
|
17
|
+
* This is used for checks defined in guardrails.yaml
|
|
18
|
+
*/
|
|
19
|
+
export declare function runCustomCommandCheck(name: string, commandTemplate: string, options: CheckOptions): Promise<CheckResult>;
|
|
20
|
+
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/guardrails/lint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO5D;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuC/E;AAuDD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAwB9E;AA8DD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC,CAwDtB"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI lint check for guardrails
|
|
3
|
+
*
|
|
4
|
+
* Supports both built-in linter and external command execution.
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs';
|
|
7
|
+
import yaml from 'js-yaml';
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
import { lintSpec } from '../generator/linter.js';
|
|
10
|
+
import { loadGuardrailsConfig, loadGuardrailsConfigWithPath } from './config.js';
|
|
11
|
+
import { glob } from 'glob';
|
|
12
|
+
/**
|
|
13
|
+
* Find OpenAPI spec files based on guardrails config or defaults
|
|
14
|
+
*/
|
|
15
|
+
export async function findOpenAPISpecs(options) {
|
|
16
|
+
// Try to load guardrails config to find spec patterns
|
|
17
|
+
const config = loadGuardrailsConfig(options.guardrailsPath);
|
|
18
|
+
// Look for YAML files in spec directories - prioritize openapi/ subdirs
|
|
19
|
+
const defaultPatterns = [
|
|
20
|
+
'spec/**/openapi/*.yaml',
|
|
21
|
+
'spec/**/openapi/*.yml',
|
|
22
|
+
];
|
|
23
|
+
const specFiles = [];
|
|
24
|
+
for (const pattern of defaultPatterns) {
|
|
25
|
+
const matches = await glob(pattern, {
|
|
26
|
+
ignore: [
|
|
27
|
+
'**/node_modules/**',
|
|
28
|
+
'**/*.overlay.yaml',
|
|
29
|
+
'**/spectral.yaml',
|
|
30
|
+
'**/.generated-manifest.json',
|
|
31
|
+
'**/_shared/**', // Exclude shared schemas
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
// Filter to only OpenAPI specs (have openapi and paths fields)
|
|
35
|
+
for (const match of matches) {
|
|
36
|
+
try {
|
|
37
|
+
const content = fs.readFileSync(match, 'utf-8');
|
|
38
|
+
const doc = yaml.load(content);
|
|
39
|
+
// Must have both 'openapi' version and 'paths' to be a full spec
|
|
40
|
+
if (doc && typeof doc === 'object' && 'openapi' in doc && 'paths' in doc) {
|
|
41
|
+
specFiles.push(match);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Not a valid YAML or not an OpenAPI spec
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return [...new Set(specFiles)]; // Deduplicate
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Execute an external command and capture output
|
|
53
|
+
*/
|
|
54
|
+
async function executeCommand(command) {
|
|
55
|
+
return new Promise((resolve) => {
|
|
56
|
+
// Use shell to execute the full command string
|
|
57
|
+
// This allows complex commands like "cmd1 && cmd2" or commands with pipes
|
|
58
|
+
const child = spawn(command, [], {
|
|
59
|
+
shell: true,
|
|
60
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
61
|
+
});
|
|
62
|
+
let stdout = '';
|
|
63
|
+
let stderr = '';
|
|
64
|
+
child.stdout?.on('data', (data) => {
|
|
65
|
+
stdout += data.toString();
|
|
66
|
+
});
|
|
67
|
+
child.stderr?.on('data', (data) => {
|
|
68
|
+
stderr += data.toString();
|
|
69
|
+
});
|
|
70
|
+
child.on('close', (code) => {
|
|
71
|
+
resolve({ exitCode: code ?? 1, stdout, stderr });
|
|
72
|
+
});
|
|
73
|
+
child.on('error', (err) => {
|
|
74
|
+
resolve({ exitCode: 1, stdout: '', stderr: err.message });
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Expand placeholders in command template
|
|
80
|
+
*/
|
|
81
|
+
function expandPlaceholders(command, context) {
|
|
82
|
+
let result = command;
|
|
83
|
+
if (context.files) {
|
|
84
|
+
result = result.replace(/\{files\}/g, context.files.join(' '));
|
|
85
|
+
}
|
|
86
|
+
if (context.cwd) {
|
|
87
|
+
result = result.replace(/\{cwd\}/g, context.cwd);
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Run lint check on all OpenAPI specs
|
|
93
|
+
*/
|
|
94
|
+
export async function runLintCheck(options) {
|
|
95
|
+
const start = Date.now();
|
|
96
|
+
try {
|
|
97
|
+
// Load guardrails config to check for custom command
|
|
98
|
+
const { config } = loadGuardrailsConfigWithPath(options.guardrailsPath);
|
|
99
|
+
const lintConfig = config?.checks?.lint;
|
|
100
|
+
// If custom command is configured and enabled, use it
|
|
101
|
+
if (lintConfig?.command && lintConfig.enabled !== false) {
|
|
102
|
+
return await runExternalLintCheck(lintConfig.command, options, start);
|
|
103
|
+
}
|
|
104
|
+
// Otherwise, use built-in linter
|
|
105
|
+
return await runBuiltinLintCheck(options, start);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return {
|
|
109
|
+
name: 'lint',
|
|
110
|
+
status: 'fail',
|
|
111
|
+
duration: Date.now() - start,
|
|
112
|
+
message: error instanceof Error ? error.message : String(error),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Run external lint command
|
|
118
|
+
*/
|
|
119
|
+
async function runExternalLintCheck(commandTemplate, options, start) {
|
|
120
|
+
// Find OpenAPI specs
|
|
121
|
+
const specFiles = await findOpenAPISpecs(options);
|
|
122
|
+
if (specFiles.length === 0) {
|
|
123
|
+
return {
|
|
124
|
+
name: 'lint',
|
|
125
|
+
status: 'skip',
|
|
126
|
+
duration: Date.now() - start,
|
|
127
|
+
message: 'No OpenAPI specs found',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Expand placeholders
|
|
131
|
+
const command = expandPlaceholders(commandTemplate, {
|
|
132
|
+
files: specFiles,
|
|
133
|
+
cwd: process.cwd(),
|
|
134
|
+
});
|
|
135
|
+
if (options.verbose) {
|
|
136
|
+
console.log(`Running: ${command}`);
|
|
137
|
+
}
|
|
138
|
+
// Execute command
|
|
139
|
+
const { exitCode, stdout, stderr } = await executeCommand(command);
|
|
140
|
+
// Parse output for details
|
|
141
|
+
const output = (stdout + stderr).trim();
|
|
142
|
+
const lines = output.split('\n').filter(line => line.trim());
|
|
143
|
+
if (exitCode === 0) {
|
|
144
|
+
return {
|
|
145
|
+
name: 'lint',
|
|
146
|
+
status: 'pass',
|
|
147
|
+
duration: Date.now() - start,
|
|
148
|
+
message: `${specFiles.length} spec(s) passed lint`,
|
|
149
|
+
details: options.verbose && lines.length > 0 ? lines : undefined,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// Count errors and warnings from output
|
|
153
|
+
const errorCount = (output.match(/error/gi) || []).length;
|
|
154
|
+
const warningCount = (output.match(/warning/gi) || []).length;
|
|
155
|
+
return {
|
|
156
|
+
name: 'lint',
|
|
157
|
+
status: 'fail',
|
|
158
|
+
duration: Date.now() - start,
|
|
159
|
+
message: `Lint failed with ${errorCount} error(s), ${warningCount} warning(s)`,
|
|
160
|
+
details: lines.slice(0, 50), // Limit output
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Run a custom command check (generic check execution)
|
|
165
|
+
* This is used for checks defined in guardrails.yaml
|
|
166
|
+
*/
|
|
167
|
+
export async function runCustomCommandCheck(name, commandTemplate, options) {
|
|
168
|
+
const start = Date.now();
|
|
169
|
+
try {
|
|
170
|
+
// Find OpenAPI specs for {files} placeholder
|
|
171
|
+
const specFiles = await findOpenAPISpecs(options);
|
|
172
|
+
// Expand placeholders
|
|
173
|
+
const command = expandPlaceholders(commandTemplate, {
|
|
174
|
+
files: specFiles.length > 0 ? specFiles : undefined,
|
|
175
|
+
cwd: process.cwd(),
|
|
176
|
+
});
|
|
177
|
+
if (options.verbose) {
|
|
178
|
+
console.log(`Running: ${command}`);
|
|
179
|
+
}
|
|
180
|
+
// Execute command
|
|
181
|
+
const { exitCode, stdout, stderr } = await executeCommand(command);
|
|
182
|
+
// Parse output for details
|
|
183
|
+
const output = (stdout + stderr).trim();
|
|
184
|
+
const lines = output.split('\n').filter(line => line.trim());
|
|
185
|
+
if (exitCode === 0) {
|
|
186
|
+
return {
|
|
187
|
+
name,
|
|
188
|
+
status: 'pass',
|
|
189
|
+
duration: Date.now() - start,
|
|
190
|
+
message: `${name} passed`,
|
|
191
|
+
details: options.verbose && lines.length > 0 ? lines : undefined,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
// Count errors and warnings from output
|
|
195
|
+
const errorCount = (output.match(/error/gi) || []).length;
|
|
196
|
+
const warningCount = (output.match(/warning/gi) || []).length;
|
|
197
|
+
return {
|
|
198
|
+
name,
|
|
199
|
+
status: 'fail',
|
|
200
|
+
duration: Date.now() - start,
|
|
201
|
+
message: errorCount > 0 || warningCount > 0
|
|
202
|
+
? `${name} failed with ${errorCount} error(s), ${warningCount} warning(s)`
|
|
203
|
+
: `${name} failed (exit code: ${exitCode})`,
|
|
204
|
+
details: lines.slice(0, 50), // Limit output
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
return {
|
|
209
|
+
name,
|
|
210
|
+
status: 'fail',
|
|
211
|
+
duration: Date.now() - start,
|
|
212
|
+
message: error instanceof Error ? error.message : String(error),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Run built-in lint check
|
|
218
|
+
*/
|
|
219
|
+
async function runBuiltinLintCheck(options, start) {
|
|
220
|
+
// Find all OpenAPI specs
|
|
221
|
+
const specFiles = await findOpenAPISpecs(options);
|
|
222
|
+
if (specFiles.length === 0) {
|
|
223
|
+
return {
|
|
224
|
+
name: 'lint',
|
|
225
|
+
status: 'skip',
|
|
226
|
+
duration: Date.now() - start,
|
|
227
|
+
message: 'No OpenAPI specs found',
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
const allErrors = [];
|
|
231
|
+
const allWarnings = [];
|
|
232
|
+
let hasErrors = false;
|
|
233
|
+
for (const specFile of specFiles) {
|
|
234
|
+
try {
|
|
235
|
+
const content = fs.readFileSync(specFile, 'utf-8');
|
|
236
|
+
const spec = yaml.load(content);
|
|
237
|
+
const result = lintSpec(spec, { strict: false });
|
|
238
|
+
if (result.errors.length > 0) {
|
|
239
|
+
hasErrors = true;
|
|
240
|
+
for (const error of result.errors) {
|
|
241
|
+
allErrors.push(`${specFile}: [${error.code}] ${error.message}`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (result.warnings.length > 0) {
|
|
245
|
+
for (const warning of result.warnings) {
|
|
246
|
+
allWarnings.push(`${specFile}: [${warning.code}] ${warning.message}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
allErrors.push(`${specFile}: Failed to parse - ${error instanceof Error ? error.message : String(error)}`);
|
|
252
|
+
hasErrors = true;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (hasErrors) {
|
|
256
|
+
return {
|
|
257
|
+
name: 'lint',
|
|
258
|
+
status: 'fail',
|
|
259
|
+
duration: Date.now() - start,
|
|
260
|
+
message: `${allErrors.length} error(s) in ${specFiles.length} spec(s)`,
|
|
261
|
+
details: options.verbose ? [...allErrors, ...allWarnings.map(w => `⚠️ ${w}`)] : allErrors,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
name: 'lint',
|
|
266
|
+
status: 'pass',
|
|
267
|
+
duration: Date.now() - start,
|
|
268
|
+
message: `${specFiles.length} spec(s) passed lint`,
|
|
269
|
+
details: options.verbose && allWarnings.length > 0
|
|
270
|
+
? allWarnings.map(w => `⚠️ ${w}`)
|
|
271
|
+
: undefined,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/guardrails/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated artifact manifest management
|
|
3
|
+
*
|
|
4
|
+
* Creates and verifies manifests for generated files to detect tampering.
|
|
5
|
+
*/
|
|
6
|
+
import type { GeneratedManifest, ManifestResult, CheckResult, CheckOptions } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Calculate SHA-256 hash of file content
|
|
9
|
+
*/
|
|
10
|
+
export declare function hashFile(filePath: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Get all generated files in a directory
|
|
13
|
+
*/
|
|
14
|
+
export declare function getGeneratedFiles(baseDir: string, patterns?: string[]): Promise<string[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Generate manifest for a directory of generated files
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateManifest(baseDir: string, options?: {
|
|
19
|
+
generatorVersion?: string;
|
|
20
|
+
sourceMap?: Map<string, string>;
|
|
21
|
+
patterns?: string[];
|
|
22
|
+
}): Promise<GeneratedManifest>;
|
|
23
|
+
/**
|
|
24
|
+
* Write manifest to file
|
|
25
|
+
*/
|
|
26
|
+
export declare function writeManifest(manifest: GeneratedManifest, baseDir: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Load manifest from file
|
|
29
|
+
*/
|
|
30
|
+
export declare function loadManifest(baseDir: string): GeneratedManifest | null;
|
|
31
|
+
/**
|
|
32
|
+
* Verify generated files against manifest
|
|
33
|
+
*/
|
|
34
|
+
export declare function verifyManifest(baseDir: string): Promise<ManifestResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Run manifest verification check
|
|
37
|
+
*/
|
|
38
|
+
export declare function runManifestCheck(options: CheckOptions): Promise<CheckResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Format manifest result for CLI output
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatManifestResult(result: ManifestResult): string;
|
|
43
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/guardrails/manifest.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EACV,iBAAiB,EAEjB,cAAc,EAEd,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAQpB;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAM,EAAa,GAC5B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB,GACL,OAAO,CAAC,iBAAiB,CAAC,CAmC5B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIlF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAatE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA0D7E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAyBnE"}
|