@mmnto/mcp 1.13.0 → 1.14.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/context.d.ts +58 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +220 -6
- package/dist/context.js.map +1 -1
- package/dist/context.test.js +108 -2
- package/dist/context.test.js.map +1 -1
- package/dist/smoke-test.d.ts +2 -0
- package/dist/smoke-test.d.ts.map +1 -0
- package/dist/smoke-test.js +196 -0
- package/dist/smoke-test.js.map +1 -0
- package/dist/tools/add-lesson.d.ts.map +1 -1
- package/dist/tools/add-lesson.js +35 -2
- package/dist/tools/add-lesson.js.map +1 -1
- package/dist/tools/add-lesson.test.js +112 -0
- package/dist/tools/add-lesson.test.js.map +1 -1
- package/dist/tools/search-knowledge.d.ts +6 -0
- package/dist/tools/search-knowledge.d.ts.map +1 -1
- package/dist/tools/search-knowledge.js +493 -40
- package/dist/tools/search-knowledge.js.map +1 -1
- package/dist/tools/search-knowledge.test.js +901 -56
- package/dist/tools/search-knowledge.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/* eslint-disable no-console -- standalone CLI utility, not an MCP stdio file.
|
|
2
|
+
* The no-console rule exists to prevent breaking the MCP stdio protocol
|
|
3
|
+
* where stdout writes corrupt the wire format. This file is invoked
|
|
4
|
+
* directly via `node packages/mcp/dist/smoke-test.js` and console output
|
|
5
|
+
* is the entire point — it IS the result capture mechanism for the
|
|
6
|
+
* Phase 3 empirical proof. Scoped file-level exception.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Cross-Repo Context Mesh smoke test (mmnto/totem#1294 Phase 3).
|
|
10
|
+
*
|
|
11
|
+
* Manual integration test that spins up a real ServerContext against the
|
|
12
|
+
* current cwd's totem.config.ts, validates every linked index initialized
|
|
13
|
+
* correctly, runs a real federated search_knowledge query across primary
|
|
14
|
+
* + linked stores, and prints formatted output showing:
|
|
15
|
+
*
|
|
16
|
+
* - Which linked stores loaded vs which failed (with init errors)
|
|
17
|
+
* - How many chunks each store holds
|
|
18
|
+
* - The top-N merged results with `[sourceRepo]` tags and absolute paths
|
|
19
|
+
* - A per-store score breakdown so reviewers can verify federation
|
|
20
|
+
* actually interleaves results from multiple repos
|
|
21
|
+
*
|
|
22
|
+
* This is NOT part of the automated test suite — it requires:
|
|
23
|
+
* 1. A real `.lancedb/` in the primary repo (rebuilt via `totem sync`)
|
|
24
|
+
* 2. `linkedIndexes` configured in `totem.config.ts` pointing at real paths
|
|
25
|
+
* 3. Each linked path to be a fully-synced Totem-managed directory
|
|
26
|
+
* 4. `GEMINI_API_KEY` (or equivalent) in the environment for live query
|
|
27
|
+
* embedding
|
|
28
|
+
*
|
|
29
|
+
* Invoke after building the mcp package:
|
|
30
|
+
* pnpm --filter @mmnto/mcp build
|
|
31
|
+
* node packages/mcp/dist/smoke-test.js
|
|
32
|
+
*
|
|
33
|
+
* Captures its own output to stdout so a caller can redirect to a file or
|
|
34
|
+
* pipe the result into a PR body. Exits non-zero on any failure (broken
|
|
35
|
+
* init, zero results, or the context throwing) so CI / reviewers can use
|
|
36
|
+
* it as a binary pass/fail signal.
|
|
37
|
+
*/
|
|
38
|
+
import { getContext } from './context.js';
|
|
39
|
+
const QUERY = 'cross-repo context mesh federation linked totems';
|
|
40
|
+
const CONSOLE_DIVIDER_WIDTH = 78;
|
|
41
|
+
const CONTENT_PREVIEW_MAX_CHARS = 120;
|
|
42
|
+
function formatResults(results) {
|
|
43
|
+
return results.map((r, i) => ({
|
|
44
|
+
rank: i + 1,
|
|
45
|
+
source: r.sourceRepo ?? 'primary',
|
|
46
|
+
label: r.label,
|
|
47
|
+
score: r.score.toFixed(3),
|
|
48
|
+
path: r.sourceRepo ? r.absoluteFilePath : r.filePath,
|
|
49
|
+
contentPreview: r.content.slice(0, CONTENT_PREVIEW_MAX_CHARS).replace(/\s+/g, ' ').trim() + '...',
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
async function main() {
|
|
53
|
+
console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
|
|
54
|
+
console.log('Cross-Repo Context Mesh — smoke test (mmnto/totem#1294 Phase 3)');
|
|
55
|
+
console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
|
|
56
|
+
console.log();
|
|
57
|
+
// Capture init timing — helps prove the eager-init path doesn't block
|
|
58
|
+
// forever on broken links
|
|
59
|
+
const initStart = Date.now();
|
|
60
|
+
const ctx = await getContext();
|
|
61
|
+
const initMs = Date.now() - initStart;
|
|
62
|
+
console.log(`Primary repo: ${ctx.projectRoot}`);
|
|
63
|
+
console.log(`Init wall time: ${initMs}ms`);
|
|
64
|
+
console.log(`Linked stores loaded: ${ctx.linkedStores.size}`);
|
|
65
|
+
console.log(`Linked init errors: ${ctx.linkedStoreInitErrors.size}`);
|
|
66
|
+
console.log();
|
|
67
|
+
// Report primary chunk count — sanity check that the primary store loaded
|
|
68
|
+
const primaryCount = await ctx.store.count();
|
|
69
|
+
console.log(`Primary chunks: ${primaryCount.toLocaleString()}`);
|
|
70
|
+
if (ctx.linkedStores.size > 0) {
|
|
71
|
+
console.log();
|
|
72
|
+
console.log('Linked stores:');
|
|
73
|
+
for (const [name, store] of ctx.linkedStores.entries()) {
|
|
74
|
+
const count = await store.count();
|
|
75
|
+
console.log(` [${name}]: ${count.toLocaleString()} chunks`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (ctx.linkedStoreInitErrors.size > 0) {
|
|
79
|
+
console.log();
|
|
80
|
+
console.log('Linked init errors:');
|
|
81
|
+
for (const [name, err] of ctx.linkedStoreInitErrors.entries()) {
|
|
82
|
+
console.log(` [${name}]: ${err}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (ctx.linkedStores.size === 0) {
|
|
86
|
+
console.log();
|
|
87
|
+
console.log('WARNING: No linked stores initialized. This smoke test cannot');
|
|
88
|
+
console.log('demonstrate cross-repo federation without at least one linked');
|
|
89
|
+
console.log('store. Check totem.config.ts for linkedIndexes entries.');
|
|
90
|
+
// Use exitCode + early return instead of process.exit() so buffered
|
|
91
|
+
// stdout (the tail logs above) flushes before the process terminates.
|
|
92
|
+
// This matters because the smoke test is piped into the PR body.
|
|
93
|
+
// (mmnto/totem#1295 CR minor)
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// ─── Run the federated query ──────────────────────────────
|
|
98
|
+
//
|
|
99
|
+
// Fire primary + all linked stores in parallel — mirroring the exact
|
|
100
|
+
// pattern federatedSearch uses in search-knowledge.ts. Each store gets
|
|
101
|
+
// an equal per-store fetch budget.
|
|
102
|
+
console.log();
|
|
103
|
+
console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
|
|
104
|
+
console.log(`Query: "${QUERY}"`);
|
|
105
|
+
console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
|
|
106
|
+
console.log();
|
|
107
|
+
const queryStart = Date.now();
|
|
108
|
+
const perStoreLimit = 5;
|
|
109
|
+
const finalLimit = 10;
|
|
110
|
+
const primaryPromise = ctx.store.search({
|
|
111
|
+
query: QUERY,
|
|
112
|
+
maxResults: perStoreLimit,
|
|
113
|
+
});
|
|
114
|
+
const linkedPromises = Array.from(ctx.linkedStores.entries()).map(([name, ls]) => ls.search({ query: QUERY, maxResults: perStoreLimit }).catch((err) => {
|
|
115
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
116
|
+
console.log(` [${name}] search failed: ${msg}`);
|
|
117
|
+
return [];
|
|
118
|
+
}));
|
|
119
|
+
const [primaryResults, ...linkedResults] = await Promise.all([primaryPromise, ...linkedPromises]);
|
|
120
|
+
const queryMs = Date.now() - queryStart;
|
|
121
|
+
// Merge by semantic score (descending) and truncate — same pattern as
|
|
122
|
+
// federatedSearch in search-knowledge.ts
|
|
123
|
+
const merged = [...primaryResults, ...linkedResults.flat()];
|
|
124
|
+
merged.sort((a, b) => (b.score ?? 0) - (a.score ?? 0));
|
|
125
|
+
const topResults = merged.slice(0, finalLimit);
|
|
126
|
+
// Per-store breakdown for the PR body
|
|
127
|
+
const primaryHits = primaryResults.length;
|
|
128
|
+
const linkedHitsByName = new Map();
|
|
129
|
+
for (const name of ctx.linkedStores.keys()) {
|
|
130
|
+
linkedHitsByName.set(name, 0);
|
|
131
|
+
}
|
|
132
|
+
for (const r of merged) {
|
|
133
|
+
if (r.sourceRepo) {
|
|
134
|
+
linkedHitsByName.set(r.sourceRepo, (linkedHitsByName.get(r.sourceRepo) ?? 0) + 1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
console.log(`Query wall time: ${queryMs}ms`);
|
|
138
|
+
console.log(`Primary hits: ${primaryHits}`);
|
|
139
|
+
for (const [name, count] of linkedHitsByName.entries()) {
|
|
140
|
+
console.log(`Linked hits [${name}]: ${count}`);
|
|
141
|
+
}
|
|
142
|
+
console.log(`Merged pool size: ${merged.length}`);
|
|
143
|
+
console.log(`Top returned: ${topResults.length}`);
|
|
144
|
+
console.log();
|
|
145
|
+
// ─── Formatted results ────────────────────────────────────
|
|
146
|
+
if (topResults.length === 0) {
|
|
147
|
+
console.log('NO RESULTS. The query returned zero matches from primary or linked.');
|
|
148
|
+
console.log('This likely means the indexes are not synced or the query is too narrow.');
|
|
149
|
+
process.exitCode = 1;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const formatted = formatResults(topResults);
|
|
153
|
+
console.log('Top-ranked results (interleaved by semantic score):');
|
|
154
|
+
console.log();
|
|
155
|
+
for (const r of formatted) {
|
|
156
|
+
console.log(`${r.rank}. [${r.source}] ${r.label}`);
|
|
157
|
+
console.log(` Score: ${r.score}`);
|
|
158
|
+
console.log(` Path: ${r.path}`);
|
|
159
|
+
console.log(` Preview: ${r.contentPreview}`);
|
|
160
|
+
console.log();
|
|
161
|
+
}
|
|
162
|
+
// ─── Pass/fail signal ─────────────────────────────────────
|
|
163
|
+
// Success conditions:
|
|
164
|
+
// 1. Init had zero errors (all linked stores loaded cleanly)
|
|
165
|
+
// 2. At least one linked store returned hits
|
|
166
|
+
// 3. Merge produced an interleaved result set (not just primary or just linked)
|
|
167
|
+
//
|
|
168
|
+
// Note: `linkedStoreInitErrors` (populated by `initContext()` in context.ts)
|
|
169
|
+
// includes empty linked stores as non-fatal warnings — they'd be served as
|
|
170
|
+
// an empty federation in production but here they fail the smoke test,
|
|
171
|
+
// because an empty store can't prove cross-repo federation actually works.
|
|
172
|
+
// (mmnto/totem#1295 CR clarification)
|
|
173
|
+
const hasLinkedHits = Array.from(linkedHitsByName.values()).some((n) => n > 0);
|
|
174
|
+
const hasPrimaryHits = primaryHits > 0;
|
|
175
|
+
const zeroInitErrors = ctx.linkedStoreInitErrors.size === 0;
|
|
176
|
+
console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
|
|
177
|
+
console.log('Smoke test verdict:');
|
|
178
|
+
console.log(` Zero init errors: ${zeroInitErrors ? 'PASS' : 'FAIL'}`);
|
|
179
|
+
console.log(` Primary returned hits: ${hasPrimaryHits ? 'PASS' : 'FAIL'}`);
|
|
180
|
+
console.log(` Linked returned hits: ${hasLinkedHits ? 'PASS' : 'FAIL'}`);
|
|
181
|
+
console.log('='.repeat(CONSOLE_DIVIDER_WIDTH));
|
|
182
|
+
const verdict = zeroInitErrors && hasPrimaryHits && hasLinkedHits;
|
|
183
|
+
console.log();
|
|
184
|
+
console.log(verdict ? 'SMOKE TEST: PASS' : 'SMOKE TEST: FAIL');
|
|
185
|
+
if (!verdict)
|
|
186
|
+
process.exitCode = 1;
|
|
187
|
+
}
|
|
188
|
+
main().catch((err) => {
|
|
189
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
190
|
+
const stack = err instanceof Error ? err.stack : undefined;
|
|
191
|
+
console.error('Smoke test threw:', msg);
|
|
192
|
+
if (stack)
|
|
193
|
+
console.error(stack);
|
|
194
|
+
process.exitCode = 1;
|
|
195
|
+
});
|
|
196
|
+
//# sourceMappingURL=smoke-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smoke-test.js","sourceRoot":"","sources":["../src/smoke-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-lesson.d.ts","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAyGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"add-lesson.d.ts","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,6EAA6E;AAC7E,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAyGD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwJzD"}
|
package/dist/tools/add-lesson.js
CHANGED
|
@@ -158,13 +158,46 @@ export function registerAddLesson(server) {
|
|
|
158
158
|
.map((t) => sanitize(t).replace(/[\n,]/g, ' ').trim())
|
|
159
159
|
.filter(Boolean)
|
|
160
160
|
.join(', ') || 'untagged';
|
|
161
|
-
|
|
161
|
+
// --- Double-heading guard (#1284) ---
|
|
162
|
+
// If the caller supplies a pre-formatted lesson whose body already
|
|
163
|
+
// starts with a canonical `## Lesson — Foo` heading, extract the
|
|
164
|
+
// heading and strip it from the body. Without this, `generateLessonHeading`
|
|
165
|
+
// would derive a title from the "Lesson — Foo" text and produce
|
|
166
|
+
// `## Lesson — Lesson — Foo`, and the original heading would remain
|
|
167
|
+
// inside the body — yielding two `## Lesson — ...` lines in one file
|
|
168
|
+
// that the parser then counts as two separate lessons.
|
|
169
|
+
// The separator class matches em-dash (\u2014), en-dash (\u2013), and
|
|
170
|
+
// hyphen, consistent with the parser's LESSON_HEADING_RE in #1278.
|
|
171
|
+
// The terminator allows either trailing newlines OR end-of-string so
|
|
172
|
+
// a single-line input like `## Lesson — Foo` (no body, no trailing
|
|
173
|
+
// newline) still gets normalized instead of slipping through.
|
|
174
|
+
// Leading `\s*` absorbs blank lines or whitespace before the heading
|
|
175
|
+
// (LLM callers sometimes emit pre-formatted lessons with a leading
|
|
176
|
+
// newline). Case sensitivity intentionally matches the parser's
|
|
177
|
+
// canonical form in core/drift-detector.ts — if we accepted lowercase
|
|
178
|
+
// here we would strip a line the parser would still treat as body
|
|
179
|
+
// text, breaking round-trip semantics.
|
|
180
|
+
// `matchAll` + iterator instead of `match` to satisfy the project-wide
|
|
181
|
+
// lint rule about iterating all regex matches — the `^` anchor ensures
|
|
182
|
+
// at most one match here regardless.
|
|
183
|
+
const LESSON_HEADING_RE = /^\s*## Lesson[\s\u2014\u2013-]+(.+?)(?:\s*\n+|\s*$)/g;
|
|
184
|
+
const headingMatch = safeLesson.matchAll(LESSON_HEADING_RE).next().value;
|
|
185
|
+
let rawHeading;
|
|
186
|
+
let bodyContent;
|
|
187
|
+
if (headingMatch) {
|
|
188
|
+
rawHeading = headingMatch[1];
|
|
189
|
+
bodyContent = safeLesson.slice(headingMatch[0].length).trim();
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
rawHeading = generateLessonHeading(safeLesson);
|
|
193
|
+
bodyContent = safeLesson.trim();
|
|
194
|
+
}
|
|
162
195
|
const heading = sanitizeHeading(rawHeading);
|
|
163
196
|
// --- Source provenance (#844) ---
|
|
164
197
|
const provenance = `\n**Source:** mcp (added at ${new Date().toISOString()})`;
|
|
165
198
|
const entry = `## Lesson — ${heading}\n\n` +
|
|
166
199
|
`**Tags:** ${safeTags}\n\n` +
|
|
167
|
-
`${
|
|
200
|
+
`${bodyContent}\n` +
|
|
168
201
|
provenance;
|
|
169
202
|
// Acquire lock before writing lesson, release before spawning sync
|
|
170
203
|
// (the spawned sync process acquires its own lock via runSync/withLock)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-lesson.js","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"add-lesson.js","sourceRoot":"","sources":["../../src/tools/add-lesson.ts"],"names":[],"mappings":"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"}
|
|
@@ -156,4 +156,116 @@ describe('add_lesson auth model (#844)', () => {
|
|
|
156
156
|
expect(typeof opts.shell).toBe('boolean');
|
|
157
157
|
});
|
|
158
158
|
});
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Double-heading bug (#1284)
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
describe('add_lesson double-heading guard (#1284)', () => {
|
|
163
|
+
let handle;
|
|
164
|
+
beforeEach(() => {
|
|
165
|
+
_resetRateLimit();
|
|
166
|
+
lastWrittenEntry = '';
|
|
167
|
+
handle = setup();
|
|
168
|
+
});
|
|
169
|
+
/** Count occurrences of `## Lesson —` (all dash variants) in a string. */
|
|
170
|
+
function countLessonHeadings(entry) {
|
|
171
|
+
const matches = entry.match(/^## Lesson[\s\u2014\u2013-]+/gm);
|
|
172
|
+
return matches ? matches.length : 0;
|
|
173
|
+
}
|
|
174
|
+
it('does not duplicate heading when body starts with canonical em-dash heading', async () => {
|
|
175
|
+
await handle({
|
|
176
|
+
lesson: '## Lesson — Read-path schema changes break write-path invariants\n\nWhen modifying parsing logic that produces a data structure, also consider the writers.',
|
|
177
|
+
context_tags: ['architecture'],
|
|
178
|
+
});
|
|
179
|
+
expect(countLessonHeadings(lastWrittenEntry)).toBe(1);
|
|
180
|
+
expect(lastWrittenEntry).toContain('## Lesson — Read-path schema changes break write-path invariants');
|
|
181
|
+
// And the auto-generated duplicate must not appear
|
|
182
|
+
expect(lastWrittenEntry).not.toContain('## Lesson — Lesson —');
|
|
183
|
+
});
|
|
184
|
+
it('handles en-dash heading variant', async () => {
|
|
185
|
+
await handle({
|
|
186
|
+
lesson: '## Lesson – Use err in catch blocks\n\nDo not use error in catch blocks.',
|
|
187
|
+
context_tags: ['style'],
|
|
188
|
+
});
|
|
189
|
+
expect(countLessonHeadings(lastWrittenEntry)).toBe(1);
|
|
190
|
+
});
|
|
191
|
+
it('handles hyphen heading variant', async () => {
|
|
192
|
+
await handle({
|
|
193
|
+
lesson: '## Lesson - Plain hyphen variant\n\nBody text here.',
|
|
194
|
+
context_tags: ['test'],
|
|
195
|
+
});
|
|
196
|
+
expect(countLessonHeadings(lastWrittenEntry)).toBe(1);
|
|
197
|
+
});
|
|
198
|
+
it('preserves existing behavior when body does NOT start with a heading', async () => {
|
|
199
|
+
await handle({
|
|
200
|
+
lesson: 'Always validate input at trust boundaries. This is a plain lesson body with no heading.',
|
|
201
|
+
context_tags: ['security'],
|
|
202
|
+
});
|
|
203
|
+
// Exactly one heading should still be generated (by the auto-path)
|
|
204
|
+
expect(countLessonHeadings(lastWrittenEntry)).toBe(1);
|
|
205
|
+
expect(lastWrittenEntry).toContain('## Lesson — ');
|
|
206
|
+
});
|
|
207
|
+
it('strips the pre-existing heading from the body so it is not included twice in content', async () => {
|
|
208
|
+
await handle({
|
|
209
|
+
lesson: '## Lesson — First heading\n\nBody line one.\nBody line two.',
|
|
210
|
+
context_tags: ['test'],
|
|
211
|
+
});
|
|
212
|
+
// The body portion of the entry should contain "Body line one" and "Body line two"
|
|
213
|
+
// but should NOT contain the verbatim "## Lesson — First heading" line anywhere
|
|
214
|
+
// below the first line of the file.
|
|
215
|
+
const lines = lastWrittenEntry.split('\n');
|
|
216
|
+
const headingLineCount = lines.filter((l) => /^## Lesson[\s\u2014\u2013-]+/.test(l)).length;
|
|
217
|
+
expect(headingLineCount).toBe(1);
|
|
218
|
+
expect(lastWrittenEntry).toContain('Body line one.');
|
|
219
|
+
expect(lastWrittenEntry).toContain('Body line two.');
|
|
220
|
+
});
|
|
221
|
+
it('still applies tags and provenance when body has a pre-existing heading', async () => {
|
|
222
|
+
await handle({
|
|
223
|
+
lesson: '## Lesson — Heading here\n\nBody content.',
|
|
224
|
+
context_tags: ['tag-one', 'tag-two'],
|
|
225
|
+
});
|
|
226
|
+
expect(lastWrittenEntry).toContain('**Tags:** tag-one, tag-two');
|
|
227
|
+
expect(lastWrittenEntry).toContain('**Source:** mcp (added at ');
|
|
228
|
+
});
|
|
229
|
+
it('handles single-line lesson without trailing newline', async () => {
|
|
230
|
+
// Shield caught this edge case: if the caller sends just `## Lesson — Foo`
|
|
231
|
+
// with no body and no trailing newline, the earlier regex variant that
|
|
232
|
+
// required `\n+` at the end would fall through and produce a double heading.
|
|
233
|
+
await handle({
|
|
234
|
+
lesson: '## Lesson — Single line no body',
|
|
235
|
+
context_tags: ['edge-case'],
|
|
236
|
+
});
|
|
237
|
+
expect(countLessonHeadings(lastWrittenEntry)).toBe(1);
|
|
238
|
+
expect(lastWrittenEntry).toContain('## Lesson — Single line no body');
|
|
239
|
+
expect(lastWrittenEntry).not.toContain('## Lesson — Lesson');
|
|
240
|
+
});
|
|
241
|
+
it('handles pre-formatted lesson with leading blank lines or whitespace', async () => {
|
|
242
|
+
// Both GCA and CR flagged that a caller (especially an LLM) could emit
|
|
243
|
+
// a pre-formatted lesson prefixed by blank lines or leading whitespace.
|
|
244
|
+
// Without ^\s* the detection would miss it, fall through to the auto-title
|
|
245
|
+
// path, and reproduce the double-heading bug.
|
|
246
|
+
await handle({
|
|
247
|
+
lesson: '\n\n## Lesson — Leading whitespace variant\n\nBody content.',
|
|
248
|
+
context_tags: ['test'],
|
|
249
|
+
});
|
|
250
|
+
expect(countLessonHeadings(lastWrittenEntry)).toBe(1);
|
|
251
|
+
expect(lastWrittenEntry).toContain('## Lesson — Leading whitespace variant');
|
|
252
|
+
expect(lastWrittenEntry).not.toContain('## Lesson — Lesson');
|
|
253
|
+
});
|
|
254
|
+
it('does NOT treat lowercase "## lesson" as a canonical heading', async () => {
|
|
255
|
+
// Stay case-sensitive to match the parser's LESSON_HEADING_RE
|
|
256
|
+
// (`^## Lesson [—–-] ` with capital L) in core/drift-detector.ts.
|
|
257
|
+
// If we accepted lowercase here we would strip a line the parser would
|
|
258
|
+
// treat as body text, breaking round-trip semantics. The fallback path
|
|
259
|
+
// generates a title from the full body and the lowercase line is
|
|
260
|
+
// preserved verbatim inside the written entry.
|
|
261
|
+
await handle({
|
|
262
|
+
lesson: '## lesson — not canonical heading\nSome body.',
|
|
263
|
+
context_tags: ['test'],
|
|
264
|
+
});
|
|
265
|
+
// Exactly one canonical "## Lesson" line at the top — and the original
|
|
266
|
+
// lowercase line is preserved verbatim in the body (not stripped).
|
|
267
|
+
expect(countLessonHeadings(lastWrittenEntry)).toBe(1);
|
|
268
|
+
expect(lastWrittenEntry).toContain('## lesson — not canonical heading');
|
|
269
|
+
});
|
|
270
|
+
});
|
|
159
271
|
//# sourceMappingURL=add-lesson.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-lesson.test.js","sourceRoot":"","sources":["../../src/tools/add-lesson.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"add-lesson.test.js","sourceRoot":"","sources":["../../src/tools/add-lesson.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reset both session flags. Test-only export — production code should never
|
|
4
|
+
* call this. Allows test suites to exercise the first-query behaviors
|
|
5
|
+
* repeatedly across individual test cases.
|
|
6
|
+
*/
|
|
7
|
+
export declare function _resetSessionFlags(): void;
|
|
2
8
|
export declare function registerSearchKnowledge(server: McpServer): void;
|
|
3
9
|
//# sourceMappingURL=search-knowledge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"search-knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/search-knowledge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwCzE;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAsgBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6K/D"}
|