geotechcli 0.2.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 (61) hide show
  1. package/dist/commands/ai.d.ts +8 -0
  2. package/dist/commands/ai.d.ts.map +1 -0
  3. package/dist/commands/ai.js +780 -0
  4. package/dist/commands/ai.js.map +1 -0
  5. package/dist/commands/bearing.d.ts +3 -0
  6. package/dist/commands/bearing.d.ts.map +1 -0
  7. package/dist/commands/bearing.js +64 -0
  8. package/dist/commands/bearing.js.map +1 -0
  9. package/dist/commands/bridge.d.ts +3 -0
  10. package/dist/commands/bridge.d.ts.map +1 -0
  11. package/dist/commands/bridge.js +87 -0
  12. package/dist/commands/bridge.js.map +1 -0
  13. package/dist/commands/classify.d.ts +3 -0
  14. package/dist/commands/classify.d.ts.map +1 -0
  15. package/dist/commands/classify.js +122 -0
  16. package/dist/commands/classify.js.map +1 -0
  17. package/dist/commands/config.d.ts +3 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +97 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/export.d.ts +3 -0
  22. package/dist/commands/export.d.ts.map +1 -0
  23. package/dist/commands/export.js +85 -0
  24. package/dist/commands/export.js.map +1 -0
  25. package/dist/commands/liquefaction.d.ts +3 -0
  26. package/dist/commands/liquefaction.d.ts.map +1 -0
  27. package/dist/commands/liquefaction.js +94 -0
  28. package/dist/commands/liquefaction.js.map +1 -0
  29. package/dist/commands/pile.d.ts +3 -0
  30. package/dist/commands/pile.d.ts.map +1 -0
  31. package/dist/commands/pile.js +88 -0
  32. package/dist/commands/pile.js.map +1 -0
  33. package/dist/commands/retaining.d.ts +3 -0
  34. package/dist/commands/retaining.d.ts.map +1 -0
  35. package/dist/commands/retaining.js +71 -0
  36. package/dist/commands/retaining.js.map +1 -0
  37. package/dist/commands/slope.d.ts +3 -0
  38. package/dist/commands/slope.d.ts.map +1 -0
  39. package/dist/commands/slope.js +80 -0
  40. package/dist/commands/slope.js.map +1 -0
  41. package/dist/commands/status.d.ts +3 -0
  42. package/dist/commands/status.d.ts.map +1 -0
  43. package/dist/commands/status.js +76 -0
  44. package/dist/commands/status.js.map +1 -0
  45. package/dist/commands/tunnel.d.ts +3 -0
  46. package/dist/commands/tunnel.d.ts.map +1 -0
  47. package/dist/commands/tunnel.js +145 -0
  48. package/dist/commands/tunnel.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +83 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/ui/terminal.d.ts +21 -0
  54. package/dist/ui/terminal.d.ts.map +1 -0
  55. package/dist/ui/terminal.js +153 -0
  56. package/dist/ui/terminal.js.map +1 -0
  57. package/dist/util/flags.d.ts +13 -0
  58. package/dist/util/flags.d.ts.map +1 -0
  59. package/dist/util/flags.js +25 -0
  60. package/dist/util/flags.js.map +1 -0
  61. package/package.json +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquefaction.d.ts","sourceRoot":"","sources":["../../src/commands/liquefaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6GlE"}
@@ -0,0 +1,94 @@
1
+ import { Command } from 'commander';
2
+ import { calculateLiquefaction } from '@geotechcli/core';
3
+ import { heading, keyValue, renderTable, renderSteps, renderJSON, warn, success } from '../ui/terminal.js';
4
+ import { addGlobalFlags, getGlobalFlags } from '../util/flags.js';
5
+ import { readFileSync, writeFileSync } from 'node:fs';
6
+ export function registerLiquefactionCommand(program) {
7
+ const cmd = new Command('liquefaction')
8
+ .description('Seismic liquefaction triggering analysis')
9
+ .requiredOption('--pga <g>', 'Peak ground acceleration amax (g)', parseFloat)
10
+ .requiredOption('--magnitude <Mw>', 'Earthquake moment magnitude', parseFloat)
11
+ .option('--method <n>', 'Method: boulanger-idriss-2014|nceer', 'boulanger-idriss-2014')
12
+ .option('--spt-profile <file>', 'CSV file with columns: depth,sptN,finesContent,unitWeight,waterTableDepth')
13
+ .option('--depth <m>', 'Single layer depth (m)', parseFloat)
14
+ .option('--spt <N>', 'Single layer SPT N-value', parseFloat)
15
+ .option('--fines <percent>', 'Single layer fines content (%)', parseFloat, 5)
16
+ .action((opts) => {
17
+ const flags = getGlobalFlags(opts);
18
+ let layers;
19
+ if (opts.sptProfile) {
20
+ // Parse CSV
21
+ const csv = readFileSync(opts.sptProfile, 'utf-8');
22
+ const lines = csv.trim().split('\n');
23
+ const header = lines[0].toLowerCase();
24
+ const hasHeader = header.includes('depth');
25
+ layers = (hasHeader ? lines.slice(1) : lines).map((line) => {
26
+ const cols = line.split(',').map((c) => parseFloat(c.trim()));
27
+ return {
28
+ depth: cols[0],
29
+ sptN: cols[1],
30
+ finesContent: cols[2] ?? 5,
31
+ unitWeight: cols[3] ?? 18,
32
+ waterTableDepth: cols[4] ?? 1,
33
+ };
34
+ }).filter((l) => !isNaN(l.depth) && !isNaN(l.sptN));
35
+ }
36
+ else if (opts.depth && opts.spt !== undefined) {
37
+ layers = [{
38
+ depth: opts.depth,
39
+ sptN: opts.spt,
40
+ finesContent: opts.fines,
41
+ unitWeight: 18,
42
+ waterTableDepth: 1,
43
+ }];
44
+ }
45
+ else {
46
+ // Demo layers
47
+ layers = [
48
+ { depth: 2.0, sptN: 8, finesContent: 15, unitWeight: 17, waterTableDepth: 1.5 },
49
+ { depth: 4.5, sptN: 12, finesContent: 10, unitWeight: 18, waterTableDepth: 1.5 },
50
+ { depth: 7.0, sptN: 6, finesContent: 25, unitWeight: 17.5, waterTableDepth: 1.5 },
51
+ { depth: 10.0, sptN: 22, finesContent: 5, unitWeight: 19, waterTableDepth: 1.5 },
52
+ ];
53
+ if (!flags.json) {
54
+ warn('No SPT profile provided — using demo data. Use --spt-profile <file> for real analysis.');
55
+ }
56
+ }
57
+ if (flags.dryRun) {
58
+ console.log(` [dry-run] Would calculate liquefaction (${opts.method}):`);
59
+ console.log(` Mw=${opts.magnitude}, PGA=${opts.pga}g, ${layers.length} layer(s)`);
60
+ return;
61
+ }
62
+ const result = calculateLiquefaction({
63
+ layers,
64
+ earthquakeMagnitude: opts.magnitude,
65
+ pga: opts.pga,
66
+ method: opts.method,
67
+ });
68
+ if (flags.json) {
69
+ renderJSON(result);
70
+ return;
71
+ }
72
+ if (flags.quiet) {
73
+ const severe = result.layers.filter(l => l.potential === 'SEVERE' || l.potential === 'HIGH').length;
74
+ console.log(`${severe}/${result.layers.length}`);
75
+ return;
76
+ }
77
+ heading(`Liquefaction Analysis — ${result.method === 'boulanger-idriss-2014' ? 'Boulanger & Idriss (2014)' : 'NCEER Simplified'}`);
78
+ keyValue('Earthquake magnitude (Mw)', opts.magnitude);
79
+ keyValue('Peak ground acceleration', `${opts.pga}g`);
80
+ renderTable(['Depth (m)', 'N₁₆₀', '(N₁)₆₀cs', 'CSR', 'CRR', 'FS', 'Potential'], result.layers.map((l) => [
81
+ l.depth, l.N160, l.N160cs, l.CSR, l.CRR, l.factorOfSafety, l.potential,
82
+ ]));
83
+ keyValue('Estimated settlement', `${result.estimatedSettlement} mm`);
84
+ renderSteps(result.steps, flags.verbose);
85
+ if (flags.output) {
86
+ writeFileSync(flags.output, JSON.stringify(result, null, 2));
87
+ success(`Results saved to ${flags.output}`);
88
+ }
89
+ console.log('');
90
+ });
91
+ addGlobalFlags(cmd);
92
+ program.addCommand(cmd);
93
+ }
94
+ //# sourceMappingURL=liquefaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liquefaction.js","sourceRoot":"","sources":["../../src/commands/liquefaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPileCommand(program: Command): void;
3
+ //# sourceMappingURL=pile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pile.d.ts","sourceRoot":"","sources":["../../src/commands/pile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuF1D"}
@@ -0,0 +1,88 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { calculatePileCapacity } from '@geotechcli/core';
4
+ import { heading, keyValue, renderJSON, renderTable, renderSteps, success } from '../ui/terminal.js';
5
+ import { addGlobalFlags, getGlobalFlags } from '../util/flags.js';
6
+ import { readFileSync, writeFileSync } from 'node:fs';
7
+ export function registerPileCommand(program) {
8
+ const cmd = new Command('pile')
9
+ .description('Pile capacity analysis — α-method, β-method, SPT-based (Meyerhof 1976)')
10
+ .requiredOption('--diameter <m>', 'Pile diameter (m)', parseFloat)
11
+ .requiredOption('--length <m>', 'Embedded pile length (m)', parseFloat)
12
+ .option('--type <type>', 'Pile type: driven, bored, cfa', 'driven')
13
+ .option('--shape <shape>', 'Pile shape: circular, square, h-section', 'circular')
14
+ .option('--method <method>', 'Method: alpha, beta, spt-meyerhof, auto', 'auto')
15
+ .option('--fs <n>', 'Factor of safety', parseFloat, 2.5)
16
+ .option('--gwt <m>', 'Water table depth (m)', parseFloat, 999)
17
+ .option('--layers <file>', 'JSON file with soil layers')
18
+ .option('--su <kPa>', 'Undrained shear strength for single-layer analysis', parseFloat)
19
+ .option('--phi <deg>', 'Friction angle for single-layer analysis', parseFloat)
20
+ .option('--gamma <kN/m3>', 'Unit weight', parseFloat, 18)
21
+ .option('--spt <N>', 'SPT N-value for single-layer analysis', parseFloat)
22
+ .action(async (opts) => {
23
+ const flags = getGlobalFlags(opts);
24
+ let layers;
25
+ if (opts.layers) {
26
+ layers = JSON.parse(readFileSync(opts.layers, 'utf-8'));
27
+ }
28
+ else {
29
+ const soilType = opts.su ? 'clay' : opts.phi ? 'sand' : opts.spt ? 'sand' : 'clay';
30
+ layers = [{
31
+ thickness: opts.length,
32
+ soilType,
33
+ undrained_shear_strength: opts.su,
34
+ friction_angle: opts.phi,
35
+ unit_weight: opts.gamma,
36
+ spt_n: opts.spt,
37
+ }];
38
+ }
39
+ try {
40
+ // --dry-run
41
+ if (flags.dryRun) {
42
+ console.log(` [dry-run] Would calculate pile capacity (${opts.method}):`);
43
+ console.log(` D=${opts.diameter}m, L=${opts.length}m, type=${opts.type}, ${layers.length} layer(s)`);
44
+ return;
45
+ }
46
+ const result = calculatePileCapacity({
47
+ pileDiameter: opts.diameter,
48
+ pileLength: opts.length,
49
+ pileType: opts.type,
50
+ pileShape: opts.shape,
51
+ layers,
52
+ waterTableDepth: opts.gwt,
53
+ factorOfSafety: opts.fs,
54
+ method: opts.method,
55
+ });
56
+ if (flags.json) {
57
+ renderJSON(result);
58
+ return;
59
+ }
60
+ if (flags.quiet) {
61
+ console.log(`${result.allowableCapacity}`);
62
+ return;
63
+ }
64
+ heading('Pile Capacity Analysis');
65
+ keyValue('Method', result.method);
66
+ keyValue('Pile', `${result.pileType} ${opts.shape}, D=${result.pileDiameter}m, L=${result.pileLength}m`);
67
+ keyValue('Shaft resistance Qs', `${result.shaftResistance} kN`);
68
+ keyValue('Base resistance Qb', `${result.baseResistance} kN`);
69
+ keyValue('Ultimate capacity Qu', `${result.ultimateCapacity} kN`);
70
+ keyValue('Allowable capacity Qa', `${result.allowableCapacity} kN (FS=${result.factorOfSafety})`);
71
+ if (result.shaftFrictionPerLayer.length > 1) {
72
+ renderTable(['Depth (m)', 'Thick (m)', 'Soil', 'fs (kPa)', 'Qs (kN)'], result.shaftFrictionPerLayer.map((l) => [l.depth.toFixed(1), l.thickness.toFixed(1), l.soilType, l.unitShaftFriction, l.shaftResistance]));
73
+ }
74
+ renderSteps(result.steps, flags.verbose);
75
+ if (flags.output) {
76
+ writeFileSync(flags.output, JSON.stringify(result, null, 2));
77
+ success(`Results saved to ${flags.output}`);
78
+ }
79
+ console.log('');
80
+ }
81
+ catch (err) {
82
+ console.log(chalk.red(` ✗ ${err instanceof Error ? err.message : String(err)}`));
83
+ }
84
+ });
85
+ addGlobalFlags(cmd);
86
+ program.addCommand(cmd);
87
+ }
88
+ //# sourceMappingURL=pile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pile.js","sourceRoot":"","sources":["../../src/commands/pile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerRetainingCommand(program: Command): void;
3
+ //# sourceMappingURL=retaining.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retaining.d.ts","sourceRoot":"","sources":["../../src/commands/retaining.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsE/D"}
@@ -0,0 +1,71 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { calculateLateralEarthPressure } from '@geotechcli/core';
4
+ import { heading, keyValue, renderJSON, renderTable, renderSteps, success } from '../ui/terminal.js';
5
+ import { addGlobalFlags, getGlobalFlags } from '../util/flags.js';
6
+ import { writeFileSync } from 'node:fs';
7
+ export function registerRetainingCommand(program) {
8
+ const cmd = new Command('retaining')
9
+ .description('Lateral earth pressure — Rankine / Coulomb methods')
10
+ .requiredOption('--height <m>', 'Wall height (m)', parseFloat)
11
+ .requiredOption('--phi <deg>', 'Soil friction angle (degrees)', parseFloat)
12
+ .option('--cohesion <kPa>', 'Soil cohesion (kPa)', parseFloat, 0)
13
+ .option('--gamma <kN/m3>', 'Soil unit weight (kN/m³)', parseFloat, 18)
14
+ .option('--method <m>', 'Method: rankine, coulomb', 'rankine')
15
+ .option('--state <s>', 'Pressure state: active, passive, at_rest', 'active')
16
+ .option('--delta <deg>', 'Wall friction angle δ (degrees) — Coulomb', parseFloat, 0)
17
+ .option('--beta <deg>', 'Backfill slope angle (degrees)', parseFloat, 0)
18
+ .option('--gwt <m>', 'Water table depth (m)', parseFloat, 999)
19
+ .option('--surcharge <kPa>', 'Surcharge on backfill (kPa)', parseFloat, 0)
20
+ .action(async (opts) => {
21
+ const flags = getGlobalFlags(opts);
22
+ try {
23
+ if (flags.dryRun) {
24
+ console.log(` [dry-run] Would calculate ${opts.method} ${opts.state} earth pressure:`);
25
+ console.log(` H=${opts.height}m, φ=${opts.phi}°, c=${opts.cohesion}kPa, δ=${opts.delta}°`);
26
+ return;
27
+ }
28
+ const result = calculateLateralEarthPressure({
29
+ wallHeight: opts.height,
30
+ soilLayers: [{ thickness: opts.height * 2, unitWeight: opts.gamma, cohesion: opts.cohesion, frictionAngle: opts.phi }],
31
+ method: opts.method,
32
+ pressureState: opts.state,
33
+ wallFrictionAngle: opts.delta,
34
+ backfillAngle: opts.beta,
35
+ wallInclination: 0,
36
+ waterTableDepth: opts.gwt,
37
+ surcharge: opts.surcharge,
38
+ });
39
+ if (flags.json) {
40
+ renderJSON(result);
41
+ return;
42
+ }
43
+ if (flags.quiet) {
44
+ console.log(`${result.coefficient}`);
45
+ return;
46
+ }
47
+ heading(`Lateral Earth Pressure (${result.method} — ${result.pressureState})`);
48
+ keyValue('Coefficient K', `${result.coefficient}`);
49
+ keyValue('Total force', `${result.totalForce} kN/m`);
50
+ keyValue('Point of application', `${result.pointOfApplication} m from base`);
51
+ keyValue('Overturning moment', `${result.overturningMoment} kN·m/m`);
52
+ if (flags.verbose) {
53
+ renderTable(['Depth (m)', 'σ_h (kPa)', 'u (kPa)', 'Total (kPa)'], result.pressureDistribution
54
+ .filter((_, i) => i % 2 === 0)
55
+ .map((p) => [p.depth, p.pressure, p.waterPressure, p.totalPressure]));
56
+ }
57
+ renderSteps(result.steps, flags.verbose);
58
+ if (flags.output) {
59
+ writeFileSync(flags.output, JSON.stringify(result, null, 2));
60
+ success(`Results saved to ${flags.output}`);
61
+ }
62
+ console.log('');
63
+ }
64
+ catch (err) {
65
+ console.log(chalk.red(` ✗ ${err instanceof Error ? err.message : String(err)}`));
66
+ }
67
+ });
68
+ addGlobalFlags(cmd);
69
+ program.addCommand(cmd);
70
+ }
71
+ //# sourceMappingURL=retaining.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retaining.js","sourceRoot":"","sources":["../../src/commands/retaining.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSlopeCommand(program: Command): void;
3
+ //# sourceMappingURL=slope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slope.d.ts","sourceRoot":"","sources":["../../src/commands/slope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E3D"}
@@ -0,0 +1,80 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { calculateSlopeStability } from '@geotechcli/core';
4
+ import { heading, keyValue, renderJSON, renderSteps, success } from '../ui/terminal.js';
5
+ import { addGlobalFlags, getGlobalFlags } from '../util/flags.js';
6
+ import { readFileSync, writeFileSync } from 'node:fs';
7
+ export function registerSlopeCommand(program) {
8
+ const cmd = new Command('slope')
9
+ .description('Slope stability — Bishop Simplified method')
10
+ .requiredOption('--height <m>', 'Slope height (m)', parseFloat)
11
+ .requiredOption('--angle <deg>', 'Slope angle from horizontal (degrees)', parseFloat)
12
+ .option('--cohesion <kPa>', 'Soil cohesion c\' (kPa)', parseFloat, 10)
13
+ .option('--phi <deg>', 'Friction angle φ\' (degrees)', parseFloat, 25)
14
+ .option('--gamma <kN/m3>', 'Unit weight (kN/m³)', parseFloat, 18)
15
+ .option('--gwt <m>', 'Water table depth from crest (m)', parseFloat, 999)
16
+ .option('--kh <n>', 'Horizontal seismic coefficient', parseFloat, 0)
17
+ .option('--surcharge <kPa>', 'Surcharge at crest (kPa)', parseFloat, 0)
18
+ .option('--slices <n>', 'Number of slices', parseInt, 10)
19
+ .option('--layers <file>', 'JSON file with soil layers')
20
+ .action(async (opts) => {
21
+ const flags = getGlobalFlags(opts);
22
+ let soilLayers;
23
+ if (opts.layers) {
24
+ soilLayers = JSON.parse(readFileSync(opts.layers, 'utf-8'));
25
+ }
26
+ else {
27
+ soilLayers = [{
28
+ thickness: opts.height * 2,
29
+ unitWeight: opts.gamma,
30
+ cohesion: opts.cohesion,
31
+ frictionAngle: opts.phi,
32
+ }];
33
+ }
34
+ try {
35
+ if (flags.dryRun) {
36
+ console.log(` [dry-run] Would calculate slope stability (Bishop Simplified):`);
37
+ console.log(` H=${opts.height}m, angle=${opts.angle}°, ${soilLayers.length} layer(s), kh=${opts.kh}`);
38
+ return;
39
+ }
40
+ const result = calculateSlopeStability({
41
+ slopeHeight: opts.height,
42
+ slopeAngle: opts.angle,
43
+ soilLayers,
44
+ waterTableDepth: opts.gwt,
45
+ surcharge: opts.surcharge,
46
+ seismicCoefficient: opts.kh,
47
+ numberOfSlices: opts.slices,
48
+ method: 'bishop',
49
+ });
50
+ if (flags.json) {
51
+ renderJSON(result);
52
+ return;
53
+ }
54
+ if (flags.quiet) {
55
+ console.log(`${result.factorOfSafety}`);
56
+ return;
57
+ }
58
+ heading('Slope Stability Analysis (Bishop Simplified)');
59
+ keyValue('Slope', `H=${opts.height}m, angle=${opts.angle}°`);
60
+ keyValue('Factor of Safety', `${result.factorOfSafety}`);
61
+ const color = result.stabilityClass === 'STABLE' ? chalk.green
62
+ : result.stabilityClass === 'MARGINAL' ? chalk.yellow
63
+ : chalk.red;
64
+ keyValue('Classification', color(result.stabilityClass));
65
+ keyValue('Critical circle', `R=${result.criticalCircle.radius}m at (${result.criticalCircle.centerX}, ${result.criticalCircle.centerY})`);
66
+ renderSteps(result.steps, flags.verbose);
67
+ if (flags.output) {
68
+ writeFileSync(flags.output, JSON.stringify(result, null, 2));
69
+ success(`Results saved to ${flags.output}`);
70
+ }
71
+ console.log('');
72
+ }
73
+ catch (err) {
74
+ console.log(chalk.red(` ✗ ${err instanceof Error ? err.message : String(err)}`));
75
+ }
76
+ });
77
+ addGlobalFlags(cmd);
78
+ program.addCommand(cmd);
79
+ }
80
+ //# sourceMappingURL=slope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slope.js","sourceRoot":"","sources":["../../src/commands/slope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStatusCommand(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmF5D"}
@@ -0,0 +1,76 @@
1
+ import { loadConfig, buildLLMConfig, generateText, GEOTECHCLI_VERSION, DEFAULT_LLM_MODEL, DEFAULT_LLM_VISION_MODEL, } from '@geotechcli/core';
2
+ import { heading, keyValue, warn, renderJSON } from '../ui/terminal.js';
3
+ import ora from 'ora';
4
+ import chalk from 'chalk';
5
+ export function registerStatusCommand(program) {
6
+ program
7
+ .command('status')
8
+ .description('Check system status, LLM connectivity, and auth tier')
9
+ .option('--json', 'Output raw JSON')
10
+ .action(async (opts) => {
11
+ const config = loadConfig();
12
+ const llmConfig = buildLLMConfig();
13
+ const usesHostedBeta = llmConfig.provider === 'hosted-beta';
14
+ const status = {
15
+ version: GEOTECHCLI_VERSION,
16
+ provider: config.llm.provider,
17
+ model: config.llm.model || DEFAULT_LLM_MODEL,
18
+ visionModel: config.llm.vision_model || DEFAULT_LLM_VISION_MODEL,
19
+ tier: config.auth.tier,
20
+ apiKeySet: Boolean(llmConfig.apiKey),
21
+ requiresUserApiKey: !usesHostedBeta,
22
+ connectivity: 'unknown',
23
+ latencyMs: 0,
24
+ };
25
+ if (opts.json && !usesHostedBeta && !llmConfig.apiKey) {
26
+ status.connectivity = 'no_api_key';
27
+ renderJSON(status);
28
+ return;
29
+ }
30
+ if (!opts.json) {
31
+ heading('geotechCLI Status');
32
+ keyValue('Version', status.version);
33
+ keyValue('LLM provider', config.llm.provider);
34
+ keyValue('Model', status.model);
35
+ keyValue('Vision model', status.visionModel);
36
+ keyValue('Tier', config.auth.tier);
37
+ keyValue('API key', usesHostedBeta
38
+ ? chalk.gray('not required for hosted beta')
39
+ : status.apiKeySet
40
+ ? chalk.green('set')
41
+ : chalk.yellow('not set'));
42
+ }
43
+ if (usesHostedBeta || llmConfig.apiKey) {
44
+ const spinner = opts.json ? null : ora({ text: 'Testing LLM connectivity...', indent: 2 }).start();
45
+ try {
46
+ const response = await generateText('Reply with exactly: OK', llmConfig, { maxTokens: 10, temperature: 0 });
47
+ status.connectivity = 'online';
48
+ status.latencyMs = response.latencyMs;
49
+ if (spinner) {
50
+ spinner.succeed(`LLM online — ${response.latencyMs}ms latency (${response.model})`);
51
+ }
52
+ }
53
+ catch (err) {
54
+ const message = err instanceof Error ? err.message : 'Unknown error';
55
+ status.connectivity = /rate limit/i.test(message) ? 'rate_limited' : 'error';
56
+ if (spinner) {
57
+ spinner.fail(`LLM unreachable: ${message.slice(0, 120)}`);
58
+ }
59
+ }
60
+ }
61
+ else {
62
+ if (!opts.json) {
63
+ warn('No provider API key configured. Switch to hosted beta or set your own provider key.');
64
+ warn('Hosted beta default: geotech config set llm.provider hosted-beta');
65
+ warn('Deterministic calculations work without an API key.');
66
+ }
67
+ }
68
+ if (opts.json) {
69
+ renderJSON(status);
70
+ }
71
+ else {
72
+ console.log('');
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerTunnelCommands(program: Command): void;
3
+ //# sourceMappingURL=tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiJ7D"}