Skip to content

[FEATURE]: Configurable instruction file search boundary and file types #4479

@EvanZhang008

Description

@EvanZhang008

Feature hasn't been suggested before.

  • I have verified this feature I'm about to request hasn't been suggested before.

Describe the enhancement you want to request

Feature Request: Configurable AGENTS.md Search Behavior

Problem

OpenCode searches for instruction files (AGENTS.md, CLAUDE.md, CONTEXT.md) but has two limitations:

  1. Search stops at git repository root - Cannot find AGENTS.md files in parent directories above the repository
  2. Only first file type is loaded - If AGENTS.md exists, CLAUDE.md is never checked (due to break statement)

Example: Monorepo Issue

/workspace/company-monorepo/
├── AGENTS.md                          ← Cannot be found
└── services/
    ├── AGENTS.md                      ← Cannot be found
    └── my-service/
        └── .git/                      ← Search stops here
            └── src/working-here/

Code: packages/opencode/src/session/system.ts:74-80

for (const localRuleFile of LOCAL_RULE_FILES) {
  const matches = await Filesystem.findUp(localRuleFile, Instance.directory, Instance.worktree)
  if (matches.length > 0) {
    matches.forEach((path) => paths.add(path))
    break // ← Stops after first file type found
  }
}

Proposed Solution

Add two configuration options in opencode.json:

{
  "instructions": {
    "searchBoundary": "git-root" | "filesystem-root",
    "fileTypes": ["AGENTS.md", "CLAUDE.md", "CONTEXT.md"]
  }
}

Defaults (Backward Compatible)

{
  "instructions": {
    "searchBoundary": "git-root",
    "fileTypes": ["AGENTS.md", "CLAUDE.md", "CONTEXT.md"],
  },
}

Examples

Monorepo setup:

{
  "instructions": {
    "searchBoundary": "filesystem-root",
    "fileTypes": ["AGENTS.md"],
  },
}

Use both AGENTS.md and CLAUDE.md:

{
  "instructions": {
    "fileTypes": ["AGENTS.md", "CLAUDE.md"],
  },
}

Implementation

1. Update config schema (packages/opencode/src/config/config.ts):

instructions: z.object({
  searchBoundary: z.enum(["git-root", "filesystem-root"]).default("git-root"),
  fileTypes: z
    .array(z.enum(["AGENTS.md", "CLAUDE.md", "CONTEXT.md"]))
    .default(["AGENTS.md", "CLAUDE.md", "CONTEXT.md"]),
}).optional()

2. Update search logic (packages/opencode/src/session/system.ts):

const fileTypes = config.instructions?.fileTypes ?? LOCAL_RULE_FILES
const searchStop = config.instructions?.searchBoundary === "filesystem-root" ? undefined : Instance.worktree

for (const localRuleFile of fileTypes) {
  const matches = await Filesystem.findUp(localRuleFile, Instance.directory, searchStop)
  matches.forEach((path) => paths.add(path))
  // Remove break statement - search all file types
}

Benefits

  • ✅ Monorepo support
  • ✅ Backward compatible
  • ✅ Choose specific file formats
  • ✅ Load multiple file types together

Metadata

Metadata

Assignees

No one assigned

    Labels

    discussionUsed for feature requests, proposals, ideas, etc. Open discussion

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions