@alan512/experienceengine 0.3.6 → 0.4.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 (74) hide show
  1. package/README.md +7 -2
  2. package/README.zh-CN.md +7 -2
  3. package/dist/cli/commands/doctor.js +56 -0
  4. package/dist/cli/commands/doctor.js.map +1 -1
  5. package/dist/cli/commands/inspect.js +78 -1
  6. package/dist/cli/commands/inspect.js.map +1 -1
  7. package/dist/cli/commands/maintenance.js +80 -2
  8. package/dist/cli/commands/maintenance.js.map +1 -1
  9. package/dist/compiler/command-normalizer.d.ts +27 -0
  10. package/dist/compiler/command-normalizer.js +263 -0
  11. package/dist/compiler/command-normalizer.js.map +1 -0
  12. package/dist/compiler/trajectory-compiler.d.ts +12 -0
  13. package/dist/compiler/trajectory-compiler.js +179 -0
  14. package/dist/compiler/trajectory-compiler.js.map +1 -0
  15. package/dist/compiler/trajectory-matcher.d.ts +18 -0
  16. package/dist/compiler/trajectory-matcher.js +419 -0
  17. package/dist/compiler/trajectory-matcher.js.map +1 -0
  18. package/dist/config/config-schema.d.ts +11 -0
  19. package/dist/config/config-schema.js +9 -0
  20. package/dist/config/config-schema.js.map +1 -1
  21. package/dist/config/default-config.js +1 -0
  22. package/dist/config/default-config.js.map +1 -1
  23. package/dist/controller/candidate-retriever.d.ts +3 -1
  24. package/dist/controller/candidate-retriever.js +247 -7
  25. package/dist/controller/candidate-retriever.js.map +1 -1
  26. package/dist/controller/intervention-controller.js +48 -21
  27. package/dist/controller/intervention-controller.js.map +1 -1
  28. package/dist/controller/trigger-evaluator.d.ts +2 -1
  29. package/dist/controller/trigger-evaluator.js +10 -4
  30. package/dist/controller/trigger-evaluator.js.map +1 -1
  31. package/dist/experience-management/node-lifecycle-governance.js +25 -6
  32. package/dist/experience-management/node-lifecycle-governance.js.map +1 -1
  33. package/dist/input/fingerprint-extractor.d.ts +53 -0
  34. package/dist/input/fingerprint-extractor.js +620 -0
  35. package/dist/input/fingerprint-extractor.js.map +1 -0
  36. package/dist/interaction/service.d.ts +11 -1
  37. package/dist/interaction/service.js +11 -1
  38. package/dist/interaction/service.js.map +1 -1
  39. package/dist/maintenance/vector-migrator.d.ts +37 -0
  40. package/dist/maintenance/vector-migrator.js +170 -0
  41. package/dist/maintenance/vector-migrator.js.map +1 -0
  42. package/dist/plugin/openclaw-plugin.d.ts +8 -0
  43. package/dist/runtime/prompt-service.js +10 -0
  44. package/dist/runtime/prompt-service.js.map +1 -1
  45. package/dist/runtime/service.d.ts +2 -0
  46. package/dist/runtime/service.js +127 -2
  47. package/dist/runtime/service.js.map +1 -1
  48. package/dist/store/sqlite/db.js +18 -1
  49. package/dist/store/sqlite/db.js.map +1 -1
  50. package/dist/store/sqlite/repositories/attribution-record-repo.js +12 -0
  51. package/dist/store/sqlite/repositories/attribution-record-repo.js.map +1 -1
  52. package/dist/store/sqlite/repositories/node-repo.d.ts +1 -0
  53. package/dist/store/sqlite/repositories/node-repo.js +47 -2
  54. package/dist/store/sqlite/repositories/node-repo.js.map +1 -1
  55. package/dist/store/sqlite/repositories/scope-fingerprint-repo.d.ts +8 -0
  56. package/dist/store/sqlite/repositories/scope-fingerprint-repo.js +23 -0
  57. package/dist/store/sqlite/repositories/scope-fingerprint-repo.js.map +1 -0
  58. package/dist/store/sqlite/schema.sql +26 -0
  59. package/dist/store/vector/embeddings.d.ts +4 -2
  60. package/dist/store/vector/embeddings.js +19 -6
  61. package/dist/store/vector/embeddings.js.map +1 -1
  62. package/dist/store/vector/local-provider.d.ts +1 -1
  63. package/dist/store/vector/local-provider.js +40 -8
  64. package/dist/store/vector/local-provider.js.map +1 -1
  65. package/dist/store/vector/offline-manifest.d.ts +7 -0
  66. package/dist/store/vector/offline-manifest.js +162 -0
  67. package/dist/store/vector/offline-manifest.js.map +1 -0
  68. package/dist/store/vector/provider-types.d.ts +1 -0
  69. package/dist/types/domain.d.ts +111 -1
  70. package/dist/types/plugin.d.ts +1 -0
  71. package/docs/releases/v0.4.0.md +39 -0
  72. package/docs/user-guide.md +41 -0
  73. package/openclaw.plugin.json +1 -1
  74. package/package.json +1 -1
@@ -0,0 +1,620 @@
1
+ import { readdirSync, statSync, existsSync, readFileSync } from "node:fs";
2
+ import { join, basename, resolve, dirname, relative } from "node:path";
3
+ import { hashText } from "../utils/hashing.js";
4
+ import { stableId } from "../utils/ids.js";
5
+ import { nowIso } from "../utils/clock.js";
6
+ import { ScopeFingerprintRepository } from "../store/sqlite/repositories/scope-fingerprint-repo.js";
7
+ import { normalizeScopeIdentityPath } from "./scope-resolver.js";
8
+ const FRAMEWORKS = [
9
+ "react", "vue", "svelte", "solid-js", "express", "koa", "fastify",
10
+ "@nestjs/core", "nest", "next", "nuxt", "astro", "@angular/core", "angular"
11
+ ];
12
+ const DATABASE_OR_ORM = [
13
+ "prisma", "typeorm", "sequelize", "mongoose", "knex", "drizzle-orm",
14
+ "mikro-orm", "pg", "mysql2", "sqlite3", "better-sqlite3"
15
+ ];
16
+ const TEST_BUILD_TOOLS = [
17
+ "vitest", "jest", "mocha", "cypress", "playwright", "vite", "webpack",
18
+ "rollup", "esbuild", "tsup", "gulp", "babel-core", "@babel/core"
19
+ ];
20
+ const HOST_RUNTIME_ADAPTERS = [
21
+ "openai", "@google/genai", "@anthropic-ai/sdk", "langchain", "experienceengine"
22
+ ];
23
+ const escapeRegExp = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
24
+ /**
25
+ * Recursively scan file extensions under a directory to detect the primary language
26
+ */
27
+ const scanFileExtensions = (dir, depth = 0, maxFiles = 100, state = { count: 0, extCounts: {} }) => {
28
+ if (depth > 2 || state.count >= maxFiles)
29
+ return;
30
+ try {
31
+ const files = readdirSync(dir);
32
+ for (const file of files) {
33
+ if (state.count >= maxFiles)
34
+ break;
35
+ const fullPath = join(dir, file);
36
+ // Filter out heavy directories or build outputs
37
+ if (file === "node_modules" ||
38
+ file === ".git" ||
39
+ file === "dist" ||
40
+ file === "out" ||
41
+ file === "build" ||
42
+ file === ".tmp" ||
43
+ file === "artifacts") {
44
+ continue;
45
+ }
46
+ try {
47
+ const stat = statSync(fullPath);
48
+ if (stat.isDirectory()) {
49
+ scanFileExtensions(fullPath, depth + 1, maxFiles, state);
50
+ }
51
+ else if (stat.isFile()) {
52
+ state.count++;
53
+ const ext = file.split(".").pop()?.toLowerCase();
54
+ if (ext) {
55
+ state.extCounts[ext] = (state.extCounts[ext] || 0) + 1;
56
+ }
57
+ }
58
+ }
59
+ catch {
60
+ // Ignore stats failure
61
+ }
62
+ }
63
+ }
64
+ catch {
65
+ // Ignore readdir failure
66
+ }
67
+ };
68
+ /**
69
+ * Detect the primary development language of the project
70
+ */
71
+ export const detectPrimaryLanguage = (projectRoot) => {
72
+ if (existsSync(join(projectRoot, "tsconfig.json"))) {
73
+ return "typescript";
74
+ }
75
+ const state = { count: 0, extCounts: {} };
76
+ scanFileExtensions(projectRoot, 0, 100, state);
77
+ const extToLang = {
78
+ ts: "typescript",
79
+ tsx: "typescript",
80
+ js: "javascript",
81
+ jsx: "javascript",
82
+ mjs: "javascript",
83
+ cjs: "javascript",
84
+ py: "python",
85
+ go: "go",
86
+ rs: "rust",
87
+ java: "java",
88
+ cpp: "cpp",
89
+ c: "c",
90
+ cs: "csharp",
91
+ rb: "ruby",
92
+ php: "php"
93
+ };
94
+ let maxExt = "";
95
+ let maxCount = 0;
96
+ for (const [ext, count] of Object.entries(state.extCounts)) {
97
+ if (count > maxCount && extToLang[ext]) {
98
+ maxCount = count;
99
+ maxExt = ext;
100
+ }
101
+ }
102
+ if (maxExt) {
103
+ return extToLang[maxExt];
104
+ }
105
+ // Fallback to package.json dependencies if scanning yielded no language match
106
+ try {
107
+ const pkgPath = join(projectRoot, "package.json");
108
+ if (existsSync(pkgPath)) {
109
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
110
+ if (pkg.dependencies?.typescript || pkg.devDependencies?.typescript) {
111
+ return "typescript";
112
+ }
113
+ return "javascript";
114
+ }
115
+ }
116
+ catch { }
117
+ return "unknown";
118
+ };
119
+ /**
120
+ * Heuristically detect Monorepo, Workspace/Project roots, and Project Scope ID
121
+ */
122
+ export const detectWorkspaceAndProjectRoots = (cwd) => {
123
+ const projectRoot = resolve(cwd);
124
+ let workspaceRoot = projectRoot;
125
+ let current = projectRoot;
126
+ let foundWorkspace = false;
127
+ // Traverse upwards up to 5 levels to locate Monorepo roots
128
+ for (let i = 0; i < 5; i++) {
129
+ const hasPnpmWorkspace = existsSync(join(current, "pnpm-workspace.yaml"));
130
+ const hasLerna = existsSync(join(current, "lerna.json"));
131
+ let hasWorkspacesInPkg = false;
132
+ try {
133
+ const pkgPath = join(current, "package.json");
134
+ if (existsSync(pkgPath)) {
135
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
136
+ if (pkg.workspaces) {
137
+ hasWorkspacesInPkg = true;
138
+ }
139
+ }
140
+ }
141
+ catch { }
142
+ if (hasPnpmWorkspace || hasLerna || hasWorkspacesInPkg) {
143
+ workspaceRoot = current;
144
+ foundWorkspace = true;
145
+ break;
146
+ }
147
+ const parent = dirname(current);
148
+ if (parent === current) {
149
+ break;
150
+ }
151
+ current = parent;
152
+ }
153
+ let packageManager = "unknown";
154
+ let lockfileFamily = "unknown";
155
+ // Check for physical existence of lockfiles (project root prioritized over workspace root)
156
+ const checkDirs = foundWorkspace ? [projectRoot, workspaceRoot] : [projectRoot];
157
+ for (const dir of checkDirs) {
158
+ if (existsSync(join(dir, "pnpm-lock.yaml"))) {
159
+ packageManager = "pnpm";
160
+ lockfileFamily = "pnpm";
161
+ break;
162
+ }
163
+ else if (existsSync(join(dir, "package-lock.json"))) {
164
+ packageManager = "npm";
165
+ lockfileFamily = "npm";
166
+ break;
167
+ }
168
+ else if (existsSync(join(dir, "yarn.lock"))) {
169
+ packageManager = "yarn";
170
+ lockfileFamily = "yarn";
171
+ break;
172
+ }
173
+ }
174
+ if (lockfileFamily === "unknown") {
175
+ try {
176
+ const pkgPath = join(projectRoot, "package.json");
177
+ if (existsSync(pkgPath)) {
178
+ lockfileFamily = "none";
179
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
180
+ if (pkg.packageManager) {
181
+ const pm = pkg.packageManager.split("@")[0];
182
+ packageManager = pm;
183
+ }
184
+ else {
185
+ packageManager = "npm";
186
+ }
187
+ }
188
+ }
189
+ catch { }
190
+ }
191
+ const identityPath = normalizeScopeIdentityPath(projectRoot);
192
+ const projectRootScopeId = stableId("scope", identityPath);
193
+ return {
194
+ workspaceRoot,
195
+ projectRoot,
196
+ projectRootScopeId,
197
+ packageManager,
198
+ lockfileFamily
199
+ };
200
+ };
201
+ /**
202
+ * Robustly parse dependency major versions from package-lock.json
203
+ */
204
+ export const parsePackageLock = (contentStr, packagesToFind, relativeProjectDir = ".", localDeps = {}) => {
205
+ const result = {};
206
+ try {
207
+ const lock = JSON.parse(contentStr);
208
+ if (lock.packages) {
209
+ for (const pkg of packagesToFind) {
210
+ const normalizedRelativeDir = relativeProjectDir === "." ? "" : relativeProjectDir.replace(/^\.?\/+/, "");
211
+ // If we are in a workspace subproject, try searching under packages/subproject/node_modules/pkg first
212
+ if (normalizedRelativeDir) {
213
+ const subprojectKey = `${normalizedRelativeDir}/node_modules/${pkg}`;
214
+ if (lock.packages[subprojectKey]?.version) {
215
+ result[pkg] = lock.packages[subprojectKey].version;
216
+ continue;
217
+ }
218
+ }
219
+ // Otherwise fall back to root node_modules/pkg
220
+ const rootKey = `node_modules/${pkg}`;
221
+ if (lock.packages[rootKey]?.version) {
222
+ result[pkg] = lock.packages[rootKey].version;
223
+ continue;
224
+ }
225
+ // Fallback loops
226
+ let found = false;
227
+ if (normalizedRelativeDir) {
228
+ for (const k of Object.keys(lock.packages)) {
229
+ if (k.startsWith(normalizedRelativeDir) && k.endsWith(`/node_modules/${pkg}`)) {
230
+ result[pkg] = lock.packages[k].version;
231
+ found = true;
232
+ break;
233
+ }
234
+ }
235
+ }
236
+ if (found)
237
+ continue;
238
+ for (const k of Object.keys(lock.packages)) {
239
+ if (k === rootKey || k.endsWith(`/node_modules/${pkg}`)) {
240
+ result[pkg] = lock.packages[k].version;
241
+ found = true;
242
+ break;
243
+ }
244
+ }
245
+ }
246
+ }
247
+ if (lock.dependencies) {
248
+ for (const pkg of packagesToFind) {
249
+ if (!result[pkg] && lock.dependencies[pkg]?.version) {
250
+ result[pkg] = lock.dependencies[pkg].version;
251
+ }
252
+ }
253
+ }
254
+ }
255
+ catch {
256
+ // Ignore error
257
+ }
258
+ return result;
259
+ };
260
+ /**
261
+ * Robustly parse dependency versions from pnpm-lock.yaml via line scans
262
+ */
263
+ export const parsePnpmLock = (contentStr, packagesToFind, relativeProjectDir = ".", localDeps = {}) => {
264
+ const result = {};
265
+ const lines = contentStr.split(/\r?\n/);
266
+ // 1. First scan the importers block for this specific subproject relative directory if it exists
267
+ let importerLines = [];
268
+ let inImporterSection = false;
269
+ let inTargetImporter = false;
270
+ const relativePathKey = relativeProjectDir === "." ? "." : relativeProjectDir;
271
+ for (const line of lines) {
272
+ const trimLine = line.trim();
273
+ if (!trimLine)
274
+ continue;
275
+ const indent = line.length - line.trimStart().length;
276
+ if (trimLine === "importers:") {
277
+ inImporterSection = true;
278
+ continue;
279
+ }
280
+ if (inImporterSection) {
281
+ if (indent === 2 && (trimLine === `${relativePathKey}:` || trimLine === `'${relativePathKey}':` || trimLine === `"${relativePathKey}":`)) {
282
+ inTargetImporter = true;
283
+ continue;
284
+ }
285
+ else if (indent <= 2 && inTargetImporter) {
286
+ inTargetImporter = false;
287
+ }
288
+ else if (indent === 0) {
289
+ inImporterSection = false;
290
+ inTargetImporter = false;
291
+ }
292
+ if (inTargetImporter) {
293
+ importerLines.push(line);
294
+ }
295
+ }
296
+ }
297
+ if (importerLines.length > 0) {
298
+ for (const pkg of packagesToFind) {
299
+ const escapedPkg = escapeRegExp(pkg);
300
+ const pkgPattern = new RegExp(`^\\s*` + escapedPkg + `:\\s*(.*)$`);
301
+ const versionPattern = /^\s*version:\s*['"]?([0-9]+\.[0-9]+\.[0-9]+[^'"\\s_:]*)/;
302
+ for (let i = 0; i < importerLines.length; i++) {
303
+ const match = pkgPattern.exec(importerLines[i]);
304
+ if (match) {
305
+ const rest = match[1].trim();
306
+ if (rest) {
307
+ const pureVer = rest.split(/[_\(\)]/)[0].replace(/['"]/g, "");
308
+ if (/^[0-9]+\.[0-9]+\.[0-9]+/.test(pureVer)) {
309
+ result[pkg] = pureVer;
310
+ break;
311
+ }
312
+ }
313
+ else {
314
+ for (let j = i + 1; j < Math.min(importerLines.length, i + 5); j++) {
315
+ const vMatch = versionPattern.exec(importerLines[j]);
316
+ if (vMatch && vMatch[1]) {
317
+ result[pkg] = vMatch[1];
318
+ break;
319
+ }
320
+ }
321
+ }
322
+ }
323
+ if (result[pkg])
324
+ break;
325
+ }
326
+ }
327
+ }
328
+ // 2. Global fallback/matching, but prioritizing version matching expectedMajor
329
+ for (const pkg of packagesToFind) {
330
+ if (result[pkg])
331
+ continue;
332
+ const localRange = localDeps[pkg];
333
+ const expectedMajor = localRange ? extractMajorFromRange(localRange) : null;
334
+ const escapedPkg = escapeRegExp(pkg);
335
+ const patterns = [
336
+ new RegExp(`(?:\\/|'|")` + escapedPkg + `@([0-9]+\\.[0-9]+\\.[0-9]+[^'"\\s_:]*)`),
337
+ new RegExp(`\\/` + escapedPkg + `\\/([0-9]+\\.[0-9]+\\.[0-9]+[^'"\\s_:]*)`),
338
+ new RegExp(`^\\s*` + escapedPkg + `:\\s*['"]?([0-9]+\\.[0-9]+\\.[0-9]+[^'"\\s_:]*)`)
339
+ ];
340
+ let bestMatch = null;
341
+ let firstMatch = null;
342
+ for (const line of lines) {
343
+ for (const pattern of patterns) {
344
+ const match = pattern.exec(line);
345
+ if (match && match[1]) {
346
+ const ver = match[1];
347
+ const pureVer = ver.split(/[_\(\)]/)[0];
348
+ if (/^[0-9]+\.[0-9]+\.[0-9]+/.test(pureVer)) {
349
+ if (!firstMatch) {
350
+ firstMatch = pureVer;
351
+ }
352
+ if (expectedMajor !== null) {
353
+ const major = parseInt(pureVer.split(".")[0], 10);
354
+ if (major === expectedMajor) {
355
+ bestMatch = pureVer;
356
+ break;
357
+ }
358
+ }
359
+ }
360
+ }
361
+ }
362
+ if (bestMatch)
363
+ break;
364
+ }
365
+ const finalVer = bestMatch || firstMatch;
366
+ if (finalVer) {
367
+ result[pkg] = finalVer;
368
+ }
369
+ }
370
+ return result;
371
+ };
372
+ /**
373
+ * Robustly parse dependency versions from yarn.lock via line scans
374
+ */
375
+ export const parseYarnLock = (contentStr, packagesToFind, relativeProjectDir = ".", localDeps = {}) => {
376
+ const result = {};
377
+ const lines = contentStr.split(/\r?\n/);
378
+ for (const pkg of packagesToFind) {
379
+ const localRange = localDeps[pkg];
380
+ const escapedPkg = escapeRegExp(pkg);
381
+ let headerPattern = new RegExp(`^"?` + escapedPkg + `@`);
382
+ if (localRange) {
383
+ const escapedRange = escapeRegExp(localRange);
384
+ headerPattern = new RegExp(`^"?` + escapedPkg + `@(npm:)?` + escapedRange + `[,":]`);
385
+ }
386
+ const versionPattern = /^\s*version:?\s*['"]?([0-9]+\.[0-9]+\.[0-9]+[^'"\s]*)/;
387
+ let found = false;
388
+ for (let i = 0; i < lines.length; i++) {
389
+ if (headerPattern.test(lines[i])) {
390
+ for (let j = i + 1; j < Math.min(lines.length, i + 10); j++) {
391
+ const match = versionPattern.exec(lines[j]);
392
+ if (match && match[1]) {
393
+ result[pkg] = match[1];
394
+ found = true;
395
+ break;
396
+ }
397
+ }
398
+ }
399
+ if (found)
400
+ break;
401
+ }
402
+ if (!found) {
403
+ const generalHeaderPattern = new RegExp(`^"?` + escapedPkg + `@`);
404
+ for (let i = 0; i < lines.length; i++) {
405
+ if (generalHeaderPattern.test(lines[i])) {
406
+ for (let j = i + 1; j < Math.min(lines.length, i + 10); j++) {
407
+ const match = versionPattern.exec(lines[j]);
408
+ if (match && match[1]) {
409
+ result[pkg] = match[1];
410
+ found = true;
411
+ break;
412
+ }
413
+ }
414
+ }
415
+ if (found)
416
+ break;
417
+ }
418
+ }
419
+ }
420
+ return result;
421
+ };
422
+ /**
423
+ * Extract the major version from a SemVer range string heuristically
424
+ */
425
+ export const extractMajorFromRange = (range) => {
426
+ const cleanRange = range.trim().replace(/^[\^~>=<*\s]+/, "");
427
+ const match = /^([0-9]+)/.exec(cleanRange);
428
+ if (match && match[1]) {
429
+ return parseInt(match[1], 10);
430
+ }
431
+ return 0;
432
+ };
433
+ /**
434
+ * Scan for common configuration markers in the project root and sort them
435
+ */
436
+ export const detectConfigMarkers = (projectRoot) => {
437
+ const possibleMarkers = [
438
+ "tsconfig.json",
439
+ "package.json",
440
+ "vite.config.ts",
441
+ "vite.config.js",
442
+ "webpack.config.js",
443
+ "next.config.js",
444
+ "next.config.mjs",
445
+ "nuxt.config.ts",
446
+ "nuxt.config.js",
447
+ "tailwind.config.js",
448
+ "tailwind.config.ts",
449
+ "postcss.config.js",
450
+ "eslint.config.js",
451
+ ".eslintrc.js",
452
+ ".eslintrc.json",
453
+ "prettier.config.js",
454
+ ".prettierrc",
455
+ "svelte.config.js",
456
+ "astro.config.mjs"
457
+ ];
458
+ const foundMarkers = [];
459
+ for (const marker of possibleMarkers) {
460
+ if (existsSync(join(projectRoot, marker))) {
461
+ foundMarkers.push(marker);
462
+ }
463
+ }
464
+ return foundMarkers.sort();
465
+ };
466
+ /**
467
+ * Deterministically serialize any object or array (stable JSON)
468
+ */
469
+ export const stableStringify = (obj) => {
470
+ if (obj === null)
471
+ return "null";
472
+ if (typeof obj !== "object") {
473
+ return JSON.stringify(obj);
474
+ }
475
+ if (Array.isArray(obj)) {
476
+ return "[" + obj.map(stableStringify).join(",") + "]";
477
+ }
478
+ const keys = Object.keys(obj).sort();
479
+ const pairs = keys.map(k => `${JSON.stringify(k)}:${stableStringify(obj[k])}`);
480
+ return "{" + pairs.join(",") + "}";
481
+ };
482
+ /**
483
+ * Compute a 16-character deterministic SHA-256 hash excluding timestamp and fingerprintHash
484
+ */
485
+ export const calculateFingerprintHash = (fingerprint) => {
486
+ const { schemaVersion, primaryLanguage, packageManager, lockfileFamily, frameworks, databaseOrORM, testBuildTools, hostRuntimeAdapters, configMarkers } = fingerprint;
487
+ const portableObj = {
488
+ schemaVersion,
489
+ primaryLanguage,
490
+ packageManager,
491
+ lockfileFamily,
492
+ frameworks,
493
+ databaseOrORM,
494
+ testBuildTools,
495
+ hostRuntimeAdapters,
496
+ configMarkers
497
+ };
498
+ const stableJson = stableStringify(portableObj);
499
+ const fullHash = hashText(stableJson);
500
+ return fullHash.slice(0, 16);
501
+ };
502
+ /**
503
+ * Main entry point for extracting the project compatibility fingerprint
504
+ */
505
+ export const extractProjectFingerprint = (cwd) => {
506
+ const info = detectWorkspaceAndProjectRoots(cwd);
507
+ // 1. Load dependencies from project-level package.json
508
+ const localPkgPath = join(info.projectRoot, "package.json");
509
+ const localDeps = {};
510
+ if (existsSync(localPkgPath)) {
511
+ try {
512
+ const pkg = JSON.parse(readFileSync(localPkgPath, "utf-8"));
513
+ Object.assign(localDeps, pkg.dependencies || {}, pkg.devDependencies || {});
514
+ }
515
+ catch {
516
+ // Graceful tolerance fallback
517
+ }
518
+ }
519
+ const allScanningDeps = Array.from(new Set([...FRAMEWORKS, ...DATABASE_OR_ORM, ...TEST_BUILD_TOOLS, ...HOST_RUNTIME_ADAPTERS]));
520
+ // 2. Search for lockfiles from projectRoot up to workspaceRoot and parse their versions
521
+ let lockfileContent = "";
522
+ let lockfileResolved = {};
523
+ const lockfilePaths = [
524
+ join(info.projectRoot, "pnpm-lock.yaml"),
525
+ join(info.projectRoot, "package-lock.json"),
526
+ join(info.projectRoot, "yarn.lock"),
527
+ join(info.workspaceRoot, "pnpm-lock.yaml"),
528
+ join(info.workspaceRoot, "package-lock.json"),
529
+ join(info.workspaceRoot, "yarn.lock")
530
+ ];
531
+ let loadedPath = "";
532
+ for (const p of lockfilePaths) {
533
+ if (existsSync(p)) {
534
+ try {
535
+ lockfileContent = readFileSync(p, "utf-8");
536
+ loadedPath = p;
537
+ break;
538
+ }
539
+ catch {
540
+ // Ignore
541
+ }
542
+ }
543
+ }
544
+ const relativeProjectDir = info.workspaceRoot !== info.projectRoot
545
+ ? relative(info.workspaceRoot, info.projectRoot).replace(/\\/g, "/")
546
+ : ".";
547
+ if (lockfileContent) {
548
+ const filename = basename(loadedPath);
549
+ if (filename === "pnpm-lock.yaml") {
550
+ lockfileResolved = parsePnpmLock(lockfileContent, allScanningDeps, relativeProjectDir, localDeps);
551
+ }
552
+ else if (filename === "package-lock.json") {
553
+ lockfileResolved = parsePackageLock(lockfileContent, allScanningDeps, relativeProjectDir, localDeps);
554
+ }
555
+ else if (filename === "yarn.lock") {
556
+ lockfileResolved = parseYarnLock(lockfileContent, allScanningDeps, relativeProjectDir, localDeps);
557
+ }
558
+ }
559
+ // 3. Extract major versions combining package.json declarations and lockfile versions
560
+ const getCategoryMap = (pkgList) => {
561
+ const map = {};
562
+ for (const pkg of pkgList) {
563
+ if (localDeps[pkg] !== undefined) {
564
+ if (lockfileResolved[pkg]) {
565
+ const major = parseInt(lockfileResolved[pkg].split(".")[0], 10);
566
+ map[pkg] = isNaN(major) ? 0 : major;
567
+ }
568
+ else {
569
+ map[pkg] = extractMajorFromRange(localDeps[pkg]);
570
+ }
571
+ }
572
+ }
573
+ return map;
574
+ };
575
+ const frameworks = getCategoryMap(FRAMEWORKS);
576
+ const databaseOrORM = getCategoryMap(DATABASE_OR_ORM);
577
+ const testBuildTools = getCategoryMap(TEST_BUILD_TOOLS);
578
+ const hostRuntimeAdapters = getCategoryMap(HOST_RUNTIME_ADAPTERS);
579
+ const primaryLanguage = detectPrimaryLanguage(info.projectRoot);
580
+ const configMarkers = detectConfigMarkers(info.projectRoot);
581
+ const partialFingerprint = {
582
+ schemaVersion: "1",
583
+ primaryLanguage,
584
+ packageManager: info.packageManager,
585
+ lockfileFamily: info.lockfileFamily,
586
+ frameworks,
587
+ databaseOrORM,
588
+ testBuildTools,
589
+ hostRuntimeAdapters,
590
+ configMarkers,
591
+ workspaceRootPath: info.workspaceRoot !== info.projectRoot ? normalizeScopeIdentityPath(info.workspaceRoot) : undefined,
592
+ projectRootScopeId: info.projectRootScopeId
593
+ };
594
+ const fingerprintHash = calculateFingerprintHash(partialFingerprint);
595
+ return {
596
+ ...partialFingerprint,
597
+ fingerprintHash,
598
+ timestamp: Date.now()
599
+ };
600
+ };
601
+ /**
602
+ * Extract project fingerprint and atomically UPSERT into the SQLite database
603
+ */
604
+ export const persistProjectFingerprint = (db, cwd) => {
605
+ const fp = extractProjectFingerprint(cwd);
606
+ const now = nowIso();
607
+ const repo = new ScopeFingerprintRepository(db);
608
+ const existing = repo.getById(fp.projectRootScopeId);
609
+ const scopeFingerprint = {
610
+ scope_id: fp.projectRootScopeId,
611
+ schema_version: fp.schemaVersion,
612
+ fingerprint_hash: fp.fingerprintHash,
613
+ fingerprint_json: JSON.stringify(fp),
614
+ created_at: existing?.created_at ?? now,
615
+ updated_at: now
616
+ };
617
+ repo.upsert(scopeFingerprint);
618
+ return scopeFingerprint;
619
+ };
620
+ //# sourceMappingURL=fingerprint-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint-extractor.js","sourceRoot":"","sources":["../../src/input/fingerprint-extractor.ts"],"names":[],"mappings":"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"}