docs: absorb documentation PR sweep

This commit is contained in:
Peter Steinberger
2026-05-23 10:23:22 +01:00
parent 6b04170167
commit 2c536a8626
39 changed files with 455 additions and 71 deletions

View File

@@ -6,7 +6,6 @@ import {
resolveOAuthDir,
resolveStateDir,
} from "../config/config.js";
import { formatSessionArchiveTimestamp } from "../config/sessions/artifacts.js";
import { pathExists, shortenHomePath } from "../utils.js";
import { buildCleanupPlan, isPathWithin } from "./cleanup-utils.js";
@@ -58,8 +57,28 @@ function backupAssetPriority(kind: BackupAssetKind): number {
throw new Error("Unsupported backup asset kind");
}
export function formatBackupArchiveTimestamp(
nowMs = Date.now(),
offsetMinutes = -new Date(nowMs).getTimezoneOffset(),
): string {
const shifted = nowMs + offsetMinutes * 60_000;
const local = new Date(shifted);
const sign = offsetMinutes >= 0 ? "+" : "-";
const absOffsetMinutes = Math.abs(offsetMinutes);
const offsetHours = String(Math.floor(absOffsetMinutes / 60)).padStart(2, "0");
const offsetMins = String(absOffsetMinutes % 60).padStart(2, "0");
const year = String(local.getUTCFullYear()).padStart(4, "0");
const month = String(local.getUTCMonth() + 1).padStart(2, "0");
const day = String(local.getUTCDate()).padStart(2, "0");
const hours = String(local.getUTCHours()).padStart(2, "0");
const minutes = String(local.getUTCMinutes()).padStart(2, "0");
const seconds = String(local.getUTCSeconds()).padStart(2, "0");
const millis = String(local.getUTCMilliseconds()).padStart(3, "0");
return `${year}-${month}-${day}T${hours}-${minutes}-${seconds}.${millis}${sign}${offsetHours}-${offsetMins}`;
}
export function buildBackupArchiveRoot(nowMs = Date.now()): string {
return `${formatSessionArchiveTimestamp(nowMs)}-openclaw-backup`;
return `${formatBackupArchiveTimestamp(nowMs)}-openclaw-backup`;
}
export function buildBackupArchiveBasename(nowMs = Date.now()): string {

View File

@@ -8,6 +8,7 @@ import * as backupShared from "./backup-shared.js";
import {
buildBackupArchiveRoot,
encodeAbsolutePathForBackupArchive,
formatBackupArchiveTimestamp,
type BackupAsset,
resolveBackupPlanFromPaths,
resolveBackupPlanFromDisk,
@@ -161,6 +162,15 @@ describe("backup commands", () => {
]);
}
it("formats backup archive timestamps in local time with an explicit offset", () => {
expect(formatBackupArchiveTimestamp(Date.UTC(2026, 2, 14, 1, 2, 3, 456), 8 * 60)).toBe(
"2026-03-14T09-02-03.456+08-00",
);
expect(formatBackupArchiveTimestamp(Date.UTC(2026, 2, 14, 1, 2, 3, 456), -5 * 60)).toBe(
"2026-03-13T20-02-03.456-05-00",
);
});
it("collapses default config, credentials, and workspace into the state backup root", async () => {
const stateDir = path.join(tempHome.home, ".openclaw");
const configPath = path.join(stateDir, "openclaw.json");