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.
Files changed (99) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +351 -0
  3. package/dist/cli/templates.d.ts +16 -0
  4. package/dist/cli/templates.d.ts.map +1 -0
  5. package/dist/cli/templates.js +377 -0
  6. package/dist/cli/templates.js.map +1 -0
  7. package/dist/cli.d.ts +9 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +978 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/generator/dependencyGenerator.d.ts +43 -0
  12. package/dist/generator/dependencyGenerator.d.ts.map +1 -0
  13. package/dist/generator/dependencyGenerator.js +159 -0
  14. package/dist/generator/dependencyGenerator.js.map +1 -0
  15. package/dist/generator/domainGenerator.d.ts +16 -0
  16. package/dist/generator/domainGenerator.d.ts.map +1 -0
  17. package/dist/generator/domainGenerator.js +212 -0
  18. package/dist/generator/domainGenerator.js.map +1 -0
  19. package/dist/generator/index.d.ts +37 -0
  20. package/dist/generator/index.d.ts.map +1 -0
  21. package/dist/generator/index.js +747 -0
  22. package/dist/generator/index.js.map +1 -0
  23. package/dist/generator/linter.d.ts +24 -0
  24. package/dist/generator/linter.d.ts.map +1 -0
  25. package/dist/generator/linter.js +202 -0
  26. package/dist/generator/linter.js.map +1 -0
  27. package/dist/generator/overlayProcessor.d.ts +90 -0
  28. package/dist/generator/overlayProcessor.d.ts.map +1 -0
  29. package/dist/generator/overlayProcessor.js +532 -0
  30. package/dist/generator/overlayProcessor.js.map +1 -0
  31. package/dist/generator/schemaGenerator.d.ts +10 -0
  32. package/dist/generator/schemaGenerator.d.ts.map +1 -0
  33. package/dist/generator/schemaGenerator.js +299 -0
  34. package/dist/generator/schemaGenerator.js.map +1 -0
  35. package/dist/generator/templateProcessor.d.ts +178 -0
  36. package/dist/generator/templateProcessor.d.ts.map +1 -0
  37. package/dist/generator/templateProcessor.js +607 -0
  38. package/dist/generator/templateProcessor.js.map +1 -0
  39. package/dist/generator/typeGenerator.d.ts +9 -0
  40. package/dist/generator/typeGenerator.d.ts.map +1 -0
  41. package/dist/generator/typeGenerator.js +395 -0
  42. package/dist/generator/typeGenerator.js.map +1 -0
  43. package/dist/guardrails/allowlist.d.ts +45 -0
  44. package/dist/guardrails/allowlist.d.ts.map +1 -0
  45. package/dist/guardrails/allowlist.js +261 -0
  46. package/dist/guardrails/allowlist.js.map +1 -0
  47. package/dist/guardrails/config.d.ts +40 -0
  48. package/dist/guardrails/config.d.ts.map +1 -0
  49. package/dist/guardrails/config.js +174 -0
  50. package/dist/guardrails/config.js.map +1 -0
  51. package/dist/guardrails/docs.d.ts +24 -0
  52. package/dist/guardrails/docs.d.ts.map +1 -0
  53. package/dist/guardrails/docs.js +138 -0
  54. package/dist/guardrails/docs.js.map +1 -0
  55. package/dist/guardrails/drift.d.ts +23 -0
  56. package/dist/guardrails/drift.d.ts.map +1 -0
  57. package/dist/guardrails/drift.js +127 -0
  58. package/dist/guardrails/drift.js.map +1 -0
  59. package/dist/guardrails/index.d.ts +19 -0
  60. package/dist/guardrails/index.d.ts.map +1 -0
  61. package/dist/guardrails/index.js +25 -0
  62. package/dist/guardrails/index.js.map +1 -0
  63. package/dist/guardrails/lint.d.ts +20 -0
  64. package/dist/guardrails/lint.d.ts.map +1 -0
  65. package/dist/guardrails/lint.js +274 -0
  66. package/dist/guardrails/lint.js.map +1 -0
  67. package/dist/guardrails/manifest.d.ts +43 -0
  68. package/dist/guardrails/manifest.d.ts.map +1 -0
  69. package/dist/guardrails/manifest.js +231 -0
  70. package/dist/guardrails/manifest.js.map +1 -0
  71. package/dist/guardrails/runner.d.ts +31 -0
  72. package/dist/guardrails/runner.d.ts.map +1 -0
  73. package/dist/guardrails/runner.js +268 -0
  74. package/dist/guardrails/runner.js.map +1 -0
  75. package/dist/guardrails/security.d.ts +31 -0
  76. package/dist/guardrails/security.d.ts.map +1 -0
  77. package/dist/guardrails/security.js +181 -0
  78. package/dist/guardrails/security.js.map +1 -0
  79. package/dist/guardrails/typecheck.d.ts +15 -0
  80. package/dist/guardrails/typecheck.d.ts.map +1 -0
  81. package/dist/guardrails/typecheck.js +104 -0
  82. package/dist/guardrails/typecheck.js.map +1 -0
  83. package/dist/guardrails/types.d.ts +196 -0
  84. package/dist/guardrails/types.d.ts.map +1 -0
  85. package/dist/guardrails/types.js +8 -0
  86. package/dist/guardrails/types.js.map +1 -0
  87. package/dist/index.d.ts +7 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +7 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/types.d.ts +489 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +297 -0
  94. package/dist/types.js.map +1 -0
  95. package/docs/architecture.svg +226 -0
  96. package/docs/development-guardrails.md +541 -0
  97. package/docs/guardrails-concept.svg +252 -0
  98. package/docs/overlays-deep-dive.md +298 -0
  99. 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"}