delimit-cli 1.0.0 → 2.1.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 (95) hide show
  1. package/.github/workflows/api-governance.yml +24 -0
  2. package/README.md +57 -115
  3. package/adapters/codex-skill.js +87 -0
  4. package/adapters/cursor-extension.js +190 -0
  5. package/adapters/gemini-action.js +93 -0
  6. package/adapters/openai-function.js +112 -0
  7. package/adapters/xai-plugin.js +151 -0
  8. package/bin/delimit-cli.js +921 -0
  9. package/bin/delimit.js +237 -1
  10. package/delimit.yml +19 -0
  11. package/hooks/evidence-status.sh +12 -0
  12. package/hooks/git/commit-msg +4 -0
  13. package/hooks/git/pre-commit +4 -0
  14. package/hooks/git/pre-push +4 -0
  15. package/hooks/install-hooks.sh +583 -0
  16. package/hooks/message-auth-hook.js +9 -0
  17. package/hooks/message-governance-hook.js +9 -0
  18. package/hooks/models/claude-post.js +4 -0
  19. package/hooks/models/claude-pre.js +4 -0
  20. package/hooks/models/codex-post.js +4 -0
  21. package/hooks/models/codex-pre.js +4 -0
  22. package/hooks/models/cursor-post.js +4 -0
  23. package/hooks/models/cursor-pre.js +4 -0
  24. package/hooks/models/gemini-post.js +4 -0
  25. package/hooks/models/gemini-pre.js +4 -0
  26. package/hooks/models/openai-post.js +4 -0
  27. package/hooks/models/openai-pre.js +4 -0
  28. package/hooks/models/windsurf-post.js +4 -0
  29. package/hooks/models/windsurf-pre.js +4 -0
  30. package/hooks/models/xai-post.js +4 -0
  31. package/hooks/models/xai-pre.js +4 -0
  32. package/hooks/post-bash-hook.js +13 -0
  33. package/hooks/post-mcp-hook.js +13 -0
  34. package/hooks/post-response-hook.js +4 -0
  35. package/hooks/post-tool-hook.js +126 -0
  36. package/hooks/post-write-hook.js +13 -0
  37. package/hooks/pre-bash-hook.js +30 -0
  38. package/hooks/pre-mcp-hook.js +13 -0
  39. package/hooks/pre-read-hook.js +13 -0
  40. package/hooks/pre-search-hook.js +13 -0
  41. package/hooks/pre-submit-hook.js +4 -0
  42. package/hooks/pre-task-hook.js +13 -0
  43. package/hooks/pre-tool-hook.js +121 -0
  44. package/hooks/pre-web-hook.js +13 -0
  45. package/hooks/pre-write-hook.js +31 -0
  46. package/hooks/test-hooks.sh +12 -0
  47. package/hooks/update-delimit.sh +6 -0
  48. package/lib/agent.js +509 -0
  49. package/lib/api-engine.js +156 -0
  50. package/lib/auth-setup.js +891 -0
  51. package/lib/decision-engine.js +474 -0
  52. package/lib/hooks-installer.js +416 -0
  53. package/lib/platform-adapters.js +353 -0
  54. package/lib/proxy-handler.js +114 -0
  55. package/package.json +38 -30
  56. package/scripts/infect.js +128 -0
  57. package/test-decision-engine.js +181 -0
  58. package/test-hook.js +27 -0
  59. package/dist/commands/validate.d.ts +0 -2
  60. package/dist/commands/validate.d.ts.map +0 -1
  61. package/dist/commands/validate.js +0 -106
  62. package/dist/commands/validate.js.map +0 -1
  63. package/dist/index.d.ts +0 -3
  64. package/dist/index.d.ts.map +0 -1
  65. package/dist/index.js +0 -71
  66. package/dist/index.js.map +0 -1
  67. package/dist/types/index.d.ts +0 -39
  68. package/dist/types/index.d.ts.map +0 -1
  69. package/dist/types/index.js +0 -3
  70. package/dist/types/index.js.map +0 -1
  71. package/dist/utils/api.d.ts +0 -3
  72. package/dist/utils/api.d.ts.map +0 -1
  73. package/dist/utils/api.js +0 -64
  74. package/dist/utils/api.js.map +0 -1
  75. package/dist/utils/file.d.ts +0 -7
  76. package/dist/utils/file.d.ts.map +0 -1
  77. package/dist/utils/file.js +0 -69
  78. package/dist/utils/file.js.map +0 -1
  79. package/dist/utils/logger.d.ts +0 -14
  80. package/dist/utils/logger.d.ts.map +0 -1
  81. package/dist/utils/logger.js +0 -28
  82. package/dist/utils/logger.js.map +0 -1
  83. package/dist/utils/masker.d.ts +0 -14
  84. package/dist/utils/masker.d.ts.map +0 -1
  85. package/dist/utils/masker.js +0 -89
  86. package/dist/utils/masker.js.map +0 -1
  87. package/src/commands/validate.ts +0 -150
  88. package/src/index.ts +0 -80
  89. package/src/types/index.ts +0 -41
  90. package/src/utils/api.ts +0 -68
  91. package/src/utils/file.ts +0 -71
  92. package/src/utils/logger.ts +0 -27
  93. package/src/utils/masker.ts +0 -101
  94. package/test-sensitive.yaml +0 -109
  95. package/tsconfig.json +0 -23
@@ -0,0 +1,181 @@
1
+ #!/usr/bin/env node
2
+
3
+ const DecisionEngine = require('./lib/decision-engine');
4
+ const axios = require('axios');
5
+
6
+ async function runTests() {
7
+ console.log('=== DECISION ENGINE HOSTILE VERIFICATION ===\n');
8
+
9
+ // First restore good policy and restart agent
10
+ const fs = require('fs');
11
+ const goodPolicy = `defaultMode: advisory
12
+
13
+ rules:
14
+ - name: "Production Protection"
15
+ mode: enforce
16
+ triggers:
17
+ - gitBranch: [main, master, production]
18
+
19
+ - name: "Payment Code Security"
20
+ mode: enforce
21
+ triggers:
22
+ - path: "**/payment/**"
23
+ - content: ["stripe", "payment", "billing"]
24
+
25
+ - name: "Documentation Freedom"
26
+ mode: advisory
27
+ triggers:
28
+ - path: "**/*.md"
29
+ final: true`;
30
+
31
+ fs.writeFileSync('delimit.yml', goodPolicy);
32
+
33
+ // Kill existing agent
34
+ try {
35
+ require('child_process').execSync('pkill -f "node lib/agent.js"');
36
+ } catch(e) {}
37
+
38
+ // Start fresh agent
39
+ const agent = require('child_process').spawn('node', ['lib/agent.js'], {
40
+ detached: true,
41
+ stdio: 'ignore'
42
+ });
43
+ agent.unref();
44
+
45
+ // Wait for agent
46
+ await new Promise(r => setTimeout(r, 2000));
47
+
48
+ const tests = [
49
+ {
50
+ name: 'TEST 1: Documentation file -> Advisory',
51
+ context: {
52
+ command: 'pre-commit',
53
+ pwd: '/test',
54
+ gitBranch: 'feature',
55
+ files: ['README.md', 'docs/api.md'],
56
+ diff: 'documentation changes'
57
+ },
58
+ expected: 'advisory'
59
+ },
60
+ {
61
+ name: 'TEST 2: Payment path -> Enforce',
62
+ context: {
63
+ command: 'pre-commit',
64
+ pwd: '/test',
65
+ gitBranch: 'feature',
66
+ files: ['lib/payment/stripe.js'],
67
+ diff: 'payment code changes'
68
+ },
69
+ expected: 'enforce'
70
+ },
71
+ {
72
+ name: 'TEST 3: Main branch -> Enforce',
73
+ context: {
74
+ command: 'pre-commit',
75
+ pwd: '/test',
76
+ gitBranch: 'main',
77
+ files: ['lib/utils.js'],
78
+ diff: 'utility changes'
79
+ },
80
+ expected: 'enforce'
81
+ },
82
+ {
83
+ name: 'TEST 4: No match -> Default advisory',
84
+ context: {
85
+ command: 'pre-commit',
86
+ pwd: '/test',
87
+ gitBranch: 'feature',
88
+ files: ['lib/utils.js'],
89
+ diff: 'regular code'
90
+ },
91
+ expected: 'advisory'
92
+ },
93
+ {
94
+ name: 'TEST 5: Conflicting rules -> Stronger wins',
95
+ context: {
96
+ command: 'pre-commit',
97
+ pwd: '/test',
98
+ gitBranch: 'main',
99
+ files: ['README.md'],
100
+ diff: 'readme on main branch'
101
+ },
102
+ expected: 'enforce' // Production Protection should win over Documentation Freedom
103
+ },
104
+ {
105
+ name: 'TEST 6: Determinism check (repeat test 2)',
106
+ context: {
107
+ command: 'pre-commit',
108
+ pwd: '/test',
109
+ gitBranch: 'feature',
110
+ files: ['lib/payment/stripe.js'],
111
+ diff: 'payment code changes'
112
+ },
113
+ expected: 'enforce'
114
+ }
115
+ ];
116
+
117
+ const results = [];
118
+ for (const test of tests) {
119
+ try {
120
+ const response = await axios.post('http://127.0.0.1:7823/evaluate', test.context);
121
+ const decision = response.data;
122
+
123
+ const result = {
124
+ test: test.name,
125
+ expected: test.expected,
126
+ actual: decision.mode,
127
+ action: decision.action,
128
+ rule: decision.rule,
129
+ pass: decision.mode === test.expected
130
+ };
131
+
132
+ results.push(result);
133
+ console.log(`${test.name}`);
134
+ console.log(` Expected: ${test.expected}, Actual: ${decision.mode}`);
135
+ console.log(` Rule: ${decision.rule || 'none'}`);
136
+ console.log(` Status: ${result.pass ? '✅ PASS' : '❌ FAIL'}\n`);
137
+
138
+ // Get explanation for this decision
139
+ const explainResponse = await axios.get('http://127.0.0.1:7823/explain/last');
140
+ if (explainResponse.data.explanation) {
141
+ console.log(' Explanation quality check:');
142
+ const exp = explainResponse.data.explanation;
143
+ console.log(` - Has decision ID: ${exp.includes('Decision ID:') ? '✓' : '✗'}`);
144
+ console.log(` - Has effective mode: ${exp.includes('Effective:') ? '✓' : '✗'}`);
145
+ console.log(` - Has matched rules: ${exp.includes('MATCHED RULES') || exp.includes('No matching rules') ? '✓' : '✗'}`);
146
+ console.log(` - Has context: ${exp.includes('CONTEXT') ? '✓' : '✗'}\n`);
147
+ }
148
+
149
+ } catch (e) {
150
+ results.push({
151
+ test: test.name,
152
+ expected: test.expected,
153
+ actual: 'ERROR',
154
+ error: e.message,
155
+ pass: false
156
+ });
157
+ console.log(`${test.name}: ❌ ERROR - ${e.message}\n`);
158
+ }
159
+ }
160
+
161
+ // Summary
162
+ console.log('=== SUMMARY ===');
163
+ const passed = results.filter(r => r.pass).length;
164
+ console.log(`Passed: ${passed}/${results.length}`);
165
+
166
+ // Check determinism
167
+ if (results[1].actual === results[5].actual && results[1].rule === results[5].rule) {
168
+ console.log('✅ DETERMINISM CHECK: Same input produced same output');
169
+ } else {
170
+ console.log('❌ DETERMINISM CHECK: Same input produced different outputs!');
171
+ }
172
+
173
+ // Kill agent
174
+ try {
175
+ require('child_process').execSync('pkill -f "node lib/agent.js"');
176
+ } catch(e) {}
177
+
178
+ process.exit(passed === results.length ? 0 : 1);
179
+ }
180
+
181
+ runTests().catch(console.error);
package/test-hook.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Test script to simulate a Git pre-commit hook
4
+ const axios = require('axios');
5
+
6
+ async function testHook() {
7
+ const context = {
8
+ command: 'pre-commit',
9
+ pwd: '/home/delimit/npm-delimit',
10
+ gitBranch: 'main',
11
+ files: ['lib/payment/stripe.js', 'README.md'],
12
+ diff: 'diff --git a/lib/payment/stripe.js\n+const stripe = require("stripe");'
13
+ };
14
+
15
+ try {
16
+ const response = await axios.post('http://127.0.0.1:7823/evaluate', context);
17
+ console.log('Decision:', response.data);
18
+
19
+ // Now test the explain endpoint
20
+ const explainResponse = await axios.get('http://127.0.0.1:7823/explain/last');
21
+ console.log('\n' + explainResponse.data.explanation);
22
+ } catch (e) {
23
+ console.error('Error:', e.message);
24
+ }
25
+ }
26
+
27
+ testHook();
@@ -1,2 +0,0 @@
1
- export declare function validateCommand(filepath: string, options?: any): Promise<void>;
2
- //# sourceMappingURL=validate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAuBA,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,GAAQ,iBA8HxE"}
@@ -1,106 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateCommand = validateCommand;
4
- const file_1 = require("../utils/file");
5
- const masker_1 = require("../utils/masker");
6
- const api_1 = require("../utils/api");
7
- const logger_1 = require("../utils/logger");
8
- async function validateCommand(filepath, options = {}) {
9
- try {
10
- // Check if JSON output is requested
11
- const jsonOutput = options.output === 'json';
12
- if (!jsonOutput) {
13
- logger_1.logger.title('🚀 Delimit API Governance Validator');
14
- }
15
- // Step 1: Read file
16
- if (!jsonOutput) {
17
- logger_1.logger.info(`Reading file: ${filepath}`);
18
- const fileInfo = (0, file_1.getFileInfo)(filepath);
19
- logger_1.logger.dim(` File: ${fileInfo.name} (${fileInfo.size})`);
20
- }
21
- const rawData = (0, file_1.readOpenApiFile)(filepath);
22
- // Step 2: Apply Privacy Shield
23
- if (!jsonOutput) {
24
- logger_1.logger.info('Applying Privacy Shield™ - masking sensitive data...');
25
- }
26
- const maskedData = (0, masker_1.maskSensitiveData)(rawData);
27
- // Show masking stats if verbose mode
28
- if (options.verbose && !jsonOutput) {
29
- const stats = (0, masker_1.getMaskingStats)(rawData, maskedData);
30
- logger_1.logger.dim(` Removed ${stats.fieldsRemoved} fields (${stats.percentReduced}% size reduction)`);
31
- }
32
- // Step 3: Validate with API
33
- if (!jsonOutput) {
34
- logger_1.logger.loading('Validating with Delimit governance engine...');
35
- }
36
- const response = await api_1.delimitApi.post('/validate', {
37
- spec: maskedData
38
- });
39
- const result = response.data;
40
- // Step 4: Display results
41
- if (jsonOutput) {
42
- // Output JSON for machine parsing
43
- console.log(JSON.stringify(result));
44
- process.exit(result.valid ? 0 : 1);
45
- }
46
- // Human-readable output
47
- console.log(''); // Empty line for spacing
48
- if (result.valid) {
49
- logger_1.logger.success('✨ Validation PASSED - Your API specification is compliant!');
50
- if (result.warnings && result.warnings.length > 0) {
51
- console.log('');
52
- logger_1.logger.warn(`Found ${result.warnings.length} warning(s):`);
53
- result.warnings.forEach(warning => {
54
- logger_1.logger.validationWarning(warning.path || 'general', warning.message);
55
- });
56
- }
57
- // Show summary
58
- if (result.summary) {
59
- console.log('');
60
- logger_1.logger.info('Summary:');
61
- logger_1.logger.dim(` • Errors: ${result.summary.error_count}`);
62
- logger_1.logger.dim(` • Warnings: ${result.summary.warning_count}`);
63
- }
64
- process.exit(0);
65
- }
66
- else {
67
- logger_1.logger.error('❌ Validation FAILED - Your API specification has issues');
68
- if (result.errors && result.errors.length > 0) {
69
- console.log('');
70
- logger_1.logger.error(`Found ${result.errors.length} error(s):`);
71
- result.errors.forEach(error => {
72
- logger_1.logger.validationError(error.path || 'general', error.message);
73
- });
74
- }
75
- if (result.warnings && result.warnings.length > 0) {
76
- console.log('');
77
- logger_1.logger.warn(`Found ${result.warnings.length} warning(s):`);
78
- result.warnings.forEach(warning => {
79
- logger_1.logger.validationWarning(warning.path || 'general', warning.message);
80
- });
81
- }
82
- // Show summary
83
- if (result.summary) {
84
- console.log('');
85
- logger_1.logger.info('Summary:');
86
- logger_1.logger.dim(` • Errors: ${result.summary.error_count}`);
87
- logger_1.logger.dim(` • Warnings: ${result.summary.warning_count}`);
88
- }
89
- console.log('');
90
- logger_1.logger.info('💡 Fix the errors above and run validation again.');
91
- process.exit(1);
92
- }
93
- }
94
- catch (error) {
95
- console.log(''); // Empty line for spacing
96
- logger_1.logger.error('Validation failed with error:');
97
- logger_1.logger.error(error.message);
98
- if (error.message.includes('DELIMIT_API_KEY')) {
99
- console.log('');
100
- logger_1.logger.info('📝 Get your free API key at:');
101
- logger_1.logger.info(' https://rapidapi.com/delimit/api/openapi-diff-api');
102
- }
103
- process.exit(1);
104
- }
105
- }
106
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js DELETED
@@ -1,71 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const commander_1 = require("commander");
5
- const validate_1 = require("./commands/validate");
6
- const logger_1 = require("./utils/logger");
7
- // Create the main program
8
- const program = new commander_1.Command();
9
- program
10
- .name('delimit')
11
- .description('CLI tool for Delimit API governance with built-in Privacy Shield™')
12
- .version('1.0.0')
13
- .option('-v, --verbose', 'Show detailed output')
14
- .option('--api-url <url>', 'Override API URL (for testing)');
15
- // Command: delimit validate <filepath>
16
- program
17
- .command('validate')
18
- .description('Validate a local OpenAPI specification against governance rules')
19
- .argument('<filepath>', 'Path to the OpenAPI specification file (JSON or YAML)')
20
- .option('--verbose', 'Show detailed validation output')
21
- .option('--output <format>', 'Output format: text or json', 'text')
22
- .action(async (filepath, options) => {
23
- // Merge global and command options
24
- const globalOptions = program.opts();
25
- const mergedOptions = { ...globalOptions, ...options };
26
- // Set API URL if provided
27
- if (mergedOptions.apiUrl) {
28
- process.env.DELIMIT_API_URL = mergedOptions.apiUrl;
29
- }
30
- await (0, validate_1.validateCommand)(filepath, mergedOptions);
31
- });
32
- // Future commands placeholder
33
- program
34
- .command('diff')
35
- .description('Compare two OpenAPI specifications (coming soon)')
36
- .argument('<old>', 'Path to the old/previous OpenAPI spec')
37
- .argument('<new>', 'Path to the new/current OpenAPI spec')
38
- .action(() => {
39
- logger_1.logger.info('The diff command is coming soon in v1.1.0!');
40
- logger_1.logger.info('It will detect breaking changes between API versions.');
41
- process.exit(0);
42
- });
43
- program
44
- .command('analyze')
45
- .description('Analyze API changes for risks (coming soon)')
46
- .argument('<old>', 'Path to the old OpenAPI spec')
47
- .argument('<new>', 'Path to the new OpenAPI spec')
48
- .action(() => {
49
- logger_1.logger.info('The analyze command is coming soon in v1.1.0!');
50
- logger_1.logger.info('It will identify risky changes and soft breaks.');
51
- process.exit(0);
52
- });
53
- // Handle unknown commands
54
- program.on('command:*', () => {
55
- logger_1.logger.error(`Invalid command: ${program.args.join(' ')}`);
56
- logger_1.logger.info('Run "delimit --help" for a list of available commands.');
57
- process.exit(1);
58
- });
59
- // Catch unhandled rejections
60
- process.on('unhandledRejection', (reason) => {
61
- logger_1.logger.error('Unexpected error occurred:');
62
- logger_1.logger.error(reason?.message || reason);
63
- process.exit(1);
64
- });
65
- // Parse arguments
66
- program.parse(process.argv);
67
- // Show help if no arguments provided
68
- if (!process.argv.slice(2).length) {
69
- program.outputHelp();
70
- }
71
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- export interface OpenApiSpec {
2
- openapi?: string;
3
- swagger?: string;
4
- info?: {
5
- title?: string;
6
- version?: string;
7
- description?: string;
8
- [key: string]: any;
9
- };
10
- paths?: Record<string, any>;
11
- components?: Record<string, any>;
12
- servers?: Array<any>;
13
- [key: string]: any;
14
- }
15
- export interface ValidationError {
16
- path?: string;
17
- message: string;
18
- severity?: 'error' | 'warning' | 'info';
19
- code?: string;
20
- }
21
- export interface ValidationResult {
22
- valid: boolean;
23
- errors: ValidationError[];
24
- warnings: ValidationError[];
25
- summary: {
26
- error_count: number;
27
- warning_count: number;
28
- };
29
- metadata?: {
30
- engine_version?: string;
31
- validation_time?: string;
32
- };
33
- }
34
- export interface CliOptions {
35
- verbose?: boolean;
36
- output?: 'json' | 'text';
37
- quiet?: boolean;
38
- }
39
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- import { AxiosInstance } from 'axios';
2
- export declare const delimitApi: AxiosInstance;
3
- //# sourceMappingURL=api.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG7C,eAAO,MAAM,UAAU,EAAE,aAOvB,CAAC"}
package/dist/utils/api.js DELETED
@@ -1,64 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.delimitApi = void 0;
7
- const axios_1 = __importDefault(require("axios"));
8
- // Create axios instance with default config
9
- exports.delimitApi = axios_1.default.create({
10
- baseURL: process.env.DELIMIT_API_URL || 'https://api.delimit.ai/v1',
11
- timeout: 30000, // 30 second timeout
12
- headers: {
13
- 'Content-Type': 'application/json',
14
- 'User-Agent': 'delimit-cli/1.0.0'
15
- }
16
- });
17
- // Request interceptor to add API key
18
- exports.delimitApi.interceptors.request.use((config) => {
19
- const apiKey = process.env.DELIMIT_API_KEY;
20
- if (!apiKey) {
21
- throw new Error('DELIMIT_API_KEY environment variable is not set.\n' +
22
- 'Please set it using: export DELIMIT_API_KEY="your-api-key"\n' +
23
- 'Get your API key at: https://rapidapi.com/delimit/api/schema-diff');
24
- }
25
- // Use RapidAPI header format
26
- config.headers['X-RapidAPI-Key'] = apiKey;
27
- config.headers['X-RapidAPI-Host'] = 'api.delimit.ai';
28
- return config;
29
- }, (error) => {
30
- return Promise.reject(error);
31
- });
32
- // Response interceptor for error handling
33
- exports.delimitApi.interceptors.response.use((response) => response, (error) => {
34
- // Enhance error messages
35
- if (error.response) {
36
- // Server responded with error
37
- const status = error.response.status;
38
- const data = error.response.data;
39
- if (status === 401) {
40
- error.message = 'Invalid API key. Please check your DELIMIT_API_KEY.';
41
- }
42
- else if (status === 429) {
43
- error.message = 'Rate limit exceeded. Please try again later.';
44
- }
45
- else if (status === 422) {
46
- error.message = 'Invalid OpenAPI specification format.';
47
- if (data?.error?.message) {
48
- error.message += `\n${data.error.message}`;
49
- }
50
- }
51
- else if (status >= 500) {
52
- error.message = 'Delimit API server error. Please try again later.';
53
- }
54
- else if (data?.error?.message) {
55
- error.message = data.error.message;
56
- }
57
- }
58
- else if (error.request) {
59
- // Request was made but no response
60
- error.message = 'Could not connect to Delimit API. Please check your internet connection.';
61
- }
62
- return Promise.reject(error);
63
- });
64
- //# sourceMappingURL=api.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAE7C,4CAA4C;AAC/B,QAAA,UAAU,GAAkB,eAAK,CAAC,MAAM,CAAC;IACpD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,2BAA2B;IACnE,OAAO,EAAE,KAAK,EAAE,oBAAoB;IACpC,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;QAClC,YAAY,EAAE,mBAAmB;KAClC;CACF,CAAC,CAAC;AAEH,qCAAqC;AACrC,kBAAU,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CACjC,CAAC,MAAM,EAAE,EAAE;IACT,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAE3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,oDAAoD;YACpD,8DAA8D;YAC9D,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,6BAA6B;IAC7B,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC;IAC1C,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,gBAAgB,CAAC;IAErD,OAAO,MAAM,CAAC;AAChB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;IACR,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC,CACF,CAAC;AAEF,0CAA0C;AAC1C,kBAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAClC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAK,EAAE,EAAE;IACR,yBAAyB;IACzB,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,8BAA8B;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAEjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,KAAK,CAAC,OAAO,GAAG,qDAAqD,CAAC;QACxE,CAAC;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,KAAK,CAAC,OAAO,GAAG,8CAA8C,CAAC;QACjE,CAAC;aAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,KAAK,CAAC,OAAO,GAAG,uCAAuC,CAAC;YACxD,IAAI,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBACzB,KAAK,CAAC,OAAO,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,GAAG,mDAAmD,CAAC;QACtE,CAAC;aAAM,IAAI,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAChC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACrC,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACzB,mCAAmC;QACnC,KAAK,CAAC,OAAO,GAAG,0EAA0E,CAAC;IAC7F,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC,CACF,CAAC"}
@@ -1,7 +0,0 @@
1
- export declare function readOpenApiFile(filepath: string): any;
2
- export declare function getFileInfo(filepath: string): {
3
- name: string;
4
- size: string;
5
- extension: string;
6
- };
7
- //# sourceMappingURL=file.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CA6CrD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CASA"}
@@ -1,69 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.readOpenApiFile = readOpenApiFile;
7
- exports.getFileInfo = getFileInfo;
8
- const fs_1 = __importDefault(require("fs"));
9
- const path_1 = __importDefault(require("path"));
10
- const js_yaml_1 = __importDefault(require("js-yaml"));
11
- function readOpenApiFile(filepath) {
12
- // Resolve to absolute path
13
- const absolutePath = path_1.default.resolve(filepath);
14
- if (!fs_1.default.existsSync(absolutePath)) {
15
- throw new Error(`File not found: ${absolutePath}`);
16
- }
17
- const stats = fs_1.default.statSync(absolutePath);
18
- if (!stats.isFile()) {
19
- throw new Error(`Path is not a file: ${absolutePath}`);
20
- }
21
- // Check file size (limit to 10MB for safety)
22
- const maxSize = 10 * 1024 * 1024; // 10MB
23
- if (stats.size > maxSize) {
24
- throw new Error(`File too large (${Math.round(stats.size / 1024 / 1024)}MB). Maximum size is 10MB.`);
25
- }
26
- const content = fs_1.default.readFileSync(absolutePath, 'utf8');
27
- // Determine file type by extension
28
- const ext = path_1.default.extname(absolutePath).toLowerCase();
29
- try {
30
- if (ext === '.json') {
31
- return JSON.parse(content);
32
- }
33
- else if (ext === '.yaml' || ext === '.yml') {
34
- return js_yaml_1.default.load(content);
35
- }
36
- else {
37
- // Try to parse as YAML first (it can handle JSON too)
38
- try {
39
- return js_yaml_1.default.load(content);
40
- }
41
- catch {
42
- // Fall back to JSON
43
- return JSON.parse(content);
44
- }
45
- }
46
- }
47
- catch (err) {
48
- throw new Error(`Failed to parse file as ${ext === '.json' ? 'JSON' : 'YAML'}.\n` +
49
- `Please ensure the file is valid OpenAPI specification.\n` +
50
- `Parser error: ${err.message}`);
51
- }
52
- }
53
- function getFileInfo(filepath) {
54
- const absolutePath = path_1.default.resolve(filepath);
55
- const stats = fs_1.default.statSync(absolutePath);
56
- return {
57
- name: path_1.default.basename(absolutePath),
58
- size: formatFileSize(stats.size),
59
- extension: path_1.default.extname(absolutePath).toLowerCase()
60
- };
61
- }
62
- function formatFileSize(bytes) {
63
- if (bytes < 1024)
64
- return `${bytes} bytes`;
65
- if (bytes < 1024 * 1024)
66
- return `${(bytes / 1024).toFixed(1)} KB`;
67
- return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
68
- }
69
- //# sourceMappingURL=file.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- export declare const logger: {
2
- info: (msg: string) => void;
3
- success: (msg: string) => void;
4
- error: (msg: string) => void;
5
- warn: (msg: string) => void;
6
- title: (msg: string) => void;
7
- validationError: (path: string, message: string) => void;
8
- validationWarning: (path: string, message: string) => void;
9
- dim: (msg: string) => void;
10
- loading: (msg: string) => void;
11
- bold: (msg: string) => string;
12
- underline: (msg: string) => string;
13
- };
14
- //# sourceMappingURL=logger.d.ts.map