@geotechcli/core 0.4.27 → 0.4.29
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.
- package/dist/evidence/evidence-ref.d.ts +32 -0
- package/dist/evidence/evidence-ref.d.ts.map +1 -0
- package/dist/evidence/evidence-ref.js +6 -0
- package/dist/evidence/evidence-ref.js.map +1 -0
- package/dist/evidence/index.d.ts +2 -0
- package/dist/evidence/index.d.ts.map +1 -0
- package/dist/evidence/index.js +2 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/ground-model/builder.d.ts +7 -0
- package/dist/ground-model/builder.d.ts.map +1 -0
- package/dist/ground-model/builder.js +401 -0
- package/dist/ground-model/builder.js.map +1 -0
- package/dist/ground-model/index.d.ts +3 -0
- package/dist/ground-model/index.d.ts.map +1 -0
- package/dist/ground-model/index.js +2 -0
- package/dist/ground-model/index.js.map +1 -0
- package/dist/ground-model/model.d.ts +119 -0
- package/dist/ground-model/model.d.ts.map +1 -0
- package/dist/ground-model/model.js +2 -0
- package/dist/ground-model/model.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/meta/metadata.json +1 -1
- package/dist/tabular/csv.d.ts +17 -0
- package/dist/tabular/csv.d.ts.map +1 -0
- package/dist/tabular/csv.js +123 -0
- package/dist/tabular/csv.js.map +1 -0
- package/dist/tabular/index.d.ts +4 -0
- package/dist/tabular/index.d.ts.map +1 -0
- package/dist/tabular/index.js +4 -0
- package/dist/tabular/index.js.map +1 -0
- package/dist/tabular/schema-inference.d.ts +45 -0
- package/dist/tabular/schema-inference.d.ts.map +1 -0
- package/dist/tabular/schema-inference.js +284 -0
- package/dist/tabular/schema-inference.js.map +1 -0
- package/dist/tabular/xlsx.d.ts +15 -0
- package/dist/tabular/xlsx.d.ts.map +1 -0
- package/dist/tabular/xlsx.js +190 -0
- package/dist/tabular/xlsx.js.map +1 -0
- package/dist/verifier/findings.d.ts +22 -0
- package/dist/verifier/findings.d.ts.map +1 -0
- package/dist/verifier/findings.js +96 -0
- package/dist/verifier/findings.js.map +1 -0
- package/dist/verifier/index.d.ts +2 -0
- package/dist/verifier/index.d.ts.map +1 -0
- package/dist/verifier/index.js +2 -0
- package/dist/verifier/index.js.map +1 -0
- package/dist/workspace/classifier.d.ts +7 -0
- package/dist/workspace/classifier.d.ts.map +1 -0
- package/dist/workspace/classifier.js +186 -0
- package/dist/workspace/classifier.js.map +1 -0
- package/dist/workspace/dossier.d.ts +3 -0
- package/dist/workspace/dossier.d.ts.map +1 -0
- package/dist/workspace/dossier.js +414 -0
- package/dist/workspace/dossier.js.map +1 -0
- package/dist/workspace/index.d.ts +5 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +5 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/manifest.d.ts +63 -0
- package/dist/workspace/manifest.d.ts.map +1 -0
- package/dist/workspace/manifest.js +7 -0
- package/dist/workspace/manifest.js.map +1 -0
- package/dist/workspace/scanner.d.ts +3 -0
- package/dist/workspace/scanner.d.ts.map +1 -0
- package/dist/workspace/scanner.js +254 -0
- package/dist/workspace/scanner.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { basename, extname, resolve, relative, join } from 'node:path';
|
|
4
|
+
import { classifyWorkspaceFile } from './classifier.js';
|
|
5
|
+
import { DEFAULT_ANALYZE_WORKSPACE_OPTIONS, } from './manifest.js';
|
|
6
|
+
import { inferTabularSchema, parseDelimitedFile, parseXlsxFile, } from '../tabular/index.js';
|
|
7
|
+
import { buildGroundModelFromManifest } from '../ground-model/index.js';
|
|
8
|
+
import { verifyGroundModel } from '../verifier/index.js';
|
|
9
|
+
const IGNORED_DIRECTORIES = new Set([
|
|
10
|
+
'.git',
|
|
11
|
+
'.hg',
|
|
12
|
+
'.svn',
|
|
13
|
+
'.turbo',
|
|
14
|
+
'.next',
|
|
15
|
+
'.open-next',
|
|
16
|
+
'node_modules',
|
|
17
|
+
'dist',
|
|
18
|
+
'build',
|
|
19
|
+
'coverage',
|
|
20
|
+
]);
|
|
21
|
+
const IGNORED_FILES = new Set([
|
|
22
|
+
'.env',
|
|
23
|
+
'.env.local',
|
|
24
|
+
'.env.production',
|
|
25
|
+
'.env.development',
|
|
26
|
+
'package-lock.json',
|
|
27
|
+
'pnpm-lock.yaml',
|
|
28
|
+
'yarn.lock',
|
|
29
|
+
]);
|
|
30
|
+
function toPosixRelative(rootPath, absolutePath) {
|
|
31
|
+
const rel = relative(rootPath, absolutePath).replace(/\\/g, '/');
|
|
32
|
+
return rel || basename(absolutePath);
|
|
33
|
+
}
|
|
34
|
+
function shouldIgnoreEntry(name) {
|
|
35
|
+
if (IGNORED_FILES.has(name))
|
|
36
|
+
return true;
|
|
37
|
+
if (name.startsWith('.') && name !== '.geotech')
|
|
38
|
+
return true;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
function incrementCounter(counter, key) {
|
|
42
|
+
counter[key] = (counter[key] ?? 0) + 1;
|
|
43
|
+
}
|
|
44
|
+
function unique(values) {
|
|
45
|
+
return [...new Set(values)].filter(Boolean).sort();
|
|
46
|
+
}
|
|
47
|
+
async function detectAgsSignature(filePath, maxSampleBytes) {
|
|
48
|
+
const sample = await readFile(filePath, { encoding: 'utf-8' }).catch(() => '');
|
|
49
|
+
const head = sample.slice(0, maxSampleBytes).toUpperCase();
|
|
50
|
+
return /\bGROUP\b/.test(head) && /\bHEADING\b/.test(head) && /\bDATA\b/.test(head);
|
|
51
|
+
}
|
|
52
|
+
async function inferFileSchemas(filePath, relativePath, extension, sizeBytes, options, warnings) {
|
|
53
|
+
if (sizeBytes > options.maxSampleBytes) {
|
|
54
|
+
if (['.csv', '.tsv', '.xlsx'].includes(extension)) {
|
|
55
|
+
warnings.push(`${relativePath}: skipped schema sampling because file is larger than ${Math.round(options.maxSampleBytes / 1024 / 1024)} MB.`);
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
if (extension === '.csv' || extension === '.tsv') {
|
|
61
|
+
const parsed = await parseDelimitedFile(filePath, {
|
|
62
|
+
delimiter: extension === '.tsv' ? '\t' : undefined,
|
|
63
|
+
maxRows: options.maxRows,
|
|
64
|
+
});
|
|
65
|
+
return [
|
|
66
|
+
inferTabularSchema({
|
|
67
|
+
rows: parsed.rows,
|
|
68
|
+
rowCount: parsed.totalRowsSampled,
|
|
69
|
+
sourceName: relativePath,
|
|
70
|
+
warnings: parsed.warnings,
|
|
71
|
+
}),
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
if (extension === '.xlsx') {
|
|
75
|
+
const workbook = await parseXlsxFile(filePath, { maxRows: options.maxRows });
|
|
76
|
+
warnings.push(...workbook.warnings.map((warning) => `${relativePath}: ${warning}`));
|
|
77
|
+
return workbook.sheets.map((sheet) => inferTabularSchema({
|
|
78
|
+
rows: sheet.rows,
|
|
79
|
+
rowCount: sheet.totalRowsSampled,
|
|
80
|
+
sourceName: relativePath,
|
|
81
|
+
sheetName: sheet.name,
|
|
82
|
+
warnings: sheet.warnings,
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
warnings.push(`${relativePath}: schema sampling failed (${error instanceof Error ? error.message : String(error)}).`);
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
async function collectFiles(rootPath, options) {
|
|
92
|
+
const files = [];
|
|
93
|
+
let skipped = 0;
|
|
94
|
+
const warnings = [];
|
|
95
|
+
async function scanDirectory(dirPath, depth) {
|
|
96
|
+
if (files.length >= options.maxFiles)
|
|
97
|
+
return;
|
|
98
|
+
if (depth > options.maxDepth) {
|
|
99
|
+
skipped += 1;
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
let entries;
|
|
103
|
+
try {
|
|
104
|
+
entries = await readdir(dirPath, { withFileTypes: true });
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
warnings.push(`${toPosixRelative(rootPath, dirPath)}: cannot read directory (${error instanceof Error ? error.message : String(error)}).`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
for (const entry of entries) {
|
|
111
|
+
if (files.length >= options.maxFiles)
|
|
112
|
+
break;
|
|
113
|
+
if (shouldIgnoreEntry(entry.name)) {
|
|
114
|
+
skipped += 1;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const absolutePath = join(dirPath, entry.name);
|
|
118
|
+
if (entry.isDirectory()) {
|
|
119
|
+
if (IGNORED_DIRECTORIES.has(entry.name)) {
|
|
120
|
+
skipped += 1;
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
await scanDirectory(absolutePath, depth + 1);
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (entry.isFile()) {
|
|
127
|
+
files.push(absolutePath);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
await scanDirectory(rootPath, 0);
|
|
132
|
+
if (files.length >= options.maxFiles) {
|
|
133
|
+
warnings.push(`Stopped after ${options.maxFiles} files. Increase --max-files for a broader scan.`);
|
|
134
|
+
}
|
|
135
|
+
return { files, skipped, warnings };
|
|
136
|
+
}
|
|
137
|
+
function buildRecommendations(manifest, summary) {
|
|
138
|
+
const recommendations = [];
|
|
139
|
+
const datasetTypes = summary.datasetTypes;
|
|
140
|
+
if (summary.totalFiles === 0) {
|
|
141
|
+
return ['No analyzable files were found in this workspace. Add PDFs, CSV/XLSX tables, AGS, images, or JSON outputs.'];
|
|
142
|
+
}
|
|
143
|
+
if ((datasetTypes['coordinate-table'] ?? 0) > 0) {
|
|
144
|
+
recommendations.push('Coordinate tables detected and bound into GroundModel where borehole IDs are present. Next: use map visualization once enabled.');
|
|
145
|
+
}
|
|
146
|
+
if ((datasetTypes['spt-profile'] ?? 0) > 0 || (datasetTypes['cpt-profile'] ?? 0) > 0) {
|
|
147
|
+
recommendations.push('SPT/CPT profiles detected. Next: foundation screening and liquefaction workflows can consume these tables.');
|
|
148
|
+
}
|
|
149
|
+
if ((datasetTypes['lab-test-summary'] ?? 0) > 0) {
|
|
150
|
+
recommendations.push('Lab-test tables detected. Atterberg, gradation, density, and moisture evidence are bound into GroundModel parameters where sampled columns are recognized.');
|
|
151
|
+
}
|
|
152
|
+
if ((datasetTypes['monitoring-time-series'] ?? 0) > 0 || (datasetTypes['signal-record'] ?? 0) > 0) {
|
|
153
|
+
recommendations.push('Monitoring/signal data detected. Next: run signal analytics for trends, thresholds, and anomalies.');
|
|
154
|
+
}
|
|
155
|
+
if ((summary.kinds.pdf ?? 0) > 0) {
|
|
156
|
+
recommendations.push('PDF reports/logs detected. Use geotech ingest for structured extraction; future analyze releases will add page preprocessing and caching.');
|
|
157
|
+
}
|
|
158
|
+
if (manifest.requestedBranch && !summary.branches.includes(manifest.requestedBranch)) {
|
|
159
|
+
recommendations.push(`Requested branch "${manifest.requestedBranch}" was not strongly detected from file names or schemas.`);
|
|
160
|
+
}
|
|
161
|
+
if (manifest.requestedStandard) {
|
|
162
|
+
recommendations.push(`Standard profile "${manifest.requestedStandard}" recorded for downstream calculation/verifier stages.`);
|
|
163
|
+
}
|
|
164
|
+
if (recommendations.length === 0) {
|
|
165
|
+
recommendations.push('Workspace manifest is ready. Add branch-specific CSV/XLSX schemas or ingest PDFs to improve GroundModel completeness.');
|
|
166
|
+
}
|
|
167
|
+
return recommendations;
|
|
168
|
+
}
|
|
169
|
+
export async function analyzeWorkspace(workspacePath, options = {}) {
|
|
170
|
+
const rootPath = resolve(workspacePath);
|
|
171
|
+
const rootStats = await stat(rootPath).catch(() => null);
|
|
172
|
+
if (!rootStats || !rootStats.isDirectory()) {
|
|
173
|
+
throw new Error(`Workspace directory not found: ${workspacePath}`);
|
|
174
|
+
}
|
|
175
|
+
const resolvedOptions = {
|
|
176
|
+
maxDepth: options.maxDepth ?? DEFAULT_ANALYZE_WORKSPACE_OPTIONS.maxDepth,
|
|
177
|
+
maxFiles: options.maxFiles ?? DEFAULT_ANALYZE_WORKSPACE_OPTIONS.maxFiles,
|
|
178
|
+
maxSampleBytes: options.maxSampleBytes ?? DEFAULT_ANALYZE_WORKSPACE_OPTIONS.maxSampleBytes,
|
|
179
|
+
maxRows: options.maxRows ?? DEFAULT_ANALYZE_WORKSPACE_OPTIONS.maxRows,
|
|
180
|
+
};
|
|
181
|
+
const collection = await collectFiles(rootPath, resolvedOptions);
|
|
182
|
+
const warnings = [...collection.warnings];
|
|
183
|
+
const files = [];
|
|
184
|
+
for (const absolutePath of collection.files) {
|
|
185
|
+
if (!existsSync(absolutePath))
|
|
186
|
+
continue;
|
|
187
|
+
const stats = await stat(absolutePath).catch(() => null);
|
|
188
|
+
if (!stats?.isFile())
|
|
189
|
+
continue;
|
|
190
|
+
const extension = extname(absolutePath).toLowerCase();
|
|
191
|
+
const relativePath = toPosixRelative(rootPath, absolutePath);
|
|
192
|
+
const schemas = await inferFileSchemas(absolutePath, relativePath, extension, stats.size, resolvedOptions, warnings);
|
|
193
|
+
const agsSignature = extension === '.ags'
|
|
194
|
+
? await detectAgsSignature(absolutePath, Math.min(resolvedOptions.maxSampleBytes, 120_000))
|
|
195
|
+
: false;
|
|
196
|
+
const classification = classifyWorkspaceFile(relativePath, { schemas, agsSignature });
|
|
197
|
+
files.push({
|
|
198
|
+
path: relativePath,
|
|
199
|
+
absolutePath,
|
|
200
|
+
name: basename(absolutePath),
|
|
201
|
+
extension,
|
|
202
|
+
sizeBytes: stats.size,
|
|
203
|
+
modifiedAt: stats.mtime.toISOString(),
|
|
204
|
+
classification,
|
|
205
|
+
schemas,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const kinds = {};
|
|
209
|
+
const datasetTypes = {};
|
|
210
|
+
const branchSet = new Set();
|
|
211
|
+
for (const file of files) {
|
|
212
|
+
incrementCounter(kinds, file.classification.kind);
|
|
213
|
+
incrementCounter(datasetTypes, file.classification.datasetType);
|
|
214
|
+
file.classification.branches.forEach((branch) => branchSet.add(branch));
|
|
215
|
+
warnings.push(...file.classification.warnings.map((warning) => `${file.path}: ${warning}`));
|
|
216
|
+
}
|
|
217
|
+
const manifestBase = {
|
|
218
|
+
schemaVersion: 'workspace-manifest.v1',
|
|
219
|
+
generatedAt: new Date().toISOString(),
|
|
220
|
+
rootPath,
|
|
221
|
+
requestedBranch: options.branch,
|
|
222
|
+
requestedStandard: options.standard,
|
|
223
|
+
files: files.sort((left, right) => left.path.localeCompare(right.path)),
|
|
224
|
+
warnings: unique(warnings),
|
|
225
|
+
};
|
|
226
|
+
const summaryWithoutRecommendations = {
|
|
227
|
+
totalFiles: files.length,
|
|
228
|
+
supportedFiles: files.filter((file) => file.classification.kind !== 'unknown').length,
|
|
229
|
+
tabularFiles: files.filter((file) => ['csv', 'xlsx'].includes(file.classification.kind)).length,
|
|
230
|
+
pdfFiles: files.filter((file) => file.classification.kind === 'pdf').length,
|
|
231
|
+
imageFiles: files.filter((file) => file.classification.kind === 'image').length,
|
|
232
|
+
skippedFiles: collection.skipped,
|
|
233
|
+
kinds,
|
|
234
|
+
datasetTypes,
|
|
235
|
+
branches: unique([...branchSet]),
|
|
236
|
+
recommendations: [],
|
|
237
|
+
};
|
|
238
|
+
const recommendations = buildRecommendations(manifestBase, summaryWithoutRecommendations);
|
|
239
|
+
const manifest = {
|
|
240
|
+
...manifestBase,
|
|
241
|
+
summary: {
|
|
242
|
+
...summaryWithoutRecommendations,
|
|
243
|
+
recommendations,
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
if (options.includeGroundModel !== false) {
|
|
247
|
+
const groundModel = await buildGroundModelFromManifest(manifest, { maxRows: resolvedOptions.maxRows });
|
|
248
|
+
const verifier = verifyGroundModel(groundModel);
|
|
249
|
+
manifest.groundModel = groundModel;
|
|
250
|
+
manifest.verifier = verifier;
|
|
251
|
+
}
|
|
252
|
+
return manifest;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/workspace/scanner.ts"],"names":[],"mappings":"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"}
|