@nahisaho/musubix-lean 1.8.5
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/converters/EarsToLeanConverter.d.ts +61 -0
- package/dist/converters/EarsToLeanConverter.d.ts.map +1 -0
- package/dist/converters/EarsToLeanConverter.js +300 -0
- package/dist/converters/EarsToLeanConverter.js.map +1 -0
- package/dist/converters/TypeScriptSpecifier.d.ts +63 -0
- package/dist/converters/TypeScriptSpecifier.d.ts.map +1 -0
- package/dist/converters/TypeScriptSpecifier.js +307 -0
- package/dist/converters/TypeScriptSpecifier.js.map +1 -0
- package/dist/converters/index.d.ts +7 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +7 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/environment/LeanEnvironmentDetector.d.ts +57 -0
- package/dist/environment/LeanEnvironmentDetector.d.ts.map +1 -0
- package/dist/environment/LeanEnvironmentDetector.js +221 -0
- package/dist/environment/LeanEnvironmentDetector.js.map +1 -0
- package/dist/environment/LeanProjectInitializer.d.ts +49 -0
- package/dist/environment/LeanProjectInitializer.d.ts.map +1 -0
- package/dist/environment/LeanProjectInitializer.js +232 -0
- package/dist/environment/LeanProjectInitializer.js.map +1 -0
- package/dist/environment/index.d.ts +7 -0
- package/dist/environment/index.d.ts.map +1 -0
- package/dist/environment/index.js +7 -0
- package/dist/environment/index.js.map +1 -0
- package/dist/errors.d.ts +141 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +254 -0
- package/dist/errors.js.map +1 -0
- package/dist/hybrid/HybridVerifier.d.ts +113 -0
- package/dist/hybrid/HybridVerifier.d.ts.map +1 -0
- package/dist/hybrid/HybridVerifier.js +247 -0
- package/dist/hybrid/HybridVerifier.js.map +1 -0
- package/dist/hybrid/index.d.ts +6 -0
- package/dist/hybrid/index.d.ts.map +1 -0
- package/dist/hybrid/index.js +6 -0
- package/dist/hybrid/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/LeanFileGenerator.d.ts +70 -0
- package/dist/infrastructure/LeanFileGenerator.d.ts.map +1 -0
- package/dist/infrastructure/LeanFileGenerator.js +253 -0
- package/dist/infrastructure/LeanFileGenerator.js.map +1 -0
- package/dist/infrastructure/LeanRunner.d.ts +93 -0
- package/dist/infrastructure/LeanRunner.d.ts.map +1 -0
- package/dist/infrastructure/LeanRunner.js +296 -0
- package/dist/infrastructure/LeanRunner.js.map +1 -0
- package/dist/infrastructure/index.d.ts +7 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +7 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/integration/LeanIntegration.d.ts +138 -0
- package/dist/integration/LeanIntegration.d.ts.map +1 -0
- package/dist/integration/LeanIntegration.js +352 -0
- package/dist/integration/LeanIntegration.js.map +1 -0
- package/dist/proof/ProofGenerator.d.ts +53 -0
- package/dist/proof/ProofGenerator.d.ts.map +1 -0
- package/dist/proof/ProofGenerator.js +324 -0
- package/dist/proof/ProofGenerator.js.map +1 -0
- package/dist/proof/ReProverClient.d.ts +58 -0
- package/dist/proof/ReProverClient.d.ts.map +1 -0
- package/dist/proof/ReProverClient.js +260 -0
- package/dist/proof/ReProverClient.js.map +1 -0
- package/dist/proof/index.d.ts +7 -0
- package/dist/proof/index.d.ts.map +1 -0
- package/dist/proof/index.js +7 -0
- package/dist/proof/index.js.map +1 -0
- package/dist/reporting/VerificationReporter.d.ts +89 -0
- package/dist/reporting/VerificationReporter.d.ts.map +1 -0
- package/dist/reporting/VerificationReporter.js +296 -0
- package/dist/reporting/VerificationReporter.js.map +1 -0
- package/dist/reporting/index.d.ts +6 -0
- package/dist/reporting/index.d.ts.map +1 -0
- package/dist/reporting/index.js +6 -0
- package/dist/reporting/index.js.map +1 -0
- package/dist/traceability/TraceabilityManager.d.ts +104 -0
- package/dist/traceability/TraceabilityManager.d.ts.map +1 -0
- package/dist/traceability/TraceabilityManager.js +299 -0
- package/dist/traceability/TraceabilityManager.js.map +1 -0
- package/dist/traceability/index.d.ts +6 -0
- package/dist/traceability/index.d.ts.map +1 -0
- package/dist/traceability/index.js +6 -0
- package/dist/traceability/index.js.map +1 -0
- package/dist/types.d.ts +466 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview TypeScript to Lean specification converter
|
|
3
|
+
* @module @nahisaho/musubix-lean/converters
|
|
4
|
+
* @traceability REQ-LEAN-TS-001 to REQ-LEAN-TS-004
|
|
5
|
+
*/
|
|
6
|
+
import { ok, err } from 'neverthrow';
|
|
7
|
+
import { TypeScriptSpecificationError } from '../errors.js';
|
|
8
|
+
/**
|
|
9
|
+
* TypeScript to Lean type mapping
|
|
10
|
+
* @traceability REQ-LEAN-TS-001
|
|
11
|
+
*/
|
|
12
|
+
const TYPE_MAPPING = {
|
|
13
|
+
number: 'Int',
|
|
14
|
+
string: 'String',
|
|
15
|
+
boolean: 'Bool',
|
|
16
|
+
void: 'Unit',
|
|
17
|
+
undefined: 'Unit',
|
|
18
|
+
null: 'Unit',
|
|
19
|
+
any: 'α', // Generic type
|
|
20
|
+
unknown: 'α',
|
|
21
|
+
never: 'Empty',
|
|
22
|
+
bigint: 'Int',
|
|
23
|
+
symbol: 'String',
|
|
24
|
+
object: 'α',
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Convert TypeScript type to Lean type
|
|
28
|
+
* @traceability REQ-LEAN-TS-001
|
|
29
|
+
*/
|
|
30
|
+
export function convertTypeToLean(tsType) {
|
|
31
|
+
// Handle basic types
|
|
32
|
+
const basicType = TYPE_MAPPING[tsType.toLowerCase()];
|
|
33
|
+
if (basicType) {
|
|
34
|
+
return basicType;
|
|
35
|
+
}
|
|
36
|
+
// Handle Array<T> or T[]
|
|
37
|
+
const arrayMatch = tsType.match(/^Array<(.+)>$|^(.+)\[\]$/);
|
|
38
|
+
if (arrayMatch) {
|
|
39
|
+
const elementType = arrayMatch[1] || arrayMatch[2];
|
|
40
|
+
return `List ${convertTypeToLean(elementType)}`;
|
|
41
|
+
}
|
|
42
|
+
// Handle T | null or T | undefined (Option type)
|
|
43
|
+
const optionMatch = tsType.match(/^(.+?)\s*\|\s*(?:null|undefined)$/);
|
|
44
|
+
if (optionMatch) {
|
|
45
|
+
return `Option ${convertTypeToLean(optionMatch[1])}`;
|
|
46
|
+
}
|
|
47
|
+
// Handle Result<T, E>
|
|
48
|
+
const resultMatch = tsType.match(/^Result<(.+?),\s*(.+?)>$/);
|
|
49
|
+
if (resultMatch) {
|
|
50
|
+
return `Except ${convertTypeToLean(resultMatch[2])} ${convertTypeToLean(resultMatch[1])}`;
|
|
51
|
+
}
|
|
52
|
+
// Handle Promise<T>
|
|
53
|
+
const promiseMatch = tsType.match(/^Promise<(.+)>$/);
|
|
54
|
+
if (promiseMatch) {
|
|
55
|
+
return `IO ${convertTypeToLean(promiseMatch[1])}`;
|
|
56
|
+
}
|
|
57
|
+
// Handle Map<K, V>
|
|
58
|
+
const mapMatch = tsType.match(/^Map<(.+?),\s*(.+?)>$/);
|
|
59
|
+
if (mapMatch) {
|
|
60
|
+
return `List (${convertTypeToLean(mapMatch[1])} × ${convertTypeToLean(mapMatch[2])})`;
|
|
61
|
+
}
|
|
62
|
+
// Handle Set<T>
|
|
63
|
+
const setMatch = tsType.match(/^Set<(.+)>$/);
|
|
64
|
+
if (setMatch) {
|
|
65
|
+
return `List ${convertTypeToLean(setMatch[1])}`;
|
|
66
|
+
}
|
|
67
|
+
// Handle Record<K, V>
|
|
68
|
+
const recordMatch = tsType.match(/^Record<(.+?),\s*(.+?)>$/);
|
|
69
|
+
if (recordMatch) {
|
|
70
|
+
return `List (${convertTypeToLean(recordMatch[1])} × ${convertTypeToLean(recordMatch[2])})`;
|
|
71
|
+
}
|
|
72
|
+
// Handle tuple types
|
|
73
|
+
if (tsType.startsWith('[') && tsType.endsWith(']')) {
|
|
74
|
+
const elements = tsType.slice(1, -1).split(',').map((t) => t.trim());
|
|
75
|
+
const leanTypes = elements.map(convertTypeToLean);
|
|
76
|
+
return `(${leanTypes.join(' × ')})`;
|
|
77
|
+
}
|
|
78
|
+
// Handle union types (simplified)
|
|
79
|
+
if (tsType.includes('|')) {
|
|
80
|
+
// For now, treat unions as the first type
|
|
81
|
+
const firstType = tsType.split('|')[0].trim();
|
|
82
|
+
return convertTypeToLean(firstType);
|
|
83
|
+
}
|
|
84
|
+
// Custom/unknown types become generic
|
|
85
|
+
return tsType.charAt(0).toUpperCase() + tsType.slice(1);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Convert parameter to Lean parameter declaration
|
|
89
|
+
*/
|
|
90
|
+
function convertParameter(param) {
|
|
91
|
+
const leanType = convertTypeToLean(param.type);
|
|
92
|
+
if (param.optional) {
|
|
93
|
+
return `(${param.name} : Option ${leanType})`;
|
|
94
|
+
}
|
|
95
|
+
return `(${param.name} : ${leanType})`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Convert precondition to Lean hypothesis
|
|
99
|
+
* @traceability REQ-LEAN-TS-002
|
|
100
|
+
*/
|
|
101
|
+
function convertPrecondition(precondition, index) {
|
|
102
|
+
const name = `h_pre_${index}`;
|
|
103
|
+
const leanExpr = convertExpressionToLean(precondition.expression);
|
|
104
|
+
return {
|
|
105
|
+
name,
|
|
106
|
+
type: leanExpr,
|
|
107
|
+
leanCode: `${name} : ${leanExpr}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Convert postcondition to Lean expression
|
|
112
|
+
* @traceability REQ-LEAN-TS-003
|
|
113
|
+
*/
|
|
114
|
+
function convertPostcondition(postcondition) {
|
|
115
|
+
const leanExpr = convertExpressionToLean(postcondition.expression);
|
|
116
|
+
return {
|
|
117
|
+
type: leanExpr,
|
|
118
|
+
leanCode: leanExpr,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Convert JavaScript/TypeScript expression to Lean expression
|
|
123
|
+
*/
|
|
124
|
+
function convertExpressionToLean(expr) {
|
|
125
|
+
return (expr
|
|
126
|
+
// Comparison operators
|
|
127
|
+
.replace(/===/g, '=')
|
|
128
|
+
.replace(/!==/g, '≠')
|
|
129
|
+
.replace(/!=/g, '≠')
|
|
130
|
+
.replace(/>=/g, '≥')
|
|
131
|
+
.replace(/<=/g, '≤')
|
|
132
|
+
// Logical operators
|
|
133
|
+
.replace(/&&/g, '∧')
|
|
134
|
+
.replace(/\|\|/g, '∨')
|
|
135
|
+
.replace(/!/g, '¬')
|
|
136
|
+
// Array methods
|
|
137
|
+
.replace(/\.length/g, '.length')
|
|
138
|
+
.replace(/\.includes\(([^)]+)\)/g, '∈ $1')
|
|
139
|
+
// Property access
|
|
140
|
+
.replace(/\./g, '.')
|
|
141
|
+
// Clean up whitespace
|
|
142
|
+
.replace(/\s+/g, ' ')
|
|
143
|
+
.trim());
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Build Lean function specification from TypeScript function
|
|
147
|
+
* @traceability REQ-LEAN-TS-001
|
|
148
|
+
*/
|
|
149
|
+
export function buildFunctionSpec(func) {
|
|
150
|
+
try {
|
|
151
|
+
const params = func.parameters.map(convertParameter).join(' ');
|
|
152
|
+
const returnType = convertTypeToLean(func.returnType);
|
|
153
|
+
const typeSignature = params
|
|
154
|
+
? `${params} → ${returnType}`
|
|
155
|
+
: returnType;
|
|
156
|
+
const preconditionHypotheses = func.preconditions.map((pre, i) => convertPrecondition(pre, i));
|
|
157
|
+
const postconditionGoal = func.postconditions.length > 0
|
|
158
|
+
? convertPostcondition(func.postconditions[0])
|
|
159
|
+
: { type: 'True', leanCode: 'True' };
|
|
160
|
+
// Build Lean code
|
|
161
|
+
const hypothesesCode = preconditionHypotheses
|
|
162
|
+
.map((h) => ` (${h.leanCode})`)
|
|
163
|
+
.join('\n');
|
|
164
|
+
const leanCode = `
|
|
165
|
+
/-- Specification for ${func.name}
|
|
166
|
+
@file ${func.filePath}
|
|
167
|
+
-/
|
|
168
|
+
def ${func.name}_spec
|
|
169
|
+
${hypothesesCode}
|
|
170
|
+
: ${postconditionGoal.leanCode} := by
|
|
171
|
+
sorry -- TODO: Implement specification
|
|
172
|
+
`;
|
|
173
|
+
return ok({
|
|
174
|
+
functionName: func.name,
|
|
175
|
+
typeSignature,
|
|
176
|
+
preconditionHypotheses,
|
|
177
|
+
postconditionGoal,
|
|
178
|
+
leanCode,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
return err(new TypeScriptSpecificationError(func.name, error instanceof Error ? error.message : String(error)));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Extract preconditions from JSDoc comments
|
|
187
|
+
* @traceability REQ-LEAN-TS-002
|
|
188
|
+
*/
|
|
189
|
+
export function extractPreconditionsFromJSDoc(jsdoc) {
|
|
190
|
+
const preconditions = [];
|
|
191
|
+
const preRegex = /@precondition\s+(.+?)(?=@|\*\/|$)/gi;
|
|
192
|
+
let match;
|
|
193
|
+
while ((match = preRegex.exec(jsdoc)) !== null) {
|
|
194
|
+
const text = match[1].trim();
|
|
195
|
+
// Try to parse as expression
|
|
196
|
+
const exprMatch = text.match(/^{(.+?)}\s*(.*)$/);
|
|
197
|
+
if (exprMatch) {
|
|
198
|
+
preconditions.push({
|
|
199
|
+
expression: exprMatch[1].trim(),
|
|
200
|
+
description: exprMatch[2].trim() || exprMatch[1].trim(),
|
|
201
|
+
source: 'jsdoc',
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
preconditions.push({
|
|
206
|
+
expression: text,
|
|
207
|
+
description: text,
|
|
208
|
+
source: 'jsdoc',
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return preconditions;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Extract postconditions from JSDoc comments
|
|
216
|
+
* @traceability REQ-LEAN-TS-003
|
|
217
|
+
*/
|
|
218
|
+
export function extractPostconditionsFromJSDoc(jsdoc) {
|
|
219
|
+
const postconditions = [];
|
|
220
|
+
const postRegex = /@postcondition\s+(.+?)(?=@|\*\/|$)/gi;
|
|
221
|
+
let match;
|
|
222
|
+
while ((match = postRegex.exec(jsdoc)) !== null) {
|
|
223
|
+
const text = match[1].trim();
|
|
224
|
+
const exprMatch = text.match(/^{(.+?)}\s*(.*)$/);
|
|
225
|
+
if (exprMatch) {
|
|
226
|
+
postconditions.push({
|
|
227
|
+
expression: exprMatch[1].trim(),
|
|
228
|
+
description: exprMatch[2].trim() || exprMatch[1].trim(),
|
|
229
|
+
source: 'jsdoc',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
postconditions.push({
|
|
234
|
+
expression: text,
|
|
235
|
+
description: text,
|
|
236
|
+
source: 'jsdoc',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return postconditions;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Extract invariants from JSDoc comments
|
|
244
|
+
* @traceability REQ-LEAN-TS-004
|
|
245
|
+
*/
|
|
246
|
+
export function extractInvariantsFromJSDoc(jsdoc) {
|
|
247
|
+
const invariants = [];
|
|
248
|
+
const invRegex = /@invariant\s+(.+?)(?=@|\*\/|$)/gi;
|
|
249
|
+
let match;
|
|
250
|
+
while ((match = invRegex.exec(jsdoc)) !== null) {
|
|
251
|
+
const text = match[1].trim();
|
|
252
|
+
const exprMatch = text.match(/^{(.+?)}\s*(.*)$/);
|
|
253
|
+
if (exprMatch) {
|
|
254
|
+
invariants.push({
|
|
255
|
+
expression: exprMatch[1].trim(),
|
|
256
|
+
description: exprMatch[2].trim() || exprMatch[1].trim(),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
invariants.push({
|
|
261
|
+
expression: text,
|
|
262
|
+
description: text,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return invariants;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* TypeScriptSpecifier class implementation
|
|
270
|
+
* @traceability REQ-LEAN-TS-001
|
|
271
|
+
*/
|
|
272
|
+
export class TypeScriptSpecifier {
|
|
273
|
+
/**
|
|
274
|
+
* Specify a TypeScript function as Lean specification
|
|
275
|
+
*/
|
|
276
|
+
specify(func) {
|
|
277
|
+
return buildFunctionSpec(func);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Extract function signature info (simplified)
|
|
281
|
+
*/
|
|
282
|
+
extractSignature(_code, _funcName) {
|
|
283
|
+
// This would use ts-morph for real implementation
|
|
284
|
+
return { params: [], returnType: 'void' };
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Infer preconditions from function body
|
|
288
|
+
*/
|
|
289
|
+
inferPreconditions(_func) {
|
|
290
|
+
// Would analyze type guards, validation checks
|
|
291
|
+
return [];
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Infer postconditions from function body
|
|
295
|
+
*/
|
|
296
|
+
inferPostconditions(_func) {
|
|
297
|
+
// Would analyze return statements, Result types
|
|
298
|
+
return [];
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Convert type to Lean
|
|
302
|
+
*/
|
|
303
|
+
convertType(tsType) {
|
|
304
|
+
return convertTypeToLean(tsType);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=TypeScriptSpecifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeScriptSpecifier.js","sourceRoot":"","sources":["../../src/converters/TypeScriptSpecifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Converters module exports
|
|
3
|
+
* @module @nahisaho/musubix-lean/converters
|
|
4
|
+
*/
|
|
5
|
+
export { EarsToLeanConverter, parseEarsRequirement, buildLeanTheorem, convertEarsToLean, convertEarsTextToLean, detectEarsPattern, } from './EarsToLeanConverter.js';
|
|
6
|
+
export { TypeScriptSpecifier, buildFunctionSpec, convertTypeToLean, extractPreconditionsFromJSDoc, extractPostconditionsFromJSDoc, extractInvariantsFromJSDoc, } from './TypeScriptSpecifier.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/converters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,6BAA6B,EAC7B,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Converters module exports
|
|
3
|
+
* @module @nahisaho/musubix-lean/converters
|
|
4
|
+
*/
|
|
5
|
+
export { EarsToLeanConverter, parseEarsRequirement, buildLeanTheorem, convertEarsToLean, convertEarsTextToLean, detectEarsPattern, } from './EarsToLeanConverter.js';
|
|
6
|
+
export { TypeScriptSpecifier, buildFunctionSpec, convertTypeToLean, extractPreconditionsFromJSDoc, extractPostconditionsFromJSDoc, extractInvariantsFromJSDoc, } from './TypeScriptSpecifier.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/converters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,6BAA6B,EAC7B,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Lean environment detection and validation
|
|
3
|
+
* @module @nahisaho/musubix-lean/environment
|
|
4
|
+
* @traceability REQ-LEAN-CORE-001, REQ-LEAN-ERR-001
|
|
5
|
+
*/
|
|
6
|
+
import type { LeanEnvironmentInfo, LeanVersion } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Detect Lean 4 installation and gather environment information
|
|
9
|
+
* @traceability REQ-LEAN-CORE-001
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectLeanEnvironment(): Promise<LeanEnvironmentInfo>;
|
|
12
|
+
/**
|
|
13
|
+
* Validate that Lean version meets minimum requirement
|
|
14
|
+
* @traceability REQ-LEAN-CORE-001
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateLeanVersion(actual: LeanVersion | null, minVersion: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Ensure Lean is installed and meets version requirements
|
|
19
|
+
* @throws {LeanNotFoundError} If Lean is not installed
|
|
20
|
+
* @throws {LeanVersionError} If Lean version is below minimum
|
|
21
|
+
* @traceability REQ-LEAN-CORE-001, REQ-LEAN-ERR-001
|
|
22
|
+
*/
|
|
23
|
+
export declare function ensureLeanInstalled(minVersion?: string): Promise<LeanEnvironmentInfo>;
|
|
24
|
+
/**
|
|
25
|
+
* Get installation instructions for the current OS
|
|
26
|
+
* @traceability REQ-LEAN-ERR-001
|
|
27
|
+
*/
|
|
28
|
+
export declare function getInstallationInstructions(): string;
|
|
29
|
+
/**
|
|
30
|
+
* Clear the cached environment information
|
|
31
|
+
* Useful for testing or when Lean installation changes
|
|
32
|
+
*/
|
|
33
|
+
export declare function clearEnvironmentCache(): void;
|
|
34
|
+
/**
|
|
35
|
+
* LeanEnvironmentDetector class implementation
|
|
36
|
+
* @traceability REQ-LEAN-CORE-001
|
|
37
|
+
*/
|
|
38
|
+
export declare class LeanEnvironmentDetector {
|
|
39
|
+
private cachedInfo;
|
|
40
|
+
/**
|
|
41
|
+
* Detect Lean environment
|
|
42
|
+
*/
|
|
43
|
+
detect(): Promise<LeanEnvironmentInfo>;
|
|
44
|
+
/**
|
|
45
|
+
* Validate version meets minimum requirement
|
|
46
|
+
*/
|
|
47
|
+
validateVersion(minVersion: string): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Get installation instructions for given OS
|
|
50
|
+
*/
|
|
51
|
+
getInstallInstructions(os: 'linux' | 'macos' | 'windows'): string;
|
|
52
|
+
/**
|
|
53
|
+
* Clear cached information
|
|
54
|
+
*/
|
|
55
|
+
clearCache(): void;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=LeanEnvironmentDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LeanEnvironmentDetector.d.ts","sourceRoot":"","sources":["../../src/environment/LeanEnvironmentDetector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA2BpE;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CA4C1E;AA+DD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAqBT;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,GAAE,MAAgB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAY9B;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,UAAU,CAAoC;IAEtD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAQ5C;;OAEG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAO5C;;OAEG;IACH,sBAAsB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM;IAIjE;;OAEG;IACH,UAAU,IAAI,IAAI;CAInB"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Lean environment detection and validation
|
|
3
|
+
* @module @nahisaho/musubix-lean/environment
|
|
4
|
+
* @traceability REQ-LEAN-CORE-001, REQ-LEAN-ERR-001
|
|
5
|
+
*/
|
|
6
|
+
import { exec } from 'node:child_process';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
import { platform } from 'node:os';
|
|
9
|
+
import { LeanNotFoundError, LeanVersionError, getInstallInstructions, } from '../errors.js';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
/**
|
|
12
|
+
* Parse a version string into a LeanVersion object
|
|
13
|
+
*/
|
|
14
|
+
function parseVersion(versionString) {
|
|
15
|
+
const parts = versionString.split('.').map(Number);
|
|
16
|
+
return {
|
|
17
|
+
major: parts[0] || 0,
|
|
18
|
+
minor: parts[1] || 0,
|
|
19
|
+
patch: parts[2] || 0,
|
|
20
|
+
full: versionString,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Cache for environment detection results
|
|
25
|
+
*/
|
|
26
|
+
let cachedEnvInfo = null;
|
|
27
|
+
/**
|
|
28
|
+
* Detect Lean 4 installation and gather environment information
|
|
29
|
+
* @traceability REQ-LEAN-CORE-001
|
|
30
|
+
*/
|
|
31
|
+
export async function detectLeanEnvironment() {
|
|
32
|
+
// Return cached result if available
|
|
33
|
+
if (cachedEnvInfo !== null) {
|
|
34
|
+
return cachedEnvInfo;
|
|
35
|
+
}
|
|
36
|
+
const envInfo = {
|
|
37
|
+
installed: false,
|
|
38
|
+
version: null,
|
|
39
|
+
path: null,
|
|
40
|
+
lakeVersion: null,
|
|
41
|
+
mathlibAvailable: false,
|
|
42
|
+
};
|
|
43
|
+
try {
|
|
44
|
+
// Detect Lean path
|
|
45
|
+
const leanPath = await detectLeanPath();
|
|
46
|
+
if (!leanPath) {
|
|
47
|
+
cachedEnvInfo = envInfo;
|
|
48
|
+
return envInfo;
|
|
49
|
+
}
|
|
50
|
+
// Get Lean version
|
|
51
|
+
const version = await getLeanVersion(leanPath);
|
|
52
|
+
// Get Lake version
|
|
53
|
+
const lakeVersion = await getLakeVersion();
|
|
54
|
+
// Check Mathlib availability
|
|
55
|
+
const mathlibAvailable = await checkMathlibAvailability();
|
|
56
|
+
cachedEnvInfo = {
|
|
57
|
+
installed: true,
|
|
58
|
+
version,
|
|
59
|
+
path: leanPath,
|
|
60
|
+
lakeVersion,
|
|
61
|
+
mathlibAvailable,
|
|
62
|
+
};
|
|
63
|
+
return cachedEnvInfo;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
cachedEnvInfo = envInfo;
|
|
67
|
+
return envInfo;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detect the path to the Lean executable
|
|
72
|
+
*/
|
|
73
|
+
async function detectLeanPath() {
|
|
74
|
+
const os = platform();
|
|
75
|
+
const whichCommand = os === 'win32' ? 'where lean' : 'which lean';
|
|
76
|
+
try {
|
|
77
|
+
const { stdout } = await execAsync(whichCommand, { timeout: 5000 });
|
|
78
|
+
const path = stdout.trim().split('\n')[0];
|
|
79
|
+
return path || null;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get the Lean version from the executable
|
|
87
|
+
*/
|
|
88
|
+
async function getLeanVersion(leanPath) {
|
|
89
|
+
try {
|
|
90
|
+
const { stdout } = await execAsync(`"${leanPath}" --version`, {
|
|
91
|
+
timeout: 5000,
|
|
92
|
+
});
|
|
93
|
+
// Parse version from output like "Lean (version 4.3.0, ...)"
|
|
94
|
+
const match = stdout.match(/version\s+(\d+\.\d+\.\d+)/i);
|
|
95
|
+
return match ? parseVersion(match[1]) : null;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get the Lake version
|
|
103
|
+
*/
|
|
104
|
+
async function getLakeVersion() {
|
|
105
|
+
try {
|
|
106
|
+
const { stdout } = await execAsync('lake --version', { timeout: 5000 });
|
|
107
|
+
// Parse version from output like "Lake version 4.3.0 ..."
|
|
108
|
+
const match = stdout.match(/version\s+(\d+\.\d+\.\d+)/i);
|
|
109
|
+
return match ? match[1] : null;
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if Mathlib is available
|
|
117
|
+
*/
|
|
118
|
+
async function checkMathlibAvailability() {
|
|
119
|
+
try {
|
|
120
|
+
// Check if mathlib is cached in lake
|
|
121
|
+
const { stdout } = await execAsync('lake env printenv LEAN_PATH', {
|
|
122
|
+
timeout: 10000,
|
|
123
|
+
});
|
|
124
|
+
return stdout.includes('mathlib') || stdout.includes('Mathlib');
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Validate that Lean version meets minimum requirement
|
|
132
|
+
* @traceability REQ-LEAN-CORE-001
|
|
133
|
+
*/
|
|
134
|
+
export function validateLeanVersion(actual, minVersion) {
|
|
135
|
+
if (!actual) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
const actualParts = actual.full.split('.').map(Number);
|
|
139
|
+
const minParts = minVersion.split('.').map(Number);
|
|
140
|
+
for (let i = 0; i < Math.max(actualParts.length, minParts.length); i++) {
|
|
141
|
+
const actualPart = actualParts[i] || 0;
|
|
142
|
+
const minPart = minParts[i] || 0;
|
|
143
|
+
if (actualPart > minPart) {
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
if (actualPart < minPart) {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return true; // Equal versions
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Ensure Lean is installed and meets version requirements
|
|
154
|
+
* @throws {LeanNotFoundError} If Lean is not installed
|
|
155
|
+
* @throws {LeanVersionError} If Lean version is below minimum
|
|
156
|
+
* @traceability REQ-LEAN-CORE-001, REQ-LEAN-ERR-001
|
|
157
|
+
*/
|
|
158
|
+
export async function ensureLeanInstalled(minVersion = '4.0.0') {
|
|
159
|
+
const envInfo = await detectLeanEnvironment();
|
|
160
|
+
if (!envInfo.installed) {
|
|
161
|
+
throw new LeanNotFoundError(platform());
|
|
162
|
+
}
|
|
163
|
+
if (!validateLeanVersion(envInfo.version, minVersion)) {
|
|
164
|
+
throw new LeanVersionError(minVersion, envInfo.version?.full || 'unknown');
|
|
165
|
+
}
|
|
166
|
+
return envInfo;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get installation instructions for the current OS
|
|
170
|
+
* @traceability REQ-LEAN-ERR-001
|
|
171
|
+
*/
|
|
172
|
+
export function getInstallationInstructions() {
|
|
173
|
+
return getInstallInstructions(platform());
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Clear the cached environment information
|
|
177
|
+
* Useful for testing or when Lean installation changes
|
|
178
|
+
*/
|
|
179
|
+
export function clearEnvironmentCache() {
|
|
180
|
+
cachedEnvInfo = null;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* LeanEnvironmentDetector class implementation
|
|
184
|
+
* @traceability REQ-LEAN-CORE-001
|
|
185
|
+
*/
|
|
186
|
+
export class LeanEnvironmentDetector {
|
|
187
|
+
cachedInfo = null;
|
|
188
|
+
/**
|
|
189
|
+
* Detect Lean environment
|
|
190
|
+
*/
|
|
191
|
+
async detect() {
|
|
192
|
+
if (this.cachedInfo) {
|
|
193
|
+
return this.cachedInfo;
|
|
194
|
+
}
|
|
195
|
+
this.cachedInfo = await detectLeanEnvironment();
|
|
196
|
+
return this.cachedInfo;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Validate version meets minimum requirement
|
|
200
|
+
*/
|
|
201
|
+
validateVersion(minVersion) {
|
|
202
|
+
if (!this.cachedInfo) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
return validateLeanVersion(this.cachedInfo.version, minVersion);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get installation instructions for given OS
|
|
209
|
+
*/
|
|
210
|
+
getInstallInstructions(os) {
|
|
211
|
+
return getInstallInstructions(os);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Clear cached information
|
|
215
|
+
*/
|
|
216
|
+
clearCache() {
|
|
217
|
+
this.cachedInfo = null;
|
|
218
|
+
clearEnvironmentCache();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=LeanEnvironmentDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LeanEnvironmentDetector.js","sourceRoot":"","sources":["../../src/environment/LeanEnvironmentDetector.ts"],"names":[],"mappings":"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"}
|