{"version":3,"file":"protocol-status-entrypoint.test.d.ts","sourceRoot":"","sources":["../../src/modes/protocol-status-entrypoint.test.ts"],"names":[],"mappings":"","sourcesContent":["import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { BUILTIN_SLASH_COMMANDS } from \"../core/slash-commands.js\";\nimport type { UltraplanArtifact, UltraplanRunResult } from \"../core/ultraplan.js\";\nimport { getPrintModeLocalCommandOutput } from \"./print-mode.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst tempDirs: string[] = [];\n\nfunction createTempDir(): string {\n\tconst dir = mkdtempSync(join(tmpdir(), \"jensen-protocol-status-entrypoint-\"));\n\ttempDirs.push(dir);\n\treturn dir;\n}\n\nfunction readSource(relativePath: string): string {\n\treturn readFileSync(join(__dirname, relativePath), \"utf8\");\n}\n\nfunction makeUltraplanArtifact(): UltraplanArtifact {\n\treturn {\n\t\tversion: 1,\n\t\tplannerMode: \"local_subagent\",\n\t\tplannerAgent: \"planner\",\n\t\texecutionState: \"plan_only\",\n\t\tobjective: \"unused\",\n\t\tassumptions: [],\n\t\tconstraints: [],\n\t\tphases: [],\n\t\trisks: [],\n\t\trecommendedExecutionOrder: [],\n\t\tactionableNextSteps: [],\n\t\tcreatedAt: \"2026-04-03T00:00:00.000Z\",\n\t};\n}\n\nfunction makeUltraplanRunResult(): UltraplanRunResult {\n\treturn {\n\t\tartifact: makeUltraplanArtifact(),\n\t\tdisplayText: \"unused\",\n\t\trawPlannerOutput: \"\",\n\t};\n}\n\nfunction createPrintModeSessionStub(protocolContextPath?: string) {\n\tconst btwNotes: string[] = [];\n\tconst agentsFiles = protocolContextPath ? [{ path: protocolContextPath, content: \"protocol\\n\" }] : [];\n\n\treturn {\n\t\tbriefOnly: false,\n\t\tsetBriefOnly: () => {},\n\t\tqueueByTheWay: (note: string) => {\n\t\t\tbtwNotes.push(note);\n\t\t},\n\t\tgetPendingByTheWayNotes: () => btwNotes,\n\t\tgetMemoryHistory: () => [],\n\t\tresolveMemorySnapshotSelector: () => ({\n\t\t\tsnapshot: undefined,\n\t\t\tmatchedInput: \"\",\n\t\t\tresolvedId: undefined,\n\t\t\terror: \"empty\" as const,\n\t\t\tcandidates: [],\n\t\t}),\n\t\tgetLatestUltraplanPlan: () => undefined,\n\t\trunUltraplan: async () => makeUltraplanRunResult(),\n\t\trunUltraplanRevise: async () => makeUltraplanRunResult(),\n\t\tapplyUltraplan: () => ({ applied: [], displayText: \"unused\" }),\n\t\tresourceLoader: {\n\t\t\tgetAgentsFiles: () => ({ agentsFiles }),\n\t\t},\n\t};\n}\n\ndescribe(\"/protocol-status command entrypoint\", () => {\n\tafterEach(() => {\n\t\tfor (const dir of tempDirs.splice(0)) {\n\t\t\trmSync(dir, { recursive: true, force: true });\n\t\t}\n\t});\n\n\tit(\"registers a built-in /protocol-status slash command\", () => {\n\t\tconst command = BUILTIN_SLASH_COMMANDS.find((entry) => entry.name === \"protocol-status\");\n\t\texpect(command).toBeDefined();\n\t\texpect(command?.description).toContain(\"Protocol\");\n\t});\n\n\tit(\"routes interactive mode submissions through the explicit protocol-status handler\", () => {\n\t\tconst source = readSource(\"interactive/interactive-mode.ts\");\n\n\t\texpect(source).toContain('if (text === \"/protocol-status\")');\n\t\texpect(source).toContain(\"this.handleProtocolStatusCommand();\");\n\t});\n\n\tit(\"reports the effective Protocol marker through print mode\", async () => {\n\t\tconst cwd = createTempDir();\n\t\tconst workspaceDir = join(cwd, \"workspace\");\n\t\tconst appDir = join(workspaceDir, \"app\");\n\t\tconst markerPath = join(workspaceDir, \".jensen\", \"JENSEN_PROTOCOL.md\");\n\t\tmkdirSync(dirname(markerPath), { recursive: true });\n\t\tmkdirSync(appDir, { recursive: true });\n\t\twriteFileSync(markerPath, \"protocol\\n\", \"utf8\");\n\t\twriteFileSync(join(workspaceDir, \"README.md\"), \"workspace\\n\", \"utf8\");\n\t\tconst previousCwd = process.cwd();\n\t\tprocess.chdir(appDir);\n\n\t\ttry {\n\t\t\tconst output = await getPrintModeLocalCommandOutput(\n\t\t\t\tcreatePrintModeSessionStub(markerPath),\n\t\t\t\t\"/protocol-status\",\n\t\t\t);\n\n\t\t\texpect(output).toContain(\"Protocol workspace marker: detected\");\n\t\t\texpect(output).toContain(`Effective marker file: ${markerPath}`);\n\t\t\texpect(output).toContain(`Workspace root: ${workspaceDir}`);\n\t\t\texpect(output).toContain(\"Protocol context in harness: available\");\n\t\t} finally {\n\t\t\tprocess.chdir(previousCwd);\n\t\t}\n\t});\n\n\tit(\"reports non-Protocol workspaces honestly through print mode\", async () => {\n\t\tconst cwd = createTempDir();\n\t\tconst appDir = join(cwd, \"app\");\n\t\tmkdirSync(appDir, { recursive: true });\n\t\tconst previousCwd = process.cwd();\n\t\twriteFileSync(join(cwd, \"README.md\"), \"workspace\\n\", \"utf8\");\n\t\tprocess.chdir(appDir);\n\n\t\ttry {\n\t\t\tconst output = await getPrintModeLocalCommandOutput(createPrintModeSessionStub(), \"/protocol-status\");\n\n\t\t\texpect(output).toContain(\"Protocol workspace marker: not detected\");\n\t\t\texpect(output).toContain(\"Effective marker file: none\");\n\t\t\texpect(output).toContain(\"Protocol context in harness: unavailable\");\n\t\t} finally {\n\t\t\tprocess.chdir(previousCwd);\n\t\t}\n\t});\n});\n"]}