@mmnto/cli 1.52.0 → 1.53.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 (40) hide show
  1. package/dist/adapters/github-cli-pr.d.ts.map +1 -1
  2. package/dist/adapters/github-cli-pr.js +3 -1
  3. package/dist/adapters/github-cli-pr.js.map +1 -1
  4. package/dist/adapters/github-cli-pr.test.js +4 -4
  5. package/dist/adapters/github-cli-pr.test.js.map +1 -1
  6. package/dist/adapters/github-cli-project.d.ts +21 -0
  7. package/dist/adapters/github-cli-project.d.ts.map +1 -0
  8. package/dist/adapters/github-cli-project.js +69 -0
  9. package/dist/adapters/github-cli-project.js.map +1 -0
  10. package/dist/adapters/github-cli.d.ts +7 -1
  11. package/dist/adapters/github-cli.d.ts.map +1 -1
  12. package/dist/adapters/github-cli.js +30 -0
  13. package/dist/adapters/github-cli.js.map +1 -1
  14. package/dist/adapters/github-cli.test.js +26 -0
  15. package/dist/adapters/github-cli.test.js.map +1 -1
  16. package/dist/adapters/issue-adapter.d.ts +18 -0
  17. package/dist/adapters/issue-adapter.d.ts.map +1 -1
  18. package/dist/adapters/pr-adapter.d.ts +2 -0
  19. package/dist/adapters/pr-adapter.d.ts.map +1 -1
  20. package/dist/commands/orient-coherence.d.ts +33 -0
  21. package/dist/commands/orient-coherence.d.ts.map +1 -0
  22. package/dist/commands/orient-coherence.js +64 -0
  23. package/dist/commands/orient-coherence.js.map +1 -0
  24. package/dist/commands/orient-coherence.test.d.ts +2 -0
  25. package/dist/commands/orient-coherence.test.d.ts.map +1 -0
  26. package/dist/commands/orient-coherence.test.js +99 -0
  27. package/dist/commands/orient-coherence.test.js.map +1 -0
  28. package/dist/commands/orient.d.ts +97 -0
  29. package/dist/commands/orient.d.ts.map +1 -0
  30. package/dist/commands/orient.js +530 -0
  31. package/dist/commands/orient.js.map +1 -0
  32. package/dist/commands/orient.test.d.ts +2 -0
  33. package/dist/commands/orient.test.d.ts.map +1 -0
  34. package/dist/commands/orient.test.js +457 -0
  35. package/dist/commands/orient.test.js.map +1 -0
  36. package/dist/help.js +1 -1
  37. package/dist/help.js.map +1 -1
  38. package/dist/index.js +16 -0
  39. package/dist/index.js.map +1 -1
  40. package/package.json +2 -2
@@ -0,0 +1,530 @@
1
+ // `totem orient` — derive session orientation from primitives (mmnto-ai/totem#2044, WS2).
2
+ //
3
+ // A DETERMINISTIC sensor (zero LLM, zero embedding): it derives "what's parked /
4
+ // in flight / open" from live `gh` / `git` / fs primitives — open PRs, open
5
+ // issues (with epic→child grouping), the GH Project board (in-flight only),
6
+ // `.totem/freeze.json`, and an index-freshness pointer — plus one new derived
7
+ // signal: a board↔issue coherence flag. Sibling to `totem triage` (LLM synthesis
8
+ // on top); they compose, not duplicate.
9
+ //
10
+ // Discipline (ported from the strategy seed tools/orient.cjs):
11
+ // - Fail loud, never drift (Tenet 4): an underivable section is an explicit
12
+ // `⚠ could not derive` line / `{ error }` envelope — NEVER a silent empty.
13
+ // - Honest absence (Tenet 14): "not yet synced" / "no board configured" are
14
+ // explicit states, not errors and not blanks.
15
+ // - Snapshot, not source (Tenet 20): every run re-derives; the output is a cache.
16
+ // - NO embedding/LanceDB path — this is what makes orient run green when
17
+ // `@google/genai` is absent (it structurally dodges #2018).
18
+ import { flagBoardIssueDrift, isActiveBoardItem } from './orient-coherence.js';
19
+ // ─── Tunables ───────────────────────────────────────────
20
+ const ISSUE_LIMIT = 200;
21
+ const EPIC_LABEL = 'type: epic';
22
+ // Hide ai-workflow noise from the OTHER-issues label badges (matches the seed).
23
+ const NOISE_LABELS = new Set(['ai-workflow']);
24
+ // A registry entry older than this prints a [STALE] hint (matches `totem list`).
25
+ const STALE_MS = 30 * 24 * 60 * 60 * 1000;
26
+ // Matches "**Parent:** #N" AND fully-qualified "**Parent:** owner/repo#N".
27
+ // Group 1 captures the optional owner/repo prefix; group 2 the number. Only
28
+ // LOCAL parents (no prefix, or prefix == this repo's slug) attach children, so
29
+ // a cross-repo ref can't collide with a same-numbered LOCAL epic.
30
+ const PARENT_RE = /\*\*Parent:\*\*\s*([A-Za-z0-9._/-]+)?#(\d+)/;
31
+ // Validate the env-sourced project number so it can only ever be digits.
32
+ const PROJECT_NUMBER_RE = /^\d+$/;
33
+ function isError(s) {
34
+ return typeof s === 'object' && s !== null && 'error' in s;
35
+ }
36
+ function errMessage(err) {
37
+ return err instanceof Error ? err.message : String(err);
38
+ }
39
+ // ─── Per-section derivations (each fails in isolation) ──
40
+ const GH_TIMEOUT_MS = 20_000;
41
+ /**
42
+ * Derive `{ owner, name }` for the current repo via `gh repo view`.
43
+ *
44
+ * Uses `safeExec` (an `execFileSync` wrapper with an argument array — no shell),
45
+ * matching the codebase convention; static args only, so there is no injection
46
+ * surface. Returns `{ error }` on failure (Tenet 4 — never a silent empty).
47
+ */
48
+ async function deriveRepoSlug(cwd) {
49
+ try {
50
+ const { safeExec } = await import('@mmnto/totem');
51
+ const raw = safeExec('gh', ['repo', 'view', '--json', 'owner,name'], {
52
+ cwd,
53
+ timeout: GH_TIMEOUT_MS,
54
+ env: { ...process.env, GH_PROMPT_DISABLED: '1' },
55
+ });
56
+ const parsed = JSON.parse(raw);
57
+ if (!parsed.owner?.login || !parsed.name) {
58
+ return { error: 'unexpected `gh repo view` shape' };
59
+ }
60
+ return { slug: { owner: parsed.owner.login, name: parsed.name } };
61
+ // totem-context: a gh failure becomes a fail-loud { error } envelope (Tenet 4 — surfaced in the report, not swallowed); every other section still derives independently
62
+ }
63
+ catch (err) {
64
+ return { error: errMessage(err) || 'gh repo view failed' };
65
+ }
66
+ }
67
+ async function deriveParked(repoRoot) {
68
+ try {
69
+ const { readFreezeConfig } = await import('@mmnto/totem');
70
+ const path = await import('node:path');
71
+ const totemDir = path.join(repoRoot, '.totem');
72
+ const config = readFreezeConfig(totemDir);
73
+ if (!config)
74
+ return [];
75
+ return config.frozen.map((f) => ({
76
+ subsystem: f.subsystem,
77
+ since: f.since,
78
+ reason: f.reason,
79
+ tracking: f.tracking,
80
+ }));
81
+ // totem-context: a freeze-read failure becomes a fail-loud { error } envelope (Tenet 4 — surfaced, not swallowed)
82
+ }
83
+ catch (err) {
84
+ return { error: errMessage(err) };
85
+ }
86
+ }
87
+ async function derivePRs(cwd) {
88
+ try {
89
+ const { GitHubCliPrAdapter } = await import('../adapters/github-cli-pr.js');
90
+ const adapter = new GitHubCliPrAdapter(cwd);
91
+ const prs = adapter.fetchOpenPRs();
92
+ return prs.map((p) => ({
93
+ number: p.number,
94
+ title: p.title,
95
+ headRefName: p.headRefName,
96
+ isDraft: p.isDraft,
97
+ }));
98
+ // totem-context: a gh PR-list failure becomes a fail-loud { error } envelope (Tenet 4 — surfaced, not swallowed)
99
+ }
100
+ catch (err) {
101
+ return { error: errMessage(err) };
102
+ }
103
+ }
104
+ async function deriveIssues(cwd, localSlug) {
105
+ let all;
106
+ try {
107
+ const { GitHubCliAdapter } = await import('../adapters/github-cli.js');
108
+ const adapter = new GitHubCliAdapter(cwd);
109
+ all = adapter.fetchOpenIssuesWithBody(ISSUE_LIMIT);
110
+ // totem-context: a gh issue-list failure becomes a fail-loud { error } envelope (Tenet 4 — surfaced, not swallowed)
111
+ }
112
+ catch (err) {
113
+ return { error: errMessage(err) };
114
+ }
115
+ const openNumbers = new Set(all.map((i) => i.number));
116
+ // Build parent# → [child] from primitives (LOCAL parent refs only).
117
+ const childOf = new Map();
118
+ for (const it of all) {
119
+ const m = (it.body || '').match(PARENT_RE);
120
+ // Case-folded compare: GitHub owner/repo slugs are case-insensitive, so a
121
+ // casing skew must not stop a child attaching to its LOCAL parent epic.
122
+ if (m && (!m[1] || (localSlug && m[1].toLowerCase() === localSlug.toLowerCase()))) {
123
+ const parent = Number(m[2]);
124
+ const list = childOf.get(parent) ?? [];
125
+ list.push(it);
126
+ childOf.set(parent, list);
127
+ }
128
+ }
129
+ const isEpic = (it) => it.labels.includes(EPIC_LABEL);
130
+ const epicIssues = all.filter(isEpic);
131
+ const epicNums = new Set(epicIssues.map((e) => e.number));
132
+ // A child is "covered" (omitted from OTHER) ONLY if its parent is a rendered
133
+ // epic; a child whose parent isn't an epic stays in OTHER so it is never dropped.
134
+ const coveredChildNums = new Set();
135
+ for (const [parent, kids] of childOf) {
136
+ if (epicNums.has(parent))
137
+ kids.forEach((k) => coveredChildNums.add(k.number));
138
+ }
139
+ const epics = epicIssues.map((e) => ({
140
+ number: e.number,
141
+ title: e.title,
142
+ labels: e.labels,
143
+ subIssues: (childOf.get(e.number) ?? []).map((c) => ({ number: c.number, title: c.title })),
144
+ }));
145
+ const others = all
146
+ .filter((it) => !isEpic(it) && !coveredChildNums.has(it.number))
147
+ .map((i) => ({ number: i.number, title: i.title, labels: i.labels }));
148
+ return { epics, others, openNumbers };
149
+ }
150
+ /**
151
+ * Resolve the project number (consumer-safety, Q5): config `orient.projectNumber`
152
+ * → env `TOTEM_ORIENT_PROJECT` (last override). No project configured ⇒ honest
153
+ * absence (`unconfigured`). A set-but-non-numeric env var is `invalid` — surfaced
154
+ * loudly by the caller, NOT masqueraded as "no board configured" (Tenet 4).
155
+ */
156
+ async function resolveProjectNumber(cwd) {
157
+ const env = process.env['TOTEM_ORIENT_PROJECT'];
158
+ if (env !== undefined && env !== '') {
159
+ // Explicitly-set-but-malformed ⇒ LOUD: a user who set it expects a board, so
160
+ // don't degrade to silent "unconfigured" (the exact Tenet-4 drift greptile flagged).
161
+ if (!PROJECT_NUMBER_RE.test(env))
162
+ return { kind: 'invalid', raw: env };
163
+ return { kind: 'resolved', projectNumber: Number(env) };
164
+ }
165
+ // Optional config: orient must work even with NO totem.config.ts at all.
166
+ try {
167
+ const { loadConfig, resolveConfigPath } = await import('../utils.js');
168
+ const configPath = resolveConfigPath(cwd);
169
+ const config = await loadConfig(configPath);
170
+ const projectNumber = config.orient?.projectNumber;
171
+ return projectNumber === undefined
172
+ ? { kind: 'unconfigured' }
173
+ : { kind: 'resolved', projectNumber };
174
+ // totem-context: intentional — a missing/unreadable totem.config.ts is honest board-absence (Tenet 14), not an orient failure
175
+ }
176
+ catch {
177
+ // No config / unreadable config is not an orient failure — board absence
178
+ // is the honest state. (resolveConfigPath throws when no config exists.)
179
+ return { kind: 'unconfigured' };
180
+ }
181
+ }
182
+ async function deriveBoard(cwd, owner) {
183
+ const resolution = await resolveProjectNumber(cwd);
184
+ if (resolution.kind === 'unconfigured') {
185
+ return { section: [], items: null, configured: false };
186
+ }
187
+ if (resolution.kind === 'invalid') {
188
+ // Fail loud (Tenet 4): a set-but-malformed TOTEM_ORIENT_PROJECT is an { error }
189
+ // board section + configured:true, NOT a silent "no board configured" absence.
190
+ return {
191
+ section: {
192
+ error: `TOTEM_ORIENT_PROJECT="${resolution.raw}" is not a positive integer (board not derived)`,
193
+ },
194
+ items: null,
195
+ configured: true,
196
+ };
197
+ }
198
+ const { projectNumber } = resolution;
199
+ if (owner === null) {
200
+ return {
201
+ section: { error: 'board configured but repo owner could not be derived (gh repo view)' },
202
+ items: null,
203
+ configured: true,
204
+ };
205
+ }
206
+ try {
207
+ const { fetchBoardItems } = await import('../adapters/github-cli-project.js');
208
+ const items = fetchBoardItems(owner, projectNumber, cwd);
209
+ const active = items.filter(isActiveBoardItem).map((i) => ({
210
+ status: i.status || 'Todo',
211
+ title: i.title,
212
+ contentNumber: i.contentNumber,
213
+ }));
214
+ return { section: active, items, configured: true };
215
+ // totem-context: a gh board-fetch failure becomes a fail-loud { error } section envelope (Tenet 4 — surfaced, not swallowed)
216
+ }
217
+ catch (err) {
218
+ return { section: { error: errMessage(err) }, items: null, configured: true };
219
+ }
220
+ }
221
+ /**
222
+ * Derive the index-freshness pointer INLINE from the registry `lastSync` for the
223
+ * current repo root (Q1: no `@mmnto/cli`→`@mmnto/mcp` dependency). No registry
224
+ * entry ⇒ honest "not yet synced" absence.
225
+ */
226
+ async function deriveIndexFreshness(repoRoot) {
227
+ try {
228
+ const { readRegistry } = await import('@mmnto/totem');
229
+ const { formatRelativeTime } = await import('./list.js');
230
+ const path = await import('node:path');
231
+ const registry = readRegistry();
232
+ const normalizedRoot = path.normalize(repoRoot);
233
+ const entry = Object.values(registry).find((e) => path.normalize(e.path) === normalizedRoot);
234
+ if (!entry)
235
+ return { synced: false };
236
+ const age = Date.now() - new Date(entry.lastSync).getTime();
237
+ return { synced: true, lastSync: formatRelativeTime(age), stale: age > STALE_MS };
238
+ // totem-context: intentional — an unreadable registry is honest "not synced" absence (Tenet 14) for a regenerable-cache pointer, not an orient failure
239
+ }
240
+ catch {
241
+ // Registry unreadable → treat as not-synced honest absence, not an error
242
+ // (it's a regenerable cache pointer, never load-bearing for orientation).
243
+ return { synced: false };
244
+ }
245
+ }
246
+ // ─── Orchestration ──────────────────────────────────────
247
+ async function derive(cwd) {
248
+ const { resolveGitRoot } = await import('@mmnto/totem');
249
+ const repoRoot = resolveGitRoot(cwd) ?? cwd;
250
+ const slugResult = await deriveRepoSlug(cwd);
251
+ const repo = isError(slugResult)
252
+ ? { error: slugResult.error }
253
+ : `${slugResult.slug.owner}/${slugResult.slug.name}`;
254
+ const localSlug = isError(slugResult) ? null : `${slugResult.slug.owner}/${slugResult.slug.name}`;
255
+ const owner = isError(slugResult) ? null : slugResult.slug.owner;
256
+ const [indexFreshness, parked, openPRs, issues, board] = await Promise.all([
257
+ deriveIndexFreshness(repoRoot),
258
+ deriveParked(repoRoot),
259
+ derivePRs(cwd),
260
+ deriveIssues(cwd, localSlug),
261
+ deriveBoard(cwd, owner),
262
+ ]);
263
+ return {
264
+ repo,
265
+ localSlug,
266
+ indexFreshness,
267
+ parked,
268
+ openPRs,
269
+ board: board.section,
270
+ boardItems: board.items,
271
+ issues,
272
+ boardConfigured: board.configured,
273
+ };
274
+ }
275
+ /** Coherence flags derive purely from the board + open-issue primitives (no extra gh call). */
276
+ function deriveCoherence(state) {
277
+ if (isError(state.board))
278
+ return { error: state.board.error };
279
+ if (isError(state.issues))
280
+ return { error: state.issues.error };
281
+ if (state.boardItems === null)
282
+ return [];
283
+ return flagBoardIssueDrift(state.boardItems, state.issues.openNumbers, state.localSlug);
284
+ }
285
+ function toReport(state) {
286
+ const coherence = deriveCoherence(state);
287
+ return {
288
+ repo: state.repo,
289
+ derivedAt: new Date().toISOString(),
290
+ indexFreshness: state.indexFreshness,
291
+ parked: state.parked,
292
+ openPRs: state.openPRs,
293
+ board: state.board,
294
+ coherence,
295
+ epics: isError(state.issues) ? { error: state.issues.error } : state.issues.epics,
296
+ otherOpenIssues: isError(state.issues) ? { error: state.issues.error } : state.issues.others,
297
+ boardConfigured: state.boardConfigured,
298
+ };
299
+ }
300
+ /**
301
+ * Programmatic entry: derive the full `OrientReport` for `cwd` WITHOUT writing
302
+ * stdout. Identical report to `orient --json` (one derivation, two callers —
303
+ * cannot diverge). Reused by `orientCommand` (the CLI surface) and the
304
+ * SessionStart hook (`.claude/hooks/session-context.mjs`, mmnto-ai/totem#2044
305
+ * PR-2), which dynamic-imports this from `packages/cli/dist/commands/orient.js`
306
+ * — the workspace-dist pattern, deliberately NOT the global `totem` binary
307
+ * (sidesteps the stale-resolve trap mmnto-ai/totem#2053).
308
+ *
309
+ * Latency note: orient's gh adapters are synchronous (`safeExec`/execFileSync),
310
+ * so this runs ~4 sequential blocking gh calls (repo view + PRs + issues + board),
311
+ * each bounded by the adapter's per-call timeout. Callers on a latency-sensitive
312
+ * path (the hook) wrap it best-effort and degrade on failure.
313
+ */
314
+ export async function deriveOrientReport(cwd) {
315
+ const state = await derive(cwd);
316
+ return toReport(state);
317
+ }
318
+ // ─── Human render ───────────────────────────────────────
319
+ const FOOTER = [
320
+ '— end orient. State derives from the primitives above (Tenet 20); this output is a',
321
+ ' snapshot/cache, not a source. Deeper judgment is perceptual: ask the human; no',
322
+ ' deeper/fleet pass needed unless you are doing an audit (a different task).',
323
+ ].join('\n');
324
+ function renderFreshness(f) {
325
+ if (!f.synced)
326
+ return ' freshness unknown — not yet synced (run `totem sync`)';
327
+ return ' index synced ' + f.lastSync + (f.stale ? ' [STALE]' : '');
328
+ }
329
+ export function renderReport(report) {
330
+ const out = [];
331
+ const repo = isError(report.repo) ? `(repo undetermined: ${report.repo.error})` : report.repo;
332
+ out.push(`═══ totem orient — ${repo} ═══ derived ${report.derivedAt}`);
333
+ out.push(' (derived from primitives — open PRs / open issues / GH Project board / .totem/freeze.json)');
334
+ // PARKED
335
+ out.push('\n⛔ PARKED / FROZEN (.totem/freeze.json)');
336
+ if (isError(report.parked))
337
+ out.push(` ⚠ could not derive: ${report.parked.error}`);
338
+ else if (report.parked.length === 0)
339
+ out.push(' none');
340
+ else
341
+ for (const f of report.parked) {
342
+ const reason = (f.reason || '').split('. ')[0];
343
+ out.push(` • ${f.subsystem} (since ${f.since || '?'})${reason ? ` — ${reason}` : ''}`);
344
+ if (f.tracking)
345
+ out.push(` tracking: ${f.tracking}`);
346
+ }
347
+ // OPEN PRs
348
+ out.push('\n◐ OPEN PRs');
349
+ if (isError(report.openPRs))
350
+ out.push(` ⚠ could not derive: ${report.openPRs.error}`);
351
+ else if (report.openPRs.length === 0)
352
+ out.push(' none');
353
+ else
354
+ for (const p of report.openPRs) {
355
+ const head = `#${p.number}` + (p.isDraft ? ' [draft]' : '');
356
+ out.push(` ${head} ${p.title} (${p.headRefName})`);
357
+ }
358
+ // BOARD in-flight
359
+ out.push('\n▣ BOARD in-flight (active statuses only)');
360
+ if (isError(report.board))
361
+ out.push(` ⚠ could not derive: ${report.board.error}`);
362
+ else if (!report.boardConfigured)
363
+ out.push(' no board configured (set orient.projectNumber in totem.config.ts)');
364
+ else if (report.board.length === 0)
365
+ out.push(' none (no items in an active status)');
366
+ else
367
+ for (const i of report.board) {
368
+ const num = i.contentNumber ? `#${i.contentNumber} ` : '';
369
+ out.push(` [${i.status}] ${num}` + i.title);
370
+ }
371
+ // BOARD↔ISSUE COHERENCE (the new derived signal)
372
+ out.push('\n⚖ BOARD↔ISSUE COHERENCE (active card whose issue is closed/absent = drift)');
373
+ if (isError(report.coherence))
374
+ out.push(` ⚠ could not derive: ${report.coherence.error}`);
375
+ else if (report.coherence.length === 0)
376
+ out.push(' none (board and open issues are coherent)');
377
+ else
378
+ for (const c of report.coherence) {
379
+ out.push(` ⚠ [${c.boardStatus}] "${c.boardItemTitle}" → issue #${c.issueNumber} is closed/absent`);
380
+ }
381
+ // EPICS + children
382
+ out.push('\n✦ EPICS + sub-issues (label "type: epic"; children via body Parent ref)');
383
+ if (isError(report.epics))
384
+ out.push(` ⚠ could not derive: ${report.epics.error}`);
385
+ else if (report.epics.length === 0)
386
+ out.push(' none');
387
+ else
388
+ for (const e of report.epics) {
389
+ out.push(` #${e.number} ${e.title}`);
390
+ if (e.subIssues.length === 0)
391
+ out.push(' (no tracked sub-issues)');
392
+ else
393
+ e.subIssues.forEach((c, idx) => out.push(` ${idx === e.subIssues.length - 1 ? '└' : '├'} #${c.number} ${c.title}`));
394
+ }
395
+ // OTHER open issues
396
+ out.push('\n● OTHER open issues (non-epic, non-child)');
397
+ if (isError(report.otherOpenIssues))
398
+ out.push(` ⚠ could not derive: ${report.otherOpenIssues.error}`);
399
+ else if (report.otherOpenIssues.length === 0)
400
+ out.push(' none');
401
+ else
402
+ for (const i of report.otherOpenIssues) {
403
+ const labels = i.labels.filter((l) => !NOISE_LABELS.has(l));
404
+ const labelTag = labels.length ? ` [${labels.join(', ')}]` : '';
405
+ out.push(` #${i.number} ${i.title}` + labelTag);
406
+ }
407
+ // INDEX FRESHNESS pointer (honest absence when never synced)
408
+ out.push('\n⟳ INDEX FRESHNESS (registry lastSync for this repo)');
409
+ out.push(renderFreshness(report.indexFreshness));
410
+ out.push('');
411
+ out.push(FOOTER);
412
+ return out.join('\n');
413
+ }
414
+ // ─── Session-start projection (the auto-injected Tier-A block) ──
415
+ // Bounds for the session-start orient block (mmnto-ai/totem#2044 PR-2).
416
+ // Binding guardrail (strategy charter 2026-06-01T0229Z, mmnto-ai/totem-strategy#467):
417
+ // the block must be HARD-BOUNDED so it can never displace high-value session
418
+ // content (journal carryforward, parked, inbound mail) past the hook's
419
+ // MAX_TOTAL_CHARS cap — favorable ordering alone is insufficient, a runaway block
420
+ // would itself crowd out high-value content. Net-neutral-or-positive on
421
+ // high-value-content truncation; truncation absorbs the low-value vector tail.
422
+ const SESSION_BLOCK_MAX_CHARS = 1500;
423
+ const SESSION_PARKED_CAP = 8;
424
+ const SESSION_PR_CAP = 10;
425
+ const SESSION_COHERENCE_CAP = 10;
426
+ /**
427
+ * Compact projection of an `OrientReport` for auto-injection at session start.
428
+ *
429
+ * Emits ONLY high-signal state — parked/frozen subsystems, open PRs, and board↔
430
+ * issue coherence drift — plus a one-line COUNTS pointer for epics/other-issues
431
+ * (NOT the full enumeration: "pointers not bodies", mmnto-ai/totem-strategy#467
432
+ * Tier-A discipline). An underivable section stays a `⚠ could not derive` line
433
+ * (Tenet 4 — never a silent omit), so the projection inherits orient's fail-loud
434
+ * contract. Hard-bounded by `SESSION_BLOCK_MAX_CHARS` (the guardrail above).
435
+ *
436
+ * Returns '' when there is nothing high-signal to surface (no parked, no PRs, no
437
+ * drift, no derivable counts) so the hook can omit the block entirely rather than
438
+ * inject an empty header.
439
+ */
440
+ export function renderOrientForSession(report) {
441
+ const out = [];
442
+ const repo = isError(report.repo) ? '(repo undetermined)' : report.repo;
443
+ out.push(`── orient (derived state): ${repo} ──`);
444
+ const headerLen = out.length;
445
+ // PARKED / FROZEN — you must not touch these subsystems (high value).
446
+ if (isError(report.parked)) {
447
+ out.push(`⛔ parked: ⚠ could not derive: ${report.parked.error}`);
448
+ }
449
+ else if (report.parked.length > 0) {
450
+ const shown = report.parked.slice(0, SESSION_PARKED_CAP).map((f) => f.subsystem);
451
+ const more = report.parked.length > SESSION_PARKED_CAP ? ' …' : '';
452
+ out.push(`⛔ parked/frozen (${report.parked.length}): ${shown.join(', ')}` + more);
453
+ }
454
+ // OPEN PRs — what's in flight.
455
+ if (isError(report.openPRs)) {
456
+ out.push(`◐ open PRs: ⚠ could not derive: ${report.openPRs.error}`);
457
+ }
458
+ else if (report.openPRs.length > 0) {
459
+ for (const p of report.openPRs.slice(0, SESSION_PR_CAP)) {
460
+ const draft = p.isDraft ? ' [draft]' : '';
461
+ out.push(`◐ PR #${p.number}` + draft + ` ${p.title} (${p.headRefName})`);
462
+ }
463
+ if (report.openPRs.length > SESSION_PR_CAP) {
464
+ out.push(` … and ${report.openPRs.length - SESSION_PR_CAP} more open PRs`);
465
+ }
466
+ }
467
+ // BOARD↔ISSUE COHERENCE drift — the anomaly signal (active card, issue closed/absent).
468
+ if (isError(report.coherence)) {
469
+ out.push(`⚖ coherence: ⚠ could not derive: ${report.coherence.error}`);
470
+ }
471
+ else if (report.coherence.length > 0) {
472
+ for (const c of report.coherence.slice(0, SESSION_COHERENCE_CAP)) {
473
+ out.push(`⚖ drift: [${c.boardStatus}] "${c.boardItemTitle}" → #${c.issueNumber} closed/absent`);
474
+ }
475
+ if (report.coherence.length > SESSION_COHERENCE_CAP) {
476
+ out.push(` … and ${report.coherence.length - SESSION_COHERENCE_CAP} more drift flags`);
477
+ }
478
+ }
479
+ // COUNTS pointer — NOT the enumeration (Tier-A lean: the agent runs `totem
480
+ // orient` on demand for the full epic/issue board). One fail-loud line if the
481
+ // issue derivation failed — epics + otherOpenIssues share `deriveIssues`, so
482
+ // they error together with the same message; surface it once, never drop it
483
+ // silently (Tenet 4). A zero count emits nothing (no "0 epics" noise).
484
+ if (isError(report.epics)) {
485
+ out.push(`● issues: ⚠ could not derive: ${report.epics.error}`);
486
+ }
487
+ else {
488
+ // `epics` and `otherOpenIssues` share `deriveIssues`, so `toReport` errors
489
+ // them together today — but the type (`Section<...>`) permits an independent
490
+ // split. Surface an errored `otherOpenIssues` explicitly rather than silently
491
+ // coercing its count to 0 (Tenet 4 — never a silent omit, even type-only).
492
+ if (isError(report.otherOpenIssues)) {
493
+ out.push(`● other open issues: ⚠ could not derive: ${report.otherOpenIssues.error}`);
494
+ }
495
+ const epicCount = report.epics.length;
496
+ const otherCount = isError(report.otherOpenIssues) ? 0 : report.otherOpenIssues.length;
497
+ const parts = [];
498
+ if (epicCount > 0)
499
+ parts.push(`${epicCount} epic${epicCount === 1 ? '' : 's'}`);
500
+ if (otherCount > 0) {
501
+ parts.push(`${otherCount} other open issue${otherCount === 1 ? '' : 's'}`);
502
+ }
503
+ if (parts.length > 0) {
504
+ out.push(`● ${parts.join(' · ')} — run \`totem orient\` for the full board`);
505
+ }
506
+ }
507
+ // Nothing high-signal beyond the header ⇒ let the hook omit the block.
508
+ if (out.length === headerLen)
509
+ return '';
510
+ const block = out.join('\n');
511
+ return block.length > SESSION_BLOCK_MAX_CHARS
512
+ ? block.slice(0, SESSION_BLOCK_MAX_CHARS) + '\n …(orient block truncated)'
513
+ : block;
514
+ }
515
+ // ─── Command entry ──────────────────────────────────────
516
+ export async function orientCommand(opts) {
517
+ // Honor the subcommand flag AND the root program's global `--json` (commander
518
+ // routes a leading `--json` to the root option; the root sets this env). Same
519
+ // dual-source pattern other JSON-emitting commands use.
520
+ const { isJsonMode } = await import('../json-output.js');
521
+ const json = opts.json === true || isJsonMode();
522
+ const cwd = process.cwd();
523
+ const report = await deriveOrientReport(cwd);
524
+ if (json) {
525
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
526
+ return;
527
+ }
528
+ process.stdout.write(renderReport(report) + '\n');
529
+ }
530
+ //# sourceMappingURL=orient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orient.js","sourceRoot":"","sources":["../../src/commands/orient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=orient.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orient.test.d.ts","sourceRoot":"","sources":["../../src/commands/orient.test.ts"],"names":[],"mappings":""}