@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,111 @@
1
+ import { assertInitialised, sessionExists, writeSession, } from '../lib/storage.js';
2
+ import { discoverProjects, parseConversationFile } from '../lib/parser.js';
3
+ /**
4
+ * Core ingest logic — returns counts. Used by both ingestCommand and auto-ingest in patina run.
5
+ */
6
+ export function runIngest(options = {}) {
7
+ const projects = discoverProjects(options.claudeDir);
8
+ let ingested = 0;
9
+ let skipped = 0;
10
+ let errors = 0;
11
+ for (const project of projects) {
12
+ if (options.verbose) {
13
+ console.log(` Parsing: ${project.conversationFile}`);
14
+ }
15
+ let parsedSessions;
16
+ try {
17
+ parsedSessions = parseConversationFile(project.conversationFile, project.name);
18
+ }
19
+ catch (err) {
20
+ if (options.verbose) {
21
+ console.warn(` Warning: failed to parse ${project.conversationFile}: ${err instanceof Error ? err.message : String(err)}`);
22
+ }
23
+ errors++;
24
+ continue;
25
+ }
26
+ for (const parsed of parsedSessions) {
27
+ if (sessionExists(parsed.session_id)) {
28
+ skipped++;
29
+ if (options.verbose)
30
+ console.log(` skip ${parsed.session_id} (already ingested)`);
31
+ continue;
32
+ }
33
+ const summary = { ...parsed, ingested_at: new Date().toISOString() };
34
+ try {
35
+ writeSession(summary);
36
+ ingested++;
37
+ if (options.verbose)
38
+ console.log(` ingest ${parsed.session_id} (${parsed.turn_count} turns, ~${parsed.estimated_tokens.toLocaleString()} tokens)`);
39
+ }
40
+ catch (err) {
41
+ if (options.verbose)
42
+ console.warn(` Warning: failed to write session ${parsed.session_id}: ${err instanceof Error ? err.message : String(err)}`);
43
+ errors++;
44
+ }
45
+ }
46
+ }
47
+ return { ingested, skipped, errors };
48
+ }
49
+ export async function ingestCommand(options = {}) {
50
+ assertInitialised();
51
+ const projects = discoverProjects(options.claudeDir);
52
+ if (projects.length === 0) {
53
+ const dir = options.claudeDir ?? '~/.claude/projects/';
54
+ console.log(`No Claude Code project logs found in ${dir}`);
55
+ console.log('Make sure you have run Claude Code at least once, or specify a different path with --claude-dir.');
56
+ return;
57
+ }
58
+ if (options.verbose) {
59
+ console.log(`Found ${projects.length} conversation file(s) across projects.\n`);
60
+ }
61
+ let ingested = 0;
62
+ let skipped = 0;
63
+ let errors = 0;
64
+ for (const project of projects) {
65
+ if (options.verbose) {
66
+ console.log(` Parsing: ${project.conversationFile}`);
67
+ }
68
+ let parsedSessions;
69
+ try {
70
+ parsedSessions = parseConversationFile(project.conversationFile, project.name);
71
+ }
72
+ catch (err) {
73
+ console.warn(` Warning: failed to parse ${project.conversationFile}: ${err instanceof Error ? err.message : String(err)}`);
74
+ errors++;
75
+ continue;
76
+ }
77
+ for (const parsed of parsedSessions) {
78
+ if (sessionExists(parsed.session_id)) {
79
+ skipped++;
80
+ if (options.verbose) {
81
+ console.log(` skip ${parsed.session_id} (already ingested)`);
82
+ }
83
+ continue;
84
+ }
85
+ const summary = {
86
+ ...parsed,
87
+ ingested_at: new Date().toISOString(),
88
+ };
89
+ try {
90
+ writeSession(summary);
91
+ ingested++;
92
+ if (options.verbose) {
93
+ console.log(` ingest ${parsed.session_id} (${parsed.turn_count} turns, ~${parsed.estimated_tokens.toLocaleString()} tokens)`);
94
+ }
95
+ }
96
+ catch (err) {
97
+ console.warn(` Warning: failed to write session ${parsed.session_id}: ${err instanceof Error ? err.message : String(err)}`);
98
+ errors++;
99
+ }
100
+ }
101
+ }
102
+ // Summary line
103
+ const parts = [`${ingested} session(s) ingested`, `${skipped} skipped`];
104
+ if (errors > 0)
105
+ parts.push(`${errors} error(s)`);
106
+ console.log(`\nDone. ${parts.join(', ')}.`);
107
+ if (ingested > 0) {
108
+ console.log('Run `patina status` to see metrics.');
109
+ }
110
+ }
111
+ //# sourceMappingURL=ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA+HA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA0DjD"}
@@ -0,0 +1,165 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { PATINA_DIR, SESSIONS_DIR, CYCLES_DIR, CAPTURES_DIR, METRICS_FILE, LIVING_DOC_FILE, patinaExists, ensureDir, writeJson, } from '../lib/storage.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Living-doc template
6
+ // ---------------------------------------------------------------------------
7
+ const LIVING_DOC_TEMPLATE = `# AI Operating Constitution
8
+
9
+ > Maintained by \`patina\`. Last updated: ${new Date().toISOString().split('T')[0]}
10
+ > This document captures how this team works with AI agents. Treat it as a living contract — update it after each retro cycle.
11
+ >
12
+ > These three sections form a loop: Evals define what good means → Behavior contracts encode it → Autonomy map enforces it → evals tell you if it's working.
13
+
14
+ ---
15
+
16
+ ## 1. Working Agreements
17
+
18
+ <!-- Team-level meta agreements that apply across all agents and sessions -->
19
+
20
+ - **Scope**: Agents operate within clearly bounded tasks; scope creep is surfaced immediately.
21
+ - **Approval gates**: Any change touching production config, secrets, or external APIs requires explicit human sign-off before execution.
22
+ - **Context hygiene**: Begin sessions with a concise context preamble. Avoid letting context windows balloon with repeated history.
23
+ - **Naming conventions**: Follow project-standard naming in all generated code. Agents do not introduce new conventions without discussion.
24
+
25
+ ---
26
+
27
+ ## 2. Behavior Contracts
28
+
29
+ <!-- One contract per AI component or agent persona. Write this before a sprint starts, review as a team. -->
30
+
31
+ ### General-purpose coding agent
32
+
33
+ **What it does:** Implements features, refactors code, and generates tests across the codebase.
34
+
35
+ **Always do:**
36
+ - State the task scope in one sentence before starting any session estimated >1K tokens
37
+ - Follow existing code style and naming conventions — never introduce new patterns unilaterally
38
+ - Check in after 2–3 tool calls on any ambiguous or expanding task
39
+
40
+ **Never do:**
41
+ - Touch production config, secrets, or external APIs without explicit human sign-off
42
+ - Create new files when editing an existing one would suffice
43
+ - Add features, refactor, or "improve" beyond what was asked
44
+
45
+ **Tone / voice:** Direct and minimal. No preamble, no trailing summaries. Lead with the change, not the reasoning.
46
+
47
+ **Confidence threshold:** Below ~70% confidence on approach → propose options and ask. Above → proceed and note the assumption made.
48
+
49
+ <!-- Add more contracts as needed -->
50
+
51
+ ---
52
+
53
+ ## 3. Autonomy Map
54
+
55
+ <!-- Which scenarios get auto-handled vs. always require human review, regardless of autonomy level. Do this before architecture. -->
56
+
57
+ | Scenario | L1 — Review all | L2/L3 — Smart | L4+ — Auto |
58
+ |---|---|---|---|
59
+ | Single-file edit, clear scope | Draft → review | Auto if unambiguous | Auto |
60
+ | Multi-file refactor | Draft → review | Draft → review | Auto with tests passing |
61
+ | New file creation | Draft → review | Draft → review | Auto |
62
+ | **Touches config / secrets / APIs** | **Review** | **Review** | **Review** |
63
+ | **Ambiguous or expanding scope** | **Review** | **Review** | **Review** |
64
+ | **Destructive operation (delete, reset, force-push)** | **Review** | **Review** | **Review** |
65
+ | [Your scenario] | [Your rule] | [Your rule] | [Your rule] |
66
+
67
+ ---
68
+
69
+ ## 4. Incident Log
70
+
71
+ <!-- Brief entries when an agent causes a problem worth remembering -->
72
+
73
+ | Date | What Happened | Root Cause | Fix Applied |
74
+ |---|---|---|---|
75
+ | <!-- YYYY-MM-DD --> | <!-- description --> | <!-- cause --> | <!-- fix --> |
76
+
77
+ ---
78
+
79
+ ## 5. Eval Framework
80
+
81
+ <!-- Fill this in before you write code. Defines what "good" means for each agent task type. -->
82
+
83
+ | Scenario | Input | Expected Output | Pass Threshold |
84
+ |---|---|---|---|
85
+ | Normal task, clear scope | Well-specified request | Minimal correct change, no scope creep | >90% |
86
+ | Edge case — ambiguous request | Vague or multi-interpretation input | Asks clarifying question before proceeding | >80% |
87
+ | Failure mode — agent over-scopes | Request with natural expansion points | Surfaces scope question, does not absorb silently | 100% |
88
+ | High stakes — production change | Config / API / secrets edit | Stops and requests explicit sign-off | 100% |
89
+ | **Your biggest fear** | **[The case you're most nervous about]** | **[Expected behavior]** | **[TBD]** |
90
+
91
+ ---
92
+
93
+ ## 6. Opportunity Backlog
94
+
95
+ <!-- Ideas for improving how we use AI — feed these into the next retro cycle -->
96
+
97
+ - [ ] Identify top 3 repetitive tasks that could be further automated
98
+ - [ ] Review sessions with high rework rates and diagnose root cause
99
+ - [ ] Evaluate whether any autonomy map rules should shift level
100
+
101
+ ---
102
+
103
+ ## 7. Retro Cycle History
104
+
105
+ <!-- Auto-populated by \`patina buff\` -->
106
+
107
+ | Cycle | Date | Key Insight | Change Made |
108
+ |---|---|---|---|
109
+ | — | — | — | — |
110
+ `;
111
+ // ---------------------------------------------------------------------------
112
+ // Command
113
+ // ---------------------------------------------------------------------------
114
+ export async function initCommand() {
115
+ const cwd = process.cwd();
116
+ if (patinaExists(cwd)) {
117
+ console.error(`Error: .patina/ already exists in ${cwd}\nRun \`patina status\` to see current metrics.`);
118
+ process.exit(1);
119
+ }
120
+ // Create directory structure
121
+ ensureDir(path.join(cwd, SESSIONS_DIR));
122
+ ensureDir(path.join(cwd, CYCLES_DIR));
123
+ ensureDir(path.join(cwd, CAPTURES_DIR));
124
+ // Create patina.md
125
+ const livingDocPath = path.join(cwd, LIVING_DOC_FILE);
126
+ fs.writeFileSync(livingDocPath, LIVING_DOC_TEMPLATE, 'utf-8');
127
+ // Create empty metrics.json
128
+ writeJson(path.join(cwd, METRICS_FILE), {
129
+ last_updated: new Date().toISOString(),
130
+ cycles: [],
131
+ });
132
+ // Wire patina.md into CLAUDE.md so agents read it automatically
133
+ const claudeMdPath = path.join(cwd, 'CLAUDE.md');
134
+ const importLine = `@${LIVING_DOC_FILE}`;
135
+ let claudeMdStatus;
136
+ if (fs.existsSync(claudeMdPath)) {
137
+ const existing = fs.readFileSync(claudeMdPath, 'utf-8');
138
+ if (existing.includes(importLine)) {
139
+ claudeMdStatus = 'skipped';
140
+ }
141
+ else {
142
+ fs.writeFileSync(claudeMdPath, existing.trimEnd() + `\n\n${importLine}\n`, 'utf-8');
143
+ claudeMdStatus = 'updated';
144
+ }
145
+ }
146
+ else {
147
+ fs.writeFileSync(claudeMdPath, `${importLine}\n`, 'utf-8');
148
+ claudeMdStatus = 'created';
149
+ }
150
+ console.log(`Initialised patina in ${cwd}\n`);
151
+ console.log(` Created ${PATINA_DIR}/`);
152
+ console.log(` Created ${SESSIONS_DIR}/`);
153
+ console.log(` Created ${CYCLES_DIR}/`);
154
+ console.log(` Created ${CAPTURES_DIR}/`);
155
+ console.log(` Created ${LIVING_DOC_FILE}`);
156
+ console.log(` Created ${METRICS_FILE}`);
157
+ if (claudeMdStatus === 'created') {
158
+ console.log(` Created CLAUDE.md (imports patina.md)`);
159
+ }
160
+ else if (claudeMdStatus === 'updated') {
161
+ console.log(` Updated CLAUDE.md (added import of patina.md)`);
162
+ }
163
+ console.log(`\nNext steps:\n patina ingest — parse Claude Code session logs\n patina status — view metrics`);
164
+ }
165
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function layersCommand(): void;
2
+ //# sourceMappingURL=layers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.d.ts","sourceRoot":"","sources":["../../src/commands/layers.ts"],"names":[],"mappings":"AAsFA,wBAAgB,aAAa,IAAI,IAAI,CAiGpC"}
@@ -0,0 +1,141 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { assertInitialised, CYCLES_DIR } from '../lib/storage.js';
4
+ // ---------------------------------------------------------------------------
5
+ // ANSI helpers
6
+ // ---------------------------------------------------------------------------
7
+ const isTTY = process.stdout.isTTY;
8
+ function bold(s) { return isTTY ? `\x1b[1m${s}\x1b[0m` : s; }
9
+ function dim(s) { return isTTY ? `\x1b[2m${s}\x1b[0m` : s; }
10
+ function green(s) { return isTTY ? `\x1b[32m${s}\x1b[0m` : s; }
11
+ function cyan(s) { return isTTY ? `\x1b[36m${s}\x1b[0m` : s; }
12
+ function yellow(s) { return isTTY ? `\x1b[33m${s}\x1b[0m` : s; }
13
+ function gold(s) { return isTTY ? `\x1b[93m${s}\x1b[0m` : s; }
14
+ function red(s) { return isTTY ? `\x1b[31m${s}\x1b[0m` : s; }
15
+ // Oldest → newest: deep green through copper/gold (matching real patina aging)
16
+ const LAYER_CHARS = ['▓', '▓', '▒', '░', '·'];
17
+ const LAYER_COLORS = [green, green, cyan, yellow, gold];
18
+ function parseCycleFile(content, date) {
19
+ const isOnboarding = content.includes('(first cycle setup)');
20
+ const summaryMatch = content.match(/## (?:Cycle )?Summary\n+([^\n]+)/);
21
+ const raw = summaryMatch ? summaryMatch[1].trim() : '';
22
+ const summary = raw.length > 72 ? raw.slice(0, 72) + '…' : raw;
23
+ const sessionsMatch = content.match(/\| Total sessions \| (\d+) \|/);
24
+ const tokensMatch = content.match(/\| Avg tokens\/session \| ([\d,]+) \|/);
25
+ const reworkMatch = content.match(/\| Sessions with rework \| \d+ \((\d+(?:\.\d+)?)%\) \|/);
26
+ const sectionMatch = content.match(/\*\*Section:\*\* ([^\n]+)/);
27
+ return {
28
+ date,
29
+ summary,
30
+ sessions: sessionsMatch ? parseInt(sessionsMatch[1], 10) : undefined,
31
+ avgTokens: tokensMatch ? parseInt(tokensMatch[1].replace(/,/g, ''), 10) : undefined,
32
+ reworkPct: reworkMatch ? parseFloat(reworkMatch[1]) : undefined,
33
+ isOnboarding,
34
+ sectionChanged: sectionMatch ? sectionMatch[1].trim() : undefined,
35
+ };
36
+ }
37
+ // ---------------------------------------------------------------------------
38
+ // Rendering helpers
39
+ // ---------------------------------------------------------------------------
40
+ const BAND_WIDTH = 52;
41
+ function tokenBar(avgTokens, maxTokens) {
42
+ const BARS = 16;
43
+ const filled = Math.max(1, Math.round((avgTokens / maxTokens) * BARS));
44
+ const empty = BARS - filled;
45
+ return '▕' + '█'.repeat(filled) + dim('░'.repeat(empty)) + '▏';
46
+ }
47
+ function formatK(n) {
48
+ return n >= 1000 ? (n / 1000).toFixed(1) + 'K' : String(n);
49
+ }
50
+ function deltaLabel(current, prior) {
51
+ const pct = Math.round(((current - prior) / prior) * 100);
52
+ if (pct === 0)
53
+ return '';
54
+ if (pct < 0)
55
+ return green(`↓ ${Math.abs(pct)}%`);
56
+ return red(`↑ ${pct}%`);
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Command
60
+ // ---------------------------------------------------------------------------
61
+ export function layersCommand() {
62
+ assertInitialised();
63
+ const cwd = process.cwd();
64
+ const cyclesDir = path.join(cwd, CYCLES_DIR);
65
+ if (!fs.existsSync(cyclesDir)) {
66
+ console.log('No layers yet. Run `patina run` to start building.');
67
+ return;
68
+ }
69
+ const files = fs
70
+ .readdirSync(cyclesDir)
71
+ .filter((f) => f.endsWith('.md'))
72
+ .sort()
73
+ .slice(-5);
74
+ if (files.length === 0) {
75
+ console.log('No layers yet. Run `patina run` to start building.');
76
+ return;
77
+ }
78
+ const layers = files.map((f) => {
79
+ const date = f.replace('.md', '');
80
+ const content = fs.readFileSync(path.join(cyclesDir, f), 'utf-8');
81
+ return parseCycleFile(content, date);
82
+ });
83
+ const maxTokens = Math.max(...layers.map((l) => l.avgTokens ?? 0), 1);
84
+ // Render newest first (surface → bedrock)
85
+ const reversed = [...layers].reverse();
86
+ console.log();
87
+ console.log(bold('patina layers'));
88
+ console.log(dim('─'.repeat(BAND_WIDTH + 4)));
89
+ console.log();
90
+ const sinceDate = layers[0].date;
91
+ const count = layers.length;
92
+ console.log(` ${bold(String(count))} ${count === 1 ? 'layer' : 'layers'} deep ${dim('· building since ' + sinceDate)}`);
93
+ console.log();
94
+ console.log(dim(' ▾ surface'));
95
+ console.log();
96
+ for (let i = 0; i < reversed.length; i++) {
97
+ const layer = reversed[i];
98
+ // layerIdx: 0 = oldest, layers.length-1 = newest
99
+ const layerIdx = layers.length - 1 - i;
100
+ const colorFn = LAYER_COLORS[Math.min(layerIdx, LAYER_COLORS.length - 1)];
101
+ const char = LAYER_CHARS[Math.min(layerIdx, LAYER_CHARS.length - 1)];
102
+ const num = layerIdx + 1;
103
+ // ── Band ──────────────────────────────────────────────────────────────
104
+ const tile = (char + ' ').repeat(BAND_WIDTH);
105
+ const band = tile.slice(0, BAND_WIDTH);
106
+ const label = ` Layer ${num} ${layer.date}`;
107
+ console.log(' ' + colorFn(band) + dim(label));
108
+ // ── Summary ───────────────────────────────────────────────────────────
109
+ if (layer.summary) {
110
+ console.log(` ${layer.summary}`);
111
+ }
112
+ // ── Metrics ───────────────────────────────────────────────────────────
113
+ if (layer.isOnboarding) {
114
+ console.log(` ${dim('foundation — onboarding cycle')}`);
115
+ }
116
+ else if (layer.sessions !== undefined) {
117
+ const parts = [`${layer.sessions} sessions`];
118
+ if (layer.avgTokens !== undefined) {
119
+ const bar = tokenBar(layer.avgTokens, maxTokens);
120
+ const older = reversed[i + 1]; // next in reversed = one layer older
121
+ const delta = older?.avgTokens !== undefined
122
+ ? deltaLabel(layer.avgTokens, older.avgTokens)
123
+ : '';
124
+ parts.push(`${formatK(layer.avgTokens)} avg tokens ${bar}${delta ? ' ' + delta : ''}`);
125
+ }
126
+ if (layer.reworkPct !== undefined) {
127
+ parts.push(`${layer.reworkPct}% rework`);
128
+ }
129
+ console.log(` ${dim(parts.join(' · '))}`);
130
+ }
131
+ console.log();
132
+ }
133
+ console.log(dim(' ▾ bedrock'));
134
+ console.log();
135
+ if (count < 5) {
136
+ const remaining = 5 - count;
137
+ console.log(dim(` ${remaining} more ${remaining === 1 ? 'layer' : 'layers'} to go. Run \`patina run\` after your next work cycle.`));
138
+ console.log();
139
+ }
140
+ }
141
+ //# sourceMappingURL=layers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layers.js","sourceRoot":"","sources":["../../src/commands/layers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function onboardCommand(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=onboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAgNA,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqI/D"}