@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
JavaScript
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