git-archaeologist 1.3.0 → 1.3.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curseScorer.d.ts","sourceRoot":"","sources":["../../src/analyzers/curseScorer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"curseScorer.d.ts","sourceRoot":"","sources":["../../src/analyzers/curseScorer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA4DjD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACpC,IAAI,GAAE,MAAW,GAChB,UAAU,EAAE,CAyCd"}
|
|
@@ -37,17 +37,34 @@ function isNoise(filepath) {
|
|
|
37
37
|
const filename = filepath.split('/').pop() ?? filepath;
|
|
38
38
|
return NOISE_PATTERNS.some((p) => p.test(filename) || p.test(filepath));
|
|
39
39
|
}
|
|
40
|
+
function accelerationScore(timeline) {
|
|
41
|
+
if (timeline.length < 4)
|
|
42
|
+
return 1.0;
|
|
43
|
+
const sorted = [...timeline].sort((a, b) => a - b);
|
|
44
|
+
const now = Date.now() / 1000;
|
|
45
|
+
const oneYearAgo = now - ONE_YEAR_SECS;
|
|
46
|
+
const sixMonthsAgo = now - (ONE_YEAR_SECS / 2);
|
|
47
|
+
const recentChanges = sorted.filter((t) => t >= sixMonthsAgo).length;
|
|
48
|
+
const olderChanges = sorted.filter((t) => t >= oneYearAgo && t < sixMonthsAgo).length;
|
|
49
|
+
if (olderChanges === 0)
|
|
50
|
+
return recentChanges > 0 ? 1.5 : 1.0;
|
|
51
|
+
const ratio = recentChanges / olderChanges;
|
|
52
|
+
// ratio > 1 means accelerating, < 1 means slowing down
|
|
53
|
+
// cap between 0.5 and 2.0 so it doesn't dominate the score
|
|
54
|
+
return Math.min(2.0, Math.max(0.5, ratio));
|
|
55
|
+
}
|
|
40
56
|
function scoreCursedFiles(fileStatsMap, topN = 20) {
|
|
41
57
|
const results = [];
|
|
42
58
|
for (const [, stats] of fileStatsMap) {
|
|
43
59
|
const authorCount = stats.uniqueAuthors.size;
|
|
44
60
|
const recency = recencyWeight(stats.lastChanged);
|
|
45
61
|
const churn = churnRate(stats.changeTimeline);
|
|
62
|
+
const acceleration = accelerationScore(stats.changeTimeline);
|
|
46
63
|
// Curse score formula:
|
|
47
64
|
// Base = total changes × author count
|
|
48
|
-
// Multiplied by recency
|
|
49
|
-
//
|
|
50
|
-
const curseScore = Math.round(stats.totalChanges * Math.log2(authorCount + 1) * recency * Math.log2(churn + 2) * 100) / 100;
|
|
65
|
+
// Multiplied by recency, churn rate, and acceleration
|
|
66
|
+
// Acceleration > 1 means the file is getting MORE changes recently — more dangerous
|
|
67
|
+
const curseScore = Math.round(stats.totalChanges * Math.log2(authorCount + 1) * recency * Math.log2(churn + 2) * acceleration * 100) / 100;
|
|
51
68
|
const reasons = [];
|
|
52
69
|
if (stats.totalChanges > 50)
|
|
53
70
|
reasons.push(`Changed ${stats.totalChanges} times`);
|
|
@@ -57,6 +74,8 @@ function scoreCursedFiles(fileStatsMap, topN = 20) {
|
|
|
57
74
|
reasons.push(`High churn rate (${Math.round(churn)}x/year)`);
|
|
58
75
|
if (recency > 0.8)
|
|
59
76
|
reasons.push('Modified very recently');
|
|
77
|
+
if (acceleration > 1.3)
|
|
78
|
+
reasons.push(`Change rate accelerating (${acceleration.toFixed(1)}x recent vs prior period)`);
|
|
60
79
|
const noisy = isNoise(stats.filepath);
|
|
61
80
|
results.push({
|
|
62
81
|
filepath: stats.filepath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curseScorer.js","sourceRoot":"","sources":["../../src/analyzers/curseScorer.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"curseScorer.js","sourceRoot":"","sources":["../../src/analyzers/curseScorer.ts"],"names":[],"mappings":"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"}
|