quackscore 0.2.5 → 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 (137) hide show
  1. package/README.md +20 -1
  2. package/dist/commands/create.d.ts +1 -0
  3. package/dist/commands/create.d.ts.map +1 -1
  4. package/dist/commands/create.js +28 -12
  5. package/dist/commands/create.js.map +1 -1
  6. package/dist/commands/init.d.ts.map +1 -1
  7. package/dist/commands/init.js +19 -0
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/leaderboard.d.ts +5 -1
  10. package/dist/commands/leaderboard.d.ts.map +1 -1
  11. package/dist/commands/leaderboard.js +57 -29
  12. package/dist/commands/leaderboard.js.map +1 -1
  13. package/dist/commands/mock-report.js +21 -21
  14. package/dist/commands/mock-report.js.map +1 -1
  15. package/dist/commands/profile-options.d.ts +24 -0
  16. package/dist/commands/profile-options.d.ts.map +1 -0
  17. package/dist/commands/profile-options.js +38 -0
  18. package/dist/commands/profile-options.js.map +1 -0
  19. package/dist/commands/remove.d.ts +5 -1
  20. package/dist/commands/remove.d.ts.map +1 -1
  21. package/dist/commands/remove.js +14 -5
  22. package/dist/commands/remove.js.map +1 -1
  23. package/dist/commands/show.d.ts +5 -1
  24. package/dist/commands/show.d.ts.map +1 -1
  25. package/dist/commands/show.js +12 -3
  26. package/dist/commands/show.js.map +1 -1
  27. package/dist/commands/stats.d.ts +7 -0
  28. package/dist/commands/stats.d.ts.map +1 -0
  29. package/dist/commands/stats.js +59 -0
  30. package/dist/commands/stats.js.map +1 -0
  31. package/dist/commands/update-summary.d.ts +2 -0
  32. package/dist/commands/update-summary.d.ts.map +1 -1
  33. package/dist/commands/update-summary.js +12 -3
  34. package/dist/commands/update-summary.js.map +1 -1
  35. package/dist/commands/update.d.ts.map +1 -1
  36. package/dist/commands/update.js +148 -68
  37. package/dist/commands/update.js.map +1 -1
  38. package/dist/config/types.d.ts +1 -1
  39. package/dist/config/types.d.ts.map +1 -1
  40. package/dist/config/types.js +14 -0
  41. package/dist/config/types.js.map +1 -1
  42. package/dist/github/client.d.ts +5 -5
  43. package/dist/github/client.d.ts.map +1 -1
  44. package/dist/github/client.js +157 -57
  45. package/dist/github/client.js.map +1 -1
  46. package/dist/github/index.d.ts +2 -0
  47. package/dist/github/index.d.ts.map +1 -1
  48. package/dist/github/index.js +1 -0
  49. package/dist/github/index.js.map +1 -1
  50. package/dist/github/repository-stats.d.ts +8 -0
  51. package/dist/github/repository-stats.d.ts.map +1 -0
  52. package/dist/github/repository-stats.js +96 -0
  53. package/dist/github/repository-stats.js.map +1 -0
  54. package/dist/index.js +48 -7
  55. package/dist/index.js.map +1 -1
  56. package/dist/llm/analyzer.d.ts +3 -3
  57. package/dist/llm/analyzer.d.ts.map +1 -1
  58. package/dist/llm/analyzer.js +5 -5
  59. package/dist/llm/analyzer.js.map +1 -1
  60. package/dist/llm/character.d.ts +2 -2
  61. package/dist/llm/character.d.ts.map +1 -1
  62. package/dist/llm/character.js +3 -3
  63. package/dist/llm/character.js.map +1 -1
  64. package/dist/llm/client.d.ts +2 -2
  65. package/dist/llm/client.d.ts.map +1 -1
  66. package/dist/llm/client.js +1 -1
  67. package/dist/llm/client.js.map +1 -1
  68. package/dist/llm/prompts.d.ts.map +1 -1
  69. package/dist/llm/prompts.js +13 -1
  70. package/dist/llm/prompts.js.map +1 -1
  71. package/dist/llm/providers.d.ts +3 -3
  72. package/dist/llm/providers.d.ts.map +1 -1
  73. package/dist/llm/providers.js +25 -6
  74. package/dist/llm/providers.js.map +1 -1
  75. package/dist/report/generate.d.ts.map +1 -1
  76. package/dist/report/generate.js +9 -7
  77. package/dist/report/generate.js.map +1 -1
  78. package/dist/report/index.d.ts +1 -0
  79. package/dist/report/index.d.ts.map +1 -1
  80. package/dist/report/index.js +1 -0
  81. package/dist/report/index.js.map +1 -1
  82. package/dist/report/leaderboard.d.ts +5 -1
  83. package/dist/report/leaderboard.d.ts.map +1 -1
  84. package/dist/report/leaderboard.js +611 -865
  85. package/dist/report/leaderboard.js.map +1 -1
  86. package/dist/report/repository-stats.d.ts +3 -0
  87. package/dist/report/repository-stats.d.ts.map +1 -0
  88. package/dist/report/repository-stats.js +650 -0
  89. package/dist/report/repository-stats.js.map +1 -0
  90. package/dist/scoring/index.d.ts +1 -0
  91. package/dist/scoring/index.d.ts.map +1 -1
  92. package/dist/scoring/index.js +1 -0
  93. package/dist/scoring/index.js.map +1 -1
  94. package/dist/scoring/points.d.ts.map +1 -1
  95. package/dist/scoring/points.js +5 -10
  96. package/dist/scoring/points.js.map +1 -1
  97. package/dist/scoring/repository-stats.d.ts +7 -0
  98. package/dist/scoring/repository-stats.d.ts.map +1 -0
  99. package/dist/scoring/repository-stats.js +120 -0
  100. package/dist/scoring/repository-stats.js.map +1 -0
  101. package/dist/shared/profile-scope.d.ts +19 -0
  102. package/dist/shared/profile-scope.d.ts.map +1 -0
  103. package/dist/shared/profile-scope.js +101 -0
  104. package/dist/shared/profile-scope.js.map +1 -0
  105. package/dist/shared/profile-summary.js +6 -6
  106. package/dist/shared/profile-summary.js.map +1 -1
  107. package/dist/shared/repository-stats.d.ts +51 -0
  108. package/dist/shared/repository-stats.d.ts.map +1 -0
  109. package/dist/shared/repository-stats.js +2 -0
  110. package/dist/shared/repository-stats.js.map +1 -0
  111. package/dist/shared/types.d.ts +29 -1
  112. package/dist/shared/types.d.ts.map +1 -1
  113. package/dist/shared/ui.d.ts +1 -0
  114. package/dist/shared/ui.d.ts.map +1 -1
  115. package/dist/shared/ui.js +3 -0
  116. package/dist/shared/ui.js.map +1 -1
  117. package/dist/storage/index.d.ts +2 -2
  118. package/dist/storage/index.d.ts.map +1 -1
  119. package/dist/storage/index.js +2 -2
  120. package/dist/storage/index.js.map +1 -1
  121. package/dist/storage/leaderboard.d.ts +3 -2
  122. package/dist/storage/leaderboard.d.ts.map +1 -1
  123. package/dist/storage/leaderboard.js +80 -9
  124. package/dist/storage/leaderboard.js.map +1 -1
  125. package/dist/storage/paths.d.ts +6 -0
  126. package/dist/storage/paths.d.ts.map +1 -1
  127. package/dist/storage/paths.js +21 -0
  128. package/dist/storage/paths.js.map +1 -1
  129. package/dist/storage/report.d.ts +5 -2
  130. package/dist/storage/report.d.ts.map +1 -1
  131. package/dist/storage/report.js +38 -8
  132. package/dist/storage/report.js.map +1 -1
  133. package/dist/storage/user.d.ts +2 -1
  134. package/dist/storage/user.d.ts.map +1 -1
  135. package/dist/storage/user.js +27 -10
  136. package/dist/storage/user.js.map +1 -1
  137. package/package.json +13 -6
@@ -1,5 +1,6 @@
1
- import type { LeaderboardEntry, LeaderboardProfile } from '../shared/types.js';
1
+ import type { LeaderboardEntry, LeaderboardProfile, TeamLeaderboardEntry } from '../shared/types.js';
2
2
  export declare function loadLeaderboardProfiles(): LeaderboardProfile[];
3
- export declare function loadLeaderboard(): LeaderboardEntry[];
3
+ export declare function loadLeaderboard(team?: string): LeaderboardEntry[];
4
+ export declare function loadTeamLeaderboard(): TeamLeaderboardEntry[];
4
5
  export declare function saveLeaderboardReport(html: string): string;
5
6
  //# sourceMappingURL=leaderboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"leaderboard.d.ts","sourceRoot":"","sources":["../../src/storage/leaderboard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAY,MAAM,oBAAoB,CAAC;AAgIzF,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAkC9D;AAED,wBAAgB,eAAe,IAAI,gBAAgB,EAAE,CAIpD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1D"}
1
+ {"version":3,"file":"leaderboard.d.ts","sourceRoot":"","sources":["../../src/storage/leaderboard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAY,MAAM,oBAAoB,CAAC;AAgJ/G,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAkC9D;AAED,wBAAgB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAKjE;AAED,wBAAgB,mBAAmB,IAAI,oBAAoB,EAAE,CA2D5D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1D"}
@@ -1,9 +1,10 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { calculateLevel } from '../scoring/index.js';
4
- import { ensureStorageDir, LEADERBOARD_FILE, LEADERBOARD_REPORT_FILE, STORAGE_DIR } from './paths.js';
4
+ import { ensureStorageDir, LEADERBOARD_FILE, LEADERBOARD_REPORT_FILE, STORAGE_DIR, profileReportPathByKey } from './paths.js';
5
5
  import { diagLog } from '../shared/diagnostics.js';
6
6
  import { normalizeTechnologies } from '../shared/technologies.js';
7
+ import { hasTeamMatch, normalizeTeams, normalizeUserDataShape, profileScopeLabel, teamKey } from '../shared/profile-scope.js';
7
8
  const IGNORED_JSON_FILES = new Set(['config.json', 'leaderboard.json']);
8
9
  function isUserData(value) {
9
10
  if (!value || typeof value !== 'object')
@@ -18,7 +19,7 @@ function isUserData(value) {
18
19
  }
19
20
  function normalizeUserData(data) {
20
21
  return {
21
- ...data,
22
+ ...normalizeUserDataShape(data),
22
23
  prs: data.prs.map((pr) => pr.analysis
23
24
  ? {
24
25
  ...pr,
@@ -34,14 +35,21 @@ function normalizeUserData(data) {
34
35
  },
35
36
  };
36
37
  }
37
- function compareEntries(left, right) {
38
+ function compareProfileEntries(left, right) {
38
39
  return right.totalPoints - left.totalPoints
39
40
  || right.analyzedPRs - left.analyzedPRs
40
41
  || Date.parse(right.lastActivityAt ?? right.lastUpdated) - Date.parse(left.lastActivityAt ?? left.lastUpdated)
41
42
  || left.username.localeCompare(right.username);
42
43
  }
44
+ function compareTeamEntries(left, right) {
45
+ return right.totalPoints - left.totalPoints
46
+ || right.memberCount - left.memberCount
47
+ || right.analyzedPRs - left.analyzedPRs
48
+ || Date.parse(right.lastActivityAt ?? '') - Date.parse(left.lastActivityAt ?? '')
49
+ || left.team.localeCompare(right.team);
50
+ }
43
51
  function toLeaderboardProfile(storageKey, data) {
44
- const reportPath = path.join(STORAGE_DIR, `${storageKey}.html`);
52
+ const reportPath = profileReportPathByKey(storageKey);
45
53
  const primaryArea = Object.entries(data.stats.areas).sort(([, left], [, right]) => right - left)[0]?.[0];
46
54
  const contributionDates = data.prs
47
55
  .map((pr) => pr.mergedAt)
@@ -51,6 +59,9 @@ function toLeaderboardProfile(storageKey, data) {
51
59
  storageKey,
52
60
  username: data.username,
53
61
  lastUpdated: data.lastUpdated,
62
+ scope: data.scope ?? {},
63
+ scopeLabel: profileScopeLabel(data.scope),
64
+ teams: normalizeTeams(data.teams),
54
65
  totalPoints: data.stats.totalPoints,
55
66
  level: data.stats.level,
56
67
  analyzedPRs: data.stats.analyzedPRs,
@@ -71,11 +82,13 @@ function toLeaderboardProfile(storageKey, data) {
71
82
  }),
72
83
  };
73
84
  }
74
- function toLeaderboardEntry(profile) {
85
+ function toProfileEntry(profile) {
75
86
  if (profile.contributions.length === 0) {
76
87
  return {
77
88
  storageKey: profile.storageKey,
78
89
  username: profile.username,
90
+ scopeLabel: profile.scopeLabel,
91
+ teams: profile.teams,
79
92
  totalPoints: profile.totalPoints,
80
93
  level: profile.level,
81
94
  lastUpdated: profile.lastUpdated,
@@ -104,6 +117,8 @@ function toLeaderboardEntry(profile) {
104
117
  return {
105
118
  storageKey: profile.storageKey,
106
119
  username: profile.username,
120
+ scopeLabel: profile.scopeLabel,
121
+ teams: profile.teams,
107
122
  totalPoints,
108
123
  level,
109
124
  lastUpdated: profile.lastUpdated,
@@ -137,7 +152,7 @@ export function loadLeaderboardProfiles() {
137
152
  return [];
138
153
  }
139
154
  const normalized = normalizeUserData(parsed);
140
- return [toLeaderboardProfile(path.basename(fileName, '.json'), normalized)];
155
+ return [toLeaderboardProfile(fileName.slice(0, -5), normalized)];
141
156
  }
142
157
  catch (error) {
143
158
  diagLog('Skipping unreadable leaderboard profile', {
@@ -148,10 +163,66 @@ export function loadLeaderboardProfiles() {
148
163
  }
149
164
  });
150
165
  }
151
- export function loadLeaderboard() {
166
+ export function loadLeaderboard(team) {
152
167
  return loadLeaderboardProfiles()
153
- .map(toLeaderboardEntry)
154
- .sort(compareEntries);
168
+ .filter((profile) => hasTeamMatch(profile.teams, team))
169
+ .map(toProfileEntry)
170
+ .sort(compareProfileEntries);
171
+ }
172
+ export function loadTeamLeaderboard() {
173
+ const teams = new Map();
174
+ const teamAreas = new Map();
175
+ for (const profile of loadLeaderboardProfiles()) {
176
+ if (profile.teams.length === 0)
177
+ continue;
178
+ const allTimeEntry = toProfileEntry(profile);
179
+ const areaTotals = profile.contributions.reduce((totals, contribution) => {
180
+ for (const area of contribution.areas) {
181
+ totals[area] = (totals[area] || 0) + contribution.points;
182
+ }
183
+ return totals;
184
+ }, {});
185
+ for (const team of profile.teams) {
186
+ const key = teamKey(team);
187
+ const existing = teams.get(key) ?? {
188
+ team,
189
+ totalPoints: 0,
190
+ level: 1,
191
+ memberCount: 0,
192
+ analyzedPRs: 0,
193
+ primaryArea: undefined,
194
+ lastActivityAt: undefined,
195
+ members: [],
196
+ };
197
+ const areaTotalsForTeam = teamAreas.get(key) ?? {};
198
+ existing.totalPoints += allTimeEntry.totalPoints;
199
+ existing.analyzedPRs += allTimeEntry.analyzedPRs;
200
+ existing.lastActivityAt = !existing.lastActivityAt
201
+ ? allTimeEntry.lastActivityAt
202
+ : (Date.parse(allTimeEntry.lastActivityAt ?? '') > Date.parse(existing.lastActivityAt)
203
+ ? allTimeEntry.lastActivityAt
204
+ : existing.lastActivityAt);
205
+ existing.members.push({
206
+ storageKey: profile.storageKey,
207
+ username: profile.username,
208
+ scopeLabel: profile.scopeLabel,
209
+ reportPath: profile.reportPath,
210
+ });
211
+ for (const [area, points] of Object.entries(areaTotals)) {
212
+ areaTotalsForTeam[area] = (areaTotalsForTeam[area] || 0) + points;
213
+ }
214
+ existing.primaryArea = Object.entries(areaTotalsForTeam).sort(([, left], [, right]) => right - left)[0]?.[0] ?? existing.primaryArea;
215
+ teams.set(key, existing);
216
+ teamAreas.set(key, areaTotalsForTeam);
217
+ }
218
+ }
219
+ return [...teams.values()]
220
+ .map((entry) => ({
221
+ ...entry,
222
+ level: calculateLevel(entry.totalPoints).level,
223
+ memberCount: entry.members.length,
224
+ }))
225
+ .sort(compareTeamEntries);
155
226
  }
156
227
  export function saveLeaderboardReport(html) {
157
228
  ensureStorageDir();
@@ -1 +1 @@
1
- {"version":3,"file":"leaderboard.js","sourceRoot":"","sources":["../../src/storage/leaderboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"leaderboard.js","sourceRoot":"","sources":["../../src/storage/leaderboard.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,13 @@
1
+ import type { ProfileSelector } from '../shared/profile-scope.js';
1
2
  export declare const STORAGE_DIR: string;
2
3
  export declare const LEADERBOARD_FILE: string;
3
4
  export declare const LEADERBOARD_REPORT_FILE: string;
4
5
  export declare function ensureStorageDir(): void;
5
6
  export declare function userFilePath(username: string): string;
6
7
  export declare function userReportPath(username: string): string;
8
+ export declare function profileFilePath(selector: ProfileSelector): string;
9
+ export declare function profileReportPath(selector: ProfileSelector): string;
10
+ export declare function profileFilePathByKey(storageKey: string): string;
11
+ export declare function profileReportPathByKey(storageKey: string): string;
12
+ export declare function repositoryStatsReportPath(org: string, repo: string, team?: string): string;
7
13
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +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;AAC3E,eAAO,MAAM,uBAAuB,QAA6C,CAAC;AAElF,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"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,eAAO,MAAM,WAAW,QAAyC,CAAC;AAClE,eAAO,MAAM,gBAAgB,QAA6C,CAAC;AAC3E,eAAO,MAAM,uBAAuB,QAA6C,CAAC;AAElF,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;AAMD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1F"}
@@ -2,6 +2,7 @@ import fs from 'fs';
2
2
  import path from 'path';
3
3
  import os from 'os';
4
4
  import { diagLog } from '../shared/diagnostics.js';
5
+ import { profileStorageKey } from '../shared/profile-scope.js';
5
6
  export const STORAGE_DIR = path.join(os.homedir(), '.quackscore');
6
7
  export const LEADERBOARD_FILE = path.join(STORAGE_DIR, 'leaderboard.json');
7
8
  export const LEADERBOARD_REPORT_FILE = path.join(STORAGE_DIR, 'leaderboard.html');
@@ -17,4 +18,24 @@ export function userFilePath(username) {
17
18
  export function userReportPath(username) {
18
19
  return path.join(STORAGE_DIR, `${username}.html`);
19
20
  }
21
+ function safeFileSegment(value) {
22
+ return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'unknown';
23
+ }
24
+ export function profileFilePath(selector) {
25
+ return path.join(STORAGE_DIR, `${profileStorageKey(selector)}.json`);
26
+ }
27
+ export function profileReportPath(selector) {
28
+ return path.join(STORAGE_DIR, `${profileStorageKey(selector)}.html`);
29
+ }
30
+ export function profileFilePathByKey(storageKey) {
31
+ return path.join(STORAGE_DIR, `${storageKey}.json`);
32
+ }
33
+ export function profileReportPathByKey(storageKey) {
34
+ return path.join(STORAGE_DIR, `${storageKey}.html`);
35
+ }
36
+ export function repositoryStatsReportPath(org, repo, team) {
37
+ const base = `stats-${safeFileSegment(org)}-${safeFileSegment(repo)}`;
38
+ const suffix = team ? `-team-${safeFileSegment(team)}` : '';
39
+ return path.join(STORAGE_DIR, `${base}${suffix}.html`);
40
+ }
20
41
  //# sourceMappingURL=paths.js.map
@@ -1 +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;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAElF,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"}
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;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG/D,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;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;AAElF,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;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAyB;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAyB;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,UAAU,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAW,EAAE,IAAY,EAAE,IAAa;IAChF,MAAM,IAAI,GAAG,SAAS,eAAe,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,GAAG,MAAM,OAAO,CAAC,CAAC;AACzD,CAAC"}
@@ -1,3 +1,6 @@
1
- export declare function getUserReportPath(username: string): string;
2
- export declare function saveReport(username: string, html: string): string;
1
+ import type { ProfileSelector } from '../shared/profile-scope.js';
2
+ import type { ProfileScope } from '../shared/types.js';
3
+ export declare function getUserReportPath(selectorOrUsername: ProfileSelector | string, scope?: ProfileScope): string;
4
+ export declare function saveReport(selectorOrUsername: ProfileSelector | string, html: string, scope?: ProfileScope): string;
5
+ export declare function saveRepositoryStatsReport(org: string, repo: string, team: string | undefined, html: string): string;
3
6
  //# sourceMappingURL=report.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/storage/report.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,wBAAgB,iBAAiB,CAAC,kBAAkB,EAAE,eAAe,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAiB5G;AAED,wBAAgB,UAAU,CAAC,kBAAkB,EAAE,eAAe,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,MAAM,CAcnH;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYnH"}
@@ -1,17 +1,47 @@
1
1
  import fs from 'fs';
2
- import { ensureStorageDir, userReportPath } from './paths.js';
2
+ import { ensureStorageDir, profileReportPath, repositoryStatsReportPath, userReportPath } from './paths.js';
3
3
  import { diagLog } from '../shared/diagnostics.js';
4
- export function getUserReportPath(username) {
4
+ import { profileSelector, profileStorageKey } from '../shared/profile-scope.js';
5
+ export function getUserReportPath(selectorOrUsername, scope) {
5
6
  ensureStorageDir();
6
- const reportPath = userReportPath(username);
7
- diagLog('Resolved user report path', { username, reportPath });
8
- return reportPath;
7
+ const selector = typeof selectorOrUsername === 'string'
8
+ ? profileSelector(selectorOrUsername, scope)
9
+ : selectorOrUsername;
10
+ const reportPath = profileReportPath(selector);
11
+ const legacyPath = !selector.organisation && !selector.repository ? userReportPath(selector.username) : undefined;
12
+ const resolvedPath = fs.existsSync(reportPath)
13
+ ? reportPath
14
+ : (legacyPath && fs.existsSync(legacyPath) ? legacyPath : reportPath);
15
+ diagLog('Resolved user report path', {
16
+ username: selector.username,
17
+ storageKey: profileStorageKey(selector),
18
+ reportPath: resolvedPath,
19
+ legacyFallback: legacyPath && resolvedPath === legacyPath,
20
+ });
21
+ return resolvedPath;
9
22
  }
10
- export function saveReport(username, html) {
23
+ export function saveReport(selectorOrUsername, html, scope) {
11
24
  ensureStorageDir();
12
- const reportPath = userReportPath(username);
25
+ const selector = typeof selectorOrUsername === 'string'
26
+ ? profileSelector(selectorOrUsername, scope)
27
+ : selectorOrUsername;
28
+ const reportPath = profileReportPath(selector);
13
29
  diagLog('Writing report file', {
14
- username,
30
+ username: selector.username,
31
+ storageKey: profileStorageKey(selector),
32
+ reportPath,
33
+ htmlLength: html.length,
34
+ });
35
+ fs.writeFileSync(reportPath, html, 'utf-8');
36
+ return reportPath;
37
+ }
38
+ export function saveRepositoryStatsReport(org, repo, team, html) {
39
+ ensureStorageDir();
40
+ const reportPath = repositoryStatsReportPath(org, repo, team);
41
+ diagLog('Writing repository stats report file', {
42
+ org,
43
+ repo,
44
+ team,
15
45
  reportPath,
16
46
  htmlLength: html.length,
17
47
  });
@@ -1 +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"}
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,iBAAiB,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAIhF,MAAM,UAAU,iBAAiB,CAAC,kBAA4C,EAAE,KAAoB;IAClG,gBAAgB,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,OAAO,kBAAkB,KAAK,QAAQ;QACrD,CAAC,CAAC,eAAe,CAAC,kBAAkB,EAAE,KAAK,CAAC;QAC5C,CAAC,CAAC,kBAAkB,CAAC;IACvB,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClH,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAC5C,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACxE,OAAO,CAAC,2BAA2B,EAAE;QACnC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,UAAU,EAAE,iBAAiB,CAAC,QAAQ,CAAC;QACvC,UAAU,EAAE,YAAY;QACxB,cAAc,EAAE,UAAU,IAAI,YAAY,KAAK,UAAU;KAC1D,CAAC,CAAC;IACH,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,kBAA4C,EAAE,IAAY,EAAE,KAAoB;IACzG,gBAAgB,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,OAAO,kBAAkB,KAAK,QAAQ;QACrD,CAAC,CAAC,eAAe,CAAC,kBAAkB,EAAE,KAAK,CAAC;QAC5C,CAAC,CAAC,kBAAkB,CAAC;IACvB,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,CAAC,qBAAqB,EAAE;QAC7B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,UAAU,EAAE,iBAAiB,CAAC,QAAQ,CAAC;QACvC,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;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAW,EAAE,IAAY,EAAE,IAAwB,EAAE,IAAY;IACzG,gBAAgB,EAAE,CAAC;IACnB,MAAM,UAAU,GAAG,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9D,OAAO,CAAC,sCAAsC,EAAE;QAC9C,GAAG;QACH,IAAI;QACJ,IAAI;QACJ,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"}
@@ -1,4 +1,5 @@
1
1
  import type { UserData } from '../shared/types.js';
2
+ import type { ProfileSelector } from '../shared/profile-scope.js';
2
3
  export declare function saveUserData(data: UserData): void;
3
- export declare function loadUserData(username: string): UserData | null;
4
+ export declare function loadUserData(selectorOrUsername: ProfileSelector | string, scope?: UserData['scope']): UserData | null;
4
5
  //# sourceMappingURL=user.d.ts.map
@@ -1 +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;AAKnD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAYjD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQ9D"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/storage/user.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAWnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAcjD;AAED,wBAAgB,YAAY,CAAC,kBAAkB,EAAE,eAAe,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,IAAI,CAoBrH"}
@@ -1,13 +1,16 @@
1
1
  import fs from 'fs';
2
- import { ensureStorageDir, userFilePath } from './paths.js';
2
+ import { ensureStorageDir, profileFilePath, userFilePath } from './paths.js';
3
3
  import { diagLog } from '../shared/diagnostics.js';
4
4
  import { normalizeTechnologies } from '../shared/technologies.js';
5
+ import { normalizeProfileScope, normalizeTeams, normalizeUserDataShape, profileSelector, profileStorageKey, } from '../shared/profile-scope.js';
5
6
  export function saveUserData(data) {
6
7
  ensureStorageDir();
7
- const filePath = userFilePath(data.username);
8
8
  const normalized = normalizeUserData(data);
9
+ const selector = profileSelector(normalized.username, normalized.scope);
10
+ const filePath = profileFilePath(selector);
9
11
  diagLog('Writing user data file', {
10
12
  username: normalized.username,
13
+ storageKey: profileStorageKey(selector),
11
14
  filePath,
12
15
  prCount: normalized.prs.length,
13
16
  totalPoints: normalized.stats.totalPoints,
@@ -15,14 +18,26 @@ export function saveUserData(data) {
15
18
  });
16
19
  fs.writeFileSync(filePath, JSON.stringify(normalized, null, 2), 'utf-8');
17
20
  }
18
- export function loadUserData(username) {
19
- const file = userFilePath(username);
20
- const exists = fs.existsSync(file);
21
- diagLog('Loading user data file', { username, filePath: file, exists });
22
- if (!exists)
21
+ export function loadUserData(selectorOrUsername, scope) {
22
+ const selector = typeof selectorOrUsername === 'string'
23
+ ? profileSelector(selectorOrUsername, scope)
24
+ : selectorOrUsername;
25
+ const file = profileFilePath(selector);
26
+ const legacyFile = !selector.organisation && !selector.repository ? userFilePath(selector.username) : undefined;
27
+ const existingFile = fs.existsSync(file)
28
+ ? file
29
+ : (legacyFile && fs.existsSync(legacyFile) ? legacyFile : file);
30
+ diagLog('Loading user data file', {
31
+ username: selector.username,
32
+ storageKey: profileStorageKey(selector),
33
+ filePath: existingFile,
34
+ exists: fs.existsSync(existingFile),
35
+ legacyFallback: legacyFile && existingFile === legacyFile,
36
+ });
37
+ if (!fs.existsSync(existingFile))
23
38
  return null;
24
- const raw = fs.readFileSync(file, 'utf-8');
25
- diagLog('Loaded user data file contents', { username, bytes: raw.length });
39
+ const raw = fs.readFileSync(existingFile, 'utf-8');
40
+ diagLog('Loaded user data file contents', { username: selector.username, bytes: raw.length });
26
41
  return normalizeUserData(JSON.parse(raw));
27
42
  }
28
43
  function normalizeUserData(data) {
@@ -33,11 +48,13 @@ function normalizeUserData(data) {
33
48
  }
34
49
  }
35
50
  return {
36
- ...data,
51
+ ...normalizeUserDataShape(data),
37
52
  stats: {
38
53
  ...data.stats,
39
54
  technologies: normalizedTechnologyTotals,
40
55
  },
56
+ scope: normalizeProfileScope(data.scope),
57
+ teams: normalizeTeams(data.teams),
41
58
  prs: data.prs.map((pr) => pr.analysis
42
59
  ? {
43
60
  ...pr,
@@ -1 +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,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;AAC3E,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,MAAM,0BAA0B,GAA2B,EAAE,CAAC;IAE9D,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;QACjF,KAAK,MAAM,UAAU,IAAI,qBAAqB,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC7D,0BAA0B,CAAC,UAAU,CAAC,GAAG,CAAC,0BAA0B,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;QAClG,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,IAAI;QACP,KAAK,EAAE;YACL,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,0BAA0B;SACzC;QACD,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"}
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/storage/user.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quackscore",
3
- "version": "0.2.5",
3
+ "version": "0.4.0",
4
4
  "description": "Analyze GitHub activity and generate a Duck RPG-style developer card",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -36,14 +36,21 @@
36
36
  "url": "https://github.com/BatAndDuck/quackscore/issues"
37
37
  },
38
38
  "dependencies": {
39
- "@ai-sdk/anthropic": "^1.0.0",
40
- "@ai-sdk/google": "^1.0.0",
41
- "@ai-sdk/openai": "^1.0.0",
39
+ "@ai-sdk/amazon-bedrock": "^4.0.87",
40
+ "@ai-sdk/anthropic": "^3.0.64",
41
+ "@ai-sdk/azure": "^3.0.50",
42
+ "@ai-sdk/deepseek": "^2.0.26",
43
+ "@ai-sdk/google": "^3.0.55",
44
+ "@ai-sdk/google-vertex": "^4.0.98",
45
+ "@ai-sdk/groq": "^3.0.32",
46
+ "@ai-sdk/mistral": "^3.0.27",
47
+ "@ai-sdk/openai": "^3.0.49",
48
+ "@ai-sdk/xai": "^3.0.75",
42
49
  "@octokit/rest": "^20.1.1",
43
- "ai": "^4.0.0",
50
+ "ai": "^6.0.143",
44
51
  "chalk": "^5.3.0",
45
52
  "commander": "^12.1.0",
46
- "ollama-ai-provider": "^1.0.0",
53
+ "ollama-ai-provider": "^1.2.0",
47
54
  "open": "^10.1.0",
48
55
  "zod": "^3.23.8"
49
56
  },