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