@mmnto/cli 1.89.0 → 1.91.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/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # @mmnto/cli
2
+
3
+ Command-line interface for [Totem](https://github.com/mmnto-ai/totem), a persistent memory and context layer for AI coding agents. Installs the `totem` binary.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ pnpm add -D @mmnto/cli
9
+ # or run without installing
10
+ pnpm dlx @mmnto/cli init
11
+ ```
12
+
13
+ Requires Node >= 24.
14
+
15
+ ## Usage
16
+
17
+ ```bash
18
+ totem init # scaffold totem.config.ts, git hooks, and baseline rules
19
+ totem lint # run compiled rules against your changes (zero LLM, offline)
20
+ totem lesson compile # compile markdown lessons into regex/AST rules (needs an LLM key)
21
+ totem lesson extract # extract lessons from PR reviews (needs an LLM key)
22
+ totem sync # rebuild the semantic index (needs an embedding key)
23
+ totem --help # full command list
24
+ ```
25
+
26
+ `totem init`, `totem lint`, and the git hooks run with no API keys. LLM-backed commands (`lesson compile`, `lesson extract`, `review`, `spec`) use the orchestrator configured in `totem.config.ts`; the Anthropic, OpenAI, and Google SDKs are optional peer dependencies loaded only when configured.
27
+
28
+ ## Docs
29
+
30
+ - Repository: <https://github.com/mmnto-ai/totem>
31
+ - Architecture: [docs/reference/architecture.md](https://github.com/mmnto-ai/totem/blob/main/docs/reference/architecture.md)
32
+ - CLI reference: [docs/wiki/cli-reference.md](https://github.com/mmnto-ai/totem/blob/main/docs/wiki/cli-reference.md)
33
+
34
+ Apache-2.0.
@@ -0,0 +1,304 @@
1
+ /**
2
+ * `totem ecl-gc` — ECL outbox retention prune (mmnto-ai/totem#2279; parent
3
+ * mmnto-ai/totem-strategy#700 / doctrine/ecl-discipline.md § 4.4).
4
+ *
5
+ * The binary-guaranteed cohort-wide replacement for the interim
6
+ * `scripts/prune-outbox.mjs`: it deletes an agent's OWN outbox dispatches once
7
+ * they age past the retention window N (default 14 days). Outbox dispatches are
8
+ * TRANSPORT, not archive — the durable record of whatever a dispatch carried
9
+ * lives in its home (rulings → ADRs / issues, work-state → the GH board,
10
+ * session history → `journal/`), so an aged courier file is disposable.
11
+ *
12
+ * SINGLE-WRITER INVARIANT (ADR-106): each agent prunes only its OWN
13
+ * `<repoRoot>/.totem/orchestration/<agent-id>/outbox/` — never a peer's, never
14
+ * the operator's chore. Self-resolution (Tenet-21 reuse of `resolveSelfSender`)
15
+ * makes pruning a peer structurally unreachable: the target path is composed
16
+ * from the resolved single agent-id and nothing else. This command NEVER reads
17
+ * or touches `journal/` (bounded-past record + MCP-indexed) or `processed/`
18
+ * (the handled-state cursor — erasing it makes consumed backlog re-read as
19
+ * unread) or any inbox / other seat. Scope is `outbox/` only.
20
+ *
21
+ * Safe by default: dry-run (list only) unless `--apply` is passed.
22
+ *
23
+ * COMPACTION (mmnto-ai/totem#2307; contract ADR-106 § A2 + ecl-discipline § 4.5,
24
+ * ratified strategy#826). `eclCompact` is the cursor-coupled processed-mark GC
25
+ * sibling of the prune above: it deletes an agent's OWN `processed/` marks that
26
+ * shadow nothing — a mark whose inbound dispatch its sender already swept per
27
+ * § 4.4. The retained cursor is `processed ∩ raw-addressed-inbound` (A2.1: the
28
+ * PRE-dedupe scan, never `pollMail`'s `inbound − processed` list). Deletion is
29
+ * licensed ONLY against a provably-complete poll (A2.2: full expected roster
30
+ * present, zero warnings, not truncated — else zero deletes), binds to exactly
31
+ * one seat (A2.3), and self-verifies via an immediate re-poll (A2.4). Unlike the
32
+ * prune's age window, compaction couples to the outbox lifecycle, not to time.
33
+ */
34
+ import { type TotemConfig } from '@mmnto/totem';
35
+ export interface EclGcOptions {
36
+ /** Actually delete (default: dry-run — list would-prune, delete nothing). */
37
+ apply?: boolean;
38
+ /** Retention window in days (default 14). Must be a non-negative integer. */
39
+ retainDays?: number;
40
+ /**
41
+ * Override the self-resolved agent-id (visiting / orchestrator case only).
42
+ * NOT used by the signoff step — that path self-resolves.
43
+ */
44
+ agentId?: string;
45
+ /**
46
+ * Walk-START directory (default: `process.cwd()`), not the definitive root:
47
+ * the effective repo root is derived by walking up to the nearest
48
+ * `.totem`/`.git` marker (mmnto-ai/totem#2312); a marker-less start is used
49
+ * as-is. Test injection point.
50
+ */
51
+ repoRoot?: string;
52
+ /** Env override (default: `process.env`). Test injection point. */
53
+ env?: Record<string, string | undefined>;
54
+ /** Clock injection for deterministic cutoffs in tests (default: `new Date()`). */
55
+ now?: () => Date;
56
+ }
57
+ /**
58
+ * Structured prune result. Also the `--json` payload. `pruned` lists the files
59
+ * actually removed under `--apply` (or the would-prune set in dry-run);
60
+ * `failed` captures per-file delete failures (never fatal); `skipped` surfaces
61
+ * every entry left untouched together with WHY (non-file, non-`.md`,
62
+ * unparseable stamp).
63
+ */
64
+ export interface EclGcResult {
65
+ agent: string;
66
+ retainDays: number;
67
+ dryRun: boolean;
68
+ outbox: string;
69
+ cutoffKey: string;
70
+ pruned: string[];
71
+ failed: {
72
+ file: string;
73
+ error: string;
74
+ }[];
75
+ kept: number;
76
+ skipped: {
77
+ file: string;
78
+ reason: string;
79
+ }[];
80
+ warnings: string[];
81
+ }
82
+ /**
83
+ * Canonicalize either stamp form to a 14-digit `YYYYMMDDHHMMSS` key (seconds
84
+ * default to `00`) so mixed-length stamps compare correctly. Ported from
85
+ * `scripts/prune-outbox.mjs:toKey`.
86
+ */
87
+ export declare function toStampKey(stamp: string): string;
88
+ /**
89
+ * Cutoff = `now − retainDays`, as a comparable 14-digit `YYYYMMDDHHMMSS` key.
90
+ * Derives from the injected `now` for determinism (Tenet 15). Ported from
91
+ * `scripts/prune-outbox.mjs:cutoffKey`.
92
+ */
93
+ export declare function cutoffKey(now: Date, retainDays: number): string;
94
+ /** A directory entry reduced to the classification inputs (pure-helper seam). */
95
+ export interface DirEntryLike {
96
+ name: string;
97
+ isFile: boolean;
98
+ }
99
+ /** The per-entry verdict a classifier returns. */
100
+ export type PruneClass = {
101
+ action: 'prune';
102
+ } | {
103
+ action: 'keep';
104
+ } | {
105
+ action: 'skip';
106
+ reason: string;
107
+ };
108
+ /**
109
+ * Classify a single directory entry against the cutoff. Safe-direction bias:
110
+ * anything whose age is not derivable from an eligible filename is KEPT +
111
+ * surfaced, never deleted (auto-deleting an un-ageable file is worse than
112
+ * letting it linger — mmnto-ai/totem-strategy#700 by-design). Non-file entries
113
+ * are checked FIRST so a directory named `*.md` can never reach a delete.
114
+ */
115
+ export declare function classifyEntry(entry: DirEntryLike, cutoff: string): PruneClass;
116
+ /** The classification plan for a whole directory listing. */
117
+ export interface PrunePlan {
118
+ prune: string[];
119
+ kept: number;
120
+ skipped: {
121
+ file: string;
122
+ reason: string;
123
+ }[];
124
+ }
125
+ /**
126
+ * Pure prune-plan classification: given a directory listing + a cutoff key,
127
+ * partition entries into prune / keep / skip. Deterministic order (filename
128
+ * sort) so the reported lists are stable across platforms.
129
+ */
130
+ export declare function planPrune(entries: DirEntryLike[], cutoff: string): PrunePlan;
131
+ /**
132
+ * Programmatic entry point. Resolves the single self-agent, validates inputs,
133
+ * scans that agent's OWN outbox, and (under `--apply`) deletes the aged
134
+ * dispatches. Returns a structured `EclGcResult`.
135
+ *
136
+ * Throws ONLY on usage errors (unresolvable/ambiguous self, unsafe agent-id,
137
+ * invalid `--retain-days`), and always BEFORE any directory scan or deletion.
138
+ * Filesystem failures are NEVER thrown — a per-file delete failure is captured
139
+ * into `result.failed` (janitorial sensor, not a gate — Tenet 13).
140
+ */
141
+ export declare function eclGc(opts?: EclGcOptions): EclGcResult;
142
+ /**
143
+ * Render an `EclGcResult`. With `json`, the structured result goes to stdout
144
+ * (hook-friendly clean stream). Otherwise a human summary goes to stderr via
145
+ * the standard CLI logger (agent, mode, pruned/kept counts, skipped-with-
146
+ * reasons, failed count) — mirrors `mail.ts`'s stderr `log` usage.
147
+ */
148
+ export declare function eclGcCommand(result: EclGcResult, json: boolean): Promise<EclGcResult>;
149
+ export interface EclCompactOptions {
150
+ /** Actually delete inert marks (default: dry-run — list would-collect only). */
151
+ apply?: boolean;
152
+ /**
153
+ * Override the self-resolved agent-id (visiting/orchestrator case). The
154
+ * single-writer compaction target; NOT used by the signoff step (self-resolves).
155
+ */
156
+ agentId?: string;
157
+ /**
158
+ * Walk-START directory (default: `process.cwd()`), not the definitive root:
159
+ * the effective repo root is derived by walking up to the nearest
160
+ * `.totem`/`.git` marker (mmnto-ai/totem#2312); a marker-less start is used
161
+ * as-is. Test injection point.
162
+ */
163
+ repoRoot?: string;
164
+ /** Env override (default: `process.env`). Test injection point. */
165
+ env?: Record<string, string | undefined>;
166
+ /** Workspace override (default: `TOTEM_WORKSPACE` env, else parent of repoRoot). */
167
+ workspace?: string;
168
+ /** Scan cap override (default: mail's `MAX_SCAN`). Injection point for the
169
+ * A2.2 truncation abort arm — exercised with small fixtures. */
170
+ maxScan?: number;
171
+ /**
172
+ * Declared expected cohort repo roster for the A2.2 completeness gate — the
173
+ * yardstick the workspace glob is checked against. Highest-precedence source
174
+ * (mmnto-ai/totem#2310): an explicit value here (programmatic callers / tests)
175
+ * WINS over `config.ecl.cohortRepos`. When BOTH are absent the roster is
176
+ * undeclared: compaction HARD-ABORTS (fail-loud, exit 3), never "assume
177
+ * complete" and never a silent no-op — completeness is unprovable without a
178
+ * declared expectation (strategy#828 no-roster corollary). Tests inject
179
+ * explicitly; the CLI action injects `config` (below) instead.
180
+ */
181
+ expectedRepos?: string[];
182
+ /**
183
+ * Loaded consumer config, the roster's second-precedence source
184
+ * (mmnto-ai/totem#2310): when `expectedRepos` is absent the gate reads
185
+ * `config.ecl.cohortRepos`. Injected by the CLI action (which loads config at
186
+ * the process boundary) so `eclCompact` stays a pure, synchronously-testable
187
+ * function — most tests inject `expectedRepos` directly and never touch this.
188
+ * A declared-but-EMPTY `cohortRepos` never reaches here: it is a Zod `.min(1)`
189
+ * violation caught loud at config load (a config bug ≠ an undeclared roster).
190
+ */
191
+ config?: TotemConfig;
192
+ /**
193
+ * Operator escape (`--force-incomplete`): proceed with compaction even when
194
+ * the workspace glob is a strict subset of the declared roster (a cohort repo
195
+ * is absent). UNSAFE — a live mark in an unscanned repo can be collected as a
196
+ * false-unread; use only when you know the absent repo holds no inbound for
197
+ * this seat. Bypasses ONLY the roster-presence check; scan warnings and
198
+ * truncation remain hard aborts, and an undeclared (empty) roster still
199
+ * hard-aborts (there is no presence to force when nothing was declared).
200
+ */
201
+ forceIncomplete?: boolean;
202
+ }
203
+ /**
204
+ * Structured compaction result. Also the `--json` payload. `collectable` is the
205
+ * would-collect set in dry-run (or the eligible set pre-delete under apply);
206
+ * `collected` is what actually got deleted (gate-green only); `resurfaced` is
207
+ * the A2.4 falsifier output — MUST be empty (a non-empty set means a live mark
208
+ * was collected and the completeness gate was too weak).
209
+ */
210
+ export interface EclCompactResult {
211
+ agent: string;
212
+ dryRun: boolean;
213
+ workspace: string;
214
+ expectedRepos: string[];
215
+ /**
216
+ * Whether a non-empty roster was declared. `false` = the undeclared case,
217
+ * folded INTO the A2.2 gate: `gateComplete` is also false and compaction
218
+ * HARD-ABORTS (exit 3), because completeness cannot be proven without a
219
+ * declared expectation (strategy#828). Retained only to frame the specific
220
+ * operator message ("no cohort roster declared" vs a missing/unscannable repo).
221
+ */
222
+ rosterDeclared: boolean;
223
+ /** A2.2 gate: true iff full roster present (or forced) AND zero scan warnings AND not truncated. */
224
+ gateComplete: boolean;
225
+ /** Why the gate is red (missing repos, scan/read/parse warnings, truncation); empty iff complete. */
226
+ gateReasons: string[];
227
+ /** Count of raw addressed-inbound basenames discovered (pre-dedupe; to:S ∪ broadcast). */
228
+ rawInbound: number;
229
+ /** Total own processed marks examined (direct ∪ broadcast). */
230
+ marks: number;
231
+ /** Marks whose dispatch is absent from raw inbound — the would-collect set (dry-run / pre-delete). */
232
+ collectable: string[];
233
+ /** Marks actually deleted (⊆ collectable; gate-green apply only). */
234
+ collected: string[];
235
+ /** Marks left in place after the run. */
236
+ retained: number;
237
+ failed: {
238
+ file: string;
239
+ error: string;
240
+ }[];
241
+ /** A2.4 falsifier: previously-handled dispatches that re-surfaced as unread post-compact (MUST be []). */
242
+ resurfaced: string[];
243
+ /**
244
+ * A2.4 self-check trustworthiness: `false` iff the post-compact re-poll was
245
+ * itself truncated or warned, so a resurfaced dispatch beyond its horizon
246
+ * could read as clean. An untrustworthy verify is a hard failure (we deleted
247
+ * marks and cannot confirm no resurface) — maps to the abort exit code.
248
+ */
249
+ verifyComplete: boolean;
250
+ warnings: string[];
251
+ }
252
+ /**
253
+ * Resolve the A2.2 completeness roster by precedence (mmnto-ai/totem#2310):
254
+ * explicit `expectedRepos` (programmatic callers / tests) → `config.ecl.cohortRepos`
255
+ * (consumer-declared) → `undefined` (the honest UNDECLARED state, which the gate
256
+ * maps to a hard-abort). Pure so the precedence is unit-testable in isolation.
257
+ * A declared-but-EMPTY array never reaches here: it is a Zod `.min(1)` violation
258
+ * caught loud at config load (`loadEclConfig`), so a config bug is never aliased
259
+ * into an undeclared roster.
260
+ */
261
+ export declare function resolveExpectedRoster(explicit: string[] | undefined, config: TotemConfig | undefined): string[] | undefined;
262
+ /**
263
+ * Load the consumer's Totem config for the compaction roster read
264
+ * (mmnto-ai/totem#2310). A MISSING config file is the honest "undeclared" state —
265
+ * returns `undefined`, and the gate hard-aborts (exit 3) downstream. A
266
+ * PRESENT-but-INVALID config (e.g. `ecl.cohortRepos: []` → Zod `.min(1)`, or any
267
+ * other schema/parse error) throws LOUD: it is a config BUG and must NOT be
268
+ * caught into honest-absent, which would mask the bug as a normal undeclared
269
+ * roster (Tenet 4). Mirrors `orient`'s config read (`resolveProjectNumber`) but
270
+ * DELIBERATELY narrows the swallow to `CONFIG_MISSING` only — orient's catch-all
271
+ * would degrade an invalid config into "no board", the exact aliasing this gate
272
+ * must avoid.
273
+ */
274
+ export declare function loadEclConfig(cwd: string): Promise<TotemConfig | undefined>;
275
+ /**
276
+ * Programmatic entry point for cursor-coupled processed-mark compaction. For a
277
+ * single resolved seat, deletes `processed/` marks whose inbound dispatch is
278
+ * absent from the RAW addressed-inbound set (A2.1) — but ONLY when discovery is
279
+ * provably complete (A2.2), and then self-verifies (A2.4).
280
+ *
281
+ * Throws ONLY on usage errors (unresolvable/ambiguous self, unsafe agent-id),
282
+ * always BEFORE any scan or deletion (exit-2 class, parity with `eclGc`). Every
283
+ * safety failure (incomplete roster, scan warning, truncation) is a STRUCTURED
284
+ * gate-red result with zero deletes, never a throw — the caller maps it to the
285
+ * compaction-abort exit code.
286
+ */
287
+ export declare function eclCompact(opts?: EclCompactOptions): EclCompactResult;
288
+ /**
289
+ * Render an `EclCompactResult`. `--json` → structured stdout; otherwise a human
290
+ * summary to stderr. A red gate reports the reasons + zero deletes; a tripped
291
+ * A2.4 falsifier and per-mark delete failures are surfaced via the error logger.
292
+ */
293
+ export declare function eclCompactCommand(result: EclCompactResult, json: boolean): Promise<EclCompactResult>;
294
+ /**
295
+ * Combined prune+compact exit-code contract (codex panel, mmnto-ai/totem#2307).
296
+ * Pure so the precedence is unit-testable independent of the CLI wrapper. The
297
+ * usage code `2` is NOT modeled here — it is the thrown-error path the wrapper
298
+ * catches around this call. Precedence: `3` (compaction abort — A2.2 gate red or
299
+ * A2.4 falsifier tripped) outranks `1` (partial janitorial delete failure, from
300
+ * either phase), which outranks `0` (clean). So a prune-partial + compact-abort
301
+ * is `3`, with the prune count still carried in the structured result.
302
+ */
303
+ export declare function resolveEclGcExitCode(prune: Pick<EclGcResult, 'failed'>, compact?: Pick<EclCompactResult, 'gateComplete' | 'resurfaced' | 'verifyComplete' | 'failed'>): 0 | 1 | 3;
304
+ //# sourceMappingURL=ecl-gc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecl-gc.d.ts","sourceRoot":"","sources":["../../src/commands/ecl-gc.ts"],"names":[],"mappings":"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"}