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,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,8 @@
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
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/guardrails/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * API Framework
3
+ * OpenAPI-first API framework with code generation for Fastify
4
+ */
5
+ export * from './types.js';
6
+ export * from './generator/index.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * API Framework
3
+ * OpenAPI-first API framework with code generation for Fastify
4
+ */
5
+ export * from './types.js';
6
+ export * from './generator/index.js';
7
+ //# sourceMappingURL=index.js.map
@@ -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"}