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.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -0
  3. package/dist/commands/create.d.ts +6 -0
  4. package/dist/commands/create.d.ts.map +1 -0
  5. package/dist/commands/create.js +165 -0
  6. package/dist/commands/create.js.map +1 -0
  7. package/dist/commands/init.d.ts +8 -0
  8. package/dist/commands/init.d.ts.map +1 -0
  9. package/dist/commands/init.js +62 -0
  10. package/dist/commands/init.js.map +1 -0
  11. package/dist/commands/leaderboard.d.ts +2 -0
  12. package/dist/commands/leaderboard.d.ts.map +1 -0
  13. package/dist/commands/leaderboard.js +36 -0
  14. package/dist/commands/leaderboard.js.map +1 -0
  15. package/dist/commands/mock-report.d.ts +4 -0
  16. package/dist/commands/mock-report.d.ts.map +1 -0
  17. package/dist/commands/mock-report.js +311 -0
  18. package/dist/commands/mock-report.js.map +1 -0
  19. package/dist/commands/show.d.ts +2 -0
  20. package/dist/commands/show.d.ts.map +1 -0
  21. package/dist/commands/show.js +17 -0
  22. package/dist/commands/show.js.map +1 -0
  23. package/dist/commands/update.d.ts +3 -0
  24. package/dist/commands/update.d.ts.map +1 -0
  25. package/dist/commands/update.js +175 -0
  26. package/dist/commands/update.js.map +1 -0
  27. package/dist/config/index.d.ts +4 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +3 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/manager.d.ts +7 -0
  32. package/dist/config/manager.d.ts.map +1 -0
  33. package/dist/config/manager.js +29 -0
  34. package/dist/config/manager.js.map +1 -0
  35. package/dist/config/types.d.ts +14 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +21 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/github/client.d.ts +8 -0
  40. package/dist/github/client.d.ts.map +1 -0
  41. package/dist/github/client.js +241 -0
  42. package/dist/github/client.js.map +1 -0
  43. package/dist/github/index.d.ts +3 -0
  44. package/dist/github/index.d.ts.map +1 -0
  45. package/dist/github/index.js +2 -0
  46. package/dist/github/index.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +93 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/llm/analyzer.d.ts +7 -0
  52. package/dist/llm/analyzer.d.ts.map +1 -0
  53. package/dist/llm/analyzer.js +249 -0
  54. package/dist/llm/analyzer.js.map +1 -0
  55. package/dist/llm/character.d.ts +16 -0
  56. package/dist/llm/character.d.ts.map +1 -0
  57. package/dist/llm/character.js +245 -0
  58. package/dist/llm/character.js.map +1 -0
  59. package/dist/llm/client.d.ts +5 -0
  60. package/dist/llm/client.d.ts.map +1 -0
  61. package/dist/llm/client.js +98 -0
  62. package/dist/llm/client.js.map +1 -0
  63. package/dist/llm/index.d.ts +4 -0
  64. package/dist/llm/index.d.ts.map +1 -0
  65. package/dist/llm/index.js +4 -0
  66. package/dist/llm/index.js.map +1 -0
  67. package/dist/llm/prompts.d.ts +4 -0
  68. package/dist/llm/prompts.d.ts.map +1 -0
  69. package/dist/llm/prompts.js +109 -0
  70. package/dist/llm/prompts.js.map +1 -0
  71. package/dist/llm/providers.d.ts +10 -0
  72. package/dist/llm/providers.d.ts.map +1 -0
  73. package/dist/llm/providers.js +70 -0
  74. package/dist/llm/providers.js.map +1 -0
  75. package/dist/report/generate.d.ts +3 -0
  76. package/dist/report/generate.d.ts.map +1 -0
  77. package/dist/report/generate.js +1540 -0
  78. package/dist/report/generate.js.map +1 -0
  79. package/dist/report/index.d.ts +2 -0
  80. package/dist/report/index.d.ts.map +1 -0
  81. package/dist/report/index.js +2 -0
  82. package/dist/report/index.js.map +1 -0
  83. package/dist/scoring/index.d.ts +3 -0
  84. package/dist/scoring/index.d.ts.map +1 -0
  85. package/dist/scoring/index.js +3 -0
  86. package/dist/scoring/index.js.map +1 -0
  87. package/dist/scoring/points.d.ts +8 -0
  88. package/dist/scoring/points.d.ts.map +1 -0
  89. package/dist/scoring/points.js +28 -0
  90. package/dist/scoring/points.js.map +1 -0
  91. package/dist/scoring/stats.d.ts +3 -0
  92. package/dist/scoring/stats.d.ts.map +1 -0
  93. package/dist/scoring/stats.js +80 -0
  94. package/dist/scoring/stats.js.map +1 -0
  95. package/dist/shared/diagnostics.d.ts +8 -0
  96. package/dist/shared/diagnostics.d.ts.map +1 -0
  97. package/dist/shared/diagnostics.js +99 -0
  98. package/dist/shared/diagnostics.js.map +1 -0
  99. package/dist/shared/pr-summary.d.ts +5 -0
  100. package/dist/shared/pr-summary.d.ts.map +1 -0
  101. package/dist/shared/pr-summary.js +272 -0
  102. package/dist/shared/pr-summary.js.map +1 -0
  103. package/dist/shared/profile-summary.d.ts +5 -0
  104. package/dist/shared/profile-summary.d.ts.map +1 -0
  105. package/dist/shared/profile-summary.js +262 -0
  106. package/dist/shared/profile-summary.js.map +1 -0
  107. package/dist/shared/technologies.d.ts +5 -0
  108. package/dist/shared/technologies.d.ts.map +1 -0
  109. package/dist/shared/technologies.js +211 -0
  110. package/dist/shared/technologies.js.map +1 -0
  111. package/dist/shared/types.d.ts +61 -0
  112. package/dist/shared/types.d.ts.map +1 -0
  113. package/dist/shared/types.js +14 -0
  114. package/dist/shared/types.js.map +1 -0
  115. package/dist/shared/ui.d.ts +7 -0
  116. package/dist/shared/ui.d.ts.map +1 -0
  117. package/dist/shared/ui.js +24 -0
  118. package/dist/shared/ui.js.map +1 -0
  119. package/dist/storage/index.d.ts +4 -0
  120. package/dist/storage/index.d.ts.map +1 -0
  121. package/dist/storage/index.js +4 -0
  122. package/dist/storage/index.js.map +1 -0
  123. package/dist/storage/leaderboard.d.ts +4 -0
  124. package/dist/storage/leaderboard.d.ts.map +1 -0
  125. package/dist/storage/leaderboard.js +37 -0
  126. package/dist/storage/leaderboard.js.map +1 -0
  127. package/dist/storage/paths.d.ts +6 -0
  128. package/dist/storage/paths.d.ts.map +1 -0
  129. package/dist/storage/paths.js +19 -0
  130. package/dist/storage/paths.js.map +1 -0
  131. package/dist/storage/report.d.ts +3 -0
  132. package/dist/storage/report.d.ts.map +1 -0
  133. package/dist/storage/report.js +21 -0
  134. package/dist/storage/report.js.map +1 -0
  135. package/dist/storage/user.d.ts +4 -0
  136. package/dist/storage/user.d.ts.map +1 -0
  137. package/dist/storage/user.js +44 -0
  138. package/dist/storage/user.js.map +1 -0
  139. package/package.json +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/llm/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { getModel } from './providers.js';
2
+ export { analyzePR } from './analyzer.js';
3
+ export { generateCharacter } from './character.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { getModel } from './providers.js';
2
+ export { analyzePR } from './analyzer.js';
3
+ export { generateCharacter } from './character.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type PRData } from '../shared/types.js';
2
+ export declare function buildPRPrompt(pr: PRData): string;
3
+ export declare function buildCharacterPrompt(username: string, patternNotes: string[], highlights: string[]): string;
4
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/llm/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5F,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAoEhD;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAoC3G"}
@@ -0,0 +1,109 @@
1
+ import { AREA_TAXONOMY, CONTRIBUTION_TYPE_TAXONOMY } from '../shared/types.js';
2
+ import { TECHNOLOGY_TAXONOMY } from '../shared/technologies.js';
3
+ export function buildPRPrompt(pr) {
4
+ return `You are a technical code reviewer analyzing a Pull Request for an RPG-style developer scoring system.
5
+
6
+ PR Title: ${pr.title}
7
+ Repository: ${pr.repo}
8
+ Additions: ${pr.additions} lines
9
+ Deletions: ${pr.deletions} lines
10
+
11
+ ${pr.diff ? `Diff:\n\`\`\`\n${pr.diff}\n\`\`\`` : '(diff unavailable)'}
12
+
13
+ Analyze this PR and return a JSON object with EXACTLY this structure:
14
+ {
15
+ "skipped": boolean, // true if this is autogenerated code, migrations, lock files, compiled output, vendor/dist, or repository governance/legal/community template work
16
+ "skipReason": "reason if skipped",
17
+ "complexity": number, // 1-10: 1=trivial (typos/formatting), 5=medium feature/refactor, 10=major architecture
18
+ "areas": string[], // use ONLY exact values from the allowed list below
19
+ "types": string[], // use ONLY exact values from the allowed list below
20
+ "technologies": string[], // use ONLY broad categories from the allowed list below
21
+ "summary": "concise description max 200 chars"
22
+ }
23
+
24
+ Allowed areas: ${AREA_TAXONOMY.join(', ')}
25
+ Allowed contribution types: ${CONTRIBUTION_TYPE_TAXONOMY.join(', ')}
26
+ Allowed technologies: ${TECHNOLOGY_TAXONOMY.join(', ')}
27
+
28
+ Skip these kinds of PRs:
29
+ - LICENSE, CODE_OF_CONDUCT, CONTRIBUTING, SECURITY, CODEOWNERS
30
+ - issue/PR templates and repository governance/community files
31
+ - autogenerated code, migrations, lock files, vendor/dist, compiled output
32
+
33
+ Area mapping rules:
34
+ - ci_cd, pipelines, deployment, infra -> devops
35
+ - frontend, ui, accessibility -> web_frontend
36
+ - api, server -> backend
37
+ - testing -> qa
38
+
39
+ Keep technologies broad, not library-level.
40
+ Examples:
41
+ - redux, nextjs -> react
42
+ - express, nest_js, bun, deno -> nodejs
43
+ - django, flask, fastapi -> python
44
+ - spring_boot -> java
45
+ - laravel -> php
46
+ - rails -> ruby
47
+ - postgresql, sqlite, mariadb -> sql
48
+ - mongodb, redis, kafka, rabbitmq -> data
49
+ - graphql, grpc, openapi -> api
50
+ - github_actions, jenkins, circleci -> ci_cd
51
+ - feature, enhancement -> new_development
52
+ - fix, hotfix -> bugfix
53
+
54
+ For the "summary" field:
55
+ - Describe WHAT was actually done and WHY it matters in one concise sentence
56
+ - Name the subsystem, workflow, or problem that changed
57
+ - Focus on concrete work and practical impact, NOT on technologies, areas, or taxonomy labels
58
+ - If the title is already specific, keep that specificity and add the consequence or benefit
59
+ - Good examples:
60
+ - "Refactored the config loader so new modules can inject settings without touching global state"
61
+ - "Fixed the auth refresh race that could log users out during parallel API calls"
62
+ - "Added audit-log export jobs so large tenants can retrieve history without timing out"
63
+ - Bad examples:
64
+ - "fixes correctness or runtime issues with emphasis on ai, backend, sre using typescript, nodejs, api"
65
+ - "Adds or extends core capability, improves documentation and packaging"
66
+ - "Improves the implementation across multiple areas"
67
+ - Do not list technologies or categories unless they are the literal subject of the change
68
+ - Max 200 chars
69
+
70
+ Return ONLY valid JSON, no markdown, no explanation.`;
71
+ }
72
+ export function buildCharacterPrompt(username, patternNotes, highlights) {
73
+ return `You are a creative RPG narrator generating a player card for a developer.
74
+
75
+ Developer: ${username}
76
+
77
+ Observed working patterns:
78
+ ${patternNotes.length > 0 ? patternNotes.map((note) => `- ${note}`).join('\n') : '- Historical patterns are limited.'}
79
+
80
+ Representative contributions:
81
+ ${highlights.length > 0 ? highlights.map((highlight) => `- ${highlight}`).join('\n') : '- No representative contribution highlights available.'}
82
+
83
+ Generate a creative RPG-style character title and a character description summary.
84
+ The output must reflect the developer's actual profile — their strengths, tendencies, and personality as a coder.
85
+
86
+ Title rules:
87
+ - 4-60 chars, meaningful RPG class/archetype (e.g. "Backend Battle Duck", "Full-Stack Shadow Ninja")
88
+ - Do not use generic filler
89
+
90
+ Summary rules:
91
+ - 300-600 chars
92
+ - Write the summary for an engineering manager who wants to understand the person's practical impact and likely importance to the team
93
+ - Describe their main ownership area, the kind of work they repeatedly take on, and whether the PR history points more to foundations/core architecture, high-leverage delivery, enablement/support, or routine implementation
94
+ - Focus on what they changed and what that means for the team, not on tools or taxonomy
95
+ - Base the bio on the observed patterns and representative contributions above
96
+ - Keep some personality, but prioritize clear impact assessment over RPG flavor
97
+ - Do not start with the developer's username or "This developer"
98
+ - Do not mention the username, organization, repository names, level, XP, PR counts, technologies, or taxonomy labels directly
99
+ - Avoid phrases like "strongest in", "armed with", "org-scoped report", or "analyzed PRs"
100
+ - Do not use filler like "A good example is"
101
+ - Do not use ellipses or placeholders
102
+
103
+ Return ONLY valid JSON:
104
+ {
105
+ "title": "Duck RPG title",
106
+ "summary": "Manager-facing character bio, 300-600 chars"
107
+ }`;
108
+ }
109
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/llm/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAe,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,OAAO;;YAEG,EAAE,CAAC,KAAK;cACN,EAAE,CAAC,IAAI;aACR,EAAE,CAAC,SAAS;aACZ,EAAE,CAAC,SAAS;;EAEvB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,oBAAoB;;;;;;;;;;;;;iBAarD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;8BACX,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC3C,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qDA4CD,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,YAAsB,EAAE,UAAoB;IACjG,OAAO;;aAEI,QAAQ;;;EAGnB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oCAAoC;;;EAGnH,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,wDAAwD;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B7I,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { LanguageModelV1 } from 'ai';
2
+ import { type QuackConfig } from '../config/types.js';
3
+ /**
4
+ * Returns a Vercel AI SDK LanguageModelV1 for the given config.
5
+ *
6
+ * Remote provider API keys are read from QUACKSCORE_LLM_API_KEY
7
+ * (never stored in config). Ollama requires no API key.
8
+ */
9
+ export declare function getModel(config: QuackConfig): LanguageModelV1;
10
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/llm/providers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAC1C,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGvE;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAoD7D"}
@@ -0,0 +1,70 @@
1
+ import { createAnthropic } from '@ai-sdk/anthropic';
2
+ import { createOpenAI } from '@ai-sdk/openai';
3
+ import { createGoogleGenerativeAI } from '@ai-sdk/google';
4
+ import { createOllama } from 'ollama-ai-provider';
5
+ import { LLM_API_KEY_ENV } from '../config/types.js';
6
+ import { diagLog } from '../shared/diagnostics.js';
7
+ /**
8
+ * Returns a Vercel AI SDK LanguageModelV1 for the given config.
9
+ *
10
+ * Remote provider API keys are read from QUACKSCORE_LLM_API_KEY
11
+ * (never stored in config). Ollama requires no API key.
12
+ */
13
+ export function getModel(config) {
14
+ const apiKey = config.provider === 'ollama' ? undefined : getSharedApiKey();
15
+ diagLog('Resolving language model provider', {
16
+ provider: config.provider,
17
+ model: config.model,
18
+ baseUrl: config.baseUrl,
19
+ apiKeyPresent: Boolean(apiKey),
20
+ });
21
+ switch (config.provider) {
22
+ case 'anthropic':
23
+ return createAnthropic({ apiKey })(config.model);
24
+ case 'openai':
25
+ return createOpenAI({
26
+ apiKey,
27
+ ...(config.baseUrl ? { baseURL: config.baseUrl, compatibility: 'compatible' } : {}),
28
+ })(config.model);
29
+ case 'google':
30
+ return createGoogleGenerativeAI({ apiKey })(config.model);
31
+ case 'openrouter': {
32
+ const or = createOpenAI({
33
+ baseURL: 'https://openrouter.ai/api/v1',
34
+ apiKey,
35
+ compatibility: 'compatible',
36
+ name: 'openrouter',
37
+ });
38
+ return or(config.model);
39
+ }
40
+ case 'minimax': {
41
+ const minimax = createOpenAI({
42
+ baseURL: config.baseUrl ?? 'https://api.minimax.io/v1',
43
+ apiKey,
44
+ compatibility: 'compatible',
45
+ name: 'minimax',
46
+ });
47
+ return minimax(config.model);
48
+ }
49
+ case 'ollama': {
50
+ const ol = createOllama({ baseURL: config.baseUrl ?? 'http://localhost:11434/api' });
51
+ return ol(config.model);
52
+ }
53
+ default: {
54
+ const p = config.provider;
55
+ throw new Error(`Unsupported provider: ${p}`);
56
+ }
57
+ }
58
+ }
59
+ function getSharedApiKey() {
60
+ const apiKey = process.env[LLM_API_KEY_ENV];
61
+ if (!apiKey) {
62
+ throw new Error(`${LLM_API_KEY_ENV} environment variable not set`);
63
+ }
64
+ diagLog('Resolved shared LLM API key from environment', {
65
+ envVar: LLM_API_KEY_ENV,
66
+ keyLength: apiKey.length,
67
+ });
68
+ return apiKey;
69
+ }
70
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/llm/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { UserData } from '../shared/types.js';
2
+ export declare function generateHTML(data: UserData): string;
3
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/report/generate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA2M3D,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAs0CnD"}