import { describe, expect, it } from "vitest"; import { FOCUS_HELP_VIBE_MAP, inferHelpVibeHints, mergeHelpVibeHints, mergeHelpVibeIntoMemory, summarizeHelpVibe, } from "./user-help-vibe"; import { collectLocalProfileSignals } from "./user-profile-harvest"; describe("user-help-vibe", () => { it("does not invent lifestyle labels from locale alone", () => { const signals = collectLocalProfileSignals({ name: "Alex", email: "a@b.c", defaultProvider: "openrouter", defaultModel: "gpt-4", computerHost: null, }); const hints = inferHelpVibeHints(signals); expect(hints.interactionStyle).toBe("unknown"); expect(hints.observedSignals.some((s) => s.includes("office") || s.includes("club"))).toBe( false, ); }); it("suggests builder/engineer lanes when computer is attached", () => { const hints = inferHelpVibeHints( collectLocalProfileSignals({ name: "Dev", email: "d@b.c", defaultProvider: null, defaultModel: null, computerHost: "docker", }), ); expect(hints.suggestedLanes).toContain("builder"); expect(hints.observedSignals).toContain("computer-attached"); }); it("merges focus choice into help vibe without overriding explicit style", () => { const base = inferHelpVibeHints( collectLocalProfileSignals({ name: "Robin", email: "r@b.c", defaultProvider: null, defaultModel: null, computerHost: null, }), ); const merged = mergeHelpVibeHints(base, "research"); expect(merged.focusChoiceId).toBe("research"); expect(merged.interactionStyle).toBe(FOCUS_HELP_VIBE_MAP.research.interactionStyle); expect(merged.suggestedLanes).toContain("curator"); }); it("writes help vibe block into MEMORY.md", () => { const merged = mergeHelpVibeIntoMemory( "# Space memory\n", inferHelpVibeHints( collectLocalProfileSignals({ name: "Ingo", email: "i@b.c", defaultProvider: "openai-compatible", defaultModel: "local", computerHost: null, }), { focusChoiceId: "crew" }, ), ); expect(merged).toContain("## Help & vibe (inferred)"); expect(merged).toContain("Suggested specialist lanes"); expect(merged).toContain("focus:crew"); expect(merged).toContain("Skill floor"); expect(merged).toContain("expert-grade per specialty"); }); it("summarizes hints for discovery UI", () => { const summary = summarizeHelpVibe( mergeHelpVibeHints( inferHelpVibeHints( collectLocalProfileSignals({ name: "X", email: "x@y.z", defaultProvider: null, defaultModel: null, computerHost: null, }), ), "research", ), ); expect(summary).toContain("geek-peer"); expect(summary).toContain("focus:research"); }); });