@lcvbeek/patina 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 (58) hide show
  1. package/README.md +195 -0
  2. package/dist/commands/apply.d.ts +2 -0
  3. package/dist/commands/apply.d.ts.map +1 -0
  4. package/dist/commands/apply.js +186 -0
  5. package/dist/commands/apply.js.map +1 -0
  6. package/dist/commands/capture.d.ts +5 -0
  7. package/dist/commands/capture.d.ts.map +1 -0
  8. package/dist/commands/capture.js +88 -0
  9. package/dist/commands/capture.js.map +1 -0
  10. package/dist/commands/diff.d.ts +2 -0
  11. package/dist/commands/diff.d.ts.map +1 -0
  12. package/dist/commands/diff.js +43 -0
  13. package/dist/commands/diff.js.map +1 -0
  14. package/dist/commands/ingest.d.ts +14 -0
  15. package/dist/commands/ingest.d.ts.map +1 -0
  16. package/dist/commands/ingest.js +111 -0
  17. package/dist/commands/ingest.js.map +1 -0
  18. package/dist/commands/init.d.ts +2 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +165 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/layers.d.ts +2 -0
  23. package/dist/commands/layers.d.ts.map +1 -0
  24. package/dist/commands/layers.js +141 -0
  25. package/dist/commands/layers.js.map +1 -0
  26. package/dist/commands/onboard.d.ts +2 -0
  27. package/dist/commands/onboard.d.ts.map +1 -0
  28. package/dist/commands/onboard.js +275 -0
  29. package/dist/commands/onboard.js.map +1 -0
  30. package/dist/commands/run.d.ts +4 -0
  31. package/dist/commands/run.d.ts.map +1 -0
  32. package/dist/commands/run.js +526 -0
  33. package/dist/commands/run.js.map +1 -0
  34. package/dist/commands/status.d.ts +2 -0
  35. package/dist/commands/status.d.ts.map +1 -0
  36. package/dist/commands/status.js +121 -0
  37. package/dist/commands/status.js.map +1 -0
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +108 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/lib/claude.d.ts +12 -0
  43. package/dist/lib/claude.d.ts.map +1 -0
  44. package/dist/lib/claude.js +70 -0
  45. package/dist/lib/claude.js.map +1 -0
  46. package/dist/lib/metrics.d.ts +29 -0
  47. package/dist/lib/metrics.d.ts.map +1 -0
  48. package/dist/lib/metrics.js +96 -0
  49. package/dist/lib/metrics.js.map +1 -0
  50. package/dist/lib/parser.d.ts +28 -0
  51. package/dist/lib/parser.d.ts.map +1 -0
  52. package/dist/lib/parser.js +226 -0
  53. package/dist/lib/parser.js.map +1 -0
  54. package/dist/lib/storage.d.ts +126 -0
  55. package/dist/lib/storage.d.ts.map +1 -0
  56. package/dist/lib/storage.js +201 -0
  57. package/dist/lib/storage.js.map +1 -0
  58. package/package.json +45 -0
@@ -0,0 +1,526 @@
1
+ import readline from 'readline';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { assertInitialised, readAllSessions, readCaptures, LIVING_DOC_FILE, writePendingDiff, writeCycleFile, getLatestCycleDate, } from '../lib/storage.js';
5
+ import { runIngest } from './ingest.js';
6
+ import { onboardCommand } from './onboard.js';
7
+ import { callClaudeForJson } from '../lib/claude.js';
8
+ import { computeAggregates, computeTrend, formatNumber, trendArrow, } from '../lib/metrics.js';
9
+ // ---------------------------------------------------------------------------
10
+ // ANSI helpers (no extra deps)
11
+ // ---------------------------------------------------------------------------
12
+ const isTTY = process.stdout.isTTY;
13
+ function bold(s) {
14
+ return isTTY ? `\x1b[1m${s}\x1b[0m` : s;
15
+ }
16
+ function dim(s) {
17
+ return isTTY ? `\x1b[2m${s}\x1b[0m` : s;
18
+ }
19
+ function green(s) {
20
+ return isTTY ? `\x1b[32m${s}\x1b[0m` : s;
21
+ }
22
+ function yellow(s) {
23
+ return isTTY ? `\x1b[33m${s}\x1b[0m` : s;
24
+ }
25
+ function cyan(s) {
26
+ return isTTY ? `\x1b[36m${s}\x1b[0m` : s;
27
+ }
28
+ function red(s) {
29
+ return isTTY ? `\x1b[31m${s}\x1b[0m` : s;
30
+ }
31
+ function hr(char = '─', len = 60) {
32
+ return dim(char.repeat(len));
33
+ }
34
+ function section(title) {
35
+ console.log(`\n${bold(title)}`);
36
+ console.log(hr());
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Readline prompt helper
40
+ // ---------------------------------------------------------------------------
41
+ function createRL() {
42
+ return readline.createInterface({
43
+ input: process.stdin,
44
+ output: process.stdout,
45
+ terminal: isTTY,
46
+ });
47
+ }
48
+ async function prompt(rl, question) {
49
+ return new Promise((resolve) => {
50
+ rl.question(question, (answer) => {
51
+ resolve(answer.trim());
52
+ });
53
+ });
54
+ }
55
+ async function promptMultiline(rl, question) {
56
+ console.log(question);
57
+ console.log(dim(' (Press Enter twice when done, or type your answer on one line)'));
58
+ return new Promise((resolve) => {
59
+ const lines = [];
60
+ let blankCount = 0;
61
+ const handler = (line) => {
62
+ if (line === '') {
63
+ blankCount++;
64
+ if (blankCount >= 1 && lines.length > 0) {
65
+ rl.removeListener('line', handler);
66
+ resolve(lines.join('\n').trim());
67
+ return;
68
+ }
69
+ }
70
+ else {
71
+ blankCount = 0;
72
+ lines.push(line);
73
+ }
74
+ };
75
+ rl.on('line', handler);
76
+ });
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Reflection questions (public, sent to Claude)
80
+ // ---------------------------------------------------------------------------
81
+ const PUBLIC_QUESTIONS = [
82
+ {
83
+ key: 'overall_feel',
84
+ text: 'How did this cycle feel overall? (work pace, AI collaboration, output quality)',
85
+ },
86
+ {
87
+ key: 'went_well',
88
+ text: 'What AI-assisted work went particularly well?',
89
+ },
90
+ {
91
+ key: 'inefficiencies',
92
+ text: 'What felt inefficient, frustrating, or produced poor results?',
93
+ },
94
+ {
95
+ key: 'near_misses',
96
+ text: 'Any near-misses — moments where AI almost did something wrong or risky?',
97
+ },
98
+ {
99
+ key: 'do_differently',
100
+ text: 'Anything specific you want your AI to do differently next cycle?',
101
+ },
102
+ {
103
+ key: 'other',
104
+ text: 'Anything else worth capturing? (optional — press Enter to skip)',
105
+ },
106
+ ];
107
+ // ---------------------------------------------------------------------------
108
+ // Context loading
109
+ // ---------------------------------------------------------------------------
110
+ function loadLivingDoc(cwd) {
111
+ const file = path.join(cwd, LIVING_DOC_FILE);
112
+ if (!fs.existsSync(file))
113
+ return '(no patina.md found)';
114
+ const content = fs.readFileSync(file, 'utf-8');
115
+ // Truncate to 2000 chars to keep prompt tight
116
+ if (content.length > 2000) {
117
+ return content.slice(0, 2000) + '\n… [truncated]';
118
+ }
119
+ return content;
120
+ }
121
+ function sessionsInCycle(sessions, lastCycleDate) {
122
+ if (!lastCycleDate)
123
+ return sessions;
124
+ const cutoff = new Date(lastCycleDate + 'T00:00:00Z').getTime();
125
+ return sessions.filter((s) => new Date(s.timestamp).getTime() > cutoff);
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Compact session summary for Claude (avoid ballooning the prompt)
129
+ // ---------------------------------------------------------------------------
130
+ function compressSessionsForPrompt(sessions) {
131
+ if (sessions.length === 0)
132
+ return '(no sessions)';
133
+ // Keep it to a compact table-style representation
134
+ const lines = [
135
+ `Total sessions: ${sessions.length}`,
136
+ 'Date | Project | Tokens | Tools | Rework',
137
+ '--- | --- | --- | --- | ---',
138
+ ];
139
+ for (const s of sessions.slice(0, 30)) {
140
+ const tools = Object.entries(s.tool_calls)
141
+ .sort(([, a], [, b]) => b - a)
142
+ .slice(0, 3)
143
+ .map(([t, c]) => `${t}:${c}`)
144
+ .join(', ');
145
+ lines.push(`${s.timestamp.slice(0, 10)} | ${s.project.slice(0, 20)} | ${s.estimated_tokens} | ${tools || 'none'} | ${s.had_rework ? 'yes' : 'no'}`);
146
+ }
147
+ if (sessions.length > 30) {
148
+ lines.push(`… and ${sessions.length - 30} more sessions (omitted for brevity)`);
149
+ }
150
+ return lines.join('\n');
151
+ }
152
+ // ---------------------------------------------------------------------------
153
+ // Build the user message for Claude
154
+ // ---------------------------------------------------------------------------
155
+ function buildSynthesisPrompt(params) {
156
+ const { cycleStart, cycleEnd, sessionCount, sessions, captures, reflections, livingDoc, lastCycleDate } = params;
157
+ const agg = computeAggregates(sessions);
158
+ const trend = computeTrend(sessions);
159
+ const metricsSummary = [
160
+ `Sessions: ${sessionCount}`,
161
+ `Total tokens (est.): ${formatNumber(agg.total_tokens)}`,
162
+ `Avg tokens/session: ${formatNumber(agg.avg_tokens_per_session)}`,
163
+ `Rework rate: ${agg.rework_rate_pct}% (${agg.rework_sessions} sessions)`,
164
+ `Top tools: ${agg.tool_usage
165
+ .slice(0, 5)
166
+ .map((t) => `${t.tool} (${t.count})`)
167
+ .join(', ')}`,
168
+ ].join('\n');
169
+ const trendSummary = trend
170
+ ? [
171
+ `Token trend (first half → second half): ${trendArrow(trend.token_delta_pct)}`,
172
+ `Rework trend: ${trendArrow(trend.rework_delta_pct)}`,
173
+ ].join('\n')
174
+ : 'Not enough data for trend analysis.';
175
+ const reflectionLines = PUBLIC_QUESTIONS.map((q) => {
176
+ const answer = reflections[q.key] || '(no answer)';
177
+ return `Q: ${q.text}\nA: ${answer}`;
178
+ }).join('\n\n');
179
+ const sessionTable = compressSessionsForPrompt(sessions);
180
+ const capturesSection = captures.length > 0
181
+ ? captures
182
+ .map((c) => {
183
+ const tag = c.tag ? ` [${c.tag}]` : '';
184
+ return `- ${c.timestamp.slice(0, 10)} ${c.author}${tag}: ${c.text}`;
185
+ })
186
+ .join('\n')
187
+ : null;
188
+ return `## Cycle Overview
189
+ Date range: ${cycleStart} → ${cycleEnd}
190
+ ${lastCycleDate ? `Previous cycle: ${lastCycleDate}` : 'First cycle (no previous baseline)'}
191
+
192
+ ## Metrics
193
+ ${metricsSummary}
194
+
195
+ ## Trend
196
+ ${trendSummary}
197
+
198
+ ## Session Detail
199
+ ${sessionTable}
200
+
201
+ ## Reflection Answers
202
+ ${reflectionLines}
203
+ ${capturesSection ? `\n## Notable Moments Captured This Cycle\n${capturesSection}` : ''}
204
+ ## Current Living Doc (AI Operating Constitution)
205
+ \`\`\`
206
+ ${livingDoc}
207
+ \`\`\`
208
+
209
+ ---
210
+
211
+ Please analyse the above and respond with a JSON object matching this exact TypeScript type (no markdown wrapper, raw JSON only):
212
+
213
+ {
214
+ "cycle_summary": "string — 2-3 sentences on what the data + reflection show",
215
+ "patterns": [
216
+ {
217
+ "pattern": "what was observed",
218
+ "frequency": "how often / how significant",
219
+ "interpretation": "what it suggests about how the user works"
220
+ }
221
+ ],
222
+ "coaching_insight": {
223
+ "observation": "specific thing from their sessions",
224
+ "what_it_suggests": "interpretation",
225
+ "one_thing_to_try": "concrete, actionable nudge"
226
+ },
227
+ "proposed_instruction": {
228
+ "rationale": "why this change is warranted",
229
+ "diff": "the actual text to add to patina.md",
230
+ "section": "which section of patina.md it belongs in (e.g. '1. Working Agreements')"
231
+ },
232
+ "opportunity": {
233
+ "observation": "something currently slow/manual/inefficient",
234
+ "suggestion": "how AI could help",
235
+ "effort": "low | medium | high"
236
+ }
237
+ }`;
238
+ }
239
+ // ---------------------------------------------------------------------------
240
+ // Call Claude API
241
+ // ---------------------------------------------------------------------------
242
+ async function callClaude(userMessage) {
243
+ const fullPrompt = 'You are an embedded coach and retrospective facilitator for a human-AI hybrid team. ' +
244
+ 'You help individuals reflect on their AI collaboration patterns and improve over time. ' +
245
+ 'Your tone is direct, specific, and practical — not generic. ' +
246
+ 'Always ground insights in the actual data provided, not general advice.\n\n' +
247
+ userMessage;
248
+ return callClaudeForJson(fullPrompt);
249
+ }
250
+ // ---------------------------------------------------------------------------
251
+ // Display synthesis results
252
+ // ---------------------------------------------------------------------------
253
+ function displaySynthesis(synthesis) {
254
+ section('Cycle Summary');
255
+ console.log(` ${synthesis.cycle_summary}`);
256
+ section('Patterns Identified');
257
+ if (synthesis.patterns.length === 0) {
258
+ console.log(dim(' No patterns identified.'));
259
+ }
260
+ else {
261
+ for (let i = 0; i < synthesis.patterns.length; i++) {
262
+ const p = synthesis.patterns[i];
263
+ console.log(`\n ${bold(`${i + 1}. ${p.pattern}`)}`);
264
+ console.log(` ${dim('Frequency:')} ${p.frequency}`);
265
+ console.log(` ${dim('Interpretation:')} ${p.interpretation}`);
266
+ }
267
+ }
268
+ section('Coaching Insight');
269
+ const ci = synthesis.coaching_insight;
270
+ console.log(` ${bold('Observation:')} ${ci.observation}`);
271
+ console.log(` ${bold('What it suggests:')} ${ci.what_it_suggests}`);
272
+ console.log(`\n ${green(bold('One thing to try:'))} ${ci.one_thing_to_try}`);
273
+ section('Proposed Instruction Change');
274
+ const pi = synthesis.proposed_instruction;
275
+ console.log(` ${bold('Section:')} ${cyan(pi.section)}`);
276
+ console.log(` ${bold('Rationale:')} ${pi.rationale}`);
277
+ console.log(`\n ${bold('Proposed addition:')}`);
278
+ const diffLines = pi.diff.split('\n');
279
+ for (const line of diffLines) {
280
+ console.log(` ${green('+ ' + line)}`);
281
+ }
282
+ section('Opportunity');
283
+ const opp = synthesis.opportunity;
284
+ const effortColour = opp.effort === 'low' ? green : opp.effort === 'medium' ? yellow : cyan;
285
+ console.log(` ${bold('Observation:')} ${opp.observation}`);
286
+ console.log(` ${bold('Suggestion:')} ${opp.suggestion}`);
287
+ console.log(` ${bold('Effort:')} ${effortColour(opp.effort)}`);
288
+ }
289
+ // ---------------------------------------------------------------------------
290
+ // Build cycle markdown file
291
+ // ---------------------------------------------------------------------------
292
+ function buildCycleMarkdown(params) {
293
+ const { date, cycleStart, cycleEnd, reflections, synthesis, sessions } = params;
294
+ const agg = computeAggregates(sessions);
295
+ const reflectionSection = PUBLIC_QUESTIONS.map((q) => {
296
+ const answer = reflections[q.key] || '_(no answer)_';
297
+ return `**${q.text}**\n\n${answer}`;
298
+ }).join('\n\n---\n\n');
299
+ const patternsMd = synthesis.patterns
300
+ .map((p, i) => `### Pattern ${i + 1}: ${p.pattern}\n- **Frequency:** ${p.frequency}\n- **Interpretation:** ${p.interpretation}`)
301
+ .join('\n\n');
302
+ const topTools = agg.tool_usage
303
+ .slice(0, 5)
304
+ .map((t) => `- ${t.tool}: ${t.count} calls`)
305
+ .join('\n');
306
+ return `# Retro Cycle — ${date}
307
+
308
+ > Generated by \`patina run\` on ${new Date().toISOString()}
309
+ > Cycle period: ${cycleStart} → ${cycleEnd}
310
+ > Sessions analysed: ${sessions.length}
311
+
312
+ ---
313
+
314
+ ## Metrics Snapshot
315
+
316
+ | Metric | Value |
317
+ |---|---|
318
+ | Total sessions | ${agg.total_sessions} |
319
+ | Total tokens (est.) | ${formatNumber(agg.total_tokens)} |
320
+ | Avg tokens/session | ${formatNumber(agg.avg_tokens_per_session)} |
321
+ | Sessions with rework | ${agg.rework_sessions} (${agg.rework_rate_pct}%) |
322
+
323
+ ### Top Tool Usage
324
+ ${topTools || '_No tool usage recorded._'}
325
+
326
+ ---
327
+
328
+ ## Cycle Summary
329
+
330
+ ${synthesis.cycle_summary}
331
+
332
+ ---
333
+
334
+ ## Patterns
335
+
336
+ ${patternsMd || '_No patterns identified._'}
337
+
338
+ ---
339
+
340
+ ## Coaching Insight
341
+
342
+ **Observation:** ${synthesis.coaching_insight.observation}
343
+
344
+ **What it suggests:** ${synthesis.coaching_insight.what_it_suggests}
345
+
346
+ **One thing to try:** ${synthesis.coaching_insight.one_thing_to_try}
347
+
348
+ ---
349
+
350
+ ## Proposed Instruction Change
351
+
352
+ **Section:** ${synthesis.proposed_instruction.section}
353
+
354
+ **Rationale:** ${synthesis.proposed_instruction.rationale}
355
+
356
+ **Proposed addition:**
357
+
358
+ \`\`\`
359
+ ${synthesis.proposed_instruction.diff}
360
+ \`\`\`
361
+
362
+ ---
363
+
364
+ ## Opportunity
365
+
366
+ **Observation:** ${synthesis.opportunity.observation}
367
+
368
+ **Suggestion:** ${synthesis.opportunity.suggestion}
369
+
370
+ **Effort:** ${synthesis.opportunity.effort}
371
+
372
+ ---
373
+
374
+ ## Reflection Answers
375
+
376
+ ${reflectionSection}
377
+
378
+ `;
379
+ }
380
+ // ---------------------------------------------------------------------------
381
+ // Main command
382
+ // ---------------------------------------------------------------------------
383
+ export async function runCommand(options = {}) {
384
+ assertInitialised();
385
+ const cwd = process.cwd();
386
+ // ── 1. Load context ───────────────────────────────────────────────────────
387
+ // Auto-ingest new sessions silently before running
388
+ const { ingested: newSessions } = runIngest();
389
+ if (newSessions > 0) {
390
+ console.log(dim(` Auto-ingested ${newSessions} new session(s) from Claude Code logs.`));
391
+ }
392
+ const lastCycleDate = getLatestCycleDate(cwd);
393
+ // First cycle or explicit --onboard flag → framework-driven onboarding
394
+ if (lastCycleDate === null || options.onboard) {
395
+ await onboardCommand(cwd);
396
+ return;
397
+ }
398
+ const allSessions = readAllSessions(cwd);
399
+ if (allSessions.length === 0) {
400
+ console.error(red('No sessions found.') +
401
+ ' Run `patina ingest` first to import Claude Code logs.');
402
+ process.exit(1);
403
+ }
404
+ const cycleSessions = sessionsInCycle(allSessions, lastCycleDate);
405
+ const cycleCaptures = readCaptures(cwd, lastCycleDate);
406
+ const today = new Date().toISOString().slice(0, 10);
407
+ const cycleStart = lastCycleDate ??
408
+ (allSessions
409
+ .map((s) => s.timestamp.slice(0, 10))
410
+ .sort()[0] ?? today);
411
+ const cycleEnd = today;
412
+ const livingDoc = loadLivingDoc(cwd);
413
+ // ── Banner ─────────────────────────────────────────────────────────────────
414
+ console.log(`\n${bold('patina run')} — AI-assisted retrospective`);
415
+ console.log(hr());
416
+ console.log(` Cycle period : ${cyan(cycleStart)} → ${cyan(cycleEnd)}`);
417
+ console.log(` Sessions : ${bold(String(cycleSessions.length))} ${dim(`(${allSessions.length} total ingested)`)}`);
418
+ if (lastCycleDate) {
419
+ console.log(` Last cycle : ${dim(lastCycleDate)}`);
420
+ }
421
+ else {
422
+ console.log(` Last cycle : ${dim('none (first cycle)')}`);
423
+ }
424
+ if (cycleCaptures.length > 0) {
425
+ console.log(` Captures : ${bold(String(cycleCaptures.length))} ${dim('notable moment(s) queued')}`);
426
+ }
427
+ console.log();
428
+ // ── 2. Reflection prompts ─────────────────────────────────────────────────
429
+ const rl = createRL();
430
+ // Check for saved reflection answers from a previous failed attempt
431
+ const pendingReflectionPath = path.join(cwd, '.patina', 'pending-reflection.json');
432
+ let reflections = {};
433
+ let usingPending = false;
434
+ if (fs.existsSync(pendingReflectionPath)) {
435
+ const saved = JSON.parse(fs.readFileSync(pendingReflectionPath, 'utf-8'));
436
+ reflections = saved.reflections;
437
+ usingPending = true;
438
+ console.log(cyan('Resuming from saved reflection answers (previous attempt failed).'));
439
+ console.log(dim('Delete .patina/pending-reflection.json to start fresh.'));
440
+ console.log();
441
+ }
442
+ if (!usingPending) {
443
+ console.log(bold('Reflection questions'));
444
+ console.log(dim('Answer each question. Your responses help Claude give specific, grounded advice.'));
445
+ console.log();
446
+ for (let i = 0; i < PUBLIC_QUESTIONS.length; i++) {
447
+ const q = PUBLIC_QUESTIONS[i];
448
+ const label = `${dim(`[${i + 1}/${PUBLIC_QUESTIONS.length}]`)} ${bold(q.text)}\n> `;
449
+ reflections[q.key] = await prompt(rl, label);
450
+ console.log();
451
+ }
452
+ }
453
+ rl.close();
454
+ console.log();
455
+ console.log(hr());
456
+ console.log(`\n${bold('Sending to Claude for synthesis...')}`);
457
+ // ── 3. Claude API synthesis ───────────────────────────────────────────────
458
+ const synthesisPrompt = buildSynthesisPrompt({
459
+ cycleStart,
460
+ cycleEnd,
461
+ sessionCount: cycleSessions.length,
462
+ sessions: cycleSessions.length > 0 ? cycleSessions : allSessions,
463
+ captures: cycleCaptures,
464
+ reflections,
465
+ livingDoc,
466
+ lastCycleDate,
467
+ });
468
+ let synthesis;
469
+ try {
470
+ synthesis = await callClaude(synthesisPrompt);
471
+ }
472
+ catch (err) {
473
+ const msg = err instanceof Error ? err.message : String(err);
474
+ // Other errors: save reflection answers for retry
475
+ console.error(`\n${red('Claude CLI call failed:')} ${msg}`);
476
+ console.log('\nSaving your reflection answers so you can retry...');
477
+ const savedReflections = {
478
+ timestamp: new Date().toISOString(),
479
+ cycleStart,
480
+ cycleEnd,
481
+ reflections,
482
+ };
483
+ const savePath = path.join(cwd, '.patina', 'pending-reflection.json');
484
+ fs.writeFileSync(savePath, JSON.stringify(savedReflections, null, 2) + '\n', 'utf-8');
485
+ console.log(`Saved to: ${dim(savePath)}`);
486
+ console.log('Run `patina run` again to retry with the same answers.');
487
+ process.exit(1);
488
+ }
489
+ // ── 4. Display results ────────────────────────────────────────────────────
490
+ console.log(`\n${bold('Synthesis complete.')}\n`);
491
+ displaySynthesis(synthesis);
492
+ // ── 5. Save outputs ───────────────────────────────────────────────────────
493
+ // Save cycle file
494
+ const sessionsForCycle = cycleSessions.length > 0 ? cycleSessions : allSessions;
495
+ const cycleMarkdown = buildCycleMarkdown({
496
+ date: today,
497
+ cycleStart,
498
+ cycleEnd,
499
+ reflections,
500
+ synthesis,
501
+ sessions: sessionsForCycle,
502
+ });
503
+ writeCycleFile(today, cycleMarkdown, cwd);
504
+ // Clean up pending reflection if it was used
505
+ if (fs.existsSync(pendingReflectionPath)) {
506
+ fs.unlinkSync(pendingReflectionPath);
507
+ }
508
+ // Save pending diff for patina diff/apply
509
+ const pendingDiff = {
510
+ section: synthesis.proposed_instruction.section,
511
+ rationale: synthesis.proposed_instruction.rationale,
512
+ diff: synthesis.proposed_instruction.diff,
513
+ timestamp: new Date().toISOString(),
514
+ };
515
+ writePendingDiff(pendingDiff, cwd);
516
+ // ── Footer ─────────────────────────────────────────────────────────────────
517
+ console.log(`\n${hr()}`);
518
+ console.log(`\n${bold('Saved:')}`);
519
+ console.log(` Cycle report ${dim(`.patina/cycles/${today}.md`)}`);
520
+ console.log(` Pending diff ${dim('.patina/pending-diff.json')}`);
521
+ console.log();
522
+ console.log(`Run ${cyan('`patina diff`')} to review the proposed instruction change.`);
523
+ console.log(`Run ${cyan('`patina buff`')} to apply it to your patina.md.`);
524
+ console.log();
525
+ }
526
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AA2CA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwInD"}