Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
96f0962
feat(runtime): add daemon-backed mirror sync status endpoint
ToadAid Mar 21, 2026
cb16b13
test(runtime): add read-only sync ingress regression coverage
ToadAid Mar 21, 2026
534276c
docs(architecture): add mirror split-readiness checklist
ToadAid Mar 21, 2026
46d207a
test(runtime): lock canonical mirror env boundary
ToadAid Mar 21, 2026
b155560
test(ci): restore fetch safely in shared vitest setup
ToadAid Mar 22, 2026
8151650
test(runtime): add operator-truth coverage for mirror verify-lore
ToadAid Mar 22, 2026
c3380ba
test(runtime): add daemon/operator parity coverage for mirror status …
ToadAid Mar 22, 2026
a3708a3
fix(compat): align compatibility mirror verify-lore defaults with MIR…
ToadAid Mar 22, 2026
157ab3b
docs(architecture): refresh split-readiness checklist after status/sy…
ToadAid Mar 22, 2026
166d90c
test(runtime): add focused reset coverage for shared agent event list…
ToadAid Mar 22, 2026
1447cfa
test(runtime): add daemon runtime-state coverage for action inspection
ToadAid Mar 22, 2026
3a723da
test(runtime): add websocket control-message coverage for subscribe r…
ToadAid Mar 22, 2026
fbfbfeb
test(runtime): add runtime summary coverage for websocket connection …
ToadAid Mar 22, 2026
862a238
test(runtime): add runtime-state debug consistency coverage for webso…
ToadAid Mar 22, 2026
6f8051c
test(runtime): add health/runtime consistency coverage for websocket …
ToadAid Mar 22, 2026
2c26824
test(ci): add a narrow Mirror-owned smoke target for runtime-boundary…
ToadAid Mar 22, 2026
c1f6db0
test(runtime): add health/runtime consistency coverage for websocket …
ToadAid Mar 22, 2026
91d441d
test(boundary): lock compatibility shims to thin forwarding wrappers
ToadAid Mar 22, 2026
7eb8e5a
ci(runtime): add minimal workflow hook for mirror smoke target
ToadAid Mar 22, 2026
5115b19
test(boundary): add compatibility-quarantine guardrails for legacy ru…
ToadAid Mar 22, 2026
cf75bf7
test(ci): extend Mirror smoke target to include legacy-entrypoint bou…
ToadAid Mar 22, 2026
4cb4e34
ci(runtime): add reporting polish for Mirror smoke boundary buckets
ToadAid Mar 22, 2026
a23c63a
docs(architecture): refresh split-readiness checklist after smoke-lan…
ToadAid Mar 22, 2026
7482f46
ci(runtime): add final summary line for Mirror smoke boundary buckets
ToadAid Mar 22, 2026
143abb1
test(ci): add boundary gate for OpenClaw-specific import/package coup…
ToadAid Mar 22, 2026
0e8606d
test(ci): add boundary gate for OpenClaw-specific env/config coupling…
ToadAid Mar 22, 2026
0ad25c0
test(ci): add Mirror-owned OpenClaw env/import boundary gates
ToadAid Mar 22, 2026
12eba97
ci(smoke): add packaged runtime truth smoke for extracted artifact
ToadAid Mar 22, 2026
6100e84
test(boundary): add canonical export quarantine guardrails
ToadAid Mar 23, 2026
189c93a
test(docs): add canonical entrypoints doc guardrails
ToadAid Mar 23, 2026
df611a4
test(docs): add operator guide boundary guardrails
ToadAid Mar 23, 2026
1f6f96d
test(docs): add CLI JSON schema boundary guardrails
ToadAid Mar 23, 2026
858515e
test(docs): add split-readiness checklist guardrails
ToadAid Mar 23, 2026
4492de2
test(docs): add standalone packaging boundary guardrails
ToadAid Mar 23, 2026
a3e3747
test(docs): add Mirror method boundary guardrails
ToadAid Mar 23, 2026
80093c4
test(boundary): add standalone help-surface guardrails
ToadAid Mar 23, 2026
108664b
test(boundary): add standalone env-surface guardrails
ToadAid Mar 23, 2026
a2ab0f5
test(boundary): add standalone launcher-surface guardrails
ToadAid Mar 23, 2026
8f6bfaf
test(boundary): add standalone package-entry guardrails
ToadAid Mar 23, 2026
a9fe791
test(boundary): add standalone service-entry guardrails
ToadAid Mar 23, 2026
12964b6
test(boundary): add standalone CLI-entry guardrails
ToadAid Mar 23, 2026
7a55474
test(boundary): add standalone runtime-entry guardrails
ToadAid Mar 23, 2026
4a0a04b
test(boundary): add standalone provider-entry guardrails
ToadAid Mar 23, 2026
6e60a13
test(boundary): add standalone daemon-entry guardrails
ToadAid Mar 23, 2026
422f884
test(boundary): add standalone gateway-entry guardrails
ToadAid Mar 23, 2026
aab05a7
test(boundary): add standalone policy-entry guardrails
ToadAid Mar 23, 2026
ecc7844
test(boundary): add standalone actions-entry guardrails
ToadAid Mar 23, 2026
1892e59
test(boundary): add standalone sync-entry guardrails
ToadAid Mar 23, 2026
2306706
test(boundary): add standalone observability-entry guardrails
ToadAid Mar 23, 2026
1ccefa3
test(boundary): add standalone user-workspace-entry guardrails
ToadAid Mar 23, 2026
67b3729
test(boundary): add standalone console-entry guardrails
ToadAid Mar 23, 2026
138baed
test(boundary): add standalone review-entry guardrails
ToadAid Mar 23, 2026
d8d36f0
test(boundary): add standalone UI-api entry guardrails
ToadAid Mar 23, 2026
2723eb6
test(boundary): add standalone task-entry guardrails
ToadAid Mar 23, 2026
724bd96
test(boundary): add standalone reminder-entry guardrails
ToadAid Mar 23, 2026
7f97055
test(boundary): add standalone heartbeat-entry guardrails
ToadAid Mar 23, 2026
0a6f2b0
test(boundary): add standalone reflection-entry guardrails
ToadAid Mar 23, 2026
5c726de
test(boundary): add standalone lore-graph-entry guardrails
ToadAid Mar 23, 2026
3b49969
test(boundary): add standalone monk-entry guardrails
ToadAid Mar 23, 2026
122063b
test(boundary): add standalone monk-actions-entry guardrails
ToadAid Mar 23, 2026
d422a3f
refactor(observability): require explicit observability context for s…
ToadAid Mar 23, 2026
efbdb5c
refactor(observability): route console graph metrics through owned co…
ToadAid Mar 23, 2026
b31d09e
test(console): route console handlers import through console index
ToadAid Mar 23, 2026
35ee2af
test(doctor): export doctor cli via telemetry-tail index
ToadAid Mar 23, 2026
84fe444
test(doctor): route checks import through doctor index
ToadAid Mar 23, 2026
0e3ef34
cli: route mirror compatibility loader through telemetry-tail index
ToadAid Mar 23, 2026
3a64d5d
compat(runtime): derive health payload from runtime host truth
ToadAid Mar 23, 2026
c5d3b88
mirrordaemon: derive health peers_known from peer list
ToadAid Mar 23, 2026
0dae620
sync(canon): inject canon sync metric hooks
ToadAid Mar 23, 2026
b1e8cae
sync: inject sync manager observability hooks
ToadAid Mar 23, 2026
c8acea4
status: derive status fields from daemon summaries
ToadAid Mar 23, 2026
a5f4c08
status: derive provider list from daemon provider summary
ToadAid Mar 23, 2026
6762b4d
runtime(ws): derive hello envelope from daemon runtime summary
ToadAid Mar 23, 2026
44e8e32
Mirror/sync manager inject observability hooks
ToadAid Mar 23, 2026
c56b440
mirrordaemon(debug): drop dead peersKnown override (#213)
ToadAid Mar 24, 2026
7ed5d23
Merge remote-tracking branch 'origin/fix-mirror-status-runtime-truth'…
ToadAid Mar 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .github/workflows/mirror-runtime-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@ on:
- "tsdown.mirror.config.ts"
- "vitest.mirror.config.ts"
- "scripts/ci-mirror-smoke.ts"
- "scripts/test-mirror-runtime-boundary-smoke.mjs"
- "scripts/assemble-mirror-runtime-dist.ts"
- "scripts/copy-mirror-runtime-assets.ts"
- "scripts/verify-mirror-runtime-dist.ts"
- "packaging/mirror-runtime/**"
- "src/compat/openclaw/shim-boundary.test.ts"
- "src/runtime/compat-legacy-boundary.test.ts"
- "test/mirror-package-boundary.test.ts"
- "docs/debug/mirror-runtime-canonical-entrypoints.md"
- ".github/workflows/mirror-runtime-ci.yml"
Expand Down Expand Up @@ -79,6 +82,9 @@ jobs:
with:
install-bun: "false"

- name: Run Mirror runtime boundary smoke target
run: pnpm test:mirror:smoke

- name: Download Mirror runtime dist artifact
uses: actions/download-artifact@v4
with:
Expand All @@ -94,5 +100,8 @@ jobs:
- name: Smoke packaged Mirror CLI entry
run: /tmp/mirror-runtime-smoke/mirror-runtime-linux/rootfs/opt/mirror-runtime/bin/mirror help

- name: Smoke packaged Mirror runtime service
run: node --import tsx scripts/ci-mirror-smoke.ts --runtime-root /tmp/mirror-runtime-smoke/mirror-runtime-linux/rootfs/opt/mirror-runtime

- name: Smoke built Mirror runtime service
run: pnpm smoke:mirror && pnpm verify:mirror-runtime-dist
89 changes: 51 additions & 38 deletions docs/architecture/mirror-runtime-split-readiness-checklist.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,49 +59,58 @@ Current score: `yellow`
Current reality:

- Service runtime state is real and daemon-backed.
- Console and CLI parity improved materially, but should still be treated as a seam until one runtime truth is clearly universal.
- CLI parity improved materially for status, sync summary, and key operator-truth flows.
- Daemon-side runtime, debug, and health websocket truth is now covered with focused tests.
- Console execution and a few remaining compatibility edges should still be treated as the next ownership seam until one runtime truth is clearly universal.

### 2. Service and operator surfaces

Current score: `yellow`

- [ ] Canonical read-only operator surfaces are present and stable.
- [ ] Health, runtime, debug, actions, providers, and sync surfaces are consistent in style and ownership.
- [x] Canonical read-only operator surfaces are present and stable.
- [x] Health, runtime, debug, actions, providers, and sync surfaces are consistent in style and ownership.
- [ ] Operator-facing surfaces do not depend on legacy `src/runtime/**` wrappers.
- [ ] Additive runtime/status endpoints are covered by service-level tests.
- [x] Additive runtime/status endpoints are covered by service-level tests.

Current reality:

- `/mirror/health`, `/mirror/status`, `/mirror/runtime`, `/mirror/runtime/debug`, `/mirror/actions`, `/mirror/providers`, and `/mirror/sync` are real.
- This area is close, but operator truth is still uneven in CLI status and verify-lore flows.
- `mirror status` is daemon-backed and limited to runtime truth only on the canonical Mirror path.
- Websocket transport/control/summary truth is now materially covered at both service and daemon state layers.
- This area is materially improved, but should remain yellow until compatibility-only wrappers stop competing with the canonical operator path and console/runtime ownership is tighter.

### 3. Sync and runtime state visibility

Current score: `yellow`

- [ ] Sync peer state is available on a canonical read-only runtime surface.
- [ ] `/mirror-sync/peers` and `/mirror-sync/updates` have focused service-level regression coverage.
- [x] Sync peer state is available on a canonical read-only runtime surface.
- [x] `/mirror-sync/peers` and `/mirror-sync/updates` have focused service-level regression coverage.
- [ ] Runtime event surfaces expose enough state to understand sync activity without reading internal modules.
- [ ] Sync state is summarized consistently between operator surfaces and runtime state.
- [x] Sync state is summarized consistently between operator surfaces and runtime state.

Current reality:

- Sync read surfaces are real.
- `/mirror/sync` now exposes read-only peer state from the live registry.
- CLI status parity now covers the daemon-backed sync summary.
- Sync is still a seam because execution state is not fully daemon-owned beyond the current registry and event stream summaries.
- The remaining small gap here is narrower now: understanding sync activity from daemon-owned inspection without reading internal execution modules.

### 4. CLI and service parity

Current score: `yellow`

- [ ] `mirror` CLI commands execute through the same canonical runtime plane used by service ingress.
- [ ] Read operations and mutable operations report the same runtime truth regardless of surface.
- [ ] Focused parity tests exist for status, sync, and key tool flows.
- [x] Focused parity tests exist for status, sync, and key tool flows.
- [ ] Operator commands do not silently fall back to stale or compatibility-only logic.

Current reality:

- CLI coverage is much better than before, but this should not be treated as fully green until parity is explicit for all critical operator surfaces.
- `mirror status` and sync summary parity are now explicit and tested.
- The canonical `mirror verify-lore` path is aligned on `MIRROR_LORE_DIR`.
- CLI/operator-truth seams are materially improved and now included in the dedicated Mirror smoke lane.
- This should not be treated as fully green until parity is explicit for all critical operator surfaces and compatibility-only entrypoints are no longer misleading.

### 5. Observability ownership

Expand All @@ -115,61 +124,65 @@ Current score: `red`
Current reality:

- Observability surfaces exist and are useful.
- Ownership is still process-global enough that this remains a pre-split blocker.
- Ownership is still process-global enough that this remains the clearest technical pre-split blocker.

### 6. Compatibility quarantine

Current score: `red`
Current score: `yellow`

- [ ] `src/runtime/server.ts`, `src/runtime/brain-chat.ts`, `src/runtime/health.ts`, and `src/cli/mirror-cli.ts` are either quarantined clearly or removed.
- [ ] Mirror-owned runtime modules do not read `OPENCLAW_*` env vars except in explicit compatibility files.
- [ ] Canonical operator docs and entrypoints point to Mirror-native paths first.
- [x] `src/runtime/server.ts`, `src/runtime/brain-chat.ts`, `src/runtime/health.ts`, and `src/cli/mirror-cli.ts` are clearly marked as compatibility shims.
- [x] Mirror-owned runtime modules do not read `OPENCLAW_*` env vars except in explicit compatibility files.
- [x] Focused guardrail coverage exists for the main shims and the remaining legacy runtime entrypoints.
- [x] Canonical operator docs and entrypoints point to Mirror-native paths first.
- [ ] Compatibility code is not the hidden owner of any required runtime behavior.

Current reality:

- Compatibility edges are still materially present at entrypoint and env-boundary level.
- This is still one of the clearest blockers to a clean split.
- Canonical Mirror-owned source no longer reads `OPENCLAW_*` directly outside tests and explicit compatibility paths.
- Canonical entrypoint, operator, and JSON automation docs now point to Mirror-native paths first and describe `openclaw mirror ...` as compatibility-only.
- Compatibility edges are still materially present at entrypoint and wrapper level, but they are now better quarantined and guarded.
- This should remain yellow until the remaining compat entrypoints stop competing with canonical ownership in practice and compatibility code stops owning any required behavior.

### 7. Packaging and build boundary

Current score: `red`
Current score: `yellow`

- [ ] Mirror has a first-class package and build boundary inside the repo.
- [ ] Mirror artifacts can be built and tested without treating OpenClaw as the primary product identity.
- [ ] Release and packaging paths for Mirror are explicit enough to survive a repo split.
- [x] Mirror has a first-class package and build boundary inside the repo.
- [x] Mirror artifacts can be built and tested without treating OpenClaw as the primary product identity.
- [x] Release and packaging paths for Mirror are explicit enough to survive a repo split.

Current reality:

- Mirror runtime behavior is increasingly standalone.
- Package, bin, and release identity are still shared enough that splitting now would be premature.
- Mirror now has an explicit package boundary, standalone Linux runtime artifact, extracted-artifact smoke, dist verification, and bootstrap verification.
- Package, bin, and release identity are materially more explicit and guarded than they were before the recent split-readiness PRs.
- This area should remain yellow because the package/build boundary is now real, but the remaining blockers are runtime ownership and observability rather than packaging viability.

### 8. CI gates before split

Current score: `red`
Current score: `yellow`

- [ ] A dedicated Mirror runtime smoke lane exists.
- [ ] A boundary gate prevents new OpenClaw-specific env/config coupling inside Mirror-owned runtime modules.
- [ ] Split-critical runtime tests are visible without depending on the full repo matrix.
- [x] A dedicated Mirror runtime smoke lane exists.
- [x] Split-critical runtime-boundary and daemon-truth tests are visible without depending on the full repo matrix.
- [x] Boundary gates prevent new OpenClaw-specific env/config and import/package coupling inside Mirror-owned runtime modules.
- [x] Mirror-specific checks are isolated enough to serve as a true split gate rather than an early smoke lane.

Current reality:

- Runtime tests exist.
- Dedicated split-readiness gates are still missing.
- A dedicated Mirror-owned smoke target now exists and is wired into the dedicated Mirror runtime workflow.
- Runtime-boundary, daemon-truth, websocket, CLI/operator-truth, compatibility-quarantine, packaged-runtime truth, and OpenClaw env/import boundary seams are now visible in a narrow CI lane.
- Dedicated split-readiness gates now include first-class boundary enforcement for new OpenClaw-specific env/config and import/package coupling inside Mirror-owned modules.
- macOS shard-order instability should be treated as a CI lane, not as a product seam in this checklist.

## Current known gaps

The next small, high-signal gaps remain:

1. Make any remaining console and CLI execution seams explicitly daemon-backed where they are still partial.
2. Continue enriching daemon-owned runtime events where operator/runtime inspection is still thin.
3. Move observability ownership under daemon/runtime control.
4. Remove OpenClaw env usage from canonical Mirror runtime modules.
5. Fix operator truth for `mirror status`.
6. Fix operator truth for `mirror verify-lore`.
7. Quarantine or retire compatibility-only runtime wrappers.
8. Create a Mirror-native package/build boundary.
9. Add dedicated Mirror runtime CI gates.
1. Move observability ownership under daemon/runtime control.
2. Make any remaining console execution seams explicitly daemon-backed where they are still partial.
3. Continue enriching daemon-owned runtime inspection only where sync/runtime understanding is still thin.
4. Keep parity coverage growing only where a canonical operator/runtime seam is still weak.
5. Continue shrinking compatibility entrypoints from “guarded” to “non-owning in practice.”
6. Keep package/release verification narrow and trustworthy while the remaining runtime seams are closed.

## Do Not Split Before

Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
"test:live": "OPENCLAW_LIVE_TEST=1 CLAWDBOT_LIVE_TEST=1 vitest run --config vitest.live.config.ts",
"test:macmini": "OPENCLAW_TEST_VM_FORKS=0 OPENCLAW_TEST_PROFILE=serial node scripts/test-parallel.mjs",
"test:mirror": "vitest run --config vitest.mirror.config.ts",
"test:mirror:smoke": "node scripts/test-mirror-runtime-boundary-smoke.mjs",
"test:ui": "pnpm lint:ui:no-raw-window-open && pnpm --dir ui test",
"test:voicecall:closedloop": "vitest run extensions/voice-call/src/manager.test.ts extensions/voice-call/src/media-stream.test.ts src/plugins/voice-call.plugin.test.ts --maxWorkers=1",
"test:watch": "vitest",
Expand Down
2 changes: 1 addition & 1 deletion packaging/mirror-runtime/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ The package boundary intentionally excludes repository-only content:

## Linux-first Distribution Shape

The generated distribution tree is:
The generated distribution tree inside `mirror-runtime-linux.tar.gz` is:

```text
dist/mirror-runtime-linux/
Expand Down
34 changes: 33 additions & 1 deletion scripts/ci-mirror-smoke.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { pathToFileURL } from "node:url";

type MirrorService = {
app: { handle: (req: unknown, res: unknown) => void };
Expand All @@ -17,6 +18,36 @@ type MirrorPackageModule = {
) => Promise<MirrorService>;
};

type SmokeOptions = {
runtimeRoot?: string;
};

function parseArgs(argv: string[]): SmokeOptions {
const options: SmokeOptions = {};
for (let index = 0; index < argv.length; index += 1) {
const arg = argv[index];
if (arg === "--runtime-root") {
const value = argv[index + 1];
if (!value) {
throw new Error("Missing value for --runtime-root");
}
options.runtimeRoot = path.resolve(value);
index += 1;
continue;
}
throw new Error(`Unsupported argument: ${arg}`);
}
return options;
}

async function loadMirrorPackageModule(runtimeRoot?: string): Promise<MirrorPackageModule> {
if (!runtimeRoot) {
return (await import("../dist/mirror-package.js")) as MirrorPackageModule;
}
const modulePath = path.join(runtimeRoot, "dist", "mirror-package.js");
return (await import(pathToFileURL(modulePath).href)) as MirrorPackageModule;
}

async function seedLoreCorpus(loreDir: string): Promise<void> {
const indexDir = path.join(loreDir, "_index");
await fs.mkdir(indexDir, { recursive: true });
Expand Down Expand Up @@ -116,6 +147,7 @@ async function requestJsonFromApp(
}

async function main(): Promise<void> {
const options = parseArgs(process.argv.slice(2));
const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "mirror-ci-smoke-"));
const loreDir = path.join(tempRoot, "lore-scrolls");
const memoryDbPath = path.join(tempRoot, "mirror-memory.sqlite");
Expand All @@ -126,7 +158,7 @@ async function main(): Promise<void> {
process.env.MIRROR_LORE_DIR = loreDir;
process.env.MIRROR_MEMORY_DB_PATH = memoryDbPath;

const mirrorPackage = (await import("../dist/mirror-package.js")) as MirrorPackageModule;
const mirrorPackage = await loadMirrorPackageModule(options.runtimeRoot);
const fetchImpl: typeof fetch = async (_url, _init) =>
({
ok: true,
Expand Down
87 changes: 87 additions & 0 deletions scripts/test-mirror-runtime-boundary-smoke.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import { spawnSync } from "node:child_process";

const steps = [
{
name: "daemon/runtime-state truth",
command: "pnpm",
args: [
"vitest",
"run",
"src/mirrordaemon/mirrordaemon.test.ts",
"src/mirrordaemon/runtime_state.test.ts",
],
},
{
name: "Mirror-owned OpenClaw env/import boundary gates",
command: "pnpm",
args: [
"vitest",
"run",
"src/mirror/openclaw-env-boundary.test.ts",
"src/mirror/openclaw-import-boundary.test.ts",
],
},
{
name: "compatibility-quarantine guardrails",
command: "pnpm",
args: [
"vitest",
"run",
"src/compat/openclaw/shim-boundary.test.ts",
"src/runtime/compat-legacy-boundary.test.ts",
],
},
{
name: "websocket transport/control/summary truth",
command: "pnpm",
args: [
"vitest",
"run",
"src/mirror-service/mirror_service.test.ts",
"-t",
[
"exposes canonical runtime state and debug endpoints",
"emits daemon runtime events for chat, tool, provider, and sync lifecycle",
"streams /mirror/runtime/ws with backlog, live events, and protocol messages",
"surfaces runtime websocket connect and disconnect events to live subscribers",
"replays prior websocket transport events from backlog to reconnecting subscribers",
"replays backlog only when explicitly requested by subscribe control messages",
"returns websocket error envelopes for unsupported control messages",
"returns websocket error envelopes for invalid control payloads",
"reflects websocket connection counts on the runtime summary as sockets connect and disconnect",
"keeps service, console, daemon, observability, and status surfaces in sync",
].join("|"),
],
},
{
name: "Mirror CLI/operator truth",
command: "pnpm",
args: [
"vitest",
"run",
"src/mirror-cli/mirror_cli.test.ts",
"-t",
[
"supports standalone status and verify-lore commands",
"uses MIRROR_LORE_DIR defaults for verify-lore against the current lore root",
"supports sync commands in human-readable mode",
"returns stable JSON shapes for sync commands",
"reports CLI status from the same daemon-backed runtime truth after command execution",
"keeps mirror status limited to canonical runtime truth after sync announce",
].join("|"),
],
},
];

for (const step of steps) {
process.stdout.write(`\n[mirror-smoke] ${step.name}\n`);
const result = spawnSync(step.command, step.args, {
stdio: "inherit",
shell: process.platform === "win32",
});
if (result.status !== 0) {
process.exit(result.status ?? 1);
}
}

process.stdout.write(`\n[mirror-smoke] completed: ${steps.map((step) => step.name).join(" | ")}\n`);
2 changes: 1 addition & 1 deletion src/cli/program/register.subclis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ const entries: SubCliEntry[] = [
description: "Mirror compatibility commands (standalone runtime ships as `mirror`)",
hasSubcommands: true,
register: async (program) => {
const mod = await import("../../mirror/telemetry_tail/cli.js");
const mod = await import("../../mirror/telemetry_tail/index.js");
mod.registerMirrorTelemetryCli(program);
},
},
Expand Down
2 changes: 1 addition & 1 deletion src/compat/openclaw/cli/mirror-cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
*/

import type { Command } from "commander";
import { runMirrorTelemetryTailCli } from "../../../mirror/telemetry_tail/cli.js";
import { runMirrorTelemetryTailCli } from "../../../mirror/telemetry_tail/index.js";

function parseLimit(raw: string): number {
const value = Number.parseInt(raw, 10);
Expand Down
Loading
Loading