@mmnto/cli 1.13.0 → 1.14.1

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 (130) hide show
  1. package/dist/commands/briefing.d.ts.map +1 -1
  2. package/dist/commands/briefing.js +3 -1
  3. package/dist/commands/briefing.js.map +1 -1
  4. package/dist/commands/briefing.test.js +1 -0
  5. package/dist/commands/briefing.test.js.map +1 -1
  6. package/dist/commands/compile-prune.test.d.ts +2 -0
  7. package/dist/commands/compile-prune.test.d.ts.map +1 -0
  8. package/dist/commands/compile-prune.test.js +116 -0
  9. package/dist/commands/compile-prune.test.js.map +1 -0
  10. package/dist/commands/compile.d.ts +37 -0
  11. package/dist/commands/compile.d.ts.map +1 -1
  12. package/dist/commands/compile.js +120 -11
  13. package/dist/commands/compile.js.map +1 -1
  14. package/dist/commands/doctor.d.ts +1 -1
  15. package/dist/commands/doctor.d.ts.map +1 -1
  16. package/dist/commands/doctor.js +12 -6
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/doctor.test.js +33 -5
  19. package/dist/commands/doctor.test.js.map +1 -1
  20. package/dist/commands/extract-local.d.ts.map +1 -1
  21. package/dist/commands/extract-local.js +3 -1
  22. package/dist/commands/extract-local.js.map +1 -1
  23. package/dist/commands/extract-pr.d.ts.map +1 -1
  24. package/dist/commands/extract-pr.js +3 -1
  25. package/dist/commands/extract-pr.js.map +1 -1
  26. package/dist/commands/extract-scan.d.ts.map +1 -1
  27. package/dist/commands/extract-scan.js +3 -1
  28. package/dist/commands/extract-scan.js.map +1 -1
  29. package/dist/commands/extract-shared.d.ts.map +1 -1
  30. package/dist/commands/extract-shared.js +3 -1
  31. package/dist/commands/extract-shared.js.map +1 -1
  32. package/dist/commands/extract.test.js +2 -0
  33. package/dist/commands/extract.test.js.map +1 -1
  34. package/dist/commands/handoff.d.ts +17 -37
  35. package/dist/commands/handoff.d.ts.map +1 -1
  36. package/dist/commands/handoff.js +120 -273
  37. package/dist/commands/handoff.js.map +1 -1
  38. package/dist/commands/handoff.test.js +64 -277
  39. package/dist/commands/handoff.test.js.map +1 -1
  40. package/dist/commands/lint.d.ts.map +1 -1
  41. package/dist/commands/lint.js +2 -1
  42. package/dist/commands/lint.js.map +1 -1
  43. package/dist/commands/review-learn.d.ts.map +1 -1
  44. package/dist/commands/review-learn.js +3 -1
  45. package/dist/commands/review-learn.js.map +1 -1
  46. package/dist/commands/review-learn.test.js +1 -0
  47. package/dist/commands/review-learn.test.js.map +1 -1
  48. package/dist/commands/run-compiled-rules.d.ts +2 -0
  49. package/dist/commands/run-compiled-rules.d.ts.map +1 -1
  50. package/dist/commands/run-compiled-rules.js +63 -5
  51. package/dist/commands/run-compiled-rules.js.map +1 -1
  52. package/dist/commands/run-compiled-rules.test.js +382 -0
  53. package/dist/commands/run-compiled-rules.test.js.map +1 -1
  54. package/dist/commands/search.d.ts.map +1 -1
  55. package/dist/commands/search.js +3 -1
  56. package/dist/commands/search.js.map +1 -1
  57. package/dist/commands/shield.d.ts.map +1 -1
  58. package/dist/commands/shield.js +8 -4
  59. package/dist/commands/shield.js.map +1 -1
  60. package/dist/commands/shield.test.js +3 -1
  61. package/dist/commands/shield.test.js.map +1 -1
  62. package/dist/commands/spec.d.ts.map +1 -1
  63. package/dist/commands/spec.js +8 -2
  64. package/dist/commands/spec.js.map +1 -1
  65. package/dist/commands/spec.test.js +2 -0
  66. package/dist/commands/spec.test.js.map +1 -1
  67. package/dist/commands/stats.d.ts.map +1 -1
  68. package/dist/commands/stats.js +3 -1
  69. package/dist/commands/stats.js.map +1 -1
  70. package/dist/commands/triage.d.ts.map +1 -1
  71. package/dist/commands/triage.js +3 -1
  72. package/dist/commands/triage.js.map +1 -1
  73. package/dist/commands/triage.test.js +1 -0
  74. package/dist/commands/triage.test.js.map +1 -1
  75. package/dist/help.d.ts.map +1 -1
  76. package/dist/help.js +0 -1
  77. package/dist/help.js.map +1 -1
  78. package/dist/hooks/__tests__/auto-context.test.js +1 -0
  79. package/dist/hooks/__tests__/auto-context.test.js.map +1 -1
  80. package/dist/hooks/auto-context.d.ts.map +1 -1
  81. package/dist/hooks/auto-context.js +2 -2
  82. package/dist/hooks/auto-context.js.map +1 -1
  83. package/dist/index.js +8 -10
  84. package/dist/index.js.map +1 -1
  85. package/dist/orchestrators/anthropic-orchestrator.d.ts +0 -6
  86. package/dist/orchestrators/anthropic-orchestrator.d.ts.map +1 -1
  87. package/dist/orchestrators/anthropic-orchestrator.js +55 -1
  88. package/dist/orchestrators/anthropic-orchestrator.js.map +1 -1
  89. package/dist/orchestrators/anthropic-orchestrator.test.js +174 -0
  90. package/dist/orchestrators/anthropic-orchestrator.test.js.map +1 -1
  91. package/dist/orchestrators/gemini-orchestrator.d.ts.map +1 -1
  92. package/dist/orchestrators/gemini-orchestrator.js +25 -1
  93. package/dist/orchestrators/gemini-orchestrator.js.map +1 -1
  94. package/dist/orchestrators/gemini-orchestrator.test.js +38 -0
  95. package/dist/orchestrators/gemini-orchestrator.test.js.map +1 -1
  96. package/dist/orchestrators/ollama-orchestrator.d.ts.map +1 -1
  97. package/dist/orchestrators/ollama-orchestrator.js +18 -2
  98. package/dist/orchestrators/ollama-orchestrator.js.map +1 -1
  99. package/dist/orchestrators/ollama-orchestrator.test.js +34 -0
  100. package/dist/orchestrators/ollama-orchestrator.test.js.map +1 -1
  101. package/dist/orchestrators/openai-orchestrator.d.ts.map +1 -1
  102. package/dist/orchestrators/openai-orchestrator.js +19 -2
  103. package/dist/orchestrators/openai-orchestrator.js.map +1 -1
  104. package/dist/orchestrators/openai-orchestrator.test.js +38 -0
  105. package/dist/orchestrators/openai-orchestrator.test.js.map +1 -1
  106. package/dist/orchestrators/orchestrator.d.ts +38 -0
  107. package/dist/orchestrators/orchestrator.d.ts.map +1 -1
  108. package/dist/orchestrators/orchestrator.js.map +1 -1
  109. package/dist/orchestrators/orchestrator.test.js +115 -0
  110. package/dist/orchestrators/orchestrator.test.js.map +1 -1
  111. package/dist/orchestrators/shell-orchestrator.d.ts.map +1 -1
  112. package/dist/orchestrators/shell-orchestrator.js +11 -2
  113. package/dist/orchestrators/shell-orchestrator.js.map +1 -1
  114. package/dist/orchestrators/shell-orchestrator.test.js +69 -0
  115. package/dist/orchestrators/shell-orchestrator.test.js.map +1 -1
  116. package/dist/utils.d.ts +8 -0
  117. package/dist/utils.d.ts.map +1 -1
  118. package/dist/utils.js +85 -17
  119. package/dist/utils.js.map +1 -1
  120. package/dist/utils.test.js +198 -1
  121. package/dist/utils.test.js.map +1 -1
  122. package/package.json +2 -2
  123. package/dist/schemas/handoff-checkpoint.d.ts +0 -34
  124. package/dist/schemas/handoff-checkpoint.d.ts.map +0 -1
  125. package/dist/schemas/handoff-checkpoint.js +0 -13
  126. package/dist/schemas/handoff-checkpoint.js.map +0 -1
  127. package/dist/schemas/handoff-checkpoint.test.d.ts +0 -2
  128. package/dist/schemas/handoff-checkpoint.test.d.ts.map +0 -1
  129. package/dist/schemas/handoff-checkpoint.test.js +0 -65
  130. package/dist/schemas/handoff-checkpoint.test.js.map +0 -1
@@ -1,47 +1,21 @@
1
1
  import * as fs from 'node:fs';
2
2
  import * as path from 'node:path';
3
- import { readAllLessons } from '@mmnto/totem'; // totem-ignore
4
- import { HandoffCheckpointSchema } from '../schemas/handoff-checkpoint.js';
5
- import { sanitize, wrapXml } from '../utils.js';
3
+ import { readAllLessons } from '@mmnto/totem'; // totem-context: static import required — readRecentLessons is a sync exported helper used in tests
4
+ import { sanitize } from '../utils.js';
6
5
  // ─── Constants ──────────────────────────────────────────
7
6
  const TAG = 'Handoff';
8
- const MAX_DIFF_CHARS = 50_000;
9
7
  const LESSONS_TAIL_LINES = 100;
10
- // ─── System prompt ──────────────────────────────────────
11
- const SYSTEM_PROMPT = `# Handoff System Prompt — End-of-Session State Transfer
12
-
13
- ## Purpose
14
- Produce an end-of-session handoff snapshot that captures everything the next session (or the next developer) needs to resume work immediately.
15
-
16
- ## Role
17
- You are writing a concise, tactical "End of Shift" handoff. You have access to the current git state, uncommitted changes, and lessons learned during this session. Your job is to synthesize this into a snapshot that lets the next session bootstrap instantly — no detective work required.
18
-
19
- ## Rules
20
- - Be concrete and specific — file paths, branch names, issue numbers
21
- - Distinguish between what IS done vs what NEEDS to be done next
22
- - If there are uncommitted changes, describe what they represent and whether they look ready to commit
23
- - If the working tree is clean, say so and focus on what was accomplished and what's next
24
- - Capture any lessons or traps discovered during this session
25
- - Be concise — this is a tactical handoff, not a retrospective
26
-
27
- ## Output Format
28
- Respond with ONLY the sections below. No preamble, no closing remarks.
29
-
30
- ### Branch & State
31
- [Current branch, clean/dirty status, what the branch represents]
32
-
33
- ### What Was Done
34
- [Summary of work completed this session based on the diff and git state. If no changes, say "No uncommitted changes — session may have been exploratory or changes were already committed."]
35
-
36
- ### Uncommitted Changes
37
- [Description of what the uncommitted changes contain and their state (staged vs unstaged). If clean, say "Working tree is clean."]
38
-
39
- ### Lessons & Traps
40
- [Lessons learned during this session from the memory file. If none, say "No new lessons recorded this session."]
41
-
42
- ### Next Steps
43
- [Clear, ordered list of what the next session should do first. Be specific — not "continue working" but "finish implementing X in file Y, then run tests."]
44
- `;
8
+ const RECENT_COMMITS_COUNT = 10;
9
+ const MAX_SLUG_LENGTH = 60;
10
+ /** Local calendar date as YYYY-MM-DD (avoids UTC off-by-one for evening users). */
11
+ function currentLocalDate() {
12
+ const now = new Date();
13
+ return [
14
+ now.getFullYear(),
15
+ String(now.getMonth() + 1).padStart(2, '0'),
16
+ String(now.getDate()).padStart(2, '0'),
17
+ ].join('-');
18
+ }
45
19
  // ─── Lessons file reader ────────────────────────────────
46
20
  export function readRecentLessons(cwd, totemDir) {
47
21
  const fullTotemDir = path.join(cwd, totemDir);
@@ -55,190 +29,67 @@ export function readRecentLessons(cwd, totemDir) {
55
29
  return combined.trim();
56
30
  return lines.slice(-LESSONS_TAIL_LINES).join('\n').trim();
57
31
  }
58
- // ─── Prompt assembly ────────────────────────────────────
59
- function assemblePrompt(branch, status, diff, diffStat, lessons, systemPrompt) {
60
- const sections = [systemPrompt];
61
- // Git state
62
- sections.push('=== GIT STATE ===');
63
- sections.push(`Branch: ${branch}`);
64
- sections.push(`Status:\n${status ? wrapXml('git_status', status) : '(clean working tree)'}`);
65
- // Diff
66
- sections.push('\n=== DIFF ===');
67
- if (!diff.trim()) {
68
- sections.push('(no uncommitted changes)');
69
- }
70
- else {
71
- if (diffStat) {
72
- sections.push(`Diff stat:\n${diffStat}`);
73
- sections.push('');
74
- }
75
- if (diff.length > MAX_DIFF_CHARS) {
76
- sections.push(wrapXml('git_diff', diff.slice(0, MAX_DIFF_CHARS) + `\n... [diff truncated at ${MAX_DIFF_CHARS} chars] ...`));
77
- }
78
- else {
79
- sections.push(wrapXml('git_diff', diff));
80
- }
81
- }
82
- // Lessons
83
- sections.push('\n=== SESSION LESSONS ===');
84
- sections.push(lessons || '(no lessons recorded)');
85
- return sections.join('\n');
86
- }
87
- /**
88
- * Parse file paths from `git status --porcelain` output.
89
- * Handles standard two-char status codes: " M", "M ", "MM", "A ", "??", "D ", etc.
90
- * Also handles renames ("R old -> new") by extracting the new path.
91
- */
92
- function parseStatusFiles(statusOutput) {
93
- if (!statusOutput.trim())
94
- return [];
95
- const files = [];
96
- for (const line of statusOutput.split(/\r?\n/)) {
97
- if (!line.trim())
98
- continue;
99
- // Porcelain format: XY <path> or XY <old> -> <new> for renames (R/C status)
100
- const statusCode = line.slice(0, 2);
101
- let filePart = line.slice(3); // skip 2-char status + space
102
- if ((statusCode.includes('R') || statusCode.includes('C')) && filePart.includes(' -> ')) {
103
- filePart = filePart.slice(filePart.indexOf(' -> ') + 4);
104
- }
105
- // Strip C-style quotes that git adds for paths with spaces/special chars
106
- if (filePart.startsWith('"') && filePart.endsWith('"')) {
107
- filePart = filePart.slice(1, -1);
108
- }
109
- files.push(filePart);
110
- }
111
- return files;
112
- }
113
- /**
114
- * Gathers deterministic (zero-LLM) state for the handoff checkpoint.
115
- * ADR-039: Git Metadata Primacy — these fields come from git, never the LLM.
116
- */
117
- export async function gatherDeterministicState(cwd) {
118
- const { getGitBranch, getGitStatus } = await import('../git.js');
119
- // 1. Get branch — handle detached HEAD gracefully
120
- let branch;
121
- try {
122
- const raw = getGitBranch(cwd);
123
- branch = raw && raw !== '(unknown)' ? raw : 'HEAD';
124
- }
125
- catch {
126
- branch = 'HEAD';
127
- }
128
- // 2. Get active files from git status --porcelain (covers staged, unstaged, and untracked)
129
- const statusOutput = getGitStatus(cwd);
130
- const active_files = parseStatusFiles(statusOutput).sort();
131
- // 3. Return checkpoint with timestamp and empty open_prs (PR detection is future work)
132
- return {
133
- checkpoint_version: 1,
134
- timestamp: new Date().toISOString(),
135
- branch,
136
- active_files,
137
- open_prs: [],
138
- };
139
- }
140
- // ─── Semantic field extraction (Task 3) ─────────────────
141
- /**
142
- * Known Markdown section headings and the semantic field they map to.
143
- * Headings are matched case-insensitively.
144
- */
145
- const SECTION_MAP = {
146
- 'what was done': 'completed',
147
- 'next steps': 'remaining',
148
- 'lessons & traps': 'context_hints',
149
- lessons: 'context_hints',
150
- 'uncommitted changes': 'pending_decisions',
151
- };
32
+ // ─── Slug from branch ───────────────────────────────────
152
33
  /**
153
- * Extract semantic fields from Markdown output by parsing section headings
154
- * and collecting bullet points / non-empty lines under each.
155
- *
156
- * Returns empty arrays for any sections not found or when input is malformed.
34
+ * Derive a filesystem-safe slug from the git branch name.
35
+ * Falls back to 'session' for main, master, or detached HEAD.
157
36
  */
158
- export function parseSemanticFields(markdown) {
159
- const result = {
160
- completed: [],
161
- remaining: [],
162
- pending_decisions: [],
163
- context_hints: [],
164
- };
165
- if (!markdown || !markdown.trim())
166
- return result;
167
- const lines = markdown.split(/\r?\n/);
168
- let currentField = null;
169
- let inCodeBlock = false;
170
- for (const line of lines) {
171
- const trimmed = line.trim();
172
- // Track fenced code blocks (``` or ~~~)
173
- if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) {
174
- inCodeBlock = !inCodeBlock;
175
- continue;
176
- }
177
- if (inCodeBlock)
178
- continue;
179
- // Detect heading (### or ##)
180
- const headingMatch = line.match(/^#{2,3}\s+(.+)$/);
181
- if (headingMatch) {
182
- const heading = headingMatch[1].trim().toLowerCase();
183
- currentField = SECTION_MAP[heading] ?? null;
184
- continue;
185
- }
186
- // Collect content lines under recognized sections
187
- if (currentField) {
188
- if (!trimmed)
189
- continue;
190
- const bulletMatch = trimmed.match(/^[-*]\s+(.+)$/) ?? trimmed.match(/^\d+\.\s+(.+)$/);
191
- if (bulletMatch) {
192
- result[currentField].push(bulletMatch[1].trim());
193
- }
194
- else if (!/^#{1,6}\s/.test(trimmed)) {
195
- result[currentField].push(trimmed);
196
- }
197
- }
198
- }
199
- return result;
37
+ export function slugFromBranch(branch) {
38
+ const generic = ['main', 'master', 'HEAD', '', '(unknown)'];
39
+ if (generic.includes(branch))
40
+ return 'session';
41
+ // Strip common prefixes (feat/, fix/, chore/, hotfix/, etc.)
42
+ const stripped = branch.replace(/^[a-z]+\//, '');
43
+ // Sanitize: lowercase, replace non-alphanumeric with hyphens, collapse runs, trim
44
+ return (stripped
45
+ .toLowerCase()
46
+ .replace(/[^a-z0-9]+/g, '-')
47
+ .replace(/^-|-$/g, '')
48
+ .slice(0, MAX_SLUG_LENGTH) || 'session');
200
49
  }
201
- // ─── Atomic checkpoint writer (Task 4) ──────────────────
50
+ // ─── Journal path resolution ────────────────────────────
202
51
  /**
203
- * Write a JSON checkpoint file atomically: write to a .tmp file then rename.
204
- * Creates parent directories if needed.
52
+ * Build the journal file path: .totem/journal/YYYY-MM-DD-<slug>.md
53
+ * If --out is specified, use that path instead.
205
54
  */
206
- export function writeCheckpoint(jsonPath, checkpoint) {
207
- const dir = path.dirname(jsonPath);
208
- if (!fs.existsSync(dir)) {
209
- fs.mkdirSync(dir, { recursive: true });
210
- }
211
- const tmpPath = jsonPath + '.tmp';
212
- fs.writeFileSync(tmpPath, JSON.stringify(checkpoint, null, 2) + '\n', 'utf-8');
213
- fs.renameSync(tmpPath, jsonPath);
55
+ export function resolveJournalPath(cwd, totemDir, branch, outPath) {
56
+ if (outPath)
57
+ return outPath;
58
+ const date = currentLocalDate(); // YYYY-MM-DD
59
+ const slug = slugFromBranch(branch);
60
+ return path.join(cwd, totemDir, 'journal', `${date}-${slug}.md`);
214
61
  }
62
+ // ─── Journal scaffold builder ───────────────────────────
215
63
  /**
216
- * Determine the JSON checkpoint path given the --out option.
217
- * - If --out is specified: companion file with .json extension
218
- * - If --out is not specified: <cwd>/<totemDir>/handoff.json
64
+ * Build the structured journal scaffold with human-editable sections
65
+ * at the top and deterministic git state at the bottom.
219
66
  */
220
- export function resolveCheckpointPath(cwd, totemDir, outPath) {
221
- if (outPath) {
222
- const ext = path.extname(outPath);
223
- if (ext === '.json') {
224
- return outPath.slice(0, -ext.length) + '.checkpoint.json';
225
- }
226
- if (ext) {
227
- return outPath.slice(0, -ext.length) + '.json';
228
- }
229
- return outPath + '.json';
230
- }
231
- return path.join(cwd, totemDir, 'handoff.json');
232
- }
233
- // ─── Lite handoff (zero LLM) ────────────────────────────
234
- const RECENT_COMMITS_COUNT = 10;
235
- export function buildLiteHandoff(branch, status, diffStat, recentCommits, lessons) {
67
+ export function buildJournalScaffold(branch, status, diffStat, recentCommits, lessons) {
236
68
  // Sanitize git-sourced fields to strip ANSI escapes / control chars
237
- const sBranch = sanitize(branch); // totem-ignore — ANSI stripping for terminal output safety
69
+ const sBranch = sanitize(branch);
238
70
  const sStatus = sanitize(status);
239
71
  const sDiffStat = sanitize(diffStat);
240
72
  const sCommits = sanitize(recentCommits);
73
+ const date = currentLocalDate();
241
74
  const lines = [];
75
+ // ── Human-editable section (top) ──
76
+ lines.push(`# ${date} — ${sBranch}`);
77
+ lines.push('');
78
+ lines.push('## What Shipped');
79
+ lines.push('<!-- What was accomplished this session? -->');
80
+ lines.push('');
81
+ lines.push('## Architectural Decisions');
82
+ lines.push('<!-- Any design choices worth recording? -->');
83
+ lines.push('');
84
+ lines.push('## Open Tickets');
85
+ lines.push('<!-- Tickets filed, referenced, or blocked? -->');
86
+ lines.push('');
87
+ lines.push('## Next Steps');
88
+ lines.push('<!-- What should the next session pick up? -->');
89
+ lines.push('');
90
+ // ── Deterministic git state (bottom) ──
91
+ lines.push('---');
92
+ lines.push('');
242
93
  lines.push('### Branch & State');
243
94
  lines.push(`${sBranch}; ${sStatus.trim() ? 'dirty working tree' : 'clean working tree'}.`);
244
95
  lines.push('');
@@ -276,13 +127,29 @@ export function buildLiteHandoff(branch, status, diffStat, recentCommits, lesson
276
127
  else {
277
128
  lines.push('No lessons file found.');
278
129
  }
279
- return lines.join('\n');
130
+ return lines.join('\n') + '\n';
131
+ }
132
+ // ─── Editor launcher ────────────────────────────────────
133
+ /**
134
+ * Open a file in the user's editor. Uses $VISUAL, then $EDITOR, then vi.
135
+ * Returns true if the editor exited successfully.
136
+ */
137
+ export async function openInEditor(filePath) {
138
+ const { spawnSync } = await import('node:child_process');
139
+ const editor = process.env['VISUAL'] || process.env['EDITOR'] || 'vi';
140
+ // Use shell: true so the system shell parses the editor command (handles
141
+ // quoted paths like "/Applications/Visual Studio Code.app/.../code" --wait
142
+ // and Windows .cmd/.bat resolution).
143
+ const result = spawnSync(`${editor} "${filePath}"`, {
144
+ stdio: 'inherit',
145
+ shell: true,
146
+ });
147
+ return result.status === 0;
280
148
  }
281
- // ─── Main command ───────────────────────────────────────
282
149
  export async function handoffCommand(options) {
283
- const { getGitBranch, getGitDiff, getGitDiffStat, getGitLogSince, getGitStatus } = await import('../git.js');
150
+ const { getGitBranch, getGitDiffStat, getGitLogSince, getGitStatus } = await import('../git.js');
284
151
  const { log } = await import('../ui.js');
285
- const { getSystemPrompt, loadConfig, loadEnv, resolveConfigPath, runOrchestrator, writeOutput } = await import('../utils.js');
152
+ const { loadConfig, loadEnv, resolveConfigPath } = await import('../utils.js');
286
153
  const cwd = process.cwd();
287
154
  const configPath = resolveConfigPath(cwd);
288
155
  loadEnv(cwd);
@@ -292,69 +159,49 @@ export async function handoffCommand(options) {
292
159
  const branch = getGitBranch(cwd);
293
160
  const status = getGitStatus(cwd);
294
161
  log.info(TAG, `Branch: ${branch}`);
295
- // Get diff
296
- log.info(TAG, 'Getting uncommitted diff...');
297
- const diff = getGitDiff('all', cwd);
298
- const diffStat = diff.trim() ? getGitDiffStat(cwd) : '';
299
- if (diff.trim()) {
300
- log.info(TAG, `Diff: ${(diff.length / 1024).toFixed(0)}KB`);
301
- }
302
- else {
303
- log.dim(TAG, 'Working tree is clean.');
304
- }
162
+ const diffStat = status.trim() ? getGitDiffStat(cwd) : '';
163
+ const recentCommits = getGitLogSince(cwd, undefined, RECENT_COMMITS_COUNT);
305
164
  // Read recent lessons
306
- log.info(TAG, 'Reading recent lessons...');
307
165
  const lessons = readRecentLessons(cwd, config.totemDir);
308
- log.info(TAG, `Lessons: ${lessons ? `${lessons.split('\n').length} lines` : 'none found'}`);
309
- // Lite mode deterministic, zero LLM
310
- if (options.lite) {
311
- // Snapshot git state BEFORE writing any files to avoid self-contamination
312
- const deterministicState = await gatherDeterministicState(cwd);
313
- const recentCommits = getGitLogSince(cwd, undefined, RECENT_COMMITS_COUNT);
314
- const output = buildLiteHandoff(branch, status, diffStat, recentCommits, lessons);
315
- writeOutput(output, options.out);
316
- if (options.out)
317
- log.success(TAG, `Written to ${options.out}`);
318
- // Write checkpoint JSON with empty semantic fields (lite = no LLM)
319
- try {
320
- const checkpoint = HandoffCheckpointSchema.parse(deterministicState);
321
- const jsonPath = resolveCheckpointPath(cwd, config.totemDir, options.out);
322
- writeCheckpoint(jsonPath, checkpoint);
323
- log.dim(TAG, `Checkpoint: ${jsonPath}`);
324
- }
325
- catch (err) {
326
- const msg = err instanceof Error ? err.message : String(err);
327
- log.warn(TAG, `Checkpoint write failed (skipped): ${msg}`);
328
- }
329
- log.dim(TAG, 'Lite handoff complete (zero LLM).');
166
+ // Build scaffold
167
+ const scaffold = buildJournalScaffold(branch, status, diffStat, recentCommits, lessons);
168
+ // --out: write to the specified path and exit (no editor)
169
+ if (options.out) {
170
+ const outDir = path.dirname(options.out);
171
+ if (!fs.existsSync(outDir))
172
+ fs.mkdirSync(outDir, { recursive: true });
173
+ fs.writeFileSync(options.out, scaffold, 'utf-8');
174
+ log.success(TAG, `Scaffold written to ${options.out}`);
330
175
  return;
331
176
  }
332
- // Resolve system prompt (allow .totem/prompts/handoff.md override)
333
- const systemPrompt = getSystemPrompt('handoff', SYSTEM_PROMPT, cwd, config.totemDir);
334
- // Assemble prompt
335
- const prompt = assemblePrompt(branch, status, diff, diffStat, lessons, systemPrompt);
336
- log.dim(TAG, `Prompt: ${(prompt.length / 1024).toFixed(0)}KB`);
337
- // Snapshot git state BEFORE writing any files to avoid self-contamination
338
- const deterministicState = await gatherDeterministicState(cwd);
339
- const content = await runOrchestrator({ prompt, tag: TAG, options, config, cwd });
340
- if (content != null) {
341
- writeOutput(content, options.out);
342
- if (options.out)
343
- log.success(TAG, `Written to ${options.out}`);
344
- // Build structured checkpoint: deterministic state + semantic fields from LLM output
345
- const semanticFields = parseSemanticFields(content);
346
- const merged = { ...deterministicState, ...semanticFields };
347
- try {
348
- const checkpoint = HandoffCheckpointSchema.parse(merged);
349
- const jsonPath = resolveCheckpointPath(cwd, config.totemDir, options.out);
350
- writeCheckpoint(jsonPath, checkpoint);
351
- log.dim(TAG, `Checkpoint: ${jsonPath}`);
352
- }
353
- catch (err) {
354
- // Checkpoint is best-effort — never block the handoff on validation failure
355
- const msg = err instanceof Error ? err.message : String(err);
356
- log.warn(TAG, `Checkpoint validation failed (skipped): ${msg}`);
357
- }
177
+ // --stdout / --lite: print to stdout
178
+ if (options.stdout || options.lite) {
179
+ process.stdout.write(scaffold);
180
+ log.dim(TAG, 'Scaffold printed to stdout.');
181
+ return;
182
+ }
183
+ // Default: write scaffold to journal file and open in editor
184
+ const journalPath = resolveJournalPath(cwd, config.totemDir, branch);
185
+ const journalDir = path.dirname(journalPath);
186
+ if (!fs.existsSync(journalDir)) {
187
+ fs.mkdirSync(journalDir, { recursive: true });
188
+ }
189
+ // If the file already exists, don't overwrite open it for editing instead
190
+ if (!fs.existsSync(journalPath)) {
191
+ fs.writeFileSync(journalPath, scaffold, 'utf-8');
192
+ log.success(TAG, `Scaffold written to ${journalPath}`);
193
+ }
194
+ else {
195
+ log.info(TAG, `Journal entry already exists: ${journalPath}`);
196
+ }
197
+ // Open in editor
198
+ log.info(TAG, 'Opening in editor...');
199
+ const ok = await openInEditor(journalPath);
200
+ if (ok) {
201
+ log.success(TAG, 'Journal entry saved.');
202
+ }
203
+ else {
204
+ log.warn(TAG, `Editor exited with error. Your journal entry is at: ${journalPath}`);
358
205
  }
359
206
  }
360
207
  //# sourceMappingURL=handoff.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"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"}