@mmnto/cli 0.37.0 → 0.39.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.
@@ -19,36 +19,58 @@ export async function statsCommand() {
19
19
  if (totalChunks === 0) {
20
20
  console.log('\n No data indexed yet. Run `totem sync` first.');
21
21
  }
22
- // Rule observability metrics
22
+ // ─── Trap Ledger ──────────────────────────────────
23
23
  const totemDir = path.join(cwd, config.totemDir);
24
- const { loadCompiledRules, loadRuleMetrics } = await import('@mmnto/totem');
24
+ const { DEFAULT_RULE_CATEGORY, loadCompiledRules, loadRuleMetrics } = await import('@mmnto/totem');
25
25
  const rulesPath = path.join(totemDir, 'compiled-rules.json');
26
26
  const rules = loadCompiledRules(rulesPath);
27
27
  const metrics = loadRuleMetrics(totemDir);
28
- if (rules.length > 0) {
29
- const tracked = Object.keys(metrics.rules).length;
30
- const totalTriggers = Object.values(metrics.rules).reduce((s, m) => s + m.triggerCount, 0);
31
- const totalSuppressions = Object.values(metrics.rules).reduce((s, m) => s + m.suppressCount, 0);
32
- const TAG = 'Stats';
33
- const { log } = await import('../ui.js');
34
- log.info(TAG, `Compiled rules: ${rules.length}`);
35
- log.info(TAG, `Rules with metrics: ${tracked}`);
36
- log.info(TAG, `Total triggers: ${totalTriggers}`);
37
- log.info(TAG, `Total suppressions: ${totalSuppressions}`);
38
- // Show top triggered rules
39
- const sorted = Object.entries(metrics.rules)
40
- .filter(([, m]) => m.triggerCount > 0 || m.suppressCount > 0)
41
- .sort(([, a], [, b]) => b.triggerCount + b.suppressCount - (a.triggerCount + a.suppressCount))
42
- .slice(0, 5);
43
- if (sorted.length > 0) {
44
- const rulesByHash = new Map(rules.map((r) => [r.lessonHash, r]));
45
- log.info(TAG, 'Most active rules:');
46
- for (const [hash, m] of sorted) {
47
- const rule = rulesByHash.get(hash);
48
- const label = rule ? rule.message.slice(0, 60) : hash;
49
- log.dim(TAG, ` ${label} — triggers: ${m.triggerCount}, suppressions: ${m.suppressCount}`);
28
+ if (rules.length === 0)
29
+ return;
30
+ const TAG = 'Stats';
31
+ const { log } = await import('../ui.js');
32
+ const rulesByHash = new Map(rules.map((r) => [r.lessonHash, r]));
33
+ // Aggregate totals
34
+ const totalTriggers = Object.values(metrics.rules).reduce((s, m) => s + m.triggerCount, 0);
35
+ const totalSuppressions = Object.values(metrics.rules).reduce((s, m) => s + m.suppressCount, 0);
36
+ const totalPrevented = totalTriggers + totalSuppressions;
37
+ log.info(TAG, `Compiled rules: ${rules.length}`);
38
+ log.info(TAG, `Total violations prevented: ${totalPrevented}`);
39
+ log.info(TAG, ` Blocked by rules: ${totalTriggers}`);
40
+ log.info(TAG, ` Suppressed (acknowledged): ${totalSuppressions}`);
41
+ // Category breakdown
42
+ const byCategory = {};
43
+ for (const [hash, m] of Object.entries(metrics.rules)) {
44
+ const rule = rulesByHash.get(hash);
45
+ const cat = rule?.category ?? DEFAULT_RULE_CATEGORY;
46
+ if (!byCategory[cat])
47
+ byCategory[cat] = { triggers: 0, suppressions: 0 };
48
+ byCategory[cat].triggers += m.triggerCount;
49
+ byCategory[cat].suppressions += m.suppressCount;
50
+ }
51
+ if (Object.keys(byCategory).length > 0) {
52
+ log.info(TAG, 'By category:');
53
+ for (const [cat, counts] of Object.entries(byCategory).sort(([, a], [, b]) => b.triggers + b.suppressions - (a.triggers + a.suppressions))) {
54
+ const total = counts.triggers + counts.suppressions;
55
+ if (total > 0) {
56
+ log.dim(TAG, ` ${cat}: ${total} prevented (${counts.triggers} blocked, ${counts.suppressions} suppressed)`);
50
57
  }
51
58
  }
52
59
  }
60
+ // Top prevented rules (the Trap Ledger headline)
61
+ const sorted = Object.entries(metrics.rules)
62
+ .filter(([, m]) => m.triggerCount > 0 || m.suppressCount > 0)
63
+ .sort(([, a], [, b]) => b.triggerCount + b.suppressCount - (a.triggerCount + a.suppressCount))
64
+ .slice(0, 10);
65
+ if (sorted.length > 0) {
66
+ log.info(TAG, 'Top prevented violations:');
67
+ for (const [hash, m] of sorted) {
68
+ const rule = rulesByHash.get(hash);
69
+ const cat = rule?.category ?? DEFAULT_RULE_CATEGORY;
70
+ const label = rule ? rule.message.slice(0, 55) : hash;
71
+ const total = m.triggerCount + m.suppressCount;
72
+ log.dim(TAG, ` [${cat}] ${label} — ${total}x`);
73
+ }
74
+ }
53
75
  }
54
76
  //# sourceMappingURL=stats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/cli",
3
- "version": "0.37.0",
3
+ "version": "0.39.0",
4
4
  "description": "CLI for Totem — AI persistent memory and context layer",
5
5
  "type": "module",
6
6
  "bin": {
@@ -21,7 +21,7 @@
21
21
  "ora": "^9.3.0",
22
22
  "picocolors": "^1.1.1",
23
23
  "zod": "^3.24.0",
24
- "@mmnto/totem": "0.37.0"
24
+ "@mmnto/totem": "0.39.0"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@anthropic-ai/sdk": "^0.78.0",