@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.
- package/README.md +195 -0
- package/dist/commands/apply.d.ts +2 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +186 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/capture.d.ts +5 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +88 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/diff.d.ts +2 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +43 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/ingest.d.ts +14 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +111 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +165 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/layers.d.ts +2 -0
- package/dist/commands/layers.d.ts.map +1 -0
- package/dist/commands/layers.js +141 -0
- package/dist/commands/layers.js.map +1 -0
- package/dist/commands/onboard.d.ts +2 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +275 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/run.d.ts +4 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +526 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +121 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/claude.d.ts +12 -0
- package/dist/lib/claude.d.ts.map +1 -0
- package/dist/lib/claude.js +70 -0
- package/dist/lib/claude.js.map +1 -0
- package/dist/lib/metrics.d.ts +29 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +96 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/parser.d.ts +28 -0
- package/dist/lib/parser.d.ts.map +1 -0
- package/dist/lib/parser.js +226 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/storage.d.ts +126 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +201 -0
- package/dist/lib/storage.js.map +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AA2CA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwInD"}
|