Fix remaining OpenCode review comments

This commit is contained in:
Konan69
2026-03-05 16:07:12 +01:00
parent 69c453b274
commit f4f9d6fd3f
4 changed files with 99 additions and 70 deletions

View File

@@ -141,38 +141,41 @@ export async function execute(ctx: AdapterExecutionContext): Promise<AdapterExec
} }
const instructionsFilePath = asString(config.instructionsFilePath, "").trim(); const instructionsFilePath = asString(config.instructionsFilePath, "").trim();
const instructionsDir = instructionsFilePath ? `${path.dirname(instructionsFilePath)}/` : ""; const resolvedInstructionsFilePath = instructionsFilePath
? path.resolve(cwd, instructionsFilePath)
: "";
const instructionsDir = resolvedInstructionsFilePath ? `${path.dirname(resolvedInstructionsFilePath)}/` : "";
let instructionsPrefix = ""; let instructionsPrefix = "";
if (instructionsFilePath) { if (resolvedInstructionsFilePath) {
try { try {
const instructionsContents = await fs.readFile(instructionsFilePath, "utf8"); const instructionsContents = await fs.readFile(resolvedInstructionsFilePath, "utf8");
instructionsPrefix = instructionsPrefix =
`${instructionsContents}\n\n` + `${instructionsContents}\n\n` +
`The above agent instructions were loaded from ${instructionsFilePath}. ` + `The above agent instructions were loaded from ${resolvedInstructionsFilePath}. ` +
`Resolve any relative file references from ${instructionsDir}.\n\n`; `Resolve any relative file references from ${instructionsDir}.\n\n`;
await onLog( await onLog(
"stderr", "stderr",
`[paperclip] Loaded agent instructions file: ${instructionsFilePath}\n`, `[paperclip] Loaded agent instructions file: ${resolvedInstructionsFilePath}\n`,
); );
} catch (err) { } catch (err) {
const reason = err instanceof Error ? err.message : String(err); const reason = err instanceof Error ? err.message : String(err);
await onLog( await onLog(
"stderr", "stderr",
`[paperclip] Warning: could not read agent instructions file "${instructionsFilePath}": ${reason}\n`, `[paperclip] Warning: could not read agent instructions file "${resolvedInstructionsFilePath}": ${reason}\n`,
); );
} }
} }
const commandNotes = (() => { const commandNotes = (() => {
if (!instructionsFilePath) return [] as string[]; if (!resolvedInstructionsFilePath) return [] as string[];
if (instructionsPrefix.length > 0) { if (instructionsPrefix.length > 0) {
return [ return [
`Loaded agent instructions from ${instructionsFilePath}`, `Loaded agent instructions from ${resolvedInstructionsFilePath}`,
`Prepended instructions + path directive to stdin prompt (relative references from ${instructionsDir}).`, `Prepended instructions + path directive to stdin prompt (relative references from ${instructionsDir}).`,
]; ];
} }
return [ return [
`Configured instructionsFilePath ${instructionsFilePath}, but file could not be read; continuing without injected instructions.`, `Configured instructionsFilePath ${resolvedInstructionsFilePath}, but file could not be read; continuing without injected instructions.`,
]; ];
})(); })();

View File

@@ -81,6 +81,15 @@ export async function testEnvironment(
} }
const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env })); const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env }));
const cwdInvalid = checks.some((check) => check.code === "opencode_cwd_invalid");
if (cwdInvalid) {
checks.push({
code: "opencode_command_skipped",
level: "warn",
message: "Skipped command check because working directory validation failed.",
detail: command,
});
} else {
try { try {
await ensureCommandResolvable(command, cwd, runtimeEnv); await ensureCommandResolvable(command, cwd, runtimeEnv);
checks.push({ checks.push({
@@ -96,6 +105,7 @@ export async function testEnvironment(
detail: command, detail: command,
}); });
} }
}
const canRunProbe = const canRunProbe =
checks.every((check) => check.code !== "opencode_cwd_invalid" && check.code !== "opencode_command_unresolvable"); checks.every((check) => check.code !== "opencode_cwd_invalid" && check.code !== "opencode_command_unresolvable");
@@ -174,6 +184,7 @@ export async function testEnvironment(
if (variant) args.push("--variant", variant); if (variant) args.push("--variant", variant);
if (extraArgs.length > 0) args.push(...extraArgs); if (extraArgs.length > 0) args.push(...extraArgs);
try {
const probe = await runChildProcess( const probe = await runChildProcess(
`opencode-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`, `opencode-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`,
command, command,
@@ -232,6 +243,15 @@ export async function testEnvironment(
hint: "Run `opencode run --format json` manually in this working directory to debug.", hint: "Run `opencode run --format json` manually in this working directory to debug.",
}); });
} }
} catch (err) {
checks.push({
code: "opencode_hello_probe_failed",
level: "error",
message: "OpenCode hello probe failed.",
detail: err instanceof Error ? err.message : String(err),
hint: "Run `opencode run --format json` manually in this working directory to debug.",
});
}
} }
return { return {

View File

@@ -149,6 +149,8 @@ export function OnboardingWizard() {
const { const {
data: adapterModels, data: adapterModels,
error: adapterModelsError, error: adapterModelsError,
isLoading: adapterModelsLoading,
isFetching: adapterModelsFetching,
} = useQuery({ } = useQuery({
queryKey: queryKey:
createdCompanyId createdCompanyId
@@ -332,6 +334,10 @@ export function OnboardingWizard() {
); );
return; return;
} }
if (adapterModelsLoading || adapterModelsFetching) {
setError("OpenCode models are still loading. Please wait and try again.");
return;
}
const discoveredModels = adapterModels ?? []; const discoveredModels = adapterModels ?? [];
if (!discoveredModels.some((entry) => entry.id === selectedModelId)) { if (!discoveredModels.some((entry) => entry.id === selectedModelId)) {
setError( setError(

View File

@@ -12,5 +12,5 @@ export function extractProviderIdWithFallback(modelId: string, fallback = "other
export function extractModelName(modelId: string): string { export function extractModelName(modelId: string): string {
const trimmed = modelId.trim(); const trimmed = modelId.trim();
if (!trimmed.includes("/")) return trimmed; if (!trimmed.includes("/")) return trimmed;
return trimmed.slice(trimmed.indexOf("/") + 1); return trimmed.slice(trimmed.indexOf("/") + 1).trim();
} }