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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 BatAndDuck
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# 🦆 quackscore
|
|
2
|
+
|
|
3
|
+
> *"Every PR merged is a feather in your cap. Or your tail. Ducks aren't picky."*
|
|
4
|
+
|
|
5
|
+
**quackscore** turns your GitHub pull request history into a Duck RPG-style developer card. It fetches your merged PRs, scores them, classifies them with an LLM, and generates a slick local HTML report — because your contributions deserve more than a green square.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npx quackscore create <your-github-username>
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
That's it. Quack.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## What it does
|
|
16
|
+
|
|
17
|
+
- Fetches your merged pull requests from GitHub
|
|
18
|
+
- Uses an LLM to classify each PR (complexity, area, type, technologies)
|
|
19
|
+
- Awards points and levels based on your contribution history
|
|
20
|
+
- Generates a local HTML developer card you can be proud of
|
|
21
|
+
- Stores history locally so incremental updates are fast
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Requirements
|
|
26
|
+
|
|
27
|
+
- Node.js 18+
|
|
28
|
+
- `QUACKSCORE_GH_TOKEN` — a GitHub personal access token
|
|
29
|
+
- `QUACKSCORE_LLM_API_KEY` — API key for your chosen LLM provider
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm install -g quackscore
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Or run without installing:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npx quackscore --help
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Supported LLM providers
|
|
48
|
+
|
|
49
|
+
| Provider | Value |
|
|
50
|
+
|---|---|
|
|
51
|
+
| Anthropic | `anthropic` |
|
|
52
|
+
| OpenAI | `openai` |
|
|
53
|
+
| Google | `google` |
|
|
54
|
+
| OpenRouter | `openrouter` |
|
|
55
|
+
| MiniMax | `minimax` |
|
|
56
|
+
| Ollama (local) | `ollama` |
|
|
57
|
+
|
|
58
|
+
All remote providers use `QUACKSCORE_LLM_API_KEY`. Ollama needs no key.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Quick start
|
|
63
|
+
|
|
64
|
+
### 1. Set environment variables
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
export QUACKSCORE_GH_TOKEN=<your-github-token>
|
|
68
|
+
export QUACKSCORE_LLM_API_KEY=<your-llm-api-key>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2. Pick your LLM provider
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
quackscore init --provider anthropic --model claude-haiku-4-5-20251001
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Config is saved to `~/.quackscore/config.json`.
|
|
78
|
+
|
|
79
|
+
### 3. Generate your card
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
quackscore create <github-username>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Filter by org or repo:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
quackscore create <github-username> --organisation <org> --repository <repo>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 4. Update later (only new PRs)
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
quackscore update <github-username>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 5. Re-open a saved card
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
quackscore show <github-username>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 6. Leaderboard
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
quackscore leaderboard
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 7. Try it without credentials
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
quackscore mock-report
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Generates a demo card from 20 hardcoded PRs. No GitHub or LLM key needed.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Other provider examples
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# OpenAI
|
|
123
|
+
quackscore init --provider openai --model gpt-4o-mini
|
|
124
|
+
|
|
125
|
+
# Google
|
|
126
|
+
quackscore init --provider google --model gemini-2.0-flash
|
|
127
|
+
|
|
128
|
+
# OpenRouter
|
|
129
|
+
quackscore init --provider openrouter --model anthropic/claude-haiku-4
|
|
130
|
+
|
|
131
|
+
# MiniMax
|
|
132
|
+
quackscore init --provider minimax --model MiniMax-M2.7
|
|
133
|
+
|
|
134
|
+
# Ollama (local)
|
|
135
|
+
quackscore init --provider ollama --model llama3.2
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Data storage
|
|
141
|
+
|
|
142
|
+
Everything lives in `~/.quackscore/`:
|
|
143
|
+
|
|
144
|
+
| File | Contents |
|
|
145
|
+
|---|---|
|
|
146
|
+
| `config.json` | Provider and model settings |
|
|
147
|
+
| `<username>.json` | Analyzed PR data |
|
|
148
|
+
| `<username>.html` | Your generated developer card |
|
|
149
|
+
| `leaderboard.json` | Local leaderboard cache |
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Notes
|
|
154
|
+
|
|
155
|
+
- The GitHub token is required regardless of LLM setup.
|
|
156
|
+
- API keys are read from environment variables only — never written to disk.
|
|
157
|
+
- `create` analyzes all accessible merged PRs; `update` only fetches new ones.
|
|
158
|
+
- Add `--diagnostics` to any command for detailed internal tracing.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiKvF"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { fetchUserPRs } from '../github/index.js';
|
|
2
|
+
import { getModel, analyzePR, generateCharacter } from '../llm/index.js';
|
|
3
|
+
import { calculatePRPoints, aggregateStats } from '../scoring/index.js';
|
|
4
|
+
import { saveUserData, saveReport } from '../storage/index.js';
|
|
5
|
+
import { generateHTML } from '../report/index.js';
|
|
6
|
+
import { loadConfig } from '../config/index.js';
|
|
7
|
+
import { rpgHeader, rpgLog, rpgInfo, rpgProgress, rpgSuccess, rpgError } from '../shared/ui.js';
|
|
8
|
+
import { diagError, diagLog } from '../shared/diagnostics.js';
|
|
9
|
+
import open from 'open';
|
|
10
|
+
export async function runCreate(username, options) {
|
|
11
|
+
diagLog('Starting create command', {
|
|
12
|
+
username,
|
|
13
|
+
options,
|
|
14
|
+
githubTokenPresent: Boolean(process.env['QUACKSCORE_GH_TOKEN']),
|
|
15
|
+
});
|
|
16
|
+
diagLog('Create command is running in full rebuild mode', {
|
|
17
|
+
username,
|
|
18
|
+
checkpointStrategy: 'ignore-local-cache-and-recompute-from-fetched-prs',
|
|
19
|
+
});
|
|
20
|
+
const token = process.env['QUACKSCORE_GH_TOKEN'];
|
|
21
|
+
if (!token) {
|
|
22
|
+
rpgError('QUACKSCORE_GH_TOKEN environment variable not set');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
let model;
|
|
26
|
+
try {
|
|
27
|
+
const config = loadConfig();
|
|
28
|
+
diagLog('Loaded configuration for create', config);
|
|
29
|
+
model = getModel(config);
|
|
30
|
+
diagLog('Instantiated model for create');
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
diagError('Create command failed while loading model configuration', err);
|
|
34
|
+
rpgError(err.message);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
rpgHeader(`Quackscore — ${username}`);
|
|
38
|
+
rpgLog('Sharpening the beak...');
|
|
39
|
+
rpgInfo('Reading ancient PR scrolls...');
|
|
40
|
+
let prs;
|
|
41
|
+
try {
|
|
42
|
+
const fetchStartedAt = Date.now();
|
|
43
|
+
prs = await fetchUserPRs(username, token, {
|
|
44
|
+
org: options.org,
|
|
45
|
+
repo: options.repository,
|
|
46
|
+
});
|
|
47
|
+
diagLog('Fetched PRs for create', {
|
|
48
|
+
username,
|
|
49
|
+
durationMs: Date.now() - fetchStartedAt,
|
|
50
|
+
totalPRs: prs.length,
|
|
51
|
+
repos: [...new Set(prs.map((pr) => pr.repo))],
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
diagError('Create command failed while fetching PRs', err, { username, options });
|
|
56
|
+
rpgError(`Failed to fetch PRs: ${err.message}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
rpgSuccess(`Found ${prs.length} merged PRs`);
|
|
60
|
+
if (prs.length === 0) {
|
|
61
|
+
rpgInfo('No PRs found. Rebuilding an empty card from scratch.');
|
|
62
|
+
diagLog('Create command fetched zero PRs; continuing to overwrite local profile with empty state', {
|
|
63
|
+
username,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
rpgLog('Evaluating code complexity...');
|
|
68
|
+
for (let i = 0; i < prs.length; i++) {
|
|
69
|
+
const pr = prs[i];
|
|
70
|
+
rpgProgress(i + 1, prs.length, pr.title);
|
|
71
|
+
diagLog('Analyzing PR during create', {
|
|
72
|
+
index: i + 1,
|
|
73
|
+
total: prs.length,
|
|
74
|
+
prNumber: pr.number,
|
|
75
|
+
repo: pr.repo,
|
|
76
|
+
title: pr.title,
|
|
77
|
+
mergedAt: pr.mergedAt,
|
|
78
|
+
additions: pr.additions,
|
|
79
|
+
deletions: pr.deletions,
|
|
80
|
+
diffPresent: Boolean(pr.diff),
|
|
81
|
+
diffLength: pr.diff?.length ?? 0,
|
|
82
|
+
});
|
|
83
|
+
try {
|
|
84
|
+
const analysisStartedAt = Date.now();
|
|
85
|
+
pr.analysis = await analyzePR(pr, model);
|
|
86
|
+
pr.points = calculatePRPoints(pr);
|
|
87
|
+
diagLog('Completed PR analysis during create', {
|
|
88
|
+
prNumber: pr.number,
|
|
89
|
+
durationMs: Date.now() - analysisStartedAt,
|
|
90
|
+
skipped: pr.analysis.skipped,
|
|
91
|
+
complexity: pr.analysis.complexity,
|
|
92
|
+
areas: pr.analysis.areas,
|
|
93
|
+
types: pr.analysis.types,
|
|
94
|
+
technologies: pr.analysis.technologies,
|
|
95
|
+
points: pr.points,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
diagError('PR analysis failed during create', err, {
|
|
100
|
+
prNumber: pr.number,
|
|
101
|
+
repo: pr.repo,
|
|
102
|
+
title: pr.title,
|
|
103
|
+
});
|
|
104
|
+
rpgError(`Skipping PR #${pr.number}: ${err.message}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
rpgLog('Assigning skill points...');
|
|
109
|
+
const stats = aggregateStats(prs);
|
|
110
|
+
diagLog('Aggregated stats for create', {
|
|
111
|
+
totalPoints: stats.totalPoints,
|
|
112
|
+
level: stats.level,
|
|
113
|
+
pointsToNextLevel: stats.pointsToNextLevel,
|
|
114
|
+
analyzedPRs: stats.analyzedPRs,
|
|
115
|
+
totalPRs: stats.totalPRs,
|
|
116
|
+
areaCount: Object.keys(stats.areas).length,
|
|
117
|
+
technologyCount: Object.keys(stats.technologies).length,
|
|
118
|
+
typeCount: Object.keys(stats.types).length,
|
|
119
|
+
});
|
|
120
|
+
let character;
|
|
121
|
+
if (prs.length === 0) {
|
|
122
|
+
diagLog('Skipping character generation during create because there are no PRs to summarize', {
|
|
123
|
+
username,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
rpgLog('Summoning character spirit...');
|
|
128
|
+
const characterStartedAt = Date.now();
|
|
129
|
+
character = await generateCharacter(stats, username, prs, model);
|
|
130
|
+
diagLog('Generated character profile for create', {
|
|
131
|
+
durationMs: Date.now() - characterStartedAt,
|
|
132
|
+
character,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const userData = {
|
|
136
|
+
username,
|
|
137
|
+
lastUpdated: new Date().toISOString(),
|
|
138
|
+
prs,
|
|
139
|
+
stats,
|
|
140
|
+
character,
|
|
141
|
+
};
|
|
142
|
+
saveUserData(userData);
|
|
143
|
+
diagLog('Persisted user data for create', {
|
|
144
|
+
username,
|
|
145
|
+
prCount: userData.prs.length,
|
|
146
|
+
stats: {
|
|
147
|
+
totalPoints: userData.stats.totalPoints,
|
|
148
|
+
level: userData.stats.level,
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
rpgLog('Forging the Quack-Card...');
|
|
152
|
+
const reportStartedAt = Date.now();
|
|
153
|
+
const html = generateHTML(userData);
|
|
154
|
+
const reportPath = saveReport(username, html);
|
|
155
|
+
diagLog('Generated and saved report for create', {
|
|
156
|
+
durationMs: Date.now() - reportStartedAt,
|
|
157
|
+
reportPath,
|
|
158
|
+
htmlLength: html.length,
|
|
159
|
+
});
|
|
160
|
+
rpgSuccess(`Card saved: ${reportPath}`);
|
|
161
|
+
rpgLog('Opening the hall of glory...');
|
|
162
|
+
diagLog('Opening generated report in default browser', { reportPath });
|
|
163
|
+
await open(reportPath);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAK5B,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAWD,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDjE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { saveConfig } from '../config/manager.js';
|
|
2
|
+
import { LLM_API_KEY_ENV, PROVIDER_DEFAULTS, PROVIDER_EXAMPLE_MODELS, } from '../config/types.js';
|
|
3
|
+
import { rpgHeader, rpgSuccess, rpgInfo, rpgError } from '../shared/ui.js';
|
|
4
|
+
import { diagLog } from '../shared/diagnostics.js';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
const VALID_PROVIDERS = [
|
|
7
|
+
'anthropic',
|
|
8
|
+
'openai',
|
|
9
|
+
'google',
|
|
10
|
+
'openrouter',
|
|
11
|
+
'minimax',
|
|
12
|
+
'ollama',
|
|
13
|
+
];
|
|
14
|
+
export async function runInit(options) {
|
|
15
|
+
diagLog('Starting init command', {
|
|
16
|
+
provider: options.provider,
|
|
17
|
+
requestedModel: options.model,
|
|
18
|
+
baseUrl: options.baseUrl,
|
|
19
|
+
});
|
|
20
|
+
if (!VALID_PROVIDERS.includes(options.provider)) {
|
|
21
|
+
rpgError(`Unknown provider "${options.provider}". Valid: ${VALID_PROVIDERS.join(', ')}`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
const model = options.model ?? PROVIDER_DEFAULTS[options.provider];
|
|
25
|
+
diagLog('Resolved init model selection', {
|
|
26
|
+
provider: options.provider,
|
|
27
|
+
resolvedModel: model,
|
|
28
|
+
usedDefaultModel: !options.model,
|
|
29
|
+
});
|
|
30
|
+
saveConfig({ provider: options.provider, model, baseUrl: options.baseUrl });
|
|
31
|
+
diagLog('Saved configuration from init', {
|
|
32
|
+
provider: options.provider,
|
|
33
|
+
model,
|
|
34
|
+
baseUrl: options.baseUrl,
|
|
35
|
+
apiKeyPresent: Boolean(process.env[LLM_API_KEY_ENV]),
|
|
36
|
+
});
|
|
37
|
+
rpgHeader('Quackscore Init');
|
|
38
|
+
rpgSuccess(`Config saved!`);
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log(` Provider : ${chalk.cyan(options.provider)}`);
|
|
41
|
+
console.log(` Model : ${chalk.cyan(model)}`);
|
|
42
|
+
if (options.baseUrl) {
|
|
43
|
+
console.log(` Base URL : ${chalk.cyan(options.baseUrl)}`);
|
|
44
|
+
}
|
|
45
|
+
console.log('');
|
|
46
|
+
if (options.provider !== 'ollama') {
|
|
47
|
+
rpgInfo(`Set your API key before running:`);
|
|
48
|
+
console.log(` ${chalk.yellow(`export ${LLM_API_KEY_ENV}=<your-api-key>`)}`);
|
|
49
|
+
}
|
|
50
|
+
else if (options.provider === 'ollama') {
|
|
51
|
+
rpgInfo('Ollama requires no API key. Make sure Ollama is running locally.');
|
|
52
|
+
}
|
|
53
|
+
console.log('');
|
|
54
|
+
rpgInfo('Example models for this provider:');
|
|
55
|
+
for (const m of PROVIDER_EXAMPLE_MODELS[options.provider]) {
|
|
56
|
+
const marker = m === model ? chalk.green('← selected') : '';
|
|
57
|
+
console.log(` ${chalk.dim('•')} ${m} ${marker}`);
|
|
58
|
+
}
|
|
59
|
+
console.log('');
|
|
60
|
+
rpgSuccess(`Ready! Run: quackscore create <github-username>`);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.d.ts","sourceRoot":"","sources":["../../src/commands/leaderboard.ts"],"names":[],"mappings":"AAKA,wBAAgB,cAAc,IAAI,IAAI,CAkCrC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { loadLeaderboard } from '../storage/index.js';
|
|
2
|
+
import { rpgHeader, rpgInfo } from '../shared/ui.js';
|
|
3
|
+
import { diagLog } from '../shared/diagnostics.js';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
export function runLeaderboard() {
|
|
6
|
+
const entries = loadLeaderboard();
|
|
7
|
+
diagLog('Loaded leaderboard entries', {
|
|
8
|
+
entryCount: entries.length,
|
|
9
|
+
usernames: entries.map((entry) => entry.username),
|
|
10
|
+
});
|
|
11
|
+
rpgHeader('Quackscore Leaderboard');
|
|
12
|
+
if (entries.length === 0) {
|
|
13
|
+
rpgInfo('No players yet. Run quackscore create {user} to get started!');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const medals = ['🥇', '🥈', '🥉'];
|
|
17
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
18
|
+
console.log(chalk.bold(`${'#'.padEnd(4)} ${'Username'.padEnd(25)} ${'Points'.padStart(10)} ${'Level'.padStart(8)}`));
|
|
19
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
20
|
+
for (let i = 0; i < entries.length; i++) {
|
|
21
|
+
const e = entries[i];
|
|
22
|
+
const medal = medals[i] || `${i + 1}.`;
|
|
23
|
+
const row = `${(medal + ' ').padEnd(4)} ${e.username.padEnd(25)} ${String(e.totalPoints).padStart(10)} ${('Lv.' + e.level).padStart(8)}`;
|
|
24
|
+
if (i === 0)
|
|
25
|
+
console.log(chalk.yellow(row));
|
|
26
|
+
else if (i === 1)
|
|
27
|
+
console.log(chalk.gray(row));
|
|
28
|
+
else if (i === 2)
|
|
29
|
+
console.log(chalk.rgb(205, 127, 50)(row));
|
|
30
|
+
else
|
|
31
|
+
console.log(row);
|
|
32
|
+
}
|
|
33
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
34
|
+
console.log(chalk.dim(`\n${entries.length} player(s) on the board.`));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=leaderboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.js","sourceRoot":"","sources":["../../src/commands/leaderboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,OAAO,CAAC,4BAA4B,EAAE;QACpC,UAAU,EAAE,OAAO,CAAC,MAAM;QAC1B,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;KAClD,CAAC,CAAC;IACH,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAEpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,8DAA8D,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAC5F,CACF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACzI,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;aACvC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;aAC1C,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;YACvD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-report.d.ts","sourceRoot":"","sources":["../../src/commands/mock-report.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAkC,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAuQnF,wBAAgB,iBAAiB,IAAI,QAAQ,CAuC5C;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBnD"}
|