heyiam 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/app/dist/assets/index-BGQkmy7q.css +1 -0
- package/app/dist/assets/index-CbLHxerW.js +14 -0
- package/app/dist/favicon.svg +1 -0
- package/app/dist/icons.svg +24 -0
- package/app/dist/index.html +20 -0
- package/dist/analyzer.d.ts +96 -0
- package/dist/analyzer.js +249 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/auth.d.ts +34 -0
- package/dist/auth.js +99 -0
- package/dist/auth.js.map +1 -0
- package/dist/bridge.d.ts +32 -0
- package/dist/bridge.js +211 -0
- package/dist/bridge.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +129 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/anthropic-provider.d.ts +11 -0
- package/dist/llm/anthropic-provider.js +16 -0
- package/dist/llm/anthropic-provider.js.map +1 -0
- package/dist/llm/index.d.ts +16 -0
- package/dist/llm/index.js +25 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/project-enhance.d.ts +71 -0
- package/dist/llm/project-enhance.js +236 -0
- package/dist/llm/project-enhance.js.map +1 -0
- package/dist/llm/proxy-provider.d.ts +16 -0
- package/dist/llm/proxy-provider.js +60 -0
- package/dist/llm/proxy-provider.js.map +1 -0
- package/dist/llm/triage.d.ts +66 -0
- package/dist/llm/triage.js +283 -0
- package/dist/llm/triage.js.map +1 -0
- package/dist/llm/types.d.ts +19 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/machine-key.d.ts +10 -0
- package/dist/machine-key.js +51 -0
- package/dist/machine-key.js.map +1 -0
- package/dist/parsers/claude.d.ts +18 -0
- package/dist/parsers/claude.js +265 -0
- package/dist/parsers/claude.js.map +1 -0
- package/dist/parsers/index.d.ts +28 -0
- package/dist/parsers/index.js +124 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/types.d.ts +81 -0
- package/dist/parsers/types.js +2 -0
- package/dist/parsers/types.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.js +857 -0
- package/dist/server.js.map +1 -0
- package/dist/settings.d.ts +92 -0
- package/dist/settings.js +160 -0
- package/dist/settings.js.map +1 -0
- package/dist/summarize.d.ts +72 -0
- package/dist/summarize.js +312 -0
- package/dist/summarize.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
// ── Banned words (anti-fluff enforcement) ────────────────────
|
|
3
|
+
const BANNED_WORDS = ['leverage', 'utilize', 'streamline', 'enhance', 'robust', 'seamless'];
|
|
4
|
+
const BANNED_PATTERN = new RegExp(`\\b(${BANNED_WORDS.join('|')})\\b`, 'gi');
|
|
5
|
+
export function containsBannedWords(text) {
|
|
6
|
+
const matches = text.match(BANNED_PATTERN);
|
|
7
|
+
return matches ? [...new Set(matches.map((m) => m.toLowerCase()))] : [];
|
|
8
|
+
}
|
|
9
|
+
export function stripBannedWords(text) {
|
|
10
|
+
return text.replace(BANNED_PATTERN, '').replace(/\s{2,}/g, ' ').trim();
|
|
11
|
+
}
|
|
12
|
+
// ── Signal-weighted sampling ─────────────────────────────────
|
|
13
|
+
const SELF_CORRECTION_PATTERN = /\?|actually|wait|no,|wrong/i;
|
|
14
|
+
const PASS_THROUGH_THRESHOLD = 50;
|
|
15
|
+
// Slot allocation per third: [promptSlots, logSlots]
|
|
16
|
+
const THIRD_SLOTS = [
|
|
17
|
+
[4, 10], // beginning
|
|
18
|
+
[8, 16], // middle
|
|
19
|
+
[8, 14], // end
|
|
20
|
+
];
|
|
21
|
+
export function scoreTurn(turn, allTurns, idx) {
|
|
22
|
+
let score = 0;
|
|
23
|
+
if (turn.type === 'prompt')
|
|
24
|
+
score += 1;
|
|
25
|
+
if (turn.type === 'error')
|
|
26
|
+
score += 1;
|
|
27
|
+
if (SELF_CORRECTION_PATTERN.test(turn.content))
|
|
28
|
+
score += 1;
|
|
29
|
+
if (turn.content.length > 200)
|
|
30
|
+
score += 1;
|
|
31
|
+
if (idx > 0 && allTurns[idx - 1].type === 'error')
|
|
32
|
+
score += 1;
|
|
33
|
+
return score;
|
|
34
|
+
}
|
|
35
|
+
function selectTopN(items, scores, n) {
|
|
36
|
+
if (items.length <= n)
|
|
37
|
+
return items;
|
|
38
|
+
const indexed = items.map((item, i) => ({ item, score: scores[i], idx: i }));
|
|
39
|
+
indexed.sort((a, b) => b.score - a.score || a.idx - b.idx);
|
|
40
|
+
const selected = indexed.slice(0, n);
|
|
41
|
+
selected.sort((a, b) => a.idx - b.idx);
|
|
42
|
+
return selected.map((s) => s.item);
|
|
43
|
+
}
|
|
44
|
+
export function sampleSession(session) {
|
|
45
|
+
const timeline = session.turnTimeline;
|
|
46
|
+
const rawLog = session.rawLog;
|
|
47
|
+
const total = timeline.length;
|
|
48
|
+
if (total <= PASS_THROUGH_THRESHOLD) {
|
|
49
|
+
return {
|
|
50
|
+
turns: timeline,
|
|
51
|
+
log: rawLog,
|
|
52
|
+
sampled: false,
|
|
53
|
+
totalTurns: total,
|
|
54
|
+
selectedTurns: total,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const scores = timeline.map((turn, idx) => scoreTurn(turn, timeline, idx));
|
|
58
|
+
const thirdSize = Math.floor(total / 3);
|
|
59
|
+
const thirds = [
|
|
60
|
+
[0, thirdSize],
|
|
61
|
+
[thirdSize, 2 * thirdSize],
|
|
62
|
+
[2 * thirdSize, total],
|
|
63
|
+
];
|
|
64
|
+
const selectedTurns = [];
|
|
65
|
+
for (let t = 0; t < 3; t++) {
|
|
66
|
+
const [start, end] = thirds[t];
|
|
67
|
+
const [promptSlots, _logSlots] = THIRD_SLOTS[t];
|
|
68
|
+
const thirdTurns = timeline.slice(start, end);
|
|
69
|
+
const thirdScores = scores.slice(start, end);
|
|
70
|
+
const chosen = selectTopN(thirdTurns, thirdScores, promptSlots);
|
|
71
|
+
const chosenWithIdx = chosen.map((turn) => {
|
|
72
|
+
const origIdx = start + thirdTurns.indexOf(turn);
|
|
73
|
+
return { ...turn, _originalIdx: origIdx };
|
|
74
|
+
});
|
|
75
|
+
selectedTurns.push(...chosenWithIdx);
|
|
76
|
+
}
|
|
77
|
+
// Re-sort by original position (chronological)
|
|
78
|
+
selectedTurns.sort((a, b) => a._originalIdx - b._originalIdx);
|
|
79
|
+
const annotatedTurns = selectedTurns.map((t) => ({
|
|
80
|
+
timestamp: t.timestamp,
|
|
81
|
+
type: t.type,
|
|
82
|
+
content: `[T${t._originalIdx + 1}/${total}] ${t.content}`,
|
|
83
|
+
}));
|
|
84
|
+
// Sample raw log with same three-thirds approach using log slots
|
|
85
|
+
const logTotal = rawLog.length;
|
|
86
|
+
const logThirdSize = Math.floor(logTotal / 3);
|
|
87
|
+
const logThirds = [
|
|
88
|
+
[0, logThirdSize],
|
|
89
|
+
[logThirdSize, 2 * logThirdSize],
|
|
90
|
+
[2 * logThirdSize, logTotal],
|
|
91
|
+
];
|
|
92
|
+
const selectedLogLines = [];
|
|
93
|
+
for (let t = 0; t < 3; t++) {
|
|
94
|
+
const [start, end] = logThirds[t];
|
|
95
|
+
const [_promptSlots, logSlots] = THIRD_SLOTS[t];
|
|
96
|
+
const chunk = rawLog.slice(start, end);
|
|
97
|
+
// For raw log, score by line length as a rough signal proxy
|
|
98
|
+
const chunkScores = chunk.map((line) => line.length);
|
|
99
|
+
const chosen = selectTopN(chunk, chunkScores, logSlots);
|
|
100
|
+
chosen.forEach((line) => {
|
|
101
|
+
const origIdx = start + chunk.indexOf(line);
|
|
102
|
+
selectedLogLines.push({ line, origIdx });
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
selectedLogLines.sort((a, b) => a.origIdx - b.origIdx);
|
|
106
|
+
const annotatedLog = selectedLogLines.map(({ line, origIdx }) => `[T${origIdx + 1}/${logTotal}] ${line}`);
|
|
107
|
+
return {
|
|
108
|
+
turns: annotatedTurns,
|
|
109
|
+
log: annotatedLog,
|
|
110
|
+
sampled: true,
|
|
111
|
+
totalTurns: total,
|
|
112
|
+
selectedTurns: annotatedTurns.length,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// ── Prompt construction ──────────────────────────────────────
|
|
116
|
+
function buildSystemPrompt() {
|
|
117
|
+
return `You are a technical writing assistant for heyi.am, a platform where developers document AI coding sessions as case studies.
|
|
118
|
+
|
|
119
|
+
Your job: turn raw session data into a sharp, honest summary that sounds like a dev explaining what happened to another dev in a standup. Not a blog post. Not a tutorial.
|
|
120
|
+
|
|
121
|
+
HARD RULES:
|
|
122
|
+
- NEVER use these words: ${BANNED_WORDS.join(', ')}. If you catch yourself writing one, rewrite the sentence.
|
|
123
|
+
- Title: max 80 characters. Be specific about what was done. No clickbait.
|
|
124
|
+
- Context: max 200 characters. What was the state before this session? What was broken or missing?
|
|
125
|
+
- Developer take: max 300 characters. What was hard, surprising, or worth remembering? Write in first person.
|
|
126
|
+
- Steps: 5-7 steps. Each title max 20 words. Each body max 40 words. Be concrete — mention file names, tools, and specific decisions.
|
|
127
|
+
- Skills: extract from the actual tools, files, and patterns used. No padding. If they only touched 3 technologies, list 3.
|
|
128
|
+
- Questions: generate exactly 3 targeted questions based on the developer's actual corrections, decisions, and redirections during the session. These should be specific enough that a generic answer would be obviously wrong.
|
|
129
|
+
|
|
130
|
+
TONE: Slightly rough. Concrete. Compress. A dev thinking out loud, not an AI explaining.
|
|
131
|
+
|
|
132
|
+
Respond in JSON matching this exact schema:
|
|
133
|
+
{
|
|
134
|
+
"title": "string (max 80 chars)",
|
|
135
|
+
"context": "string (max 200 chars)",
|
|
136
|
+
"developerTake": "string (max 300 chars)",
|
|
137
|
+
"skills": ["string"],
|
|
138
|
+
"questions": [{"text": "string", "suggestedAnswer": "string"}],
|
|
139
|
+
"executionSteps": [{"stepNumber": number, "title": "string (max 20 words)", "body": "string (max 40 words)"}]
|
|
140
|
+
}`;
|
|
141
|
+
}
|
|
142
|
+
function buildUserPrompt(session) {
|
|
143
|
+
const parts = [];
|
|
144
|
+
const sampling = sampleSession(session);
|
|
145
|
+
parts.push(`Session: ${session.title}`);
|
|
146
|
+
parts.push(`Project: ${session.projectName}`);
|
|
147
|
+
parts.push(`Duration: ${session.durationMinutes} min, ${session.turns} turns, ${session.linesOfCode} LOC changed`);
|
|
148
|
+
if (sampling.sampled) {
|
|
149
|
+
parts.push(`[SAMPLED: ${sampling.selectedTurns} of ${sampling.totalTurns} turns shown, distributed beginning/middle/end, high-signal moments prioritized. T{n}/${sampling.totalTurns} = position in full session.]`);
|
|
150
|
+
}
|
|
151
|
+
if (session.skills.length > 0) {
|
|
152
|
+
parts.push(`Detected skills: ${session.skills.join(', ')}`);
|
|
153
|
+
}
|
|
154
|
+
if (session.toolBreakdown.length > 0) {
|
|
155
|
+
parts.push(`Tool usage: ${session.toolBreakdown.map((t) => `${t.tool}(${t.count})`).join(', ')}`);
|
|
156
|
+
}
|
|
157
|
+
if (session.filesChanged.length > 0) {
|
|
158
|
+
const topFiles = session.filesChanged
|
|
159
|
+
.sort((a, b) => (b.additions + b.deletions) - (a.additions + a.deletions))
|
|
160
|
+
.slice(0, 10);
|
|
161
|
+
parts.push(`Key files: ${topFiles.map((f) => `${f.path} (+${f.additions}/-${f.deletions})`).join(', ')}`);
|
|
162
|
+
}
|
|
163
|
+
if (session.executionPath.length > 0) {
|
|
164
|
+
parts.push('Execution path:');
|
|
165
|
+
for (const step of session.executionPath) {
|
|
166
|
+
parts.push(` ${step.stepNumber}. [${step.type ?? 'implementation'}] ${step.title}: ${step.description}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (sampling.turns.length > 0) {
|
|
170
|
+
// Include developer prompts from sampled turns — these are the decisions and corrections
|
|
171
|
+
const devPrompts = sampling.turns.filter((t) => t.type === 'prompt');
|
|
172
|
+
if (devPrompts.length > 0) {
|
|
173
|
+
parts.push('Developer prompts (decisions & corrections):');
|
|
174
|
+
for (const p of devPrompts) {
|
|
175
|
+
parts.push(` [${p.timestamp}] ${p.content}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (sampling.log.length > 0) {
|
|
180
|
+
parts.push(`Raw log excerpt:\n${sampling.log.join('\n')}`);
|
|
181
|
+
}
|
|
182
|
+
return parts.join('\n');
|
|
183
|
+
}
|
|
184
|
+
export async function summarizeSession(session, options = {}) {
|
|
185
|
+
const client = options.client ?? new Anthropic();
|
|
186
|
+
const model = options.model ?? 'claude-sonnet-4-6';
|
|
187
|
+
const response = await client.messages.create({
|
|
188
|
+
model,
|
|
189
|
+
max_tokens: 2048,
|
|
190
|
+
system: buildSystemPrompt(),
|
|
191
|
+
messages: [{ role: 'user', content: buildUserPrompt(session) }],
|
|
192
|
+
});
|
|
193
|
+
const text = response.content
|
|
194
|
+
.filter((block) => block.type === 'text')
|
|
195
|
+
.map((block) => block.text)
|
|
196
|
+
.join('');
|
|
197
|
+
return parseEnhancementResult(text);
|
|
198
|
+
}
|
|
199
|
+
// ── Streaming enhancement ────────────────────────────────────
|
|
200
|
+
export async function* summarizeSessionStream(session, options = {}) {
|
|
201
|
+
const client = options.client ?? new Anthropic();
|
|
202
|
+
const model = options.model ?? 'claude-sonnet-4-6';
|
|
203
|
+
let fullText = '';
|
|
204
|
+
try {
|
|
205
|
+
const stream = client.messages.stream({
|
|
206
|
+
model,
|
|
207
|
+
max_tokens: 2048,
|
|
208
|
+
system: buildSystemPrompt(),
|
|
209
|
+
messages: [{ role: 'user', content: buildUserPrompt(session) }],
|
|
210
|
+
});
|
|
211
|
+
for await (const event of stream) {
|
|
212
|
+
if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
|
|
213
|
+
fullText += event.delta.text;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
const result = parseEnhancementResult(fullText);
|
|
217
|
+
// Emit structured events for progressive UI rendering
|
|
218
|
+
yield { type: 'title', data: result.title };
|
|
219
|
+
yield { type: 'context', data: result.context };
|
|
220
|
+
yield { type: 'skills', data: result.skills };
|
|
221
|
+
for (const step of result.executionSteps) {
|
|
222
|
+
yield { type: 'step', data: step };
|
|
223
|
+
}
|
|
224
|
+
yield { type: 'developer_take', data: result.developerTake };
|
|
225
|
+
for (const question of result.questions) {
|
|
226
|
+
yield { type: 'question', data: question };
|
|
227
|
+
}
|
|
228
|
+
yield { type: 'done', data: result };
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
yield { type: 'error', data: err.message };
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// ── SSE helper for Express ───────────────────────────────────
|
|
235
|
+
export function createSSEHandler(session, options = {}) {
|
|
236
|
+
return async (_req, res) => {
|
|
237
|
+
res.writeHead(200, {
|
|
238
|
+
'Content-Type': 'text/event-stream',
|
|
239
|
+
'Cache-Control': 'no-cache',
|
|
240
|
+
Connection: 'keep-alive',
|
|
241
|
+
});
|
|
242
|
+
let closed = false;
|
|
243
|
+
_req.on('close', () => { closed = true; });
|
|
244
|
+
for await (const event of summarizeSessionStream(session, options)) {
|
|
245
|
+
if (closed)
|
|
246
|
+
break;
|
|
247
|
+
res.write(`event: ${event.type}\ndata: ${JSON.stringify(event.data)}\n\n`);
|
|
248
|
+
}
|
|
249
|
+
if (!closed) {
|
|
250
|
+
res.end();
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
// ── JSON parsing with validation ─────────────────────────────
|
|
255
|
+
export function parseEnhancementResult(raw) {
|
|
256
|
+
// Extract JSON from potential markdown code fences
|
|
257
|
+
const jsonMatch = raw.match(/```(?:json)?\s*([\s\S]*?)```/) ?? [null, raw];
|
|
258
|
+
const jsonStr = jsonMatch[1].trim();
|
|
259
|
+
let parsed;
|
|
260
|
+
try {
|
|
261
|
+
parsed = JSON.parse(jsonStr);
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
throw new Error(`Failed to parse AI response as JSON: ${jsonStr.slice(0, 200)}`);
|
|
265
|
+
}
|
|
266
|
+
const title = enforceMaxLength(String(parsed.title ?? ''), 80);
|
|
267
|
+
const context = enforceMaxLength(String(parsed.context ?? ''), 200);
|
|
268
|
+
const developerTake = enforceMaxLength(String(parsed.developerTake ?? ''), 300);
|
|
269
|
+
// Validate and enforce constraints
|
|
270
|
+
const skills = Array.isArray(parsed.skills)
|
|
271
|
+
? parsed.skills.filter((s) => typeof s === 'string')
|
|
272
|
+
: [];
|
|
273
|
+
const questions = Array.isArray(parsed.questions)
|
|
274
|
+
? parsed.questions
|
|
275
|
+
.filter((q) => q.text && q.suggestedAnswer)
|
|
276
|
+
.slice(0, 3)
|
|
277
|
+
.map((q) => ({
|
|
278
|
+
text: stripBannedWords(String(q.text)),
|
|
279
|
+
suggestedAnswer: stripBannedWords(String(q.suggestedAnswer)),
|
|
280
|
+
}))
|
|
281
|
+
: [];
|
|
282
|
+
const executionSteps = Array.isArray(parsed.executionSteps)
|
|
283
|
+
? parsed.executionSteps
|
|
284
|
+
.slice(0, 7)
|
|
285
|
+
.map((step, idx) => ({
|
|
286
|
+
stepNumber: typeof step.stepNumber === 'number' ? step.stepNumber : idx + 1,
|
|
287
|
+
title: enforceWordLimit(stripBannedWords(String(step.title ?? '')), 20),
|
|
288
|
+
body: enforceWordLimit(stripBannedWords(String(step.body ?? '')), 40),
|
|
289
|
+
}))
|
|
290
|
+
: [];
|
|
291
|
+
return {
|
|
292
|
+
title: stripBannedWords(title),
|
|
293
|
+
context: stripBannedWords(context),
|
|
294
|
+
developerTake: stripBannedWords(developerTake),
|
|
295
|
+
skills,
|
|
296
|
+
questions,
|
|
297
|
+
executionSteps,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function enforceMaxLength(str, max) {
|
|
301
|
+
return str.length > max ? str.slice(0, max - 1) + '…' : str;
|
|
302
|
+
}
|
|
303
|
+
function enforceWordLimit(str, maxWords) {
|
|
304
|
+
const words = str.split(/\s+/).filter(Boolean);
|
|
305
|
+
if (words.length <= maxWords)
|
|
306
|
+
return str;
|
|
307
|
+
return words.slice(0, maxWords).join(' ') + '…';
|
|
308
|
+
}
|
|
309
|
+
// ── Exports for testing ──────────────────────────────────────
|
|
310
|
+
export { buildSystemPrompt as _buildSystemPrompt, buildUserPrompt as _buildUserPrompt };
|
|
311
|
+
// scoreTurn and sampleSession are already exported above
|
|
312
|
+
//# sourceMappingURL=summarize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../src/summarize.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "heyiam",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Turn AI coding sessions into portfolio case studies",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/interactivecats/heyi.am"
|
|
10
|
+
},
|
|
11
|
+
"keywords": ["ai", "portfolio", "claude", "coding-sessions", "developer-tools"],
|
|
12
|
+
"bin": {
|
|
13
|
+
"heyiam": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"app/dist"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc && cd app && npx vite build",
|
|
21
|
+
"prepublishOnly": "npm run build && find dist -name '*.test.*' -delete",
|
|
22
|
+
"dev": "npx concurrently \"npm:dev:api\" \"npm:dev:app\"",
|
|
23
|
+
"dev:api": "tsx watch src/index.ts open --no-open",
|
|
24
|
+
"dev:app": "cd app && npm run dev",
|
|
25
|
+
"test": "vitest run && cd app && npx vitest run",
|
|
26
|
+
"test:backend": "vitest run",
|
|
27
|
+
"test:frontend": "cd app && npx vitest run"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@anthropic-ai/sdk": "^0.79.0",
|
|
31
|
+
"commander": "^13.1.0",
|
|
32
|
+
"cors": "^2.8.6",
|
|
33
|
+
"express": "^5.2.1",
|
|
34
|
+
"open": "^10.1.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/cors": "^2.8.19",
|
|
38
|
+
"@types/express": "^5.0.6",
|
|
39
|
+
"@types/node": "^22.0.0",
|
|
40
|
+
"@types/supertest": "^7.2.0",
|
|
41
|
+
"concurrently": "^9.2.1",
|
|
42
|
+
"supertest": "^7.2.2",
|
|
43
|
+
"tsx": "^4.19.0",
|
|
44
|
+
"typescript": "^5.7.0",
|
|
45
|
+
"vitest": "^4.1.0"
|
|
46
|
+
}
|
|
47
|
+
}
|