{"repo": "akaghef/m3e", "files": {"final/tests/unit/template_system_builder.test.js": {"654debf280e545ecacc2ffe754033c95f54ad07e": {"t": 1785745536.6055348, "n": 9032, "h": "2aa7378d8ff7e8ff", "c": "const fs = require(\"fs\");\nconst os = require(\"os\");\nconst path = require(\"path\");\nconst { execFileSync } = require(\"child_process\");\nconst YAML = require(\"js-yaml\");\nimport { describe, expect, test } from \"vitest\";\n\nconst { compileFromMap } = require(\"../../dist/node/graph_spec_compile\");\nconst { buildTemplateSystemState } = require(\"../../dist/node/template_system_builder\");\nconst { graphSpecToMermaid } = require(\"../../dist/shared/graph_spec_mermaid\");\nconst { validateGraphSpec } = require(\"../../dist/shared/graph_spec_types\");\n\ndescribe(\"Template System builder\", () => {\n test(\"builds PJv34 AppState and GraphSpecs from YAML with no issues\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const specPath = path.join(repoRoot, \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\");\n const spec = YAML.load(fs.readFileSync(specPath, \"utf8\"));\n\n const result = buildTemplateSystemState(spec);\n expect(result.issues).toEqual([]);\n\n const rootCompile = compileFromMap(result.state, \"pjv34_system\");\n const generateDocCompile = compileFromMap(result.state, \"generate_doc\");\n\n expect(rootCompile.warnings).toEqual([]);\n expect(generateDocCompile.warnings).toEqual([]);\n expect(validateGraphSpec(rootCompile.spec)).toEqual([]);\n expect(validateGraphSpec(generateDocCompile.spec)).toEqual([]);\n expect(rootCompile.spec.nodes.map((node) => node.id)).toEqual([\n \"load_context\",\n \"generate_doc\",\n \"write_output\",\n ]);\n expect(generateDocCompile.spec.edges.find((edge) => edge.id === \"cond:evaluate_response\").branches).toEqual({\n pass: \"return_draft\",\n api_error: \"retry_backoff\",\n bad_output: \"fallback_qn\",\n });\n });\n\n test(\"template run CLI produces mock artifact and trace without secrets\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-run-\"));\n const outPath = path.join(outDir, \"run.md\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_run_cli.js\"),\n \"--spec\",\n \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n env: { ...process.env, WEEKLY_REVIEW_PROVIDER: \"mock\" },\n stdio: \"pipe\",\n });\n\n const artifact = fs.readFileSync(outPath, \"utf8\");\n const trace = JSON.parse(fs.readFileSync(outPath.replace(/\\.md$/i, \".json\"), \"utf8\"));\n expect(artifact).toContain(\"# Weekly Project Review\");\n expect(trace.trace.map((item) => item.nodeId)).toEqual([\n \"load_context\",\n \"build_prompt\",\n \"call_provider\",\n \"evaluate_response\",\n \"return_draft\",\n \"write_output\",\n ]);\n expect(`${artifact}\\n${JSON.stringify(trace)}`).not.toMatch(/sk-|M3E_AI_API_KEY|DEEPSEEK_API_KEY/);\n });\n\n test(\"renders PJv34 GraphSpec as read-only Mermaid source\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const specPath = path.join(repoRoot, \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\");\n const spec = YAML.load(fs.readFileSync(specPath, \"utf8\"));\n const result = buildTemplateSystemState(spec);\n const rootCompile = compileFromMap(result.state, \"pjv34_system\");\n const generateDocCompile = compileFromMap(result.state, \"generate_doc\");\n\n const rootMermaid = graphSpecToMermaid(rootCompile.spec);\n const generateDocMermaid = graphSpecToMermaid(generateDocCompile.spec);\n\n expect(rootMermaid).toContain('m3e_load_context[\"Load Context\"]');\n expect(rootMermaid).toContain('m3e_generate_doc[\"Generate Doc\"]');\n expect(rootMermaid).toContain(\"m3e_load_context -->|default| m3e_generate_doc\");\n expect(generateDocMermaid).toContain('m3e_evaluate_response{\"Evaluate Response\"}');\n expect(generateDocMermaid).toContain(\"m3e_evaluate_response -->|bad_output| m3e_fallback_qn\");\n expect(generateDocMermaid).toContain(\"m3e_retry_backoff -->|retry| m3e_call_provider\");\n });\n\n test(\"template mermaid CLI writes an HTML preview\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-mermaid-\"));\n const outPath = path.join(outDir, \"preview.html\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_mermaid_cli.js\"),\n \"--spec\",\n \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n stdio: \"pipe\",\n });\n\n const html = fs.readFileSync(outPath, \"utf8\");\n expect(html).toContain(\"M3E Mermaid Preview\");\n expect(html).toContain(\"pjv34_system\");\n expect(html).toContain(\"generate_doc\");\n expect(html).toContain(\"m3e_evaluate_response -->|bad_output| m3e_fallback_qn\");\n });\n\n test(\"template mermaid CLI writes an index for all template specs\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-mermaid-index-\"));\n const outPath = path.join(outDir, \"index.html\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_mermaid_cli.js\"),\n \"--spec-dir\",\n \"projects/PJ04_MermaidSystemLangGraph/templates\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n stdio: \"pipe\",\n });\n\n const html = fs.readFileSync(outPath, \"utf8\");\n expect(html).toContain(\"M3E Mermaid Preview Index\");\n expect(html).toContain(\"pjv34_system\");\n expect(html).toContain(\"pjv35_local_project_design_report_system\");\n expect(html).toContain(\"PJv35 Local Project Design Report\");\n expect(html).toContain(\"generate_design_report\");\n });\n\n test(\"template run CLI resolves PJv35 callable refs without PJv34 aliases\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-run-pjv35-\"));\n const outPath = path.join(outDir, \"pjv35.md\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_run_cli.js\"),\n \"--spec\",\n \"projects/PJ04_MermaidSystemLangGraph/templates/pjv35_local_project_design_report.yaml\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n env: { ...process.env, WEEKLY_REVIEW_PROVIDER: \"mock\" },\n stdio: \"pipe\",\n });\n\n const artifact = fs.readFileSync(outPath, \"utf8\");\n const trace = JSON.parse(fs.readFileSync(outPath.replace(/\\.md$/i, \".json\"), \"utf8\"));\n expect(artifact).toContain(\"# Project Design Report\");\n expect(trace.trace.map((item) => item.nodeId)).toEqual([\n \"load_projects\",\n \"build_prompt\",\n \"call_provider\",\n \"evaluate_response\",\n \"return_draft\",\n \"write_output\",\n ]);\n expect(trace.prompt).toContain(\"Project Design Notes\");\n });\n\n test(\"template run CLI routes provider failure to fallback_qn\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-run-failure-\"));\n const outPath = path.join(outDir, \"run.md\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_run_cli.js\"),\n \"--spec\",\n \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n env: {\n ...process.env,\n WEEKLY_REVIEW_PROVIDER: \"mock\",\n M3E_TEMPLATE_FORCE_PROVIDER_ERROR: \"1\",\n },\n stdio: \"pipe\",\n });\n\n const trace = JSON.parse(fs.readFileSync(outPath.replace(/\\.md$/i, \".json\"), \"utf8\"));\n expect(trace.trace.map((item) => item.nodeId)).toEqual([\n \"load_context\",\n \"build_prompt\",\n \"call_provider\",\n \"evaluate_response\",\n \"retry_backoff\",\n \"call_provider\",\n \"evaluate_response\",\n \"retry_backoff\",\n \"fallback_qn\",\n \"write_output\",\n ]);\n expect(trace.qn).toContain(\"Forced provider error\");\n });\n\n test(\"reports unknown templates and missing required slots\", () => {\n const unknownTemplate = buildTemplateSystemState({\n id: \"bad_system\",\n label: \"Bad System\",\n nodes: [\n { id: \"bad_node\", template: \"missing.template\" },\n ],\n });\n expect(unknownTemplate.issues).toContainEqual({\n kind: \"unknown_template\",\n detail: \"bad_node: missing.template\",\n });\n\n const missingSlot = buildTemplateSystemState({\n id: \"missing_slot_system\",\n label: \"Missing Slot System\",\n nodes: [\n {\n id: \"process_without_callable\",\n template: \"langgraph.node.process\",\n slots: {\n reads: \"state.input\",\n writes: \"state.output\",\n trace_step_id: \"process_without_callable\",\n },\n },\n ],\n });\n expect(missingSlot.issues).toContainEqual({\n kind: \"missing_required_slot\",\n detail: \"process_without_callable.callable_ref\",\n });\n });\n});\n"}, "4492f1b936e96590c009e84ebc1984ad9f8bb70c": {"t": 1785754001.7090724, "n": 9032, "h": "2aa7378d8ff7e8ff", "c": "const fs = require(\"fs\");\nconst os = require(\"os\");\nconst path = require(\"path\");\nconst { execFileSync } = require(\"child_process\");\nconst YAML = require(\"js-yaml\");\nimport { describe, expect, test } from \"vitest\";\n\nconst { compileFromMap } = require(\"../../dist/node/graph_spec_compile\");\nconst { buildTemplateSystemState } = require(\"../../dist/node/template_system_builder\");\nconst { graphSpecToMermaid } = require(\"../../dist/shared/graph_spec_mermaid\");\nconst { validateGraphSpec } = require(\"../../dist/shared/graph_spec_types\");\n\ndescribe(\"Template System builder\", () => {\n test(\"builds PJv34 AppState and GraphSpecs from YAML with no issues\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const specPath = path.join(repoRoot, \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\");\n const spec = YAML.load(fs.readFileSync(specPath, \"utf8\"));\n\n const result = buildTemplateSystemState(spec);\n expect(result.issues).toEqual([]);\n\n const rootCompile = compileFromMap(result.state, \"pjv34_system\");\n const generateDocCompile = compileFromMap(result.state, \"generate_doc\");\n\n expect(rootCompile.warnings).toEqual([]);\n expect(generateDocCompile.warnings).toEqual([]);\n expect(validateGraphSpec(rootCompile.spec)).toEqual([]);\n expect(validateGraphSpec(generateDocCompile.spec)).toEqual([]);\n expect(rootCompile.spec.nodes.map((node) => node.id)).toEqual([\n \"load_context\",\n \"generate_doc\",\n \"write_output\",\n ]);\n expect(generateDocCompile.spec.edges.find((edge) => edge.id === \"cond:evaluate_response\").branches).toEqual({\n pass: \"return_draft\",\n api_error: \"retry_backoff\",\n bad_output: \"fallback_qn\",\n });\n });\n\n test(\"template run CLI produces mock artifact and trace without secrets\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-run-\"));\n const outPath = path.join(outDir, \"run.md\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_run_cli.js\"),\n \"--spec\",\n \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n env: { ...process.env, WEEKLY_REVIEW_PROVIDER: \"mock\" },\n stdio: \"pipe\",\n });\n\n const artifact = fs.readFileSync(outPath, \"utf8\");\n const trace = JSON.parse(fs.readFileSync(outPath.replace(/\\.md$/i, \".json\"), \"utf8\"));\n expect(artifact).toContain(\"# Weekly Project Review\");\n expect(trace.trace.map((item) => item.nodeId)).toEqual([\n \"load_context\",\n \"build_prompt\",\n \"call_provider\",\n \"evaluate_response\",\n \"return_draft\",\n \"write_output\",\n ]);\n expect(`${artifact}\\n${JSON.stringify(trace)}`).not.toMatch(/sk-|M3E_AI_API_KEY|DEEPSEEK_API_KEY/);\n });\n\n test(\"renders PJv34 GraphSpec as read-only Mermaid source\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const specPath = path.join(repoRoot, \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\");\n const spec = YAML.load(fs.readFileSync(specPath, \"utf8\"));\n const result = buildTemplateSystemState(spec);\n const rootCompile = compileFromMap(result.state, \"pjv34_system\");\n const generateDocCompile = compileFromMap(result.state, \"generate_doc\");\n\n const rootMermaid = graphSpecToMermaid(rootCompile.spec);\n const generateDocMermaid = graphSpecToMermaid(generateDocCompile.spec);\n\n expect(rootMermaid).toContain('m3e_load_context[\"Load Context\"]');\n expect(rootMermaid).toContain('m3e_generate_doc[\"Generate Doc\"]');\n expect(rootMermaid).toContain(\"m3e_load_context -->|default| m3e_generate_doc\");\n expect(generateDocMermaid).toContain('m3e_evaluate_response{\"Evaluate Response\"}');\n expect(generateDocMermaid).toContain(\"m3e_evaluate_response -->|bad_output| m3e_fallback_qn\");\n expect(generateDocMermaid).toContain(\"m3e_retry_backoff -->|retry| m3e_call_provider\");\n });\n\n test(\"template mermaid CLI writes an HTML preview\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-mermaid-\"));\n const outPath = path.join(outDir, \"preview.html\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_mermaid_cli.js\"),\n \"--spec\",\n \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n stdio: \"pipe\",\n });\n\n const html = fs.readFileSync(outPath, \"utf8\");\n expect(html).toContain(\"M3E Mermaid Preview\");\n expect(html).toContain(\"pjv34_system\");\n expect(html).toContain(\"generate_doc\");\n expect(html).toContain(\"m3e_evaluate_response -->|bad_output| m3e_fallback_qn\");\n });\n\n test(\"template mermaid CLI writes an index for all template specs\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-mermaid-index-\"));\n const outPath = path.join(outDir, \"index.html\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_mermaid_cli.js\"),\n \"--spec-dir\",\n \"projects/PJ04_MermaidSystemLangGraph/templates\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n stdio: \"pipe\",\n });\n\n const html = fs.readFileSync(outPath, \"utf8\");\n expect(html).toContain(\"M3E Mermaid Preview Index\");\n expect(html).toContain(\"pjv34_system\");\n expect(html).toContain(\"pjv35_local_project_design_report_system\");\n expect(html).toContain(\"PJv35 Local Project Design Report\");\n expect(html).toContain(\"generate_design_report\");\n });\n\n test(\"template run CLI resolves PJv35 callable refs without PJv34 aliases\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-run-pjv35-\"));\n const outPath = path.join(outDir, \"pjv35.md\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_run_cli.js\"),\n \"--spec\",\n \"projects/PJ04_MermaidSystemLangGraph/templates/pjv35_local_project_design_report.yaml\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n env: { ...process.env, WEEKLY_REVIEW_PROVIDER: \"mock\" },\n stdio: \"pipe\",\n });\n\n const artifact = fs.readFileSync(outPath, \"utf8\");\n const trace = JSON.parse(fs.readFileSync(outPath.replace(/\\.md$/i, \".json\"), \"utf8\"));\n expect(artifact).toContain(\"# Project Design Report\");\n expect(trace.trace.map((item) => item.nodeId)).toEqual([\n \"load_projects\",\n \"build_prompt\",\n \"call_provider\",\n \"evaluate_response\",\n \"return_draft\",\n \"write_output\",\n ]);\n expect(trace.prompt).toContain(\"Project Design Notes\");\n });\n\n test(\"template run CLI routes provider failure to fallback_qn\", () => {\n const repoRoot = path.resolve(__dirname, \"../../..\");\n const outDir = fs.mkdtempSync(path.join(os.tmpdir(), \"m3e-template-run-failure-\"));\n const outPath = path.join(outDir, \"run.md\");\n execFileSync(process.execPath, [\n path.join(repoRoot, \"beta/dist/node/template_run_cli.js\"),\n \"--spec\",\n \"projects/PJ04_MermaidSystemLangGraph/templates/pjv34_weekly_review.yaml\",\n \"--out\",\n outPath,\n ], {\n cwd: repoRoot,\n env: {\n ...process.env,\n WEEKLY_REVIEW_PROVIDER: \"mock\",\n M3E_TEMPLATE_FORCE_PROVIDER_ERROR: \"1\",\n },\n stdio: \"pipe\",\n });\n\n const trace = JSON.parse(fs.readFileSync(outPath.replace(/\\.md$/i, \".json\"), \"utf8\"));\n expect(trace.trace.map((item) => item.nodeId)).toEqual([\n \"load_context\",\n \"build_prompt\",\n \"call_provider\",\n \"evaluate_response\",\n \"retry_backoff\",\n \"call_provider\",\n \"evaluate_response\",\n \"retry_backoff\",\n \"fallback_qn\",\n \"write_output\",\n ]);\n expect(trace.qn).toContain(\"Forced provider error\");\n });\n\n test(\"reports unknown templates and missing required slots\", () => {\n const unknownTemplate = buildTemplateSystemState({\n id: \"bad_system\",\n label: \"Bad System\",\n nodes: [\n { id: \"bad_node\", template: \"missing.template\" },\n ],\n });\n expect(unknownTemplate.issues).toContainEqual({\n kind: \"unknown_template\",\n detail: \"bad_node: missing.template\",\n });\n\n const missingSlot = buildTemplateSystemState({\n id: \"missing_slot_system\",\n label: \"Missing Slot System\",\n nodes: [\n {\n id: \"process_without_callable\",\n template: \"langgraph.node.process\",\n slots: {\n reads: \"state.input\",\n writes: \"state.output\",\n trace_step_id: \"process_without_callable\",\n },\n },\n ],\n });\n expect(missingSlot.issues).toContainEqual({\n kind: \"missing_required_slot\",\n detail: \"process_without_callable.callable_ref\",\n });\n });\n});\n"}}}}