feat(workspace): Multi-directory workspace engine support (#215) - #230

Merged
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased
Aug 22, 2026
Merged

feat(workspace): Multi-directory workspace engine support (#215)#230
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased

Conversation

@jeonghun-jj-lee

@jeonghun-jj-leejeonghun-jj-lee commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Multi-root workspace support for the opencode engine.

Changes

  • Location.Ref gains a directories field for secondary workspace roots
  • instruction.ts discovers CLAUDE.md/AGENTS.md across all workspace directories
  • builtins.ts marks correct directory as primary in multi-root prompt
  • Session DB migration adds directories column
  • findUp uses per-directory stop boundaries

Bug fixes

  1. Location.Interface missing directories field (type error)
  2. Migration not registered in migration.gen.ts
  3. instruction.ts unsafe cast
  4. findUp boundary check wrong for secondary dirs
  5. builtins.ts primary marker logic

All 30 packages typecheck clean.

Summary by CodeRabbit

  • New Features

    • Added support for projects containing multiple workspace directories.
    • Workspace context now lists all configured folders and identifies the primary directory.
    • Instruction files are discovered across workspace directories, with appropriate search boundaries and precedence.
    • Session and location data now preserve configured workspace directories.
  • Bug Fixes

    • Files within secondary workspace directories are no longer incorrectly treated as external or rejected as path escapes.
    • Paths outside all configured workspaces continue to receive external-directory handling.

amicoand others added 6 commits August 21, 2026 19:48
…t (opencode#215, draft)
- schema: Location.Ref.directories?: AbsolutePath[] (primary + all workspace roots)
- core/location-mutation: isLexicallyInternal checks primary + directories; canonical check also allows any workspace dir (no external-directory prompts across workspace)
- core/system-context: env block lists all workspace folders with primary mark; single-folder fallback unchanged
Remaining for full AC (see #215): instruction discovery (findUp per dir, dedup), server session create ?directories=JSON handling, DB migration (directories TEXT nullable), and amicode extension Workspace sidebar (WorkspaceTreeProvider) + Catalog removal (already #457). Draft — engine core only.
…DB (opencode#215)
- project/instance-context: add directories?: string[], containsPath checks all roots
- project/instance-store: LoadInput.directories forwarding to InstanceContext
- session/instruction: systemPaths runs findUp from each workspace dir (dedup), primary first
- core/session/sql: SessionTable.directories JSON + migration 20260820000001
Remaining (tracked): POST /session?directories=JSON handler + extension WorkspaceTree (amicode#457 follow-up extends 215 AC6/7). Engine core now workspace-aware end-to-end.
… primary marker
- instruction.ts: remove (ctx as unknown) cast — InstanceContext already has directories
- instruction.ts: use directory itself as findUp boundary for secondary dirs (prevents
walking past workspace root into unrelated parents)
- builtins.ts: always place primary first in workspaceFolders, mark by equality not index
- tests: add multi-root instruction discovery + builtins primary-marking tests
@coderabbitai

coderabbitaiBot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72324ae0-8338-48c3-a75f-f312c721c4e0

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfb210 and ad35703.

📒 Files selected for processing (15)
  • packages/core/src/database/migration.gen.ts
  • packages/core/src/database/migration/20260820000001_add_session_directories.ts
  • packages/core/src/location-mutation.ts
  • packages/core/src/location.ts
  • packages/core/src/session/sql.ts
  • packages/core/src/system-context/builtins.ts
  • packages/core/test/fixture/location.ts
  • packages/core/test/location-mutation.test.ts
  • packages/core/test/system-context/builtins.test.ts
  • packages/opencode/src/project/instance-context.ts
  • packages/opencode/src/project/instance-store.ts
  • packages/opencode/src/session/instruction.ts
  • packages/opencode/test/fixture/fixture.ts
  • packages/opencode/test/session/instruction.test.ts
  • packages/schema/src/location.ts

📝 Walkthrough

Walkthrough

The PR adds optional multi-root workspace directories to location and session data. It updates path validation, environment context, project instance propagation, and instruction discovery. It also adds database migration and multi-root test coverage.

Changes

Multi-root workspace support

Layer / File(s)Summary
Directory contracts and persistence
packages/schema/src/location.ts, packages/core/src/location.ts, packages/core/src/session/sql.ts, packages/core/src/database/migration/*
Location and session data now support optional directories. The migration creates and registers the session column.
Workspace boundaries and environment context
packages/core/src/location-mutation.ts, packages/core/src/system-context/builtins.ts, packages/core/test/location-mutation.test.ts, packages/core/test/system-context/builtins.test.ts, packages/core/test/fixture/location.ts
Path checks accept configured workspace roots. Environment context lists workspace folders and identifies the primary directory. Tests cover secondary roots and reversed directory ordering.
Project propagation and instruction discovery
packages/opencode/src/project/*, packages/opencode/src/session/instruction.ts, packages/opencode/test/session/instruction.test.ts, packages/opencode/test/fixture/fixture.ts
Project instances preserve directories. Instruction lookup searches each configured root within its boundary and deduplicates results. Tests cover secondary instruction files and Git-root isolation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers:kitlangton, thdxr, jlongster

Sequence Diagram(s)

sequenceDiagram
participant InstanceStore
participant InstanceContext
participant InstructionSystemPaths
InstanceStore->>InstanceContext: copy configured directories during boot
InstructionSystemPaths->>InstanceContext: search configured workspace directories
InstructionSystemPaths->>InstructionSystemPaths: enforce boundaries and instruction precedence
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/215-workspace-aware-rebased

Comment @coderabbitai help to get the list of available commands.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jeonghun-jj-lee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(workspace): Multi-directory workspace engine support (#215) - #230

Merged
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased
Aug 22, 2026
Merged

feat(workspace): Multi-directory workspace engine support (#215)#230
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased

Conversation

@jeonghun-jj-lee

@jeonghun-jj-leejeonghun-jj-lee commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Multi-root workspace support for the opencode engine.

Changes

  • Location.Ref gains a directories field for secondary workspace roots
  • instruction.ts discovers CLAUDE.md/AGENTS.md across all workspace directories
  • builtins.ts marks correct directory as primary in multi-root prompt
  • Session DB migration adds directories column
  • findUp uses per-directory stop boundaries

Bug fixes

  1. Location.Interface missing directories field (type error)
  2. Migration not registered in migration.gen.ts
  3. instruction.ts unsafe cast
  4. findUp boundary check wrong for secondary dirs
  5. builtins.ts primary marker logic

All 30 packages typecheck clean.

Summary by CodeRabbit

  • New Features

    • Added support for projects containing multiple workspace directories.
    • Workspace context now lists all configured folders and identifies the primary directory.
    • Instruction files are discovered across workspace directories, with appropriate search boundaries and precedence.
    • Session and location data now preserve configured workspace directories.
  • Bug Fixes

    • Files within secondary workspace directories are no longer incorrectly treated as external or rejected as path escapes.
    • Paths outside all configured workspaces continue to receive external-directory handling.

amicoand others added 6 commits August 21, 2026 19:48
…t (opencode#215, draft)
- schema: Location.Ref.directories?: AbsolutePath[] (primary + all workspace roots)
- core/location-mutation: isLexicallyInternal checks primary + directories; canonical check also allows any workspace dir (no external-directory prompts across workspace)
- core/system-context: env block lists all workspace folders with primary mark; single-folder fallback unchanged
Remaining for full AC (see #215): instruction discovery (findUp per dir, dedup), server session create ?directories=JSON handling, DB migration (directories TEXT nullable), and amicode extension Workspace sidebar (WorkspaceTreeProvider) + Catalog removal (already #457). Draft — engine core only.
…DB (opencode#215)
- project/instance-context: add directories?: string[], containsPath checks all roots
- project/instance-store: LoadInput.directories forwarding to InstanceContext
- session/instruction: systemPaths runs findUp from each workspace dir (dedup), primary first
- core/session/sql: SessionTable.directories JSON + migration 20260820000001
Remaining (tracked): POST /session?directories=JSON handler + extension WorkspaceTree (amicode#457 follow-up extends 215 AC6/7). Engine core now workspace-aware end-to-end.
… primary marker
- instruction.ts: remove (ctx as unknown) cast — InstanceContext already has directories
- instruction.ts: use directory itself as findUp boundary for secondary dirs (prevents
walking past workspace root into unrelated parents)
- builtins.ts: always place primary first in workspaceFolders, mark by equality not index
- tests: add multi-root instruction discovery + builtins primary-marking tests
@coderabbitai

coderabbitaiBot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72324ae0-8338-48c3-a75f-f312c721c4e0

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfb210 and ad35703.

📒 Files selected for processing (15)
  • packages/core/src/database/migration.gen.ts
  • packages/core/src/database/migration/20260820000001_add_session_directories.ts
  • packages/core/src/location-mutation.ts
  • packages/core/src/location.ts
  • packages/core/src/session/sql.ts
  • packages/core/src/system-context/builtins.ts
  • packages/core/test/fixture/location.ts
  • packages/core/test/location-mutation.test.ts
  • packages/core/test/system-context/builtins.test.ts
  • packages/opencode/src/project/instance-context.ts
  • packages/opencode/src/project/instance-store.ts
  • packages/opencode/src/session/instruction.ts
  • packages/opencode/test/fixture/fixture.ts
  • packages/opencode/test/session/instruction.test.ts
  • packages/schema/src/location.ts

📝 Walkthrough

Walkthrough

The PR adds optional multi-root workspace directories to location and session data. It updates path validation, environment context, project instance propagation, and instruction discovery. It also adds database migration and multi-root test coverage.

Changes

Multi-root workspace support

Layer / File(s)Summary
Directory contracts and persistence
packages/schema/src/location.ts, packages/core/src/location.ts, packages/core/src/session/sql.ts, packages/core/src/database/migration/*
Location and session data now support optional directories. The migration creates and registers the session column.
Workspace boundaries and environment context
packages/core/src/location-mutation.ts, packages/core/src/system-context/builtins.ts, packages/core/test/location-mutation.test.ts, packages/core/test/system-context/builtins.test.ts, packages/core/test/fixture/location.ts
Path checks accept configured workspace roots. Environment context lists workspace folders and identifies the primary directory. Tests cover secondary roots and reversed directory ordering.
Project propagation and instruction discovery
packages/opencode/src/project/*, packages/opencode/src/session/instruction.ts, packages/opencode/test/session/instruction.test.ts, packages/opencode/test/fixture/fixture.ts
Project instances preserve directories. Instruction lookup searches each configured root within its boundary and deduplicates results. Tests cover secondary instruction files and Git-root isolation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers:kitlangton, thdxr, jlongster

Sequence Diagram(s)

sequenceDiagram
participant InstanceStore
participant InstanceContext
participant InstructionSystemPaths
InstanceStore->>InstanceContext: copy configured directories during boot
InstructionSystemPaths->>InstanceContext: search configured workspace directories
InstructionSystemPaths->>InstructionSystemPaths: enforce boundaries and instruction precedence
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/215-workspace-aware-rebased

Comment @coderabbitai help to get the list of available commands.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jeonghun-jj-lee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(workspace): Multi-directory workspace engine support (#215) - #230

Merged
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased
Aug 22, 2026
Merged

feat(workspace): Multi-directory workspace engine support (#215)#230
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased

Conversation

@jeonghun-jj-lee

@jeonghun-jj-leejeonghun-jj-lee commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Multi-root workspace support for the opencode engine.

Changes

  • Location.Ref gains a directories field for secondary workspace roots
  • instruction.ts discovers CLAUDE.md/AGENTS.md across all workspace directories
  • builtins.ts marks correct directory as primary in multi-root prompt
  • Session DB migration adds directories column
  • findUp uses per-directory stop boundaries

Bug fixes

  1. Location.Interface missing directories field (type error)
  2. Migration not registered in migration.gen.ts
  3. instruction.ts unsafe cast
  4. findUp boundary check wrong for secondary dirs
  5. builtins.ts primary marker logic

All 30 packages typecheck clean.

Summary by CodeRabbit

  • New Features

    • Added support for projects containing multiple workspace directories.
    • Workspace context now lists all configured folders and identifies the primary directory.
    • Instruction files are discovered across workspace directories, with appropriate search boundaries and precedence.
    • Session and location data now preserve configured workspace directories.
  • Bug Fixes

    • Files within secondary workspace directories are no longer incorrectly treated as external or rejected as path escapes.
    • Paths outside all configured workspaces continue to receive external-directory handling.

amicoand others added 6 commits August 21, 2026 19:48
…t (opencode#215, draft)
- schema: Location.Ref.directories?: AbsolutePath[] (primary + all workspace roots)
- core/location-mutation: isLexicallyInternal checks primary + directories; canonical check also allows any workspace dir (no external-directory prompts across workspace)
- core/system-context: env block lists all workspace folders with primary mark; single-folder fallback unchanged
Remaining for full AC (see #215): instruction discovery (findUp per dir, dedup), server session create ?directories=JSON handling, DB migration (directories TEXT nullable), and amicode extension Workspace sidebar (WorkspaceTreeProvider) + Catalog removal (already #457). Draft — engine core only.
…DB (opencode#215)
- project/instance-context: add directories?: string[], containsPath checks all roots
- project/instance-store: LoadInput.directories forwarding to InstanceContext
- session/instruction: systemPaths runs findUp from each workspace dir (dedup), primary first
- core/session/sql: SessionTable.directories JSON + migration 20260820000001
Remaining (tracked): POST /session?directories=JSON handler + extension WorkspaceTree (amicode#457 follow-up extends 215 AC6/7). Engine core now workspace-aware end-to-end.
… primary marker
- instruction.ts: remove (ctx as unknown) cast — InstanceContext already has directories
- instruction.ts: use directory itself as findUp boundary for secondary dirs (prevents
walking past workspace root into unrelated parents)
- builtins.ts: always place primary first in workspaceFolders, mark by equality not index
- tests: add multi-root instruction discovery + builtins primary-marking tests
@coderabbitai

coderabbitaiBot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72324ae0-8338-48c3-a75f-f312c721c4e0

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfb210 and ad35703.

📒 Files selected for processing (15)
  • packages/core/src/database/migration.gen.ts
  • packages/core/src/database/migration/20260820000001_add_session_directories.ts
  • packages/core/src/location-mutation.ts
  • packages/core/src/location.ts
  • packages/core/src/session/sql.ts
  • packages/core/src/system-context/builtins.ts
  • packages/core/test/fixture/location.ts
  • packages/core/test/location-mutation.test.ts
  • packages/core/test/system-context/builtins.test.ts
  • packages/opencode/src/project/instance-context.ts
  • packages/opencode/src/project/instance-store.ts
  • packages/opencode/src/session/instruction.ts
  • packages/opencode/test/fixture/fixture.ts
  • packages/opencode/test/session/instruction.test.ts
  • packages/schema/src/location.ts

📝 Walkthrough

Walkthrough

The PR adds optional multi-root workspace directories to location and session data. It updates path validation, environment context, project instance propagation, and instruction discovery. It also adds database migration and multi-root test coverage.

Changes

Multi-root workspace support

Layer / File(s)Summary
Directory contracts and persistence
packages/schema/src/location.ts, packages/core/src/location.ts, packages/core/src/session/sql.ts, packages/core/src/database/migration/*
Location and session data now support optional directories. The migration creates and registers the session column.
Workspace boundaries and environment context
packages/core/src/location-mutation.ts, packages/core/src/system-context/builtins.ts, packages/core/test/location-mutation.test.ts, packages/core/test/system-context/builtins.test.ts, packages/core/test/fixture/location.ts
Path checks accept configured workspace roots. Environment context lists workspace folders and identifies the primary directory. Tests cover secondary roots and reversed directory ordering.
Project propagation and instruction discovery
packages/opencode/src/project/*, packages/opencode/src/session/instruction.ts, packages/opencode/test/session/instruction.test.ts, packages/opencode/test/fixture/fixture.ts
Project instances preserve directories. Instruction lookup searches each configured root within its boundary and deduplicates results. Tests cover secondary instruction files and Git-root isolation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers:kitlangton, thdxr, jlongster

Sequence Diagram(s)

sequenceDiagram
participant InstanceStore
participant InstanceContext
participant InstructionSystemPaths
InstanceStore->>InstanceContext: copy configured directories during boot
InstructionSystemPaths->>InstanceContext: search configured workspace directories
InstructionSystemPaths->>InstructionSystemPaths: enforce boundaries and instruction precedence
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/215-workspace-aware-rebased

Comment @coderabbitai help to get the list of available commands.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jeonghun-jj-lee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(workspace): Multi-directory workspace engine support (#215) - #230

Merged
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased
Aug 22, 2026
Merged

feat(workspace): Multi-directory workspace engine support (#215)#230
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased

Conversation

@jeonghun-jj-lee

@jeonghun-jj-leejeonghun-jj-lee commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Multi-root workspace support for the opencode engine.

Changes

  • Location.Ref gains a directories field for secondary workspace roots
  • instruction.ts discovers CLAUDE.md/AGENTS.md across all workspace directories
  • builtins.ts marks correct directory as primary in multi-root prompt
  • Session DB migration adds directories column
  • findUp uses per-directory stop boundaries

Bug fixes

  1. Location.Interface missing directories field (type error)
  2. Migration not registered in migration.gen.ts
  3. instruction.ts unsafe cast
  4. findUp boundary check wrong for secondary dirs
  5. builtins.ts primary marker logic

All 30 packages typecheck clean.

Summary by CodeRabbit

  • New Features

    • Added support for projects containing multiple workspace directories.
    • Workspace context now lists all configured folders and identifies the primary directory.
    • Instruction files are discovered across workspace directories, with appropriate search boundaries and precedence.
    • Session and location data now preserve configured workspace directories.
  • Bug Fixes

    • Files within secondary workspace directories are no longer incorrectly treated as external or rejected as path escapes.
    • Paths outside all configured workspaces continue to receive external-directory handling.

amicoand others added 6 commits August 21, 2026 19:48
…t (opencode#215, draft)
- schema: Location.Ref.directories?: AbsolutePath[] (primary + all workspace roots)
- core/location-mutation: isLexicallyInternal checks primary + directories; canonical check also allows any workspace dir (no external-directory prompts across workspace)
- core/system-context: env block lists all workspace folders with primary mark; single-folder fallback unchanged
Remaining for full AC (see #215): instruction discovery (findUp per dir, dedup), server session create ?directories=JSON handling, DB migration (directories TEXT nullable), and amicode extension Workspace sidebar (WorkspaceTreeProvider) + Catalog removal (already #457). Draft — engine core only.
…DB (opencode#215)
- project/instance-context: add directories?: string[], containsPath checks all roots
- project/instance-store: LoadInput.directories forwarding to InstanceContext
- session/instruction: systemPaths runs findUp from each workspace dir (dedup), primary first
- core/session/sql: SessionTable.directories JSON + migration 20260820000001
Remaining (tracked): POST /session?directories=JSON handler + extension WorkspaceTree (amicode#457 follow-up extends 215 AC6/7). Engine core now workspace-aware end-to-end.
… primary marker
- instruction.ts: remove (ctx as unknown) cast — InstanceContext already has directories
- instruction.ts: use directory itself as findUp boundary for secondary dirs (prevents
walking past workspace root into unrelated parents)
- builtins.ts: always place primary first in workspaceFolders, mark by equality not index
- tests: add multi-root instruction discovery + builtins primary-marking tests
@coderabbitai

coderabbitaiBot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72324ae0-8338-48c3-a75f-f312c721c4e0

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfb210 and ad35703.

📒 Files selected for processing (15)
  • packages/core/src/database/migration.gen.ts
  • packages/core/src/database/migration/20260820000001_add_session_directories.ts
  • packages/core/src/location-mutation.ts
  • packages/core/src/location.ts
  • packages/core/src/session/sql.ts
  • packages/core/src/system-context/builtins.ts
  • packages/core/test/fixture/location.ts
  • packages/core/test/location-mutation.test.ts
  • packages/core/test/system-context/builtins.test.ts
  • packages/opencode/src/project/instance-context.ts
  • packages/opencode/src/project/instance-store.ts
  • packages/opencode/src/session/instruction.ts
  • packages/opencode/test/fixture/fixture.ts
  • packages/opencode/test/session/instruction.test.ts
  • packages/schema/src/location.ts

📝 Walkthrough

Walkthrough

The PR adds optional multi-root workspace directories to location and session data. It updates path validation, environment context, project instance propagation, and instruction discovery. It also adds database migration and multi-root test coverage.

Changes

Multi-root workspace support

Layer / File(s)Summary
Directory contracts and persistence
packages/schema/src/location.ts, packages/core/src/location.ts, packages/core/src/session/sql.ts, packages/core/src/database/migration/*
Location and session data now support optional directories. The migration creates and registers the session column.
Workspace boundaries and environment context
packages/core/src/location-mutation.ts, packages/core/src/system-context/builtins.ts, packages/core/test/location-mutation.test.ts, packages/core/test/system-context/builtins.test.ts, packages/core/test/fixture/location.ts
Path checks accept configured workspace roots. Environment context lists workspace folders and identifies the primary directory. Tests cover secondary roots and reversed directory ordering.
Project propagation and instruction discovery
packages/opencode/src/project/*, packages/opencode/src/session/instruction.ts, packages/opencode/test/session/instruction.test.ts, packages/opencode/test/fixture/fixture.ts
Project instances preserve directories. Instruction lookup searches each configured root within its boundary and deduplicates results. Tests cover secondary instruction files and Git-root isolation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers:kitlangton, thdxr, jlongster

Sequence Diagram(s)

sequenceDiagram
participant InstanceStore
participant InstanceContext
participant InstructionSystemPaths
InstanceStore->>InstanceContext: copy configured directories during boot
InstructionSystemPaths->>InstanceContext: search configured workspace directories
InstructionSystemPaths->>InstructionSystemPaths: enforce boundaries and instruction precedence
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/215-workspace-aware-rebased

Comment @coderabbitai help to get the list of available commands.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jeonghun-jj-lee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(workspace): Multi-directory workspace engine support (#215) - #230

Merged
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased
Aug 22, 2026
Merged

feat(workspace): Multi-directory workspace engine support (#215)#230
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased

Conversation

@jeonghun-jj-lee

@jeonghun-jj-leejeonghun-jj-lee commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Multi-root workspace support for the opencode engine.

Changes

  • Location.Ref gains a directories field for secondary workspace roots
  • instruction.ts discovers CLAUDE.md/AGENTS.md across all workspace directories
  • builtins.ts marks correct directory as primary in multi-root prompt
  • Session DB migration adds directories column
  • findUp uses per-directory stop boundaries

Bug fixes

  1. Location.Interface missing directories field (type error)
  2. Migration not registered in migration.gen.ts
  3. instruction.ts unsafe cast
  4. findUp boundary check wrong for secondary dirs
  5. builtins.ts primary marker logic

All 30 packages typecheck clean.

Summary by CodeRabbit

  • New Features

    • Added support for projects containing multiple workspace directories.
    • Workspace context now lists all configured folders and identifies the primary directory.
    • Instruction files are discovered across workspace directories, with appropriate search boundaries and precedence.
    • Session and location data now preserve configured workspace directories.
  • Bug Fixes

    • Files within secondary workspace directories are no longer incorrectly treated as external or rejected as path escapes.
    • Paths outside all configured workspaces continue to receive external-directory handling.

amicoand others added 6 commits August 21, 2026 19:48
…t (opencode#215, draft)
- schema: Location.Ref.directories?: AbsolutePath[] (primary + all workspace roots)
- core/location-mutation: isLexicallyInternal checks primary + directories; canonical check also allows any workspace dir (no external-directory prompts across workspace)
- core/system-context: env block lists all workspace folders with primary mark; single-folder fallback unchanged
Remaining for full AC (see #215): instruction discovery (findUp per dir, dedup), server session create ?directories=JSON handling, DB migration (directories TEXT nullable), and amicode extension Workspace sidebar (WorkspaceTreeProvider) + Catalog removal (already #457). Draft — engine core only.
…DB (opencode#215)
- project/instance-context: add directories?: string[], containsPath checks all roots
- project/instance-store: LoadInput.directories forwarding to InstanceContext
- session/instruction: systemPaths runs findUp from each workspace dir (dedup), primary first
- core/session/sql: SessionTable.directories JSON + migration 20260820000001
Remaining (tracked): POST /session?directories=JSON handler + extension WorkspaceTree (amicode#457 follow-up extends 215 AC6/7). Engine core now workspace-aware end-to-end.
… primary marker
- instruction.ts: remove (ctx as unknown) cast — InstanceContext already has directories
- instruction.ts: use directory itself as findUp boundary for secondary dirs (prevents
walking past workspace root into unrelated parents)
- builtins.ts: always place primary first in workspaceFolders, mark by equality not index
- tests: add multi-root instruction discovery + builtins primary-marking tests
@coderabbitai

coderabbitaiBot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72324ae0-8338-48c3-a75f-f312c721c4e0

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfb210 and ad35703.

📒 Files selected for processing (15)
  • packages/core/src/database/migration.gen.ts
  • packages/core/src/database/migration/20260820000001_add_session_directories.ts
  • packages/core/src/location-mutation.ts
  • packages/core/src/location.ts
  • packages/core/src/session/sql.ts
  • packages/core/src/system-context/builtins.ts
  • packages/core/test/fixture/location.ts
  • packages/core/test/location-mutation.test.ts
  • packages/core/test/system-context/builtins.test.ts
  • packages/opencode/src/project/instance-context.ts
  • packages/opencode/src/project/instance-store.ts
  • packages/opencode/src/session/instruction.ts
  • packages/opencode/test/fixture/fixture.ts
  • packages/opencode/test/session/instruction.test.ts
  • packages/schema/src/location.ts

📝 Walkthrough

Walkthrough

The PR adds optional multi-root workspace directories to location and session data. It updates path validation, environment context, project instance propagation, and instruction discovery. It also adds database migration and multi-root test coverage.

Changes

Multi-root workspace support

Layer / File(s)Summary
Directory contracts and persistence
packages/schema/src/location.ts, packages/core/src/location.ts, packages/core/src/session/sql.ts, packages/core/src/database/migration/*
Location and session data now support optional directories. The migration creates and registers the session column.
Workspace boundaries and environment context
packages/core/src/location-mutation.ts, packages/core/src/system-context/builtins.ts, packages/core/test/location-mutation.test.ts, packages/core/test/system-context/builtins.test.ts, packages/core/test/fixture/location.ts
Path checks accept configured workspace roots. Environment context lists workspace folders and identifies the primary directory. Tests cover secondary roots and reversed directory ordering.
Project propagation and instruction discovery
packages/opencode/src/project/*, packages/opencode/src/session/instruction.ts, packages/opencode/test/session/instruction.test.ts, packages/opencode/test/fixture/fixture.ts
Project instances preserve directories. Instruction lookup searches each configured root within its boundary and deduplicates results. Tests cover secondary instruction files and Git-root isolation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers:kitlangton, thdxr, jlongster

Sequence Diagram(s)

sequenceDiagram
participant InstanceStore
participant InstanceContext
participant InstructionSystemPaths
InstanceStore->>InstanceContext: copy configured directories during boot
InstructionSystemPaths->>InstanceContext: search configured workspace directories
InstructionSystemPaths->>InstructionSystemPaths: enforce boundaries and instruction precedence
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/215-workspace-aware-rebased

Comment @coderabbitai help to get the list of available commands.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jeonghun-jj-lee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(workspace): Multi-directory workspace engine support (#215) - #230

Merged
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased
Aug 22, 2026
Merged

feat(workspace): Multi-directory workspace engine support (#215)#230
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased

Conversation

@jeonghun-jj-lee

@jeonghun-jj-leejeonghun-jj-lee commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Multi-root workspace support for the opencode engine.

Changes

  • Location.Ref gains a directories field for secondary workspace roots
  • instruction.ts discovers CLAUDE.md/AGENTS.md across all workspace directories
  • builtins.ts marks correct directory as primary in multi-root prompt
  • Session DB migration adds directories column
  • findUp uses per-directory stop boundaries

Bug fixes

  1. Location.Interface missing directories field (type error)
  2. Migration not registered in migration.gen.ts
  3. instruction.ts unsafe cast
  4. findUp boundary check wrong for secondary dirs
  5. builtins.ts primary marker logic

All 30 packages typecheck clean.

Summary by CodeRabbit

  • New Features

    • Added support for projects containing multiple workspace directories.
    • Workspace context now lists all configured folders and identifies the primary directory.
    • Instruction files are discovered across workspace directories, with appropriate search boundaries and precedence.
    • Session and location data now preserve configured workspace directories.
  • Bug Fixes

    • Files within secondary workspace directories are no longer incorrectly treated as external or rejected as path escapes.
    • Paths outside all configured workspaces continue to receive external-directory handling.

amicoand others added 6 commits August 21, 2026 19:48
…t (opencode#215, draft)
- schema: Location.Ref.directories?: AbsolutePath[] (primary + all workspace roots)
- core/location-mutation: isLexicallyInternal checks primary + directories; canonical check also allows any workspace dir (no external-directory prompts across workspace)
- core/system-context: env block lists all workspace folders with primary mark; single-folder fallback unchanged
Remaining for full AC (see #215): instruction discovery (findUp per dir, dedup), server session create ?directories=JSON handling, DB migration (directories TEXT nullable), and amicode extension Workspace sidebar (WorkspaceTreeProvider) + Catalog removal (already #457). Draft — engine core only.
…DB (opencode#215)
- project/instance-context: add directories?: string[], containsPath checks all roots
- project/instance-store: LoadInput.directories forwarding to InstanceContext
- session/instruction: systemPaths runs findUp from each workspace dir (dedup), primary first
- core/session/sql: SessionTable.directories JSON + migration 20260820000001
Remaining (tracked): POST /session?directories=JSON handler + extension WorkspaceTree (amicode#457 follow-up extends 215 AC6/7). Engine core now workspace-aware end-to-end.
… primary marker
- instruction.ts: remove (ctx as unknown) cast — InstanceContext already has directories
- instruction.ts: use directory itself as findUp boundary for secondary dirs (prevents
walking past workspace root into unrelated parents)
- builtins.ts: always place primary first in workspaceFolders, mark by equality not index
- tests: add multi-root instruction discovery + builtins primary-marking tests
@coderabbitai

coderabbitaiBot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72324ae0-8338-48c3-a75f-f312c721c4e0

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfb210 and ad35703.

📒 Files selected for processing (15)
  • packages/core/src/database/migration.gen.ts
  • packages/core/src/database/migration/20260820000001_add_session_directories.ts
  • packages/core/src/location-mutation.ts
  • packages/core/src/location.ts
  • packages/core/src/session/sql.ts
  • packages/core/src/system-context/builtins.ts
  • packages/core/test/fixture/location.ts
  • packages/core/test/location-mutation.test.ts
  • packages/core/test/system-context/builtins.test.ts
  • packages/opencode/src/project/instance-context.ts
  • packages/opencode/src/project/instance-store.ts
  • packages/opencode/src/session/instruction.ts
  • packages/opencode/test/fixture/fixture.ts
  • packages/opencode/test/session/instruction.test.ts
  • packages/schema/src/location.ts

📝 Walkthrough

Walkthrough

The PR adds optional multi-root workspace directories to location and session data. It updates path validation, environment context, project instance propagation, and instruction discovery. It also adds database migration and multi-root test coverage.

Changes

Multi-root workspace support

Layer / File(s)Summary
Directory contracts and persistence
packages/schema/src/location.ts, packages/core/src/location.ts, packages/core/src/session/sql.ts, packages/core/src/database/migration/*
Location and session data now support optional directories. The migration creates and registers the session column.
Workspace boundaries and environment context
packages/core/src/location-mutation.ts, packages/core/src/system-context/builtins.ts, packages/core/test/location-mutation.test.ts, packages/core/test/system-context/builtins.test.ts, packages/core/test/fixture/location.ts
Path checks accept configured workspace roots. Environment context lists workspace folders and identifies the primary directory. Tests cover secondary roots and reversed directory ordering.
Project propagation and instruction discovery
packages/opencode/src/project/*, packages/opencode/src/session/instruction.ts, packages/opencode/test/session/instruction.test.ts, packages/opencode/test/fixture/fixture.ts
Project instances preserve directories. Instruction lookup searches each configured root within its boundary and deduplicates results. Tests cover secondary instruction files and Git-root isolation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers:kitlangton, thdxr, jlongster

Sequence Diagram(s)

sequenceDiagram
participant InstanceStore
participant InstanceContext
participant InstructionSystemPaths
InstanceStore->>InstanceContext: copy configured directories during boot
InstructionSystemPaths->>InstanceContext: search configured workspace directories
InstructionSystemPaths->>InstructionSystemPaths: enforce boundaries and instruction precedence
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/215-workspace-aware-rebased

Comment @coderabbitai help to get the list of available commands.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jeonghun-jj-lee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(workspace): Multi-directory workspace engine support (#215) - #230

Merged
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased
Aug 22, 2026
Merged

feat(workspace): Multi-directory workspace engine support (#215)#230
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased

Conversation

@jeonghun-jj-lee

@jeonghun-jj-leejeonghun-jj-lee commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Multi-root workspace support for the opencode engine.

Changes

  • Location.Ref gains a directories field for secondary workspace roots
  • instruction.ts discovers CLAUDE.md/AGENTS.md across all workspace directories
  • builtins.ts marks correct directory as primary in multi-root prompt
  • Session DB migration adds directories column
  • findUp uses per-directory stop boundaries

Bug fixes

  1. Location.Interface missing directories field (type error)
  2. Migration not registered in migration.gen.ts
  3. instruction.ts unsafe cast
  4. findUp boundary check wrong for secondary dirs
  5. builtins.ts primary marker logic

All 30 packages typecheck clean.

Summary by CodeRabbit

  • New Features

    • Added support for projects containing multiple workspace directories.
    • Workspace context now lists all configured folders and identifies the primary directory.
    • Instruction files are discovered across workspace directories, with appropriate search boundaries and precedence.
    • Session and location data now preserve configured workspace directories.
  • Bug Fixes

    • Files within secondary workspace directories are no longer incorrectly treated as external or rejected as path escapes.
    • Paths outside all configured workspaces continue to receive external-directory handling.

amicoand others added 6 commits August 21, 2026 19:48
…t (opencode#215, draft)
- schema: Location.Ref.directories?: AbsolutePath[] (primary + all workspace roots)
- core/location-mutation: isLexicallyInternal checks primary + directories; canonical check also allows any workspace dir (no external-directory prompts across workspace)
- core/system-context: env block lists all workspace folders with primary mark; single-folder fallback unchanged
Remaining for full AC (see #215): instruction discovery (findUp per dir, dedup), server session create ?directories=JSON handling, DB migration (directories TEXT nullable), and amicode extension Workspace sidebar (WorkspaceTreeProvider) + Catalog removal (already #457). Draft — engine core only.
…DB (opencode#215)
- project/instance-context: add directories?: string[], containsPath checks all roots
- project/instance-store: LoadInput.directories forwarding to InstanceContext
- session/instruction: systemPaths runs findUp from each workspace dir (dedup), primary first
- core/session/sql: SessionTable.directories JSON + migration 20260820000001
Remaining (tracked): POST /session?directories=JSON handler + extension WorkspaceTree (amicode#457 follow-up extends 215 AC6/7). Engine core now workspace-aware end-to-end.
… primary marker
- instruction.ts: remove (ctx as unknown) cast — InstanceContext already has directories
- instruction.ts: use directory itself as findUp boundary for secondary dirs (prevents
walking past workspace root into unrelated parents)
- builtins.ts: always place primary first in workspaceFolders, mark by equality not index
- tests: add multi-root instruction discovery + builtins primary-marking tests
@coderabbitai

coderabbitaiBot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72324ae0-8338-48c3-a75f-f312c721c4e0

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfb210 and ad35703.

📒 Files selected for processing (15)
  • packages/core/src/database/migration.gen.ts
  • packages/core/src/database/migration/20260820000001_add_session_directories.ts
  • packages/core/src/location-mutation.ts
  • packages/core/src/location.ts
  • packages/core/src/session/sql.ts
  • packages/core/src/system-context/builtins.ts
  • packages/core/test/fixture/location.ts
  • packages/core/test/location-mutation.test.ts
  • packages/core/test/system-context/builtins.test.ts
  • packages/opencode/src/project/instance-context.ts
  • packages/opencode/src/project/instance-store.ts
  • packages/opencode/src/session/instruction.ts
  • packages/opencode/test/fixture/fixture.ts
  • packages/opencode/test/session/instruction.test.ts
  • packages/schema/src/location.ts

📝 Walkthrough

Walkthrough

The PR adds optional multi-root workspace directories to location and session data. It updates path validation, environment context, project instance propagation, and instruction discovery. It also adds database migration and multi-root test coverage.

Changes

Multi-root workspace support

Layer / File(s)Summary
Directory contracts and persistence
packages/schema/src/location.ts, packages/core/src/location.ts, packages/core/src/session/sql.ts, packages/core/src/database/migration/*
Location and session data now support optional directories. The migration creates and registers the session column.
Workspace boundaries and environment context
packages/core/src/location-mutation.ts, packages/core/src/system-context/builtins.ts, packages/core/test/location-mutation.test.ts, packages/core/test/system-context/builtins.test.ts, packages/core/test/fixture/location.ts
Path checks accept configured workspace roots. Environment context lists workspace folders and identifies the primary directory. Tests cover secondary roots and reversed directory ordering.
Project propagation and instruction discovery
packages/opencode/src/project/*, packages/opencode/src/session/instruction.ts, packages/opencode/test/session/instruction.test.ts, packages/opencode/test/fixture/fixture.ts
Project instances preserve directories. Instruction lookup searches each configured root within its boundary and deduplicates results. Tests cover secondary instruction files and Git-root isolation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers:kitlangton, thdxr, jlongster

Sequence Diagram(s)

sequenceDiagram
participant InstanceStore
participant InstanceContext
participant InstructionSystemPaths
InstanceStore->>InstanceContext: copy configured directories during boot
InstructionSystemPaths->>InstanceContext: search configured workspace directories
InstructionSystemPaths->>InstructionSystemPaths: enforce boundaries and instruction precedence
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/215-workspace-aware-rebased

Comment @coderabbitai help to get the list of available commands.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jeonghun-jj-lee
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(workspace): Multi-directory workspace engine support (#215) - #230

Merged
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased
Aug 22, 2026
Merged

feat(workspace): Multi-directory workspace engine support (#215)#230
jeonghun-jj-lee merged 6 commits into
local/amicodefrom
feat/215-workspace-aware-rebased

Conversation

@jeonghun-jj-lee

@jeonghun-jj-leejeonghun-jj-lee commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Multi-root workspace support for the opencode engine.

Changes

  • Location.Ref gains a directories field for secondary workspace roots
  • instruction.ts discovers CLAUDE.md/AGENTS.md across all workspace directories
  • builtins.ts marks correct directory as primary in multi-root prompt
  • Session DB migration adds directories column
  • findUp uses per-directory stop boundaries

Bug fixes

  1. Location.Interface missing directories field (type error)
  2. Migration not registered in migration.gen.ts
  3. instruction.ts unsafe cast
  4. findUp boundary check wrong for secondary dirs
  5. builtins.ts primary marker logic

All 30 packages typecheck clean.

Summary by CodeRabbit

  • New Features

    • Added support for projects containing multiple workspace directories.
    • Workspace context now lists all configured folders and identifies the primary directory.
    • Instruction files are discovered across workspace directories, with appropriate search boundaries and precedence.
    • Session and location data now preserve configured workspace directories.
  • Bug Fixes

    • Files within secondary workspace directories are no longer incorrectly treated as external or rejected as path escapes.
    • Paths outside all configured workspaces continue to receive external-directory handling.

amicoand others added 6 commits August 21, 2026 19:48
…t (opencode#215, draft)
- schema: Location.Ref.directories?: AbsolutePath[] (primary + all workspace roots)
- core/location-mutation: isLexicallyInternal checks primary + directories; canonical check also allows any workspace dir (no external-directory prompts across workspace)
- core/system-context: env block lists all workspace folders with primary mark; single-folder fallback unchanged
Remaining for full AC (see #215): instruction discovery (findUp per dir, dedup), server session create ?directories=JSON handling, DB migration (directories TEXT nullable), and amicode extension Workspace sidebar (WorkspaceTreeProvider) + Catalog removal (already #457). Draft — engine core only.
…DB (opencode#215)
- project/instance-context: add directories?: string[], containsPath checks all roots
- project/instance-store: LoadInput.directories forwarding to InstanceContext
- session/instruction: systemPaths runs findUp from each workspace dir (dedup), primary first
- core/session/sql: SessionTable.directories JSON + migration 20260820000001
Remaining (tracked): POST /session?directories=JSON handler + extension WorkspaceTree (amicode#457 follow-up extends 215 AC6/7). Engine core now workspace-aware end-to-end.
… primary marker
- instruction.ts: remove (ctx as unknown) cast — InstanceContext already has directories
- instruction.ts: use directory itself as findUp boundary for secondary dirs (prevents
walking past workspace root into unrelated parents)
- builtins.ts: always place primary first in workspaceFolders, mark by equality not index
- tests: add multi-root instruction discovery + builtins primary-marking tests
@coderabbitai

coderabbitaiBot commented Aug 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 72324ae0-8338-48c3-a75f-f312c721c4e0

📥 Commits

Reviewing files that changed from the base of the PR and between 8dfb210 and ad35703.

📒 Files selected for processing (15)
  • packages/core/src/database/migration.gen.ts
  • packages/core/src/database/migration/20260820000001_add_session_directories.ts
  • packages/core/src/location-mutation.ts
  • packages/core/src/location.ts
  • packages/core/src/session/sql.ts
  • packages/core/src/system-context/builtins.ts
  • packages/core/test/fixture/location.ts
  • packages/core/test/location-mutation.test.ts
  • packages/core/test/system-context/builtins.test.ts
  • packages/opencode/src/project/instance-context.ts
  • packages/opencode/src/project/instance-store.ts
  • packages/opencode/src/session/instruction.ts
  • packages/opencode/test/fixture/fixture.ts
  • packages/opencode/test/session/instruction.test.ts
  • packages/schema/src/location.ts

📝 Walkthrough

Walkthrough

The PR adds optional multi-root workspace directories to location and session data. It updates path validation, environment context, project instance propagation, and instruction discovery. It also adds database migration and multi-root test coverage.

Changes

Multi-root workspace support

Layer / File(s)Summary
Directory contracts and persistence
packages/schema/src/location.ts, packages/core/src/location.ts, packages/core/src/session/sql.ts, packages/core/src/database/migration/*
Location and session data now support optional directories. The migration creates and registers the session column.
Workspace boundaries and environment context
packages/core/src/location-mutation.ts, packages/core/src/system-context/builtins.ts, packages/core/test/location-mutation.test.ts, packages/core/test/system-context/builtins.test.ts, packages/core/test/fixture/location.ts
Path checks accept configured workspace roots. Environment context lists workspace folders and identifies the primary directory. Tests cover secondary roots and reversed directory ordering.
Project propagation and instruction discovery
packages/opencode/src/project/*, packages/opencode/src/session/instruction.ts, packages/opencode/test/session/instruction.test.ts, packages/opencode/test/fixture/fixture.ts
Project instances preserve directories. Instruction lookup searches each configured root within its boundary and deduplicates results. Tests cover secondary instruction files and Git-root isolation.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers:kitlangton, thdxr, jlongster

Sequence Diagram(s)

sequenceDiagram
participant InstanceStore
participant InstanceContext
participant InstructionSystemPaths
InstanceStore->>InstanceContext: copy configured directories during boot
InstructionSystemPaths->>InstanceContext: search configured workspace directories
InstructionSystemPaths->>InstructionSystemPaths: enforce boundaries and instruction precedence
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/215-workspace-aware-rebased

Comment @coderabbitai help to get the list of available commands.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jeonghun-jj-lee