Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bin/knowledge-mcp.js
Original file line number Diff line number Diff line change
Expand Up @@ -16360,7 +16360,7 @@ function resolveKnowledgeModeSelection(env = process.env) {
normalized = normalizeStorageMode3(value);
} catch (error51) {
const message = error51 instanceof Error ? error51.message : String(error51);
throw new Error(`knowledge: ${name}=${value} is not a valid mode. ${message}`);
throw new Error(`knowledge: ${name}=${value} is not a valid mode. ${message} ` + `Unset ${name} to use the default sqlite backend, or set ${name}=sqlite or ${name}=postgres.`);
}
const warnings = [];
if (name !== canonicalModeKey) {
Expand Down
2 changes: 1 addition & 1 deletion bin/knowledge.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16458,7 +16458,7 @@ function resolveKnowledgeModeSelection(env = process.env) {
normalized = normalizeStorageMode3(value);
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
throw new Error(`knowledge: ${name}=${value} is not a valid mode. ${message}`);
throw new Error(`knowledge: ${name}=${value} is not a valid mode. ${message} ` + `Unset ${name} to use the default sqlite backend, or set ${name}=sqlite or ${name}=postgres.`);
}
const warnings = [];
if (name !== canonicalModeKey) {
Expand Down
2 changes: 1 addition & 1 deletion dist/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -1588,7 +1588,7 @@ function resolveKnowledgeModeSelection(env = process.env) {
normalized = normalizeStorageMode3(value);
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
throw new Error(`knowledge: ${name}=${value} is not a valid mode. ${message}`);
throw new Error(`knowledge: ${name}=${value} is not a valid mode. ${message} ` + `Unset ${name} to use the default sqlite backend, or set ${name}=sqlite or ${name}=postgres.`);
}
const warnings = [];
if (name !== canonicalModeKey) {
Expand Down
5 changes: 4 additions & 1 deletion src/knowledge-mode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,10 @@ export function resolveKnowledgeModeSelection(env: NodeJS.ProcessEnv = process.e
normalized = normalizeVendoredMode(value);
} catch (error) {
const message = error instanceof Error ? error.message : String(error);
throw new Error(`knowledge: ${name}=${value} is not a valid mode. ${message}`);
throw new Error(
`knowledge: ${name}=${value} is not a valid mode. ${message} `
+ `Unset ${name} to use the default sqlite backend, or set ${name}=sqlite or ${name}=postgres.`,
);
}
const warnings: string[] = [];
if (name !== canonicalModeKey) {
Expand Down
32 changes: 32 additions & 0 deletions tests/cli.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3778,6 +3778,38 @@ describe('a half-configured CLI fails loudly instead of reading the wrong store'
expect(combined).not.toContain(FAKE_API_URL);
});

test('REGRESSION: a removed cloud mode names the unset migration path', () => {
const result = runCliNoMode(
['list', '--tag', 'convention', '--limit', '40', '--sort', 'created', '--desc', '--json'],
{
...sandboxHome(),
HASNA_KNOWLEDGE_STORAGE_MODE: 'cloud',
},
);
const stderr = decode(result.stderr);

expect(result.exitCode).not.toBe(0);
expect(stderr).toContain('HASNA_KNOWLEDGE_STORAGE_MODE=cloud');
expect(stderr).toContain('Unset HASNA_KNOWLEDGE_STORAGE_MODE');
});

test('the exact convention read defaults to sqlite after the removed mode is absent', () => {
const args = ['list', '--tag', 'convention', '--limit', '40', '--sort', 'created', '--desc', '--json'];
const result = runCliNoMode(args, sandboxHome());
expect(result.exitCode).toBe(0);
expect((JSON.parse(decode(result.stdout)) as { ok: boolean }).ok).toBe(true);
});

test('the exact convention read still succeeds with explicit sqlite', () => {
const args = ['list', '--tag', 'convention', '--limit', '40', '--sort', 'created', '--desc', '--json'];
const result = runCliNoMode(args, {
...sandboxHome(),
HASNA_KNOWLEDGE_STORAGE_MODE: 'sqlite',
});
expect(result.exitCode).toBe(0);
expect((JSON.parse(decode(result.stdout)) as { ok: boolean }).ok).toBe(true);
});

test('`mode` still answers in the environment the guard rejects', () => {
// The command whose entire job is explaining this state must survive it,
// or the error message points at a diagnostic that also fails.
Expand Down
Loading