@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.
- package/dist/adapters/github-cli-pr.d.ts.map +1 -1
- package/dist/adapters/github-cli-pr.js +3 -1
- package/dist/adapters/github-cli-pr.js.map +1 -1
- package/dist/adapters/github-cli-pr.test.js +4 -4
- package/dist/adapters/github-cli-pr.test.js.map +1 -1
- package/dist/adapters/github-cli-project.d.ts +21 -0
- package/dist/adapters/github-cli-project.d.ts.map +1 -0
- package/dist/adapters/github-cli-project.js +69 -0
- package/dist/adapters/github-cli-project.js.map +1 -0
- package/dist/adapters/github-cli.d.ts +7 -1
- package/dist/adapters/github-cli.d.ts.map +1 -1
- package/dist/adapters/github-cli.js +30 -0
- package/dist/adapters/github-cli.js.map +1 -1
- package/dist/adapters/github-cli.test.js +26 -0
- package/dist/adapters/github-cli.test.js.map +1 -1
- package/dist/adapters/issue-adapter.d.ts +18 -0
- package/dist/adapters/issue-adapter.d.ts.map +1 -1
- package/dist/adapters/pr-adapter.d.ts +2 -0
- package/dist/adapters/pr-adapter.d.ts.map +1 -1
- package/dist/commands/eject.d.ts.map +1 -1
- package/dist/commands/eject.js +12 -4
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/gate-install.d.ts +59 -0
- package/dist/commands/gate-install.d.ts.map +1 -0
- package/dist/commands/gate-install.js +111 -0
- package/dist/commands/gate-install.js.map +1 -0
- package/dist/commands/gate-install.test.d.ts +2 -0
- package/dist/commands/gate-install.test.d.ts.map +1 -0
- package/dist/commands/gate-install.test.js +472 -0
- package/dist/commands/gate-install.test.js.map +1 -0
- package/dist/commands/gate.d.ts +31 -0
- package/dist/commands/gate.d.ts.map +1 -1
- package/dist/commands/gate.js +70 -0
- package/dist/commands/gate.js.map +1 -1
- package/dist/commands/host-hooks.d.ts +745 -0
- package/dist/commands/host-hooks.d.ts.map +1 -0
- package/dist/commands/host-hooks.js +229 -0
- package/dist/commands/host-hooks.js.map +1 -0
- package/dist/commands/init-templates.d.ts +8 -0
- package/dist/commands/init-templates.d.ts.map +1 -1
- package/dist/commands/init-templates.js +240 -0
- package/dist/commands/init-templates.js.map +1 -1
- package/dist/commands/init.d.ts +6 -4
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +81 -94
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/orient-coherence.d.ts +33 -0
- package/dist/commands/orient-coherence.d.ts.map +1 -0
- package/dist/commands/orient-coherence.js +64 -0
- package/dist/commands/orient-coherence.js.map +1 -0
- package/dist/commands/orient-coherence.test.d.ts +2 -0
- package/dist/commands/orient-coherence.test.d.ts.map +1 -0
- package/dist/commands/orient-coherence.test.js +99 -0
- package/dist/commands/orient-coherence.test.js.map +1 -0
- package/dist/commands/orient.d.ts +67 -0
- package/dist/commands/orient.d.ts.map +1 -0
- package/dist/commands/orient.js +412 -0
- package/dist/commands/orient.js.map +1 -0
- package/dist/commands/orient.test.d.ts +2 -0
- package/dist/commands/orient.test.d.ts.map +1 -0
- package/dist/commands/orient.test.js +329 -0
- package/dist/commands/orient.test.js.map +1 -0
- package/dist/help.js +1 -1
- package/dist/help.js.map +1 -1
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -1
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"orient.test.d.ts","sourceRoot":"","sources":["../../src/commands/orient.test.ts"],"names":[],"mappings":""}
|