@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.
Files changed (89) hide show
  1. package/dist/converters/EarsToLeanConverter.d.ts +61 -0
  2. package/dist/converters/EarsToLeanConverter.d.ts.map +1 -0
  3. package/dist/converters/EarsToLeanConverter.js +300 -0
  4. package/dist/converters/EarsToLeanConverter.js.map +1 -0
  5. package/dist/converters/TypeScriptSpecifier.d.ts +63 -0
  6. package/dist/converters/TypeScriptSpecifier.d.ts.map +1 -0
  7. package/dist/converters/TypeScriptSpecifier.js +307 -0
  8. package/dist/converters/TypeScriptSpecifier.js.map +1 -0
  9. package/dist/converters/index.d.ts +7 -0
  10. package/dist/converters/index.d.ts.map +1 -0
  11. package/dist/converters/index.js +7 -0
  12. package/dist/converters/index.js.map +1 -0
  13. package/dist/environment/LeanEnvironmentDetector.d.ts +57 -0
  14. package/dist/environment/LeanEnvironmentDetector.d.ts.map +1 -0
  15. package/dist/environment/LeanEnvironmentDetector.js +221 -0
  16. package/dist/environment/LeanEnvironmentDetector.js.map +1 -0
  17. package/dist/environment/LeanProjectInitializer.d.ts +49 -0
  18. package/dist/environment/LeanProjectInitializer.d.ts.map +1 -0
  19. package/dist/environment/LeanProjectInitializer.js +232 -0
  20. package/dist/environment/LeanProjectInitializer.js.map +1 -0
  21. package/dist/environment/index.d.ts +7 -0
  22. package/dist/environment/index.d.ts.map +1 -0
  23. package/dist/environment/index.js +7 -0
  24. package/dist/environment/index.js.map +1 -0
  25. package/dist/errors.d.ts +141 -0
  26. package/dist/errors.d.ts.map +1 -0
  27. package/dist/errors.js +254 -0
  28. package/dist/errors.js.map +1 -0
  29. package/dist/hybrid/HybridVerifier.d.ts +113 -0
  30. package/dist/hybrid/HybridVerifier.d.ts.map +1 -0
  31. package/dist/hybrid/HybridVerifier.js +247 -0
  32. package/dist/hybrid/HybridVerifier.js.map +1 -0
  33. package/dist/hybrid/index.d.ts +6 -0
  34. package/dist/hybrid/index.d.ts.map +1 -0
  35. package/dist/hybrid/index.js +6 -0
  36. package/dist/hybrid/index.js.map +1 -0
  37. package/dist/index.d.ts +21 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +50 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/infrastructure/LeanFileGenerator.d.ts +70 -0
  42. package/dist/infrastructure/LeanFileGenerator.d.ts.map +1 -0
  43. package/dist/infrastructure/LeanFileGenerator.js +253 -0
  44. package/dist/infrastructure/LeanFileGenerator.js.map +1 -0
  45. package/dist/infrastructure/LeanRunner.d.ts +93 -0
  46. package/dist/infrastructure/LeanRunner.d.ts.map +1 -0
  47. package/dist/infrastructure/LeanRunner.js +296 -0
  48. package/dist/infrastructure/LeanRunner.js.map +1 -0
  49. package/dist/infrastructure/index.d.ts +7 -0
  50. package/dist/infrastructure/index.d.ts.map +1 -0
  51. package/dist/infrastructure/index.js +7 -0
  52. package/dist/infrastructure/index.js.map +1 -0
  53. package/dist/integration/LeanIntegration.d.ts +138 -0
  54. package/dist/integration/LeanIntegration.d.ts.map +1 -0
  55. package/dist/integration/LeanIntegration.js +352 -0
  56. package/dist/integration/LeanIntegration.js.map +1 -0
  57. package/dist/proof/ProofGenerator.d.ts +53 -0
  58. package/dist/proof/ProofGenerator.d.ts.map +1 -0
  59. package/dist/proof/ProofGenerator.js +324 -0
  60. package/dist/proof/ProofGenerator.js.map +1 -0
  61. package/dist/proof/ReProverClient.d.ts +58 -0
  62. package/dist/proof/ReProverClient.d.ts.map +1 -0
  63. package/dist/proof/ReProverClient.js +260 -0
  64. package/dist/proof/ReProverClient.js.map +1 -0
  65. package/dist/proof/index.d.ts +7 -0
  66. package/dist/proof/index.d.ts.map +1 -0
  67. package/dist/proof/index.js +7 -0
  68. package/dist/proof/index.js.map +1 -0
  69. package/dist/reporting/VerificationReporter.d.ts +89 -0
  70. package/dist/reporting/VerificationReporter.d.ts.map +1 -0
  71. package/dist/reporting/VerificationReporter.js +296 -0
  72. package/dist/reporting/VerificationReporter.js.map +1 -0
  73. package/dist/reporting/index.d.ts +6 -0
  74. package/dist/reporting/index.d.ts.map +1 -0
  75. package/dist/reporting/index.js +6 -0
  76. package/dist/reporting/index.js.map +1 -0
  77. package/dist/traceability/TraceabilityManager.d.ts +104 -0
  78. package/dist/traceability/TraceabilityManager.d.ts.map +1 -0
  79. package/dist/traceability/TraceabilityManager.js +299 -0
  80. package/dist/traceability/TraceabilityManager.js.map +1 -0
  81. package/dist/traceability/index.d.ts +6 -0
  82. package/dist/traceability/index.d.ts.map +1 -0
  83. package/dist/traceability/index.js +6 -0
  84. package/dist/traceability/index.js.map +1 -0
  85. package/dist/types.d.ts +466 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +17 -0
  88. package/dist/types.js.map +1 -0
  89. 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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"}