@mmnto/totem 0.15.0 → 0.16.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.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lesson-format.d.ts +7 -0
- package/dist/lesson-format.d.ts.map +1 -0
- package/dist/lesson-format.js +44 -0
- package/dist/lesson-format.js.map +1 -0
- package/dist/lesson-format.test.d.ts +2 -0
- package/dist/lesson-format.test.d.ts.map +1 -0
- package/dist/lesson-format.test.js +49 -0
- package/dist/lesson-format.test.js.map +1 -0
- package/dist/sanitize.d.ts +2 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +6 -0
- package/dist/sanitize.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -9,5 +9,7 @@ export { TOTEM_TABLE_NAME } from './store/lance-schema.js';
|
|
|
9
9
|
export { LanceStore } from './store/lance-store.js';
|
|
10
10
|
export type { ResolvedFile } from './ingest/sync.js';
|
|
11
11
|
export { getChangedFiles, getHeadSha, resolveFiles, runSync } from './ingest/sync.js';
|
|
12
|
+
export { generateLessonHeading } from './lesson-format.js';
|
|
13
|
+
export { sanitize } from './sanitize.js';
|
|
12
14
|
export { wrapXml } from './xml-format.js';
|
|
13
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,KAAK,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGtF,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,KAAK,EACL,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,5 +6,7 @@ export { TOTEM_TABLE_NAME } from './store/lance-schema.js';
|
|
|
6
6
|
export { LanceStore } from './store/lance-store.js';
|
|
7
7
|
export { getChangedFiles, getHeadSha, resolveFiles, runSync } from './ingest/sync.js';
|
|
8
8
|
// Utilities
|
|
9
|
+
export { generateLessonHeading } from './lesson-format.js';
|
|
10
|
+
export { sanitize } from './sanitize.js';
|
|
9
11
|
export { wrapXml } from './xml-format.js';
|
|
10
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAc5B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEtF,YAAY;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAc5B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEtF,YAAY;AACZ,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a descriptive lesson heading from the lesson body.
|
|
3
|
+
* Strips markdown formatting, extracts the first sentence or line,
|
|
4
|
+
* and truncates to HEADING_MAX_CHARS.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateLessonHeading(body: string): string;
|
|
7
|
+
//# sourceMappingURL=lesson-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lesson-format.d.ts","sourceRoot":"","sources":["../src/lesson-format.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoC1D"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const HEADING_MAX_CHARS = 60;
|
|
2
|
+
const MIN_WORD_BREAK = 20;
|
|
3
|
+
/**
|
|
4
|
+
* Generate a descriptive lesson heading from the lesson body.
|
|
5
|
+
* Strips markdown formatting, extracts the first sentence or line,
|
|
6
|
+
* and truncates to HEADING_MAX_CHARS.
|
|
7
|
+
*/
|
|
8
|
+
export function generateLessonHeading(body) {
|
|
9
|
+
// Strip markdown formatting: bold, italic, headings, blockquotes, code fences
|
|
10
|
+
let text = body
|
|
11
|
+
.replace(/^```[\s\S]*?```/gm, '') // code blocks
|
|
12
|
+
.replace(/^#+\s*/gm, '') // headings
|
|
13
|
+
.replace(/^>\s*/gm, '') // blockquotes
|
|
14
|
+
.replace(/\*\*(.+?)\*\*/g, '$1') // bold
|
|
15
|
+
.replace(/\*(.+?)\*/g, '$1') // italic
|
|
16
|
+
.replace(/`([^`]+)`/g, '$1') // inline code
|
|
17
|
+
.replace(/^\s*[-*]\s+/gm, '') // list markers
|
|
18
|
+
.trim();
|
|
19
|
+
// If structured (Context/Symptom/Fix), prefer the Fix/Rule line
|
|
20
|
+
const fixMatch = text.match(/(?:Fix\/)?Rule:\s*(.+)/i);
|
|
21
|
+
if (fixMatch) {
|
|
22
|
+
text = fixMatch[1].trim();
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// Take the first non-empty line
|
|
26
|
+
const firstLine = text.split('\n').find((l) => l.trim());
|
|
27
|
+
text = firstLine?.trim() ?? '';
|
|
28
|
+
}
|
|
29
|
+
if (!text)
|
|
30
|
+
return 'Lesson';
|
|
31
|
+
// Truncate at sentence boundary or max chars
|
|
32
|
+
const sentenceEnd = text.search(/[.!?]\s/);
|
|
33
|
+
if (sentenceEnd > 0 && sentenceEnd < HEADING_MAX_CHARS) {
|
|
34
|
+
text = text.slice(0, sentenceEnd + 1);
|
|
35
|
+
}
|
|
36
|
+
else if (text.length > HEADING_MAX_CHARS) {
|
|
37
|
+
// Break at last word boundary before limit
|
|
38
|
+
const truncated = text.slice(0, HEADING_MAX_CHARS);
|
|
39
|
+
const lastSpace = truncated.lastIndexOf(' ');
|
|
40
|
+
text = (lastSpace > MIN_WORD_BREAK ? truncated.slice(0, lastSpace) : truncated) + '…';
|
|
41
|
+
}
|
|
42
|
+
return text;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=lesson-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lesson-format.js","sourceRoot":"","sources":["../src/lesson-format.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,8EAA8E;IAC9E,IAAI,IAAI,GAAG,IAAI;SACZ,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,cAAc;SAC/C,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,WAAW;SACnC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,cAAc;SACrC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,OAAO;SACvC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,SAAS;SACrC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,cAAc;SAC1C,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,eAAe;SAC5C,IAAI,EAAE,CAAC;IAEV,gEAAgE;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAE3B,6CAA6C;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,iBAAiB,EAAE,CAAC;QACvD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QAC3C,2CAA2C;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,GAAG,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;IACxF,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lesson-format.test.d.ts","sourceRoot":"","sources":["../src/lesson-format.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { generateLessonHeading } from './lesson-format.js';
|
|
3
|
+
describe('generateLessonHeading', () => {
|
|
4
|
+
it('extracts first sentence from plain text', () => {
|
|
5
|
+
expect(generateLessonHeading('Always use strict mode. It catches bugs early.')).toBe('Always use strict mode.');
|
|
6
|
+
});
|
|
7
|
+
it('uses full text when short enough and no sentence boundary', () => {
|
|
8
|
+
expect(generateLessonHeading('Use strict mode')).toBe('Use strict mode');
|
|
9
|
+
});
|
|
10
|
+
it('truncates long text at word boundary with ellipsis', () => {
|
|
11
|
+
const long = 'This is a very long lesson that goes on and on and on without any sentence boundary for quite a while';
|
|
12
|
+
const heading = generateLessonHeading(long);
|
|
13
|
+
expect(heading.length).toBeLessThanOrEqual(65); // 60 + ellipsis + possible word
|
|
14
|
+
expect(heading).toContain('…');
|
|
15
|
+
});
|
|
16
|
+
it('strips markdown bold formatting', () => {
|
|
17
|
+
expect(generateLessonHeading('**Always** use strict mode')).toBe('Always use strict mode');
|
|
18
|
+
});
|
|
19
|
+
it('strips markdown heading prefixes', () => {
|
|
20
|
+
expect(generateLessonHeading('### Important rule here')).toBe('Important rule here');
|
|
21
|
+
});
|
|
22
|
+
it('strips blockquote prefixes', () => {
|
|
23
|
+
expect(generateLessonHeading('> Never trust raw input')).toBe('Never trust raw input');
|
|
24
|
+
});
|
|
25
|
+
it('strips inline code backticks', () => {
|
|
26
|
+
expect(generateLessonHeading('Use `const` instead of `let`')).toBe('Use const instead of let');
|
|
27
|
+
});
|
|
28
|
+
it('strips code blocks and uses remaining text', () => {
|
|
29
|
+
const body = '```typescript\nconst x = 1;\n```\nAlways initialize variables.';
|
|
30
|
+
expect(generateLessonHeading(body)).toBe('Always initialize variables.');
|
|
31
|
+
});
|
|
32
|
+
it('prefers Fix/Rule line in structured lessons', () => {
|
|
33
|
+
const body = '**Context:** Trying to persist state\n**Symptom:** App crashes\n**Fix/Rule:** Use custom localStorage wrappers';
|
|
34
|
+
expect(generateLessonHeading(body)).toBe('Use custom localStorage wrappers');
|
|
35
|
+
});
|
|
36
|
+
it('returns fallback for empty body', () => {
|
|
37
|
+
expect(generateLessonHeading('')).toBe('Lesson');
|
|
38
|
+
});
|
|
39
|
+
it('returns fallback for whitespace-only body', () => {
|
|
40
|
+
expect(generateLessonHeading(' \n\n ')).toBe('Lesson');
|
|
41
|
+
});
|
|
42
|
+
it('handles body that is only a code block', () => {
|
|
43
|
+
expect(generateLessonHeading('```\ncode\n```')).toBe('Lesson');
|
|
44
|
+
});
|
|
45
|
+
it('strips list markers', () => {
|
|
46
|
+
expect(generateLessonHeading('- Always validate input')).toBe('Always validate input');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=lesson-format.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lesson-format.test.js","sourceRoot":"","sources":["../src/lesson-format.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAIA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C"}
|
package/dist/sanitize.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Strip ANSI escape sequences, control characters, and BiDi overrides to prevent terminal injection. */
|
|
2
|
+
const CONTROL_RE = /\x1b\[[0-9;]*[a-zA-Z]|\x1b\].*?(?:\x07|\x1b\\)|[\x00-\x08\x0b-\x1f\x7f\x80-\x9f]|[\u202A-\u202E\u2066-\u2069]/g;
|
|
3
|
+
export function sanitize(text) {
|
|
4
|
+
return text.replace(CONTROL_RE, '');
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,MAAM,UAAU,GACd,gHAAgH,CAAC;AAEnH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC"}
|