* feat(sdk): add typed query foundation and gsd-sdk query (Phase 1) Add sdk/src/query registry and handlers with tests, GSDQueryError, CLI query wiring, and supporting type/tool-scoping hooks. Update CHANGELOG. Vitest 4 constructor mock fixes in milestone-runner tests. Made-with: Cursor * chore: gitignore .cursor for local-only Cursor assets Made-with: Cursor * fix(sdk): harden query layer for PR review (paths, locks, CLI, ReDoS) - resolvePathUnderProject: realpath + relative containment for frontmatter and key_links - commitToSubrepo: path checks + sanitizeCommitMessage - statePlannedPhase: readModifyWriteStateMd (lock); MUTATION_COMMANDS + events - key_links: regexForKeyLinkPattern length/ReDoS guard; phase dirs: reject .. and separators - gsd-sdk: strip --pick before parseArgs; strict parser; QueryRegistry.commands() - progress: static GSDError import; tests updated Made-with: Cursor * feat(sdk): query follow-up — tests, QUERY-HANDLERS, registry, locks, intel depth Made-with: Cursor * docs(sdk): use ASCII punctuation in QUERY-HANDLERS.md Made-with: Cursor
32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
/**
|
|
* Tests for websearch handler (no network when API key unset).
|
|
*/
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import { websearch } from './websearch.js';
|
|
|
|
describe('websearch', () => {
|
|
it('returns available:false when BRAVE_API_KEY is not set', async () => {
|
|
const prev = process.env.BRAVE_API_KEY;
|
|
delete process.env.BRAVE_API_KEY;
|
|
const r = await websearch(['test query'], '/tmp');
|
|
const data = r.data as Record<string, unknown>;
|
|
expect(data.available).toBe(false);
|
|
if (prev !== undefined) process.env.BRAVE_API_KEY = prev;
|
|
});
|
|
|
|
it('returns error when query is missing and BRAVE_API_KEY is set', async () => {
|
|
const prev = process.env.BRAVE_API_KEY;
|
|
process.env.BRAVE_API_KEY = 'test-dummy-key';
|
|
try {
|
|
const r = await websearch([], '/tmp');
|
|
const data = r.data as Record<string, unknown>;
|
|
expect(data.available).toBe(false);
|
|
expect(data.error).toBe('Query required');
|
|
} finally {
|
|
if (prev !== undefined) process.env.BRAVE_API_KEY = prev;
|
|
else delete process.env.BRAVE_API_KEY;
|
|
}
|
|
});
|
|
});
|