mirror of
https://github.com/affaan-m/ECC.git
synced 2026-08-24 16:32:24 +02:00
fix(opencode): don't crash the whole session when plugins/lib is missing (#2538)
* fix(opencode): don't crash the whole session when plugins/lib is missing (#2530) * fix: address review feedback (trailing newlines, symptom wording) * fix(opencode): also lazy-load the store in ecc-hooks.ts plugin entrypoint * test(opencode): add regression coverage for missing/present plugins/lib in ecc-hooks * fix(opencode): guard diagnostic log() against unhandled rejection; tighten test assertion * fix(opencode): only publish store after init succeeds; scrub loader errors from warning; catch sync log throws * fix(opencode): scrub raw loader error from changed-files tool; add tool-level regression tests * fix(ci): make OpenCode checks cross-platform --------- Co-authored-by: haelyra <49814733+haelyra@users.noreply.github.com>
This commit is contained in:
co-authored by
haelyra
parent
afa34d1aca
commit
591ab5cbd3
@@ -1,11 +1,5 @@
|
||||
import { tool, type ToolDefinition } from "@opencode-ai/plugin/tool"
|
||||
import {
|
||||
buildTree,
|
||||
getChangedPaths,
|
||||
hasChanges,
|
||||
type ChangeType,
|
||||
type TreeNode,
|
||||
} from "../plugins/lib/changed-files-store.js"
|
||||
import type { ChangeType, TreeNode } from "../plugins/lib/changed-files-store.js"
|
||||
|
||||
const INDICATORS: Record<ChangeType, string> = {
|
||||
added: "+",
|
||||
@@ -26,6 +20,32 @@ function renderTree(nodes: TreeNode[], indent: string): string {
|
||||
return lines.join("\n")
|
||||
}
|
||||
|
||||
// Loaded lazily (instead of via a top-level import) so that a missing or
|
||||
// partially-installed `~/.opencode/plugins` directory only breaks this one
|
||||
// tool when it's actually invoked, rather than throwing during module
|
||||
// evaluation. `tools/index.ts` re-exports every tool from a single barrel
|
||||
// file, so a static import failure here previously took down the entire
|
||||
// tools module -- and with it, the whole OpenCode session -- on the very
|
||||
// first tool-loading pass (see #2530).
|
||||
type ChangedFilesStore = typeof import("../plugins/lib/changed-files-store.js")
|
||||
let changedFilesStorePromise: Promise<ChangedFilesStore> | undefined
|
||||
|
||||
async function loadChangedFilesStore(): Promise<ChangedFilesStore> {
|
||||
if (!changedFilesStorePromise) {
|
||||
changedFilesStorePromise = import("../plugins/lib/changed-files-store.js").catch(() => {
|
||||
changedFilesStorePromise = undefined
|
||||
throw new Error(
|
||||
"changed-files tool: could not load the changed-files store. " +
|
||||
"This usually means the ~/.opencode/plugins directory is missing or incomplete " +
|
||||
"(an interrupted or partial ECC install can leave tools/ populated without plugins/). " +
|
||||
"Run `node scripts/repair.js --target opencode` (or `ecc repair --target opencode`) " +
|
||||
"from the ECC repo to restore the missing files."
|
||||
)
|
||||
})
|
||||
}
|
||||
return changedFilesStorePromise
|
||||
}
|
||||
|
||||
const changedFilesTool: ToolDefinition = tool({
|
||||
description:
|
||||
"List files changed by agents in this session as a navigable tree. Shows added (+), modified (~), and deleted (-) indicators. Use filter to show only specific change types. Returns paths for git diff.",
|
||||
@@ -40,6 +60,7 @@ const changedFilesTool: ToolDefinition = tool({
|
||||
.describe("Output format: tree for terminal display, json for structured data (default: tree)"),
|
||||
},
|
||||
async execute(args, context) {
|
||||
const { buildTree, getChangedPaths, hasChanges } = await loadChangedFilesStore()
|
||||
const filter = args.filter === "all" || !args.filter ? undefined : (args.filter as ChangeType)
|
||||
const format = args.format ?? "tree"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user