git-slot-machine 2.1.6 → 2.2.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.
- package/CHANGELOG.md +25 -0
- package/dist/commands/play.d.ts.map +1 -1
- package/dist/commands/play.js +11 -0
- package/dist/commands/play.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/patterns.d.ts +3 -1
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +27 -14
- package/dist/patterns.js.map +1 -1
- package/dist/utils/amendDetector.d.ts +17 -0
- package/dist/utils/amendDetector.d.ts.map +1 -0
- package/dist/utils/amendDetector.js +58 -0
- package/dist/utils/amendDetector.js.map +1 -0
- package/package.json +1 -1
- package/src/commands/play.ts +13 -0
- package/src/index.ts +1 -1
- package/src/patterns.ts +28 -15
- package/src/utils/amendDetector.ts +74 -0
- package/.claude/settings.local.json +0 -16
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,31 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.2.0] - 2025-10-23
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Hash grinding detection** - Detects and flags suspicious commit amending behavior
|
|
12
|
+
- Checks git reflog for commit amend patterns
|
|
13
|
+
- Flags commits with 5+ amends in a 5-minute window
|
|
14
|
+
- Sends suspicious activity flag and amend count to API
|
|
15
|
+
- Displays warning to users when suspicious activity is detected
|
|
16
|
+
- **API: Suspicious activity tracking** - Tracks hash grinding attempts
|
|
17
|
+
- New `suspicious` and `amend_count` columns in plays table
|
|
18
|
+
- Stores and tracks flagged commits for review
|
|
19
|
+
- **Artisan command: `play:remove`** - Safely remove plays and recalculate stats
|
|
20
|
+
- Removes specific plays by commit hash and username
|
|
21
|
+
- Recalculates all repository and user statistics
|
|
22
|
+
- Uses database transactions for safety
|
|
23
|
+
- **Artisan command: `plays:suspicious`** - View flagged commits
|
|
24
|
+
- Lists all plays flagged for hash grinding
|
|
25
|
+
- Shows statistics and top offenders
|
|
26
|
+
- Filter by user with `--user` option
|
|
27
|
+
- Limit results with `--limit` option
|
|
28
|
+
|
|
29
|
+
### Security
|
|
30
|
+
- Prevents hash grinding exploitation by detecting and flagging suspicious amend patterns
|
|
31
|
+
- All admin functions are terminal-based (secure for public repositories)
|
|
32
|
+
|
|
8
33
|
## [2.1.6] - 2025-10-17
|
|
9
34
|
|
|
10
35
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../src/commands/play.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../src/commands/play.ts"],"names":[],"mappings":"AAQA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJnF"}
|
package/dist/commands/play.js
CHANGED
|
@@ -3,6 +3,7 @@ import { animateSlotMachine, animateSmallMode } from '../animation/slotMachine.j
|
|
|
3
3
|
import { getBalance, updateBalance, setBalance } from '../balance.js';
|
|
4
4
|
import { sendPlayToAPI } from '../api.js';
|
|
5
5
|
import { getRepoInfo, getGitHubUsername } from '../config.js';
|
|
6
|
+
import { detectAmendGrinding, getAmendWarningMessage } from '../utils/amendDetector.js';
|
|
6
7
|
import chalk from 'chalk';
|
|
7
8
|
export async function playCommand(hash, options) {
|
|
8
9
|
try {
|
|
@@ -61,6 +62,9 @@ export async function playCommand(hash, options) {
|
|
|
61
62
|
}
|
|
62
63
|
// Update balance locally
|
|
63
64
|
let newBalance = updateBalance(hash.toLowerCase(), result.payout);
|
|
65
|
+
// Detect potential hash grinding
|
|
66
|
+
const amendDetection = detectAmendGrinding();
|
|
67
|
+
const warningMessage = getAmendWarningMessage(amendDetection);
|
|
64
68
|
// Send to API and sync balance with server
|
|
65
69
|
let shareUrl;
|
|
66
70
|
if (repoInfo && githubUsername) {
|
|
@@ -76,6 +80,8 @@ export async function playCommand(hash, options) {
|
|
|
76
80
|
github_username: githubUsername,
|
|
77
81
|
repo_owner: repoInfo.owner,
|
|
78
82
|
repo_name: repoInfo.name,
|
|
83
|
+
suspicious: amendDetection.suspiciousActivity,
|
|
84
|
+
amend_count: amendDetection.recentAmendCount,
|
|
79
85
|
};
|
|
80
86
|
// Only send full hash if we have one (not in test mode)
|
|
81
87
|
if (options.fullHash && options.fullHash.length === 40) {
|
|
@@ -122,6 +128,11 @@ export async function playCommand(hash, options) {
|
|
|
122
128
|
const urlPadding = Math.floor((boxWidth - shareUrl.length) / 2);
|
|
123
129
|
console.log(' '.repeat(urlPadding) + chalk.green.underline(shareUrl));
|
|
124
130
|
}
|
|
131
|
+
// Show warning if suspicious activity detected
|
|
132
|
+
if (warningMessage && !options.small) {
|
|
133
|
+
console.log();
|
|
134
|
+
console.log(chalk.yellow(warningMessage));
|
|
135
|
+
}
|
|
125
136
|
}
|
|
126
137
|
catch (error) {
|
|
127
138
|
console.error(chalk.red(`Error: ${error.message}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"play.js","sourceRoot":"","sources":["../../src/commands/play.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"play.js","sourceRoot":"","sources":["../../src/commands/play.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ const program = new Command();
|
|
|
13
13
|
program
|
|
14
14
|
.name('git-slot-machine')
|
|
15
15
|
.description('Git commit hash slot machine')
|
|
16
|
-
.version('
|
|
16
|
+
.version('2.2.0', '-v, --version', 'Output the current version');
|
|
17
17
|
program
|
|
18
18
|
.command('play')
|
|
19
19
|
.description('Play the slot machine with a git hash')
|
package/dist/patterns.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare enum PatternType {
|
|
2
|
+
LUCKY_SEVENS = "LUCKY_SEVENS",// Secret: 7777777
|
|
2
3
|
ALL_SAME = "ALL_SAME",
|
|
3
4
|
SIX_OF_KIND = "SIX_OF_KIND",
|
|
4
5
|
STRAIGHT_7 = "STRAIGHT_7",
|
|
@@ -9,7 +10,8 @@ export declare enum PatternType {
|
|
|
9
10
|
ALL_LETTERS = "ALL_LETTERS",
|
|
10
11
|
STRAIGHT_5 = "STRAIGHT_5",
|
|
11
12
|
THREE_OF_KIND_PLUS_THREE = "THREE_OF_KIND_PLUS_THREE",// 3-3-1
|
|
12
|
-
|
|
13
|
+
FULLER_HOUSE = "FULLER_HOUSE",// 3-2-2
|
|
14
|
+
FULL_HOUSE = "FULL_HOUSE",// 3-2-1-1
|
|
13
15
|
THREE_PAIR = "THREE_PAIR",
|
|
14
16
|
THREE_OF_KIND = "THREE_OF_KIND",
|
|
15
17
|
TWO_PAIR = "TWO_PAIR",
|
package/dist/patterns.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,QAAQ,aAAa;IACrB,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,aAAa,kBAAkB,CAAE,MAAM;IACvC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,wBAAwB,6BAA6B,CAAE,QAAQ;IAC/D,UAAU,eAAe,CAAE,
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,YAAY,iBAAiB,CAAE,kBAAkB;IACjD,QAAQ,aAAa;IACrB,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,aAAa,kBAAkB,CAAE,MAAM;IACvC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,wBAAwB,6BAA6B,CAAE,QAAQ;IAC/D,YAAY,iBAAiB,CAAE,QAAQ;IACvC,UAAU,eAAe,CAAE,UAAU;IACrC,UAAU,eAAe;IACzB,aAAa,kBAAkB;IAC/B,QAAQ,aAAa;IACrB,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;IACrB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAqLD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAqGzD"}
|
package/dist/patterns.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export var PatternType;
|
|
2
2
|
(function (PatternType) {
|
|
3
|
+
PatternType["LUCKY_SEVENS"] = "LUCKY_SEVENS";
|
|
3
4
|
PatternType["ALL_SAME"] = "ALL_SAME";
|
|
4
5
|
PatternType["SIX_OF_KIND"] = "SIX_OF_KIND";
|
|
5
6
|
PatternType["STRAIGHT_7"] = "STRAIGHT_7";
|
|
@@ -10,6 +11,7 @@ export var PatternType;
|
|
|
10
11
|
PatternType["ALL_LETTERS"] = "ALL_LETTERS";
|
|
11
12
|
PatternType["STRAIGHT_5"] = "STRAIGHT_5";
|
|
12
13
|
PatternType["THREE_OF_KIND_PLUS_THREE"] = "THREE_OF_KIND_PLUS_THREE";
|
|
14
|
+
PatternType["FULLER_HOUSE"] = "FULLER_HOUSE";
|
|
13
15
|
PatternType["FULL_HOUSE"] = "FULL_HOUSE";
|
|
14
16
|
PatternType["THREE_PAIR"] = "THREE_PAIR";
|
|
15
17
|
PatternType["THREE_OF_KIND"] = "THREE_OF_KIND";
|
|
@@ -19,22 +21,24 @@ export var PatternType;
|
|
|
19
21
|
PatternType["NO_WIN"] = "NO_WIN";
|
|
20
22
|
})(PatternType || (PatternType = {}));
|
|
21
23
|
const PAYOUTS = {
|
|
24
|
+
[PatternType.LUCKY_SEVENS]: { name: 'LUCKY SEVENS', payout: 1000000, description: 'The ultimate jackpot: 7777777' },
|
|
22
25
|
[PatternType.ALL_SAME]: { name: 'JACKPOT', payout: 100000, description: 'All same character' },
|
|
23
|
-
[PatternType.STRAIGHT_7]: { name: 'LUCKY SEVEN', payout: 50000, description: 'Seven
|
|
24
|
-
[PatternType.STRAIGHT_6]: { name: 'BIG STRAIGHT', payout: 25000, description: 'Six
|
|
26
|
+
[PatternType.STRAIGHT_7]: { name: 'LUCKY SEVEN', payout: 50000, description: 'Seven sequential hex digits' },
|
|
27
|
+
[PatternType.STRAIGHT_6]: { name: 'BIG STRAIGHT', payout: 25000, description: 'Six sequential hex digits' },
|
|
25
28
|
[PatternType.SIX_OF_KIND]: { name: 'HEXTET', payout: 10000, description: 'Six of a kind' },
|
|
26
29
|
[PatternType.FULLEST_HOUSE]: { name: 'FULLEST HOUSE', payout: 5000, description: '4 + 3 of a kind' },
|
|
27
|
-
[PatternType.STRAIGHT_5]: { name: 'STRAIGHT', payout: 2500, description: 'Five
|
|
30
|
+
[PatternType.STRAIGHT_5]: { name: 'STRAIGHT', payout: 2500, description: 'Five sequential hex digits' },
|
|
28
31
|
[PatternType.FIVE_OF_KIND]: { name: 'FIVE OF A KIND', payout: 2000, description: 'Five of a kind' },
|
|
29
32
|
[PatternType.THREE_OF_KIND_PLUS_THREE]: { name: 'DOUBLE TRIPLE', payout: 1000, description: 'Two three of a kinds' },
|
|
30
|
-
[PatternType.THREE_PAIR]: { name: 'THREE PAIR', payout: 500, description: 'Three pairs' },
|
|
31
|
-
[PatternType.
|
|
33
|
+
[PatternType.THREE_PAIR]: { name: 'THREE PAIR', payout: 500, description: 'Three consecutive pairs' },
|
|
34
|
+
[PatternType.FULLER_HOUSE]: { name: 'FULLER HOUSE', payout: 400, description: '3 + 2 + 2 of a kind' },
|
|
35
|
+
[PatternType.FULL_HOUSE]: { name: 'FULL HOUSE', payout: 50, description: '3 + 2 of a kind' },
|
|
32
36
|
[PatternType.ALL_LETTERS]: { name: 'ALPHABET SOUP', payout: 250, description: 'Only letters (a-f)' },
|
|
33
37
|
[PatternType.FOUR_OF_KIND]: { name: 'FOUR OF A KIND', payout: 200, description: 'Four of a kind' },
|
|
34
|
-
[PatternType.THREE_OF_KIND]: { name: 'THREE OF A KIND', payout:
|
|
38
|
+
[PatternType.THREE_OF_KIND]: { name: 'THREE OF A KIND', payout: 25, description: 'Three of a kind' },
|
|
35
39
|
[PatternType.ALL_NUMBERS]: { name: 'ALL NUMBERS', payout: 50, description: 'Only numbers (0-9)' },
|
|
36
|
-
[PatternType.TWO_PAIR]: { name: 'TWO PAIR', payout: 25, description: 'Two pairs' },
|
|
37
|
-
[PatternType.ONE_PAIR]: { name: 'ONE PAIR', payout: 10, description: 'One pair' },
|
|
40
|
+
[PatternType.TWO_PAIR]: { name: 'TWO PAIR', payout: 25, description: 'Two consecutive pairs' },
|
|
41
|
+
[PatternType.ONE_PAIR]: { name: 'ONE PAIR', payout: 10, description: 'One consecutive pair' },
|
|
38
42
|
[PatternType.NO_WIN]: { name: 'NO WIN', payout: 0, description: 'No winning pattern' }
|
|
39
43
|
};
|
|
40
44
|
function countCharacters(hash) {
|
|
@@ -122,8 +126,9 @@ function getHighlightIndices(hash, type) {
|
|
|
122
126
|
}
|
|
123
127
|
}
|
|
124
128
|
}
|
|
125
|
-
// For all letters
|
|
126
|
-
if (type === PatternType.ALL_LETTERS || type === PatternType.ALL_NUMBERS ||
|
|
129
|
+
// For all letters, all numbers, all same, or lucky sevens - highlight everything
|
|
130
|
+
if (type === PatternType.ALL_LETTERS || type === PatternType.ALL_NUMBERS ||
|
|
131
|
+
type === PatternType.ALL_SAME || type === PatternType.LUCKY_SEVENS) {
|
|
127
132
|
return [0, 1, 2, 3, 4, 5, 6];
|
|
128
133
|
}
|
|
129
134
|
// For frequency-based patterns, highlight characters that appear in the pattern
|
|
@@ -146,8 +151,8 @@ function getHighlightIndices(hash, type) {
|
|
|
146
151
|
}
|
|
147
152
|
}
|
|
148
153
|
}
|
|
149
|
-
else if (type === PatternType.FULLEST_HOUSE || type === PatternType.
|
|
150
|
-
type === PatternType.THREE_OF_KIND_PLUS_THREE) {
|
|
154
|
+
else if (type === PatternType.FULLEST_HOUSE || type === PatternType.FULLER_HOUSE ||
|
|
155
|
+
type === PatternType.FULL_HOUSE || type === PatternType.THREE_OF_KIND_PLUS_THREE) {
|
|
151
156
|
// Highlight all paired/tripled characters
|
|
152
157
|
for (const [char, count] of counts.entries()) {
|
|
153
158
|
if (count >= 2) {
|
|
@@ -188,8 +193,12 @@ export function detectPattern(hash) {
|
|
|
188
193
|
const distribution = getCountDistribution(counts);
|
|
189
194
|
// Detect pattern - check in order of rarity/value
|
|
190
195
|
let type;
|
|
196
|
+
// Check for the secret ultimate jackpot: 7777777
|
|
197
|
+
if (lowerHash === '7777777') {
|
|
198
|
+
type = PatternType.LUCKY_SEVENS;
|
|
199
|
+
}
|
|
191
200
|
// Check for all same first (highest value)
|
|
192
|
-
if (distribution[0] === 7) {
|
|
201
|
+
else if (distribution[0] === 7) {
|
|
193
202
|
type = PatternType.ALL_SAME;
|
|
194
203
|
}
|
|
195
204
|
// Check for 6 of a kind
|
|
@@ -228,7 +237,11 @@ export function detectPattern(hash) {
|
|
|
228
237
|
else if (distribution[0] === 3 && distribution[1] === 3) {
|
|
229
238
|
type = PatternType.THREE_OF_KIND_PLUS_THREE;
|
|
230
239
|
}
|
|
231
|
-
// Check for
|
|
240
|
+
// Check for fuller house (3-2-2)
|
|
241
|
+
else if (distribution[0] === 3 && distribution[1] === 2 && distribution[2] === 2) {
|
|
242
|
+
type = PatternType.FULLER_HOUSE;
|
|
243
|
+
}
|
|
244
|
+
// Check for full house (3-2-1-1)
|
|
232
245
|
else if (distribution[0] === 3 && distribution[1] === 2) {
|
|
233
246
|
type = PatternType.FULL_HOUSE;
|
|
234
247
|
}
|
package/dist/patterns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface AmendDetectionResult {
|
|
2
|
+
isAmended: boolean;
|
|
3
|
+
recentAmendCount: number;
|
|
4
|
+
suspiciousActivity: boolean;
|
|
5
|
+
recentAmendHashes: string[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Detects if the current commit appears to be the result of hash grinding
|
|
9
|
+
* by checking git reflog for suspicious amend patterns
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectAmendGrinding(timeWindowMinutes?: number, suspiciousThreshold?: number): AmendDetectionResult;
|
|
12
|
+
/**
|
|
13
|
+
* Get a warning message for suspicious amend activity
|
|
14
|
+
*/
|
|
15
|
+
export declare function getAmendWarningMessage(result: AmendDetectionResult): string | null;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=amendDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amendDetector.d.ts","sourceRoot":"","sources":["../../src/utils/amendDetector.ts"],"names":[],"mappings":"AAEA,UAAU,oBAAoB;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,iBAAiB,GAAE,MAAU,EAAE,mBAAmB,GAAE,MAAU,GAAG,oBAAoB,CA8CxH;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI,CASlF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Detects if the current commit appears to be the result of hash grinding
|
|
4
|
+
* by checking git reflog for suspicious amend patterns
|
|
5
|
+
*/
|
|
6
|
+
export function detectAmendGrinding(timeWindowMinutes = 5, suspiciousThreshold = 5) {
|
|
7
|
+
try {
|
|
8
|
+
// Get reflog entries from the last timeWindowMinutes
|
|
9
|
+
// Format: %gd = reflog selector, %gs = reflog subject, %H = commit hash, %ct = committer timestamp
|
|
10
|
+
const reflogOutput = execSync(`git reflog --since="${timeWindowMinutes} minutes ago" --format="%gs|%H|%ct"`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }).trim();
|
|
11
|
+
if (!reflogOutput) {
|
|
12
|
+
return {
|
|
13
|
+
isAmended: false,
|
|
14
|
+
recentAmendCount: 0,
|
|
15
|
+
suspiciousActivity: false,
|
|
16
|
+
recentAmendHashes: [],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const entries = reflogOutput.split('\n');
|
|
20
|
+
const amendEntries = entries.filter(entry => entry.includes('commit (amend)'));
|
|
21
|
+
const amendHashes = amendEntries.map(entry => {
|
|
22
|
+
const parts = entry.split('|');
|
|
23
|
+
return parts[1]?.substring(0, 7) || '';
|
|
24
|
+
}).filter(hash => hash.length === 7);
|
|
25
|
+
const recentAmendCount = amendEntries.length;
|
|
26
|
+
const suspiciousActivity = recentAmendCount >= suspiciousThreshold;
|
|
27
|
+
// Check if the most recent action was an amend
|
|
28
|
+
const isAmended = entries.length > 0 && entries[0].includes('commit (amend)');
|
|
29
|
+
return {
|
|
30
|
+
isAmended,
|
|
31
|
+
recentAmendCount,
|
|
32
|
+
suspiciousActivity,
|
|
33
|
+
recentAmendHashes: amendHashes,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// If git reflog fails, assume no amending
|
|
38
|
+
return {
|
|
39
|
+
isAmended: false,
|
|
40
|
+
recentAmendCount: 0,
|
|
41
|
+
suspiciousActivity: false,
|
|
42
|
+
recentAmendHashes: [],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get a warning message for suspicious amend activity
|
|
48
|
+
*/
|
|
49
|
+
export function getAmendWarningMessage(result) {
|
|
50
|
+
if (!result.suspiciousActivity) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return `⚠️ Suspicious Activity Detected\n` +
|
|
54
|
+
` ${result.recentAmendCount} commit amends in the last 5 minutes\n` +
|
|
55
|
+
` This pattern suggests hash grinding/gaming\n` +
|
|
56
|
+
` Your commit will be flagged for review`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=amendDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amendDetector.js","sourceRoot":"","sources":["../../src/utils/amendDetector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AASzC;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,oBAA4B,CAAC,EAAE,sBAA8B,CAAC;IAChG,IAAI,CAAC;QACH,qDAAqD;QACrD,mGAAmG;QACnG,MAAM,YAAY,GAAG,QAAQ,CAC3B,uBAAuB,iBAAiB,qCAAqC,EAC7E,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CACzD,CAAC,IAAI,EAAE,CAAC;QAET,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,gBAAgB,EAAE,CAAC;gBACnB,kBAAkB,EAAE,KAAK;gBACzB,iBAAiB,EAAE,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC/E,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAErC,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC;QAC7C,MAAM,kBAAkB,GAAG,gBAAgB,IAAI,mBAAmB,CAAC;QAEnE,+CAA+C;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAE9E,OAAO;YACL,SAAS;YACT,gBAAgB;YAChB,kBAAkB;YAClB,iBAAiB,EAAE,WAAW;SAC/B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0CAA0C;QAC1C,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,gBAAgB,EAAE,CAAC;YACnB,kBAAkB,EAAE,KAAK;YACzB,iBAAiB,EAAE,EAAE;SACtB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA4B;IACjE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,oCAAoC;QACzC,MAAM,MAAM,CAAC,gBAAgB,wCAAwC;QACrE,iDAAiD;QACjD,2CAA2C,CAAC;AAChD,CAAC"}
|
package/package.json
CHANGED
package/src/commands/play.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { animateSlotMachine, animateSmallMode } from '../animation/slotMachine.j
|
|
|
3
3
|
import { getBalance, updateBalance, setBalance } from '../balance.js';
|
|
4
4
|
import { sendPlayToAPI } from '../api.js';
|
|
5
5
|
import { getRepoInfo, getGitHubUsername } from '../config.js';
|
|
6
|
+
import { detectAmendGrinding, getAmendWarningMessage } from '../utils/amendDetector.js';
|
|
6
7
|
import chalk from 'chalk';
|
|
7
8
|
|
|
8
9
|
interface PlayOptions {
|
|
@@ -78,6 +79,10 @@ export async function playCommand(hash: string, options: PlayOptions): Promise<v
|
|
|
78
79
|
// Update balance locally
|
|
79
80
|
let newBalance = updateBalance(hash.toLowerCase(), result.payout);
|
|
80
81
|
|
|
82
|
+
// Detect potential hash grinding
|
|
83
|
+
const amendDetection = detectAmendGrinding();
|
|
84
|
+
const warningMessage = getAmendWarningMessage(amendDetection);
|
|
85
|
+
|
|
81
86
|
// Send to API and sync balance with server
|
|
82
87
|
let shareUrl: string | undefined;
|
|
83
88
|
|
|
@@ -94,6 +99,8 @@ export async function playCommand(hash: string, options: PlayOptions): Promise<v
|
|
|
94
99
|
github_username: githubUsername,
|
|
95
100
|
repo_owner: repoInfo.owner,
|
|
96
101
|
repo_name: repoInfo.name,
|
|
102
|
+
suspicious: amendDetection.suspiciousActivity,
|
|
103
|
+
amend_count: amendDetection.recentAmendCount,
|
|
97
104
|
};
|
|
98
105
|
|
|
99
106
|
// Only send full hash if we have one (not in test mode)
|
|
@@ -143,6 +150,12 @@ export async function playCommand(hash: string, options: PlayOptions): Promise<v
|
|
|
143
150
|
console.log(' '.repeat(urlPadding) + chalk.green.underline(shareUrl));
|
|
144
151
|
}
|
|
145
152
|
|
|
153
|
+
// Show warning if suspicious activity detected
|
|
154
|
+
if (warningMessage && !options.small) {
|
|
155
|
+
console.log();
|
|
156
|
+
console.log(chalk.yellow(warningMessage));
|
|
157
|
+
}
|
|
158
|
+
|
|
146
159
|
} catch (error) {
|
|
147
160
|
console.error(chalk.red(`Error: ${(error as Error).message}`));
|
|
148
161
|
process.exit(1);
|
package/src/index.ts
CHANGED
|
@@ -16,7 +16,7 @@ const program = new Command();
|
|
|
16
16
|
program
|
|
17
17
|
.name('git-slot-machine')
|
|
18
18
|
.description('Git commit hash slot machine')
|
|
19
|
-
.version('
|
|
19
|
+
.version('2.2.0', '-v, --version', 'Output the current version');
|
|
20
20
|
|
|
21
21
|
program
|
|
22
22
|
.command('play')
|
package/src/patterns.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export enum PatternType {
|
|
2
|
+
LUCKY_SEVENS = 'LUCKY_SEVENS', // Secret: 7777777
|
|
2
3
|
ALL_SAME = 'ALL_SAME',
|
|
3
4
|
SIX_OF_KIND = 'SIX_OF_KIND',
|
|
4
5
|
STRAIGHT_7 = 'STRAIGHT_7',
|
|
@@ -9,7 +10,8 @@ export enum PatternType {
|
|
|
9
10
|
ALL_LETTERS = 'ALL_LETTERS',
|
|
10
11
|
STRAIGHT_5 = 'STRAIGHT_5',
|
|
11
12
|
THREE_OF_KIND_PLUS_THREE = 'THREE_OF_KIND_PLUS_THREE', // 3-3-1
|
|
12
|
-
|
|
13
|
+
FULLER_HOUSE = 'FULLER_HOUSE', // 3-2-2
|
|
14
|
+
FULL_HOUSE = 'FULL_HOUSE', // 3-2-1-1
|
|
13
15
|
THREE_PAIR = 'THREE_PAIR',
|
|
14
16
|
THREE_OF_KIND = 'THREE_OF_KIND',
|
|
15
17
|
TWO_PAIR = 'TWO_PAIR',
|
|
@@ -27,22 +29,24 @@ export interface PatternResult {
|
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
const PAYOUTS: Record<PatternType, { name: string; payout: number; description: string }> = {
|
|
32
|
+
[PatternType.LUCKY_SEVENS]: { name: 'LUCKY SEVENS', payout: 1000000, description: 'The ultimate jackpot: 7777777' },
|
|
30
33
|
[PatternType.ALL_SAME]: { name: 'JACKPOT', payout: 100000, description: 'All same character' },
|
|
31
|
-
[PatternType.STRAIGHT_7]: { name: 'LUCKY SEVEN', payout: 50000, description: 'Seven
|
|
32
|
-
[PatternType.STRAIGHT_6]: { name: 'BIG STRAIGHT', payout: 25000, description: 'Six
|
|
34
|
+
[PatternType.STRAIGHT_7]: { name: 'LUCKY SEVEN', payout: 50000, description: 'Seven sequential hex digits' },
|
|
35
|
+
[PatternType.STRAIGHT_6]: { name: 'BIG STRAIGHT', payout: 25000, description: 'Six sequential hex digits' },
|
|
33
36
|
[PatternType.SIX_OF_KIND]: { name: 'HEXTET', payout: 10000, description: 'Six of a kind' },
|
|
34
37
|
[PatternType.FULLEST_HOUSE]: { name: 'FULLEST HOUSE', payout: 5000, description: '4 + 3 of a kind' },
|
|
35
|
-
[PatternType.STRAIGHT_5]: { name: 'STRAIGHT', payout: 2500, description: 'Five
|
|
38
|
+
[PatternType.STRAIGHT_5]: { name: 'STRAIGHT', payout: 2500, description: 'Five sequential hex digits' },
|
|
36
39
|
[PatternType.FIVE_OF_KIND]: { name: 'FIVE OF A KIND', payout: 2000, description: 'Five of a kind' },
|
|
37
40
|
[PatternType.THREE_OF_KIND_PLUS_THREE]: { name: 'DOUBLE TRIPLE', payout: 1000, description: 'Two three of a kinds' },
|
|
38
|
-
[PatternType.THREE_PAIR]: { name: 'THREE PAIR', payout: 500, description: 'Three pairs' },
|
|
39
|
-
[PatternType.
|
|
41
|
+
[PatternType.THREE_PAIR]: { name: 'THREE PAIR', payout: 500, description: 'Three consecutive pairs' },
|
|
42
|
+
[PatternType.FULLER_HOUSE]: { name: 'FULLER HOUSE', payout: 400, description: '3 + 2 + 2 of a kind' },
|
|
43
|
+
[PatternType.FULL_HOUSE]: { name: 'FULL HOUSE', payout: 50, description: '3 + 2 of a kind' },
|
|
40
44
|
[PatternType.ALL_LETTERS]: { name: 'ALPHABET SOUP', payout: 250, description: 'Only letters (a-f)' },
|
|
41
45
|
[PatternType.FOUR_OF_KIND]: { name: 'FOUR OF A KIND', payout: 200, description: 'Four of a kind' },
|
|
42
|
-
[PatternType.THREE_OF_KIND]: { name: 'THREE OF A KIND', payout:
|
|
46
|
+
[PatternType.THREE_OF_KIND]: { name: 'THREE OF A KIND', payout: 25, description: 'Three of a kind' },
|
|
43
47
|
[PatternType.ALL_NUMBERS]: { name: 'ALL NUMBERS', payout: 50, description: 'Only numbers (0-9)' },
|
|
44
|
-
[PatternType.TWO_PAIR]: { name: 'TWO PAIR', payout: 25, description: 'Two pairs' },
|
|
45
|
-
[PatternType.ONE_PAIR]: { name: 'ONE PAIR', payout: 10, description: 'One pair' },
|
|
48
|
+
[PatternType.TWO_PAIR]: { name: 'TWO PAIR', payout: 25, description: 'Two consecutive pairs' },
|
|
49
|
+
[PatternType.ONE_PAIR]: { name: 'ONE PAIR', payout: 10, description: 'One consecutive pair' },
|
|
46
50
|
[PatternType.NO_WIN]: { name: 'NO WIN', payout: 0, description: 'No winning pattern' }
|
|
47
51
|
};
|
|
48
52
|
|
|
@@ -145,8 +149,9 @@ function getHighlightIndices(hash: string, type: PatternType): number[] {
|
|
|
145
149
|
}
|
|
146
150
|
}
|
|
147
151
|
|
|
148
|
-
// For all letters
|
|
149
|
-
if (type === PatternType.ALL_LETTERS || type === PatternType.ALL_NUMBERS ||
|
|
152
|
+
// For all letters, all numbers, all same, or lucky sevens - highlight everything
|
|
153
|
+
if (type === PatternType.ALL_LETTERS || type === PatternType.ALL_NUMBERS ||
|
|
154
|
+
type === PatternType.ALL_SAME || type === PatternType.LUCKY_SEVENS) {
|
|
150
155
|
return [0, 1, 2, 3, 4, 5, 6];
|
|
151
156
|
}
|
|
152
157
|
|
|
@@ -172,8 +177,8 @@ function getHighlightIndices(hash: string, type: PatternType): number[] {
|
|
|
172
177
|
}
|
|
173
178
|
}
|
|
174
179
|
}
|
|
175
|
-
else if (type === PatternType.FULLEST_HOUSE || type === PatternType.
|
|
176
|
-
type === PatternType.THREE_OF_KIND_PLUS_THREE) {
|
|
180
|
+
else if (type === PatternType.FULLEST_HOUSE || type === PatternType.FULLER_HOUSE ||
|
|
181
|
+
type === PatternType.FULL_HOUSE || type === PatternType.THREE_OF_KIND_PLUS_THREE) {
|
|
177
182
|
// Highlight all paired/tripled characters
|
|
178
183
|
for (const [char, count] of counts.entries()) {
|
|
179
184
|
if (count >= 2) {
|
|
@@ -218,8 +223,12 @@ export function detectPattern(hash: string): PatternResult {
|
|
|
218
223
|
// Detect pattern - check in order of rarity/value
|
|
219
224
|
let type: PatternType;
|
|
220
225
|
|
|
226
|
+
// Check for the secret ultimate jackpot: 7777777
|
|
227
|
+
if (lowerHash === '7777777') {
|
|
228
|
+
type = PatternType.LUCKY_SEVENS;
|
|
229
|
+
}
|
|
221
230
|
// Check for all same first (highest value)
|
|
222
|
-
if (distribution[0] === 7) {
|
|
231
|
+
else if (distribution[0] === 7) {
|
|
223
232
|
type = PatternType.ALL_SAME;
|
|
224
233
|
}
|
|
225
234
|
// Check for 6 of a kind
|
|
@@ -258,7 +267,11 @@ export function detectPattern(hash: string): PatternResult {
|
|
|
258
267
|
else if (distribution[0] === 3 && distribution[1] === 3) {
|
|
259
268
|
type = PatternType.THREE_OF_KIND_PLUS_THREE;
|
|
260
269
|
}
|
|
261
|
-
// Check for
|
|
270
|
+
// Check for fuller house (3-2-2)
|
|
271
|
+
else if (distribution[0] === 3 && distribution[1] === 2 && distribution[2] === 2) {
|
|
272
|
+
type = PatternType.FULLER_HOUSE;
|
|
273
|
+
}
|
|
274
|
+
// Check for full house (3-2-1-1)
|
|
262
275
|
else if (distribution[0] === 3 && distribution[1] === 2) {
|
|
263
276
|
type = PatternType.FULL_HOUSE;
|
|
264
277
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
|
|
3
|
+
interface AmendDetectionResult {
|
|
4
|
+
isAmended: boolean;
|
|
5
|
+
recentAmendCount: number;
|
|
6
|
+
suspiciousActivity: boolean;
|
|
7
|
+
recentAmendHashes: string[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Detects if the current commit appears to be the result of hash grinding
|
|
12
|
+
* by checking git reflog for suspicious amend patterns
|
|
13
|
+
*/
|
|
14
|
+
export function detectAmendGrinding(timeWindowMinutes: number = 5, suspiciousThreshold: number = 5): AmendDetectionResult {
|
|
15
|
+
try {
|
|
16
|
+
// Get reflog entries from the last timeWindowMinutes
|
|
17
|
+
// Format: %gd = reflog selector, %gs = reflog subject, %H = commit hash, %ct = committer timestamp
|
|
18
|
+
const reflogOutput = execSync(
|
|
19
|
+
`git reflog --since="${timeWindowMinutes} minutes ago" --format="%gs|%H|%ct"`,
|
|
20
|
+
{ encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }
|
|
21
|
+
).trim();
|
|
22
|
+
|
|
23
|
+
if (!reflogOutput) {
|
|
24
|
+
return {
|
|
25
|
+
isAmended: false,
|
|
26
|
+
recentAmendCount: 0,
|
|
27
|
+
suspiciousActivity: false,
|
|
28
|
+
recentAmendHashes: [],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const entries = reflogOutput.split('\n');
|
|
33
|
+
const amendEntries = entries.filter(entry => entry.includes('commit (amend)'));
|
|
34
|
+
const amendHashes = amendEntries.map(entry => {
|
|
35
|
+
const parts = entry.split('|');
|
|
36
|
+
return parts[1]?.substring(0, 7) || '';
|
|
37
|
+
}).filter(hash => hash.length === 7);
|
|
38
|
+
|
|
39
|
+
const recentAmendCount = amendEntries.length;
|
|
40
|
+
const suspiciousActivity = recentAmendCount >= suspiciousThreshold;
|
|
41
|
+
|
|
42
|
+
// Check if the most recent action was an amend
|
|
43
|
+
const isAmended = entries.length > 0 && entries[0].includes('commit (amend)');
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
isAmended,
|
|
47
|
+
recentAmendCount,
|
|
48
|
+
suspiciousActivity,
|
|
49
|
+
recentAmendHashes: amendHashes,
|
|
50
|
+
};
|
|
51
|
+
} catch (error) {
|
|
52
|
+
// If git reflog fails, assume no amending
|
|
53
|
+
return {
|
|
54
|
+
isAmended: false,
|
|
55
|
+
recentAmendCount: 0,
|
|
56
|
+
suspiciousActivity: false,
|
|
57
|
+
recentAmendHashes: [],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get a warning message for suspicious amend activity
|
|
64
|
+
*/
|
|
65
|
+
export function getAmendWarningMessage(result: AmendDetectionResult): string | null {
|
|
66
|
+
if (!result.suspiciousActivity) {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return `⚠️ Suspicious Activity Detected\n` +
|
|
71
|
+
` ${result.recentAmendCount} commit amends in the last 5 minutes\n` +
|
|
72
|
+
` This pattern suggests hash grinding/gaming\n` +
|
|
73
|
+
` Your commit will be flagged for review`;
|
|
74
|
+
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Bash(npm run build:*)",
|
|
5
|
-
"Bash(git add:*)",
|
|
6
|
-
"Bash(git commit:*)",
|
|
7
|
-
"Bash(git push)",
|
|
8
|
-
"Bash(git push:*)",
|
|
9
|
-
"Bash(npm publish)",
|
|
10
|
-
"Bash(npm config set:*)",
|
|
11
|
-
"Read(//Users/than/Sites/gitslotmachine.com/**)"
|
|
12
|
-
],
|
|
13
|
-
"deny": [],
|
|
14
|
-
"ask": []
|
|
15
|
-
}
|
|
16
|
-
}
|