refactor: converge hwpod node-ops channel

This commit is contained in:
Codex Agent
2026-06-05 16:47:50 +08:00
parent 8a1cd5c725
commit 3e7131f6ab
117 changed files with 1056 additions and 19327 deletions
+3 -9
View File
@@ -34,7 +34,6 @@ export const checkProfiles = Object.freeze({
{ id: "check-013-repo-index", group: "repo", command: ["node","--check","internal/audit/index.mjs"] },
{ id: "check-014-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","internal/db/runtime-store.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-015-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","internal/db/runtime-store.test.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-016-smoke-summary", group: "smoke", command: ["node","--check","internal/mvp-gate/summary.mjs"] },
{ id: "check-017-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","internal/cloud/db-contract.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-018-repo-cloud-web-routes", group: "repo", command: ["node","--check","internal/dev-entrypoint/cloud-web-routes.mjs"] },
{ id: "check-019-repo-cloud-web-proxy", group: "repo", command: ["node","--check","internal/dev-entrypoint/cloud-web-proxy.mjs"] },
@@ -58,7 +57,6 @@ export const checkProfiles = Object.freeze({
{ id: "check-035-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","internal/cloud/server-health.test.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-036-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","internal/cloud/server-agent-chat.test.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-037-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","internal/cloud/server-m3-http.test.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-038-repo-fake-data", group: "repo", command: ["node","--check","internal/device-pod/fake-data.mjs"] },
{ id: "check-039-repo-model", group: "repo", command: ["node","--check","internal/sim/model.mjs"] },
{ id: "check-040-repo-model-test", group: "repo", command: ["node","--check","internal/sim/model.test.mjs"] },
{ id: "check-041-repo-http", group: "repo", command: ["node","--check","internal/sim/http.mjs"] },
@@ -68,17 +66,14 @@ export const checkProfiles = Object.freeze({
{ id: "check-045-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","cmd/hwlab-cloud-api/main.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-046-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","cmd/hwlab-cloud-api/provision.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-047-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","cmd/hwlab-cloud-api/migrate.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-048-runtime-services-run-bun", group: "runtime-services", command: ["node","scripts/run-bun.mjs","test","cmd/hwlab-edge-proxy/main.test.ts","cmd/hwlab-device-pod/main.test.ts","cmd/hwlab-gateway/main.test.ts","cmd/hwlab-codex-api-responses-forwarder/main.test.ts","cmd/hwlab-deepseek-responses-bridge/main.test.ts"] },
{ id: "check-048-runtime-services-run-bun", group: "runtime-services", command: ["node","scripts/run-bun.mjs","test","cmd/hwlab-edge-proxy/main.test.ts","cmd/hwlab-gateway/main.test.ts","cmd/hwlab-codex-api-responses-forwarder/main.test.ts","cmd/hwlab-deepseek-responses-bridge/main.test.ts"] },
{ id: "check-056-repo-main", group: "repo", command: ["node","scripts/run-bun.mjs","build","cmd/hwlab-gateway/main.ts","cmd/hwlab-gateway/main.test.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-058-tools-hwlab-gateway-shell", group: "tools", command: ["node","--check","tools/hwlab-gateway-shell.mjs"] },
{ id: "check-059-tools-hwlab-gateway-tran", group: "tools", command: ["node","--check","tools/hwlab-gateway-tran.mjs"] },
{ id: "check-060-tools-tran", group: "tools", command: ["node","--check","tools/tran.mjs"] },
{ id: "check-060a-tools-unidesk-ssh", group: "tools", command: ["node","--check","tools/unidesk-ssh.mjs"] },
{ id: "check-061-tools-device-pod-cli", group: "tools", command: ["node","scripts/run-bun.mjs","build","tools/device-pod-cli.ts","tools/device-pod-cli.test.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-061a-tools-device-pod-cli-test", group: "tools", command: ["node","scripts/run-bun.mjs","test","tools/device-pod-cli.test.ts"] },
{ id: "check-062-tools-device-pod-cli", group: "tools", command: ["node","--check","tools/device-pod-cli.mjs"] },
{ id: "check-062a-tools-device-pod-cli-skill-wrapper", group: "tools", command: ["node","--check","skills/device-pod-cli/scripts/device-pod-cli.mjs"] },
{ id: "check-063-tools-device-host-cli", group: "tools", command: ["node","--check","skills/device-pod-cli/assets/device-host-cli.mjs"] },
{ id: "check-061-tools-hwpod-cli", group: "tools", command: ["node","scripts/run-bun.mjs","build","tools/hwpod-cli.ts","tools/hwpod-ctl.ts","tools/hwpod-compiler-cli.ts","tools/hwpod-node.ts","tools/hwpod-harness.test.ts","tools/hwpod-node.test.ts","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-061a-tools-hwpod-cli-test", group: "tools", command: ["node","scripts/run-bun.mjs","test","tools/hwpod-harness.test.ts","tools/hwpod-node.test.ts"] },
{ id: "check-064-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","scripts/cloud-api-runtime-smoke.mjs","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-065-cloud-api-run-bun", group: "cloud-api", command: ["node","scripts/run-bun.mjs","build","scripts/code-agent-chat-smoke.mjs","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-066-dev-runtime-dev-edge-health-smoke", group: "dev-runtime", command: ["node","--check","scripts/dev-edge-health-smoke.mjs"] },
@@ -97,7 +92,6 @@ export const checkProfiles = Object.freeze({
{ id: "check-079-smoke-m3-io-control-e2e", group: "smoke", command: ["node","--check","scripts/m3-io-control-e2e.mjs"] },
{ id: "check-080-smoke-run-bun", group: "smoke", command: ["node","scripts/run-bun.mjs","build","scripts/src/m3-io-control-e2e.mjs","--target=bun","--packages=external","--outdir=/tmp/hwlab-ts-check"] },
{ id: "check-081-smoke-m3-io-control-e2e-test", group: "smoke", command: ["node","--check","scripts/m3-io-control-e2e.test.mjs"] },
{ id: "check-082-cloud-web-dev-cloud-workbench-smoke-test", group: "cloud-web", command: ["node","--check","scripts/dev-cloud-workbench-smoke.test.mjs"] },
{ id: "check-083-cloud-web-browser-launcher", group: "cloud-web", command: ["node","--check","scripts/src/browser-launcher.mjs"] },
{ id: "check-084-cloud-web-playwright-launch-guard", group: "cloud-web", command: ["node","--check","scripts/src/playwright-launch-guard.mjs"] },
{ id: "check-085-cloud-web-playwright-launch-guard-cli", group: "cloud-web", command: ["node","--check","scripts/playwright-launch-guard.mjs"] },
File diff suppressed because it is too large Load Diff
+10 -6
View File
@@ -45,10 +45,16 @@ export const DEFAULT_RUNTIME_PACKAGE_FIELDS = Object.freeze([
export const DEFAULT_SHARED_RUNTIME_PATHS = Object.freeze([
"internal/protocol/",
"internal/build-metadata.mjs",
"tools/device-pod-cli.mjs",
"tools/device-pod-cli.ts",
"tools/src/device-pod-cli-lib.ts",
"skills/device-pod-cli/"
"tools/hwpod-cli.ts",
"tools/hwpod-ctl.ts",
"tools/hwpod-compiler-cli.ts",
"tools/hwpod-node.ts",
"tools/src/hwpod-harness-lib.ts",
"tools/src/hwpod-node-lib.ts",
"tools/src/hwpod-node-ops-contract.ts",
"tools/src/runtime-endpoint-resolver.ts",
"skills/hwpod-cli/",
"skills/hwpod-ctl/"
]);
export const DEFAULT_DOCS_ONLY_PATHS = Object.freeze([
@@ -81,7 +87,6 @@ const serviceSpecificPaths = Object.freeze({
"internal/dev-entrypoint/cloud-web-proxy.mjs",
"internal/dev-entrypoint/cloud-web-routes.mjs"
],
"hwlab-device-pod": ["cmd/hwlab-device-pod/", "internal/device-pod/"],
"hwlab-gateway": ["cmd/hwlab-gateway/"],
"hwlab-edge-proxy": ["cmd/hwlab-edge-proxy/", "internal/dev-entrypoint/http.mjs"],
"hwlab-agent-skills": ["skills/"]
@@ -91,7 +96,6 @@ const bunCommandServices = new Set([
"hwlab-cloud-api",
"hwlab-codex-api-responses-forwarder",
"hwlab-deepseek-responses-bridge",
"hwlab-device-pod",
"hwlab-gateway",
"hwlab-edge-proxy"
]);
+6 -43
View File
@@ -19,7 +19,6 @@ import {
buildM3IoControlSourceReport,
runM3IoControlLiveReport
} from "./m3-io-control-e2e.mjs";
import { runDevCloudWorkbenchLayoutSmoke } from "./dev-cloud-workbench-smoke-lib.mjs";
import { classifyCodexRunnerCapability } from "./code-agent-response-contract.mjs";
import {
HWLAB_AGENT_RUNTIME_SKILL_CLI_VERSION,
@@ -157,10 +156,6 @@ export async function buildRpt004Report(args = {}, options = {}) {
return finalizeReport(report);
}
const layoutCheck = await runLayoutDimension(parsed, options);
report.dimensions.layout = layoutCheck;
addCheck(report, layoutCheck);
const codeAgentReport = await runCodeAgentSessionDimension(parsed, options);
report.live.codeAgent = codeAgentReport.summary;
report.dimensions.codeAgentSession = codeAgentReport.sessionCheck;
@@ -259,8 +254,8 @@ export function classifyRpt004Conclusion(checks = [], options = {}) {
classification: "MVP_PASS",
mvpPass: true,
summary: options.allowM3Write === true
? "RPT-004 MVP PASS: current live revision, default Chinese workbench, layout smoke, Code Agent session, Skill CLI HWLAB API route, M3 trusted IO loop, and durable evidence are green."
: "RPT-004 MVP PASS: current live revision, default Chinese workbench, layout smoke, Code Agent session, Skill CLI HWLAB API route, and default read-only M3 route verification are green; no M3 write was attempted."
? "RPT-004 MVP PASS: current live revision, default Chinese workbench, Code Agent session, Skill CLI HWLAB API route, M3 trusted IO loop, and durable evidence are green."
: "RPT-004 MVP PASS: current live revision, default Chinese workbench, Code Agent session, Skill CLI HWLAB API route, and default read-only M3 route verification are green; no M3 write was attempted."
};
}
@@ -668,7 +663,7 @@ function baseReport({ parsed, now, root }) {
"docs/reference/code-agent-chat-readiness.md",
"skills/hwlab-agent-runtime/SKILL.md"
],
summary: "RPT-004 keeps layout, live revision, M3 trusted IO, durable evidence, and Code Agent skill-path checks in one repo-owned entrypoint."
summary: "RPT-004 keeps live revision, M3 trusted IO, durable evidence, and Code Agent skill-path checks in one repo-owned entrypoint."
},
validationCommands: [
"node --check scripts/rpt004-mvp-e2e-harness.mjs",
@@ -707,7 +702,6 @@ function baseReport({ parsed, now, root }) {
revision: null,
health: null,
workbench: null,
layout: null,
m3TrustedLoop: null,
durableEvidence: null,
codeAgentSkillPath: null,
@@ -730,8 +724,8 @@ function baseReport({ parsed, now, root }) {
m3WritesLimitedToSimulatorDoDiResetLoop: true,
openAiFallbackCountsAsPass: false,
statement: liveMutationUsed
? "This harness performs public DEV HTTP checks, browser layout smoke, Code Agent session/Skill CLI checks, and an explicit DEV-only bounded M3 simulator DO/DI loop after current+healthy preconditions. It never applies deploys or starts rollouts."
: "Default live mode performs public DEV HTTP checks, browser layout smoke, Code Agent session/Skill CLI checks, and read-only M3 route payload classification only. It never writes DO1, applies deploys, starts rollouts, reads secrets, or touches PROD."
? "This harness performs public DEV HTTP checks, Code Agent session/Skill CLI checks, and an explicit DEV-only bounded M3 simulator DO/DI loop after current+healthy preconditions. It never applies deploys or starts rollouts."
: "Default live mode performs public DEV HTTP checks, Code Agent session/Skill CLI checks, and read-only M3 route payload classification only. It never writes DO1, applies deploys, starts rollouts, reads secrets, or touches PROD."
}
};
}
@@ -813,7 +807,6 @@ function sourceHarnessCheck(root) {
"scripts/rpt004-mvp-e2e-harness.mjs",
"scripts/src/rpt004-mvp-e2e-harness.mjs",
"scripts/src/rpt004-mvp-e2e-harness.test.mjs",
"scripts/dev-cloud-workbench-layout-smoke.mjs",
"scripts/m3-io-control-e2e.mjs",
"scripts/code-agent-chat-smoke.mjs",
"skills/hwlab-agent-runtime/SKILL.md"
@@ -940,35 +933,6 @@ function classifyDefaultChineseWorkbench(html) {
};
}
async function runLayoutDimension(parsed, options) {
const layoutRunner = options.layoutRunner ?? runDevCloudWorkbenchLayoutSmoke;
const layout = await layoutRunner({
live: true,
urlExplicit: true,
url: parsed.url,
timeoutMs: parsed.timeoutMs,
artifactDir: path.join("tmp", "rpt004-layout", safeTimestamp())
});
const pass = layout.status === "pass";
return {
id: "layout-smoke-hit-target",
status: pass ? "pass" : "blocked",
summary: pass
? "Live layout smoke passed across desktop/mobile hit target, overflow, and route checks."
: `Live layout smoke is blocked: ${layout.summary ?? layout.status}.`,
evidenceLevel: pass ? "DEV-LIVE-LAYOUT" : "BLOCKED",
observations: {
status: layout.status,
sourceMode: layout.sourceMode,
url: layout.url,
failureCount: Array.isArray(layout.failures) ? layout.failures.length : 0,
blockers: layout.blockers ?? [],
screenshotDir: layout.artifacts?.screenshotDir ?? null,
screenshotCount: Array.isArray(layout.artifacts?.screenshots) ? layout.artifacts.screenshots.length : 0
}
};
}
async function runCodeAgentSkillPathDimension(parsed, options) {
const endpoint = joinBasePath(parsed.apiUrl, "/v1/agent/chat");
const response = options.codeAgentRunner
@@ -1180,7 +1144,6 @@ async function defaultM3Runner(parsed) {
function addNotRunDimensions(report, reason) {
for (const [key, id] of [
["layout", "layout-smoke-hit-target"],
["codeAgentSession", "code-agent-session-thread"],
["codeAgentSkillPath", "code-agent-skill-path"],
["skillCliM3Route", "skill-cli-hwlab-api-m3-route"],
@@ -1782,7 +1745,7 @@ function usage() {
"Usage: node scripts/rpt004-mvp-e2e-harness.mjs --live --url http://74.48.78.17:16666/ --api-url http://74.48.78.17:16667/",
"",
"Default --check/source mode validates the harness only and does not claim MVP PASS.",
"--live reads DEV health and the 16666 workbench, then runs layout, Code Agent same-session checks, and Skill CLI /v1/m3/io route classification after current+healthy preconditions pass.",
"--live reads DEV health and the 16666 workbench, then runs Code Agent same-session checks and Skill CLI /v1/m3/io route classification after current+healthy preconditions pass.",
"--allow-m3-write is required for the bounded DEV-only M3 DO/DI write loop; default live mode does not write DO1.",
"The command writes JSON and Markdown reports by default in --live mode. It never deploys, rolls out, reads secrets, or touches PROD."
].join("\n");
@@ -96,7 +96,6 @@ test("RPT-004 reports MVP_PASS only when every required live dimension passes",
check("live-revision-current", "pass"),
check("live-health-ready", "pass"),
check("16666-default-chinese-workbench", "pass"),
check("layout-smoke-hit-target", "pass"),
check("code-agent-skill-path", "pass"),
check("code-agent-session-thread", "pass"),
check("skill-cli-hwlab-api-m3-route", "pass"),