UNPKG

@stackmemoryai/stackmemory

Version:

Project-scoped memory for AI coding tools. Durable context across sessions with MCP integration, frames, smart retrieval, Claude Code skills, and automatic hooks.

116 lines (115 loc) 4.32 kB
#!/usr/bin/env npx tsx import { fileURLToPath as __fileURLToPath } from 'url'; import { dirname as __pathDirname } from 'path'; const __filename = __fileURLToPath(import.meta.url); const __dirname = __pathDirname(__filename); import "dotenv/config"; import * as fs from "fs/promises"; import * as path from "path"; import { existsSync } from "fs"; const RALPH_DIR = "./.ralph-test"; async function saveLoopState(state) { await fs.writeFile( path.join(RALPH_DIR, "state.json"), JSON.stringify(state, null, 2) ); await fs.writeFile( path.join(RALPH_DIR, "iteration.txt"), state.iteration.toString() ); console.log( ` Saved state: iteration=${state.iteration}, status=${state.status}` ); } async function loadState() { const stateData = await fs.readFile( path.join(RALPH_DIR, "state.json"), "utf8" ); const stateFile = JSON.parse(stateData); const iterationData = await fs.readFile( path.join(RALPH_DIR, "iteration.txt"), "utf8" ); const iterationFile = parseInt(iterationData.trim()); return { stateFile, iterationFile }; } async function testStateSynchronization() { try { console.log("\u{1F9EA} Testing Ralph State Synchronization Fix..."); if (existsSync(RALPH_DIR)) { await fs.rm(RALPH_DIR, { recursive: true }); } await fs.mkdir(RALPH_DIR, { recursive: true }); const state = { loopId: "test-loop-123", task: "Test state synchronization", criteria: "state.json and iteration.txt should match", iteration: 0, status: "initialized", startTime: Date.now(), lastUpdateTime: Date.now() }; console.log("\u{1F4CA} Testing initial state save..."); await saveLoopState(state); const initial = await loadState(); console.log(` State file: iteration=${initial.stateFile.iteration}`); console.log(` Iteration file: ${initial.iterationFile}`); if (initial.stateFile.iteration === initial.iterationFile) { console.log(" \u2705 Initial synchronization correct"); } else { throw new Error("Initial state synchronization failed"); } for (let i = 1; i <= 5; i++) { console.log(`\u{1F504} Testing iteration ${i}...`); state.iteration = i; state.lastUpdateTime = Date.now(); state.status = i < 5 ? "running" : "completed"; await saveLoopState(state); const current = await loadState(); console.log(` State file: iteration=${current.stateFile.iteration}`); console.log(` Iteration file: ${current.iterationFile}`); if (current.stateFile.iteration === current.iterationFile) { console.log(` \u2705 Iteration ${i} synchronization correct`); } else { throw new Error( `Iteration ${i} synchronization failed: state=${current.stateFile.iteration}, file=${current.iterationFile}` ); } } console.log("\u{1F50D} Testing fix for old broken scenario..."); const brokenState = { ...state, iteration: 10 }; await fs.writeFile( path.join(RALPH_DIR, "state.json"), JSON.stringify(brokenState, null, 2) ); await fs.writeFile( path.join(RALPH_DIR, "iteration.txt"), "0" // Old broken state ); console.log(" Created broken state: state.json=10, iteration.txt=0"); await saveLoopState(brokenState); const fixed = await loadState(); if (fixed.stateFile.iteration === fixed.iterationFile && fixed.iterationFile === 10) { console.log(" \u2705 Fixed broken state successfully"); } else { throw new Error("Failed to fix broken state"); } await fs.rm(RALPH_DIR, { recursive: true }); console.log(""); console.log("\u{1F389} Ralph state synchronization test completed successfully!"); console.log(""); console.log("\u2705 Fixed Issues:"); console.log(" - state.json and iteration.txt now stay synchronized"); console.log(" - saveLoopState() updates both files atomically"); console.log(" - Iteration counter properly increments in both files"); console.log(" - Old broken states can be fixed by re-saving"); console.log(""); } catch (error) { console.error("\u274C Test failed:", error.message); process.exit(1); } } testStateSynchronization(); //# sourceMappingURL=test-simple-ralph-state-sync.js.map