@lcvbeek/patina 0.2.0 → 0.4.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 +211 -78
- package/dist/commands/apply.d.ts +5 -3
- package/dist/commands/apply.d.ts.map +1 -1
- package/dist/commands/apply.js +106 -71
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/capture.d.ts +2 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +46 -32
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +22 -9
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +33 -33
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/layers.d.ts +5 -1
- package/dist/commands/layers.d.ts.map +1 -1
- package/dist/commands/layers.js +115 -76
- package/dist/commands/layers.js.map +1 -1
- package/dist/commands/onboard.d.ts +1 -1
- package/dist/commands/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +90 -73
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/reflect.d.ts +2 -0
- package/dist/commands/reflect.d.ts.map +1 -0
- package/dist/commands/reflect.js +95 -0
- package/dist/commands/reflect.js.map +1 -0
- package/dist/commands/run.d.ts +8 -6
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +170 -209
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +17 -25
- package/dist/commands/status.js.map +1 -1
- package/dist/index.js +50 -56
- package/dist/index.js.map +1 -1
- package/dist/lib/claude.d.ts.map +1 -1
- package/dist/lib/claude.js +35 -24
- package/dist/lib/claude.js.map +1 -1
- package/dist/lib/git.d.ts +2 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +9 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/lint.js +14 -14
- package/dist/lib/metrics.d.ts +1 -1
- package/dist/lib/metrics.d.ts.map +1 -1
- package/dist/lib/metrics.js +9 -12
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/parser.d.ts +7 -1
- package/dist/lib/parser.d.ts.map +1 -1
- package/dist/lib/parser.js +46 -37
- package/dist/lib/parser.js.map +1 -1
- package/dist/lib/questions.d.ts +14 -0
- package/dist/lib/questions.d.ts.map +1 -0
- package/dist/lib/questions.js +58 -0
- package/dist/lib/questions.js.map +1 -0
- package/dist/lib/storage.d.ts +85 -12
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +165 -57
- package/dist/lib/storage.js.map +1 -1
- package/package.json +6 -4
package/dist/commands/onboard.js
CHANGED
|
@@ -1,19 +1,33 @@
|
|
|
1
|
-
import fs from
|
|
2
|
-
import path from
|
|
3
|
-
import readline from
|
|
4
|
-
import { LIVING_DOC_FILE, SPOKE_FILES, writeCycleFile, ensureSpokeFiles
|
|
5
|
-
import { callClaudeForJson } from
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import readline from "readline";
|
|
4
|
+
import { LIVING_DOC_FILE, SPOKE_FILES, writeCycleFile, ensureSpokeFiles } from "../lib/storage.js";
|
|
5
|
+
import { callClaudeForJson } from "../lib/claude.js";
|
|
6
6
|
// ---------------------------------------------------------------------------
|
|
7
7
|
// ANSI helpers
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
9
|
const isTTY = process.stdout.isTTY;
|
|
10
|
-
function bold(s) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
function
|
|
10
|
+
function bold(s) {
|
|
11
|
+
return isTTY ? `\x1b[1m${s}\x1b[0m` : s;
|
|
12
|
+
}
|
|
13
|
+
function dim(s) {
|
|
14
|
+
return isTTY ? `\x1b[2m${s}\x1b[0m` : s;
|
|
15
|
+
}
|
|
16
|
+
function green(s) {
|
|
17
|
+
return isTTY ? `\x1b[32m${s}\x1b[0m` : s;
|
|
18
|
+
}
|
|
19
|
+
function cyan(s) {
|
|
20
|
+
return isTTY ? `\x1b[36m${s}\x1b[0m` : s;
|
|
21
|
+
}
|
|
22
|
+
function yellow(s) {
|
|
23
|
+
return isTTY ? `\x1b[33m${s}\x1b[0m` : s;
|
|
24
|
+
}
|
|
25
|
+
function red(s) {
|
|
26
|
+
return isTTY ? `\x1b[31m${s}\x1b[0m` : s;
|
|
27
|
+
}
|
|
28
|
+
function hr(len = 60) {
|
|
29
|
+
return dim("─".repeat(len));
|
|
30
|
+
}
|
|
17
31
|
function section(title) {
|
|
18
32
|
console.log(`\n${bold(title)}`);
|
|
19
33
|
console.log(hr());
|
|
@@ -24,49 +38,49 @@ function section(title) {
|
|
|
24
38
|
const QUESTIONS = [
|
|
25
39
|
// Behavior Contract
|
|
26
40
|
{
|
|
27
|
-
key:
|
|
28
|
-
label:
|
|
29
|
-
text:
|
|
41
|
+
key: "agent_purpose",
|
|
42
|
+
label: "Behavior Contract",
|
|
43
|
+
text: "What does your AI agent primarily help you with? (one sentence)",
|
|
30
44
|
},
|
|
31
45
|
{
|
|
32
|
-
key:
|
|
46
|
+
key: "always_do",
|
|
33
47
|
label: null,
|
|
34
|
-
text:
|
|
48
|
+
text: "What should it ALWAYS do in every session?",
|
|
35
49
|
},
|
|
36
50
|
{
|
|
37
|
-
key:
|
|
51
|
+
key: "never_do",
|
|
38
52
|
label: null,
|
|
39
|
-
text:
|
|
53
|
+
text: "What should it NEVER do, regardless of what you ask?",
|
|
40
54
|
},
|
|
41
55
|
{
|
|
42
|
-
key:
|
|
56
|
+
key: "tone",
|
|
43
57
|
label: null,
|
|
44
|
-
text:
|
|
58
|
+
text: "How should it communicate? (e.g., direct and brief, explain its reasoning, lead with code)",
|
|
45
59
|
},
|
|
46
60
|
{
|
|
47
|
-
key:
|
|
61
|
+
key: "confidence_threshold",
|
|
48
62
|
label: null,
|
|
49
|
-
text:
|
|
63
|
+
text: "When should it stop and ask rather than proceed?",
|
|
50
64
|
},
|
|
51
65
|
// Autonomy Map
|
|
52
66
|
{
|
|
53
|
-
key:
|
|
54
|
-
label:
|
|
67
|
+
key: "auto_ok",
|
|
68
|
+
label: "Autonomy Map",
|
|
55
69
|
text: "What's a task you'd trust it to handle fully automatically?",
|
|
56
70
|
},
|
|
57
71
|
{
|
|
58
|
-
key:
|
|
72
|
+
key: "always_review",
|
|
59
73
|
label: null,
|
|
60
74
|
text: "What's a scenario that should ALWAYS require your explicit approval, no matter what?",
|
|
61
75
|
},
|
|
62
76
|
// Eval Framework
|
|
63
77
|
{
|
|
64
|
-
key:
|
|
65
|
-
label:
|
|
78
|
+
key: "good_output",
|
|
79
|
+
label: "Eval Framework",
|
|
66
80
|
text: "What does good output look like for your most common task?",
|
|
67
81
|
},
|
|
68
82
|
{
|
|
69
|
-
key:
|
|
83
|
+
key: "biggest_fear",
|
|
70
84
|
label: null,
|
|
71
85
|
text: "What's your biggest fear — the thing you're most worried the agent might do wrong?",
|
|
72
86
|
},
|
|
@@ -81,9 +95,9 @@ async function callClaude(prompt) {
|
|
|
81
95
|
// Build synthesis prompt
|
|
82
96
|
// ---------------------------------------------------------------------------
|
|
83
97
|
export function buildPrompt(answers) {
|
|
84
|
-
const qa = QUESTIONS.map((q) => `Q: ${q.text}\nA: ${answers[q.key] ||
|
|
98
|
+
const qa = QUESTIONS.map((q) => `Q: ${q.text}\nA: ${answers[q.key] || "(no answer)"}`).join("\n\n");
|
|
85
99
|
return `You are helping a developer set up their team's AI operating agreements for the first time.
|
|
86
|
-
Based on their answers below, produce a JSON object that populates three sections of their
|
|
100
|
+
Based on their answers below, produce a JSON object that populates three sections of their PATINA.md file.
|
|
87
101
|
|
|
88
102
|
${qa}
|
|
89
103
|
|
|
@@ -91,15 +105,15 @@ Respond with a JSON object matching this exact TypeScript type (raw JSON only, n
|
|
|
91
105
|
|
|
92
106
|
{
|
|
93
107
|
"summary": "2-3 sentences describing what was established",
|
|
94
|
-
"behavior_contract_md": "Full markdown block for one agent behavior contract. Use this structure exactly:\\n\\n
|
|
95
|
-
"autonomy_map_rows_md": "One or more markdown table rows (no header) for their autonomy map. Bold any always-review rows. Use this column order: Scenario | L1 — Review all | L2
|
|
108
|
+
"behavior_contract_md": "Full markdown block for one agent behavior contract. Use this structure exactly:\\n\\n**Always do:**\\n\\n- [rule]\\n\\n**Never do:**\\n\\n- [rule]\\n\\n**Tone:** [their style preference]\\n\\n**Stop and ask before:** [when to stop and ask]",
|
|
109
|
+
"autonomy_map_rows_md": "One or more markdown table rows (no header) for their autonomy map. Bold any always-review rows. Use this column order: Scenario | L1 — Review all | L2 — Cautious | L3 — Smart default | L4+ — Auto. Example row: | Single-file edit | Draft → review | Auto if clear | Auto if clear | Auto |",
|
|
96
110
|
"eval_rows_md": "One or more markdown table rows (no header) for their eval framework. Use this column order: Scenario | Input | Expected Output | Pass Threshold. Include a row for their biggest fear with 100% threshold."
|
|
97
111
|
}
|
|
98
112
|
|
|
99
113
|
Be specific and concrete — use their actual words where possible. Do not be generic.`;
|
|
100
114
|
}
|
|
101
115
|
// ---------------------------------------------------------------------------
|
|
102
|
-
// Apply to
|
|
116
|
+
// Apply to PATINA.md
|
|
103
117
|
// ---------------------------------------------------------------------------
|
|
104
118
|
/**
|
|
105
119
|
* Insert content before the next section boundary (--- or ## N.) after the
|
|
@@ -112,19 +126,19 @@ export function insertBeforeSectionEnd(content, sectionHeader, insertion) {
|
|
|
112
126
|
const after = content.slice(idx + sectionHeader.length);
|
|
113
127
|
const boundaryMatch = after.match(/\n---\n|\n## \d+\./);
|
|
114
128
|
if (!boundaryMatch || boundaryMatch.index === undefined) {
|
|
115
|
-
return content +
|
|
129
|
+
return content + "\n" + insertion + "\n";
|
|
116
130
|
}
|
|
117
131
|
const insertAt = idx + sectionHeader.length + boundaryMatch.index;
|
|
118
|
-
return content.slice(0, insertAt) +
|
|
132
|
+
return content.slice(0, insertAt) + "\n" + insertion.trim() + "\n" + content.slice(insertAt);
|
|
119
133
|
}
|
|
120
134
|
/**
|
|
121
|
-
* Apply onboarding to the core
|
|
135
|
+
* Apply onboarding to the core PATINA.md (behavior contract only).
|
|
122
136
|
* Autonomy and eval data go to spoke files separately.
|
|
123
137
|
*/
|
|
124
138
|
export function applyOnboarding(content, response) {
|
|
125
139
|
let result = content;
|
|
126
140
|
// Replace Section 2 agent placeholder block with the generated behavior contract
|
|
127
|
-
result = result.replace(
|
|
141
|
+
result = result.replace(/(\n## 2\. Behavior Contract\n\n)[\s\S]*?(?=\n## 3)/, `$1${response.behavior_contract_md.trim()}\n`);
|
|
128
142
|
// Autonomy and eval rows go to spoke files — handled in applyOnboardingToSpokes()
|
|
129
143
|
return result;
|
|
130
144
|
}
|
|
@@ -134,39 +148,39 @@ export function applyOnboarding(content, response) {
|
|
|
134
148
|
export function applyOnboardingToSpokes(cwd, response) {
|
|
135
149
|
ensureSpokeFiles(cwd);
|
|
136
150
|
// Append autonomy map rows to the spoke file
|
|
137
|
-
const autonomyPath = path.join(cwd, SPOKE_FILES[
|
|
138
|
-
let autonomyContent = fs.readFileSync(autonomyPath,
|
|
139
|
-
autonomyContent = autonomyContent.trimEnd() +
|
|
140
|
-
fs.writeFileSync(autonomyPath, autonomyContent,
|
|
151
|
+
const autonomyPath = path.join(cwd, SPOKE_FILES["autonomy-detail"]);
|
|
152
|
+
let autonomyContent = fs.readFileSync(autonomyPath, "utf-8");
|
|
153
|
+
autonomyContent = autonomyContent.trimEnd() + "\n" + response.autonomy_map_rows_md.trim() + "\n";
|
|
154
|
+
fs.writeFileSync(autonomyPath, autonomyContent, "utf-8");
|
|
141
155
|
// Append eval framework rows to the spoke file
|
|
142
|
-
const evalPath = path.join(cwd, SPOKE_FILES[
|
|
143
|
-
let evalContent = fs.readFileSync(evalPath,
|
|
144
|
-
evalContent = evalContent.trimEnd() +
|
|
145
|
-
fs.writeFileSync(evalPath, evalContent,
|
|
156
|
+
const evalPath = path.join(cwd, SPOKE_FILES["eval-framework"]);
|
|
157
|
+
let evalContent = fs.readFileSync(evalPath, "utf-8");
|
|
158
|
+
evalContent = evalContent.trimEnd() + "\n" + response.eval_rows_md.trim() + "\n";
|
|
159
|
+
fs.writeFileSync(evalPath, evalContent, "utf-8");
|
|
146
160
|
}
|
|
147
161
|
// ---------------------------------------------------------------------------
|
|
148
162
|
// Display
|
|
149
163
|
// ---------------------------------------------------------------------------
|
|
150
164
|
function displayResults(response) {
|
|
151
|
-
section(
|
|
165
|
+
section("Summary");
|
|
152
166
|
console.log(` ${response.summary}`);
|
|
153
|
-
section(
|
|
154
|
-
response.behavior_contract_md.split(
|
|
155
|
-
section(
|
|
156
|
-
response.autonomy_map_rows_md.split(
|
|
157
|
-
section(
|
|
158
|
-
response.eval_rows_md.split(
|
|
167
|
+
section("Behavior Contract");
|
|
168
|
+
response.behavior_contract_md.split("\n").forEach((l) => console.log(` ${l}`));
|
|
169
|
+
section("Autonomy Map rows");
|
|
170
|
+
response.autonomy_map_rows_md.split("\n").forEach((l) => console.log(` ${green("+")} ${l}`));
|
|
171
|
+
section("Eval Framework rows");
|
|
172
|
+
response.eval_rows_md.split("\n").forEach((l) => console.log(` ${green("+")} ${l}`));
|
|
159
173
|
}
|
|
160
174
|
// ---------------------------------------------------------------------------
|
|
161
175
|
// Main
|
|
162
176
|
// ---------------------------------------------------------------------------
|
|
163
177
|
export async function onboardCommand(cwd) {
|
|
164
178
|
const today = new Date().toISOString().slice(0, 10);
|
|
165
|
-
console.log(`\n${bold(
|
|
179
|
+
console.log(`\n${bold("patina run")} — first cycle setup`);
|
|
166
180
|
console.log(hr());
|
|
167
181
|
console.log(dim(" No prior cycles found. Let's set up your AI operating agreements."));
|
|
168
|
-
console.log(dim(
|
|
169
|
-
console.log(dim(
|
|
182
|
+
console.log(dim(" 9 questions across three frameworks (~10 min)."));
|
|
183
|
+
console.log(dim(" Evals define what good means → Behavior contracts encode it → Autonomy map enforces it."));
|
|
170
184
|
console.log();
|
|
171
185
|
const rl = readline.createInterface({
|
|
172
186
|
input: process.stdin,
|
|
@@ -175,13 +189,13 @@ export async function onboardCommand(cwd) {
|
|
|
175
189
|
});
|
|
176
190
|
const ask = (question) => new Promise((resolve) => rl.question(question, (a) => resolve(a.trim())));
|
|
177
191
|
const answers = {};
|
|
178
|
-
let currentLabel =
|
|
192
|
+
let currentLabel = "";
|
|
179
193
|
for (let i = 0; i < QUESTIONS.length; i++) {
|
|
180
194
|
const q = QUESTIONS[i];
|
|
181
195
|
if (q.label && q.label !== currentLabel) {
|
|
182
196
|
currentLabel = q.label;
|
|
183
197
|
console.log(`\n${bold(cyan(q.label))}`);
|
|
184
|
-
console.log(dim(
|
|
198
|
+
console.log(dim("─".repeat(q.label.length)));
|
|
185
199
|
}
|
|
186
200
|
const prefix = `${dim(`[${i + 1}/${QUESTIONS.length}]`)} ${bold(q.text)}\n> `;
|
|
187
201
|
answers[q.key] = await ask(prefix);
|
|
@@ -189,42 +203,45 @@ export async function onboardCommand(cwd) {
|
|
|
189
203
|
}
|
|
190
204
|
rl.close();
|
|
191
205
|
console.log(hr());
|
|
192
|
-
console.log(`\n${bold(
|
|
206
|
+
console.log(`\n${bold("Sending to Claude...")}`);
|
|
193
207
|
let response;
|
|
194
208
|
try {
|
|
195
209
|
response = await callClaude(buildPrompt(answers));
|
|
196
210
|
}
|
|
197
211
|
catch (err) {
|
|
198
|
-
console.error(`\n${red(
|
|
212
|
+
console.error(`\n${red("Claude CLI call failed:")} ${err instanceof Error ? err.message : String(err)}`);
|
|
199
213
|
process.exit(1);
|
|
200
214
|
}
|
|
201
|
-
console.log(`\n${bold(
|
|
215
|
+
console.log(`\n${bold("Done.")}\n`);
|
|
202
216
|
displayResults(response);
|
|
203
217
|
// Confirm before writing
|
|
204
|
-
const confirmRl = readline.createInterface({
|
|
218
|
+
const confirmRl = readline.createInterface({
|
|
219
|
+
input: process.stdin,
|
|
220
|
+
output: process.stdout,
|
|
221
|
+
});
|
|
205
222
|
const ok = await new Promise((resolve) => {
|
|
206
223
|
confirmRl.question(`\n${hr()}\nApply this to ${LIVING_DOC_FILE}? [y/N] `, (a) => {
|
|
207
224
|
confirmRl.close();
|
|
208
|
-
resolve(a.trim().toLowerCase().startsWith(
|
|
225
|
+
resolve(a.trim().toLowerCase().startsWith("y"));
|
|
209
226
|
});
|
|
210
227
|
});
|
|
211
228
|
if (!ok) {
|
|
212
|
-
console.log(dim(
|
|
229
|
+
console.log(dim("Aborted. Run `patina run` to try again."));
|
|
213
230
|
return;
|
|
214
231
|
}
|
|
215
|
-
// Read and populate
|
|
232
|
+
// Read and populate PATINA.md
|
|
216
233
|
const livingDocPath = path.join(cwd, LIVING_DOC_FILE);
|
|
217
234
|
if (!fs.existsSync(livingDocPath)) {
|
|
218
235
|
console.error(red(`${LIVING_DOC_FILE} not found. Run \`patina init\` first.`));
|
|
219
236
|
process.exit(1);
|
|
220
237
|
}
|
|
221
|
-
const original = fs.readFileSync(livingDocPath,
|
|
238
|
+
const original = fs.readFileSync(livingDocPath, "utf-8");
|
|
222
239
|
const populated = applyOnboarding(original, response);
|
|
223
240
|
// Write autonomy and eval data to spoke files
|
|
224
241
|
applyOnboardingToSpokes(cwd, response);
|
|
225
242
|
// Update the "last updated" timestamp
|
|
226
243
|
const dated = populated.replace(/> Last updated: .+/, `> Last updated: ${today}`);
|
|
227
|
-
fs.writeFileSync(livingDocPath, dated,
|
|
244
|
+
fs.writeFileSync(livingDocPath, dated, "utf-8");
|
|
228
245
|
// Save cycle file
|
|
229
246
|
const cycleContent = `# Onboarding Cycle — ${today}
|
|
230
247
|
|
|
@@ -246,8 +263,8 @@ ${response.behavior_contract_md}
|
|
|
246
263
|
|
|
247
264
|
## Autonomy Map (additions)
|
|
248
265
|
|
|
249
|
-
| Scenario | L1 — Review all | L2
|
|
250
|
-
|
|
266
|
+
| Scenario | L1 — Review all | L2 — Cautious | L3 — Smart default | L4+ — Auto |
|
|
267
|
+
|---|---|---|---|---|
|
|
251
268
|
${response.autonomy_map_rows_md}
|
|
252
269
|
|
|
253
270
|
---
|
|
@@ -262,14 +279,14 @@ ${response.eval_rows_md}
|
|
|
262
279
|
|
|
263
280
|
## Answers
|
|
264
281
|
|
|
265
|
-
${QUESTIONS.map((q) => `**${q.text}**\n\n${answers[q.key] ||
|
|
282
|
+
${QUESTIONS.map((q) => `**${q.text}**\n\n${answers[q.key] || "_(no answer)_"}`).join("\n\n---\n\n")}
|
|
266
283
|
`;
|
|
267
284
|
writeCycleFile(today, cycleContent, cwd);
|
|
268
285
|
console.log();
|
|
269
|
-
console.log(green(
|
|
270
|
-
console.log(green(
|
|
286
|
+
console.log(green("✓") + ` Applied to ${bold(LIVING_DOC_FILE)}`);
|
|
287
|
+
console.log(green("✓") + ` Cycle report saved to ${dim(`.patina/cycles/${today}.md`)}`);
|
|
271
288
|
console.log();
|
|
272
|
-
console.log(dim(
|
|
289
|
+
console.log(dim("Your AI operating agreements are set. Run `patina run` after your next work cycle."));
|
|
273
290
|
console.log(dim(`Commit ${LIVING_DOC_FILE} to share with your team.`));
|
|
274
291
|
console.log();
|
|
275
292
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.d.ts","sourceRoot":"","sources":["../../src/commands/reflect.ts"],"names":[],"mappings":"AA4DA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+DpD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import readline from "readline";
|
|
2
|
+
import { assertInitialised, getLatestCycleDate, getDataDir, readAllSessions, writeReflection, } from "../lib/storage.js";
|
|
3
|
+
import { loadQuestions } from "../lib/questions.js";
|
|
4
|
+
import { getGitAuthor } from "../lib/git.js";
|
|
5
|
+
import { formatNumber } from "../lib/metrics.js";
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// ANSI helpers
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
const isTTY = process.stdout.isTTY;
|
|
10
|
+
function bold(s) {
|
|
11
|
+
return isTTY ? `\x1b[1m${s}\x1b[0m` : s;
|
|
12
|
+
}
|
|
13
|
+
function dim(s) {
|
|
14
|
+
return isTTY ? `\x1b[2m${s}\x1b[0m` : s;
|
|
15
|
+
}
|
|
16
|
+
function cyan(s) {
|
|
17
|
+
return isTTY ? `\x1b[36m${s}\x1b[0m` : s;
|
|
18
|
+
}
|
|
19
|
+
function green(s) {
|
|
20
|
+
return isTTY ? `\x1b[32m${s}\x1b[0m` : s;
|
|
21
|
+
}
|
|
22
|
+
function hr(len = 60) {
|
|
23
|
+
return dim("─".repeat(len));
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Readline helpers
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
function createRL() {
|
|
29
|
+
return readline.createInterface({
|
|
30
|
+
input: process.stdin,
|
|
31
|
+
output: process.stdout,
|
|
32
|
+
terminal: isTTY,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function prompt(rl, question) {
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
|
+
rl.question(question, (answer) => {
|
|
38
|
+
resolve(answer.trim());
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Command
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
export async function reflectCommand() {
|
|
46
|
+
assertInitialised();
|
|
47
|
+
const cwd = process.cwd();
|
|
48
|
+
const lastCycleDate = getLatestCycleDate(cwd);
|
|
49
|
+
// Show brief context so answers are grounded
|
|
50
|
+
const allSessions = readAllSessions(cwd);
|
|
51
|
+
const cycleSessions = lastCycleDate
|
|
52
|
+
? allSessions.filter((s) => new Date(s.timestamp).getTime() > new Date(lastCycleDate + "T00:00:00Z").getTime())
|
|
53
|
+
: allSessions;
|
|
54
|
+
const totalTokens = cycleSessions.reduce((sum, s) => sum + s.estimated_tokens, 0);
|
|
55
|
+
console.log(`\n${bold("patina reflect")} — record your reflections for the next retro`);
|
|
56
|
+
console.log(hr());
|
|
57
|
+
if (lastCycleDate) {
|
|
58
|
+
console.log(` Since last cycle : ${cyan(lastCycleDate)}`);
|
|
59
|
+
}
|
|
60
|
+
console.log(` Sessions : ${bold(String(cycleSessions.length))}`);
|
|
61
|
+
console.log(` Tokens (est.) : ${bold(formatNumber(totalTokens))}`);
|
|
62
|
+
console.log();
|
|
63
|
+
console.log(dim("Answer each question. Your responses feed into the next patina run."));
|
|
64
|
+
console.log();
|
|
65
|
+
const questions = loadQuestions(cwd);
|
|
66
|
+
const rl = createRL();
|
|
67
|
+
const answers = {};
|
|
68
|
+
for (let i = 0; i < questions.length; i++) {
|
|
69
|
+
const q = questions[i];
|
|
70
|
+
const label = `${dim(`[${i + 1}/${questions.length}]`)} ${bold(q.text)}\n> `;
|
|
71
|
+
answers[q.key] = await prompt(rl, label);
|
|
72
|
+
console.log();
|
|
73
|
+
}
|
|
74
|
+
rl.close();
|
|
75
|
+
const ts = new Date().toISOString().replace(/[:.]/g, "-");
|
|
76
|
+
const rand = Math.random().toString(36).slice(2, 6);
|
|
77
|
+
const id = `${ts}-${rand}`;
|
|
78
|
+
const reflection = {
|
|
79
|
+
id,
|
|
80
|
+
author: getGitAuthor(),
|
|
81
|
+
timestamp: new Date().toISOString(),
|
|
82
|
+
cycleStart: lastCycleDate,
|
|
83
|
+
answers,
|
|
84
|
+
};
|
|
85
|
+
writeReflection(reflection, cwd);
|
|
86
|
+
const safeId = id.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
87
|
+
const dataDir = getDataDir(cwd);
|
|
88
|
+
console.log(hr());
|
|
89
|
+
console.log();
|
|
90
|
+
console.log(green("✓") + ` Reflection saved to ${dim(`${dataDir}/reflections/${safeId}.json`)}`);
|
|
91
|
+
console.log();
|
|
92
|
+
console.log(`Run ${cyan("`patina run`")} when ready to synthesise.`);
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=reflect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reflect.js","sourceRoot":"","sources":["../../src/commands/reflect.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/run.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type Capture } from
|
|
2
|
-
import type { SessionSummary } from
|
|
1
|
+
import { type Capture, type Reflection } from "../lib/storage.js";
|
|
2
|
+
import type { SessionSummary } from "../lib/storage.js";
|
|
3
3
|
interface PatternEntry {
|
|
4
4
|
pattern: string;
|
|
5
5
|
frequency: string;
|
|
@@ -14,13 +14,13 @@ interface ProposedInstruction {
|
|
|
14
14
|
rationale: string;
|
|
15
15
|
diff: string;
|
|
16
16
|
section: string;
|
|
17
|
-
action?:
|
|
17
|
+
action?: "add" | "replace" | "remove";
|
|
18
18
|
replaces?: string;
|
|
19
19
|
}
|
|
20
20
|
interface Opportunity {
|
|
21
21
|
observation: string;
|
|
22
22
|
suggestion: string;
|
|
23
|
-
effort:
|
|
23
|
+
effort: "low" | "medium" | "high";
|
|
24
24
|
}
|
|
25
25
|
export interface SynthesisResponse {
|
|
26
26
|
cycle_summary: string;
|
|
@@ -36,17 +36,19 @@ export declare function buildSynthesisPrompt(params: {
|
|
|
36
36
|
sessionCount: number;
|
|
37
37
|
sessions: SessionSummary[];
|
|
38
38
|
captures: Capture[];
|
|
39
|
-
reflections:
|
|
39
|
+
reflections: Reflection[];
|
|
40
40
|
livingDoc: string;
|
|
41
41
|
lastCycleDate: string | null;
|
|
42
|
+
cwd?: string;
|
|
42
43
|
}): string;
|
|
43
44
|
export declare function buildCycleMarkdown(params: {
|
|
44
45
|
date: string;
|
|
45
46
|
cycleStart: string;
|
|
46
47
|
cycleEnd: string;
|
|
47
|
-
reflections:
|
|
48
|
+
reflections: Reflection[];
|
|
48
49
|
synthesis: SynthesisResponse;
|
|
49
50
|
sessions: SessionSummary[];
|
|
51
|
+
cwd?: string;
|
|
50
52
|
}): string;
|
|
51
53
|
export declare function runCommand(options?: {
|
|
52
54
|
onboard?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAcL,KAAK,OAAO,EACZ,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAW3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA6DxD,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,gBAAgB,EAAE,eAAe,CAAC;IAClC,oBAAoB,EAAE,mBAAmB,CAAC;IAC1C,WAAW,EAAE,WAAW,CAAC;CAC1B;AA0CD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CA4B5E;AAoCD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CAoGT;AAqFD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,CA0HT;AAMD,wBAAsB,UAAU,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4InF"}
|