diff --git a/packages/core/src/tool/glob.ts b/packages/core/src/tool/glob.ts index af0838b9af28..338edc312c7b 100644 --- a/packages/core/src/tool/glob.ts +++ b/packages/core/src/tool/glob.ts @@ -76,6 +76,7 @@ export const layer = Layer.effectDiscard( cwd, pattern: input.pattern, limit: input.limit ?? Number.MAX_SAFE_INTEGER, + hidden: true, }) .pipe( Effect.map((result) => diff --git a/packages/opencode/src/tool/glob.ts b/packages/opencode/src/tool/glob.ts index 40d3a27d3cba..6384111beff0 100644 --- a/packages/opencode/src/tool/glob.ts +++ b/packages/opencode/src/tool/glob.ts @@ -47,7 +47,7 @@ export const GlobTool = Tool.define( }) const limit = 100 - const files = yield* ripgrep.glob({ cwd: search, pattern: params.pattern, limit }) + const files = yield* ripgrep.glob({ cwd: search, pattern: params.pattern, limit, hidden: true }) const truncated = files.length === limit const output = [] diff --git a/packages/opencode/test/tool/glob.test.ts b/packages/opencode/test/tool/glob.test.ts index 44146249907d..088095fdce7b 100644 --- a/packages/opencode/test/tool/glob.test.ts +++ b/packages/opencode/test/tool/glob.test.ts @@ -1,5 +1,6 @@ import { PermissionV1 } from "@opencode-ai/core/v1/permission" import { describe, expect } from "bun:test" +import fs from "fs/promises" import path from "path" import { Cause, Effect, Exit, Layer } from "effect" import { GlobTool } from "../../src/tool/glob" @@ -110,6 +111,26 @@ describe("tool.glob", () => { }), ) + it.instance("matches files under explicit dot directories", () => + Effect.gen(function* () { + const test = yield* TestInstance + const hiddenDir = path.join(test.directory, ".ai") + yield* Effect.promise(() => fs.mkdir(hiddenDir, { recursive: true })) + yield* Effect.promise(() => Bun.write(path.join(hiddenDir, "current-task.md"), "content\n")) + const info = yield* GlobTool + const glob = yield* info.init() + const result = yield* glob.execute( + { + pattern: ".ai/*.md", + path: test.directory, + }, + ctx, + ) + expect(result.metadata.count).toBe(1) + expect(result.output).toContain(path.join(hiddenDir, "current-task.md")) + }), + ) + it.instance("rejects exact file paths", () => Effect.gen(function* () { const test = yield* TestInstance