git-archaeologist 1.2.2 → 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"}
|
|
@@ -17,17 +17,54 @@ function churnRate(timeline) {
|
|
|
17
17
|
return timeline.length;
|
|
18
18
|
return timeline.length / spanYears;
|
|
19
19
|
}
|
|
20
|
+
// Files that are structurally noisy — they change with every release
|
|
21
|
+
// and dominate curse scores without being genuinely dangerous code
|
|
22
|
+
const NOISE_PATTERNS = [
|
|
23
|
+
/^package\.json$/,
|
|
24
|
+
/^package-lock\.json$/,
|
|
25
|
+
/^yarn\.lock$/,
|
|
26
|
+
/^pnpm-lock\.yaml$/,
|
|
27
|
+
/^CHANGELOG(\.md)?$/i,
|
|
28
|
+
/^History(\.md)?$/i,
|
|
29
|
+
/^HISTORY(\.md)?$/i,
|
|
30
|
+
/^\.travis\.yml$/,
|
|
31
|
+
/^appveyor\.yml$/,
|
|
32
|
+
/^Readme(\.md)?$/i,
|
|
33
|
+
/^README(\.md)?$/i,
|
|
34
|
+
/^\.github\/workflows\//,
|
|
35
|
+
];
|
|
36
|
+
function isNoise(filepath) {
|
|
37
|
+
const filename = filepath.split('/').pop() ?? filepath;
|
|
38
|
+
return NOISE_PATTERNS.some((p) => p.test(filename) || p.test(filepath));
|
|
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
|
+
}
|
|
20
56
|
function scoreCursedFiles(fileStatsMap, topN = 20) {
|
|
21
57
|
const results = [];
|
|
22
58
|
for (const [, stats] of fileStatsMap) {
|
|
23
59
|
const authorCount = stats.uniqueAuthors.size;
|
|
24
60
|
const recency = recencyWeight(stats.lastChanged);
|
|
25
61
|
const churn = churnRate(stats.changeTimeline);
|
|
62
|
+
const acceleration = accelerationScore(stats.changeTimeline);
|
|
26
63
|
// Curse score formula:
|
|
27
64
|
// Base = total changes × author count
|
|
28
|
-
// Multiplied by recency
|
|
29
|
-
//
|
|
30
|
-
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;
|
|
31
68
|
const reasons = [];
|
|
32
69
|
if (stats.totalChanges > 50)
|
|
33
70
|
reasons.push(`Changed ${stats.totalChanges} times`);
|
|
@@ -37,16 +74,21 @@ function scoreCursedFiles(fileStatsMap, topN = 20) {
|
|
|
37
74
|
reasons.push(`High churn rate (${Math.round(churn)}x/year)`);
|
|
38
75
|
if (recency > 0.8)
|
|
39
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)`);
|
|
79
|
+
const noisy = isNoise(stats.filepath);
|
|
40
80
|
results.push({
|
|
41
81
|
filepath: stats.filepath,
|
|
42
|
-
curseScore,
|
|
82
|
+
curseScore: noisy ? 0 : curseScore,
|
|
43
83
|
totalChanges: stats.totalChanges,
|
|
44
84
|
uniqueAuthors: authorCount,
|
|
45
85
|
recencyWeight: Math.round(recency * 100) / 100,
|
|
46
|
-
reasons: reasons.length > 0 ? reasons : ['Mild instability'],
|
|
86
|
+
reasons: noisy ? ['Excluded — structural noise (changelog/lockfile)'] : (reasons.length > 0 ? reasons : ['Mild instability']),
|
|
87
|
+
noisy,
|
|
47
88
|
});
|
|
48
89
|
}
|
|
49
90
|
return results
|
|
91
|
+
.filter((f) => !f.noisy)
|
|
50
92
|
.sort((a, b) => b.curseScore - a.curseScore)
|
|
51
93
|
.slice(0, topN);
|
|
52
94
|
}
|
|
@@ -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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"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC;IACpC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACnC"}
|