preflight-dev 3.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 +172 -0
- package/bin/cli.js +11 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +154 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.js +118 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/embeddings.d.ts +11 -0
- package/dist/lib/embeddings.js +88 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/files.d.ts +15 -0
- package/dist/lib/files.js +60 -0
- package/dist/lib/files.js.map +1 -0
- package/dist/lib/git-extractor.d.ts +9 -0
- package/dist/lib/git-extractor.js +116 -0
- package/dist/lib/git-extractor.js.map +1 -0
- package/dist/lib/git.d.ts +29 -0
- package/dist/lib/git.js +86 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/session-parser.d.ts +45 -0
- package/dist/lib/session-parser.js +267 -0
- package/dist/lib/session-parser.js.map +1 -0
- package/dist/lib/state.d.ts +21 -0
- package/dist/lib/state.js +86 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/timeline-db.d.ts +67 -0
- package/dist/lib/timeline-db.js +380 -0
- package/dist/lib/timeline-db.js.map +1 -0
- package/dist/lib/triage.d.ts +29 -0
- package/dist/lib/triage.js +193 -0
- package/dist/lib/triage.js.map +1 -0
- package/dist/profiles.d.ts +3 -0
- package/dist/profiles.js +65 -0
- package/dist/profiles.js.map +1 -0
- package/dist/tools/audit-workspace.d.ts +2 -0
- package/dist/tools/audit-workspace.js +86 -0
- package/dist/tools/audit-workspace.js.map +1 -0
- package/dist/tools/checkpoint.d.ts +2 -0
- package/dist/tools/checkpoint.js +108 -0
- package/dist/tools/checkpoint.js.map +1 -0
- package/dist/tools/clarify-intent.d.ts +2 -0
- package/dist/tools/clarify-intent.js +180 -0
- package/dist/tools/clarify-intent.js.map +1 -0
- package/dist/tools/enrich-agent-task.d.ts +2 -0
- package/dist/tools/enrich-agent-task.js +97 -0
- package/dist/tools/enrich-agent-task.js.map +1 -0
- package/dist/tools/generate-scorecard.d.ts +2 -0
- package/dist/tools/generate-scorecard.js +617 -0
- package/dist/tools/generate-scorecard.js.map +1 -0
- package/dist/tools/log-correction.d.ts +2 -0
- package/dist/tools/log-correction.js +76 -0
- package/dist/tools/log-correction.js.map +1 -0
- package/dist/tools/onboard-project.d.ts +2 -0
- package/dist/tools/onboard-project.js +179 -0
- package/dist/tools/onboard-project.js.map +1 -0
- package/dist/tools/preflight-check.d.ts +2 -0
- package/dist/tools/preflight-check.js +229 -0
- package/dist/tools/preflight-check.js.map +1 -0
- package/dist/tools/prompt-score.d.ts +2 -0
- package/dist/tools/prompt-score.js +132 -0
- package/dist/tools/prompt-score.js.map +1 -0
- package/dist/tools/scan-sessions.d.ts +2 -0
- package/dist/tools/scan-sessions.js +182 -0
- package/dist/tools/scan-sessions.js.map +1 -0
- package/dist/tools/scope-work.d.ts +2 -0
- package/dist/tools/scope-work.js +214 -0
- package/dist/tools/scope-work.js.map +1 -0
- package/dist/tools/search-history.d.ts +2 -0
- package/dist/tools/search-history.js +130 -0
- package/dist/tools/search-history.js.map +1 -0
- package/dist/tools/sequence-tasks.d.ts +2 -0
- package/dist/tools/sequence-tasks.js +165 -0
- package/dist/tools/sequence-tasks.js.map +1 -0
- package/dist/tools/session-handoff.d.ts +2 -0
- package/dist/tools/session-handoff.js +113 -0
- package/dist/tools/session-handoff.js.map +1 -0
- package/dist/tools/session-health.d.ts +2 -0
- package/dist/tools/session-health.js +111 -0
- package/dist/tools/session-health.js.map +1 -0
- package/dist/tools/session-stats.d.ts +2 -0
- package/dist/tools/session-stats.js +112 -0
- package/dist/tools/session-stats.js.map +1 -0
- package/dist/tools/sharpen-followup.d.ts +2 -0
- package/dist/tools/sharpen-followup.js +192 -0
- package/dist/tools/sharpen-followup.js.map +1 -0
- package/dist/tools/timeline-view.d.ts +2 -0
- package/dist/tools/timeline-view.js +165 -0
- package/dist/tools/timeline-view.js.map +1 -0
- package/dist/tools/token-audit.d.ts +2 -0
- package/dist/tools/token-audit.js +227 -0
- package/dist/tools/token-audit.js.map +1 -0
- package/dist/tools/verify-completion.d.ts +2 -0
- package/dist/tools/verify-completion.js +154 -0
- package/dist/tools/verify-completion.js.map +1 -0
- package/dist/tools/what-changed.d.ts +2 -0
- package/dist/tools/what-changed.js +40 -0
- package/dist/tools/what-changed.js.map +1 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
- package/src/cli/init.ts +133 -0
- package/src/index.ts +135 -0
- package/src/lib/config.ts +157 -0
- package/src/lib/embeddings.ts +118 -0
- package/src/lib/files.ts +59 -0
- package/src/lib/git-extractor.ts +137 -0
- package/src/lib/git.ts +89 -0
- package/src/lib/session-parser.ts +325 -0
- package/src/lib/state.ts +86 -0
- package/src/lib/timeline-db.ts +490 -0
- package/src/lib/triage.ts +255 -0
- package/src/profiles.ts +70 -0
- package/src/templates/config.yml +23 -0
- package/src/templates/triage.yml +27 -0
- package/src/tools/audit-workspace.ts +97 -0
- package/src/tools/checkpoint.ts +119 -0
- package/src/tools/clarify-intent.ts +191 -0
- package/src/tools/enrich-agent-task.ts +108 -0
- package/src/tools/generate-scorecard.ts +673 -0
- package/src/tools/log-correction.ts +89 -0
- package/src/tools/onboard-project.ts +214 -0
- package/src/tools/preflight-check.ts +263 -0
- package/src/tools/prompt-score.ts +150 -0
- package/src/tools/scan-sessions.ts +209 -0
- package/src/tools/scope-work.ts +238 -0
- package/src/tools/search-history.ts +145 -0
- package/src/tools/sequence-tasks.ts +182 -0
- package/src/tools/session-handoff.ts +125 -0
- package/src/tools/session-health.ts +107 -0
- package/src/tools/session-stats.ts +134 -0
- package/src/tools/sharpen-followup.ts +200 -0
- package/src/tools/timeline-view.ts +181 -0
- package/src/tools/token-audit.ts +259 -0
- package/src/tools/verify-completion.ts +159 -0
- package/src/tools/what-changed.ts +48 -0
- package/src/types.ts +87 -0
|
@@ -0,0 +1,617 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// generate_scorecard — 12-category prompt discipline report cards (PDF/Markdown)
|
|
3
|
+
// =============================================================================
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { findSessionDirs, findSessionFiles, parseSession, } from "../lib/session-parser.js";
|
|
6
|
+
// ── Grading ────────────────────────────────────────────────────────────────
|
|
7
|
+
function letterGrade(score) {
|
|
8
|
+
if (score >= 95)
|
|
9
|
+
return "A+";
|
|
10
|
+
if (score >= 90)
|
|
11
|
+
return "A";
|
|
12
|
+
if (score >= 85)
|
|
13
|
+
return "A-";
|
|
14
|
+
if (score >= 80)
|
|
15
|
+
return "B+";
|
|
16
|
+
if (score >= 75)
|
|
17
|
+
return "B";
|
|
18
|
+
if (score >= 70)
|
|
19
|
+
return "B-";
|
|
20
|
+
if (score >= 65)
|
|
21
|
+
return "C+";
|
|
22
|
+
if (score >= 60)
|
|
23
|
+
return "C";
|
|
24
|
+
if (score >= 55)
|
|
25
|
+
return "C-";
|
|
26
|
+
if (score >= 50)
|
|
27
|
+
return "D";
|
|
28
|
+
return "F";
|
|
29
|
+
}
|
|
30
|
+
function clamp(v) {
|
|
31
|
+
return Math.max(0, Math.min(100, Math.round(v)));
|
|
32
|
+
}
|
|
33
|
+
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
34
|
+
const PATH_RE = /(?:\/[\w./-]+\.\w{1,6}|\b\w+\.\w{2,6}\b)/;
|
|
35
|
+
const FILE_EXT_RE = /\.\b(?:ts|tsx|js|jsx|py|rs|go|rb|java|c|cpp|h|css|scss|html|json|yaml|yml|toml|md|sql|sh)\b/;
|
|
36
|
+
const CORRECTION_PATTERNS = [/\bno\b/i, /\bwrong\b/i, /\bnot that\b/i, /\bi meant\b/i, /\bactually\b/i, /\binstead\b/i, /\bundo\b/i, /\brevert\b/i];
|
|
37
|
+
function classifyEvents(events) {
|
|
38
|
+
const userMessages = events.filter((e) => e.type === "user_prompt");
|
|
39
|
+
const assistantMessages = events.filter((e) => e.type === "assistant_response");
|
|
40
|
+
const toolCalls = events.filter((e) => e.type === "tool_call");
|
|
41
|
+
const corrections = events.filter((e) => e.type === "correction");
|
|
42
|
+
const compactions = events.filter((e) => e.type === "compaction");
|
|
43
|
+
const commits = events.filter((e) => e.type === "git_commit");
|
|
44
|
+
const subAgentSpawns = events.filter((e) => e.type === "sub_agent_spawn");
|
|
45
|
+
let durationMinutes = 0;
|
|
46
|
+
if (events.length >= 2) {
|
|
47
|
+
const first = new Date(events[0].timestamp).getTime();
|
|
48
|
+
const last = new Date(events[events.length - 1].timestamp).getTime();
|
|
49
|
+
if (!isNaN(first) && !isNaN(last)) {
|
|
50
|
+
durationMinutes = (last - first) / 60000;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
id: events[0]?.session_id ?? "unknown",
|
|
55
|
+
events,
|
|
56
|
+
userMessages,
|
|
57
|
+
assistantMessages,
|
|
58
|
+
toolCalls,
|
|
59
|
+
corrections,
|
|
60
|
+
compactions,
|
|
61
|
+
commits,
|
|
62
|
+
subAgentSpawns,
|
|
63
|
+
durationMinutes,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function hasFileRef(text) {
|
|
67
|
+
return PATH_RE.test(text) || FILE_EXT_RE.test(text);
|
|
68
|
+
}
|
|
69
|
+
function pct(num, den) {
|
|
70
|
+
return den === 0 ? 100 : Math.round((num / den) * 100);
|
|
71
|
+
}
|
|
72
|
+
// ── Scoring Functions ──────────────────────────────────────────────────────
|
|
73
|
+
function scorePlans(sessions) {
|
|
74
|
+
if (sessions.length === 0)
|
|
75
|
+
return { name: "Plans", score: 75, grade: "B", evidence: "No sessions to analyze" };
|
|
76
|
+
let planned = 0;
|
|
77
|
+
for (const s of sessions) {
|
|
78
|
+
const first3 = s.userMessages.slice(0, 3);
|
|
79
|
+
const hasPlanning = first3.some((m) => m.content.length > 100 && hasFileRef(m.content));
|
|
80
|
+
if (hasPlanning)
|
|
81
|
+
planned++;
|
|
82
|
+
}
|
|
83
|
+
const score = clamp(pct(planned, sessions.length));
|
|
84
|
+
return {
|
|
85
|
+
name: "Plans",
|
|
86
|
+
score,
|
|
87
|
+
grade: letterGrade(score),
|
|
88
|
+
evidence: `${planned}/${sessions.length} sessions began with file-specific planning prompts (>100 chars with file references).`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function scoreClarification(sessions) {
|
|
92
|
+
let specific = 0, total = 0;
|
|
93
|
+
for (const s of sessions) {
|
|
94
|
+
for (const m of s.userMessages) {
|
|
95
|
+
total++;
|
|
96
|
+
if (hasFileRef(m.content))
|
|
97
|
+
specific++;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const score = clamp(pct(specific, total));
|
|
101
|
+
return {
|
|
102
|
+
name: "Clarification",
|
|
103
|
+
score,
|
|
104
|
+
grade: letterGrade(score),
|
|
105
|
+
evidence: `${specific}/${total} user prompts contained file paths or specific identifiers.`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function scoreDelegation(sessions) {
|
|
109
|
+
let total = 0, quality = 0;
|
|
110
|
+
for (const s of sessions) {
|
|
111
|
+
for (const e of s.subAgentSpawns) {
|
|
112
|
+
total++;
|
|
113
|
+
if (e.content.length > 200)
|
|
114
|
+
quality++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (total === 0)
|
|
118
|
+
return { name: "Delegation", score: 75, grade: "B", evidence: "No sub-agent spawns detected. Default score." };
|
|
119
|
+
const score = clamp(pct(quality, total));
|
|
120
|
+
return {
|
|
121
|
+
name: "Delegation",
|
|
122
|
+
score,
|
|
123
|
+
grade: letterGrade(score),
|
|
124
|
+
evidence: `${quality}/${total} sub-agent tasks had detailed descriptions (>200 chars).`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function scoreFollowUpSpecificity(sessions) {
|
|
128
|
+
let followUps = 0, specific = 0;
|
|
129
|
+
const badExamples = [];
|
|
130
|
+
const goodExamples = [];
|
|
131
|
+
for (const s of sessions) {
|
|
132
|
+
for (let i = 0; i < s.events.length; i++) {
|
|
133
|
+
const ev = s.events[i];
|
|
134
|
+
if (ev.type !== "user_prompt")
|
|
135
|
+
continue;
|
|
136
|
+
// Check if preceded by assistant
|
|
137
|
+
const prev = s.events.slice(0, i).reverse().find((e) => e.type === "assistant_response" || e.type === "user_prompt");
|
|
138
|
+
if (prev?.type !== "assistant_response")
|
|
139
|
+
continue;
|
|
140
|
+
followUps++;
|
|
141
|
+
if (hasFileRef(ev.content) || ev.content.length >= 50) {
|
|
142
|
+
specific++;
|
|
143
|
+
if (goodExamples.length < 3 && hasFileRef(ev.content))
|
|
144
|
+
goodExamples.push(ev.content.slice(0, 120));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
if (badExamples.length < 3)
|
|
148
|
+
badExamples.push(ev.content.slice(0, 80));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const score = clamp(pct(specific, followUps));
|
|
153
|
+
return {
|
|
154
|
+
name: "Follow-up Specificity",
|
|
155
|
+
score,
|
|
156
|
+
grade: letterGrade(score),
|
|
157
|
+
evidence: `${specific}/${followUps} follow-up prompts had specific file references or sufficient detail.`,
|
|
158
|
+
examples: { good: goodExamples.length ? goodExamples : undefined, bad: badExamples.length ? badExamples : undefined },
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function scoreTokenEfficiency(sessions) {
|
|
162
|
+
let totalCalls = 0, totalFiles = 0;
|
|
163
|
+
for (const s of sessions) {
|
|
164
|
+
totalCalls += s.toolCalls.length;
|
|
165
|
+
const files = new Set();
|
|
166
|
+
for (const tc of s.toolCalls) {
|
|
167
|
+
const match = tc.content.match(/(?:file_path|path)["']?\s*[:=]\s*["']([^"']+)/);
|
|
168
|
+
if (match)
|
|
169
|
+
files.add(match[1]);
|
|
170
|
+
}
|
|
171
|
+
totalFiles += files.size || 1;
|
|
172
|
+
}
|
|
173
|
+
// Ratio: lower tool_calls per file = better. Ideal ~5-10 calls per file.
|
|
174
|
+
const ratio = totalCalls / totalFiles;
|
|
175
|
+
let score;
|
|
176
|
+
if (ratio <= 5)
|
|
177
|
+
score = 100;
|
|
178
|
+
else if (ratio <= 10)
|
|
179
|
+
score = 90;
|
|
180
|
+
else if (ratio <= 20)
|
|
181
|
+
score = 75;
|
|
182
|
+
else if (ratio <= 40)
|
|
183
|
+
score = 60;
|
|
184
|
+
else
|
|
185
|
+
score = 40;
|
|
186
|
+
// Deduct for sessions with >200 tool calls
|
|
187
|
+
const bloated = sessions.filter((s) => s.toolCalls.length > 200).length;
|
|
188
|
+
if (bloated > 0)
|
|
189
|
+
score = clamp(score - bloated * 10);
|
|
190
|
+
return {
|
|
191
|
+
name: "Token Efficiency",
|
|
192
|
+
score: clamp(score),
|
|
193
|
+
grade: letterGrade(clamp(score)),
|
|
194
|
+
evidence: `${totalCalls} tool calls across ${totalFiles} unique files (ratio: ${ratio.toFixed(1)}). ${bloated} session(s) exceeded 200 tool calls.`,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function scoreSequencing(sessions) {
|
|
198
|
+
let totalSwitches = 0, totalPrompts = 0;
|
|
199
|
+
for (const s of sessions) {
|
|
200
|
+
let lastArea = "";
|
|
201
|
+
for (const m of s.userMessages) {
|
|
202
|
+
totalPrompts++;
|
|
203
|
+
const pathMatch = m.content.match(/(?:\/[\w./-]+)/);
|
|
204
|
+
const area = pathMatch ? pathMatch[0].split("/").slice(0, -1).join("/") : "";
|
|
205
|
+
if (area && lastArea && area !== lastArea)
|
|
206
|
+
totalSwitches++;
|
|
207
|
+
if (area)
|
|
208
|
+
lastArea = area;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Fewer switches = better. Target: <10% switch rate
|
|
212
|
+
const switchRate = totalPrompts > 0 ? totalSwitches / totalPrompts : 0;
|
|
213
|
+
let score;
|
|
214
|
+
if (switchRate <= 0.05)
|
|
215
|
+
score = 100;
|
|
216
|
+
else if (switchRate <= 0.1)
|
|
217
|
+
score = 90;
|
|
218
|
+
else if (switchRate <= 0.2)
|
|
219
|
+
score = 75;
|
|
220
|
+
else if (switchRate <= 0.35)
|
|
221
|
+
score = 60;
|
|
222
|
+
else
|
|
223
|
+
score = 45;
|
|
224
|
+
return {
|
|
225
|
+
name: "Sequencing",
|
|
226
|
+
score: clamp(score),
|
|
227
|
+
grade: letterGrade(clamp(score)),
|
|
228
|
+
evidence: `${totalSwitches} topic switches across ${totalPrompts} prompts (${(switchRate * 100).toFixed(0)}% switch rate).`,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function scoreCompactionManagement(sessions) {
|
|
232
|
+
let totalCompactions = 0, covered = 0;
|
|
233
|
+
for (const s of sessions) {
|
|
234
|
+
if (s.compactions.length === 0)
|
|
235
|
+
continue;
|
|
236
|
+
for (const c of s.compactions) {
|
|
237
|
+
totalCompactions++;
|
|
238
|
+
const cIdx = s.events.indexOf(c);
|
|
239
|
+
const nearby = s.events.slice(Math.max(0, cIdx - 10), cIdx);
|
|
240
|
+
if (nearby.some((e) => e.type === "git_commit"))
|
|
241
|
+
covered++;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (totalCompactions === 0)
|
|
245
|
+
return { name: "Compaction Management", score: 100, grade: "A+", evidence: "No compactions needed — sessions stayed manageable." };
|
|
246
|
+
const score = clamp(pct(covered, totalCompactions));
|
|
247
|
+
return {
|
|
248
|
+
name: "Compaction Management",
|
|
249
|
+
score,
|
|
250
|
+
grade: letterGrade(score),
|
|
251
|
+
evidence: `${covered}/${totalCompactions} compactions were preceded by a commit within 10 messages.`,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function scoreSessionLifecycle(sessions) {
|
|
255
|
+
if (sessions.length === 0)
|
|
256
|
+
return { name: "Session Lifecycle", score: 75, grade: "B", evidence: "No sessions." };
|
|
257
|
+
let good = 0;
|
|
258
|
+
for (const s of sessions) {
|
|
259
|
+
if (s.durationMinutes <= 0) {
|
|
260
|
+
good++;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (s.durationMinutes > 180 && s.commits.length === 0)
|
|
264
|
+
continue; // bad
|
|
265
|
+
const commitInterval = s.commits.length > 0 ? s.durationMinutes / s.commits.length : s.durationMinutes;
|
|
266
|
+
if (commitInterval <= 30)
|
|
267
|
+
good++;
|
|
268
|
+
else if (commitInterval <= 60)
|
|
269
|
+
good += 0.5;
|
|
270
|
+
}
|
|
271
|
+
const score = clamp(pct(Math.round(good), sessions.length));
|
|
272
|
+
return {
|
|
273
|
+
name: "Session Lifecycle",
|
|
274
|
+
score,
|
|
275
|
+
grade: letterGrade(score),
|
|
276
|
+
evidence: `${Math.round(good)}/${sessions.length} sessions had healthy commit frequency (every 15-30 min).`,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function scoreErrorRecovery(sessions) {
|
|
280
|
+
let totalCorrections = 0, fastRecoveries = 0, totalMessages = 0;
|
|
281
|
+
for (const s of sessions) {
|
|
282
|
+
totalMessages += s.events.length;
|
|
283
|
+
for (const c of s.corrections) {
|
|
284
|
+
totalCorrections++;
|
|
285
|
+
const cIdx = s.events.indexOf(c);
|
|
286
|
+
const after = s.events.slice(cIdx + 1, cIdx + 3);
|
|
287
|
+
if (after.some((e) => e.type === "tool_call" || e.type === "assistant_response"))
|
|
288
|
+
fastRecoveries++;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (totalCorrections === 0)
|
|
292
|
+
return { name: "Error Recovery", score: 95, grade: "A", evidence: "No corrections needed." };
|
|
293
|
+
const correctionRate = totalMessages > 0 ? totalCorrections / totalMessages : 0;
|
|
294
|
+
let score = clamp(100 - correctionRate * 500);
|
|
295
|
+
if (totalCorrections > 0) {
|
|
296
|
+
const recoveryBonus = pct(fastRecoveries, totalCorrections) * 0.2;
|
|
297
|
+
score = clamp(score + recoveryBonus);
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
name: "Error Recovery",
|
|
301
|
+
score,
|
|
302
|
+
grade: letterGrade(score),
|
|
303
|
+
evidence: `${totalCorrections} corrections (${(correctionRate * 100).toFixed(1)}% of messages). ${fastRecoveries} recovered within 2 messages.`,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
function scoreWorkspaceHygiene(sessions) {
|
|
307
|
+
let bonus = 0;
|
|
308
|
+
for (const s of sessions) {
|
|
309
|
+
const allContent = s.events.map((e) => e.content).join(" ");
|
|
310
|
+
if (/\.claude\//.test(allContent) || /CLAUDE\.md/.test(allContent))
|
|
311
|
+
bonus++;
|
|
312
|
+
}
|
|
313
|
+
const score = clamp(75 + (bonus > 0 ? Math.min(bonus * 5, 20) : 0));
|
|
314
|
+
return {
|
|
315
|
+
name: "Workspace Hygiene",
|
|
316
|
+
score,
|
|
317
|
+
grade: letterGrade(score),
|
|
318
|
+
evidence: `Default baseline 75. ${bonus} session(s) referenced .claude/ workspace docs (+bonus).`,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
function scoreCrossSessionContinuity(sessions) {
|
|
322
|
+
if (sessions.length === 0)
|
|
323
|
+
return { name: "Cross-Session Continuity", score: 75, grade: "B", evidence: "No sessions." };
|
|
324
|
+
let good = 0;
|
|
325
|
+
for (const s of sessions) {
|
|
326
|
+
const first3Tools = s.toolCalls.slice(0, 3);
|
|
327
|
+
const readsContext = first3Tools.some((tc) => /CLAUDE\.md|\.claude\/|checkpoint|context|README/i.test(tc.content));
|
|
328
|
+
if (readsContext)
|
|
329
|
+
good++;
|
|
330
|
+
}
|
|
331
|
+
const score = clamp(pct(good, sessions.length));
|
|
332
|
+
return {
|
|
333
|
+
name: "Cross-Session Continuity",
|
|
334
|
+
score,
|
|
335
|
+
grade: letterGrade(score),
|
|
336
|
+
evidence: `${good}/${sessions.length} sessions started by reading project context docs.`,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
function scoreVerification(sessions) {
|
|
340
|
+
if (sessions.length === 0)
|
|
341
|
+
return { name: "Verification", score: 75, grade: "B", evidence: "No sessions." };
|
|
342
|
+
let verified = 0;
|
|
343
|
+
for (const s of sessions) {
|
|
344
|
+
const totalEvents = s.events.length;
|
|
345
|
+
const tail = s.events.slice(Math.max(0, Math.floor(totalEvents * 0.9)));
|
|
346
|
+
const hasVerification = tail.some((e) => e.type === "tool_call" && /test|build|lint|check|verify|jest|vitest|pytest|cargo.test/i.test(e.content));
|
|
347
|
+
if (hasVerification)
|
|
348
|
+
verified++;
|
|
349
|
+
}
|
|
350
|
+
const score = clamp(pct(verified, sessions.length));
|
|
351
|
+
return {
|
|
352
|
+
name: "Verification",
|
|
353
|
+
score,
|
|
354
|
+
grade: letterGrade(score),
|
|
355
|
+
evidence: `${verified}/${sessions.length} sessions ran tests/builds in the final 10% of events.`,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
// ── Main Scoring ───────────────────────────────────────────────────────────
|
|
359
|
+
function computeScorecard(sessions, project, period) {
|
|
360
|
+
const categories = [
|
|
361
|
+
scorePlans(sessions),
|
|
362
|
+
scoreClarification(sessions),
|
|
363
|
+
scoreDelegation(sessions),
|
|
364
|
+
scoreFollowUpSpecificity(sessions),
|
|
365
|
+
scoreTokenEfficiency(sessions),
|
|
366
|
+
scoreSequencing(sessions),
|
|
367
|
+
scoreCompactionManagement(sessions),
|
|
368
|
+
scoreSessionLifecycle(sessions),
|
|
369
|
+
scoreErrorRecovery(sessions),
|
|
370
|
+
scoreWorkspaceHygiene(sessions),
|
|
371
|
+
scoreCrossSessionContinuity(sessions),
|
|
372
|
+
scoreVerification(sessions),
|
|
373
|
+
];
|
|
374
|
+
const overall = clamp(Math.round(categories.reduce((s, c) => s + c.score, 0) / categories.length));
|
|
375
|
+
const sorted = [...categories].sort((a, b) => b.score - a.score);
|
|
376
|
+
return {
|
|
377
|
+
project,
|
|
378
|
+
period,
|
|
379
|
+
date: new Date().toISOString().slice(0, 10),
|
|
380
|
+
overall,
|
|
381
|
+
overallGrade: letterGrade(overall),
|
|
382
|
+
categories,
|
|
383
|
+
highlights: { best: sorted[0], worst: sorted[sorted.length - 1] },
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
// ── Markdown Output ────────────────────────────────────────────────────────
|
|
387
|
+
function toMarkdown(sc) {
|
|
388
|
+
const lines = [];
|
|
389
|
+
lines.push(`# 📊 Prompt Discipline Scorecard`);
|
|
390
|
+
lines.push(`**Project:** ${sc.project} | **Period:** ${sc.period} (${sc.date}) | **Overall: ${sc.overallGrade} (${sc.overall}/100)**\n`);
|
|
391
|
+
lines.push(`## Category Scores`);
|
|
392
|
+
lines.push(`| # | Category | Score | Grade |`);
|
|
393
|
+
lines.push(`|---|----------|-------|-------|`);
|
|
394
|
+
sc.categories.forEach((c, i) => {
|
|
395
|
+
lines.push(`| ${i + 1} | ${c.name} | ${c.score} | ${c.grade} |`);
|
|
396
|
+
});
|
|
397
|
+
lines.push(`\n## Highlights`);
|
|
398
|
+
lines.push(`- 🏆 **Best:** ${sc.highlights.best.name} (${sc.highlights.best.grade}) — ${sc.highlights.best.evidence}`);
|
|
399
|
+
lines.push(`- ⚠️ **Worst:** ${sc.highlights.worst.name} (${sc.highlights.worst.grade}) — ${sc.highlights.worst.evidence}`);
|
|
400
|
+
lines.push(`\n## Detailed Breakdown`);
|
|
401
|
+
sc.categories.forEach((c, i) => {
|
|
402
|
+
lines.push(`\n### ${i + 1}. ${c.name} — ${c.grade} (${c.score}/100)`);
|
|
403
|
+
lines.push(`Evidence: ${c.evidence}`);
|
|
404
|
+
if (c.examples?.bad?.length) {
|
|
405
|
+
lines.push(`\nExamples of vague follow-ups:`);
|
|
406
|
+
c.examples.bad.forEach((e) => lines.push(`- ❌ "${e}"`));
|
|
407
|
+
}
|
|
408
|
+
if (c.examples?.good?.length) {
|
|
409
|
+
lines.push(`\nExamples of specific follow-ups:`);
|
|
410
|
+
c.examples.good.forEach((e) => lines.push(`- ✅ "${e}"`));
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
return lines.join("\n");
|
|
414
|
+
}
|
|
415
|
+
// ── HTML / PDF Output ──────────────────────────────────────────────────────
|
|
416
|
+
function gradeColor(grade) {
|
|
417
|
+
if (grade.startsWith("A"))
|
|
418
|
+
return "#22c55e";
|
|
419
|
+
if (grade.startsWith("B"))
|
|
420
|
+
return "#eab308";
|
|
421
|
+
if (grade.startsWith("C"))
|
|
422
|
+
return "#f97316";
|
|
423
|
+
return "#ef4444";
|
|
424
|
+
}
|
|
425
|
+
function generateRadarSVG(categories) {
|
|
426
|
+
const cx = 200, cy = 200, r = 150;
|
|
427
|
+
const n = categories.length;
|
|
428
|
+
const points = categories.map((c, i) => {
|
|
429
|
+
const angle = (Math.PI * 2 * i) / n - Math.PI / 2;
|
|
430
|
+
const dist = (c.score / 100) * r;
|
|
431
|
+
return { x: cx + dist * Math.cos(angle), y: cy + dist * Math.sin(angle) };
|
|
432
|
+
});
|
|
433
|
+
const gridLines = [0.25, 0.5, 0.75, 1].map((f) => {
|
|
434
|
+
const gr = r * f;
|
|
435
|
+
const pts = Array.from({ length: n }, (_, i) => {
|
|
436
|
+
const angle = (Math.PI * 2 * i) / n - Math.PI / 2;
|
|
437
|
+
return `${cx + gr * Math.cos(angle)},${cy + gr * Math.sin(angle)}`;
|
|
438
|
+
}).join(" ");
|
|
439
|
+
return `<polygon points="${pts}" fill="none" stroke="#e5e7eb" stroke-width="1"/>`;
|
|
440
|
+
}).join("");
|
|
441
|
+
const labels = categories.map((c, i) => {
|
|
442
|
+
const angle = (Math.PI * 2 * i) / n - Math.PI / 2;
|
|
443
|
+
const lx = cx + (r + 30) * Math.cos(angle);
|
|
444
|
+
const ly = cy + (r + 30) * Math.sin(angle);
|
|
445
|
+
const anchor = Math.abs(angle) < 0.1 || Math.abs(angle - Math.PI) < 0.1 ? "middle" : angle > -Math.PI / 2 && angle < Math.PI / 2 ? "start" : "end";
|
|
446
|
+
return `<text x="${lx}" y="${ly}" text-anchor="${anchor}" font-size="10" fill="#6b7280">${c.name.slice(0, 12)}</text>`;
|
|
447
|
+
}).join("");
|
|
448
|
+
const polygon = points.map((p) => `${p.x},${p.y}`).join(" ");
|
|
449
|
+
return `<svg viewBox="0 0 400 400" width="400" height="400" xmlns="http://www.w3.org/2000/svg">
|
|
450
|
+
${gridLines}
|
|
451
|
+
<polygon points="${polygon}" fill="rgba(59,130,246,0.2)" stroke="#3b82f6" stroke-width="2"/>
|
|
452
|
+
${points.map((p) => `<circle cx="${p.x}" cy="${p.y}" r="4" fill="#3b82f6"/>`).join("")}
|
|
453
|
+
${labels}
|
|
454
|
+
</svg>`;
|
|
455
|
+
}
|
|
456
|
+
function toHTML(sc) {
|
|
457
|
+
const radar = generateRadarSVG(sc.categories);
|
|
458
|
+
const rows = sc.categories.map((c, i) => `
|
|
459
|
+
<tr>
|
|
460
|
+
<td style="padding:8px;border-bottom:1px solid #e5e7eb">${i + 1}</td>
|
|
461
|
+
<td style="padding:8px;border-bottom:1px solid #e5e7eb;font-weight:600">${c.name}</td>
|
|
462
|
+
<td style="padding:8px;border-bottom:1px solid #e5e7eb;text-align:center">${c.score}</td>
|
|
463
|
+
<td style="padding:8px;border-bottom:1px solid #e5e7eb;text-align:center">
|
|
464
|
+
<span style="background:${gradeColor(c.grade)};color:white;padding:2px 8px;border-radius:4px;font-weight:700">${c.grade}</span>
|
|
465
|
+
</td>
|
|
466
|
+
</tr>`).join("");
|
|
467
|
+
const details = sc.categories.map((c, i) => {
|
|
468
|
+
let html = `<div style="margin-bottom:16px"><h3 style="margin:0 0 4px">${i + 1}. ${c.name} — <span style="color:${gradeColor(c.grade)}">${c.grade}</span> (${c.score}/100)</h3><p style="color:#6b7280;margin:0">${c.evidence}</p>`;
|
|
469
|
+
if (c.examples?.bad?.length) {
|
|
470
|
+
html += `<div style="margin-top:6px">${c.examples.bad.map((e) => `<div style="color:#ef4444;font-size:13px">❌ "${e}"</div>`).join("")}</div>`;
|
|
471
|
+
}
|
|
472
|
+
if (c.examples?.good?.length) {
|
|
473
|
+
html += `<div style="margin-top:4px">${c.examples.good.map((e) => `<div style="color:#22c55e;font-size:13px">✅ "${e}"</div>`).join("")}</div>`;
|
|
474
|
+
}
|
|
475
|
+
return html + `</div>`;
|
|
476
|
+
}).join("");
|
|
477
|
+
return `<!DOCTYPE html><html><head><meta charset="utf-8"/></head><body style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;margin:0;color:#1f2937">
|
|
478
|
+
<div style="background:linear-gradient(135deg,#1e293b,#0f172a);color:white;padding:32px 40px;display:flex;align-items:center;justify-content:space-between">
|
|
479
|
+
<div>
|
|
480
|
+
<h1 style="margin:0;font-size:28px">📊 Prompt Discipline Scorecard</h1>
|
|
481
|
+
<p style="margin:8px 0 0;opacity:0.8">Project: <strong>${sc.project}</strong> | Period: ${sc.period} | ${sc.date}</p>
|
|
482
|
+
</div>
|
|
483
|
+
<div style="width:100px;height:100px;border-radius:50%;background:${gradeColor(sc.overallGrade)};display:flex;align-items:center;justify-content:center;flex-direction:column">
|
|
484
|
+
<div style="font-size:28px;font-weight:800;line-height:1">${sc.overallGrade}</div>
|
|
485
|
+
<div style="font-size:14px;opacity:0.9">${sc.overall}/100</div>
|
|
486
|
+
</div>
|
|
487
|
+
</div>
|
|
488
|
+
<div style="padding:32px 40px;display:flex;gap:40px;flex-wrap:wrap">
|
|
489
|
+
<div style="flex:1;min-width:300px">
|
|
490
|
+
<h2 style="margin:0 0 12px">Category Scores</h2>
|
|
491
|
+
<table style="width:100%;border-collapse:collapse;font-size:14px">
|
|
492
|
+
<thead><tr style="background:#f9fafb"><th style="padding:8px;text-align:left">#</th><th style="padding:8px;text-align:left">Category</th><th style="padding:8px;text-align:center">Score</th><th style="padding:8px;text-align:center">Grade</th></tr></thead>
|
|
493
|
+
<tbody>${rows}</tbody>
|
|
494
|
+
</table>
|
|
495
|
+
</div>
|
|
496
|
+
<div style="flex:0 0 auto">${radar}</div>
|
|
497
|
+
</div>
|
|
498
|
+
<div style="padding:0 40px 20px">
|
|
499
|
+
<div style="background:#f0fdf4;border-left:4px solid #22c55e;padding:12px 16px;margin-bottom:8px;border-radius:4px">🏆 <strong>Best:</strong> ${sc.highlights.best.name} (${sc.highlights.best.grade}) — ${sc.highlights.best.evidence}</div>
|
|
500
|
+
<div style="background:#fef2f2;border-left:4px solid #ef4444;padding:12px 16px;border-radius:4px">⚠️ <strong>Needs work:</strong> ${sc.highlights.worst.name} (${sc.highlights.worst.grade}) — ${sc.highlights.worst.evidence}</div>
|
|
501
|
+
</div>
|
|
502
|
+
<div style="padding:20px 40px 40px">
|
|
503
|
+
<h2 style="margin:0 0 16px">Detailed Breakdown</h2>
|
|
504
|
+
${details}
|
|
505
|
+
</div>
|
|
506
|
+
</body></html>`;
|
|
507
|
+
}
|
|
508
|
+
async function generatePDF(html, outputPath) {
|
|
509
|
+
const { chromium } = await import("playwright");
|
|
510
|
+
const browser = await chromium.launch();
|
|
511
|
+
const page = await browser.newPage();
|
|
512
|
+
await page.setContent(html, { waitUntil: "networkidle" });
|
|
513
|
+
await page.pdf({
|
|
514
|
+
path: outputPath,
|
|
515
|
+
format: "A4",
|
|
516
|
+
margin: { top: "1cm", bottom: "1cm", left: "1cm", right: "1cm" },
|
|
517
|
+
});
|
|
518
|
+
await browser.close();
|
|
519
|
+
}
|
|
520
|
+
// ── Session Loading ────────────────────────────────────────────────────────
|
|
521
|
+
function loadSessions(opts) {
|
|
522
|
+
const dirs = findSessionDirs();
|
|
523
|
+
let targetDirs = dirs;
|
|
524
|
+
if (opts.project) {
|
|
525
|
+
targetDirs = dirs.filter((d) => d.projectName.toLowerCase().includes(opts.project.toLowerCase()) ||
|
|
526
|
+
d.project.toLowerCase().includes(opts.project.toLowerCase()));
|
|
527
|
+
}
|
|
528
|
+
// Determine time filter
|
|
529
|
+
let sinceDate = null;
|
|
530
|
+
if (opts.since) {
|
|
531
|
+
const relMatch = opts.since.match(/^(\d+)\s*days?$/i);
|
|
532
|
+
if (relMatch) {
|
|
533
|
+
sinceDate = new Date(Date.now() - parseInt(relMatch[1]) * 86400000);
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
sinceDate = new Date(opts.since);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
const now = new Date();
|
|
541
|
+
switch (opts.period) {
|
|
542
|
+
case "day":
|
|
543
|
+
sinceDate = new Date(now.getTime() - 86400000);
|
|
544
|
+
break;
|
|
545
|
+
case "week":
|
|
546
|
+
sinceDate = new Date(now.getTime() - 7 * 86400000);
|
|
547
|
+
break;
|
|
548
|
+
case "month":
|
|
549
|
+
sinceDate = new Date(now.getTime() - 30 * 86400000);
|
|
550
|
+
break;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
const sessions = [];
|
|
554
|
+
for (const dir of targetDirs) {
|
|
555
|
+
const files = findSessionFiles(dir.sessionDir);
|
|
556
|
+
for (const f of files) {
|
|
557
|
+
if (opts.sessionId && f.sessionId !== opts.sessionId)
|
|
558
|
+
continue;
|
|
559
|
+
if (sinceDate && f.mtime < sinceDate)
|
|
560
|
+
continue;
|
|
561
|
+
try {
|
|
562
|
+
const events = parseSession(f.path, dir.project, dir.projectName);
|
|
563
|
+
if (events.length > 0) {
|
|
564
|
+
sessions.push(classifyEvents(events));
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
// Skip unparseable files
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
return sessions;
|
|
573
|
+
}
|
|
574
|
+
// ── Tool Registration ──────────────────────────────────────────────────────
|
|
575
|
+
export function registerGenerateScorecard(server) {
|
|
576
|
+
server.tool("generate_scorecard", "Generate a prompt discipline scorecard analyzing sessions across 12 categories. Produces markdown or PDF report cards with per-category scores, letter grades, and evidence.", {
|
|
577
|
+
project: z.string().optional().describe("Project name to score. If omitted, scores current project."),
|
|
578
|
+
period: z.enum(["session", "day", "week", "month"]).default("day"),
|
|
579
|
+
session_id: z.string().optional().describe("Score a specific session by ID"),
|
|
580
|
+
since: z.string().optional().describe("Start date (ISO or relative like '7days')"),
|
|
581
|
+
output: z.enum(["pdf", "markdown"]).default("markdown"),
|
|
582
|
+
output_path: z.string().optional().describe("Where to save PDF. Default: /tmp/scorecard-{date}.pdf"),
|
|
583
|
+
}, async (params) => {
|
|
584
|
+
const sessions = loadSessions({
|
|
585
|
+
project: params.project,
|
|
586
|
+
sessionId: params.session_id,
|
|
587
|
+
since: params.since,
|
|
588
|
+
period: params.period,
|
|
589
|
+
});
|
|
590
|
+
if (sessions.length === 0) {
|
|
591
|
+
return {
|
|
592
|
+
content: [{ type: "text", text: "No sessions found matching the criteria. Try broadening the time period or checking the project name." }],
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
const projectName = params.project ?? sessions[0]?.events[0]?.project_name ?? "unknown";
|
|
596
|
+
const scorecard = computeScorecard(sessions, projectName, params.period);
|
|
597
|
+
if (params.output === "pdf") {
|
|
598
|
+
const html = toHTML(scorecard);
|
|
599
|
+
const outputPath = params.output_path ?? `/tmp/scorecard-${scorecard.date}.pdf`;
|
|
600
|
+
try {
|
|
601
|
+
await generatePDF(html, outputPath);
|
|
602
|
+
return {
|
|
603
|
+
content: [{ type: "text", text: `✅ PDF scorecard saved to ${outputPath}\n\n${toMarkdown(scorecard)}` }],
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
catch (err) {
|
|
607
|
+
return {
|
|
608
|
+
content: [{ type: "text", text: `⚠️ PDF generation failed (${err}). Falling back to markdown:\n\n${toMarkdown(scorecard)}` }],
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return {
|
|
613
|
+
content: [{ type: "text", text: toMarkdown(scorecard) }],
|
|
614
|
+
};
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
//# sourceMappingURL=generate-scorecard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-scorecard.js","sourceRoot":"","sources":["../../src/tools/generate-scorecard.ts"],"names":[],"mappings":"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"}
|