@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,99 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { flagBoardIssueDrift, isActiveBoardItem } from './orient-coherence.js';
3
+ describe('isActiveBoardItem', () => {
4
+ it.each([
5
+ ['Todo', false],
6
+ ['todo', false],
7
+ ['Done', false],
8
+ ['Closed', false],
9
+ ['Informs', false],
10
+ ['Backlog', false],
11
+ ['In Progress', true],
12
+ ['In Review', true],
13
+ ['Up Next', true],
14
+ ])('status %s → active=%s', (status, active) => {
15
+ expect(isActiveBoardItem({ status, title: 't' })).toBe(active);
16
+ });
17
+ it('treats an absent status as Todo (inactive)', () => {
18
+ expect(isActiveBoardItem({ title: 't' })).toBe(false);
19
+ });
20
+ });
21
+ describe('flagBoardIssueDrift', () => {
22
+ const LOCAL = 'mmnto-ai/totem';
23
+ /** Build a same-repo Issue card (the only kind that can drift) unless overridden. */
24
+ const issueCard = (over) => ({
25
+ status: 'In Progress',
26
+ title: 'Card',
27
+ contentRepo: LOCAL,
28
+ contentType: 'Issue',
29
+ ...over,
30
+ });
31
+ it('flags active same-repo Issue cards whose linked issue is absent from the open set', () => {
32
+ const board = [
33
+ issueCard({ title: 'Card A', contentNumber: 100 }),
34
+ issueCard({ title: 'Card B', contentNumber: 200, status: 'In Review' }),
35
+ ];
36
+ const open = new Set([200]); // #100 is closed/absent
37
+ expect(flagBoardIssueDrift(board, open, LOCAL)).toEqual([
38
+ {
39
+ boardItemTitle: 'Card A',
40
+ boardStatus: 'In Progress',
41
+ issueNumber: 100,
42
+ kind: 'issue-closed-or-absent',
43
+ },
44
+ ]);
45
+ });
46
+ it('never flags terminal-status cards even when their issue is absent', () => {
47
+ const board = [
48
+ issueCard({ status: 'Done', title: 'Done card', contentNumber: 1 }),
49
+ issueCard({ status: 'Todo', title: 'Todo card', contentNumber: 2 }),
50
+ issueCard({ status: 'Backlog', title: 'Backlog card', contentNumber: 3 }),
51
+ ];
52
+ expect(flagBoardIssueDrift(board, new Set(), LOCAL)).toEqual([]);
53
+ });
54
+ it('does not flag cards whose issue is still open', () => {
55
+ const board = [issueCard({ title: 'A', contentNumber: 5 })];
56
+ expect(flagBoardIssueDrift(board, new Set([5]), LOCAL)).toEqual([]);
57
+ });
58
+ it('ignores active cards with no linked issue number (draft cards)', () => {
59
+ const board = [
60
+ { status: 'In Progress', title: 'Draft card', contentType: 'DraftIssue' },
61
+ ];
62
+ expect(flagBoardIssueDrift(board, new Set(), LOCAL)).toEqual([]);
63
+ });
64
+ // Regression: org-level boards span repos. A card for ANOTHER repo's issue must
65
+ // NOT be flagged against this repo's open-issue set (the #2044 controller-review bug).
66
+ it('never flags cross-repo cards (org board spanning repos)', () => {
67
+ const board = [
68
+ issueCard({
69
+ title: 'Strategy card',
70
+ contentNumber: 433,
71
+ contentRepo: 'mmnto-ai/totem-strategy',
72
+ }),
73
+ ];
74
+ // #433 is absent from THIS repo's open set, but it's a strategy issue → not drift here.
75
+ expect(flagBoardIssueDrift(board, new Set(), LOCAL)).toEqual([]);
76
+ });
77
+ // A PR card's number lives in a different namespace than the open-ISSUE set;
78
+ // comparing it would always false-flag. PR cards are never issue-drift.
79
+ it('never flags PullRequest cards', () => {
80
+ const board = [
81
+ issueCard({ title: 'PR card', contentNumber: 2049, contentType: 'PullRequest' }),
82
+ ];
83
+ expect(flagBoardIssueDrift(board, new Set(), LOCAL)).toEqual([]);
84
+ });
85
+ it('derives NO coherence when the repo is undetermined (localSlug null)', () => {
86
+ const board = [issueCard({ title: 'A', contentNumber: 7 })];
87
+ expect(flagBoardIssueDrift(board, new Set(), null)).toEqual([]);
88
+ });
89
+ it('issues ZERO gh/exec calls — it is a pure function of its arguments', async () => {
90
+ // Spy on safeExec at the core boundary; the predicate must never touch it.
91
+ const core = await import('@mmnto/totem');
92
+ const spy = vi.spyOn(core, 'safeExec');
93
+ const board = [issueCard({ title: 'A', contentNumber: 9 })];
94
+ flagBoardIssueDrift(board, new Set(), LOCAL);
95
+ expect(spy).not.toHaveBeenCalled();
96
+ spy.mockRestore();
97
+ });
98
+ });
99
+ //# sourceMappingURL=orient-coherence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orient-coherence.test.js","sourceRoot":"","sources":["../../src/commands/orient-coherence.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
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
+ /**
63
+ * Programmatic entry: derive the full `OrientReport` for `cwd` WITHOUT writing
64
+ * stdout. Identical report to `orient --json` (one derivation, two callers —
65
+ * cannot diverge). Reused by `orientCommand` (the CLI surface) and the
66
+ * SessionStart hook (`.claude/hooks/session-context.mjs`, mmnto-ai/totem#2044
67
+ * PR-2), which dynamic-imports this from `packages/cli/dist/commands/orient.js`
68
+ * — the workspace-dist pattern, deliberately NOT the global `totem` binary
69
+ * (sidesteps the stale-resolve trap mmnto-ai/totem#2053).
70
+ *
71
+ * Latency note: orient's gh adapters are synchronous (`safeExec`/execFileSync),
72
+ * so this runs ~4 sequential blocking gh calls (repo view + PRs + issues + board),
73
+ * each bounded by the adapter's per-call timeout. Callers on a latency-sensitive
74
+ * path (the hook) wrap it best-effort and degrade on failure.
75
+ */
76
+ export declare function deriveOrientReport(cwd: string): Promise<OrientReport>;
77
+ export declare function renderReport(report: OrientReport): string;
78
+ /**
79
+ * Compact projection of an `OrientReport` for auto-injection at session start.
80
+ *
81
+ * Emits ONLY high-signal state — parked/frozen subsystems, open PRs, and board↔
82
+ * issue coherence drift — plus a one-line COUNTS pointer for epics/other-issues
83
+ * (NOT the full enumeration: "pointers not bodies", mmnto-ai/totem-strategy#467
84
+ * Tier-A discipline). An underivable section stays a `⚠ could not derive` line
85
+ * (Tenet 4 — never a silent omit), so the projection inherits orient's fail-loud
86
+ * contract. Hard-bounded by `SESSION_BLOCK_MAX_CHARS` (the guardrail above).
87
+ *
88
+ * Returns '' when there is nothing high-signal to surface (no parked, no PRs, no
89
+ * drift, no derivable counts) so the hook can omit the block entirely rather than
90
+ * inject an empty header.
91
+ */
92
+ export declare function renderOrientForSession(report: OrientReport): string;
93
+ export declare function orientCommand(opts: {
94
+ json?: boolean;
95
+ }): Promise<void>;
96
+ export {};
97
+ //# 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;AAkUD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAG3E;AAeD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAqFzD;AAgBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA4EnE;AAID,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3E"}