Compare commits

...

4 Commits

Author SHA1 Message Date
xiaoju 7ca3ad5d65 debug: dump raw NDJSON for issue #439 investigation
Saves Claude Code stdout to /tmp/uwf-ndjson-dump/ before parsing.
Temporary — remove after root cause confirmed.

Refs #439
2026-05-23 12:24:05 +00:00
xiaomo 52879c0028 Merge pull request 'feat(cli-workflow): implement multi-strategy workflow resolution' (#438) from fix/428-multi-strategy-workflow-resolution into main 2026-05-23 11:12:56 +00:00
xiaomo 9e4527bb89 Merge pull request 'fix(cli): disable YAML anchor/alias in output' (#437) from fix/yaml-no-alias into main 2026-05-23 11:09:11 +00:00
xingyue 5209cfa7ac fix(cli): disable YAML anchor/alias + fix biome errors in setup.ts
- Disable aliasDuplicateObjects in YAML stringify to prevent &a1/*a1
  anchors when multiple steps have identical output
- Fix unused discoverAgents function (prefixed with _) and format issue
  in setup.ts
2026-05-23 19:07:36 +08:00
4 changed files with 19 additions and 5 deletions
+6 -3
View File
@@ -141,7 +141,7 @@ function apiKeyEnvName(providerName: string): string {
* Discover uwf-* agent binaries in PATH.
* Returns sorted list of binary names (e.g., ["uwf-hermes", "uwf-claude-code"]).
*/
async function discoverAgents(): Promise<string[]> {
async function _discoverAgents(): Promise<string[]> {
try {
// Use which -a to find all uwf-* binaries in PATH
const proc = Bun.spawn(["which", "-a", "uwf-hermes", "uwf-claude-code", "uwf-cursor"], {
@@ -186,12 +186,15 @@ async function discoverAgents(): Promise<string[]> {
}
// Parse which output - each line is a path to a binary
const paths = text.trim().split("\n").filter((line) => line.length > 0);
const paths = text
.trim()
.split("\n")
.filter((line) => line.length > 0);
const agents = new Set<string>();
for (const path of paths) {
const basename = path.split("/").pop();
if (basename && basename.startsWith("uwf-") && basename !== "uwf") {
if (basename?.startsWith("uwf-") && basename !== "uwf") {
agents.add(basename);
}
}
+1 -1
View File
@@ -539,7 +539,7 @@ function collectOrderedSteps(
}
function formatYaml(value: unknown): string {
return stringify(value).trimEnd();
return stringify(value, { aliasDuplicateObjects: false }).trimEnd();
}
function formatCompactStep(index: number, item: OrderedStepItem, outputYaml: string): string {
+1 -1
View File
@@ -7,6 +7,6 @@ export function formatOutput(data: unknown, format: OutputFormat): string {
case "json":
return JSON.stringify(data);
case "yaml":
return stringify(data).trimEnd();
return stringify(data, { aliasDuplicateObjects: false }).trimEnd();
}
}
@@ -1,4 +1,5 @@
import { spawn } from "node:child_process";
import { mkdirSync, writeFileSync } from "node:fs";
import type { Store } from "@uncaged/json-cas";
import {
type AgentContext,
@@ -117,7 +118,17 @@ function spawnClaudeResume(
]);
}
const NDJSON_DUMP_DIR = "/tmp/uwf-ndjson-dump";
async function processClaudeOutput(stdout: string, store: Store): Promise<AgentRunResult> {
// Debug dump: save raw NDJSON for issue #439 investigation
try {
mkdirSync(NDJSON_DUMP_DIR, { recursive: true });
writeFileSync(`${NDJSON_DUMP_DIR}/${Date.now()}.ndjson`, stdout);
} catch {
// ignore dump failures
}
const parsed = parseClaudeCodeStreamOutput(stdout);
if (parsed !== null) {