woodml-parser 1.0.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 (82) hide show
  1. package/README.md +181 -0
  2. package/dist/cli.d.ts +7 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +554 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/cost.d.ts +94 -0
  7. package/dist/cost.d.ts.map +1 -0
  8. package/dist/cost.js +340 -0
  9. package/dist/cost.js.map +1 -0
  10. package/dist/cost.test.d.ts +2 -0
  11. package/dist/cost.test.d.ts.map +1 -0
  12. package/dist/cost.test.js +241 -0
  13. package/dist/cost.test.js.map +1 -0
  14. package/dist/example.d.ts +6 -0
  15. package/dist/example.d.ts.map +1 -0
  16. package/dist/example.js +136 -0
  17. package/dist/example.js.map +1 -0
  18. package/dist/formulas.d.ts +23 -0
  19. package/dist/formulas.d.ts.map +1 -0
  20. package/dist/formulas.js +442 -0
  21. package/dist/formulas.js.map +1 -0
  22. package/dist/formulas.test.d.ts +5 -0
  23. package/dist/formulas.test.d.ts.map +1 -0
  24. package/dist/formulas.test.js +360 -0
  25. package/dist/formulas.test.js.map +1 -0
  26. package/dist/index.d.ts +23 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +93 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/integration.test.d.ts +6 -0
  31. package/dist/integration.test.d.ts.map +1 -0
  32. package/dist/integration.test.js +271 -0
  33. package/dist/integration.test.js.map +1 -0
  34. package/dist/optimizer.d.ts +119 -0
  35. package/dist/optimizer.d.ts.map +1 -0
  36. package/dist/optimizer.js +423 -0
  37. package/dist/optimizer.js.map +1 -0
  38. package/dist/optimizer.test.d.ts +2 -0
  39. package/dist/optimizer.test.d.ts.map +1 -0
  40. package/dist/optimizer.test.js +225 -0
  41. package/dist/optimizer.test.js.map +1 -0
  42. package/dist/parser.d.ts +59 -0
  43. package/dist/parser.d.ts.map +1 -0
  44. package/dist/parser.js +305 -0
  45. package/dist/parser.js.map +1 -0
  46. package/dist/parser.test.d.ts +5 -0
  47. package/dist/parser.test.d.ts.map +1 -0
  48. package/dist/parser.test.js +486 -0
  49. package/dist/parser.test.js.map +1 -0
  50. package/dist/pdf.d.ts +36 -0
  51. package/dist/pdf.d.ts.map +1 -0
  52. package/dist/pdf.js +316 -0
  53. package/dist/pdf.js.map +1 -0
  54. package/dist/svg.d.ts +73 -0
  55. package/dist/svg.d.ts.map +1 -0
  56. package/dist/svg.js +613 -0
  57. package/dist/svg.js.map +1 -0
  58. package/dist/svg.test.d.ts +5 -0
  59. package/dist/svg.test.d.ts.map +1 -0
  60. package/dist/svg.test.js +333 -0
  61. package/dist/svg.test.js.map +1 -0
  62. package/dist/templates.d.ts +126 -0
  63. package/dist/templates.d.ts.map +1 -0
  64. package/dist/templates.js +448 -0
  65. package/dist/templates.js.map +1 -0
  66. package/dist/templates.test.d.ts +5 -0
  67. package/dist/templates.test.d.ts.map +1 -0
  68. package/dist/templates.test.js +630 -0
  69. package/dist/templates.test.js.map +1 -0
  70. package/dist/types.d.ts +250 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +7 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/units.d.ts +53 -0
  75. package/dist/units.d.ts.map +1 -0
  76. package/dist/units.js +359 -0
  77. package/dist/units.js.map +1 -0
  78. package/dist/units.test.d.ts +5 -0
  79. package/dist/units.test.d.ts.map +1 -0
  80. package/dist/units.test.js +364 -0
  81. package/dist/units.test.js.map +1 -0
  82. package/package.json +46 -0
package/dist/cli.js ADDED
@@ -0,0 +1,554 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * WoodML CLI Tool
5
+ * Command-line interface for parsing and processing WoodML files
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const parser_1 = require("./parser");
44
+ const svg_1 = require("./svg");
45
+ const cost_1 = require("./cost");
46
+ const optimizer_1 = require("./optimizer");
47
+ const pdf_1 = require("./pdf");
48
+ // ============================================
49
+ // HELP TEXT
50
+ // ============================================
51
+ const HELP_TEXT = `
52
+ WoodML CLI - Parse and process WoodML files
53
+
54
+ USAGE:
55
+ woodml <command> [options] <file>
56
+
57
+ COMMANDS:
58
+ parse Parse and validate a WoodML file
59
+ cutlist Generate a cut list from a WoodML file
60
+ validate Validate a WoodML file for errors
61
+ info Show project information and summary
62
+ diagram Generate SVG diagram of the project
63
+ cost Estimate project cost (lumber, hardware, finishing)
64
+ optimize Optimize cut list for minimal waste
65
+ pdf Generate PDF cut sheet
66
+
67
+ OPTIONS:
68
+ -o, --output <file> Write output to file instead of stdout
69
+ -f, --format <fmt> Output format: json, text, table (default: text)
70
+ -u, --units <unit> Force output units: imperial, metric
71
+ -v, --verbose Show detailed output
72
+ -h, --help Show this help message
73
+ --version Show version number
74
+
75
+ DIAGRAM OPTIONS:
76
+ -t, --type <type> Diagram type: parts, exploded, cutlist (default: parts)
77
+ -c, --color <scheme> Color scheme: default, blueprint, monochrome
78
+ -w, --width <px> SVG width in pixels (default: 800)
79
+ --height <px> SVG height in pixels (default: 600)
80
+
81
+ COST OPTIONS:
82
+ --waste <percent> Waste percentage (default: 15)
83
+ --labor-rate <$/hr> Labor rate per hour (default: 25)
84
+ --include-labor Include labor cost estimate
85
+
86
+ OPTIMIZE OPTIONS:
87
+ --kerf <inches> Saw blade kerf width (default: 0.125)
88
+ --sheet-size <size> Sheet size: 4x8, 4x4, 5x5, 4x10, 4x12 (default: 4x8)
89
+
90
+ PDF OPTIONS:
91
+ --optimize Include optimization in PDF
92
+ --page-size <size> Page size: letter, legal, tabloid, a4, a3 (default: letter)
93
+
94
+ EXAMPLES:
95
+ woodml parse project.woodml
96
+ woodml cutlist project.woodml -f table
97
+ woodml validate project.woodml
98
+ woodml info project.woodml -f json
99
+ woodml diagram project.woodml -o diagram.svg
100
+ woodml diagram project.woodml -t exploded -c blueprint
101
+ woodml cost project.woodml
102
+ woodml cost project.woodml --include-labor --labor-rate 35
103
+ woodml optimize project.woodml
104
+ woodml optimize project.woodml --kerf 0.125 --sheet-size 4x8
105
+ woodml pdf project.woodml -o cutsheet.txt
106
+ woodml pdf project.woodml --optimize
107
+
108
+ VERSION: 1.0.0
109
+ `;
110
+ // ============================================
111
+ // ARGUMENT PARSING
112
+ // ============================================
113
+ function parseArgs(args) {
114
+ const options = {
115
+ command: '',
116
+ format: 'text',
117
+ verbose: false,
118
+ help: false,
119
+ version: false,
120
+ diagramType: 'parts',
121
+ colorScheme: 'default',
122
+ width: 800,
123
+ height: 600,
124
+ wastePercent: 15,
125
+ laborRate: 25,
126
+ includeLabor: false,
127
+ kerf: 0.125,
128
+ sheetSize: '4x8',
129
+ includeOptimization: false,
130
+ pageSize: 'letter',
131
+ };
132
+ let i = 0;
133
+ while (i < args.length) {
134
+ const arg = args[i];
135
+ if (arg === '-h' || arg === '--help') {
136
+ options.help = true;
137
+ }
138
+ else if (arg === '--version') {
139
+ options.version = true;
140
+ }
141
+ else if (arg === '-v' || arg === '--verbose') {
142
+ options.verbose = true;
143
+ }
144
+ else if (arg === '-o' || arg === '--output') {
145
+ options.output = args[++i];
146
+ }
147
+ else if (arg === '-f' || arg === '--format') {
148
+ const fmt = args[++i];
149
+ if (fmt === 'json' || fmt === 'text' || fmt === 'table') {
150
+ options.format = fmt;
151
+ }
152
+ else {
153
+ console.error(`Invalid format: ${fmt}. Use json, text, or table.`);
154
+ process.exit(1);
155
+ }
156
+ }
157
+ else if (arg === '-u' || arg === '--units') {
158
+ const unit = args[++i];
159
+ if (unit === 'imperial' || unit === 'metric') {
160
+ options.units = unit;
161
+ }
162
+ else {
163
+ console.error(`Invalid units: ${unit}. Use imperial or metric.`);
164
+ process.exit(1);
165
+ }
166
+ }
167
+ else if (arg === '-t' || arg === '--type') {
168
+ const type = args[++i];
169
+ if (type === 'parts' || type === 'exploded' || type === 'cutlist') {
170
+ options.diagramType = type;
171
+ }
172
+ else {
173
+ console.error(`Invalid diagram type: ${type}. Use parts, exploded, or cutlist.`);
174
+ process.exit(1);
175
+ }
176
+ }
177
+ else if (arg === '-c' || arg === '--color') {
178
+ const scheme = args[++i];
179
+ if (scheme === 'default' || scheme === 'blueprint' || scheme === 'monochrome') {
180
+ options.colorScheme = scheme;
181
+ }
182
+ else {
183
+ console.error(`Invalid color scheme: ${scheme}. Use default, blueprint, or monochrome.`);
184
+ process.exit(1);
185
+ }
186
+ }
187
+ else if (arg === '-w' || arg === '--width') {
188
+ options.width = parseInt(args[++i], 10);
189
+ }
190
+ else if (arg === '--height') {
191
+ options.height = parseInt(args[++i], 10);
192
+ }
193
+ else if (arg === '--waste') {
194
+ options.wastePercent = parseInt(args[++i], 10);
195
+ }
196
+ else if (arg === '--labor-rate') {
197
+ options.laborRate = parseFloat(args[++i]);
198
+ }
199
+ else if (arg === '--include-labor') {
200
+ options.includeLabor = true;
201
+ }
202
+ else if (arg === '--kerf') {
203
+ options.kerf = parseFloat(args[++i]);
204
+ }
205
+ else if (arg === '--sheet-size') {
206
+ const size = args[++i];
207
+ if (size in optimizer_1.STANDARD_SHEET_SIZES) {
208
+ options.sheetSize = size;
209
+ }
210
+ else {
211
+ console.error(`Invalid sheet size: ${size}. Use 4x8, 4x4, 5x5, 4x10, or 4x12.`);
212
+ process.exit(1);
213
+ }
214
+ }
215
+ else if (arg === '--optimize') {
216
+ options.includeOptimization = true;
217
+ }
218
+ else if (arg === '--page-size') {
219
+ options.pageSize = args[++i];
220
+ }
221
+ else if (!arg.startsWith('-')) {
222
+ if (!options.command) {
223
+ options.command = arg;
224
+ }
225
+ else if (!options.file) {
226
+ options.file = arg;
227
+ }
228
+ }
229
+ i++;
230
+ }
231
+ return options;
232
+ }
233
+ // ============================================
234
+ // OUTPUT UTILITIES
235
+ // ============================================
236
+ function writeOutput(content, outputFile) {
237
+ if (outputFile) {
238
+ fs.writeFileSync(outputFile, content);
239
+ console.log(`Output written to: ${outputFile}`);
240
+ }
241
+ else {
242
+ console.log(content);
243
+ }
244
+ }
245
+ function formatErrors(errors) {
246
+ return errors
247
+ .map((e) => `[${e.severity.toUpperCase()}] ${e.path}: ${e.message}`)
248
+ .join('\n');
249
+ }
250
+ // ============================================
251
+ // COMMANDS
252
+ // ============================================
253
+ function cmdParse(filePath, options) {
254
+ const source = fs.readFileSync(filePath, 'utf-8');
255
+ const parser = new parser_1.WoodMLParser();
256
+ try {
257
+ const resolved = parser.parseAndResolve(source);
258
+ if (options.format === 'json') {
259
+ writeOutput(JSON.stringify(resolved, null, 2), options.output);
260
+ }
261
+ else {
262
+ const lines = [];
263
+ lines.push(`Project: ${resolved.project?.name || 'Untitled'}`);
264
+ lines.push(`Version: ${resolved.woodml}`);
265
+ lines.push(`Units: ${resolved.project?.units || 'imperial'}`);
266
+ lines.push('');
267
+ lines.push(`Parts: ${resolved.resolvedParts.length}`);
268
+ lines.push(`Total Board Feet: ${(0, parser_1.calculateBoardFeet)(resolved).toFixed(2)}`);
269
+ if (options.verbose) {
270
+ lines.push('');
271
+ lines.push('Resolved Variables:');
272
+ for (const [name, value] of Object.entries(resolved.resolvedVariables)) {
273
+ if (typeof value === 'number') {
274
+ lines.push(` $${name} = ${value}`);
275
+ }
276
+ else {
277
+ lines.push(` $${name} = ${value.original} (${value.value})`);
278
+ }
279
+ }
280
+ }
281
+ writeOutput(lines.join('\n'), options.output);
282
+ }
283
+ }
284
+ catch (error) {
285
+ console.error(`Parse error: ${error.message}`);
286
+ process.exit(1);
287
+ }
288
+ }
289
+ function cmdCutlist(filePath, options) {
290
+ const source = fs.readFileSync(filePath, 'utf-8');
291
+ const parser = new parser_1.WoodMLParser();
292
+ try {
293
+ const resolved = parser.parseAndResolve(source);
294
+ const cutList = (0, parser_1.generateCutList)(resolved);
295
+ if (options.format === 'json') {
296
+ writeOutput(JSON.stringify(cutList, null, 2), options.output);
297
+ }
298
+ else if (options.format === 'table') {
299
+ writeOutput((0, parser_1.formatCutList)(cutList), options.output);
300
+ }
301
+ else {
302
+ // Text format - simple list
303
+ const lines = ['Cut List:', ''];
304
+ for (const item of cutList) {
305
+ lines.push(`${item.partName} (${item.material})`);
306
+ lines.push(` ${item.length} × ${item.width} × ${item.thickness}`);
307
+ lines.push(` Quantity: ${item.quantity}, Board Feet: ${item.boardFeet}`);
308
+ lines.push('');
309
+ }
310
+ lines.push(`Total Board Feet: ${cutList.reduce((sum, i) => sum + i.boardFeet, 0).toFixed(2)}`);
311
+ writeOutput(lines.join('\n'), options.output);
312
+ }
313
+ }
314
+ catch (error) {
315
+ console.error(`Error generating cut list: ${error.message}`);
316
+ process.exit(1);
317
+ }
318
+ }
319
+ function cmdValidate(filePath, options) {
320
+ const source = fs.readFileSync(filePath, 'utf-8');
321
+ const parser = new parser_1.WoodMLParser();
322
+ try {
323
+ const doc = parser.parse(source);
324
+ const errors = (0, parser_1.validateDocument)(doc);
325
+ if (options.format === 'json') {
326
+ writeOutput(JSON.stringify({ valid: errors.length === 0, errors }, null, 2), options.output);
327
+ }
328
+ else {
329
+ if (errors.length === 0) {
330
+ writeOutput('✓ Document is valid', options.output);
331
+ }
332
+ else {
333
+ const errorCount = errors.filter((e) => e.severity === 'error').length;
334
+ const warnCount = errors.filter((e) => e.severity === 'warning').length;
335
+ writeOutput(`Found ${errorCount} error(s) and ${warnCount} warning(s):\n\n${formatErrors(errors)}`, options.output);
336
+ process.exit(1);
337
+ }
338
+ }
339
+ }
340
+ catch (error) {
341
+ console.error(`Validation failed: ${error.message}`);
342
+ process.exit(1);
343
+ }
344
+ }
345
+ function cmdInfo(filePath, options) {
346
+ const source = fs.readFileSync(filePath, 'utf-8');
347
+ const parser = new parser_1.WoodMLParser();
348
+ try {
349
+ const resolved = parser.parseAndResolve(source);
350
+ const info = {
351
+ file: path.basename(filePath),
352
+ project: resolved.project?.name || 'Untitled',
353
+ author: resolved.project?.author || 'Unknown',
354
+ version: resolved.woodml,
355
+ units: resolved.project?.units || 'imperial',
356
+ description: resolved.project?.description || '',
357
+ statistics: {
358
+ parts: resolved.resolvedParts.length,
359
+ materials: {
360
+ lumber: resolved.materials?.lumber?.length || 0,
361
+ hardware: resolved.materials?.hardware?.length || 0,
362
+ sheetGoods: resolved.materials?.sheet_goods?.length || 0,
363
+ },
364
+ joinery: resolved.joinery?.length || 0,
365
+ assemblySteps: resolved.assembly?.length || 0,
366
+ totalBoardFeet: parseFloat((0, parser_1.calculateBoardFeet)(resolved).toFixed(2)),
367
+ },
368
+ };
369
+ if (options.format === 'json') {
370
+ writeOutput(JSON.stringify(info, null, 2), options.output);
371
+ }
372
+ else {
373
+ const lines = [
374
+ `File: ${info.file}`,
375
+ `Project: ${info.project}`,
376
+ `Author: ${info.author}`,
377
+ `WoodML Version: ${info.version}`,
378
+ `Units: ${info.units}`,
379
+ '',
380
+ 'Statistics:',
381
+ ` Parts: ${info.statistics.parts}`,
382
+ ` Lumber types: ${info.statistics.materials.lumber}`,
383
+ ` Hardware items: ${info.statistics.materials.hardware}`,
384
+ ` Sheet goods: ${info.statistics.materials.sheetGoods}`,
385
+ ` Joinery connections: ${info.statistics.joinery}`,
386
+ ` Assembly steps: ${info.statistics.assemblySteps}`,
387
+ ` Total board feet: ${info.statistics.totalBoardFeet}`,
388
+ ];
389
+ if (info.description) {
390
+ lines.push('', `Description: ${info.description}`);
391
+ }
392
+ writeOutput(lines.join('\n'), options.output);
393
+ }
394
+ }
395
+ catch (error) {
396
+ console.error(`Error: ${error.message}`);
397
+ process.exit(1);
398
+ }
399
+ }
400
+ function cmdDiagram(filePath, options) {
401
+ const source = fs.readFileSync(filePath, 'utf-8');
402
+ const parser = new parser_1.WoodMLParser();
403
+ try {
404
+ const resolved = parser.parseAndResolve(source);
405
+ const svgOptions = {
406
+ width: options.width,
407
+ height: options.height,
408
+ colorScheme: options.colorScheme,
409
+ showDimensions: true,
410
+ showNames: true,
411
+ showGrain: true,
412
+ };
413
+ const svg = (0, svg_1.generateSVG)(resolved, options.diagramType, svgOptions);
414
+ // For diagram command, default output to file if not specified
415
+ const outputFile = options.output || `${path.basename(filePath, path.extname(filePath))}.svg`;
416
+ writeOutput(svg, outputFile);
417
+ if (options.verbose) {
418
+ console.log(`Generated ${options.diagramType} diagram with ${resolved.resolvedParts.length} parts`);
419
+ }
420
+ }
421
+ catch (error) {
422
+ console.error(`Error generating diagram: ${error.message}`);
423
+ process.exit(1);
424
+ }
425
+ }
426
+ function cmdCost(filePath, options) {
427
+ const source = fs.readFileSync(filePath, 'utf-8');
428
+ const parser = new parser_1.WoodMLParser();
429
+ try {
430
+ const resolved = parser.parseAndResolve(source);
431
+ const costOptions = {
432
+ wastePercentage: (options.wastePercent || 15) / 100,
433
+ laborRate: options.laborRate,
434
+ includeLabor: options.includeLabor,
435
+ };
436
+ const estimate = (0, cost_1.estimateCost)(resolved, costOptions);
437
+ if (options.format === 'json') {
438
+ writeOutput(JSON.stringify(estimate, null, 2), options.output);
439
+ }
440
+ else {
441
+ writeOutput((0, cost_1.formatCostEstimate)(estimate), options.output);
442
+ }
443
+ }
444
+ catch (error) {
445
+ console.error(`Error estimating cost: ${error.message}`);
446
+ process.exit(1);
447
+ }
448
+ }
449
+ function cmdOptimize(filePath, options) {
450
+ const source = fs.readFileSync(filePath, 'utf-8');
451
+ const parser = new parser_1.WoodMLParser();
452
+ try {
453
+ const resolved = parser.parseAndResolve(source);
454
+ const optOptions = {
455
+ kerf: options.kerf,
456
+ sheetSize: options.sheetSize,
457
+ };
458
+ const result = (0, optimizer_1.optimizeCutList)(resolved, optOptions);
459
+ if (options.format === 'json') {
460
+ writeOutput(JSON.stringify(result, null, 2), options.output);
461
+ }
462
+ else {
463
+ writeOutput((0, optimizer_1.formatOptimizationResult)(result), options.output);
464
+ }
465
+ if (options.verbose) {
466
+ console.log(`Sheets needed: ${result.totalSheets}`);
467
+ console.log(`Boards needed: ${result.boards.length}`);
468
+ console.log(`Overall efficiency: ${result.overallEfficiency}%`);
469
+ }
470
+ }
471
+ catch (error) {
472
+ console.error(`Error optimizing cut list: ${error.message}`);
473
+ process.exit(1);
474
+ }
475
+ }
476
+ function cmdPdf(filePath, options) {
477
+ const source = fs.readFileSync(filePath, 'utf-8');
478
+ const parser = new parser_1.WoodMLParser();
479
+ try {
480
+ const resolved = parser.parseAndResolve(source);
481
+ const pdfOptions = {
482
+ pageSize: options.pageSize,
483
+ includeOptimization: options.includeOptimization,
484
+ projectInfo: true,
485
+ };
486
+ const pdf = (0, pdf_1.generateCutSheetPDF)(resolved, pdfOptions);
487
+ // Default output to file
488
+ const outputFile = options.output || `${path.basename(filePath, path.extname(filePath))}-cutsheet.txt`;
489
+ writeOutput(pdf, outputFile);
490
+ if (options.verbose) {
491
+ console.log(`Generated cut sheet with ${resolved.resolvedParts.length} parts`);
492
+ }
493
+ }
494
+ catch (error) {
495
+ console.error(`Error generating PDF: ${error.message}`);
496
+ process.exit(1);
497
+ }
498
+ }
499
+ // ============================================
500
+ // MAIN
501
+ // ============================================
502
+ function main() {
503
+ const args = process.argv.slice(2);
504
+ const options = parseArgs(args);
505
+ if (options.version) {
506
+ console.log('woodml 1.0.0');
507
+ process.exit(0);
508
+ }
509
+ if (options.help || !options.command) {
510
+ console.log(HELP_TEXT);
511
+ process.exit(0);
512
+ }
513
+ if (!options.file) {
514
+ console.error('Error: No input file specified');
515
+ console.log('Usage: woodml <command> <file>');
516
+ process.exit(1);
517
+ }
518
+ if (!fs.existsSync(options.file)) {
519
+ console.error(`Error: File not found: ${options.file}`);
520
+ process.exit(1);
521
+ }
522
+ switch (options.command) {
523
+ case 'parse':
524
+ cmdParse(options.file, options);
525
+ break;
526
+ case 'cutlist':
527
+ cmdCutlist(options.file, options);
528
+ break;
529
+ case 'validate':
530
+ cmdValidate(options.file, options);
531
+ break;
532
+ case 'info':
533
+ cmdInfo(options.file, options);
534
+ break;
535
+ case 'diagram':
536
+ cmdDiagram(options.file, options);
537
+ break;
538
+ case 'cost':
539
+ cmdCost(options.file, options);
540
+ break;
541
+ case 'optimize':
542
+ cmdOptimize(options.file, options);
543
+ break;
544
+ case 'pdf':
545
+ cmdPdf(options.file, options);
546
+ break;
547
+ default:
548
+ console.error(`Unknown command: ${options.command}`);
549
+ console.log('Available commands: parse, cutlist, validate, info, diagram, cost, optimize, pdf');
550
+ process.exit(1);
551
+ }
552
+ }
553
+ main();
554
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/cost.d.ts ADDED
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Cost estimation for WoodML projects
3
+ */
4
+ import { ResolvedDocument } from './types';
5
+ /**
6
+ * Lumber pricing by species (per board foot)
7
+ */
8
+ export interface LumberPricing {
9
+ [species: string]: number;
10
+ }
11
+ /**
12
+ * Default lumber prices (USD per board foot)
13
+ * These are approximate retail prices and should be customized
14
+ */
15
+ export declare const DEFAULT_LUMBER_PRICES: LumberPricing;
16
+ /**
17
+ * Hardware pricing
18
+ */
19
+ export interface HardwarePricing {
20
+ [type: string]: {
21
+ [size: string]: number;
22
+ } | number;
23
+ }
24
+ export declare const DEFAULT_HARDWARE_PRICES: HardwarePricing;
25
+ /**
26
+ * Cost breakdown for a project
27
+ */
28
+ export interface CostEstimate {
29
+ lumber: {
30
+ items: LumberCostItem[];
31
+ subtotal: number;
32
+ };
33
+ hardware: {
34
+ items: HardwareCostItem[];
35
+ subtotal: number;
36
+ };
37
+ finishing: {
38
+ items: FinishingCostItem[];
39
+ subtotal: number;
40
+ };
41
+ labor: {
42
+ hours: number;
43
+ rate: number;
44
+ subtotal: number;
45
+ };
46
+ total: number;
47
+ boardFeetTotal: number;
48
+ squareFeetTotal: number;
49
+ wastePercentage: number;
50
+ notes: string[];
51
+ }
52
+ export interface LumberCostItem {
53
+ material: string;
54
+ boardFeet: number;
55
+ pricePerBF: number;
56
+ cost: number;
57
+ parts: string[];
58
+ }
59
+ export interface HardwareCostItem {
60
+ name: string;
61
+ type: string;
62
+ size?: string;
63
+ quantity: number;
64
+ unitPrice: number;
65
+ cost: number;
66
+ }
67
+ export interface FinishingCostItem {
68
+ product: string;
69
+ coverage: number;
70
+ unitsNeeded: number;
71
+ unitPrice: number;
72
+ cost: number;
73
+ }
74
+ /**
75
+ * Options for cost estimation
76
+ */
77
+ export interface CostEstimateOptions {
78
+ lumberPrices?: LumberPricing;
79
+ hardwarePrices?: HardwarePricing;
80
+ laborRate?: number;
81
+ wastePercentage?: number;
82
+ includeLabor?: boolean;
83
+ laborHoursPerBoardFoot?: number;
84
+ finishPricePerSqFt?: number;
85
+ }
86
+ /**
87
+ * Estimate project cost
88
+ */
89
+ export declare function estimateCost(doc: ResolvedDocument, options?: CostEstimateOptions): CostEstimate;
90
+ /**
91
+ * Format cost estimate as a text report
92
+ */
93
+ export declare function formatCostEstimate(estimate: CostEstimate): string;
94
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../src/cost.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAgB,MAAM,SAAS,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,aA4CnC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,IAAI,EAAE,MAAM,GAAG;QACd,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACxB,GAAG,MAAM,CAAC;CACZ;AAED,eAAO,MAAM,uBAAuB,EAAE,eAuCrC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE;QACN,KAAK,EAAE,cAAc,EAAE,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,QAAQ,EAAE;QACR,KAAK,EAAE,gBAAgB,EAAE,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,SAAS,EAAE;QACT,KAAK,EAAE,iBAAiB,EAAE,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAqDD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,mBAAwB,GAChC,YAAY,CA0Jd;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAwFjE"}