feat(sdk): Phase 1 typed query foundation (gsd-sdk query) (#2118)
* 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
This commit is contained in:
@@ -232,3 +232,28 @@ describe('frontmatterValidate', () => {
|
||||
expect(FRONTMATTER_SCHEMAS).toHaveProperty('verification');
|
||||
});
|
||||
});
|
||||
|
||||
// ─── Round-trip (extract → reconstruct → splice) ───────────────────────────
|
||||
|
||||
describe('frontmatter round-trip', () => {
|
||||
it('preserves scalar and list fields through extract + splice', () => {
|
||||
const original = `---
|
||||
phase: "01"
|
||||
plan: "02"
|
||||
type: execute
|
||||
wave: 1
|
||||
depends_on: []
|
||||
tags: [a, b]
|
||||
---
|
||||
# Title
|
||||
`;
|
||||
const fm = extractFrontmatter(original) as Record<string, unknown>;
|
||||
const spliced = spliceFrontmatter('# Title\n', fm);
|
||||
expect(spliced.startsWith('---\n')).toBe(true);
|
||||
const round = extractFrontmatter(spliced) as Record<string, unknown>;
|
||||
expect(String(round.phase)).toBe('01');
|
||||
// YAML may round-trip wave as number or string depending on parser output
|
||||
expect(Number(round.wave)).toBe(1);
|
||||
expect(Array.isArray(round.tags)).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user