{"version":3,"file":"init-project.test.d.ts","sourceRoot":"","sources":["../../src/core/init-project.test.ts"],"names":[],"mappings":"","sourcesContent":["import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { initializeProjectScaffold } from \"./init-project.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nconst tempDirs: string[] = [];\n\nfunction createTempDir(): string {\n\tconst dir = mkdtempSync(join(tmpdir(), \"jensen-init-project-\"));\n\ttempDirs.push(dir);\n\treturn dir;\n}\n\ndescribe(\"initializeProjectScaffold\", () => {\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(\"creates the minimal harness-ready scaffold\", () => {\n\t\tconst cwd = createTempDir();\n\n\t\tconst result = initializeProjectScaffold(cwd);\n\n\t\texpect(result.createdFiles).toEqual([\n\t\t\t\"JENSEN.md\",\n\t\t\t\".jensen/settings.json\",\n\t\t\t\".jensen/extensions/subagent/index.ts\",\n\t\t\t\".jensen/extensions/subagent/agents.ts\",\n\t\t\t\".jensen/agents/planner.md\",\n\t\t\t\".jensen/agents/scout.md\",\n\t\t\t\".jensen/agents/worker.md\",\n\t\t\t\".jensen/agents/reviewer.md\",\n\t\t\t\".jensen/agents/security.md\",\n\t\t\t\".jensen/agents/pentester.md\",\n\t\t\t\".jensen/agents/librarian.md\",\n\t\t]);\n\t\texpect(result.updatedFiles).toEqual([]);\n\t\texpect(result.warnings).toEqual([]);\n\t\texpect(result.output).toContain(\"/init-project completed.\");\n\t\texpect(result.output).toContain(\"Existing files were preserved. Safe to rerun.\");\n\n\t\texpect(existsSync(join(cwd, \"JENSEN.md\"))).toBe(true);\n\t\texpect(existsSync(join(cwd, \".jensen\", \"JENSEN_PROTOCOL.md\"))).toBe(false);\n\t\texpect(readFileSync(join(cwd, \"JENSEN.md\"), \"utf-8\")).toContain(\".jensen/agents/\");\n\t\texpect(readFileSync(join(cwd, \".jensen\", \"settings.json\"), \"utf-8\")).toContain('\"./extensions/subagent\"');\n\t\texpect(readFileSync(join(cwd, \".jensen\", \"agents\", \"planner.md\"), \"utf-8\")).toContain(\"name: planner\");\n\t\texpect(readFileSync(join(cwd, \".jensen\", \"extensions\", \"subagent\", \"index.ts\"), \"utf-8\")).toContain(\n\t\t\t\"pi.registerTool(createSubagentTool());\",\n\t\t);\n\t});\n\n\tit(\"preserves existing files and only fills missing scaffold pieces\", () => {\n\t\tconst cwd = createTempDir();\n\t\tmkdirSync(join(cwd, \".jensen\", \"agents\"), { recursive: true });\n\t\twriteFileSync(join(cwd, \"JENSEN.md\"), \"# Existing overlay\\n\", \"utf-8\");\n\t\twriteFileSync(join(cwd, \".jensen\", \"agents\", \"worker.md\"), \"custom worker\\n\", \"utf-8\");\n\t\twriteFileSync(join(cwd, \".jensen\", \"settings.json\"), '{\\n  \"theme\": \"dark\"\\n}\\n', \"utf-8\");\n\n\t\tconst result = initializeProjectScaffold(cwd);\n\n\t\texpect(result.createdFiles).toContain(\".jensen/extensions/subagent/index.ts\");\n\t\texpect(result.updatedFiles).toEqual([\".jensen/settings.json\"]);\n\t\texpect(result.skippedFiles).toContain(\"JENSEN.md\");\n\t\texpect(result.skippedFiles).toContain(\".jensen/agents/worker.md\");\n\t\texpect(readFileSync(join(cwd, \"JENSEN.md\"), \"utf-8\")).toBe(\"# Existing overlay\\n\");\n\t\texpect(readFileSync(join(cwd, \".jensen\", \"agents\", \"worker.md\"), \"utf-8\")).toBe(\"custom worker\\n\");\n\t\texpect(readFileSync(join(cwd, \".jensen\", \"settings.json\"), \"utf-8\")).toContain('\"theme\": \"dark\"');\n\t\texpect(readFileSync(join(cwd, \".jensen\", \"settings.json\"), \"utf-8\")).toContain('\"./extensions/subagent\"');\n\t});\n\n\tit(\"creates the Protocol marker only when requested and exposes it to the resource loader\", async () => {\n\t\tconst cwd = createTempDir();\n\t\tconst agentDir = createTempDir();\n\t\tconst nestedWorkspaceDir = join(cwd, \"services\", \"api\");\n\t\tmkdirSync(nestedWorkspaceDir, { recursive: true });\n\n\t\tconst result = initializeProjectScaffold(cwd, { includeProtocol: true });\n\t\tconst protocolContextPath = join(cwd, \".jensen\", \"JENSEN_PROTOCOL.md\");\n\n\t\texpect(result.createdFiles).toContain(\".jensen/JENSEN_PROTOCOL.md\");\n\t\texpect(existsSync(protocolContextPath)).toBe(true);\n\t\texpect(readFileSync(protocolContextPath, \"utf-8\")).toContain(\"Jensen-Protocol workspace boundary\");\n\t\texpect(readFileSync(protocolContextPath, \"utf-8\")).toContain(\"nearest ancestor `.jensen/JENSEN_PROTOCOL.md`\");\n\n\t\tconst loader = new DefaultResourceLoader({\n\t\t\tcwd: nestedWorkspaceDir,\n\t\t\tagentDir,\n\t\t\tsettingsManager: SettingsManager.inMemory(),\n\t\t});\n\t\tawait loader.reload();\n\n\t\texpect(loader.getAgentsFiles().agentsFiles.map((file) => file.path)).toEqual([\n\t\t\tjoin(cwd, \"JENSEN.md\"),\n\t\t\tprotocolContextPath,\n\t\t]);\n\t});\n\n\tit(\"preserves an existing Protocol marker on rerun\", () => {\n\t\tconst cwd = createTempDir();\n\t\tmkdirSync(join(cwd, \".jensen\"), { recursive: true });\n\t\twriteFileSync(join(cwd, \".jensen\", \"JENSEN_PROTOCOL.md\"), \"# Existing protocol\\n\", \"utf-8\");\n\n\t\tconst result = initializeProjectScaffold(cwd, { includeProtocol: true });\n\n\t\texpect(result.skippedFiles).toContain(\".jensen/JENSEN_PROTOCOL.md\");\n\t\texpect(readFileSync(join(cwd, \".jensen\", \"JENSEN_PROTOCOL.md\"), \"utf-8\")).toBe(\"# Existing protocol\\n\");\n\t});\n\n\tit(\"warns and preserves invalid existing settings.json\", () => {\n\t\tconst cwd = createTempDir();\n\t\tmkdirSync(join(cwd, \".jensen\"), { recursive: true });\n\t\twriteFileSync(join(cwd, \".jensen\", \"settings.json\"), \"{ invalid json\\n\", \"utf-8\");\n\n\t\tconst result = initializeProjectScaffold(cwd);\n\n\t\texpect(readFileSync(join(cwd, \".jensen\", \"settings.json\"), \"utf-8\")).toBe(\"{ invalid json\\n\");\n\t\texpect(result.warnings).toEqual([\n\t\t\t{\n\t\t\t\tcode: \"invalid-settings\",\n\t\t\t\tpath: \".jensen/settings.json\",\n\t\t\t\tmessage: expect.stringContaining(\"existing settings.json is not valid JSON\"),\n\t\t\t},\n\t\t]);\n\t});\n\n\tit(\"does not create JENSEN.md when another root context file already exists\", () => {\n\t\tconst cwd = createTempDir();\n\t\twriteFileSync(join(cwd, \"AGENTS.md\"), \"# Legacy context\\n\", \"utf-8\");\n\n\t\tconst result = initializeProjectScaffold(cwd);\n\n\t\texpect(existsSync(join(cwd, \"JENSEN.md\"))).toBe(false);\n\t\texpect(result.warnings).toEqual([\n\t\t\t{\n\t\t\t\tcode: \"context-file-exists\",\n\t\t\t\tpath: \"AGENTS.md\",\n\t\t\t\tmessage: \"Skipped JENSEN.md creation because AGENTS.md already exists at the project root.\",\n\t\t\t},\n\t\t]);\n\t});\n});\n"]}