@loom-framework/core 0.1.0-alpha.1

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.
@@ -0,0 +1,483 @@
1
+ /**
2
+ * Loom Configuration System
3
+ *
4
+ * defineConfig() - Type-safe configuration entry point
5
+ * loadConfig() - Load and validate loom.config.ts
6
+ */
7
+ import { z } from 'zod';
8
+ import type { LoomConfig, ModelSchema } from './types.js';
9
+ declare const LoomConfigSchema: z.ZodObject<{
10
+ project: z.ZodObject<{
11
+ name: z.ZodString;
12
+ description: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ name: string;
15
+ description?: string | undefined;
16
+ }, {
17
+ name: string;
18
+ description?: string | undefined;
19
+ }>;
20
+ data: z.ZodObject<{
21
+ defaultAdapter: z.ZodEnum<["filesystem", "sqlite"]>;
22
+ models: z.ZodArray<z.ZodObject<{
23
+ name: z.ZodString;
24
+ fields: z.ZodArray<z.ZodObject<{
25
+ name: z.ZodString;
26
+ type: z.ZodEnum<["string", "number", "boolean", "date", "string[]", "number[]", "json"]>;
27
+ required: z.ZodOptional<z.ZodBoolean>;
28
+ description: z.ZodOptional<z.ZodString>;
29
+ default: z.ZodOptional<z.ZodUnknown>;
30
+ enum: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
31
+ }, "strip", z.ZodTypeAny, {
32
+ type: "string" | "number" | "boolean" | "date" | "string[]" | "number[]" | "json";
33
+ name: string;
34
+ required?: boolean | undefined;
35
+ description?: string | undefined;
36
+ default?: unknown;
37
+ enum?: string[] | undefined;
38
+ }, {
39
+ type: "string" | "number" | "boolean" | "date" | "string[]" | "number[]" | "json";
40
+ name: string;
41
+ required?: boolean | undefined;
42
+ description?: string | undefined;
43
+ default?: unknown;
44
+ enum?: string[] | undefined;
45
+ }>, "many">;
46
+ indexes: z.ZodOptional<z.ZodArray<z.ZodObject<{
47
+ fields: z.ZodArray<z.ZodString, "many">;
48
+ unique: z.ZodOptional<z.ZodBoolean>;
49
+ }, "strip", z.ZodTypeAny, {
50
+ fields: string[];
51
+ unique?: boolean | undefined;
52
+ }, {
53
+ fields: string[];
54
+ unique?: boolean | undefined;
55
+ }>, "many">>;
56
+ adapters: z.ZodOptional<z.ZodObject<{
57
+ filesystem: z.ZodOptional<z.ZodObject<{
58
+ dir: z.ZodString;
59
+ format: z.ZodEnum<["json", "yaml"]>;
60
+ datePattern: z.ZodOptional<z.ZodString>;
61
+ }, "strip", z.ZodTypeAny, {
62
+ dir: string;
63
+ format: "json" | "yaml";
64
+ datePattern?: string | undefined;
65
+ }, {
66
+ dir: string;
67
+ format: "json" | "yaml";
68
+ datePattern?: string | undefined;
69
+ }>>;
70
+ sqlite: z.ZodOptional<z.ZodObject<{
71
+ table: z.ZodString;
72
+ }, "strip", z.ZodTypeAny, {
73
+ table: string;
74
+ }, {
75
+ table: string;
76
+ }>>;
77
+ }, "strip", z.ZodTypeAny, {
78
+ filesystem?: {
79
+ dir: string;
80
+ format: "json" | "yaml";
81
+ datePattern?: string | undefined;
82
+ } | undefined;
83
+ sqlite?: {
84
+ table: string;
85
+ } | undefined;
86
+ }, {
87
+ filesystem?: {
88
+ dir: string;
89
+ format: "json" | "yaml";
90
+ datePattern?: string | undefined;
91
+ } | undefined;
92
+ sqlite?: {
93
+ table: string;
94
+ } | undefined;
95
+ }>>;
96
+ description: z.ZodOptional<z.ZodString>;
97
+ }, "strip", z.ZodTypeAny, {
98
+ name: string;
99
+ fields: {
100
+ type: "string" | "number" | "boolean" | "date" | "string[]" | "number[]" | "json";
101
+ name: string;
102
+ required?: boolean | undefined;
103
+ description?: string | undefined;
104
+ default?: unknown;
105
+ enum?: string[] | undefined;
106
+ }[];
107
+ description?: string | undefined;
108
+ indexes?: {
109
+ fields: string[];
110
+ unique?: boolean | undefined;
111
+ }[] | undefined;
112
+ adapters?: {
113
+ filesystem?: {
114
+ dir: string;
115
+ format: "json" | "yaml";
116
+ datePattern?: string | undefined;
117
+ } | undefined;
118
+ sqlite?: {
119
+ table: string;
120
+ } | undefined;
121
+ } | undefined;
122
+ }, {
123
+ name: string;
124
+ fields: {
125
+ type: "string" | "number" | "boolean" | "date" | "string[]" | "number[]" | "json";
126
+ name: string;
127
+ required?: boolean | undefined;
128
+ description?: string | undefined;
129
+ default?: unknown;
130
+ enum?: string[] | undefined;
131
+ }[];
132
+ description?: string | undefined;
133
+ indexes?: {
134
+ fields: string[];
135
+ unique?: boolean | undefined;
136
+ }[] | undefined;
137
+ adapters?: {
138
+ filesystem?: {
139
+ dir: string;
140
+ format: "json" | "yaml";
141
+ datePattern?: string | undefined;
142
+ } | undefined;
143
+ sqlite?: {
144
+ table: string;
145
+ } | undefined;
146
+ } | undefined;
147
+ }>, "many">;
148
+ sqlite: z.ZodOptional<z.ZodObject<{
149
+ filename: z.ZodOptional<z.ZodString>;
150
+ }, "strip", z.ZodTypeAny, {
151
+ filename?: string | undefined;
152
+ }, {
153
+ filename?: string | undefined;
154
+ }>>;
155
+ }, "strip", z.ZodTypeAny, {
156
+ defaultAdapter: "filesystem" | "sqlite";
157
+ models: {
158
+ name: string;
159
+ fields: {
160
+ type: "string" | "number" | "boolean" | "date" | "string[]" | "number[]" | "json";
161
+ name: string;
162
+ required?: boolean | undefined;
163
+ description?: string | undefined;
164
+ default?: unknown;
165
+ enum?: string[] | undefined;
166
+ }[];
167
+ description?: string | undefined;
168
+ indexes?: {
169
+ fields: string[];
170
+ unique?: boolean | undefined;
171
+ }[] | undefined;
172
+ adapters?: {
173
+ filesystem?: {
174
+ dir: string;
175
+ format: "json" | "yaml";
176
+ datePattern?: string | undefined;
177
+ } | undefined;
178
+ sqlite?: {
179
+ table: string;
180
+ } | undefined;
181
+ } | undefined;
182
+ }[];
183
+ sqlite?: {
184
+ filename?: string | undefined;
185
+ } | undefined;
186
+ }, {
187
+ defaultAdapter: "filesystem" | "sqlite";
188
+ models: {
189
+ name: string;
190
+ fields: {
191
+ type: "string" | "number" | "boolean" | "date" | "string[]" | "number[]" | "json";
192
+ name: string;
193
+ required?: boolean | undefined;
194
+ description?: string | undefined;
195
+ default?: unknown;
196
+ enum?: string[] | undefined;
197
+ }[];
198
+ description?: string | undefined;
199
+ indexes?: {
200
+ fields: string[];
201
+ unique?: boolean | undefined;
202
+ }[] | undefined;
203
+ adapters?: {
204
+ filesystem?: {
205
+ dir: string;
206
+ format: "json" | "yaml";
207
+ datePattern?: string | undefined;
208
+ } | undefined;
209
+ sqlite?: {
210
+ table: string;
211
+ } | undefined;
212
+ } | undefined;
213
+ }[];
214
+ sqlite?: {
215
+ filename?: string | undefined;
216
+ } | undefined;
217
+ }>;
218
+ ai: z.ZodOptional<z.ZodObject<{
219
+ engine: z.ZodOptional<z.ZodString>;
220
+ claudeCode: z.ZodOptional<z.ZodObject<{
221
+ path: z.ZodOptional<z.ZodString>;
222
+ pluginRoot: z.ZodOptional<z.ZodString>;
223
+ timeout: z.ZodOptional<z.ZodNumber>;
224
+ skipPermissions: z.ZodOptional<z.ZodBoolean>;
225
+ defaultModel: z.ZodOptional<z.ZodString>;
226
+ }, "strip", z.ZodTypeAny, {
227
+ path?: string | undefined;
228
+ pluginRoot?: string | undefined;
229
+ timeout?: number | undefined;
230
+ skipPermissions?: boolean | undefined;
231
+ defaultModel?: string | undefined;
232
+ }, {
233
+ path?: string | undefined;
234
+ pluginRoot?: string | undefined;
235
+ timeout?: number | undefined;
236
+ skipPermissions?: boolean | undefined;
237
+ defaultModel?: string | undefined;
238
+ }>>;
239
+ }, "strip", z.ZodTypeAny, {
240
+ engine?: string | undefined;
241
+ claudeCode?: {
242
+ path?: string | undefined;
243
+ pluginRoot?: string | undefined;
244
+ timeout?: number | undefined;
245
+ skipPermissions?: boolean | undefined;
246
+ defaultModel?: string | undefined;
247
+ } | undefined;
248
+ }, {
249
+ engine?: string | undefined;
250
+ claudeCode?: {
251
+ path?: string | undefined;
252
+ pluginRoot?: string | undefined;
253
+ timeout?: number | undefined;
254
+ skipPermissions?: boolean | undefined;
255
+ defaultModel?: string | undefined;
256
+ } | undefined;
257
+ }>>;
258
+ server: z.ZodOptional<z.ZodObject<{
259
+ port: z.ZodOptional<z.ZodNumber>;
260
+ host: z.ZodOptional<z.ZodString>;
261
+ cors: z.ZodOptional<z.ZodBoolean>;
262
+ staticDir: z.ZodOptional<z.ZodString>;
263
+ }, "strip", z.ZodTypeAny, {
264
+ port?: number | undefined;
265
+ host?: string | undefined;
266
+ cors?: boolean | undefined;
267
+ staticDir?: string | undefined;
268
+ }, {
269
+ port?: number | undefined;
270
+ host?: string | undefined;
271
+ cors?: boolean | undefined;
272
+ staticDir?: string | undefined;
273
+ }>>;
274
+ aiButtons: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodObject<{
275
+ id: z.ZodString;
276
+ label: z.ZodString;
277
+ icon: z.ZodOptional<z.ZodString>;
278
+ prompt: z.ZodOptional<z.ZodString>;
279
+ promptTemplate: z.ZodOptional<z.ZodString>;
280
+ contextVars: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
281
+ placement: z.ZodOptional<z.ZodString>;
282
+ }, "strip", z.ZodTypeAny, {
283
+ id: string;
284
+ label: string;
285
+ icon?: string | undefined;
286
+ prompt?: string | undefined;
287
+ promptTemplate?: string | undefined;
288
+ contextVars?: string[] | undefined;
289
+ placement?: string | undefined;
290
+ }, {
291
+ id: string;
292
+ label: string;
293
+ icon?: string | undefined;
294
+ prompt?: string | undefined;
295
+ promptTemplate?: string | undefined;
296
+ contextVars?: string[] | undefined;
297
+ placement?: string | undefined;
298
+ }>, {
299
+ id: string;
300
+ label: string;
301
+ icon?: string | undefined;
302
+ prompt?: string | undefined;
303
+ promptTemplate?: string | undefined;
304
+ contextVars?: string[] | undefined;
305
+ placement?: string | undefined;
306
+ }, {
307
+ id: string;
308
+ label: string;
309
+ icon?: string | undefined;
310
+ prompt?: string | undefined;
311
+ promptTemplate?: string | undefined;
312
+ contextVars?: string[] | undefined;
313
+ placement?: string | undefined;
314
+ }>, "many">>;
315
+ }, "strip", z.ZodTypeAny, {
316
+ data: {
317
+ defaultAdapter: "filesystem" | "sqlite";
318
+ models: {
319
+ name: string;
320
+ fields: {
321
+ type: "string" | "number" | "boolean" | "date" | "string[]" | "number[]" | "json";
322
+ name: string;
323
+ required?: boolean | undefined;
324
+ description?: string | undefined;
325
+ default?: unknown;
326
+ enum?: string[] | undefined;
327
+ }[];
328
+ description?: string | undefined;
329
+ indexes?: {
330
+ fields: string[];
331
+ unique?: boolean | undefined;
332
+ }[] | undefined;
333
+ adapters?: {
334
+ filesystem?: {
335
+ dir: string;
336
+ format: "json" | "yaml";
337
+ datePattern?: string | undefined;
338
+ } | undefined;
339
+ sqlite?: {
340
+ table: string;
341
+ } | undefined;
342
+ } | undefined;
343
+ }[];
344
+ sqlite?: {
345
+ filename?: string | undefined;
346
+ } | undefined;
347
+ };
348
+ project: {
349
+ name: string;
350
+ description?: string | undefined;
351
+ };
352
+ ai?: {
353
+ engine?: string | undefined;
354
+ claudeCode?: {
355
+ path?: string | undefined;
356
+ pluginRoot?: string | undefined;
357
+ timeout?: number | undefined;
358
+ skipPermissions?: boolean | undefined;
359
+ defaultModel?: string | undefined;
360
+ } | undefined;
361
+ } | undefined;
362
+ server?: {
363
+ port?: number | undefined;
364
+ host?: string | undefined;
365
+ cors?: boolean | undefined;
366
+ staticDir?: string | undefined;
367
+ } | undefined;
368
+ aiButtons?: {
369
+ id: string;
370
+ label: string;
371
+ icon?: string | undefined;
372
+ prompt?: string | undefined;
373
+ promptTemplate?: string | undefined;
374
+ contextVars?: string[] | undefined;
375
+ placement?: string | undefined;
376
+ }[] | undefined;
377
+ }, {
378
+ data: {
379
+ defaultAdapter: "filesystem" | "sqlite";
380
+ models: {
381
+ name: string;
382
+ fields: {
383
+ type: "string" | "number" | "boolean" | "date" | "string[]" | "number[]" | "json";
384
+ name: string;
385
+ required?: boolean | undefined;
386
+ description?: string | undefined;
387
+ default?: unknown;
388
+ enum?: string[] | undefined;
389
+ }[];
390
+ description?: string | undefined;
391
+ indexes?: {
392
+ fields: string[];
393
+ unique?: boolean | undefined;
394
+ }[] | undefined;
395
+ adapters?: {
396
+ filesystem?: {
397
+ dir: string;
398
+ format: "json" | "yaml";
399
+ datePattern?: string | undefined;
400
+ } | undefined;
401
+ sqlite?: {
402
+ table: string;
403
+ } | undefined;
404
+ } | undefined;
405
+ }[];
406
+ sqlite?: {
407
+ filename?: string | undefined;
408
+ } | undefined;
409
+ };
410
+ project: {
411
+ name: string;
412
+ description?: string | undefined;
413
+ };
414
+ ai?: {
415
+ engine?: string | undefined;
416
+ claudeCode?: {
417
+ path?: string | undefined;
418
+ pluginRoot?: string | undefined;
419
+ timeout?: number | undefined;
420
+ skipPermissions?: boolean | undefined;
421
+ defaultModel?: string | undefined;
422
+ } | undefined;
423
+ } | undefined;
424
+ server?: {
425
+ port?: number | undefined;
426
+ host?: string | undefined;
427
+ cors?: boolean | undefined;
428
+ staticDir?: string | undefined;
429
+ } | undefined;
430
+ aiButtons?: {
431
+ id: string;
432
+ label: string;
433
+ icon?: string | undefined;
434
+ prompt?: string | undefined;
435
+ promptTemplate?: string | undefined;
436
+ contextVars?: string[] | undefined;
437
+ placement?: string | undefined;
438
+ }[] | undefined;
439
+ }>;
440
+ /**
441
+ * Type-safe configuration helper for loom.config.ts
442
+ *
443
+ * @example
444
+ * ```ts
445
+ * import { defineConfig } from '@loom-framework/core';
446
+ *
447
+ * export default defineConfig({
448
+ * project: { name: 'my-app' },
449
+ * data: {
450
+ * defaultAdapter: 'filesystem',
451
+ * models: [
452
+ * {
453
+ * name: 'users',
454
+ * fields: [
455
+ * { name: 'id', type: 'string', required: true },
456
+ * { name: 'name', type: 'string', required: true },
457
+ * ],
458
+ * },
459
+ * ],
460
+ * },
461
+ * });
462
+ * ```
463
+ */
464
+ export declare function defineConfig(config: LoomConfig): LoomConfig;
465
+ /**
466
+ * Load loom.config.ts from a project directory.
467
+ * Uses jiti for TypeScript support and cache busting for dev mode.
468
+ */
469
+ export declare function loadConfig(projectRoot: string): Promise<LoomConfig>;
470
+ /**
471
+ * Resolve config file path
472
+ */
473
+ export declare function resolveConfigPath(projectRoot: string): Promise<string | null>;
474
+ /**
475
+ * Get model schema by name from config
476
+ */
477
+ export declare function getModelSchema(config: LoomConfig, modelName: string): ModelSchema | undefined;
478
+ /**
479
+ * Validate that all model names are unique
480
+ */
481
+ export declare function validateModelUniqueness(config: LoomConfig): string[];
482
+ export { LoomConfigSchema };
483
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAmD3E,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BpB,CAAC;AAIH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAU3D;AAID;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAqBzE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBnF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAUpE;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Loom Configuration System
3
+ *
4
+ * defineConfig() - Type-safe configuration entry point
5
+ * loadConfig() - Load and validate loom.config.ts
6
+ */
7
+ import { z } from 'zod';
8
+ import { createJiti } from 'jiti';
9
+ // ── Zod Schemas for Validation ──
10
+ const FieldTypeSchema = z.enum([
11
+ 'string', 'number', 'boolean', 'date',
12
+ 'string[]', 'number[]', 'json',
13
+ ]);
14
+ const FieldDefinitionSchema = z.object({
15
+ name: z.string(),
16
+ type: FieldTypeSchema,
17
+ required: z.boolean().optional(),
18
+ description: z.string().optional(),
19
+ default: z.unknown().optional(),
20
+ enum: z.array(z.string()).optional(),
21
+ });
22
+ const ModelSchemaSchema = z.object({
23
+ name: z.string().regex(/^[a-z][a-z0-9_-]*$/, 'Model name must be lowercase with hyphens/underscores'),
24
+ fields: z.array(FieldDefinitionSchema).min(1),
25
+ indexes: z.array(z.object({
26
+ fields: z.array(z.string()),
27
+ unique: z.boolean().optional(),
28
+ })).optional(),
29
+ adapters: z.object({
30
+ filesystem: z.object({
31
+ dir: z.string(),
32
+ format: z.enum(['json', 'yaml']),
33
+ datePattern: z.string().optional(),
34
+ }).optional(),
35
+ sqlite: z.object({
36
+ table: z.string(),
37
+ }).optional(),
38
+ }).optional(),
39
+ description: z.string().optional(),
40
+ });
41
+ const AIButtonConfigSchema = z.object({
42
+ id: z.string(),
43
+ label: z.string(),
44
+ icon: z.string().optional(),
45
+ prompt: z.string().optional(),
46
+ promptTemplate: z.string().optional(),
47
+ contextVars: z.array(z.string()).optional(),
48
+ placement: z.string().optional(),
49
+ }).refine((data) => data.prompt || data.promptTemplate, 'AI button must have either prompt or promptTemplate');
50
+ const LoomConfigSchema = z.object({
51
+ project: z.object({
52
+ name: z.string(),
53
+ description: z.string().optional(),
54
+ }),
55
+ data: z.object({
56
+ defaultAdapter: z.enum(['filesystem', 'sqlite']),
57
+ models: z.array(ModelSchemaSchema),
58
+ sqlite: z.object({
59
+ filename: z.string().optional(),
60
+ }).optional(),
61
+ }),
62
+ ai: z.object({
63
+ engine: z.string().optional(),
64
+ claudeCode: z.object({
65
+ path: z.string().optional(),
66
+ pluginRoot: z.string().optional(),
67
+ timeout: z.number().optional(),
68
+ skipPermissions: z.boolean().optional(),
69
+ defaultModel: z.string().optional(),
70
+ }).optional(),
71
+ }).optional(),
72
+ server: z.object({
73
+ port: z.number().optional(),
74
+ host: z.string().optional(),
75
+ cors: z.boolean().optional(),
76
+ staticDir: z.string().optional(),
77
+ }).optional(),
78
+ aiButtons: z.array(AIButtonConfigSchema).optional(),
79
+ });
80
+ // ── defineConfig ──
81
+ /**
82
+ * Type-safe configuration helper for loom.config.ts
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * import { defineConfig } from '@loom-framework/core';
87
+ *
88
+ * export default defineConfig({
89
+ * project: { name: 'my-app' },
90
+ * data: {
91
+ * defaultAdapter: 'filesystem',
92
+ * models: [
93
+ * {
94
+ * name: 'users',
95
+ * fields: [
96
+ * { name: 'id', type: 'string', required: true },
97
+ * { name: 'name', type: 'string', required: true },
98
+ * ],
99
+ * },
100
+ * ],
101
+ * },
102
+ * });
103
+ * ```
104
+ */
105
+ export function defineConfig(config) {
106
+ // Validate at config time for early error feedback
107
+ const result = LoomConfigSchema.safeParse(config);
108
+ if (!result.success) {
109
+ const errors = result.error.issues.map((i) => ` ${i.path.join('.')}: ${i.message}`).join('\n');
110
+ throw new Error(`Invalid loom.config.ts:\n${errors}`);
111
+ }
112
+ return result.data;
113
+ }
114
+ // ── loadConfig ──
115
+ /**
116
+ * Load loom.config.ts from a project directory.
117
+ * Uses jiti for TypeScript support and cache busting for dev mode.
118
+ */
119
+ export async function loadConfig(projectRoot) {
120
+ const configPath = await resolveConfigPath(projectRoot);
121
+ if (!configPath) {
122
+ throw new Error(`No loom.config.ts found in ${projectRoot}. Run 'loom generate project' to create one.`);
123
+ }
124
+ const jiti = createJiti(import.meta.url, {
125
+ interopDefault: true,
126
+ fsCache: false, // Always re-evaluate for dev mode
127
+ });
128
+ const module = await jiti.import(configPath);
129
+ const config = module.default ?? module;
130
+ if (!config || typeof config !== 'object') {
131
+ throw new Error(`loom.config.ts must export a default config using defineConfig()`);
132
+ }
133
+ return config;
134
+ }
135
+ /**
136
+ * Resolve config file path
137
+ */
138
+ export async function resolveConfigPath(projectRoot) {
139
+ const fs = await import('fs/promises');
140
+ const path = await import('path');
141
+ const candidates = [
142
+ 'loom.config.ts',
143
+ 'loom.config.js',
144
+ ];
145
+ for (const candidate of candidates) {
146
+ const fullPath = path.resolve(projectRoot, candidate);
147
+ try {
148
+ await fs.access(fullPath);
149
+ return fullPath;
150
+ }
151
+ catch {
152
+ continue;
153
+ }
154
+ }
155
+ return null;
156
+ }
157
+ /**
158
+ * Get model schema by name from config
159
+ */
160
+ export function getModelSchema(config, modelName) {
161
+ return config.data.models.find((m) => m.name === modelName);
162
+ }
163
+ /**
164
+ * Validate that all model names are unique
165
+ */
166
+ export function validateModelUniqueness(config) {
167
+ const errors = [];
168
+ const names = new Set();
169
+ for (const model of config.data.models) {
170
+ if (names.has(model.name)) {
171
+ errors.push(`Duplicate model name: ${model.name}`);
172
+ }
173
+ names.add(model.name);
174
+ }
175
+ return errors;
176
+ }
177
+ // Re-export zod schema for external validation
178
+ export { LoomConfigSchema };
179
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Loom Core - Main Entry Point
3
+ */
4
+ export type { FieldType, FieldDefinition, IndexDefinition, FilesystemAdapterConfig, SQLiteAdapterConfig, ModelAdapterConfig, ModelSchema, AIButtonConfig, ClaudeCodeConfig, AIConfig, ServerConfig, DataConfig, LoomConfig, DataAdapter, ReadOptions, CommandOption, CommandDefinition, CommandContext, AIEngine, AICallOptions, AIUsage, AIChunk, ActiveSession, UserMessageEvent, AssistantChunkEvent, AssistantCompleteEvent, ToolCallEvent, WebSocketEvent, } from './types.js';
5
+ export { defineConfig, loadConfig, resolveConfigPath, getModelSchema, validateModelUniqueness, LoomConfigSchema } from './config.js';
6
+ export { FileSystemAdapter } from './adapter-filesystem.js';
7
+ export type { FileSystemAdapterOptions } from './adapter-filesystem.js';
8
+ export { SQLiteAdapter } from './adapter-sqlite.js';
9
+ export type { SQLiteAdapterOptions } from './adapter-sqlite.js';
10
+ export { generateCapabilities } from './capability-generator.js';
11
+ export type { GenerateResult } from './capability-generator.js';
12
+ export { defineCommand } from './commands.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,SAAS,EACT,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,aAAa,EACb,OAAO,EACP,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGrI,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}