@mmnto/cli 0.28.0 → 0.30.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 (61) hide show
  1. package/dist/adapters/gh-utils.d.ts +5 -0
  2. package/dist/adapters/gh-utils.d.ts.map +1 -1
  3. package/dist/adapters/gh-utils.js +19 -0
  4. package/dist/adapters/gh-utils.js.map +1 -1
  5. package/dist/commands/audit.d.ts +44 -0
  6. package/dist/commands/audit.d.ts.map +1 -0
  7. package/dist/commands/audit.js +400 -0
  8. package/dist/commands/audit.js.map +1 -0
  9. package/dist/commands/audit.test.d.ts +2 -0
  10. package/dist/commands/audit.test.d.ts.map +1 -0
  11. package/dist/commands/audit.test.js +267 -0
  12. package/dist/commands/audit.test.js.map +1 -0
  13. package/dist/commands/briefing.d.ts +8 -0
  14. package/dist/commands/briefing.d.ts.map +1 -1
  15. package/dist/commands/briefing.js +14 -7
  16. package/dist/commands/briefing.js.map +1 -1
  17. package/dist/commands/briefing.test.js +33 -1
  18. package/dist/commands/briefing.test.js.map +1 -1
  19. package/dist/commands/compile.d.ts.map +1 -1
  20. package/dist/commands/compile.js +6 -4
  21. package/dist/commands/compile.js.map +1 -1
  22. package/dist/commands/init.d.ts +19 -0
  23. package/dist/commands/init.d.ts.map +1 -1
  24. package/dist/commands/init.js +151 -15
  25. package/dist/commands/init.js.map +1 -1
  26. package/dist/commands/init.test.js +125 -1
  27. package/dist/commands/init.test.js.map +1 -1
  28. package/dist/commands/shield.d.ts +1 -0
  29. package/dist/commands/shield.d.ts.map +1 -1
  30. package/dist/commands/shield.js +22 -9
  31. package/dist/commands/shield.js.map +1 -1
  32. package/dist/commands/shield.test.js +23 -0
  33. package/dist/commands/shield.test.js.map +1 -1
  34. package/dist/commands/spec.d.ts +19 -0
  35. package/dist/commands/spec.d.ts.map +1 -1
  36. package/dist/commands/spec.js +27 -10
  37. package/dist/commands/spec.js.map +1 -1
  38. package/dist/commands/spec.test.d.ts +2 -0
  39. package/dist/commands/spec.test.d.ts.map +1 -0
  40. package/dist/commands/spec.test.js +159 -0
  41. package/dist/commands/spec.test.js.map +1 -0
  42. package/dist/commands/triage.d.ts +8 -0
  43. package/dist/commands/triage.d.ts.map +1 -1
  44. package/dist/commands/triage.js +15 -7
  45. package/dist/commands/triage.js.map +1 -1
  46. package/dist/commands/triage.test.js +29 -1
  47. package/dist/commands/triage.test.js.map +1 -1
  48. package/dist/commands/wrap.d.ts.map +1 -1
  49. package/dist/commands/wrap.js +24 -5
  50. package/dist/commands/wrap.js.map +1 -1
  51. package/dist/commands/wrap.test.js +15 -2
  52. package/dist/commands/wrap.test.js.map +1 -1
  53. package/dist/index.js +19 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/utils.d.ts +15 -0
  56. package/dist/utils.d.ts.map +1 -1
  57. package/dist/utils.js +42 -0
  58. package/dist/utils.js.map +1 -1
  59. package/dist/utils.test.js +97 -1
  60. package/dist/utils.test.js.map +1 -1
  61. package/package.json +2 -2
@@ -0,0 +1,267 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
5
+ import { executeProposals, formatProposalTable, loadStrategicDocs, MAX_STRATEGIC_CONTEXT_CHARS, parseAuditResponse, selectProposals, validateMergeTargets, } from './audit.js';
6
+ // ─── parseAuditResponse ─────────────────────────────────
7
+ describe('parseAuditResponse', () => {
8
+ it('parses valid proposals from XML-wrapped JSON', () => {
9
+ const content = `Here are my proposals:
10
+ <audit_proposals>
11
+ [
12
+ { "number": 42, "title": "Widget support", "action": "KEEP", "rationale": "Aligns with roadmap." },
13
+ { "number": 99, "title": "Legacy auth", "action": "CLOSE", "rationale": "Superseded by #150." }
14
+ ]
15
+ </audit_proposals>`;
16
+ const proposals = parseAuditResponse(content);
17
+ expect(proposals).toHaveLength(2);
18
+ expect(proposals[0]).toEqual({
19
+ number: 42,
20
+ title: 'Widget support',
21
+ action: 'KEEP',
22
+ newTier: undefined,
23
+ mergeInto: undefined,
24
+ rationale: 'Aligns with roadmap.',
25
+ });
26
+ expect(proposals[1].action).toBe('CLOSE');
27
+ });
28
+ it('parses REPRIORITIZE with newTier', () => {
29
+ const content = `<audit_proposals>
30
+ [{ "number": 55, "title": "Perf", "action": "REPRIORITIZE", "newTier": "tier-3", "rationale": "Defer." }]
31
+ </audit_proposals>`;
32
+ const proposals = parseAuditResponse(content);
33
+ expect(proposals[0].newTier).toBe('tier-3');
34
+ });
35
+ it('parses MERGE with mergeInto', () => {
36
+ const content = `<audit_proposals>
37
+ [{ "number": 88, "title": "Colors", "action": "MERGE", "mergeInto": 42, "rationale": "Subset of #42." }]
38
+ </audit_proposals>`;
39
+ const proposals = parseAuditResponse(content);
40
+ expect(proposals[0].mergeInto).toBe(42);
41
+ });
42
+ it('normalizes action case', () => {
43
+ const content = `<audit_proposals>
44
+ [{ "number": 1, "title": "Test", "action": "close", "rationale": "Done." }]
45
+ </audit_proposals>`;
46
+ const proposals = parseAuditResponse(content);
47
+ expect(proposals[0].action).toBe('CLOSE');
48
+ });
49
+ it('throws on missing XML wrapper', () => {
50
+ expect(() => parseAuditResponse('Just some text without tags')).toThrow('missing <audit_proposals> wrapper');
51
+ });
52
+ it('throws on invalid JSON inside tags', () => {
53
+ const content = '<audit_proposals>not json</audit_proposals>';
54
+ expect(() => parseAuditResponse(content)).toThrow('Failed to parse');
55
+ });
56
+ it('throws on non-array JSON', () => {
57
+ const content = '<audit_proposals>{"number": 1}</audit_proposals>';
58
+ expect(() => parseAuditResponse(content)).toThrow('must be a JSON array');
59
+ });
60
+ it('throws on invalid action', () => {
61
+ const content = `<audit_proposals>
62
+ [{ "number": 1, "title": "Test", "action": "DELETE", "rationale": "Bad." }]
63
+ </audit_proposals>`;
64
+ expect(() => parseAuditResponse(content)).toThrow('Invalid action "DELETE"');
65
+ });
66
+ it('throws on missing issue number', () => {
67
+ const content = `<audit_proposals>
68
+ [{ "title": "Test", "action": "KEEP", "rationale": "Good." }]
69
+ </audit_proposals>`;
70
+ expect(() => parseAuditResponse(content)).toThrow('Invalid or missing "number"');
71
+ });
72
+ it('throws on MERGE without mergeInto', () => {
73
+ const content = `<audit_proposals>
74
+ [{ "number": 88, "title": "Colors", "action": "MERGE", "rationale": "Subset." }]
75
+ </audit_proposals>`;
76
+ expect(() => parseAuditResponse(content)).toThrow('Invalid or missing "mergeInto"');
77
+ });
78
+ it('throws on REPRIORITIZE with invalid tier', () => {
79
+ const content = `<audit_proposals>
80
+ [{ "number": 55, "title": "Perf", "action": "REPRIORITIZE", "newTier": "urgent", "rationale": "Defer." }]
81
+ </audit_proposals>`;
82
+ expect(() => parseAuditResponse(content)).toThrow('Invalid "newTier"');
83
+ });
84
+ it('throws on REPRIORITIZE without newTier', () => {
85
+ const content = `<audit_proposals>
86
+ [{ "number": 55, "title": "Perf", "action": "REPRIORITIZE", "rationale": "Defer." }]
87
+ </audit_proposals>`;
88
+ expect(() => parseAuditResponse(content)).toThrow('Invalid "newTier"');
89
+ });
90
+ });
91
+ // ─── formatProposalTable ────────────────────────────────
92
+ describe('formatProposalTable', () => {
93
+ const proposals = [
94
+ { number: 42, title: 'Widget support', action: 'KEEP', rationale: 'Good.' },
95
+ {
96
+ number: 55,
97
+ title: 'Perf',
98
+ action: 'REPRIORITIZE',
99
+ newTier: 'tier-3',
100
+ rationale: 'Defer.',
101
+ },
102
+ { number: 88, title: 'Colors', action: 'MERGE', mergeInto: 42, rationale: 'Subset.' },
103
+ { number: 99, title: 'Legacy', action: 'CLOSE', rationale: 'Obsolete.' },
104
+ ];
105
+ it('generates a markdown table with all proposals', () => {
106
+ const table = formatProposalTable(proposals);
107
+ expect(table).toContain('| Issue | Title | Action | Rationale |');
108
+ expect(table).toContain('#42');
109
+ expect(table).toContain('#99');
110
+ });
111
+ it('shows tier for REPRIORITIZE', () => {
112
+ const table = formatProposalTable(proposals);
113
+ expect(table).toContain('REPRI → tier-3');
114
+ });
115
+ it('shows merge target for MERGE', () => {
116
+ const table = formatProposalTable(proposals);
117
+ expect(table).toContain('MERGE → #42');
118
+ });
119
+ it('handles empty array', () => {
120
+ const table = formatProposalTable([]);
121
+ const lines = table.split('\n');
122
+ expect(lines).toHaveLength(2); // header + separator only
123
+ });
124
+ });
125
+ // ─── validateMergeTargets ───────────────────────────────
126
+ describe('validateMergeTargets', () => {
127
+ it('returns empty array when all merge targets are valid', () => {
128
+ const proposals = [
129
+ { number: 88, title: 'Colors', action: 'MERGE', mergeInto: 42, rationale: 'Subset.' },
130
+ ];
131
+ const errors = validateMergeTargets(proposals, new Set([42, 88, 99]));
132
+ expect(errors).toHaveLength(0);
133
+ });
134
+ it('returns errors for invalid merge targets', () => {
135
+ const proposals = [
136
+ { number: 88, title: 'Colors', action: 'MERGE', mergeInto: 999, rationale: 'Bad.' },
137
+ ];
138
+ const errors = validateMergeTargets(proposals, new Set([42, 88]));
139
+ expect(errors).toHaveLength(1);
140
+ expect(errors[0]).toContain('#999');
141
+ expect(errors[0]).toContain('not in the backlog');
142
+ });
143
+ it('ignores non-MERGE proposals', () => {
144
+ const proposals = [
145
+ { number: 42, title: 'Widget', action: 'KEEP', rationale: 'Good.' },
146
+ { number: 99, title: 'Legacy', action: 'CLOSE', rationale: 'Old.' },
147
+ ];
148
+ const errors = validateMergeTargets(proposals, new Set([42]));
149
+ expect(errors).toHaveLength(0);
150
+ });
151
+ });
152
+ // ─── selectProposals ────────────────────────────────────
153
+ describe('selectProposals', () => {
154
+ const proposals = [
155
+ { number: 42, title: 'Widget', action: 'KEEP', rationale: 'Good.' },
156
+ { number: 99, title: 'Legacy', action: 'CLOSE', rationale: 'Obsolete.' },
157
+ { number: 55, title: 'Perf', action: 'REPRIORITIZE', newTier: 'tier-3', rationale: 'Defer.' },
158
+ ];
159
+ it('returns all actionable proposals in --yes mode', async () => {
160
+ const selected = await selectProposals(proposals, { yes: true, isTTY: false });
161
+ expect(selected).toHaveLength(2); // CLOSE + REPRIORITIZE, not KEEP
162
+ expect(selected.map((p) => p.number)).toEqual([99, 55]);
163
+ });
164
+ it('returns empty array when all proposals are KEEP', async () => {
165
+ const keepOnly = [
166
+ { number: 1, title: 'A', action: 'KEEP', rationale: 'Good.' },
167
+ { number: 2, title: 'B', action: 'KEEP', rationale: 'Good.' },
168
+ ];
169
+ const selected = await selectProposals(keepOnly, { yes: true, isTTY: false });
170
+ expect(selected).toHaveLength(0);
171
+ });
172
+ it('throws in non-TTY without --yes', async () => {
173
+ await expect(selectProposals(proposals, { yes: false, isTTY: false })).rejects.toThrow('non-interactive mode');
174
+ });
175
+ });
176
+ // ─── executeProposals ───────────────────────────────────
177
+ vi.mock('../adapters/gh-utils.js', () => ({
178
+ ghExec: vi.fn(),
179
+ }));
180
+ const { ghExec: mockGhExec } = await vi.importMock('../adapters/gh-utils.js');
181
+ describe('executeProposals', () => {
182
+ beforeEach(() => {
183
+ vi.mocked(mockGhExec).mockReset();
184
+ });
185
+ it('closes issues with comment and close commands', () => {
186
+ const proposals = [
187
+ { number: 99, title: 'Legacy', action: 'CLOSE', rationale: 'Done.' },
188
+ ];
189
+ const result = executeProposals(proposals, '/tmp/test');
190
+ expect(result.succeeded).toBe(1);
191
+ expect(result.failed).toBe(0);
192
+ // ghExec called for: comment (--body-file) + close
193
+ expect(vi.mocked(mockGhExec)).toHaveBeenCalledTimes(2);
194
+ });
195
+ it('continues on failure and reports errors', () => {
196
+ vi.mocked(mockGhExec).mockImplementationOnce(() => {
197
+ throw new Error('rate limit');
198
+ });
199
+ const proposals = [
200
+ { number: 99, title: 'Legacy', action: 'CLOSE', rationale: 'Done.' },
201
+ { number: 55, title: 'Perf', action: 'CLOSE', rationale: 'Old.' },
202
+ ];
203
+ const result = executeProposals(proposals, '/tmp/test');
204
+ expect(result.failed).toBe(1);
205
+ expect(result.succeeded).toBe(1);
206
+ expect(result.errors).toHaveLength(1);
207
+ expect(result.errors[0]).toContain('#99');
208
+ });
209
+ it('skips KEEP proposals', () => {
210
+ const proposals = [
211
+ { number: 42, title: 'Widget', action: 'KEEP', rationale: 'Good.' },
212
+ ];
213
+ const result = executeProposals(proposals, '/tmp/test');
214
+ expect(result.succeeded).toBe(0);
215
+ expect(result.failed).toBe(0);
216
+ expect(vi.mocked(mockGhExec)).not.toHaveBeenCalled();
217
+ });
218
+ it('reports error when REPRIORITIZE missing newTier (defense-in-depth)', () => {
219
+ // parseAuditResponse catches this at parse time, but executeProposals
220
+ // still guards against it as defense-in-depth
221
+ const proposals = [
222
+ { number: 55, title: 'Perf', action: 'REPRIORITIZE', rationale: 'Defer.' },
223
+ ];
224
+ const result = executeProposals(proposals, '/tmp/test');
225
+ expect(result.failed).toBe(1);
226
+ expect(result.succeeded).toBe(0);
227
+ expect(result.errors[0]).toContain('missing newTier');
228
+ });
229
+ it('reports error when MERGE missing mergeInto (defense-in-depth)', () => {
230
+ const proposals = [
231
+ { number: 88, title: 'Colors', action: 'MERGE', rationale: 'Subset.' },
232
+ ];
233
+ const result = executeProposals(proposals, '/tmp/test');
234
+ expect(result.failed).toBe(1);
235
+ expect(result.succeeded).toBe(0);
236
+ expect(result.errors[0]).toContain('missing mergeInto');
237
+ });
238
+ });
239
+ // ─── loadStrategicDocs ──────────────────────────────────
240
+ describe('loadStrategicDocs', () => {
241
+ it('truncates when content exceeds MAX_STRATEGIC_CONTEXT_CHARS', () => {
242
+ // Create a temp dir with a massive file
243
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-audit-test-'));
244
+ const strategyDir = path.join(tmpDir, '.strategy');
245
+ fs.mkdirSync(strategyDir, { recursive: true });
246
+ const bigContent = 'x'.repeat(MAX_STRATEGIC_CONTEXT_CHARS + 10_000);
247
+ fs.writeFileSync(path.join(strategyDir, 'big.md'), bigContent);
248
+ try {
249
+ const result = loadStrategicDocs(tmpDir);
250
+ expect(result.length).toBeLessThanOrEqual(MAX_STRATEGIC_CONTEXT_CHARS);
251
+ }
252
+ finally {
253
+ fs.rmSync(tmpDir, { recursive: true, force: true });
254
+ }
255
+ });
256
+ it('returns empty string when no strategic docs exist', () => {
257
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-audit-test-'));
258
+ try {
259
+ const result = loadStrategicDocs(tmpDir);
260
+ expect(result).toBe('');
261
+ }
262
+ finally {
263
+ fs.rmSync(tmpDir, { recursive: true, force: true });
264
+ }
265
+ });
266
+ });
267
+ //# sourceMappingURL=audit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.test.js","sourceRoot":"","sources":["../../src/commands/audit.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,12 @@
1
+ import type { SearchResult } from '@mmnto/totem';
1
2
  import type { StandardPrListItem } from '../adapters/pr-adapter.js';
3
+ interface RetrievedContext {
4
+ specs: SearchResult[];
5
+ sessions: SearchResult[];
6
+ lessons: SearchResult[];
7
+ }
2
8
  export declare function formatPRList(prs: StandardPrListItem[]): string;
9
+ export declare function assemblePrompt(branch: string, status: string, prs: StandardPrListItem[], context: RetrievedContext, systemPrompt: string): string;
3
10
  export interface BriefingOptions {
4
11
  raw?: boolean;
5
12
  out?: string;
@@ -7,4 +14,5 @@ export interface BriefingOptions {
7
14
  fresh?: boolean;
8
15
  }
9
16
  export declare function briefingCommand(options: BriefingOptions): Promise<void>;
17
+ export {};
10
18
  //# sourceMappingURL=briefing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"briefing.d.ts","sourceRoot":"","sources":["../../src/commands/briefing.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AA4EpE,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAG9D;AAqCD,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C7E"}
1
+ {"version":3,"file":"briefing.d.ts","sourceRoot":"","sources":["../../src/commands/briefing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,cAAc,CAAC;AAI9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AA6DpE,UAAU,gBAAgB;IACxB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAkBD,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAG9D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,kBAAkB,EAAE,EACzB,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,MAAM,GACnB,MAAM,CA6BR;AAID,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C7E"}
@@ -3,10 +3,12 @@ import { createEmbedder, LanceStore } from '@mmnto/totem';
3
3
  import { GitHubCliPrAdapter } from '../adapters/github-cli-pr.js';
4
4
  import { getGitBranch, getGitStatus } from '../git.js';
5
5
  import { log } from '../ui.js';
6
- import { formatResults, getSystemPrompt, loadConfig, loadEnv, requireEmbedding, resolveConfigPath, runOrchestrator, wrapXml, writeOutput, } from '../utils.js';
6
+ import { formatLessonSection, formatResults, getSystemPrompt, loadConfig, loadEnv, partitionLessons, requireEmbedding, resolveConfigPath, runOrchestrator, wrapXml, writeOutput, } from '../utils.js';
7
7
  // ─── Constants ──────────────────────────────────────────
8
8
  const TAG = 'Briefing';
9
+ const SPEC_SEARCH_POOL = 20;
9
10
  const MAX_SPEC_RESULTS = 5;
11
+ const MAX_LESSONS = 5;
10
12
  const MAX_SESSION_RESULTS = 5;
11
13
  // ─── System prompt ──────────────────────────────────────
12
14
  const SYSTEM_PROMPT = `# Briefing System Prompt — Session Startup Briefing
@@ -42,11 +44,12 @@ Respond with ONLY the sections below. No preamble, no closing remarks.
42
44
  `;
43
45
  async function retrieveContext(query, store) {
44
46
  const search = (typeFilter, maxResults) => store.search({ query, typeFilter, maxResults });
45
- const [specs, sessions] = await Promise.all([
46
- search('spec', MAX_SPEC_RESULTS),
47
+ const [allSpecs, sessions] = await Promise.all([
48
+ search('spec', SPEC_SEARCH_POOL),
47
49
  search('session_log', MAX_SESSION_RESULTS),
48
50
  ]);
49
- return { specs, sessions };
51
+ const { lessons, specs } = partitionLessons(allSpecs, MAX_LESSONS, MAX_SPEC_RESULTS);
52
+ return { specs, sessions, lessons };
50
53
  }
51
54
  // ─── Prompt assembly ────────────────────────────────────
52
55
  export function formatPRList(prs) {
@@ -54,7 +57,7 @@ export function formatPRList(prs) {
54
57
  return '(none)';
55
58
  return prs.map((pr) => `- #${pr.number} — ${pr.title} (branch: ${pr.headRefName})`).join('\n');
56
59
  }
57
- function assemblePrompt(branch, status, prs, context, systemPrompt) {
60
+ export function assemblePrompt(branch, status, prs, context, systemPrompt) {
58
61
  const sections = [systemPrompt];
59
62
  // Git state
60
63
  sections.push('=== GIT STATE ===');
@@ -73,6 +76,10 @@ function assemblePrompt(branch, status, prs, context, systemPrompt) {
73
76
  if (sessionSection)
74
77
  sections.push(sessionSection);
75
78
  }
79
+ // Lessons — condensed snippets for fast-boot command
80
+ const lessonSection = formatLessonSection(context.lessons, undefined, true);
81
+ if (lessonSection)
82
+ sections.push(lessonSection);
76
83
  return sections.join('\n');
77
84
  }
78
85
  export async function briefingCommand(options) {
@@ -99,8 +106,8 @@ export async function briefingCommand(options) {
99
106
  const query = `${branch} active work session priorities`;
100
107
  log.info(TAG, 'Querying Totem index...');
101
108
  const context = await retrieveContext(query, store);
102
- const totalResults = context.specs.length + context.sessions.length;
103
- log.info(TAG, `Found: ${context.specs.length} specs, ${context.sessions.length} sessions`);
109
+ const totalResults = context.specs.length + context.sessions.length + context.lessons.length;
110
+ log.info(TAG, `Found: ${context.specs.length} specs, ${context.sessions.length} sessions, ${context.lessons.length} lessons`);
104
111
  // Resolve system prompt (allow .totem/prompts/briefing.md override)
105
112
  const systemPrompt = getSystemPrompt('briefing', SYSTEM_PROMPT, cwd, config.totemDir);
106
113
  // Assemble prompt
@@ -1 +1 @@
1
- {"version":3,"file":"briefing.js","sourceRoot":"","sources":["../../src/commands/briefing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"briefing.js","sourceRoot":"","sources":["../../src/commands/briefing.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { formatPRList } from './briefing.js';
2
+ import { assemblePrompt, formatPRList } from './briefing.js';
3
3
  describe('formatPRList', () => {
4
4
  it('returns (none) for empty PR list', () => {
5
5
  expect(formatPRList([])).toBe('(none)');
@@ -23,4 +23,36 @@ describe('formatPRList', () => {
23
23
  expect(lines[1]).toContain('#2');
24
24
  });
25
25
  });
26
+ // ─── assemblePrompt ──────────────────────────────────────
27
+ describe('assemblePrompt', () => {
28
+ const makeLesson = (label) => ({
29
+ content: 'Lesson content here',
30
+ contextPrefix: '',
31
+ filePath: '.totem/lessons.md',
32
+ type: 'spec',
33
+ label,
34
+ score: 0.9,
35
+ metadata: {},
36
+ });
37
+ it('includes condensed lesson section when lessons are present', () => {
38
+ const context = { specs: [], sessions: [], lessons: [makeLesson('Test trap')] };
39
+ const result = assemblePrompt('main', '', [], context, 'SYSTEM');
40
+ expect(result).toContain('RELEVANT LESSONS (HARD CONSTRAINTS)');
41
+ expect(result).toContain('Test trap');
42
+ // Condensed mode: no score display
43
+ expect(result).not.toContain('score:');
44
+ });
45
+ it('omits lesson section when no lessons', () => {
46
+ const context = { specs: [], sessions: [], lessons: [] };
47
+ const result = assemblePrompt('main', '', [], context, 'SYSTEM');
48
+ expect(result).not.toContain('RELEVANT LESSONS');
49
+ });
50
+ it('includes git state and PR info', () => {
51
+ const prs = [{ number: 42, title: 'Widget', headRefName: 'feat/widget' }];
52
+ const context = { specs: [], sessions: [], lessons: [] };
53
+ const result = assemblePrompt('feat/widget', 'M src/index.ts', prs, context, 'SYSTEM');
54
+ expect(result).toContain('Branch: feat/widget');
55
+ expect(result).toContain('#42');
56
+ });
57
+ });
26
58
  //# sourceMappingURL=briefing.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"briefing.test.js","sourceRoot":"","sources":["../../src/commands/briefing.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAyB;YAChC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE;SAChE,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,GAAG,GAAyB;YAChC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE;YACxD,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE;SAC3D,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"briefing.test.js","sourceRoot":"","sources":["../../src/commands/briefing.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AA2FA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsJ3E"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AA2FA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAwJ3E"}
@@ -80,14 +80,16 @@ export async function compileCommand(options) {
80
80
  const lessonsPath = path.join(totemDir, 'lessons.md');
81
81
  const rulesPath = path.join(totemDir, COMPILED_RULES_FILE);
82
82
  if (!fs.existsSync(lessonsPath)) {
83
- log.warn(TAG, 'No lessons.md found. Nothing to compile.');
84
- return;
83
+ const err = new Error('No lessons.md found. Nothing to compile.');
84
+ err.name = 'NoLessonsError';
85
+ throw err;
85
86
  }
86
87
  const content = fs.readFileSync(lessonsPath, 'utf-8');
87
88
  const lessons = parseLessonsFile(content);
88
89
  if (lessons.length === 0) {
89
- log.warn(TAG, 'No lessons found in lessons.md.');
90
- return;
90
+ const err = new Error('No lessons found in lessons.md.');
91
+ err.name = 'NoLessonsError';
92
+ throw err;
91
93
  }
92
94
  log.info(TAG, `Found ${lessons.length} lessons in lessons.md`);
93
95
  // ─── Phase 1: Regex compilation (requires orchestrator) ──
@@ -1 +1 @@
1
- {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import * as readline from 'node:readline/promises';
2
2
  import type { IngestTarget } from '@mmnto/totem';
3
+ export declare const REFLEX_VERSION = 2;
3
4
  export interface HookInstallerResult {
4
5
  file: string;
5
6
  action: 'created' | 'exists' | 'skipped' | 'merged';
@@ -42,6 +43,24 @@ export declare function detectEmbeddingTier(cwd: string): EmbeddingTier;
42
43
  * In non-TTY mode (CI), defaults to installing without prompting.
43
44
  */
44
45
  export declare function installBaselineLessons(lessonsPath: string, rl: readline.Interface): Promise<'installed' | 'exists' | 'skipped'>;
46
+ export type ReflexStatus = 'current' | 'outdated' | 'missing';
47
+ /** Detect whether the reflex block in a file is current, outdated, or missing. */
48
+ export declare function detectReflexStatus(content: string): ReflexStatus;
49
+ /**
50
+ * Upgrade a reflex block from legacy (v1, no boundaries) or older versioned
51
+ * blocks to the current version. Returns the updated file content.
52
+ *
53
+ * Strategy:
54
+ * - If start/end boundaries exist, replace between them (clean swap).
55
+ * - If only the legacy sentinel exists (v1), find the block start and
56
+ * look for the next user-owned `## ` heading or EOF as the boundary.
57
+ * - If the boundary can't be determined cleanly, append the new block
58
+ * and set `clean: false` so the caller can warn about manual cleanup.
59
+ */
60
+ export declare function upgradeReflexes(content: string): {
61
+ content: string;
62
+ clean: boolean;
63
+ };
45
64
  export declare function initCommand(): Promise<void>;
46
65
  export {};
47
66
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAInD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA2DjD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAInF;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAA0B,GACjC;IAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAqB5D;AAuID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACrD,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAuDA;AA8DD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC;IAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAoD5D;AAmFD,KAAK,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,aAAa,EAAE,aAAa,GAAG,MAAM,CAqC5F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAY9D;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,QAAQ,CAAC,SAAS,GACrB,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,CAwB7C;AAmBD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA8PjD"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAInD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAWjD,eAAO,MAAM,cAAc,IAAI,CAAC;AA+DhC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAInF;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAA0B,GACjC;IAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAqB5D;AAuID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACrD,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAuDA;AA8DD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC;IAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAoD5D;AA2FD,KAAK,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAElD,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,aAAa,EAAE,aAAa,GAAG,MAAM,CAqC5F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAY9D;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,QAAQ,CAAC,SAAS,GACrB,OAAO,CAAC,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC,CAwB7C;AAID,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE9D,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAchE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CA+BpF;AAgCD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAuTjD"}