@ordis-dev/ordis 0.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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +192 -0
  3. package/dist/__tests__/api.test.d.ts +5 -0
  4. package/dist/__tests__/api.test.d.ts.map +1 -0
  5. package/dist/__tests__/api.test.js +95 -0
  6. package/dist/__tests__/api.test.js.map +1 -0
  7. package/dist/__tests__/cli.test.d.ts +6 -0
  8. package/dist/__tests__/cli.test.d.ts.map +1 -0
  9. package/dist/__tests__/cli.test.js +103 -0
  10. package/dist/__tests__/cli.test.js.map +1 -0
  11. package/dist/cli/__tests__/cli.test.d.ts +5 -0
  12. package/dist/cli/__tests__/cli.test.d.ts.map +1 -0
  13. package/dist/cli/__tests__/cli.test.js +13 -0
  14. package/dist/cli/__tests__/cli.test.js.map +1 -0
  15. package/dist/cli.d.ts +7 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +225 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/core/__tests__/pipeline.test.d.ts +5 -0
  20. package/dist/core/__tests__/pipeline.test.d.ts.map +1 -0
  21. package/dist/core/__tests__/pipeline.test.js +334 -0
  22. package/dist/core/__tests__/pipeline.test.js.map +1 -0
  23. package/dist/core/__tests__/validator.test.d.ts +5 -0
  24. package/dist/core/__tests__/validator.test.d.ts.map +1 -0
  25. package/dist/core/__tests__/validator.test.js +124 -0
  26. package/dist/core/__tests__/validator.test.js.map +1 -0
  27. package/dist/core/errors.d.ts +27 -0
  28. package/dist/core/errors.d.ts.map +1 -0
  29. package/dist/core/errors.js +35 -0
  30. package/dist/core/errors.js.map +1 -0
  31. package/dist/core/index.d.ts +8 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +7 -0
  34. package/dist/core/index.js.map +1 -0
  35. package/dist/core/pipeline.d.ts +28 -0
  36. package/dist/core/pipeline.d.ts.map +1 -0
  37. package/dist/core/pipeline.js +212 -0
  38. package/dist/core/pipeline.js.map +1 -0
  39. package/dist/core/types.d.ts +55 -0
  40. package/dist/core/types.d.ts.map +1 -0
  41. package/dist/core/types.js +5 -0
  42. package/dist/core/types.js.map +1 -0
  43. package/dist/core/validator.d.ts +19 -0
  44. package/dist/core/validator.d.ts.map +1 -0
  45. package/dist/core/validator.js +147 -0
  46. package/dist/core/validator.js.map +1 -0
  47. package/dist/index.d.ts +19 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +18 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/llm/__tests__/client.test.d.ts +5 -0
  52. package/dist/llm/__tests__/client.test.d.ts.map +1 -0
  53. package/dist/llm/__tests__/client.test.js +350 -0
  54. package/dist/llm/__tests__/client.test.js.map +1 -0
  55. package/dist/llm/__tests__/prompt-builder.test.d.ts +5 -0
  56. package/dist/llm/__tests__/prompt-builder.test.d.ts.map +1 -0
  57. package/dist/llm/__tests__/prompt-builder.test.js +171 -0
  58. package/dist/llm/__tests__/prompt-builder.test.js.map +1 -0
  59. package/dist/llm/__tests__/retry.test.d.ts +5 -0
  60. package/dist/llm/__tests__/retry.test.d.ts.map +1 -0
  61. package/dist/llm/__tests__/retry.test.js +350 -0
  62. package/dist/llm/__tests__/retry.test.js.map +1 -0
  63. package/dist/llm/__tests__/token-counter.test.d.ts +5 -0
  64. package/dist/llm/__tests__/token-counter.test.d.ts.map +1 -0
  65. package/dist/llm/__tests__/token-counter.test.js +166 -0
  66. package/dist/llm/__tests__/token-counter.test.js.map +1 -0
  67. package/dist/llm/client.d.ts +56 -0
  68. package/dist/llm/client.d.ts.map +1 -0
  69. package/dist/llm/client.js +266 -0
  70. package/dist/llm/client.js.map +1 -0
  71. package/dist/llm/errors.d.ts +27 -0
  72. package/dist/llm/errors.d.ts.map +1 -0
  73. package/dist/llm/errors.js +35 -0
  74. package/dist/llm/errors.js.map +1 -0
  75. package/dist/llm/index.d.ts +10 -0
  76. package/dist/llm/index.d.ts.map +1 -0
  77. package/dist/llm/index.js +8 -0
  78. package/dist/llm/index.js.map +1 -0
  79. package/dist/llm/prompt-builder.d.ts +13 -0
  80. package/dist/llm/prompt-builder.d.ts.map +1 -0
  81. package/dist/llm/prompt-builder.js +107 -0
  82. package/dist/llm/prompt-builder.js.map +1 -0
  83. package/dist/llm/token-counter.d.ts +82 -0
  84. package/dist/llm/token-counter.d.ts.map +1 -0
  85. package/dist/llm/token-counter.js +109 -0
  86. package/dist/llm/token-counter.js.map +1 -0
  87. package/dist/llm/types.d.ts +96 -0
  88. package/dist/llm/types.d.ts.map +1 -0
  89. package/dist/llm/types.js +5 -0
  90. package/dist/llm/types.js.map +1 -0
  91. package/dist/schemas/__tests__/integration.test.d.ts +5 -0
  92. package/dist/schemas/__tests__/integration.test.d.ts.map +1 -0
  93. package/dist/schemas/__tests__/integration.test.js +366 -0
  94. package/dist/schemas/__tests__/integration.test.js.map +1 -0
  95. package/dist/schemas/__tests__/loader.test.d.ts +5 -0
  96. package/dist/schemas/__tests__/loader.test.d.ts.map +1 -0
  97. package/dist/schemas/__tests__/loader.test.js +271 -0
  98. package/dist/schemas/__tests__/loader.test.js.map +1 -0
  99. package/dist/schemas/__tests__/validator.test.d.ts +5 -0
  100. package/dist/schemas/__tests__/validator.test.d.ts.map +1 -0
  101. package/dist/schemas/__tests__/validator.test.js +592 -0
  102. package/dist/schemas/__tests__/validator.test.js.map +1 -0
  103. package/dist/schemas/errors.d.ts +38 -0
  104. package/dist/schemas/errors.d.ts.map +1 -0
  105. package/dist/schemas/errors.js +49 -0
  106. package/dist/schemas/errors.js.map +1 -0
  107. package/dist/schemas/index.d.ts +8 -0
  108. package/dist/schemas/index.d.ts.map +1 -0
  109. package/dist/schemas/index.js +7 -0
  110. package/dist/schemas/index.js.map +1 -0
  111. package/dist/schemas/loader.d.ts +29 -0
  112. package/dist/schemas/loader.d.ts.map +1 -0
  113. package/dist/schemas/loader.js +71 -0
  114. package/dist/schemas/loader.js.map +1 -0
  115. package/dist/schemas/types.d.ts +75 -0
  116. package/dist/schemas/types.d.ts.map +1 -0
  117. package/dist/schemas/types.js +7 -0
  118. package/dist/schemas/types.js.map +1 -0
  119. package/dist/schemas/validator.d.ts +12 -0
  120. package/dist/schemas/validator.d.ts.map +1 -0
  121. package/dist/schemas/validator.js +211 -0
  122. package/dist/schemas/validator.js.map +1 -0
  123. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Ordis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,192 @@
1
+ # Ordis
2
+
3
+ Ordis is a local-first tool and library that turns messy, unstructured text into clean, structured data using a schema-driven extraction pipeline powered by LLMs. You give it a schema that describes the fields you expect, point it at some raw text, and choose any OpenAI-compatible model. Ordis builds the prompt, calls the model, validates the output, and returns either a correct structured record or a clear error.
4
+
5
+ **Ordis does for LLM extraction what Prisma does for databases: strict schemas, predictable output and no more glue code.**
6
+
7
+ ## Status
8
+
9
+ **✅ CLI functional** - Core extraction pipeline working with real LLMs. Ready for testing and feedback.
10
+
11
+ **✅ Programmatic API** - Can be used as an npm package in Node.js applications.
12
+
13
+ ## Features
14
+
15
+ - **Local-first extraction**: Supports Ollama, LM Studio, or any OpenAI-compatible endpoint
16
+ - **Schema-first workflow**: Define your data structure upfront
17
+ - **Deterministic output**: Returns validated records or structured failures
18
+ - **Token budget awareness**: Automatic token counting with warnings and limits
19
+ - **Dual-purpose**: Use as a CLI or import as a library
20
+ - **TypeScript support**: Full type definitions included
21
+
22
+ ## Example
23
+
24
+ ```bash
25
+ ordis extract \
26
+ --schema examples/invoice.schema.json \
27
+ --input examples/invoice.txt \
28
+ --base http://localhost:11434/v1 \
29
+ --model llama3.1:8b \
30
+ --debug
31
+ ```
32
+
33
+ **Sample schema** (`invoice.schema.json`):
34
+
35
+ ```json
36
+ {
37
+ "fields": {
38
+ "invoice_id": { "type": "string" },
39
+ "amount": { "type": "number" },
40
+ "currency": { "type": "string", "enum": ["USD", "SGD", "EUR"] },
41
+ "date": { "type": "date", "optional": true }
42
+ }
43
+ }
44
+ ```
45
+
46
+ ## Model Compatibility
47
+
48
+ Works with any service exposing an OpenAI-compatible API:
49
+
50
+ - Ollama
51
+ - LM Studio
52
+ - OpenRouter
53
+ - Mistral
54
+ - Groq
55
+ - OpenAI
56
+ - vLLM servers
57
+
58
+ ## Installation
59
+
60
+ ### From npm (recommended)
61
+
62
+ Install globally to use the CLI anywhere:
63
+
64
+ ```bash
65
+ npm install -g @ordis-dev/ordis
66
+ ordis --help
67
+ ```
68
+
69
+ Or install locally in your project:
70
+
71
+ ```bash
72
+ npm install @ordis-dev/ordis
73
+ ```
74
+
75
+ ### From Source
76
+
77
+ ```bash
78
+ git clone https://github.com/ordis-dev/ordis
79
+ cd ordis
80
+ npm install
81
+ npm run build
82
+ node dist/cli.js --help
83
+ ```
84
+
85
+ ## Usage
86
+
87
+ ### CLI Usage
88
+
89
+ Extract data from text using a schema:
90
+
91
+ ```bash
92
+ ordis extract \
93
+ --schema examples/invoice.schema.json \
94
+ --input examples/invoice.txt \
95
+ --base http://localhost:11434/v1 \
96
+ --model llama3.1:8b \
97
+ --debug
98
+ ```
99
+
100
+ ### Programmatic Usage
101
+
102
+ Use ordis as a library in your Node.js application:
103
+
104
+ ```typescript
105
+ import { extract, loadSchema, LLMClient } from '@ordis-dev/ordis';
106
+
107
+ // Load schema from file
108
+ const schema = await loadSchema('./invoice.schema.json');
109
+
110
+ // Or create schema from object
111
+ import { loadSchemaFromObject } from 'ordis-cli';
112
+ const schema = loadSchemaFromObject({
113
+ fields: {
114
+ invoice_id: { type: 'string' },
115
+ amount: { type: 'number' },
116
+ currency: { type: 'string', enum: ['USD', 'EUR', 'SGD'] }
117
+ }
118
+ });
119
+
120
+ // Configure LLM
121
+ const llmConfig = {
122
+ baseURL: 'http://localhost:11434/v1',
123
+ model: 'llama3.2:3b'
124
+ };
125
+
126
+ // Extract data
127
+ const result = await extract({
128
+ input: 'Invoice #INV-2024-0042 for $1,250.00 USD',
129
+ schema,
130
+ llmConfig
131
+ });
132
+
133
+ if (result.success) {
134
+ console.log(result.data);
135
+ // { invoice_id: 'INV-2024-0042', amount: 1250, currency: 'USD' }
136
+ console.log('Confidence:', result.confidence);
137
+ } else {
138
+ console.error('Extraction failed:', result.errors);
139
+ }
140
+ ```
141
+
142
+ **Using LLM Presets:**
143
+
144
+ ```typescript
145
+ import { extract, loadSchema, LLMPresets } from '@ordis-dev/ordis';
146
+
147
+ const schema = await loadSchema('./schema.json');
148
+
149
+ // Use preset configurations
150
+ const result = await extract({
151
+ input: text,
152
+ schema,
153
+ llmConfig: LLMPresets.ollama('llama3.2:3b')
154
+ // Or: LLMPresets.openai(apiKey, 'gpt-4o-mini')
155
+ // Or: LLMPresets.lmStudio('local-model')
156
+ });
157
+ ```
158
+
159
+ ## What Works
160
+
161
+ - ✅ Schema loader and validator
162
+ - ✅ Prompt builder with confidence scoring
163
+ - ✅ Universal LLM client (OpenAI-compatible APIs)
164
+ - ✅ Token budget awareness with warnings and errors
165
+ - ✅ Structured error system
166
+ - ✅ CLI extraction command
167
+ - ✅ Programmatic API for library usage
168
+ - ✅ Field-level confidence tracking
169
+ - ✅ TypeScript type definitions
170
+ - ✅ Performance benchmarks
171
+
172
+ ## Performance
173
+
174
+ Pipeline overhead is negligible (~1-2ms). LLM calls dominate execution time (1-10s depending on model). See [benchmarks/README.md](benchmarks/README.md) for detailed metrics.
175
+
176
+ Run benchmarks:
177
+ ```bash
178
+ npm run benchmark
179
+ ```
180
+
181
+ ## Roadmap
182
+ Smart input truncation ([#40](https://github.com/ordis-dev/ordis/issues/40))
183
+ - [ ] Multi-pass extraction for large inputs ([#41](https://github.com/ordis-dev/ordis/issues/41))
184
+ - [ ]
185
+ - [ ] Config file support ([#16](https://github.com/ordis-dev/ordis/issues/16))
186
+ - [ ] Output formatting options ([#14](https://github.com/ordis-dev/ordis/issues/14))
187
+ - [ ] Batch extraction ([#19](https://github.com/ordis-dev/ordis/issues/19))
188
+ - [ ] More example schemas ([#13](https://github.com/ordis-dev/ordis/issues/13))
189
+
190
+ ## Contributing
191
+
192
+ Contributions are welcome!
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for programmatic API imports
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=api.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Tests for programmatic API imports
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ describe('Programmatic API', () => {
6
+ describe('Core exports', () => {
7
+ it('should export extract function', async () => {
8
+ const { extract } = await import('../index.js');
9
+ expect(extract).toBeDefined();
10
+ expect(typeof extract).toBe('function');
11
+ });
12
+ it('should export ExtractionPipeline class', async () => {
13
+ const { ExtractionPipeline } = await import('../index.js');
14
+ expect(ExtractionPipeline).toBeDefined();
15
+ expect(typeof ExtractionPipeline).toBe('function');
16
+ });
17
+ it('should export validateExtractedData', async () => {
18
+ const { validateExtractedData } = await import('../index.js');
19
+ expect(validateExtractedData).toBeDefined();
20
+ expect(typeof validateExtractedData).toBe('function');
21
+ });
22
+ it('should export PipelineError', async () => {
23
+ const { PipelineError, PipelineErrorCodes } = await import('../index.js');
24
+ expect(PipelineError).toBeDefined();
25
+ expect(PipelineErrorCodes).toBeDefined();
26
+ });
27
+ });
28
+ describe('Schema exports', () => {
29
+ it('should export loadSchema function', async () => {
30
+ const { loadSchema } = await import('../index.js');
31
+ expect(loadSchema).toBeDefined();
32
+ expect(typeof loadSchema).toBe('function');
33
+ });
34
+ it('should export parseSchema function', async () => {
35
+ const { parseSchema } = await import('../index.js');
36
+ expect(parseSchema).toBeDefined();
37
+ expect(typeof parseSchema).toBe('function');
38
+ });
39
+ it('should export validateSchema function', async () => {
40
+ const { validateSchema } = await import('../index.js');
41
+ expect(validateSchema).toBeDefined();
42
+ expect(typeof validateSchema).toBe('function');
43
+ });
44
+ it('should export SchemaValidationError', async () => {
45
+ const { SchemaValidationError, SchemaErrorCodes } = await import('../index.js');
46
+ expect(SchemaValidationError).toBeDefined();
47
+ expect(SchemaErrorCodes).toBeDefined();
48
+ });
49
+ });
50
+ describe('LLM exports', () => {
51
+ it('should export LLMClient class', async () => {
52
+ const { LLMClient } = await import('../index.js');
53
+ expect(LLMClient).toBeDefined();
54
+ expect(typeof LLMClient).toBe('function');
55
+ });
56
+ it('should export createLLMClient function', async () => {
57
+ const { createLLMClient } = await import('../index.js');
58
+ expect(createLLMClient).toBeDefined();
59
+ expect(typeof createLLMClient).toBe('function');
60
+ });
61
+ it('should export LLMPresets', async () => {
62
+ const { LLMPresets } = await import('../index.js');
63
+ expect(LLMPresets).toBeDefined();
64
+ expect(LLMPresets.ollama).toBeDefined();
65
+ expect(LLMPresets.lmStudio).toBeDefined();
66
+ expect(LLMPresets.openai).toBeDefined();
67
+ });
68
+ it('should export buildSystemPrompt function', async () => {
69
+ const { buildSystemPrompt } = await import('../index.js');
70
+ expect(buildSystemPrompt).toBeDefined();
71
+ expect(typeof buildSystemPrompt).toBe('function');
72
+ });
73
+ it('should export LLMError', async () => {
74
+ const { LLMError, LLMErrorCodes } = await import('../index.js');
75
+ expect(LLMError).toBeDefined();
76
+ expect(LLMErrorCodes).toBeDefined();
77
+ });
78
+ });
79
+ describe('End-to-end library usage', () => {
80
+ it('should support basic extraction workflow', async () => {
81
+ const { loadSchemaFromObject, extract } = await import('../index.js');
82
+ const schema = loadSchemaFromObject({
83
+ fields: {
84
+ name: { type: 'string' },
85
+ amount: { type: 'number' }
86
+ }
87
+ });
88
+ expect(schema).toBeDefined();
89
+ expect(schema.fields).toBeDefined();
90
+ expect(schema.fields.name).toBeDefined();
91
+ expect(schema.fields.amount).toBeDefined();
92
+ });
93
+ });
94
+ });
95
+ //# sourceMappingURL=api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../src/__tests__/api.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tests for CLI entrypoint
3
+ * Note: Full end-to-end tests require running the CLI process
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Tests for CLI entrypoint
3
+ * Note: Full end-to-end tests require running the CLI process
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ import { exec } from 'child_process';
7
+ import { promisify } from 'util';
8
+ import * as path from 'path';
9
+ const execAsync = promisify(exec);
10
+ const CLI_PATH = path.join(process.cwd(), 'dist/cli.js');
11
+ describe('CLI', () => {
12
+ describe('help command', () => {
13
+ it('should display help with --help flag', async () => {
14
+ const { stdout } = await execAsync(`node ${CLI_PATH} --help`);
15
+ expect(stdout).toContain('Ordis');
16
+ expect(stdout).toContain('USAGE:');
17
+ expect(stdout).toContain('ordis extract');
18
+ expect(stdout).toContain('--schema');
19
+ expect(stdout).toContain('--input');
20
+ expect(stdout).toContain('--base');
21
+ expect(stdout).toContain('--model');
22
+ });
23
+ it('should display help with -h flag', async () => {
24
+ const { stdout } = await execAsync(`node ${CLI_PATH} -h`);
25
+ expect(stdout).toContain('Ordis');
26
+ });
27
+ });
28
+ describe('version command', () => {
29
+ it('should display version with --version flag', async () => {
30
+ const { stdout } = await execAsync(`node ${CLI_PATH} --version`);
31
+ expect(stdout).toContain('ordis v');
32
+ expect(stdout).toMatch(/v\d+\.\d+\.\d+/);
33
+ });
34
+ it('should display version with -v flag', async () => {
35
+ const { stdout } = await execAsync(`node ${CLI_PATH} -v`);
36
+ expect(stdout).toContain('ordis v');
37
+ expect(stdout).toMatch(/v\d+\.\d+\.\d+/);
38
+ });
39
+ });
40
+ describe('error handling', () => {
41
+ it('should error when no command specified', async () => {
42
+ try {
43
+ await execAsync(`node ${CLI_PATH}`);
44
+ expect.fail('Should have thrown an error');
45
+ }
46
+ catch (error) {
47
+ expect(error.code).toBe(1);
48
+ expect(error.stderr).toContain('No command specified');
49
+ }
50
+ });
51
+ it('should error when unknown command specified', async () => {
52
+ try {
53
+ await execAsync(`node ${CLI_PATH} unknown`);
54
+ expect.fail('Should have thrown an error');
55
+ }
56
+ catch (error) {
57
+ expect(error.code).toBe(1);
58
+ expect(error.stderr).toContain('Unknown command');
59
+ }
60
+ });
61
+ it('should error when --schema is missing', async () => {
62
+ try {
63
+ await execAsync(`node ${CLI_PATH} extract --input test.txt --base http://localhost --model test`);
64
+ expect.fail('Should have thrown an error');
65
+ }
66
+ catch (error) {
67
+ expect(error.code).toBe(1);
68
+ expect(error.stderr).toContain('--schema is required');
69
+ }
70
+ });
71
+ it('should error when --input is missing', async () => {
72
+ try {
73
+ await execAsync(`node ${CLI_PATH} extract --schema test.json --base http://localhost --model test`);
74
+ expect.fail('Should have thrown an error');
75
+ }
76
+ catch (error) {
77
+ expect(error.code).toBe(1);
78
+ expect(error.stderr).toContain('--input is required');
79
+ }
80
+ });
81
+ it('should error when --base is missing', async () => {
82
+ try {
83
+ await execAsync(`node ${CLI_PATH} extract --schema test.json --input test.txt --model test`);
84
+ expect.fail('Should have thrown an error');
85
+ }
86
+ catch (error) {
87
+ expect(error.code).toBe(1);
88
+ expect(error.stderr).toContain('--base is required');
89
+ }
90
+ });
91
+ it('should error when --model is missing', async () => {
92
+ try {
93
+ await execAsync(`node ${CLI_PATH} extract --schema test.json --input test.txt --base http://localhost`);
94
+ expect.fail('Should have thrown an error');
95
+ }
96
+ catch (error) {
97
+ expect(error.code).toBe(1);
98
+ expect(error.stderr).toContain('--model is required');
99
+ }
100
+ });
101
+ });
102
+ });
103
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for CLI interface
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.d.ts","sourceRoot":"","sources":["../../../src/cli/__tests__/cli.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for CLI interface
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ (0, vitest_1.describe)('CLI', () => {
8
+ (0, vitest_1.it)('should export main entry point', () => {
9
+ // Simple smoke test to ensure CLI module compiles
10
+ (0, vitest_1.expect)(true).toBe(true);
11
+ });
12
+ });
13
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/cli.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAEH,mCAA8C;AAE9C,IAAA,iBAAQ,EAAC,KAAK,EAAE,GAAG,EAAE;IACjB,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,kDAAkD;QAClD,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Ordis - Schema-first extraction tool
4
+ * CLI entrypoint
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}