atomism 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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +210 -0
  3. package/dist/chunk-34O5KJWR.js +81 -0
  4. package/dist/chunk-34O5KJWR.js.map +1 -0
  5. package/dist/chunk-55AP34JO.js +116 -0
  6. package/dist/chunk-55AP34JO.js.map +1 -0
  7. package/dist/chunk-6MDHM2B4.js +17 -0
  8. package/dist/chunk-6MDHM2B4.js.map +1 -0
  9. package/dist/chunk-GU2R4KLP.js +43 -0
  10. package/dist/chunk-GU2R4KLP.js.map +1 -0
  11. package/dist/chunk-H7WC3NXZ.js +39 -0
  12. package/dist/chunk-H7WC3NXZ.js.map +1 -0
  13. package/dist/chunk-P33CQFMY.js +329 -0
  14. package/dist/chunk-P33CQFMY.js.map +1 -0
  15. package/dist/chunk-P6X7T4KA.js +200 -0
  16. package/dist/chunk-P6X7T4KA.js.map +1 -0
  17. package/dist/chunk-PLQJM2KT.js +9 -0
  18. package/dist/chunk-PLQJM2KT.js.map +1 -0
  19. package/dist/chunk-RS2IEGW3.js +10 -0
  20. package/dist/chunk-RS2IEGW3.js.map +1 -0
  21. package/dist/chunk-S6Z5G5DB.js +84 -0
  22. package/dist/chunk-S6Z5G5DB.js.map +1 -0
  23. package/dist/chunk-UVUDQ4XP.js +259 -0
  24. package/dist/chunk-UVUDQ4XP.js.map +1 -0
  25. package/dist/chunk-UWVZQSP4.js +597 -0
  26. package/dist/chunk-UWVZQSP4.js.map +1 -0
  27. package/dist/chunk-YKJO3ZFY.js +308 -0
  28. package/dist/chunk-YKJO3ZFY.js.map +1 -0
  29. package/dist/cli.d.ts +1 -0
  30. package/dist/cli.js +152 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/create-atom-AXPDBYQL.js +153 -0
  33. package/dist/create-atom-AXPDBYQL.js.map +1 -0
  34. package/dist/escalate-BTEJT5NL.js +211 -0
  35. package/dist/escalate-BTEJT5NL.js.map +1 -0
  36. package/dist/extract-RPKCTINT.js +514 -0
  37. package/dist/extract-RPKCTINT.js.map +1 -0
  38. package/dist/graduate-453M7ZRQ.js +222 -0
  39. package/dist/graduate-453M7ZRQ.js.map +1 -0
  40. package/dist/helpers-PJPFPYBQ.js +11 -0
  41. package/dist/helpers-PJPFPYBQ.js.map +1 -0
  42. package/dist/history-OPD7NLZW.js +258 -0
  43. package/dist/history-OPD7NLZW.js.map +1 -0
  44. package/dist/import-generator-4CKRBMTE.js +1864 -0
  45. package/dist/import-generator-4CKRBMTE.js.map +1 -0
  46. package/dist/index.d.ts +230 -0
  47. package/dist/index.js +41 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/init-2FINDMYK.js +741 -0
  50. package/dist/init-2FINDMYK.js.map +1 -0
  51. package/dist/list-NEBVBGG3.js +71 -0
  52. package/dist/list-NEBVBGG3.js.map +1 -0
  53. package/dist/parser-3BILOSOO.js +157 -0
  54. package/dist/parser-3BILOSOO.js.map +1 -0
  55. package/dist/plan-DNVARHWH.js +249 -0
  56. package/dist/plan-DNVARHWH.js.map +1 -0
  57. package/dist/register-XTRMSH7Y.js +91 -0
  58. package/dist/register-XTRMSH7Y.js.map +1 -0
  59. package/dist/revert-J4CRDE2K.js +87 -0
  60. package/dist/revert-J4CRDE2K.js.map +1 -0
  61. package/dist/run-3GI3SBYL.js +188 -0
  62. package/dist/run-3GI3SBYL.js.map +1 -0
  63. package/dist/scan-generators-ST4TBEY7.js +375 -0
  64. package/dist/scan-generators-ST4TBEY7.js.map +1 -0
  65. package/dist/signatures-K5QIL4WG.js +258 -0
  66. package/dist/signatures-K5QIL4WG.js.map +1 -0
  67. package/dist/skills-assign-IHOXX4AI.js +182 -0
  68. package/dist/skills-assign-IHOXX4AI.js.map +1 -0
  69. package/dist/skills-load-JSD5UG2K.js +20 -0
  70. package/dist/skills-load-JSD5UG2K.js.map +1 -0
  71. package/dist/skills-scan-WACJFRJN.js +25 -0
  72. package/dist/skills-scan-WACJFRJN.js.map +1 -0
  73. package/dist/skills-suggest-JFI2NUJI.js +269 -0
  74. package/dist/skills-suggest-JFI2NUJI.js.map +1 -0
  75. package/dist/status-KQVSAZFR.js +111 -0
  76. package/dist/status-KQVSAZFR.js.map +1 -0
  77. package/dist/suggest-IFFJQFIW.js +183 -0
  78. package/dist/suggest-IFFJQFIW.js.map +1 -0
  79. package/dist/test-HP3FG3MO.js +152 -0
  80. package/dist/test-HP3FG3MO.js.map +1 -0
  81. package/dist/test-gen-2ZGPOP35.js +347 -0
  82. package/dist/test-gen-2ZGPOP35.js.map +1 -0
  83. package/dist/trust-4R26DULG.js +248 -0
  84. package/dist/trust-4R26DULG.js.map +1 -0
  85. package/dist/validate-generator-46H2LYYQ.js +410 -0
  86. package/dist/validate-generator-46H2LYYQ.js.map +1 -0
  87. package/dist/workflow-5UVLBS7J.js +655 -0
  88. package/dist/workflow-5UVLBS7J.js.map +1 -0
  89. package/package.json +84 -0
@@ -0,0 +1,347 @@
1
+ import {
2
+ loadAtomFromFile
3
+ } from "./chunk-P6X7T4KA.js";
4
+ import {
5
+ resolveAtomPath
6
+ } from "./chunk-RS2IEGW3.js";
7
+ import {
8
+ fileExists,
9
+ getRegistryPath
10
+ } from "./chunk-YKJO3ZFY.js";
11
+ import {
12
+ toErrorMessage
13
+ } from "./chunk-PLQJM2KT.js";
14
+
15
+ // src/commands/test-gen.ts
16
+ import { join, dirname } from "path";
17
+ import { writeFile, mkdir } from "fs/promises";
18
+
19
+ // src/test-gen/index.ts
20
+ function generateAtomTests(atom) {
21
+ const lines = [];
22
+ lines.push(`// Auto-generated structural tests for ${atom.name}`);
23
+ lines.push(`// Generated at ${(/* @__PURE__ */ new Date()).toISOString()}`);
24
+ lines.push(`// DO NOT EDIT - regenerate with: atomic test-gen ${atom.name}`);
25
+ lines.push("");
26
+ lines.push(`import { describe, it, expect } from 'vitest';`);
27
+ lines.push(`import { z } from 'atomism';`);
28
+ lines.push("");
29
+ lines.push(`describe('${atom.name} input schema', () => {`);
30
+ lines.push(...generateSchemaTests(atom.input, "input", " "));
31
+ lines.push("});");
32
+ lines.push("");
33
+ lines.push(`describe('${atom.name} output schema', () => {`);
34
+ lines.push(...generateSchemaTests(atom.output, "output", " "));
35
+ lines.push("});");
36
+ lines.push("");
37
+ return lines.join("\n");
38
+ }
39
+ function getTypeName(schema) {
40
+ const def = schema.def;
41
+ if (def["type"]) return def["type"];
42
+ if (def["typeName"]) return def["typeName"];
43
+ const constructorName = schema.constructor?.name;
44
+ if (constructorName?.startsWith("Zod")) {
45
+ return constructorName;
46
+ }
47
+ return "unknown";
48
+ }
49
+ function generateSchemaTests(schema, schemaName, indent) {
50
+ const lines = [];
51
+ lines.push(`${indent}it('accepts valid data', () => {`);
52
+ lines.push(`${indent} const schema = ${schemaToCode(schema)};`);
53
+ lines.push(`${indent} const validData = ${generateValidExample(schema)};`);
54
+ lines.push(`${indent} const result = schema.safeParse(validData);`);
55
+ lines.push(`${indent} expect(result.success).toBe(true);`);
56
+ lines.push(`${indent}});`);
57
+ lines.push("");
58
+ lines.push(`${indent}it('rejects wrong type (string instead of object)', () => {`);
59
+ lines.push(`${indent} const schema = ${schemaToCode(schema)};`);
60
+ lines.push(`${indent} const result = schema.safeParse('not an object');`);
61
+ lines.push(`${indent} expect(result.success).toBe(false);`);
62
+ lines.push(`${indent}});`);
63
+ lines.push("");
64
+ lines.push(`${indent}it('rejects null', () => {`);
65
+ lines.push(`${indent} const schema = ${schemaToCode(schema)};`);
66
+ lines.push(`${indent} const result = schema.safeParse(null);`);
67
+ lines.push(`${indent} expect(result.success).toBe(false);`);
68
+ lines.push(`${indent}});`);
69
+ lines.push("");
70
+ lines.push(`${indent}it('rejects undefined', () => {`);
71
+ lines.push(`${indent} const schema = ${schemaToCode(schema)};`);
72
+ lines.push(`${indent} const result = schema.safeParse(undefined);`);
73
+ lines.push(`${indent} expect(result.success).toBe(false);`);
74
+ lines.push(`${indent}});`);
75
+ if (isObjectSchema(schema)) {
76
+ lines.push("");
77
+ lines.push(...generateObjectSchemaTests(schema, indent));
78
+ }
79
+ return lines;
80
+ }
81
+ function isObjectSchema(schema) {
82
+ const typeName = getTypeName(schema);
83
+ return typeName === "object" || typeName === "ZodObject";
84
+ }
85
+ function getObjectShape(schema) {
86
+ if ("shape" in schema && typeof schema.shape === "object") {
87
+ return schema.shape;
88
+ }
89
+ const def = schema.def;
90
+ if (def["shape"] && typeof def["shape"] === "object") {
91
+ return def["shape"];
92
+ }
93
+ return {};
94
+ }
95
+ function generateObjectSchemaTests(schema, indent) {
96
+ const lines = [];
97
+ const shape = getObjectShape(schema);
98
+ const keys = Object.keys(shape);
99
+ if (keys.length === 0) {
100
+ return lines;
101
+ }
102
+ for (const key of keys) {
103
+ const fieldSchema = shape[key];
104
+ if (fieldSchema && !isOptional(fieldSchema)) {
105
+ lines.push(`${indent}it('rejects missing required field: ${key}', () => {`);
106
+ lines.push(`${indent} const schema = ${schemaToCode(schema)};`);
107
+ lines.push(`${indent} const data = ${generateValidExampleWithout(schema, key)};`);
108
+ lines.push(`${indent} const result = schema.safeParse(data);`);
109
+ lines.push(`${indent} expect(result.success).toBe(false);`);
110
+ lines.push(`${indent}});`);
111
+ lines.push("");
112
+ }
113
+ }
114
+ for (const key of keys) {
115
+ const fieldSchema = shape[key];
116
+ if (fieldSchema) {
117
+ const wrongValue = getWrongTypeValue(fieldSchema);
118
+ if (wrongValue !== null) {
119
+ lines.push(`${indent}it('rejects wrong type for field: ${key}', () => {`);
120
+ lines.push(`${indent} const schema = ${schemaToCode(schema)};`);
121
+ lines.push(`${indent} const data = ${generateValidExampleWithField(schema, key, wrongValue)};`);
122
+ lines.push(`${indent} const result = schema.safeParse(data);`);
123
+ lines.push(`${indent} expect(result.success).toBe(false);`);
124
+ lines.push(`${indent}});`);
125
+ lines.push("");
126
+ }
127
+ }
128
+ }
129
+ lines.push(`${indent}it('handles extra fields', () => {`);
130
+ lines.push(`${indent} const schema = ${schemaToCode(schema)};`);
131
+ lines.push(`${indent} const data = { ...${generateValidExample(schema)}, extraField: 'extra' };`);
132
+ lines.push(`${indent} const result = schema.safeParse(data);`);
133
+ lines.push(`${indent} // Zod strips extra fields by default (still parses successfully)`);
134
+ lines.push(`${indent} expect(result.success).toBe(true);`);
135
+ lines.push(`${indent}});`);
136
+ return lines;
137
+ }
138
+ function isOptional(schema) {
139
+ const typeName = getTypeName(schema);
140
+ return typeName === "optional" || typeName === "ZodOptional" || typeName === "default" || typeName === "ZodDefault";
141
+ }
142
+ function getWrongTypeValue(schema) {
143
+ const typeName = getTypeName(schema);
144
+ switch (typeName) {
145
+ case "string":
146
+ case "ZodString":
147
+ return "42";
148
+ // number instead of string
149
+ case "number":
150
+ case "ZodNumber":
151
+ return '"not a number"';
152
+ // string instead of number
153
+ case "boolean":
154
+ case "ZodBoolean":
155
+ return '"not a boolean"';
156
+ // string instead of boolean
157
+ case "array":
158
+ case "ZodArray":
159
+ return '"not an array"';
160
+ // string instead of array
161
+ case "object":
162
+ case "ZodObject":
163
+ return '"not an object"';
164
+ // string instead of object
165
+ case "optional":
166
+ case "ZodOptional": {
167
+ const def = schema.def;
168
+ const innerType = def["innerType"];
169
+ return innerType ? getWrongTypeValue(innerType) : null;
170
+ }
171
+ case "default":
172
+ case "ZodDefault": {
173
+ const def = schema.def;
174
+ const innerType = def["innerType"];
175
+ return innerType ? getWrongTypeValue(innerType) : null;
176
+ }
177
+ default:
178
+ return null;
179
+ }
180
+ }
181
+ function schemaToCode(schema) {
182
+ const typeName = getTypeName(schema);
183
+ switch (typeName) {
184
+ case "object":
185
+ case "ZodObject": {
186
+ const shape = getObjectShape(schema);
187
+ const fields = Object.entries(shape).map(([key, value]) => `${key}: ${schemaToCode(value)}`).join(", ");
188
+ return `z.object({ ${fields} })`;
189
+ }
190
+ case "string":
191
+ case "ZodString":
192
+ return "z.string()";
193
+ case "number":
194
+ case "ZodNumber":
195
+ return "z.number()";
196
+ case "boolean":
197
+ case "ZodBoolean":
198
+ return "z.boolean()";
199
+ case "array":
200
+ case "ZodArray": {
201
+ const def = schema.def;
202
+ const innerType = def["element"];
203
+ return innerType ? `z.array(${schemaToCode(innerType)})` : "z.array(z.unknown())";
204
+ }
205
+ case "optional":
206
+ case "ZodOptional": {
207
+ const def = schema.def;
208
+ const innerType = def["innerType"];
209
+ return innerType ? `${schemaToCode(innerType)}.optional()` : "z.unknown().optional()";
210
+ }
211
+ case "default":
212
+ case "ZodDefault": {
213
+ const def = schema.def;
214
+ const innerType = def["innerType"];
215
+ const defaultValue = def["defaultValue"];
216
+ const defaultVal = defaultValue ? JSON.stringify(defaultValue()) : "undefined";
217
+ return innerType ? `${schemaToCode(innerType)}.default(${defaultVal})` : `z.unknown().default(${defaultVal})`;
218
+ }
219
+ case "enum":
220
+ case "ZodEnum": {
221
+ const def = schema.def;
222
+ const values = def["values"];
223
+ return values ? `z.enum([${values.map((v) => `'${v}'`).join(", ")}])` : "z.enum([])";
224
+ }
225
+ case "literal":
226
+ case "ZodLiteral": {
227
+ const def = schema.def;
228
+ const value = def["value"];
229
+ return `z.literal(${JSON.stringify(value)})`;
230
+ }
231
+ default:
232
+ return "z.unknown()";
233
+ }
234
+ }
235
+ function generateValidExample(schema) {
236
+ const typeName = getTypeName(schema);
237
+ switch (typeName) {
238
+ case "object":
239
+ case "ZodObject": {
240
+ const shape = getObjectShape(schema);
241
+ const fields = Object.entries(shape).filter(([, value]) => !isOptional(value)).map(([key, value]) => `${key}: ${generateValidExample(value)}`).join(", ");
242
+ return `{ ${fields} }`;
243
+ }
244
+ case "string":
245
+ case "ZodString":
246
+ return `'test'`;
247
+ case "number":
248
+ case "ZodNumber":
249
+ return "42";
250
+ case "boolean":
251
+ case "ZodBoolean":
252
+ return "true";
253
+ case "array":
254
+ case "ZodArray": {
255
+ const def = schema.def;
256
+ const innerType = def["element"];
257
+ return innerType ? `[${generateValidExample(innerType)}]` : "[]";
258
+ }
259
+ case "optional":
260
+ case "ZodOptional":
261
+ case "default":
262
+ case "ZodDefault": {
263
+ const def = schema.def;
264
+ const innerType = def["innerType"];
265
+ return innerType ? generateValidExample(innerType) : "undefined";
266
+ }
267
+ case "enum":
268
+ case "ZodEnum": {
269
+ const def = schema.def;
270
+ const values = def["values"];
271
+ return values && values.length > 0 ? `'${values[0]}'` : "''";
272
+ }
273
+ case "literal":
274
+ case "ZodLiteral": {
275
+ const def = schema.def;
276
+ const value = def["value"];
277
+ return JSON.stringify(value);
278
+ }
279
+ default:
280
+ return "{}";
281
+ }
282
+ }
283
+ function generateValidExampleWithout(schema, excludeKey) {
284
+ const shape = getObjectShape(schema);
285
+ const fields = Object.entries(shape).filter(([key, value]) => key !== excludeKey && !isOptional(value)).map(([key, value]) => `${key}: ${generateValidExample(value)}`).join(", ");
286
+ return `{ ${fields} }`;
287
+ }
288
+ function generateValidExampleWithField(schema, fieldKey, wrongValue) {
289
+ const shape = getObjectShape(schema);
290
+ const fields = Object.entries(shape).filter(([, value]) => !isOptional(value)).map(
291
+ ([key, value]) => key === fieldKey ? `${key}: ${wrongValue}` : `${key}: ${generateValidExample(value)}`
292
+ ).join(", ");
293
+ return `{ ${fields} }`;
294
+ }
295
+
296
+ // src/commands/test-gen.ts
297
+ async function testGenCommand(atomPath, options) {
298
+ const projectRoot = process.cwd();
299
+ const registryPath = getRegistryPath(projectRoot);
300
+ try {
301
+ if (!await fileExists(registryPath)) {
302
+ throw new Error("Storage not initialized. Run `atomic init` first.");
303
+ }
304
+ const absolutePath = resolveAtomPath(atomPath, projectRoot);
305
+ if (!await fileExists(absolutePath)) {
306
+ throw new Error(`Atom file not found: ${absolutePath}`);
307
+ }
308
+ const atom = await loadAtomFromFile(absolutePath);
309
+ const testContent = generateAtomTests(atom);
310
+ const outputPath = options.output ? resolveAtomPath(options.output, projectRoot) : join(projectRoot, "tests", "generated", `${atom.name}.generated.test.ts`);
311
+ const outputDir = dirname(outputPath);
312
+ await mkdir(outputDir, { recursive: true });
313
+ await writeFile(outputPath, testContent);
314
+ const testCount = (testContent.match(/it\(/g) || []).length;
315
+ const result = {
316
+ success: true,
317
+ atomName: atom.name,
318
+ outputPath,
319
+ testCount
320
+ };
321
+ if (options.json) {
322
+ console.log(JSON.stringify(result, null, 2));
323
+ } else {
324
+ console.log(`\u2713 Generated ${testCount} tests for: ${atom.name}`);
325
+ console.log(` Output: ${outputPath}`);
326
+ }
327
+ } catch (error) {
328
+ if (options.json) {
329
+ console.log(
330
+ JSON.stringify({
331
+ success: false,
332
+ error: toErrorMessage(error)
333
+ })
334
+ );
335
+ process.exit(1);
336
+ } else {
337
+ console.error(
338
+ `Error: ${toErrorMessage(error)}`
339
+ );
340
+ process.exit(1);
341
+ }
342
+ }
343
+ }
344
+ export {
345
+ testGenCommand
346
+ };
347
+ //# sourceMappingURL=test-gen-2ZGPOP35.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/test-gen.ts","../src/test-gen/index.ts"],"sourcesContent":["import { join, dirname } from 'node:path';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { fileExists, getRegistryPath } from '../storage/index.js';\nimport { generateAtomTests } from '../test-gen/index.js';\nimport { loadAtomFromFile } from '../atom/loader.js';\nimport { toErrorMessage } from '../utils/errors.js';\nimport { resolveAtomPath } from '../utils/paths.js';\n\nexport interface TestGenOptions {\n json?: boolean;\n output?: string;\n}\n\nexport interface TestGenResult {\n success: boolean;\n atomName: string;\n outputPath: string;\n testCount: number;\n}\n\n/**\n * Generate test cases for an atom from its schema.\n */\nexport async function testGenCommand(\n atomPath: string,\n options: TestGenOptions\n): Promise<void> {\n const projectRoot = process.cwd();\n const registryPath = getRegistryPath(projectRoot);\n\n try {\n // Check if initialized\n if (!(await fileExists(registryPath))) {\n throw new Error('Storage not initialized. Run `atomic init` first.');\n }\n\n // Resolve atom path\n const absolutePath = resolveAtomPath(atomPath, projectRoot);\n\n // Check if atom file exists\n if (!(await fileExists(absolutePath))) {\n throw new Error(`Atom file not found: ${absolutePath}`);\n }\n\n // Load the atom from the file\n const atom = await loadAtomFromFile(absolutePath);\n\n // Generate tests\n const testContent = generateAtomTests(atom);\n\n // Determine output path\n const outputPath = options.output\n ? resolveAtomPath(options.output, projectRoot)\n : join(projectRoot, 'tests', 'generated', `${atom.name}.generated.test.ts`);\n\n // Ensure output directory exists\n const outputDir = dirname(outputPath);\n await mkdir(outputDir, { recursive: true });\n\n // Write generated tests\n await writeFile(outputPath, testContent);\n\n // Count tests (approximate by counting 'it(' occurrences)\n const testCount = (testContent.match(/it\\(/g) || []).length;\n\n const result: TestGenResult = {\n success: true,\n atomName: atom.name,\n outputPath,\n testCount,\n };\n\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n } else {\n console.log(`✓ Generated ${testCount} tests for: ${atom.name}`);\n console.log(` Output: ${outputPath}`);\n }\n } catch (error) {\n if (options.json) {\n console.log(\n JSON.stringify({\n success: false,\n error: toErrorMessage(error),\n })\n );\n process.exit(1);\n } else {\n console.error(\n `Error: ${toErrorMessage(error)}`\n );\n process.exit(1);\n }\n }\n}\n","import { z } from 'zod';\nimport type { Atom } from '../atom/define.js';\n\n/**\n * Generates structural tests for an atom's input/output schemas.\n * Tests cover: missing required fields, wrong types, constraint violations,\n * extra field handling, and output schema validation.\n */\nexport function generateAtomTests(\n atom: Atom<z.ZodType, z.ZodType>\n): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`// Auto-generated structural tests for ${atom.name}`);\n lines.push(`// Generated at ${new Date().toISOString()}`);\n lines.push(`// DO NOT EDIT - regenerate with: atomic test-gen ${atom.name}`);\n lines.push('');\n lines.push(`import { describe, it, expect } from 'vitest';`);\n lines.push(`import { z } from 'atomism';`);\n lines.push('');\n\n // Input schema tests\n lines.push(`describe('${atom.name} input schema', () => {`);\n lines.push(...generateSchemaTests(atom.input, 'input', ' '));\n lines.push('});');\n lines.push('');\n\n // Output schema tests\n lines.push(`describe('${atom.name} output schema', () => {`);\n lines.push(...generateSchemaTests(atom.output, 'output', ' '));\n lines.push('});');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n// Get the Zod type name from schema (works with Zod 4)\nfunction getTypeName(schema: z.ZodType): string {\n // Zod 4 uses _def.type or check the constructor name\n const def = schema.def as unknown as Record<string, unknown>;\n if (def['type']) return def['type'] as string;\n if (def['typeName']) return def['typeName'] as string;\n\n // Fallback to checking constructor\n const constructorName = schema.constructor?.name;\n if (constructorName?.startsWith('Zod')) {\n return constructorName;\n }\n\n return 'unknown';\n}\n\nfunction generateSchemaTests(\n schema: z.ZodType,\n schemaName: string,\n indent: string\n): string[] {\n const lines: string[] = [];\n\n // Test: accepts valid data\n lines.push(`${indent}it('accepts valid data', () => {`);\n lines.push(`${indent} const schema = ${schemaToCode(schema)};`);\n lines.push(`${indent} const validData = ${generateValidExample(schema)};`);\n lines.push(`${indent} const result = schema.safeParse(validData);`);\n lines.push(`${indent} expect(result.success).toBe(true);`);\n lines.push(`${indent}});`);\n lines.push('');\n\n // Test: rejects wrong type\n lines.push(`${indent}it('rejects wrong type (string instead of object)', () => {`);\n lines.push(`${indent} const schema = ${schemaToCode(schema)};`);\n lines.push(`${indent} const result = schema.safeParse('not an object');`);\n lines.push(`${indent} expect(result.success).toBe(false);`);\n lines.push(`${indent}});`);\n lines.push('');\n\n // Test: rejects null\n lines.push(`${indent}it('rejects null', () => {`);\n lines.push(`${indent} const schema = ${schemaToCode(schema)};`);\n lines.push(`${indent} const result = schema.safeParse(null);`);\n lines.push(`${indent} expect(result.success).toBe(false);`);\n lines.push(`${indent}});`);\n lines.push('');\n\n // Test: rejects undefined\n lines.push(`${indent}it('rejects undefined', () => {`);\n lines.push(`${indent} const schema = ${schemaToCode(schema)};`);\n lines.push(`${indent} const result = schema.safeParse(undefined);`);\n lines.push(`${indent} expect(result.success).toBe(false);`);\n lines.push(`${indent}});`);\n\n // If it's an object schema, add field-specific tests\n if (isObjectSchema(schema)) {\n lines.push('');\n lines.push(...generateObjectSchemaTests(schema, indent));\n }\n\n return lines;\n}\n\nfunction isObjectSchema(schema: z.ZodType): boolean {\n const typeName = getTypeName(schema);\n return typeName === 'object' || typeName === 'ZodObject';\n}\n\nfunction getObjectShape(schema: z.ZodType): Record<string, z.ZodType> {\n // Zod 4 exposes shape directly on the schema\n if ('shape' in schema && typeof schema.shape === 'object') {\n return schema.shape as Record<string, z.ZodType>;\n }\n // Fallback for older Zod\n const def = schema.def as unknown as Record<string, unknown>;\n if (def['shape'] && typeof def['shape'] === 'object') {\n return def['shape'] as Record<string, z.ZodType>;\n }\n return {};\n}\n\nfunction generateObjectSchemaTests(\n schema: z.ZodType,\n indent: string\n): string[] {\n const lines: string[] = [];\n const shape = getObjectShape(schema);\n const keys = Object.keys(shape);\n\n if (keys.length === 0) {\n return lines;\n }\n\n // Test: missing required fields\n for (const key of keys) {\n const fieldSchema = shape[key];\n if (fieldSchema && !isOptional(fieldSchema)) {\n lines.push(`${indent}it('rejects missing required field: ${key}', () => {`);\n lines.push(`${indent} const schema = ${schemaToCode(schema)};`);\n lines.push(`${indent} const data = ${generateValidExampleWithout(schema, key)};`);\n lines.push(`${indent} const result = schema.safeParse(data);`);\n lines.push(`${indent} expect(result.success).toBe(false);`);\n lines.push(`${indent}});`);\n lines.push('');\n }\n }\n\n // Test: wrong type for each field\n for (const key of keys) {\n const fieldSchema = shape[key];\n if (fieldSchema) {\n const wrongValue = getWrongTypeValue(fieldSchema);\n if (wrongValue !== null) {\n lines.push(`${indent}it('rejects wrong type for field: ${key}', () => {`);\n lines.push(`${indent} const schema = ${schemaToCode(schema)};`);\n lines.push(`${indent} const data = ${generateValidExampleWithField(schema, key, wrongValue)};`);\n lines.push(`${indent} const result = schema.safeParse(data);`);\n lines.push(`${indent} expect(result.success).toBe(false);`);\n lines.push(`${indent}});`);\n lines.push('');\n }\n }\n }\n\n // Test: extra fields (Zod strips by default, passthrough allows)\n lines.push(`${indent}it('handles extra fields', () => {`);\n lines.push(`${indent} const schema = ${schemaToCode(schema)};`);\n lines.push(`${indent} const data = { ...${generateValidExample(schema)}, extraField: 'extra' };`);\n lines.push(`${indent} const result = schema.safeParse(data);`);\n lines.push(`${indent} // Zod strips extra fields by default (still parses successfully)`);\n lines.push(`${indent} expect(result.success).toBe(true);`);\n lines.push(`${indent}});`);\n\n return lines;\n}\n\nfunction isOptional(schema: z.ZodType): boolean {\n const typeName = getTypeName(schema);\n return typeName === 'optional' || typeName === 'ZodOptional' ||\n typeName === 'default' || typeName === 'ZodDefault';\n}\n\nfunction getWrongTypeValue(schema: z.ZodType): string | null {\n const typeName = getTypeName(schema);\n\n // Return a value of wrong type\n switch (typeName) {\n case 'string':\n case 'ZodString':\n return '42'; // number instead of string\n case 'number':\n case 'ZodNumber':\n return '\"not a number\"'; // string instead of number\n case 'boolean':\n case 'ZodBoolean':\n return '\"not a boolean\"'; // string instead of boolean\n case 'array':\n case 'ZodArray':\n return '\"not an array\"'; // string instead of array\n case 'object':\n case 'ZodObject':\n return '\"not an object\"'; // string instead of object\n case 'optional':\n case 'ZodOptional': {\n const def = schema.def as unknown as Record<string, unknown>;\n const innerType = def['innerType'] as z.ZodType | undefined;\n return innerType ? getWrongTypeValue(innerType) : null;\n }\n case 'default':\n case 'ZodDefault': {\n const def = schema.def as unknown as Record<string, unknown>;\n const innerType = def['innerType'] as z.ZodType | undefined;\n return innerType ? getWrongTypeValue(innerType) : null;\n }\n default:\n return null;\n }\n}\n\nfunction schemaToCode(schema: z.ZodType): string {\n const typeName = getTypeName(schema);\n\n switch (typeName) {\n case 'object':\n case 'ZodObject': {\n const shape = getObjectShape(schema);\n const fields = Object.entries(shape)\n .map(([key, value]) => `${key}: ${schemaToCode(value as z.ZodType)}`)\n .join(', ');\n return `z.object({ ${fields} })`;\n }\n case 'string':\n case 'ZodString':\n return 'z.string()';\n case 'number':\n case 'ZodNumber':\n return 'z.number()';\n case 'boolean':\n case 'ZodBoolean':\n return 'z.boolean()';\n case 'array':\n case 'ZodArray': {\n const def = schema.def as unknown as Record<string, unknown>;\n // Zod 4 uses _def.element for array inner type\n const innerType = def['element'] as z.ZodType | undefined;\n return innerType ? `z.array(${schemaToCode(innerType)})` : 'z.array(z.unknown())';\n }\n case 'optional':\n case 'ZodOptional': {\n const def = schema.def as unknown as Record<string, unknown>;\n const innerType = def['innerType'] as z.ZodType | undefined;\n return innerType ? `${schemaToCode(innerType)}.optional()` : 'z.unknown().optional()';\n }\n case 'default':\n case 'ZodDefault': {\n const def = schema.def as unknown as Record<string, unknown>;\n const innerType = def['innerType'] as z.ZodType | undefined;\n const defaultValue = def['defaultValue'] as (() => unknown) | undefined;\n const defaultVal = defaultValue ? JSON.stringify(defaultValue()) : 'undefined';\n return innerType ? `${schemaToCode(innerType)}.default(${defaultVal})` : `z.unknown().default(${defaultVal})`;\n }\n case 'enum':\n case 'ZodEnum': {\n const def = schema.def as unknown as Record<string, unknown>;\n const values = def['values'] as string[] | undefined;\n return values ? `z.enum([${values.map((v: string) => `'${v}'`).join(', ')}])` : 'z.enum([])';\n }\n case 'literal':\n case 'ZodLiteral': {\n const def = schema.def as unknown as Record<string, unknown>;\n const value = def['value'];\n return `z.literal(${JSON.stringify(value)})`;\n }\n default:\n return 'z.unknown()';\n }\n}\n\nfunction generateValidExample(schema: z.ZodType): string {\n const typeName = getTypeName(schema);\n\n switch (typeName) {\n case 'object':\n case 'ZodObject': {\n const shape = getObjectShape(schema);\n const fields = Object.entries(shape)\n .filter(([, value]) => !isOptional(value as z.ZodType))\n .map(([key, value]) => `${key}: ${generateValidExample(value as z.ZodType)}`)\n .join(', ');\n return `{ ${fields} }`;\n }\n case 'string':\n case 'ZodString':\n return `'test'`;\n case 'number':\n case 'ZodNumber':\n return '42';\n case 'boolean':\n case 'ZodBoolean':\n return 'true';\n case 'array':\n case 'ZodArray': {\n const def = schema.def as unknown as Record<string, unknown>;\n // Zod 4 uses _def.element for array inner type\n const innerType = def['element'] as z.ZodType | undefined;\n return innerType ? `[${generateValidExample(innerType)}]` : '[]';\n }\n case 'optional':\n case 'ZodOptional':\n case 'default':\n case 'ZodDefault': {\n const def = schema.def as unknown as Record<string, unknown>;\n const innerType = def['innerType'] as z.ZodType | undefined;\n return innerType ? generateValidExample(innerType) : 'undefined';\n }\n case 'enum':\n case 'ZodEnum': {\n const def = schema.def as unknown as Record<string, unknown>;\n const values = def['values'] as string[] | undefined;\n return values && values.length > 0 ? `'${values[0]}'` : \"''\";\n }\n case 'literal':\n case 'ZodLiteral': {\n const def = schema.def as unknown as Record<string, unknown>;\n const value = def['value'];\n return JSON.stringify(value);\n }\n default:\n return '{}';\n }\n}\n\nfunction generateValidExampleWithout(\n schema: z.ZodType,\n excludeKey: string\n): string {\n const shape = getObjectShape(schema);\n const fields = Object.entries(shape)\n .filter(([key, value]) => key !== excludeKey && !isOptional(value as z.ZodType))\n .map(([key, value]) => `${key}: ${generateValidExample(value as z.ZodType)}`)\n .join(', ');\n return `{ ${fields} }`;\n}\n\nfunction generateValidExampleWithField(\n schema: z.ZodType,\n fieldKey: string,\n wrongValue: string\n): string {\n const shape = getObjectShape(schema);\n const fields = Object.entries(shape)\n .filter(([, value]) => !isOptional(value as z.ZodType))\n .map(([key, value]) =>\n key === fieldKey\n ? `${key}: ${wrongValue}`\n : `${key}: ${generateValidExample(value as z.ZodType)}`\n )\n .join(', ');\n return `{ ${fields} }`;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,248 @@
1
+ import {
2
+ AtomStack
3
+ } from "./chunk-34O5KJWR.js";
4
+ import "./chunk-H7WC3NXZ.js";
5
+ import {
6
+ ATOMIC_DIR,
7
+ TrustLevel,
8
+ fileExists,
9
+ getRegistryPath
10
+ } from "./chunk-YKJO3ZFY.js";
11
+ import {
12
+ toErrorMessage
13
+ } from "./chunk-PLQJM2KT.js";
14
+
15
+ // src/commands/trust.ts
16
+ import { join } from "path";
17
+ import { readdir, readFile, writeFile, rename, unlink } from "fs/promises";
18
+ var STACKS_DIR = "stacks";
19
+ function getStacksDir(projectRoot) {
20
+ return join(projectRoot, ATOMIC_DIR, STACKS_DIR);
21
+ }
22
+ function getStackPath(projectRoot, stackName) {
23
+ return join(getStacksDir(projectRoot), `${stackName}.json`);
24
+ }
25
+ async function loadStack(projectRoot, stackName) {
26
+ if (!/^[a-z][a-z0-9_]*$/.test(stackName)) {
27
+ return null;
28
+ }
29
+ const stackPath = getStackPath(projectRoot, stackName);
30
+ if (!await fileExists(stackPath)) {
31
+ return null;
32
+ }
33
+ try {
34
+ const content = await readFile(stackPath, "utf-8");
35
+ return AtomStack.parse(JSON.parse(content));
36
+ } catch (err) {
37
+ throw new Error(`Failed to load stack '${stackName}': ${toErrorMessage(err)}`);
38
+ }
39
+ }
40
+ async function saveStack(projectRoot, stack) {
41
+ if (!/^[a-z][a-z0-9_]*$/.test(stack.name)) {
42
+ throw new Error(`Invalid stack name: ${stack.name}`);
43
+ }
44
+ const stackPath = getStackPath(projectRoot, stack.name);
45
+ const tempPath = `${stackPath}.tmp`;
46
+ try {
47
+ await writeFile(tempPath, JSON.stringify(stack, null, 2));
48
+ await rename(tempPath, stackPath);
49
+ } catch (err) {
50
+ try {
51
+ await unlink(tempPath);
52
+ } catch {
53
+ }
54
+ throw err;
55
+ }
56
+ }
57
+ function validateTrustLevel(level) {
58
+ try {
59
+ TrustLevel.parse(level);
60
+ return true;
61
+ } catch {
62
+ return false;
63
+ }
64
+ }
65
+ async function trustSetCommand(options) {
66
+ const projectRoot = process.cwd();
67
+ const registryPath = getRegistryPath(projectRoot);
68
+ try {
69
+ if (!await fileExists(registryPath)) {
70
+ throw new Error("Storage not initialized. Run `atomic init` first.");
71
+ }
72
+ if (!validateTrustLevel(options.level)) {
73
+ throw new Error(
74
+ `Invalid trust level: ${options.level}
75
+ Valid levels are: new, proven, trusted`
76
+ );
77
+ }
78
+ const stack = await loadStack(projectRoot, options.stack);
79
+ if (!stack) {
80
+ throw new Error(`Stack '${options.stack}' not found.`);
81
+ }
82
+ const previousLevel = stack.trustLevel;
83
+ const updatedStack = AtomStack.parse({
84
+ ...stack,
85
+ trustLevel: options.level,
86
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
87
+ });
88
+ await saveStack(projectRoot, updatedStack);
89
+ const result = {
90
+ success: true,
91
+ stack: updatedStack,
92
+ previousLevel
93
+ };
94
+ if (options.json) {
95
+ console.log(JSON.stringify(result, null, 2));
96
+ } else {
97
+ console.log(`\u2713 Updated trust level for stack '${options.stack}'`);
98
+ console.log(` Previous: ${previousLevel}`);
99
+ console.log(` New: ${options.level}`);
100
+ console.log(` Updated: ${updatedStack.updatedAt}`);
101
+ }
102
+ } catch (err) {
103
+ const errorMessage = toErrorMessage(err);
104
+ if (options.json) {
105
+ console.log(
106
+ JSON.stringify({
107
+ success: false,
108
+ error: errorMessage
109
+ })
110
+ );
111
+ process.exit(1);
112
+ } else {
113
+ console.error(`Error: ${errorMessage}`);
114
+ process.exit(1);
115
+ }
116
+ }
117
+ }
118
+ async function trustListCommand(options) {
119
+ const projectRoot = process.cwd();
120
+ const registryPath = getRegistryPath(projectRoot);
121
+ const stacksDir = getStacksDir(projectRoot);
122
+ try {
123
+ if (!await fileExists(registryPath)) {
124
+ throw new Error("Storage not initialized. Run `atomic init` first.");
125
+ }
126
+ if (!await fileExists(stacksDir)) {
127
+ if (options.json) {
128
+ console.log(JSON.stringify({ stacks: [] }, null, 2));
129
+ } else {
130
+ console.log("No stacks defined.");
131
+ console.log("");
132
+ console.log("Create one with: atomic stack create <name>");
133
+ }
134
+ return;
135
+ }
136
+ const files = await readdir(stacksDir);
137
+ const stackFiles = files.filter((f) => f.endsWith(".json"));
138
+ const stacks = [];
139
+ const errors = [];
140
+ for (const file of stackFiles) {
141
+ try {
142
+ const content = await readFile(join(stacksDir, file), "utf-8");
143
+ const stack = AtomStack.parse(JSON.parse(content));
144
+ stacks.push({
145
+ name: stack.name,
146
+ trustLevel: stack.trustLevel,
147
+ atoms: stack.atoms.length
148
+ });
149
+ } catch (parseErr) {
150
+ const errorMessage = toErrorMessage(parseErr);
151
+ errors.push({ file, error: errorMessage });
152
+ if (!options.json) {
153
+ console.warn(`Warning: Failed to parse ${file}, skipping.`);
154
+ }
155
+ }
156
+ }
157
+ stacks.sort((a, b) => a.name.localeCompare(b.name));
158
+ if (options.json) {
159
+ const result = { stacks };
160
+ if (errors.length > 0) {
161
+ result.errors = errors;
162
+ }
163
+ console.log(JSON.stringify(result, null, 2));
164
+ } else {
165
+ if (stacks.length === 0) {
166
+ console.log("No stacks defined.");
167
+ console.log("");
168
+ console.log("Create one with: atomic stack create <name>");
169
+ return;
170
+ }
171
+ console.log("Stack Trust Levels:");
172
+ console.log("");
173
+ const nameWidth = Math.max(22, ...stacks.map((s) => s.name.length));
174
+ const trustWidth = 10;
175
+ const header = ` ${"Name".padEnd(nameWidth)} ${"Trust".padEnd(trustWidth)} Atoms`;
176
+ console.log(header);
177
+ console.log(" " + "\u2500".repeat(header.length - 2));
178
+ for (const stack of stacks) {
179
+ const name = stack.name.padEnd(nameWidth);
180
+ const trust = stack.trustLevel.padEnd(trustWidth);
181
+ console.log(` ${name} ${trust} ${stack.atoms}`);
182
+ }
183
+ }
184
+ } catch (err) {
185
+ const errorMessage = toErrorMessage(err);
186
+ if (options.json) {
187
+ console.log(JSON.stringify({ error: errorMessage }, null, 2));
188
+ process.exit(1);
189
+ } else {
190
+ console.error(`Error: ${errorMessage}`);
191
+ process.exit(1);
192
+ }
193
+ }
194
+ }
195
+ async function trustResetCommand(options) {
196
+ const projectRoot = process.cwd();
197
+ const registryPath = getRegistryPath(projectRoot);
198
+ try {
199
+ if (!await fileExists(registryPath)) {
200
+ throw new Error("Storage not initialized. Run `atomic init` first.");
201
+ }
202
+ const stack = await loadStack(projectRoot, options.stack);
203
+ if (!stack) {
204
+ throw new Error(`Stack '${options.stack}' not found.`);
205
+ }
206
+ const previousLevel = stack.trustLevel;
207
+ const updatedStack = AtomStack.parse({
208
+ ...stack,
209
+ trustLevel: "new",
210
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
211
+ });
212
+ await saveStack(projectRoot, updatedStack);
213
+ const result = {
214
+ success: true,
215
+ stack: updatedStack,
216
+ previousLevel
217
+ };
218
+ if (options.json) {
219
+ console.log(JSON.stringify(result, null, 2));
220
+ } else {
221
+ console.log(`\u2713 Reset trust level for stack '${options.stack}'`);
222
+ console.log(` Previous: ${previousLevel}`);
223
+ console.log(` New: new`);
224
+ console.log(` Updated: ${updatedStack.updatedAt}`);
225
+ }
226
+ } catch (err) {
227
+ const errorMessage = toErrorMessage(err);
228
+ if (options.json) {
229
+ console.log(
230
+ JSON.stringify({
231
+ success: false,
232
+ error: errorMessage
233
+ })
234
+ );
235
+ process.exit(1);
236
+ } else {
237
+ console.error(`Error: ${errorMessage}`);
238
+ process.exit(1);
239
+ }
240
+ }
241
+ }
242
+ export {
243
+ STACKS_DIR,
244
+ trustListCommand,
245
+ trustResetCommand,
246
+ trustSetCommand
247
+ };
248
+ //# sourceMappingURL=trust-4R26DULG.js.map