Spaces:
Running
Running
| import { describe, expect, it } from "vitest"; | |
| import { applyComposerSuggestion, getComposerSuggestions } from "./composer-autocomplete"; | |
| import { parseCommand } from "./command-parser"; | |
| import seedWorkPackages from "../agentic_pm_demo_codex_plans/data/work-packages.seed.json"; | |
| import type { WorkPackage } from "./work-package-types"; | |
| const wps = seedWorkPackages as WorkPackage[]; | |
| describe("parseCommand", () => { | |
| it("matches shortName and mode", () => { | |
| const r = parseCommand("@SRS ask Which components are needed?", wps); | |
| expect(r.error).toBeUndefined(); | |
| expect(r.matchedWorkPackageId).toBe("wp-srs"); | |
| expect(r.parsed.mode).toBe("ask"); | |
| expect(r.parsed.instruction).toContain("Which components"); | |
| }); | |
| it("matches multi-token title with execute", () => { | |
| const r = parseCommand( | |
| "@Final Engineering Concept execute Generate BOM and SBOM.", | |
| wps, | |
| ); | |
| expect(r.error).toBeUndefined(); | |
| expect(r.matchedWorkPackageId).toBe("wp-final-engineering-concept"); | |
| expect(r.parsed.mode).toBe("execute"); | |
| }); | |
| it("suggests close matches for unknown package", () => { | |
| const r = parseCommand("@Foo execute Do something", wps); | |
| expect(r.error).toBeTruthy(); | |
| expect(r.suggestions?.length || 0).toBeGreaterThanOrEqual(0); | |
| }); | |
| it("defaults to ask when mode is missing and package matches", () => { | |
| const r = parseCommand("@CRS Which components are needed?", wps); | |
| expect(r.error).toBeUndefined(); | |
| expect(r.matchedWorkPackageId).toBe("wp-crs"); | |
| expect(r.parsed.mode).toBe("ask"); | |
| }); | |
| it("treats slash text as plain input until autocomplete expands it", () => { | |
| const slashInput = parseCommand("/plan", wps); | |
| expect(slashInput.parsed.mode).toBeUndefined(); | |
| const suggestion = getComposerSuggestions("/pl", wps).find( | |
| (item) => item.kind === "command" && item.mode === "plan", | |
| ); | |
| const expanded = applyComposerSuggestion({ | |
| draft: "/pl", | |
| suggestion: suggestion!, | |
| selectedWorkPackage: wps.find((wp) => wp.shortName === "SRS"), | |
| }); | |
| const parsedExpanded = parseCommand(expanded, wps); | |
| expect(expanded).toBe("@SRS plan "); | |
| expect(parsedExpanded.matchedWorkPackageId).toBe("wp-srs"); | |
| expect(parsedExpanded.parsed.mode).toBe("plan"); | |
| }); | |
| }); | |