quackscore 0.1.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.
- package/LICENSE +21 -0
- package/README.md +158 -0
- package/dist/commands/create.d.ts +6 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +165 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +62 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/leaderboard.d.ts +2 -0
- package/dist/commands/leaderboard.d.ts.map +1 -0
- package/dist/commands/leaderboard.js +36 -0
- package/dist/commands/leaderboard.js.map +1 -0
- package/dist/commands/mock-report.d.ts +4 -0
- package/dist/commands/mock-report.d.ts.map +1 -0
- package/dist/commands/mock-report.js +311 -0
- package/dist/commands/mock-report.js.map +1 -0
- package/dist/commands/show.d.ts +2 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +17 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +175 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +7 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +29 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +14 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +21 -0
- package/dist/config/types.js.map +1 -0
- package/dist/github/client.d.ts +8 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +241 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/index.d.ts +3 -0
- package/dist/github/index.d.ts.map +1 -0
- package/dist/github/index.js +2 -0
- package/dist/github/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/analyzer.d.ts +7 -0
- package/dist/llm/analyzer.d.ts.map +1 -0
- package/dist/llm/analyzer.js +249 -0
- package/dist/llm/analyzer.js.map +1 -0
- package/dist/llm/character.d.ts +16 -0
- package/dist/llm/character.d.ts.map +1 -0
- package/dist/llm/character.js +245 -0
- package/dist/llm/character.js.map +1 -0
- package/dist/llm/client.d.ts +5 -0
- package/dist/llm/client.d.ts.map +1 -0
- package/dist/llm/client.js +98 -0
- package/dist/llm/client.js.map +1 -0
- package/dist/llm/index.d.ts +4 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +4 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/prompts.d.ts +4 -0
- package/dist/llm/prompts.d.ts.map +1 -0
- package/dist/llm/prompts.js +109 -0
- package/dist/llm/prompts.js.map +1 -0
- package/dist/llm/providers.d.ts +10 -0
- package/dist/llm/providers.d.ts.map +1 -0
- package/dist/llm/providers.js +70 -0
- package/dist/llm/providers.js.map +1 -0
- package/dist/report/generate.d.ts +3 -0
- package/dist/report/generate.d.ts.map +1 -0
- package/dist/report/generate.js +1540 -0
- package/dist/report/generate.js.map +1 -0
- package/dist/report/index.d.ts +2 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +2 -0
- package/dist/report/index.js.map +1 -0
- package/dist/scoring/index.d.ts +3 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +3 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/points.d.ts +8 -0
- package/dist/scoring/points.d.ts.map +1 -0
- package/dist/scoring/points.js +28 -0
- package/dist/scoring/points.js.map +1 -0
- package/dist/scoring/stats.d.ts +3 -0
- package/dist/scoring/stats.d.ts.map +1 -0
- package/dist/scoring/stats.js +80 -0
- package/dist/scoring/stats.js.map +1 -0
- package/dist/shared/diagnostics.d.ts +8 -0
- package/dist/shared/diagnostics.d.ts.map +1 -0
- package/dist/shared/diagnostics.js +99 -0
- package/dist/shared/diagnostics.js.map +1 -0
- package/dist/shared/pr-summary.d.ts +5 -0
- package/dist/shared/pr-summary.d.ts.map +1 -0
- package/dist/shared/pr-summary.js +272 -0
- package/dist/shared/pr-summary.js.map +1 -0
- package/dist/shared/profile-summary.d.ts +5 -0
- package/dist/shared/profile-summary.d.ts.map +1 -0
- package/dist/shared/profile-summary.js +262 -0
- package/dist/shared/profile-summary.js.map +1 -0
- package/dist/shared/technologies.d.ts +5 -0
- package/dist/shared/technologies.d.ts.map +1 -0
- package/dist/shared/technologies.js +211 -0
- package/dist/shared/technologies.js.map +1 -0
- package/dist/shared/types.d.ts +61 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +14 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/ui.d.ts +7 -0
- package/dist/shared/ui.d.ts.map +1 -0
- package/dist/shared/ui.js +24 -0
- package/dist/shared/ui.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/leaderboard.d.ts +4 -0
- package/dist/storage/leaderboard.d.ts.map +1 -0
- package/dist/storage/leaderboard.js +37 -0
- package/dist/storage/leaderboard.js.map +1 -0
- package/dist/storage/paths.d.ts +6 -0
- package/dist/storage/paths.d.ts.map +1 -0
- package/dist/storage/paths.js +19 -0
- package/dist/storage/paths.js.map +1 -0
- package/dist/storage/report.d.ts +3 -0
- package/dist/storage/report.d.ts.map +1 -0
- package/dist/storage/report.js +21 -0
- package/dist/storage/report.js.map +1 -0
- package/dist/storage/user.d.ts +4 -0
- package/dist/storage/user.d.ts.map +1 -0
- package/dist/storage/user.js +44 -0
- package/dist/storage/user.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/shared/ui.ts"],"names":[],"mappings":"AAIA,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG5C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
const duck = '🦆';
|
|
3
|
+
export function rpgLog(message) {
|
|
4
|
+
console.log(`${duck} ${chalk.cyan(message)}`);
|
|
5
|
+
}
|
|
6
|
+
export function rpgSuccess(message) {
|
|
7
|
+
console.log(`✨ ${chalk.green(message)}`);
|
|
8
|
+
}
|
|
9
|
+
export function rpgError(message) {
|
|
10
|
+
console.error(`💀 ${chalk.red(message)}`);
|
|
11
|
+
}
|
|
12
|
+
export function rpgInfo(message) {
|
|
13
|
+
console.log(`📜 ${chalk.yellow(message)}`);
|
|
14
|
+
}
|
|
15
|
+
export function rpgProgress(current, total, title) {
|
|
16
|
+
const pct = Math.round((current / total) * 100);
|
|
17
|
+
const bar = '█'.repeat(Math.floor(pct / 5)) + '░'.repeat(20 - Math.floor(pct / 5));
|
|
18
|
+
console.log(`⚔️ [${bar}] ${pct}% | PR #${current}/${total}: ${chalk.dim(title.slice(0, 60))}`);
|
|
19
|
+
}
|
|
20
|
+
export function rpgHeader(text) {
|
|
21
|
+
const line = '═'.repeat(text.length + 4);
|
|
22
|
+
console.log(chalk.magenta(`\n╔${line}╗\n║ ${text} ║\n╚${line}╝\n`));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/shared/ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,IAAI,GAAG,IAAI,CAAC;AAElB,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,KAAa,EAAE,KAAa;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,GAAG,WAAW,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,SAAS,IAAI,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.d.ts","sourceRoot":"","sources":["../../src/storage/leaderboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAIrE,wBAAgB,eAAe,IAAI,gBAAgB,EAAE,CAQpD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAqBtD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { ensureStorageDir, LEADERBOARD_FILE } from './paths.js';
|
|
3
|
+
import { diagLog } from '../shared/diagnostics.js';
|
|
4
|
+
export function loadLeaderboard() {
|
|
5
|
+
ensureStorageDir();
|
|
6
|
+
const exists = fs.existsSync(LEADERBOARD_FILE);
|
|
7
|
+
diagLog('Loading leaderboard file', { leaderboardFile: LEADERBOARD_FILE, exists });
|
|
8
|
+
if (!exists)
|
|
9
|
+
return [];
|
|
10
|
+
const raw = fs.readFileSync(LEADERBOARD_FILE, 'utf-8');
|
|
11
|
+
diagLog('Loaded leaderboard file contents', { leaderboardFile: LEADERBOARD_FILE, bytes: raw.length });
|
|
12
|
+
return JSON.parse(raw);
|
|
13
|
+
}
|
|
14
|
+
export function updateLeaderboard(data) {
|
|
15
|
+
const leaderboard = loadLeaderboard();
|
|
16
|
+
const entry = {
|
|
17
|
+
username: data.username,
|
|
18
|
+
totalPoints: data.stats.totalPoints,
|
|
19
|
+
level: data.stats.level,
|
|
20
|
+
lastUpdated: data.lastUpdated,
|
|
21
|
+
};
|
|
22
|
+
const idx = leaderboard.findIndex((e) => e.username === data.username);
|
|
23
|
+
if (idx >= 0) {
|
|
24
|
+
leaderboard[idx] = entry;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
leaderboard.push(entry);
|
|
28
|
+
}
|
|
29
|
+
leaderboard.sort((a, b) => b.totalPoints - a.totalPoints);
|
|
30
|
+
diagLog('Updating leaderboard file', {
|
|
31
|
+
updatedUsername: data.username,
|
|
32
|
+
entryCount: leaderboard.length,
|
|
33
|
+
topEntries: leaderboard.slice(0, 5),
|
|
34
|
+
});
|
|
35
|
+
fs.writeFileSync(LEADERBOARD_FILE, JSON.stringify(leaderboard, null, 2), 'utf-8');
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=leaderboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.js","sourceRoot":"","sources":["../../src/storage/leaderboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,MAAM,UAAU,eAAe;IAC7B,gBAAgB,EAAE,CAAC;IACnB,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC/C,OAAO,CAAC,0BAA0B,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,CAAC,kCAAkC,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACtG,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,KAAK,GAAqB;QAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;QACnC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;IACF,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IAC1D,OAAO,CAAC,2BAA2B,EAAE;QACnC,eAAe,EAAE,IAAI,CAAC,QAAQ;QAC9B,UAAU,EAAE,WAAW,CAAC,MAAM;QAC9B,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;KACpC,CAAC,CAAC;IACH,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const STORAGE_DIR: string;
|
|
2
|
+
export declare const LEADERBOARD_FILE: string;
|
|
3
|
+
export declare function ensureStorageDir(): void;
|
|
4
|
+
export declare function userFilePath(username: string): string;
|
|
5
|
+
export declare function userReportPath(username: string): string;
|
|
6
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW,QAAyC,CAAC;AAClE,eAAO,MAAM,gBAAgB,QAA6C,CAAC;AAE3E,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { diagLog } from '../shared/diagnostics.js';
|
|
5
|
+
export const STORAGE_DIR = path.join(os.homedir(), '.quackscore');
|
|
6
|
+
export const LEADERBOARD_FILE = path.join(STORAGE_DIR, 'leaderboard.json');
|
|
7
|
+
export function ensureStorageDir() {
|
|
8
|
+
if (!fs.existsSync(STORAGE_DIR)) {
|
|
9
|
+
diagLog('Creating storage directory', { storageDir: STORAGE_DIR });
|
|
10
|
+
fs.mkdirSync(STORAGE_DIR, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function userFilePath(username) {
|
|
14
|
+
return path.join(STORAGE_DIR, `${username}.json`);
|
|
15
|
+
}
|
|
16
|
+
export function userReportPath(username) {
|
|
17
|
+
return path.join(STORAGE_DIR, `${username}.html`);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAE3E,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,4BAA4B,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACnE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/storage/report.ts"],"names":[],"mappings":"AAIA,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAUjE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { ensureStorageDir, userReportPath } from './paths.js';
|
|
3
|
+
import { diagLog } from '../shared/diagnostics.js';
|
|
4
|
+
export function getUserReportPath(username) {
|
|
5
|
+
ensureStorageDir();
|
|
6
|
+
const reportPath = userReportPath(username);
|
|
7
|
+
diagLog('Resolved user report path', { username, reportPath });
|
|
8
|
+
return reportPath;
|
|
9
|
+
}
|
|
10
|
+
export function saveReport(username, html) {
|
|
11
|
+
ensureStorageDir();
|
|
12
|
+
const reportPath = userReportPath(username);
|
|
13
|
+
diagLog('Writing report file', {
|
|
14
|
+
username,
|
|
15
|
+
reportPath,
|
|
16
|
+
htmlLength: html.length,
|
|
17
|
+
});
|
|
18
|
+
fs.writeFileSync(reportPath, html, 'utf-8');
|
|
19
|
+
return reportPath;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/storage/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,gBAAgB,EAAE,CAAC;IACnB,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,CAAC,2BAA2B,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,IAAY;IACvD,gBAAgB,EAAE,CAAC;IACnB,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,CAAC,qBAAqB,EAAE;QAC7B,QAAQ;QACR,UAAU;QACV,UAAU,EAAE,IAAI,CAAC,MAAM;KACxB,CAAC,CAAC;IACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/storage/user.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAMnD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAajD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQ9D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { ensureStorageDir, userFilePath } from './paths.js';
|
|
3
|
+
import { updateLeaderboard } from './leaderboard.js';
|
|
4
|
+
import { diagLog } from '../shared/diagnostics.js';
|
|
5
|
+
import { normalizeTechnologies } from '../shared/technologies.js';
|
|
6
|
+
export function saveUserData(data) {
|
|
7
|
+
ensureStorageDir();
|
|
8
|
+
const filePath = userFilePath(data.username);
|
|
9
|
+
const normalized = normalizeUserData(data);
|
|
10
|
+
diagLog('Writing user data file', {
|
|
11
|
+
username: normalized.username,
|
|
12
|
+
filePath,
|
|
13
|
+
prCount: normalized.prs.length,
|
|
14
|
+
totalPoints: normalized.stats.totalPoints,
|
|
15
|
+
level: normalized.stats.level,
|
|
16
|
+
});
|
|
17
|
+
fs.writeFileSync(filePath, JSON.stringify(normalized, null, 2), 'utf-8');
|
|
18
|
+
updateLeaderboard(normalized);
|
|
19
|
+
}
|
|
20
|
+
export function loadUserData(username) {
|
|
21
|
+
const file = userFilePath(username);
|
|
22
|
+
const exists = fs.existsSync(file);
|
|
23
|
+
diagLog('Loading user data file', { username, filePath: file, exists });
|
|
24
|
+
if (!exists)
|
|
25
|
+
return null;
|
|
26
|
+
const raw = fs.readFileSync(file, 'utf-8');
|
|
27
|
+
diagLog('Loaded user data file contents', { username, bytes: raw.length });
|
|
28
|
+
return normalizeUserData(JSON.parse(raw));
|
|
29
|
+
}
|
|
30
|
+
function normalizeUserData(data) {
|
|
31
|
+
return {
|
|
32
|
+
...data,
|
|
33
|
+
prs: data.prs.map((pr) => pr.analysis
|
|
34
|
+
? {
|
|
35
|
+
...pr,
|
|
36
|
+
analysis: {
|
|
37
|
+
...pr.analysis,
|
|
38
|
+
technologies: normalizeTechnologies(pr.analysis.technologies),
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
: pr),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/storage/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,gBAAgB,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,wBAAwB,EAAE;QAChC,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,QAAQ;QACR,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM;QAC9B,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,WAAW;QACzC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK;KAC9B,CAAC,CAAC;IACH,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,gCAAgC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAa,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc;IACvC,OAAO;QACL,GAAG,IAAI;QACP,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACvB,EAAE,CAAC,QAAQ;YACT,CAAC,CAAC;gBACE,GAAG,EAAE;gBACL,QAAQ,EAAE;oBACR,GAAG,EAAE,CAAC,QAAQ;oBACd,YAAY,EAAE,qBAAqB,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;iBAC9D;aACF;YACH,CAAC,CAAC,EAAE,CACP;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "quackscore",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Analyze GitHub activity and generate a Duck RPG-style developer card",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"quackscore": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsx src/index.ts",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"prepublishOnly": "npm test && npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": ["github", "cli", "rpg", "developer-tools", "duck", "gamification"],
|
|
21
|
+
"author": "przemek.strucinski",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/BatAndDuck/quackscore.git"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://github.com/BatAndDuck/quackscore#readme",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/BatAndDuck/quackscore/issues"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@ai-sdk/anthropic": "^1.0.0",
|
|
33
|
+
"@ai-sdk/google": "^1.0.0",
|
|
34
|
+
"@ai-sdk/openai": "^1.0.0",
|
|
35
|
+
"@octokit/rest": "^20.1.1",
|
|
36
|
+
"ai": "^4.0.0",
|
|
37
|
+
"chalk": "^5.3.0",
|
|
38
|
+
"commander": "^12.1.0",
|
|
39
|
+
"ollama-ai-provider": "^1.0.0",
|
|
40
|
+
"open": "^10.1.0",
|
|
41
|
+
"zod": "^3.23.8"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^22.9.0",
|
|
45
|
+
"tsx": "^4.19.0",
|
|
46
|
+
"typescript": "^5.6.3",
|
|
47
|
+
"vitest": "^2.0.0"
|
|
48
|
+
},
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=18.0.0"
|
|
51
|
+
}
|
|
52
|
+
}
|