@mmnto/cli 1.51.0 → 1.53.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 (67) 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/eject.d.ts.map +1 -1
  21. package/dist/commands/eject.js +12 -4
  22. package/dist/commands/eject.js.map +1 -1
  23. package/dist/commands/gate-install.d.ts +59 -0
  24. package/dist/commands/gate-install.d.ts.map +1 -0
  25. package/dist/commands/gate-install.js +111 -0
  26. package/dist/commands/gate-install.js.map +1 -0
  27. package/dist/commands/gate-install.test.d.ts +2 -0
  28. package/dist/commands/gate-install.test.d.ts.map +1 -0
  29. package/dist/commands/gate-install.test.js +472 -0
  30. package/dist/commands/gate-install.test.js.map +1 -0
  31. package/dist/commands/gate.d.ts +31 -0
  32. package/dist/commands/gate.d.ts.map +1 -1
  33. package/dist/commands/gate.js +70 -0
  34. package/dist/commands/gate.js.map +1 -1
  35. package/dist/commands/host-hooks.d.ts +745 -0
  36. package/dist/commands/host-hooks.d.ts.map +1 -0
  37. package/dist/commands/host-hooks.js +229 -0
  38. package/dist/commands/host-hooks.js.map +1 -0
  39. package/dist/commands/init-templates.d.ts +8 -0
  40. package/dist/commands/init-templates.d.ts.map +1 -1
  41. package/dist/commands/init-templates.js +240 -0
  42. package/dist/commands/init-templates.js.map +1 -1
  43. package/dist/commands/init.d.ts +6 -4
  44. package/dist/commands/init.d.ts.map +1 -1
  45. package/dist/commands/init.js +81 -94
  46. package/dist/commands/init.js.map +1 -1
  47. package/dist/commands/orient-coherence.d.ts +33 -0
  48. package/dist/commands/orient-coherence.d.ts.map +1 -0
  49. package/dist/commands/orient-coherence.js +64 -0
  50. package/dist/commands/orient-coherence.js.map +1 -0
  51. package/dist/commands/orient-coherence.test.d.ts +2 -0
  52. package/dist/commands/orient-coherence.test.d.ts.map +1 -0
  53. package/dist/commands/orient-coherence.test.js +99 -0
  54. package/dist/commands/orient-coherence.test.js.map +1 -0
  55. package/dist/commands/orient.d.ts +67 -0
  56. package/dist/commands/orient.d.ts.map +1 -0
  57. package/dist/commands/orient.js +412 -0
  58. package/dist/commands/orient.js.map +1 -0
  59. package/dist/commands/orient.test.d.ts +2 -0
  60. package/dist/commands/orient.test.d.ts.map +1 -0
  61. package/dist/commands/orient.test.js +329 -0
  62. package/dist/commands/orient.test.js.map +1 -0
  63. package/dist/help.js +1 -1
  64. package/dist/help.js.map +1 -1
  65. package/dist/index.js +35 -0
  66. package/dist/index.js.map +1 -1
  67. package/package.json +2 -2
@@ -0,0 +1,67 @@
1
+ import type { BoardIssueCoherenceFlag } from './orient-coherence.js';
2
+ /** The `{ error }` envelope for an underivable section. The `error` key is the
3
+ * external JSON-API field name (same convention as `json-output.ts`). */
4
+ interface ErrorEnvelope {
5
+ error: string;
6
+ }
7
+ /** A section is EITHER its derived value OR an `{ error }` envelope — never silently omitted. */
8
+ type Section<T> = T | ErrorEnvelope;
9
+ export interface OrientParkedEntry {
10
+ subsystem: string;
11
+ since?: string;
12
+ reason?: string;
13
+ tracking?: string;
14
+ }
15
+ export interface OrientPr {
16
+ number: number;
17
+ title: string;
18
+ headRefName: string;
19
+ isDraft: boolean;
20
+ }
21
+ export interface OrientBoardItem {
22
+ status: string;
23
+ title: string;
24
+ contentNumber?: number;
25
+ }
26
+ export interface OrientEpic {
27
+ number: number;
28
+ title: string;
29
+ labels: string[];
30
+ subIssues: {
31
+ number: number;
32
+ title: string;
33
+ }[];
34
+ }
35
+ export interface OrientOtherIssue {
36
+ number: number;
37
+ title: string;
38
+ labels: string[];
39
+ }
40
+ /** Index-freshness pointer — either a derived staleness fact or an honest "not synced" absence. */
41
+ export interface OrientIndexFreshness {
42
+ synced: boolean;
43
+ /** Relative age of the registry `lastSync` (e.g. '2h ago'), when synced. */
44
+ lastSync?: string;
45
+ stale?: boolean;
46
+ }
47
+ export interface OrientReport {
48
+ repo: Section<string>;
49
+ derivedAt: string;
50
+ indexFreshness: OrientIndexFreshness;
51
+ parked: Section<OrientParkedEntry[]>;
52
+ openPRs: Section<OrientPr[]>;
53
+ board: Section<OrientBoardItem[]>;
54
+ coherence: Section<BoardIssueCoherenceFlag[]>;
55
+ epics: Section<OrientEpic[]>;
56
+ otherOpenIssues: Section<OrientOtherIssue[]>;
57
+ /** Whether a board project number is configured. Distinguishes the JSON's
58
+ * "no board configured" (false) from "board configured but empty" (true,
59
+ * `board: []`) — without it the two collapse to the same shape (Tenet 14). */
60
+ boardConfigured: boolean;
61
+ }
62
+ export declare function renderReport(report: OrientReport): string;
63
+ export declare function orientCommand(opts: {
64
+ json?: boolean;
65
+ }): Promise<void>;
66
+ export {};
67
+ //# sourceMappingURL=orient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orient.d.ts","sourceRoot":"","sources":["../../src/commands/orient.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAqBrE;0EAC0E;AAC1E,UAAU,aAAa;IAErB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,iGAAiG;AACjG,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,mGAAmG;AACnG,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,oBAAoB,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC9C,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC7C;;mFAE+E;IAC/E,eAAe,EAAE,OAAO,CAAC;CAC1B;AA+UD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAqFzD;AAID,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3E"}
@@ -0,0 +1,412 @@
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
+ // ─── Human render ───────────────────────────────────────
301
+ const FOOTER = [
302
+ '— end orient. State derives from the primitives above (Tenet 20); this output is a',
303
+ ' snapshot/cache, not a source. Deeper judgment is perceptual: ask the human; no',
304
+ ' deeper/fleet pass needed unless you are doing an audit (a different task).',
305
+ ].join('\n');
306
+ function renderFreshness(f) {
307
+ if (!f.synced)
308
+ return ' freshness unknown — not yet synced (run `totem sync`)';
309
+ return ' index synced ' + f.lastSync + (f.stale ? ' [STALE]' : '');
310
+ }
311
+ export function renderReport(report) {
312
+ const out = [];
313
+ const repo = isError(report.repo) ? `(repo undetermined: ${report.repo.error})` : report.repo;
314
+ out.push(`═══ totem orient — ${repo} ═══ derived ${report.derivedAt}`);
315
+ out.push(' (derived from primitives — open PRs / open issues / GH Project board / .totem/freeze.json)');
316
+ // PARKED
317
+ out.push('\n⛔ PARKED / FROZEN (.totem/freeze.json)');
318
+ if (isError(report.parked))
319
+ out.push(` ⚠ could not derive: ${report.parked.error}`);
320
+ else if (report.parked.length === 0)
321
+ out.push(' none');
322
+ else
323
+ for (const f of report.parked) {
324
+ const reason = (f.reason || '').split('. ')[0];
325
+ out.push(` • ${f.subsystem} (since ${f.since || '?'})${reason ? ` — ${reason}` : ''}`);
326
+ if (f.tracking)
327
+ out.push(` tracking: ${f.tracking}`);
328
+ }
329
+ // OPEN PRs
330
+ out.push('\n◐ OPEN PRs');
331
+ if (isError(report.openPRs))
332
+ out.push(` ⚠ could not derive: ${report.openPRs.error}`);
333
+ else if (report.openPRs.length === 0)
334
+ out.push(' none');
335
+ else
336
+ for (const p of report.openPRs) {
337
+ const head = `#${p.number}` + (p.isDraft ? ' [draft]' : '');
338
+ out.push(` ${head} ${p.title} (${p.headRefName})`);
339
+ }
340
+ // BOARD in-flight
341
+ out.push('\n▣ BOARD in-flight (active statuses only)');
342
+ if (isError(report.board))
343
+ out.push(` ⚠ could not derive: ${report.board.error}`);
344
+ else if (!report.boardConfigured)
345
+ out.push(' no board configured (set orient.projectNumber in totem.config.ts)');
346
+ else if (report.board.length === 0)
347
+ out.push(' none (no items in an active status)');
348
+ else
349
+ for (const i of report.board) {
350
+ const num = i.contentNumber ? `#${i.contentNumber} ` : '';
351
+ out.push(` [${i.status}] ${num}` + i.title);
352
+ }
353
+ // BOARD↔ISSUE COHERENCE (the new derived signal)
354
+ out.push('\n⚖ BOARD↔ISSUE COHERENCE (active card whose issue is closed/absent = drift)');
355
+ if (isError(report.coherence))
356
+ out.push(` ⚠ could not derive: ${report.coherence.error}`);
357
+ else if (report.coherence.length === 0)
358
+ out.push(' none (board and open issues are coherent)');
359
+ else
360
+ for (const c of report.coherence) {
361
+ out.push(` ⚠ [${c.boardStatus}] "${c.boardItemTitle}" → issue #${c.issueNumber} is closed/absent`);
362
+ }
363
+ // EPICS + children
364
+ out.push('\n✦ EPICS + sub-issues (label "type: epic"; children via body Parent ref)');
365
+ if (isError(report.epics))
366
+ out.push(` ⚠ could not derive: ${report.epics.error}`);
367
+ else if (report.epics.length === 0)
368
+ out.push(' none');
369
+ else
370
+ for (const e of report.epics) {
371
+ out.push(` #${e.number} ${e.title}`);
372
+ if (e.subIssues.length === 0)
373
+ out.push(' (no tracked sub-issues)');
374
+ else
375
+ e.subIssues.forEach((c, idx) => out.push(` ${idx === e.subIssues.length - 1 ? '└' : '├'} #${c.number} ${c.title}`));
376
+ }
377
+ // OTHER open issues
378
+ out.push('\n● OTHER open issues (non-epic, non-child)');
379
+ if (isError(report.otherOpenIssues))
380
+ out.push(` ⚠ could not derive: ${report.otherOpenIssues.error}`);
381
+ else if (report.otherOpenIssues.length === 0)
382
+ out.push(' none');
383
+ else
384
+ for (const i of report.otherOpenIssues) {
385
+ const labels = i.labels.filter((l) => !NOISE_LABELS.has(l));
386
+ const labelTag = labels.length ? ` [${labels.join(', ')}]` : '';
387
+ out.push(` #${i.number} ${i.title}` + labelTag);
388
+ }
389
+ // INDEX FRESHNESS pointer (honest absence when never synced)
390
+ out.push('\n⟳ INDEX FRESHNESS (registry lastSync for this repo)');
391
+ out.push(renderFreshness(report.indexFreshness));
392
+ out.push('');
393
+ out.push(FOOTER);
394
+ return out.join('\n');
395
+ }
396
+ // ─── Command entry ──────────────────────────────────────
397
+ export async function orientCommand(opts) {
398
+ // Honor the subcommand flag AND the root program's global `--json` (commander
399
+ // routes a leading `--json` to the root option; the root sets this env). Same
400
+ // dual-source pattern other JSON-emitting commands use.
401
+ const { isJsonMode } = await import('../json-output.js');
402
+ const json = opts.json === true || isJsonMode();
403
+ const cwd = process.cwd();
404
+ const state = await derive(cwd);
405
+ const report = toReport(state);
406
+ if (json) {
407
+ process.stdout.write(JSON.stringify(report, null, 2) + '\n');
408
+ return;
409
+ }
410
+ process.stdout.write(renderReport(report) + '\n');
411
+ }
412
+ //# 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":""}