fix: 修复 CLI repo 与状态别名解析
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { spawnSync } from "node:child_process";
|
||||
import { codexTasksQueryForTest } from "./src/code-queue";
|
||||
|
||||
type JsonRecord = Record<string, unknown>;
|
||||
@@ -148,17 +149,20 @@ export function runCodeQueueCommanderViewContract(): JsonRecord {
|
||||
const fetchCommanderLimit8 = (path: string): JsonRecord => noisyCommanderFixture(path, commanderLimit8Requests);
|
||||
const fetchNoisy = (path: string): JsonRecord => noisyCommanderFixture(path);
|
||||
const commander = codexTasksQueryForTest(["--view", "commander", "--limit", "260"], fetchCommander);
|
||||
const commanderTerminalAliases = codexTasksQueryForTest(["--view", "commander", "--status", "completed,cancelled", "--limit", "8"], fetchNoisy);
|
||||
const supervisor = codexTasksQueryForTest(["--view", "supervisor", "--limit", "260"], fetchNoisy);
|
||||
const full = codexTasksQueryForTest(["--view", "full", "--limit", "260"], fetchNoisy);
|
||||
const commanderLimit8 = codexTasksQueryForTest(["--view", "commander", "--limit", "8"], fetchCommanderLimit8);
|
||||
const fullLimit8 = codexTasksQueryForTest(["--view", "full", "--limit", "8"], fetchNoisy);
|
||||
const unreadLimit8 = codexTasksQueryForTest(["--unread", "--limit", "8"], fetchNoisy);
|
||||
const commanderBody = JSON.stringify(commander);
|
||||
const commanderTerminalAliasBody = JSON.stringify(commanderTerminalAliases);
|
||||
const commanderLimit8Body = JSON.stringify(commanderLimit8);
|
||||
const fullLimit8Body = JSON.stringify(fullLimit8);
|
||||
const unreadLimit8Body = JSON.stringify(unreadLimit8);
|
||||
const fullBody = JSON.stringify(full);
|
||||
const commanderView = asRecord(asRecord(commander).commander);
|
||||
const commanderTerminalAliasView = asRecord(asRecord(commanderTerminalAliases).commander);
|
||||
const commanderLimit8View = asRecord(asRecord(commanderLimit8).commander);
|
||||
const supervisorView = asRecord(asRecord(supervisor).supervisor);
|
||||
const filters = asRecord(commanderView.filters);
|
||||
@@ -178,6 +182,10 @@ export function runCodeQueueCommanderViewContract(): JsonRecord {
|
||||
const recentCompletedSection = asRecord(sections.recentCompleted);
|
||||
const recentIds = asArray(recentCompletedSection.items).map((item) => String(asRecord(item).id ?? ""));
|
||||
const terminalIds = asArray(terminalUnreadSection.items).map((item) => String(asRecord(item).id ?? ""));
|
||||
const terminalAliasFilters = asRecord(commanderTerminalAliasView.filters);
|
||||
const terminalAliasSections = asRecord(commanderTerminalAliasView.sections);
|
||||
const terminalAliasRecentCompleted = asRecord(terminalAliasSections.recentCompleted);
|
||||
const terminalAliasCommands = asRecord(commanderTerminalAliasView.commands);
|
||||
const activeItems = asArray(activeRunners.items).map(asRecord);
|
||||
const runningRisk = attentionItems.find((item) => item.id === "task-running-risk") ?? {};
|
||||
const limit8ActiveRunners = asRecord(commanderLimit8View.activeRunners);
|
||||
@@ -220,6 +228,22 @@ export function runCodeQueueCommanderViewContract(): JsonRecord {
|
||||
assertCondition(recentIds.length === 3, "recentCompleted commander section should be independently capped", { recentIds });
|
||||
assertCondition(terminalUnreadSection.returned === 0 && asArray(terminalUnreadSection.items).length === 0, "default commander terminal unread section should omit item details", terminalUnreadSection);
|
||||
assertCondition(String(asRecord(terminalUnreadSection.commands).unread ?? "").includes("codex unread"), "terminal unread section should point to codex unread drill-down", terminalUnreadSection);
|
||||
assertCondition(JSON.stringify(terminalAliasFilters.status) === JSON.stringify(["succeeded", "canceled"]), "completed/cancelled status aliases should normalize to succeeded/canceled", terminalAliasFilters);
|
||||
assertCondition(!commanderTerminalAliasBody.includes("task-failed-unread"), "completed/cancelled aliases should filter out failed tasks", { commanderTerminalAliasBody });
|
||||
assertCondition(String(terminalAliasCommands.refresh ?? "").includes("--status succeeded,canceled"), "normalized status aliases should be preserved in drill-down commands", terminalAliasCommands);
|
||||
assertCondition(asArray(terminalAliasRecentCompleted.items).some((item) => asRecord(item).id === "task-recent-read-docs"), "completed alias should include read succeeded tasks in recent completed", terminalAliasRecentCompleted);
|
||||
|
||||
const badStatus = spawnSync("bun", ["scripts/cli.ts", "codex", "tasks", "--status", "done", "--limit", "1"], {
|
||||
cwd: process.cwd(),
|
||||
encoding: "utf8",
|
||||
});
|
||||
const badStatusJson = JSON.parse(badStatus.stdout) as JsonRecord;
|
||||
assertCondition(badStatus.status !== 0, "unsupported codex tasks --status should fail", { status: badStatus.status, stdout: badStatus.stdout, stderr: badStatus.stderr });
|
||||
const badStatusError = asRecord(badStatusJson.error);
|
||||
assertCondition(badStatusError.degradedReason === "validation-failed", "unsupported status should return structured validation error", badStatusError);
|
||||
assertCondition(Array.isArray(badStatusError.supported) && asArray(badStatusError.supported).includes("succeeded"), "unsupported status should list supported values", badStatusError);
|
||||
assertCondition(Array.isArray(badStatusError.aliases) && asArray(badStatusError.aliases).includes("completed->succeeded") && asArray(badStatusError.aliases).includes("cancelled->canceled"), "unsupported status should list common aliases", badStatusError);
|
||||
assertCondition(!badStatus.stdout.includes("stack") && !badStatus.stdout.includes("at parseTasksOptions"), "expected codex tasks parameter errors should not print stack traces by default", { stdout: badStatus.stdout });
|
||||
assertCondition(asRecord(supervisorView.completedUnread).count === 3 && asRecord(supervisorView.recentCompleted).count === 5, "supervisor view should remain available and keep separate unread/recent sections", supervisorView);
|
||||
assertCondition(commanderLimit8Body.length < 16_000, "commander --limit 8 output should stay compact for polling", { chars: commanderLimit8Body });
|
||||
assertCondition(asRecord(commanderLimit8View.filters).requestedLimit === 8, "commander --limit 8 should preserve requested limit disclosure", commanderLimit8View);
|
||||
@@ -244,6 +268,8 @@ export function runCodeQueueCommanderViewContract(): JsonRecord {
|
||||
"deterministic classifier emits requested categories",
|
||||
"drilldown commands are present without prompt/final-response flood",
|
||||
"commander --limit 8 omits terminal unread details and prompt previews",
|
||||
"codex tasks --status completed,cancelled aliases normalize to succeeded,canceled",
|
||||
"codex tasks invalid --status returns compact structured suggestions without stack noise",
|
||||
"full and unread drill-down paths still expose details",
|
||||
"recent completed does not duplicate terminal unread",
|
||||
"supervisor/full views remain available",
|
||||
|
||||
Reference in New Issue
Block a user