@mmnto/totem 1.10.0 → 1.10.2

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.
@@ -0,0 +1,29 @@
1
+ export type RetiredLesson = {
2
+ heading: string;
3
+ reason: string;
4
+ retiredAt: string;
5
+ };
6
+ export type RetiredLessonsFile = RetiredLesson[];
7
+ export declare const RETIRED_LESSONS_FILE = "retired-lessons.json";
8
+ /**
9
+ * Read the retirement ledger from `.totem/retired-lessons.json`.
10
+ * Returns an empty array when the file is missing or contains malformed JSON.
11
+ */
12
+ export declare function readRetiredLessons(totemDir: string): RetiredLesson[];
13
+ /**
14
+ * Write the retirement ledger to `.totem/retired-lessons.json`.
15
+ */
16
+ export declare function writeRetiredLessons(totemDir: string, entries: RetiredLesson[]): void;
17
+ /**
18
+ * Append a retirement entry, deduplicating by heading (case-insensitive exact match).
19
+ * If the heading already exists the entry is not duplicated.
20
+ */
21
+ export declare function retireLesson(totemDir: string, heading: string, reason: string): void;
22
+ /**
23
+ * Check whether a heading matches any retired entry.
24
+ *
25
+ * Uses exact case-insensitive matching (trimmed). Consistent with
26
+ * retireLesson's dedup behavior. Semantic dedup handles rewording.
27
+ */
28
+ export declare function isRetiredHeading(heading: string, retired: RetiredLesson[]): boolean;
29
+ //# sourceMappingURL=retired-lessons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retired-lessons.d.ts","sourceRoot":"","sources":["../src/retired-lessons.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,aAAa,EAAE,CAAC;AAIjD,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAI3D;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE,CAgBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,CAIpF;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAYpF;AAID;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAOnF"}
@@ -0,0 +1,68 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ // ─── Constants ─────────────────────────────────────
4
+ export const RETIRED_LESSONS_FILE = 'retired-lessons.json';
5
+ // ─── Read / Write ──────────────────────────────────
6
+ /**
7
+ * Read the retirement ledger from `.totem/retired-lessons.json`.
8
+ * Returns an empty array when the file is missing or contains malformed JSON.
9
+ */
10
+ export function readRetiredLessons(totemDir) {
11
+ const filePath = path.join(totemDir, RETIRED_LESSONS_FILE);
12
+ try {
13
+ const content = fs.readFileSync(filePath, 'utf-8');
14
+ const parsed = JSON.parse(content);
15
+ if (!Array.isArray(parsed))
16
+ return [];
17
+ return parsed.filter((item) => item !== null &&
18
+ typeof item === 'object' &&
19
+ typeof item.heading === 'string' &&
20
+ typeof item.reason === 'string');
21
+ }
22
+ catch {
23
+ return [];
24
+ }
25
+ }
26
+ /**
27
+ * Write the retirement ledger to `.totem/retired-lessons.json`.
28
+ */
29
+ export function writeRetiredLessons(totemDir, entries) {
30
+ const filePath = path.join(totemDir, RETIRED_LESSONS_FILE);
31
+ fs.mkdirSync(totemDir, { recursive: true });
32
+ fs.writeFileSync(filePath, JSON.stringify(entries, null, 2) + '\n', 'utf-8');
33
+ }
34
+ // ─── Retire ────────────────────────────────────────
35
+ /**
36
+ * Append a retirement entry, deduplicating by heading (case-insensitive exact match).
37
+ * If the heading already exists the entry is not duplicated.
38
+ */
39
+ export function retireLesson(totemDir, heading, reason) {
40
+ const existing = readRetiredLessons(totemDir);
41
+ const normalised = heading.toLowerCase().trim();
42
+ const alreadyExists = existing.some((e) => e.heading.toLowerCase().trim() === normalised);
43
+ if (alreadyExists)
44
+ return;
45
+ existing.push({
46
+ heading,
47
+ reason,
48
+ retiredAt: new Date().toISOString(),
49
+ });
50
+ writeRetiredLessons(totemDir, existing);
51
+ }
52
+ // ─── Query ─────────────────────────────────────────
53
+ /**
54
+ * Check whether a heading matches any retired entry.
55
+ *
56
+ * Uses exact case-insensitive matching (trimmed). Consistent with
57
+ * retireLesson's dedup behavior. Semantic dedup handles rewording.
58
+ */
59
+ export function isRetiredHeading(heading, retired) {
60
+ const h = heading.toLowerCase().trim();
61
+ if (!h)
62
+ return false;
63
+ return retired.some((entry) => {
64
+ const r = entry.heading.toLowerCase().trim();
65
+ return r && h === r;
66
+ });
67
+ }
68
+ //# sourceMappingURL=retired-lessons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retired-lessons.js","sourceRoot":"","sources":["../src/retired-lessons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAYlC,sDAAsD;AAEtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAE3D,sDAAsD;AAEtD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,IAAI,EAAyB,EAAE,CAC9B,IAAI,KAAK,IAAI;YACb,OAAO,IAAI,KAAK,QAAQ;YACxB,OAAQ,IAAgC,CAAC,OAAO,KAAK,QAAQ;YAC7D,OAAQ,IAAgC,CAAC,MAAM,KAAK,QAAQ,CAC/D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAwB;IAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAC3D,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED,sDAAsD;AAEtD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,OAAe,EAAE,MAAc;IAC5E,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,UAAU,CAAC,CAAC;IAC1F,IAAI,aAAa;QAAE,OAAO;IAE1B,QAAQ,CAAC,IAAI,CAAC;QACZ,OAAO;QACP,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IACH,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,sDAAsD;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,OAAwB;IACxE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=retired-lessons.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retired-lessons.test.d.ts","sourceRoot":"","sources":["../src/retired-lessons.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,111 @@
1
+ import * as crypto from 'node:crypto';
2
+ import * as fs from 'node:fs';
3
+ import * as os from 'node:os';
4
+ import * as path from 'node:path';
5
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
6
+ import { isRetiredHeading, readRetiredLessons, retireLesson, writeRetiredLessons, } from './retired-lessons.js';
7
+ // ─── Helpers ────────────────────────────────────────────
8
+ let tmpDir;
9
+ beforeEach(() => {
10
+ tmpDir = path.join(os.tmpdir(), `totem-retired-${crypto.randomUUID()}`);
11
+ fs.mkdirSync(tmpDir, { recursive: true });
12
+ });
13
+ afterEach(() => {
14
+ fs.rmSync(tmpDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
15
+ });
16
+ function makeLedgerFile(entries) {
17
+ fs.writeFileSync(path.join(tmpDir, 'retired-lessons.json'), JSON.stringify(entries, null, 2), 'utf-8');
18
+ }
19
+ // ─── readRetiredLessons ─────────────────────────────────
20
+ describe('readRetiredLessons', () => {
21
+ it('returns empty array when file does not exist', () => {
22
+ const result = readRetiredLessons(tmpDir);
23
+ expect(result).toEqual([]);
24
+ });
25
+ it('parses valid JSON correctly', () => {
26
+ const entries = [
27
+ { heading: 'Avoid eval()', reason: 'Too broad', retiredAt: '2026-04-01T00:00:00.000Z' },
28
+ {
29
+ heading: 'Use strict mode',
30
+ reason: 'Duplicates compiler flag',
31
+ retiredAt: '2026-04-02T00:00:00.000Z',
32
+ },
33
+ ];
34
+ makeLedgerFile(entries);
35
+ const result = readRetiredLessons(tmpDir);
36
+ expect(result).toHaveLength(2);
37
+ expect(result[0].heading).toBe('Avoid eval()');
38
+ expect(result[1].reason).toBe('Duplicates compiler flag');
39
+ });
40
+ it('returns empty array on malformed JSON', () => {
41
+ fs.writeFileSync(path.join(tmpDir, 'retired-lessons.json'), '{{{not json', 'utf-8');
42
+ const result = readRetiredLessons(tmpDir);
43
+ expect(result).toEqual([]);
44
+ });
45
+ });
46
+ // ─── retireLesson ───────────────────────────────────────
47
+ describe('retireLesson', () => {
48
+ it('creates the file if it does not exist', () => {
49
+ retireLesson(tmpDir, 'Never use var', 'Superseded by let/const rule');
50
+ const filePath = path.join(tmpDir, 'retired-lessons.json');
51
+ expect(fs.existsSync(filePath)).toBe(true);
52
+ const content = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
53
+ expect(content).toHaveLength(1);
54
+ expect(content[0].heading).toBe('Never use var');
55
+ expect(content[0].reason).toBe('Superseded by let/const rule');
56
+ expect(content[0].retiredAt).toBeTruthy();
57
+ });
58
+ it('appends without duplicating existing entries (same heading)', () => {
59
+ retireLesson(tmpDir, 'Avoid eval()', 'Too broad');
60
+ retireLesson(tmpDir, 'Avoid eval()', 'Still too broad');
61
+ const result = readRetiredLessons(tmpDir);
62
+ expect(result).toHaveLength(1);
63
+ expect(result[0].reason).toBe('Too broad');
64
+ });
65
+ it('deduplicates case-insensitively', () => {
66
+ retireLesson(tmpDir, 'Avoid Eval()', 'First');
67
+ retireLesson(tmpDir, 'avoid eval()', 'Second');
68
+ const result = readRetiredLessons(tmpDir);
69
+ expect(result).toHaveLength(1);
70
+ });
71
+ });
72
+ // ─── writeRetiredLessons ────────────────────────────────
73
+ describe('writeRetiredLessons', () => {
74
+ it('writes JSON with 2-space indent', () => {
75
+ const entries = [
76
+ { heading: 'Test', reason: 'Testing', retiredAt: '2026-04-01T00:00:00.000Z' },
77
+ ];
78
+ writeRetiredLessons(tmpDir, entries);
79
+ const raw = fs.readFileSync(path.join(tmpDir, 'retired-lessons.json'), 'utf-8');
80
+ // 2-space indent produces " " before keys
81
+ expect(raw).toContain(' "heading"');
82
+ expect(raw.endsWith('\n')).toBe(true);
83
+ });
84
+ });
85
+ // ─── isRetiredHeading ───────────────────────────────────
86
+ describe('isRetiredHeading', () => {
87
+ const retired = [
88
+ { heading: 'Avoid eval()', reason: 'Too broad', retiredAt: '2026-04-01T00:00:00.000Z' },
89
+ { heading: 'Use strict mode', reason: 'Duplicate', retiredAt: '2026-04-02T00:00:00.000Z' },
90
+ ];
91
+ it('matches exact heading', () => {
92
+ expect(isRetiredHeading('Avoid eval()', retired)).toBe(true);
93
+ });
94
+ it('matches case-insensitively', () => {
95
+ expect(isRetiredHeading('AVOID EVAL()', retired)).toBe(true);
96
+ expect(isRetiredHeading('use STRICT mode', retired)).toBe(true);
97
+ });
98
+ it('does not match when headings only partially overlap', () => {
99
+ expect(isRetiredHeading('Always Avoid eval() in production code', retired)).toBe(false);
100
+ expect(isRetiredHeading('strict mode', retired)).toBe(false);
101
+ });
102
+ it('returns false for empty or whitespace-only headings', () => {
103
+ expect(isRetiredHeading('', retired)).toBe(false);
104
+ expect(isRetiredHeading(' ', retired)).toBe(false);
105
+ });
106
+ it('returns false for unrelated headings', () => {
107
+ expect(isRetiredHeading('Prefer const over let', retired)).toBe(false);
108
+ expect(isRetiredHeading('Enable TypeScript strict', retired)).toBe(false);
109
+ });
110
+ });
111
+ //# sourceMappingURL=retired-lessons.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retired-lessons.test.js","sourceRoot":"","sources":["../src/retired-lessons.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/totem",
3
- "version": "1.10.0",
3
+ "version": "1.10.2",
4
4
  "description": "Persistent memory and context layer for AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -55,7 +55,8 @@
55
55
  "url": "https://github.com/mmnto-ai/totem/issues"
56
56
  },
57
57
  "publishConfig": {
58
- "access": "public"
58
+ "access": "public",
59
+ "provenance": true
59
60
  },
60
61
  "scripts": {
61
62
  "build": "tsc",