From d3d734237032db9c0850d2f0f18d2731a6feb50e Mon Sep 17 00:00:00 2001 From: Mikael Hugo Date: Mon, 11 May 2026 14:32:08 +0200 Subject: [PATCH] refactor: use sfHome() for SF-WORKFLOW.md paths and skills dir; deduplicate errorMessage - commands-handlers.js: replace process.env.HOME/.sf/agent/SF-WORKFLOW.md with sfHome() at both call sites (lines 62 and 412) - skills/directory.js: replace process.env.HOME/.sf/skills with sfHome() - tools/tool-helpers.js: remove duplicate errorMessage implementation; re-export getErrorMessage from error-utils.js under the errorMessage alias Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/resources/extensions/sf/commands-handlers.js | 7 +++---- src/resources/extensions/sf/skills/directory.js | 3 ++- src/resources/extensions/sf/tools/tool-helpers.js | 5 ++--- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/resources/extensions/sf/commands-handlers.js b/src/resources/extensions/sf/commands-handlers.js index 11765370b..221a8f6ab 100644 --- a/src/resources/extensions/sf/commands-handlers.js +++ b/src/resources/extensions/sf/commands-handlers.js @@ -27,6 +27,7 @@ import { } from "./doctor.js"; import { appendKnowledge, appendOverride } from "./files.js"; import { sfRoot } from "./paths.js"; +import { sfHome } from "./sf-home.js"; import { loadPrompt } from "./prompt-loader.js"; import { deriveState } from "./state.js"; @@ -58,9 +59,7 @@ async function fetchLatestVersionForCommand() { export function dispatchDoctorHeal(pi, scope, reportText, structuredIssues) { const workflowPath = process.env.SF_WORKFLOW_PATH ?? - join(process.env.HOME ?? "~", ".sf", "agent", "SF-WORKFLOW.md"); - const workflow = readFileSync(workflowPath, "utf-8"); - const prompt = loadPrompt("doctor-heal", { + join(sfHome(), "agent", "SF-WORKFLOW.md"); doctorSummary: reportText, structuredIssues, scopeLabel: scope ?? "active milestone / blocking scope", @@ -410,7 +409,7 @@ export async function handleTriage(args, ctx, pi, basePath) { }); const workflowPath = process.env.SF_WORKFLOW_PATH ?? - join(process.env.HOME ?? "~", ".sf", "agent", "SF-WORKFLOW.md"); + join(sfHome(), "agent", "SF-WORKFLOW.md"); const workflow = readFileSync(workflowPath, "utf-8"); pi.sendMessage( { diff --git a/src/resources/extensions/sf/skills/directory.js b/src/resources/extensions/sf/skills/directory.js index 959fa7cfb..dfeb5881e 100644 --- a/src/resources/extensions/sf/skills/directory.js +++ b/src/resources/extensions/sf/skills/directory.js @@ -9,12 +9,13 @@ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; +import { sfHome } from "../sf-home.js"; const SKILL_FILENAME = "SKILL.md"; export { SKILL_FILENAME }; -const USER_SKILL_DIR = join(process.env.HOME ?? "", ".sf", "skills"); +const USER_SKILL_DIR = join(sfHome(), "skills"); export { USER_SKILL_DIR }; diff --git a/src/resources/extensions/sf/tools/tool-helpers.js b/src/resources/extensions/sf/tools/tool-helpers.js index 2ae45a7aa..058c6077f 100644 --- a/src/resources/extensions/sf/tools/tool-helpers.js +++ b/src/resources/extensions/sf/tools/tool-helpers.js @@ -9,6 +9,7 @@ */ import { promises as fs, constants as fsConstants } from "node:fs"; import { dirname } from "node:path"; +import { getErrorMessage } from "../error-utils.js"; import { appendEvent } from "../workflow-events.js"; import { logWarning } from "../workflow-logger.js"; import { writeManifest } from "../workflow-manifest.js"; @@ -37,9 +38,7 @@ export async function ensureWritableParent(filePath) { * * Consumer: complete-task.js, complete-slice.js error formatting. */ -export function errorMessage(error) { - return error instanceof Error ? error.message : String(error); -} +export const errorMessage = getErrorMessage; /** * Run the standard post-mutation hook: project all projections, write the